/home/mip/mip/public/vendor/laravel-filemanager/files/folder-1/821668/proengsoft.tar
laravel-jsvalidation/LICENSE.md000064400000002163152434177750012304 0ustar00# The MIT License (MIT)

Copyright (c) 2017 Albert Moreno <albert@memorylimit.net>

> Permission is hereby granted, free of charge, to any person obtaining a copy
> of this software and associated documentation files (the "Software"), to deal
> in the Software without restriction, including without limitation the rights
> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> copies of the Software, and to permit persons to whom the Software is
> furnished to do so, subject to the following conditions:
>
> The above copyright notice and this permission notice shall be included in
> all copies or substantial portions of the Software.
>
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> THE SOFTWARE.
laravel-jsvalidation/resources/views/uikit.php000064400000004371152434177750015710 0ustar00<script>
    jQuery(document).ready(function () {

        $("<?= $validator['selector']; ?>").each(function () {
            $(this).validate({
                errorElement: 'span',
                errorClass: 'uk-text-danger',

                errorPlacement: function (error, element) {
                    if (element.closest('.uk-input').length ||
                        element.closest('.uk-select').length || element.closest('.uk-textarea').length ||
                        element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
                        error.insertAfter(element.parent());
                        // else just place the validation message immediately after the input
                    } else {
                        error.insertAfter(element);
                    }
                },
                highlight: function (element) {
                    $(element).closest('.uk-input').removeClass('uk-form-success').addClass('uk-form-danger'); // add the Bootstrap error class to the control group
                },

                <?php if (isset($validator['ignore']) && is_string($validator['ignore'])): ?>

                ignore: "<?= $validator['ignore']; ?>",
                <?php endif; ?>


                unhighlight: function (element) {
                    $(element).closest('.uk-input').removeClass('uk-form-danger').addClass('uk-form-success');
                },

                success: function (element) {
                    $(element).closest('.uk-input').removeClass('uk-form-danger').addClass('uk-form-success'); // remove the Boostrap error class from the control group
                },

                focusInvalid: true,
                <?php if (Config::get('jsvalidation.focus_on_error')): ?>
                invalidHandler: function (form, validator) {

                    if (!validator.numberOfInvalids())
                        return;

                    $('html, body').animate({
                        scrollTop: $(validator.errorList[0].element).offset().top
                    }, <?= Config::get('jsvalidation.duration_animate') ?>);

                },
                <?php endif; ?>

                rules: <?= json_encode($validator['rules']); ?>
            });
        });
    });
</script>
laravel-jsvalidation/resources/views/bootstrap.php000064400000004365152434177750016603 0ustar00<script>
    jQuery(document).ready(function(){

        $("<?= $validator['selector']; ?>").each(function() {
            $(this).validate({
                errorElement: 'span',
                errorClass: 'help-block error-help-block',

                errorPlacement: function (error, element) {
                    if (element.parent('.input-group').length ||
                        element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
                        error.insertAfter(element.parent());
                        // else just place the validation message immediately after the input
                    } else {
                        error.insertAfter(element);
                    }
                },
                highlight: function (element) {
                    $(element).closest('.form-group').removeClass('has-success').addClass('has-error'); // add the Bootstrap error class to the control group
                },

                <?php if (isset($validator['ignore']) && is_string($validator['ignore'])): ?>

                ignore: "<?= $validator['ignore']; ?>",
                <?php endif; ?>

                /*
                 // Uncomment this to mark as validated non required fields
                 unhighlight: function(element) {
                 $(element).closest('.form-group').removeClass('has-error').addClass('has-success');
                 },
                 */
                success: function (element) {
                    $(element).closest('.form-group').removeClass('has-error').addClass('has-success'); // remove the Boostrap error class from the control group
                },

                focusInvalid: true,
                <?php if (Config::get('jsvalidation.focus_on_error')): ?>
                invalidHandler: function (form, validator) {

                    if (!validator.numberOfInvalids())
                        return;

                    $('html, body').animate({
                        scrollTop: $(validator.errorList[0].element).offset().top
                    }, <?= Config::get('jsvalidation.duration_animate') ?>);

                },
                <?php endif; ?>

                rules: <?= json_encode($validator['rules']); ?>
            });
        });
    });
</script>
laravel-jsvalidation/resources/views/bootstrap4.php000064400000004232152434177750016660 0ustar00<script>
    jQuery(document).ready(function(){

        $("<?= $validator['selector']; ?>").each(function() {
            $(this).validate({
                errorElement: 'span',
                errorClass: 'invalid-feedback',

                errorPlacement: function (error, element) {
                    if (element.parent('.input-group').length ||
                        element.prop('type') === 'checkbox' || element.prop('type') === 'radio') {
                        error.insertAfter(element.parent());
                        // else just place the validation message immediately after the input
                    } else {
                        error.insertAfter(element);
                    }
                },
                highlight: function (element) {
                    $(element).closest('.form-control').removeClass('is-valid').addClass('is-invalid'); // add the Bootstrap error class to the control group
                },

                <?php if (isset($validator['ignore']) && is_string($validator['ignore'])): ?>

                ignore: "<?= $validator['ignore']; ?>",
                <?php endif; ?>

                
                unhighlight: function(element) {
                    $(element).closest('.form-control').removeClass('is-invalid').addClass('is-valid');
                },
                
                success: function (element) {
                    $(element).closest('.form-control').removeClass('is-invalid').addClass('is-valid'); // remove the Boostrap error class from the control group
                },

                focusInvalid: true,
                <?php if (Config::get('jsvalidation.focus_on_error')): ?>
                invalidHandler: function (form, validator) {

                    if (!validator.numberOfInvalids())
                        return;

                    $('html, body').animate({
                        scrollTop: $(validator.errorList[0].element).offset().top
                    }, <?= Config::get('jsvalidation.duration_animate') ?>);

                },
                <?php endif; ?>

                rules: <?= json_encode($validator['rules']); ?>
            });
        });
    });
</script>
laravel-jsvalidation/resources/views/bootstrap5.php000064400000003274152434177750016666 0ustar00<script>
    jQuery(document).ready(function () {

        $("<?= $validator['selector']; ?>").each(function () {
            $(this).validate({
                errorElement: 'div',
                errorClass: 'invalid-feedback',

                errorPlacement: function (error, element) {
                    error.insertAfter(element);
                },
                highlight: function (element) {
                    $(element).removeClass('is-valid').addClass('is-invalid'); // add the Bootstrap error class to the control group
                },

                <?php if (isset($validator['ignore']) && is_string($validator['ignore'])): ?>

                ignore: "<?= $validator['ignore']; ?>",
                <?php endif; ?>


                unhighlight: function (element) {
                    $(element).removeClass('is-invalid').addClass('is-valid');
                },

                success: function (element) {
                    $(element).removeClass('is-invalid').addClass('is-valid'); // remove the Boostrap error class from the control group
                },

                focusInvalid: true,
                <?php if (Config::get('jsvalidation.focus_on_error')): ?>
                invalidHandler: function (form, validator) {

                    if (!validator.numberOfInvalids())
                        return;

                    $('html, body').animate({
                        scrollTop: $(validator.errorList[0].element).offset().top
                    }, <?= Config::get('jsvalidation.duration_animate') ?>);

                },
                <?php endif; ?>

                rules: <?= json_encode($validator['rules']); ?>
            });
        });
    });
</script>
laravel-jsvalidation/resources/assets/js/timezones.js000064400000035055152434177750017211 0ustar00/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Timezone Helper functions used by validators
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

$.extend(true, laravelValidation, {

    helpers: {

        /**
         * Check if the specified timezone is valid.
         *
         * @param value
         * @returns {boolean}
         */
        isTimezone: function (value) {

            var timezones={
                "africa": [
                    "abidjan",
                    "accra",
                    "addis_ababa",
                    "algiers",
                    "asmara",
                    "bamako",
                    "bangui",
                    "banjul",
                    "bissau",
                    "blantyre",
                    "brazzaville",
                    "bujumbura",
                    "cairo",
                    "casablanca",
                    "ceuta",
                    "conakry",
                    "dakar",
                    "dar_es_salaam",
                    "djibouti",
                    "douala",
                    "el_aaiun",
                    "freetown",
                    "gaborone",
                    "harare",
                    "johannesburg",
                    "juba",
                    "kampala",
                    "khartoum",
                    "kigali",
                    "kinshasa",
                    "lagos",
                    "libreville",
                    "lome",
                    "luanda",
                    "lubumbashi",
                    "lusaka",
                    "malabo",
                    "maputo",
                    "maseru",
                    "mbabane",
                    "mogadishu",
                    "monrovia",
                    "nairobi",
                    "ndjamena",
                    "niamey",
                    "nouakchott",
                    "ouagadougou",
                    "porto-novo",
                    "sao_tome",
                    "tripoli",
                    "tunis",
                    "windhoek"
                ],
                "america": [
                    "adak",
                    "anchorage",
                    "anguilla",
                    "antigua",
                    "araguaina",
                    "argentina\/buenos_aires",
                    "argentina\/catamarca",
                    "argentina\/cordoba",
                    "argentina\/jujuy",
                    "argentina\/la_rioja",
                    "argentina\/mendoza",
                    "argentina\/rio_gallegos",
                    "argentina\/salta",
                    "argentina\/san_juan",
                    "argentina\/san_luis",
                    "argentina\/tucuman",
                    "argentina\/ushuaia",
                    "aruba",
                    "asuncion",
                    "atikokan",
                    "bahia",
                    "bahia_banderas",
                    "barbados",
                    "belem",
                    "belize",
                    "blanc-sablon",
                    "boa_vista",
                    "bogota",
                    "boise",
                    "cambridge_bay",
                    "campo_grande",
                    "cancun",
                    "caracas",
                    "cayenne",
                    "cayman",
                    "chicago",
                    "chihuahua",
                    "costa_rica",
                    "creston",
                    "cuiaba",
                    "curacao",
                    "danmarkshavn",
                    "dawson",
                    "dawson_creek",
                    "denver",
                    "detroit",
                    "dominica",
                    "edmonton",
                    "eirunepe",
                    "el_salvador",
                    "fortaleza",
                    "glace_bay",
                    "godthab",
                    "goose_bay",
                    "grand_turk",
                    "grenada",
                    "guadeloupe",
                    "guatemala",
                    "guayaquil",
                    "guyana",
                    "halifax",
                    "havana",
                    "hermosillo",
                    "indiana\/indianapolis",
                    "indiana\/knox",
                    "indiana\/marengo",
                    "indiana\/petersburg",
                    "indiana\/tell_city",
                    "indiana\/vevay",
                    "indiana\/vincennes",
                    "indiana\/winamac",
                    "inuvik",
                    "iqaluit",
                    "jamaica",
                    "juneau",
                    "kentucky\/louisville",
                    "kentucky\/monticello",
                    "kralendijk",
                    "la_paz",
                    "lima",
                    "los_angeles",
                    "lower_princes",
                    "maceio",
                    "managua",
                    "manaus",
                    "marigot",
                    "martinique",
                    "matamoros",
                    "mazatlan",
                    "menominee",
                    "merida",
                    "metlakatla",
                    "mexico_city",
                    "miquelon",
                    "moncton",
                    "monterrey",
                    "montevideo",
                    "montreal",
                    "montserrat",
                    "nassau",
                    "new_york",
                    "nipigon",
                    "nome",
                    "noronha",
                    "north_dakota\/beulah",
                    "north_dakota\/center",
                    "north_dakota\/new_salem",
                    "ojinaga",
                    "panama",
                    "pangnirtung",
                    "paramaribo",
                    "phoenix",
                    "port-au-prince",
                    "port_of_spain",
                    "porto_velho",
                    "puerto_rico",
                    "rainy_river",
                    "rankin_inlet",
                    "recife",
                    "regina",
                    "resolute",
                    "rio_branco",
                    "santa_isabel",
                    "santarem",
                    "santiago",
                    "santo_domingo",
                    "sao_paulo",
                    "scoresbysund",
                    "shiprock",
                    "sitka",
                    "st_barthelemy",
                    "st_johns",
                    "st_kitts",
                    "st_lucia",
                    "st_thomas",
                    "st_vincent",
                    "swift_current",
                    "tegucigalpa",
                    "thule",
                    "thunder_bay",
                    "tijuana",
                    "toronto",
                    "tortola",
                    "vancouver",
                    "whitehorse",
                    "winnipeg",
                    "yakutat",
                    "yellowknife"
                ],
                "antarctica": [
                    "casey",
                    "davis",
                    "dumontdurville",
                    "macquarie",
                    "mawson",
                    "mcmurdo",
                    "palmer",
                    "rothera",
                    "south_pole",
                    "syowa",
                    "vostok"
                ],
                "arctic": [
                    "longyearbyen"
                ],
                "asia": [
                    "aden",
                    "almaty",
                    "amman",
                    "anadyr",
                    "aqtau",
                    "aqtobe",
                    "ashgabat",
                    "baghdad",
                    "bahrain",
                    "baku",
                    "bangkok",
                    "beirut",
                    "bishkek",
                    "brunei",
                    "choibalsan",
                    "chongqing",
                    "colombo",
                    "damascus",
                    "dhaka",
                    "dili",
                    "dubai",
                    "dushanbe",
                    "gaza",
                    "harbin",
                    "hebron",
                    "ho_chi_minh",
                    "hong_kong",
                    "hovd",
                    "irkutsk",
                    "jakarta",
                    "jayapura",
                    "jerusalem",
                    "kabul",
                    "kamchatka",
                    "karachi",
                    "kashgar",
                    "kathmandu",
                    "khandyga",
                    "kolkata",
                    "krasnoyarsk",
                    "kuala_lumpur",
                    "kuching",
                    "kuwait",
                    "macau",
                    "magadan",
                    "makassar",
                    "manila",
                    "muscat",
                    "nicosia",
                    "novokuznetsk",
                    "novosibirsk",
                    "omsk",
                    "oral",
                    "phnom_penh",
                    "pontianak",
                    "pyongyang",
                    "qatar",
                    "qyzylorda",
                    "rangoon",
                    "riyadh",
                    "sakhalin",
                    "samarkand",
                    "seoul",
                    "shanghai",
                    "singapore",
                    "taipei",
                    "tashkent",
                    "tbilisi",
                    "tehran",
                    "thimphu",
                    "tokyo",
                    "ulaanbaatar",
                    "urumqi",
                    "ust-nera",
                    "vientiane",
                    "vladivostok",
                    "yakutsk",
                    "yekaterinburg",
                    "yerevan"
                ],
                "atlantic": [
                    "azores",
                    "bermuda",
                    "canary",
                    "cape_verde",
                    "faroe",
                    "madeira",
                    "reykjavik",
                    "south_georgia",
                    "st_helena",
                    "stanley"
                ],
                "australia": [
                    "adelaide",
                    "brisbane",
                    "broken_hill",
                    "currie",
                    "darwin",
                    "eucla",
                    "hobart",
                    "lindeman",
                    "lord_howe",
                    "melbourne",
                    "perth",
                    "sydney"
                ],
                "europe": [
                    "amsterdam",
                    "andorra",
                    "athens",
                    "belgrade",
                    "berlin",
                    "bratislava",
                    "brussels",
                    "bucharest",
                    "budapest",
                    "busingen",
                    "chisinau",
                    "copenhagen",
                    "dublin",
                    "gibraltar",
                    "guernsey",
                    "helsinki",
                    "isle_of_man",
                    "istanbul",
                    "jersey",
                    "kaliningrad",
                    "kiev",
                    "lisbon",
                    "ljubljana",
                    "london",
                    "luxembourg",
                    "madrid",
                    "malta",
                    "mariehamn",
                    "minsk",
                    "monaco",
                    "moscow",
                    "oslo",
                    "paris",
                    "podgorica",
                    "prague",
                    "riga",
                    "rome",
                    "samara",
                    "san_marino",
                    "sarajevo",
                    "simferopol",
                    "skopje",
                    "sofia",
                    "stockholm",
                    "tallinn",
                    "tirane",
                    "uzhgorod",
                    "vaduz",
                    "vatican",
                    "vienna",
                    "vilnius",
                    "volgograd",
                    "warsaw",
                    "zagreb",
                    "zaporozhye",
                    "zurich"
                ],
                "indian": [
                    "antananarivo",
                    "chagos",
                    "christmas",
                    "cocos",
                    "comoro",
                    "kerguelen",
                    "mahe",
                    "maldives",
                    "mauritius",
                    "mayotte",
                    "reunion"
                ],
                "pacific": [
                    "apia",
                    "auckland",
                    "chatham",
                    "chuuk",
                    "easter",
                    "efate",
                    "enderbury",
                    "fakaofo",
                    "fiji",
                    "funafuti",
                    "galapagos",
                    "gambier",
                    "guadalcanal",
                    "guam",
                    "honolulu",
                    "johnston",
                    "kiritimati",
                    "kosrae",
                    "kwajalein",
                    "majuro",
                    "marquesas",
                    "midway",
                    "nauru",
                    "niue",
                    "norfolk",
                    "noumea",
                    "pago_pago",
                    "palau",
                    "pitcairn",
                    "pohnpei",
                    "port_moresby",
                    "rarotonga",
                    "saipan",
                    "tahiti",
                    "tarawa",
                    "tongatapu",
                    "wake",
                    "wallis"
                ],
                "utc": [
                    ""
                ]
            };

            var tzparts= value.split('/',2);
            var continent=tzparts[0].toLowerCase();
            var city='';
            if (tzparts[1]) {
                city=tzparts[1].toLowerCase();
            }

            return (continent in timezones && ( timezones[continent].length===0 || timezones[continent].indexOf(city)!==-1))
        }
    }
});
laravel-jsvalidation/resources/assets/js/helpers.js000064400000037437152434177750016644 0ustar00/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Helper functions used by validators
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

import strlen from 'locutus/php/strings/strlen';
import array_diff from 'locutus/php/array/array_diff';
import strtotime from 'locutus/php/datetime/strtotime';
import is_numeric from 'locutus/php/var/is_numeric';

$.extend(true, laravelValidation, {

    helpers: {

        /**
         * Numeric rules
         */
        numericRules: ['Integer', 'Numeric'],

        /**
         * Gets the file information from file input.
         *
         * @param fieldObj
         * @param index
         * @returns {{file: *, extension: string, size: number}}
         */
        fileinfo: function (fieldObj, index) {
            var FileName = fieldObj.value;
            index = typeof index !== 'undefined' ? index : 0;
            if ( fieldObj.files !== null ) {
                if (typeof fieldObj.files[index] !== 'undefined') {
                    return {
                        file: FileName,
                        extension: FileName.substr(FileName.lastIndexOf('.') + 1),
                        size: fieldObj.files[index].size / 1024,
                        type: fieldObj.files[index].type
                    };
                }
            }
            return false;
        },


        /**
         * Gets the selectors for th specified field names.
         *
         * @param names
         * @returns {string}
         */
        selector: function (names) {
            var selector = [];
            if (! this.isArray(names))  {
                names = [names];
            }
            for (var i = 0; i < names.length; i++) {
                selector.push("[name='" + names[i] + "']");
            }
            return selector.join();
        },


        /**
         * Check if element has numeric rules.
         *
         * @param element
         * @returns {boolean}
         */
        hasNumericRules: function (element) {
            return this.hasRules(element, this.numericRules);
        },

        /**
         * Check if element has passed rules.
         *
         * @param element
         * @param rules
         * @returns {boolean}
         */
        hasRules: function (element, rules) {

            var found = false;
            if (typeof rules === 'string') {
                rules = [rules];
            }

            var validator = $.data(element.form, "validator");
            var listRules = [];
            var cache = validator.arrayRulesCache;
            if (element.name in cache) {
                $.each(cache[element.name], function (index, arrayRule) {
                    listRules.push(arrayRule);
                });
            }
            if (element.name in validator.settings.rules) {
                listRules.push(validator.settings.rules[element.name]);
            }
            $.each(listRules, function(index,objRules){
                if ('laravelValidation' in objRules) {
                    var _rules=objRules.laravelValidation;
                    for (var i = 0; i < _rules.length; i++) {
                        if ($.inArray(_rules[i][0],rules) !== -1) {
                            found = true;
                            return false;
                        }
                    }
                }
            });

            return found;
        },

        /**
         * Return the string length using PHP function.
         * http://php.net/manual/en/function.strlen.php
         * http://phpjs.org/functions/strlen/
         *
         * @param string
         */
        strlen: function (string) {
            return strlen(string);
        },

        /**
         * Get the size of the object depending of his type.
         *
         * @param obj
         * @param element
         * @param value
         * @returns int
         */
        getSize: function getSize(obj, element, value) {

            if (this.hasNumericRules(element) && this.is_numeric(value)) {
                return parseFloat(value);
            } else if (this.isArray(value)) {
                return parseFloat(value.length);
            } else if (element.type === 'file') {
                return parseFloat(Math.floor(this.fileinfo(element).size));
            }

            return parseFloat(this.strlen(value));
        },


        /**
         * Return specified rule from element.
         *
         * @param rule
         * @param element
         * @returns object
         */
        getLaravelValidation: function(rule, element) {

            var found = undefined;
            $.each($.validator.staticRules(element), function(key, rules) {
                if (key==="laravelValidation") {
                    $.each(rules, function (i, value) {
                        if (value[0]===rule) {
                            found=value;
                        }
                    });
                }
            });

            return found;
        },

        /**
         * Return he timestamp of value passed using format or default format in element.
         *
         * @param value
         * @param format
         * @returns {boolean|int}
         */
        parseTime: function (value, format) {

            var timeValue = false;
            var fmt = new DateFormatter();

            if (typeof value === 'number' && typeof format === 'undefined') {
                return value;
            }

            if (typeof format === 'object') {
                var dateRule = this.getLaravelValidation('DateFormat', format);
                if (dateRule !== undefined) {
                    format = dateRule[1][0];
                } else {
                    format = null;
                }
            }

            if (format == null) {
                timeValue = this.strtotime(value);
            } else {
                timeValue = fmt.parseDate(value, format);
                if (timeValue instanceof Date && fmt.formatDate(timeValue, format) === value) {
                    timeValue = Math.round((timeValue.getTime() / 1000));
                } else {
                    timeValue = false;
                }
            }

            return timeValue;
        },

        /**
         * Compare a given date against another using an operator.
         *
         * @param validator
         * @param value
         * @param element
         * @param params
         * @param operator
         * @return {boolean}
         */
        compareDates: function (validator, value, element, params, operator) {

            var timeCompare = this.parseTime(params);

            if (!timeCompare) {
                var target = this.dependentElement(validator, element, params);
                if (target === undefined) {
                    return false;
                }
                timeCompare = this.parseTime(validator.elementValue(target), target);
            }

            var timeValue = this.parseTime(value, element);
            if (timeValue === false) {
                return false;
            }

            switch (operator) {
                case '<':
                    return timeValue < timeCompare;

                case '<=':
                    return timeValue <= timeCompare;

                case '==':
                case '===':
                    return timeValue === timeCompare;

                case '>':
                    return timeValue > timeCompare;

                case '>=':
                    return timeValue >= timeCompare;

                default:
                    throw new Error('Unsupported operator.');
            }
        },

        /**
         * This method allows you to intelligently guess the date by closely matching the specific format.
         *
         * @param value
         * @param format
         * @returns {Date}
         */
        guessDate: function (value, format) {
            var fmt = new DateFormatter();
            return fmt.guessDate(value, format)
        },

        /**
         * Returns Unix timestamp based on PHP function strototime.
         * http://php.net/manual/es/function.strtotime.php
         * http://phpjs.org/functions/strtotime/
         *
         * @param text
         * @param now
         * @returns {*}
         */
        strtotime: function (text, now) {
            return strtotime(text, now)
        },

        /**
         * Returns if value is numeric.
         * http://php.net/manual/es/var.is_numeric.php
         * http://phpjs.org/functions/is_numeric/
         *
         * @param mixed_var
         * @returns {*}
         */
        is_numeric: function (mixed_var) {
            return is_numeric(mixed_var)
        },

        /**
         * Check whether the argument is of type Array.
         * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Polyfill
         *
         * @param arg
         * @returns {boolean}
         */
        isArray: function(arg) {
            return Object.prototype.toString.call(arg) === '[object Array]';
        },

        /**
         * Returns Array diff based on PHP function array_diff.
         * http://php.net/manual/es/function.array_diff.php
         * http://phpjs.org/functions/array_diff/
         *
         * @param arr1
         * @param arr2
         * @returns {*}
         */
        arrayDiff: function (arr1, arr2) {
            return array_diff(arr1, arr2);
        },

        /**
         * Check whether two arrays are equal to one another.
         *
         * @param arr1
         * @param arr2
         * @returns {*}
         */
        arrayEquals: function (arr1, arr2) {
            if (! this.isArray(arr1) || ! this.isArray(arr2)) {
                return false;
            }
            
            if (arr1.length !== arr2.length) {
                return false;
            }
            
            return $.isEmptyObject(this.arrayDiff(arr1, arr2));
        },

        /**
         * Makes element dependant from other.
         *
         * @param validator
         * @param element
         * @param name
         * @returns {*}
         */
        dependentElement: function(validator, element, name) {

            var el=validator.findByName(name);

            if ( el[0]!==undefined  && validator.settings.onfocusout ) {
                var event = 'blur';
                if (el[0].tagName === 'SELECT' ||
                    el[0].tagName === 'OPTION' ||
                    el[0].type === 'checkbox' ||
                    el[0].type === 'radio'
                ) {
                    event = 'click';
                }

                var ruleName = '.validate-laravelValidation';
                el.off( ruleName )
                    .off(event + ruleName + '-' + element.name)
                    .on( event + ruleName + '-' + element.name, function() {
                        $( element ).valid();
                    });
            }

            return el[0];
        },

        /**
         * Parses error Ajax response and gets the message.
         *
         * @param response
         * @returns {string[]}
         */
        parseErrorResponse: function (response) {
            var newResponse = ['Whoops, looks like something went wrong.'];
            if ('responseText' in response) {
                var errorMsg = response.responseText.match(/<h1\s*>(.*)<\/h1\s*>/i);
                if (this.isArray(errorMsg)) {
                    newResponse = [errorMsg[1]];
                }
            }
            return newResponse;
        },

        /**
         * Escape string to use as Regular Expression.
         *
         * @param str
         * @returns string
         */
        escapeRegExp: function (str) {
            return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
        },

        /**
         * Generate RegExp from wildcard attributes.
         *
         * @param name
         * @returns {RegExp}
         */
        regexFromWildcard: function (name) {
            var nameParts = name.split('[*]');
            if (nameParts.length === 1) nameParts.push('');

            return new RegExp('^' + nameParts.map(function(x) {
                return laravelValidation.helpers.escapeRegExp(x)
            }).join('\\[[^\\]]*\\]') + '$');
        },

        /**
         * Merge additional laravel validation rules into the current rule set.
         *
         * @param {object} rules
         * @param {object} newRules
         * @returns {object}
         */
        mergeRules: function (rules, newRules) {
            var rulesList = {
                'laravelValidation': newRules.laravelValidation || [],
                'laravelValidationRemote': newRules.laravelValidationRemote || []
            };

            for (var key in rulesList) {
                if (rulesList[key].length === 0) {
                    continue;
                }

                if (typeof rules[key] === "undefined") {
                    rules[key] = [];
                }

                rules[key] = rules[key].concat(rulesList[key]);
            }

            return rules;
        },

        /**
         * HTML entity encode a string.
         *
         * @param string
         * @returns {string}
         */
        encode: function (string) {
            return $('<div/>').text(string).html();
        },

        /**
         * Lookup name in an array.
         *
         * @param validator
         * @param {string} name Name in dot notation format.
         * @returns {*}
         */
        findByArrayName: function (validator, name) {
            var sqName = name.replace(/\.([^\.]+)/g, '[$1]'),
                lookups = [
                    // Convert dot to square brackets. e.g. foo.bar.0 becomes foo[bar][0]
                    sqName,
                    // Append [] to the name e.g. foo becomes foo[] or foo.bar.0 becomes foo[bar][0][]
                    sqName + '[]',
                    // Remove key from last array e.g. foo[bar][0] becomes foo[bar][]
                    sqName.replace(/(.*)\[(.*)\]$/g, '$1[]')
                ];

            for (var i = 0; i < lookups.length; i++) {
                var elem = validator.findByName(lookups[i]);
                if (elem.length > 0) {
                    return elem;
                }
            }

            return $(null);
        },

        /**
         * Attempt to find an element in the DOM matching the given name.
         * Example names include:
         *    - domain.0 which matches domain[]
         *    - customfield.3 which matches customfield[3]
         *
         * @param validator
         * @param {string} name
         * @returns {*}
         */
        findByName: function (validator, name) {
            // Exact match.
            var elem = validator.findByName(name);
            if (elem.length > 0) {
                return elem;
            }

            // Find name in data, using dot notation.
            var delim = '.',
                parts  = name.split(delim);
            for (var i = parts.length; i > 0; i--) {
                var reconstructed = [];
                for (var c = 0; c < i; c++) {
                    reconstructed.push(parts[c]);
                }

                elem = this.findByArrayName(validator, reconstructed.join(delim));
                if (elem.length > 0) {
                    return elem;
                }
            }

            return $(null);
        },

        /**
         * If it's an array element, get all values.
         *
         * @param validator
         * @param element
         * @returns {*|string}
         */
        allElementValues: function (validator, element) {
            if (element.name.indexOf('[]') !== -1) {
                return validator.findByName(element.name).map(function (i, e) {
                    return validator.elementValue(e);
                }).get();
            }

            return validator.elementValue(element);
        }
    }
});
laravel-jsvalidation/resources/assets/js/validations.js000064400000060256152434177750017512 0ustar00/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Methods that implement Laravel Validations
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

$.extend(true, laravelValidation, {

    methods:{

        helpers: laravelValidation.helpers,

        jsRemoteTimer:0,

        /**
         * "Validate" optional attributes.
         * Always returns true, just lets us put sometimes in rules.
         *
         * @return {boolean}
         */
        Sometimes: function() {
            return true;
        },

        /**
         * Bail This is the default behaivour os JSValidation.
         * Always returns true, just lets us put sometimes in rules.
         *
         * @return {boolean}
         */
        Bail: function() {
            return true;
        },

        /**
         * "Indicate" validation should pass if value is null.
         * Always returns true, just lets us put "nullable" in rules.
         *
         * @return {boolean}
         */
        Nullable: function() {
            return true;
        },

        /**
         * Validate the given attribute is filled if it is present.
         */
        Filled: function(value, element) {
            return $.validator.methods.required.call(this, value, element, true);
        },


        /**
         * Validate that a required attribute exists.
         */
        Required: function(value, element) {
            return  $.validator.methods.required.call(this, value, element);
        },

        /**
         * Validate that an attribute exists when any other attribute exists.
         *
         * @return {boolean}
         */
        RequiredWith: function(value, element, params) {
            var validator=this,
                required=false;
            var currentObject=this;

            $.each(params,function(i,param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required=required || (
                    target!==undefined &&
                    $.validator.methods.required.call(
                        validator,
                        currentObject.elementValue(target),
                        target,true
                    ));
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when all other attribute exists.
         *
         * @return {boolean}
         */
        RequiredWithAll: function(value, element, params) {
            var validator=this,
                required=true;
            var currentObject=this;

            $.each(params,function(i,param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required = required && (
                      target!==undefined &&
                      $.validator.methods.required.call(
                          validator,
                          currentObject.elementValue(target),
                          target,true
                      ));
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when any other attribute does not exists.
         *
         * @return {boolean}
         */
        RequiredWithout: function(value, element, params) {
            var validator=this,
                required=false;
            var currentObject=this;

            $.each(params,function(i,param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required = required ||
                    target===undefined||
                    !$.validator.methods.required.call(
                        validator,
                        currentObject.elementValue(target),
                        target,true
                    );
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when all other attribute does not exists.
         *
         * @return {boolean}
         */
        RequiredWithoutAll: function(value, element, params) {
            var validator=this,
                required=true,
                currentObject=this;

            $.each(params,function(i, param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required = required && (
                    target===undefined ||
                    !$.validator.methods.required.call(
                        validator,
                        currentObject.elementValue(target),
                        target,true
                    ));
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when another attribute has a given value.
         *
         * @return {boolean}
         */
        RequiredIf: function(value, element, params) {

            var target=laravelValidation.helpers.dependentElement(
                this, element, params[0]
            );

            if (target!==undefined) {
                var val=String(this.elementValue(target));
                if (typeof val !== 'undefined') {
                    var data = params.slice(1);
                    if ($.inArray(val, data) !== -1) {
                        return $.validator.methods.required.call(
                            this, value, element, true
                        );
                    }
                }
            }

            return true;
        },

        /**
         * Validate that an attribute exists when another
         * attribute does not have a given value.
         *
         * @return {boolean}
         */
        RequiredUnless: function(value, element, params) {

            var target=laravelValidation.helpers.dependentElement(
                this, element, params[0]
            );

            if (target!==undefined) {
                var val=String(this.elementValue(target));
                if (typeof val !== 'undefined') {
                    var data = params.slice(1);
                    if ($.inArray(val, data) !== -1) {
                        return true;
                    }
                }
            }

            return $.validator.methods.required.call(
                this, value, element, true
            );

        },

        /**
         * Validate that an attribute has a matching confirmation.
         *
         * @return {boolean}
         */
        Confirmed: function(value, element, params) {
            return laravelValidation.methods.Same.call(this,value, element, params);
        },

        /**
         * Validate that two attributes match.
         *
         * @return {boolean}
         */
        Same: function(value, element, params) {

            var target=laravelValidation.helpers.dependentElement(
                this, element, params[0]
            );

            if (target!==undefined) {
                return String(value) === String(this.elementValue(target));
            }
            return false;
        },

        /**
         * Validate that the values of an attribute is in another attribute.
         *
         * @param value
         * @param element
         * @param params
         * @returns {boolean}
         * @constructor
         */
        InArray: function (value, element, params) {
            if (typeof params[0] === 'undefined') {
                return false;
            }
            var elements = this.elements();
            var found = false;
            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);

            for ( var i = 0; i < elements.length ; i++ ) {
                var targetName = elements[i].name;
                if (targetName.match(nameRegExp)) {
                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);
                    found = found || equals;
                }
            }

            return found;
        },

        /**
         * Validate an attribute is unique among other values.
         *
         * @param value
         * @param element
         * @param params
         * @returns {boolean}
         */
        Distinct: function (value, element, params) {
            if (typeof params[0] === 'undefined') {
                return false;
            }

            var elements = this.elements();
            var found = false;
            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);

            for ( var i = 0; i < elements.length ; i++ ) {
                var targetName = elements[i].name;
                if (targetName !== element.name && targetName.match(nameRegExp)) {
                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);
                    found = found || equals;
                }
            }

            return !found;
        },


        /**
         * Validate that an attribute is different from another attribute.
         *
         * @return {boolean}
         */
        Different: function(value, element, params) {
            return ! laravelValidation.methods.Same.call(this,value, element, params);
        },

        /**
         * Validate that an attribute was "accepted".
         * This validation rule implies the attribute is "required".
         *
         * @return {boolean}
         */
        Accepted: function(value) {
            var regex = new RegExp("^(?:(yes|on|1|true))$",'i');
            return regex.test(value);
        },

        /**
         * Validate that an attribute is an array.
         *
         * @param value
         * @param element
         */
        Array: function(value, element) {
            if (element.name.indexOf('[') !== -1 && element.name.indexOf(']') !== -1) {
                return true;
            }

            return laravelValidation.helpers.isArray(value);
        },

        /**
         * Validate that an attribute is a boolean.
         *
         * @return {boolean}
         */
        Boolean: function(value) {
            var regex= new RegExp("^(?:(true|false|1|0))$",'i');
            return  regex.test(value);
        },

        /**
         * Validate that an attribute is an integer.
         *
         * @return {boolean}
         */
        Integer: function(value) {
            var regex= new RegExp("^(?:-?\\d+)$",'i');
            return  regex.test(value);
        },

        /**
         * Validate that an attribute is numeric.
         */
        Numeric: function(value, element) {
            return $.validator.methods.number.call(this, value, element, true);
        },

        /**
         * Validate that an attribute is a string.
         *
         * @return {boolean}
         */
        String: function(value) {
            return typeof value === 'string';
        },

        /**
         * The field under validation must be numeric and must have an exact length of value.
         */
        Digits: function(value, element, params) {
            return (
                $.validator.methods.number.call(this, value, element, true) &&
                value.length === parseInt(params, 10)
            );
        },

        /**
         * The field under validation must have a length between the given min and max.
         */
        DigitsBetween: function(value, element, params) {
            return ($.validator.methods.number.call(this, value, element, true)
                && value.length>=parseFloat(params[0]) && value.length<=parseFloat(params[1]));
        },

        /**
         * Validate the size of an attribute.
         *
         * @return {boolean}
         */
        Size: function(value, element, params) {
            return laravelValidation.helpers.getSize(this, element,value) === parseFloat(params[0]);
        },

        /**
         * Validate the size of an attribute is between a set of values.
         *
         * @return {boolean}
         */
        Between: function(value, element, params) {
            return ( laravelValidation.helpers.getSize(this, element,value) >= parseFloat(params[0]) &&
                laravelValidation.helpers.getSize(this,element,value) <= parseFloat(params[1]));
        },

        /**
         * Validate the size of an attribute is greater than a minimum value.
         *
         * @return {boolean}
         */
        Min: function(value, element, params) {
            value = laravelValidation.helpers.allElementValues(this, element);

            return laravelValidation.helpers.getSize(this, element, value) >= parseFloat(params[0]);
        },

        /**
         * Validate the size of an attribute is less than a maximum value.
         *
         * @return {boolean}
         */
        Max: function(value, element, params) {
            value = laravelValidation.helpers.allElementValues(this, element);

            return laravelValidation.helpers.getSize(this, element, value) <= parseFloat(params[0]);
        },

        /**
         * Validate an attribute is contained within a list of values.
         *
         * @return {boolean}
         */
        In: function(value, element, params) {
            if (laravelValidation.helpers.isArray(value)
                && laravelValidation.helpers.hasRules(element, "Array")
            ) {
                var diff = laravelValidation.helpers.arrayDiff(value, params);

                return Object.keys(diff).length === 0;
            }

            return params.indexOf(value.toString()) !== -1;
        },

        /**
         * Validate an attribute is not contained within a list of values.
         *
         * @return {boolean}
         */
        NotIn: function(value, element, params) {
            return params.indexOf(value.toString()) === -1;
        },

        /**
         * Validate that an attribute is a valid IP.
         *
         * @return {boolean}
         */
        Ip: function(value) {
            return /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value) ||
                /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);
        },

        /**
         * Validate that an attribute is a valid e-mail address.
         */
        Email: function(value, element) {
            return $.validator.methods.email.call(this, value, element, true);
        },

        /**
         * Validate that an attribute is a valid URL.
         */
        Url: function(value, element) {
            return $.validator.methods.url.call(this, value, element, true);
        },

        /**
         * The field under validation must be a successfully uploaded file.
         *
         * @return {boolean}
         */
        File: function(value, element) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            if ('files' in element ) {
                return (element.files.length > 0);
            }
            return false;
        },

        /**
         * Validate the MIME type of a file upload attribute is in a set of MIME types.
         *
         * @return {boolean}
         */
        Mimes: function(value, element, params) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            var lowerParams = $.map(params, function(item) {
                return item.toLowerCase();
            });

            var fileinfo = laravelValidation.helpers.fileinfo(element);
            return (fileinfo !== false && lowerParams.indexOf(fileinfo.extension.toLowerCase())!==-1);
        },

        /**
         * The file under validation must match one of the given MIME types.
         *
         * @return {boolean}
         */
        Mimetypes: function(value, element, params) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            var lowerParams = $.map(params, function(item) {
                return item.toLowerCase();
            });

            var fileinfo = laravelValidation.helpers.fileinfo(element);

            if (fileinfo === false) {
                return false;
            }
            return (lowerParams.indexOf(fileinfo.type.toLowerCase())!==-1);
        },

        /**
         * Validate the MIME type of a file upload attribute is in a set of MIME types.
         */
        Image: function(value, element) {
            return laravelValidation.methods.Mimes.call(this, value, element, [
                'jpg', 'png', 'gif', 'bmp', 'svg', 'jpeg'
            ]);
        },

        /**
         * Validate dimensions of Image.
         *
         * @return {boolean|string}
         */
        Dimensions: function(value, element, params, callback) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            if (element.files === null || typeof element.files[0] === 'undefined') {
                return false;
            }

            var fr = new FileReader;
            fr.onload = function () {
                var img = new Image();
                img.onload = function () {
                    var height = parseFloat(img.naturalHeight);
                    var width = parseFloat(img.naturalWidth);
                    var ratio = width / height;
                    var notValid = ((params['width']) && parseFloat(params['width'] !== width)) ||
                        ((params['min_width']) && parseFloat(params['min_width']) > width) ||
                        ((params['max_width']) && parseFloat(params['max_width']) < width) ||
                        ((params['height']) && parseFloat(params['height']) !== height) ||
                        ((params['min_height']) && parseFloat(params['min_height']) > height) ||
                        ((params['max_height']) && parseFloat(params['max_height']) < height) ||
                        ((params['ratio']) && ratio !== parseFloat(eval(params['ratio']))
                        );
                    callback(! notValid);
                };
                img.onerror = function() {
                    callback(false);
                };
                img.src = fr.result;
            };
            fr.readAsDataURL(element.files[0]);

            return 'pending';
        },

        /**
         * Validate that an attribute contains only alphabetic characters.
         *
         * @return {boolean}
         */
        Alpha: function(value) {
            if (typeof  value !== 'string') {
                return false;
            }

            var regex = new RegExp("^(?:^[a-z\u00E0-\u00FC]+$)$",'i');
            return  regex.test(value);

        },

        /**
         * Validate that an attribute contains only alpha-numeric characters.
         *
         * @return {boolean}
         */
        AlphaNum: function(value) {
            if (typeof  value !== 'string') {
                return false;
            }
            var regex = new RegExp("^(?:^[a-z0-9\u00E0-\u00FC]+$)$",'i');
            return regex.test(value);
        },

        /**
         * Validate that an attribute contains only alphabetic characters.
         *
         * @return {boolean}
         */
        AlphaDash: function(value) {
            if (typeof  value !== 'string') {
                return false;
            }
            var regex = new RegExp("^(?:^[a-z0-9\u00E0-\u00FC_-]+$)$",'i');
            return regex.test(value);
        },

        /**
         * Validate that an attribute passes a regular expression check.
         *
         * @return {boolean}
         */
        Regex: function(value, element, params) {
            var invalidModifiers=['x','s','u','X','U','A'];
            // Converting php regular expression
            var phpReg= new RegExp('^(?:\/)(.*\\\/?[^\/]*|[^\/]*)(?:\/)([gmixXsuUAJ]*)?$');
            var matches=params[0].match(phpReg);
            if (matches === null) {
                return false;
            }
            // checking modifiers
            var php_modifiers=[];
            if (matches[2]!==undefined) {
                php_modifiers=matches[2].split('');
                for (var i=0; i<php_modifiers.length<i ;i++) {
                    if (invalidModifiers.indexOf(php_modifiers[i])!==-1) {
                        return true;
                    }
                }
            }
            var regex = new RegExp("^(?:"+matches[1]+")$",php_modifiers.join());
            return   regex.test(value);
        },

        /**
         * Validate that an attribute is a valid date.
         *
         * @return {boolean}
         */
        Date: function(value) {
            return (laravelValidation.helpers.strtotime(value)!==false);
        },

        /**
         * Validate that an attribute matches a date format.
         *
         * @return {boolean}
         */
        DateFormat: function(value, element, params) {
            return laravelValidation.helpers.parseTime(value,params[0])!==false;
        },

        /**
         * Validate the date is before a given date.
         *
         * @return {boolean}
         */
        Before: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<');
        },

        /**
         * Validate the date is equal or before a given date.
         *
         * @return {boolean}
         */
        BeforeOrEqual: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<=');
        },

        /**
         * Validate the date is after a given date.
         *
         * @return {boolean}
         */
        After: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>');
        },

        /**
         * Validate the date is equal or after a given date.
         *
         * @return {boolean}
         */
        AfterOrEqual: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>=');
        },


        /**
         * Validate that an attribute is a valid date.
         */
        Timezone: function(value) {
            return  laravelValidation.helpers.isTimezone(value);
        },


        /**
         * Validate the attribute is a valid JSON string.
         *
         * @param  value
         * @return bool
         */
        Json: function(value) {
            var result = true;
            try {
                JSON.parse(value);
            } catch (e) {
                result = false;
            }
            return result;
        },

        /**
         * Noop (always returns true).
         *
         * @param value
         * @returns {boolean}
         */
        ProengsoftNoop: function (value) {
            return true;
        },
    }
});
laravel-jsvalidation/resources/assets/js/jsvalidation.js000064400000033572152434177750017665 0ustar00/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

var laravelValidation;
laravelValidation = {

    implicitRules: ['Required','Confirmed'],

    /**
     * Initialize laravel validations.
     */
    init: function () {

        // jquery-validation requires the field under validation to be present. We're adding a dummy hidden
        // field so that any errors are not visible.
        var constructor = $.fn.validate;
        $.fn.validate = function( options ) {
            var name = 'proengsoft_jsvalidation'; // must match the name defined in JsValidatorFactory.newFormRequestValidator
            var $elm = $(this).find('input[name="' + name + '"]');
            if ($elm.length === 0) {
                $('<input>').attr({type: 'hidden', name: name}).appendTo(this);
            }

            return constructor.apply(this, [options]);
        };

        // Disable class rules and attribute rules
        $.validator.classRuleSettings = {};
        $.validator.attributeRules = function () {};

        $.validator.dataRules = this.arrayRules;
        $.validator.prototype.arrayRulesCache = {};

        // Register validations methods
        this.setupValidations();
    },

    arrayRules: function(element) {

        var rules = {},
            validator = $.data( element.form, "validator"),
            cache = validator.arrayRulesCache;

        // Is not an Array
        if (element.name.indexOf('[') === -1) {
            return rules;
        }

        if (! (element.name in cache)) {
            cache[element.name] = {};
        }

        $.each(validator.settings.rules, function(name, tmpRules) {
            if (name in cache[element.name]) {
                rules = laravelValidation.helpers.mergeRules(rules, cache[element.name][name]);
            } else {
                cache[element.name][name] = {};

                var nameRegExp = laravelValidation.helpers.regexFromWildcard(name);
                if (element.name.match(nameRegExp)) {
                    var newRules = $.validator.normalizeRule(tmpRules) || {};
                    cache[element.name][name] = newRules;

                    rules = laravelValidation.helpers.mergeRules(rules, newRules);
                }
            }
        });

        return rules;
    },

    setupValidations: function () {

        /**
         * Get CSRF token.
         *
         * @param params
         * @returns {string}
         */
        var getCsrfToken = function (params) {
            return params[0][1][1];
        };

        /**
         * Whether to validate all attributes.
         *
         * @param params
         * @returns {boolean}
         */
        var isValidateAll = function (params) {
            return params[0][1][2];
        };

        /**
         * Determine whether the rule is implicit.
         *
         * @param params
         * @returns {boolean}
         */
        var isImplicit = function (params) {
            var implicit = false;
            $.each(params, function (i, parameters) {
                implicit = implicit || parameters[3];
            });

            return implicit;
        };

        /**
         * Get form method from a validator instance.
         *
         * @param validator
         * @returns {string}
         */
        var formMethod = function (validator) {
            var formMethod = $(validator.currentForm).attr('method');
            if ($(validator.currentForm).find('input[name="_method"]').length) {
                formMethod = $(validator.currentForm).find('input[name="_method"]').val();
            }

            return formMethod;
        };

        /**
         * Get AJAX parameters for remote requests.
         *
         * @param validator
         * @param element
         * @param params
         * @param data
         * @returns {object}
         */
        var ajaxOpts = function (validator, element, params, data) {
            return {
                mode: 'abort',
                port: 'validate' + element.name,
                dataType: 'json',
                data: data,
                context: validator.currentForm,
                url: $(validator.currentForm).attr('action'),
                type: formMethod(validator),
                beforeSend: function (xhr) {
                    var token = getCsrfToken(params);
                    if (formMethod(validator) !== 'get' && token) {
                        return xhr.setRequestHeader('X-XSRF-TOKEN', token);
                    }
                },
            };
        };

        /**
         * Validate a set of local JS based rules against an element.
         *
         * @param validator
         * @param values
         * @param element
         * @param rules
         * @returns {boolean}
         */
        var validateLocalRules = function (validator, values, element, rules) {
            var validated = true,
                previous = validator.previousValue(element);

            $.each(rules, function (i, param) {
                var implicit = param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1;
                var rule = param[0];
                var message = param[2];

                if (! implicit && validator.optional(element)) {
                    validated = "dependency-mismatch";
                    return false;
                }

                if (laravelValidation.methods[rule] !== undefined) {
                    $.each(values, function(index, value) {
                        validated = laravelValidation.methods[rule].call(validator, value, element, param[1], function(valid) {
                            validator.settings.messages[element.name].laravelValidationRemote = previous.originalMessage;
                            if (valid) {
                                var submitted = validator.formSubmitted;
                                validator.prepareElement(element);
                                validator.formSubmitted = submitted;
                                validator.successList.push(element);
                                delete validator.invalid[element.name];
                                validator.showErrors();
                            } else {
                                var errors = {};
                                errors[ element.name ]
                                    = previous.message
                                    = typeof message === "function" ? message( value ) : message;
                                validator.invalid[element.name] = true;
                                validator.showErrors(errors);
                            }
                            validator.showErrors(validator.errorMap);
                            previous.valid = valid;
                        });

                        // Break loop.
                        if (validated === false) {
                            return false;
                        }
                    });
                } else {
                    validated = false;
                }

                if (validated !== true) {
                    if (!validator.settings.messages[element.name] ) {
                        validator.settings.messages[element.name] = {};
                    }

                    validator.settings.messages[element.name].laravelValidation= message;

                    return false;
                }

            });

            return validated;
        };

        /**
         * Create JQueryValidation check to validate Laravel rules.
         */

        $.validator.addMethod("laravelValidation", function (value, element, params) {
            var rules = [],
                arrayRules = [];
            $.each(params, function (i, param) {
                // put Implicit rules in front
                var isArrayRule = param[4].indexOf('[') !== -1;
                if (param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1) {
                    isArrayRule ? arrayRules.unshift(param) : rules.unshift(param);
                } else {
                    isArrayRule ? arrayRules.push(param) : rules.push(param);
                }
            });

            // Validate normal rules.
            var localRulesResult = validateLocalRules(this, [value], element, rules);

            // Validate items of the array using array rules.
            var arrayValue = ! Array.isArray(value) ? [value] : value;
            var arrayRulesResult = validateLocalRules(this, arrayValue, element, arrayRules);

            return localRulesResult && arrayRulesResult;
        }, '');


        /**
         * Create JQueryValidation check to validate Remote Laravel rules.
         */
        $.validator.addMethod("laravelValidationRemote", function (value, element, params) {

            if (! isImplicit(params) && this.optional( element )) {
                return "dependency-mismatch";
            }

            var previous = this.previousValue( element ),
                validator, data;

            if (! this.settings.messages[ element.name ]) {
                this.settings.messages[ element.name ] = {};
            }
            previous.originalMessage = this.settings.messages[ element.name ].laravelValidationRemote;
            this.settings.messages[ element.name ].laravelValidationRemote = previous.message;

            if (laravelValidation.helpers.arrayEquals(previous.old, value) || previous.old === value) {
                return previous.valid;
            }

            previous.old = value;
            validator = this;
            this.startRequest( element );

            data = $(validator.currentForm).serializeArray();
            data.push({'name': '_jsvalidation', 'value': element.name});
            data.push({'name': '_jsvalidation_validate_all', 'value': isValidateAll(params)});

            $.ajax( ajaxOpts(validator, element, params, data) )
                .always(function( response, textStatus ) {
                    var errors, message, submitted, valid;

                    if (textStatus === 'error') {
                        valid = false;
                        response = laravelValidation.helpers.parseErrorResponse(response);
                    } else if (textStatus === 'success') {
                        valid = response === true || response === "true";
                    } else {
                        return;
                    }

                    validator.settings.messages[ element.name ].laravelValidationRemote = previous.originalMessage;

                    if ( valid ) {
                        submitted = validator.formSubmitted;
                        validator.prepareElement( element );
                        validator.formSubmitted = submitted;
                        validator.successList.push( element );
                        delete validator.invalid[ element.name ];
                        validator.showErrors();
                    } else {
                        errors = {};
                        message = response || validator.defaultMessage( element, "remote" );
                        errors[ element.name ]
                            = previous.message
                            = typeof message === "function" ? message( value ) : message[0];
                        validator.invalid[ element.name ] = true;
                        validator.showErrors( errors );
                    }
                    validator.showErrors(validator.errorMap);
                    previous.valid = valid;
                    validator.stopRequest( element, valid );
                }
            );
            return "pending";
        }, '');

        /**
         * Create JQueryValidation check to form requests.
         */
        $.validator.addMethod("laravelValidationFormRequest", function (value, element, params) {

            var validator = this,
                previous = validator.previousValue(element);

            var data = $(validator.currentForm).serializeArray();
            data.push({name: '__proengsoft_form_request', value: 1}); // must match FormRequest.JS_VALIDATION_FIELD

            // Skip AJAX if the value remains the same as a prior request.
            if (JSON.stringify(previous.old) === JSON.stringify(data)) {
                if (! previous.valid) {
                    validator.showErrors(previous.errors || {});
                }

                return previous.valid;
            }

            previous.old = data;
            this.startRequest( element );

            $.ajax(ajaxOpts(validator, element, params, data))
                .always(function( response, textStatus ) {
                    var errors = {},
                        valid = textStatus === 'success' && (response === true || response === 'true');

                    if (valid) {
                        validator.resetInternals();
                        validator.toHide = validator.errorsFor( element );
                    } else {
                        $.each( response, function( fieldName, errorMessages ) {
                            var errorElement = laravelValidation.helpers.findByName(validator, fieldName)[0];
                            if (errorElement) {
                                errors[errorElement.name] = laravelValidation.helpers.encode(errorMessages[0] || '');
                            }
                        });

                        // Failed to find the error fields so mark the form as valid otherwise user
                        // will be left in limbo with no visible error messages.
                        if ($.isEmptyObject(errors)) {
                            valid = true;
                        }
                    }

                    previous.valid = valid;
                    previous.errors = errors;
                    validator.showErrors(errors);
                    validator.stopRequest(element, valid);
                });

            return 'pending';
        }, '');
    }
};

$(function() {
    laravelValidation.init();
});
laravel-jsvalidation/src/JsValidationServiceProvider.php000064400000004445152434177750017630 0ustar00<?php

namespace Proengsoft\JsValidation;

use Illuminate\Contracts\Http\Kernel;
use Illuminate\Support\ServiceProvider;
use Proengsoft\JsValidation\Javascript\ValidatorHandler;

class JsValidationServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->bootstrapConfigs();
        $this->bootstrapViews();
        $this->bootstrapValidator();
        $this->publishAssets();

        if ($this->app['config']->get('jsvalidation.disable_remote_validation') === false) {
            $this->app[Kernel::class]->pushMiddleware(RemoteValidationMiddleware::class);
        }
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('jsvalidator', function ($app) {
            $config = $app['config']->get('jsvalidation');

            return new JsValidatorFactory($app, $config);
        });
    }

    /**
     * Configure and publish views.
     *
     * @return void
     */
    protected function bootstrapViews()
    {
        $viewPath = realpath(__DIR__.'/../resources/views');

        $this->loadViewsFrom($viewPath, 'jsvalidation');
        $this->publishes([
            $viewPath => $this->app['path.base'].'/resources/views/vendor/jsvalidation',
        ], 'views');
    }

    /**
     * Configure Laravel Validator.
     *
     * @return void
     */
    protected function bootstrapValidator()
    {
        $callback = function () {
            return true;
        };
        $this->app['validator']->extend(ValidatorHandler::JSVALIDATION_DISABLE, $callback);
    }

    /**
     * Load and publishes configs.
     *
     * @return void
     */
    protected function bootstrapConfigs()
    {
        $configFile = realpath(__DIR__.'/../config/jsvalidation.php');

        $this->mergeConfigFrom($configFile, 'jsvalidation');
        $this->publishes([$configFile => $this->app['path.config'].'/jsvalidation.php'], 'config');
    }

    /**
     * Publish public assets.
     *
     * @return void
     */
    protected function publishAssets()
    {
        $this->publishes([
            realpath(__DIR__.'/../public') => $this->app['path.public'].'/vendor/jsvalidation',
        ], 'public');
    }
}
laravel-jsvalidation/src/JsValidatorFactory.php000064400000022327152434177750015756 0ustar00<?php

namespace Proengsoft\JsValidation;

use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Foundation\Http\FormRequest as IlluminateFormRequest;
use Illuminate\Support\Arr;
use Illuminate\Validation\Validator;
use Proengsoft\JsValidation\Javascript\JavascriptValidator;
use Proengsoft\JsValidation\Javascript\MessageParser;
use Proengsoft\JsValidation\Javascript\RuleParser;
use Proengsoft\JsValidation\Javascript\ValidatorHandler;
use Proengsoft\JsValidation\Remote\FormRequest;
use Proengsoft\JsValidation\Support\DelegatedValidator;
use Proengsoft\JsValidation\Support\ValidationRuleParserProxy;

class JsValidatorFactory
{
    const ASTERISK = '__asterisk__';

    /**
     * The application instance.
     *
     * @var \Illuminate\Container\Container
     */
    protected $app;

    /**
     * Configuration options.
     *
     * @var array
     */
    protected $options;

    /**
     * Create a new Validator factory instance.
     *
     * @param  \Illuminate\Container\Container  $app
     * @param  array  $options
     */
    public function __construct($app, array $options = [])
    {
        $this->app = $app;
        $this->setOptions($options);
    }

    /**
     * @param  $options
     * @return void
     */
    protected function setOptions($options)
    {
        $options['disable_remote_validation'] = empty($options['disable_remote_validation']) ? false : $options['disable_remote_validation'];
        $options['view'] = empty($options['view']) ? 'jsvalidation:bootstrap' : $options['view'];
        $options['form_selector'] = empty($options['form_selector']) ? 'form' : $options['form_selector'];

        $this->options = $options;
    }

    /**
     * Creates JsValidator instance based on rules and message arrays.
     *
     * @param  array  $rules
     * @param  array  $messages
     * @param  array  $customAttributes
     * @param  null|string  $selector
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function make(array $rules, array $messages = [], array $customAttributes = [], $selector = null)
    {
        $validator = $this->getValidatorInstance($rules, $messages, $customAttributes);

        return $this->validator($validator, $selector);
    }

    /**
     * Get the validator instance for the request.
     *
     * @param  array  $rules
     * @param  array  $messages
     * @param  array  $customAttributes
     * @return \Illuminate\Validation\Validator
     */
    protected function getValidatorInstance(array $rules, array $messages = [], array $customAttributes = [])
    {
        $factory = $this->app->make(ValidationFactory::class);

        $data = $this->getValidationData($rules, $customAttributes);
        $validator = $factory->make($data, $rules, $messages, $customAttributes);
        $validator->addCustomAttributes($customAttributes);

        return $validator;
    }

    /**
     * Gets fake data when validator has wildcard rules.
     *
     * @param  array  $rules
     * @param  array  $customAttributes
     * @return array
     */
    protected function getValidationData(array $rules, array $customAttributes = [])
    {
        $attributes = array_filter(array_keys($rules), function ($attribute) {
            return $attribute !== '' && mb_strpos($attribute, '*') !== false;
        });

        $attributes = array_merge(array_keys($customAttributes), $attributes);
        $data = array_reduce($attributes, function ($data, $attribute) {
            // Prevent wildcard rule being removed as an implicit attribute (not present in the data).
            $attribute = str_replace('*', self::ASTERISK, $attribute);

            Arr::set($data, $attribute, true);

            return $data;
        }, []);

        return $data;
    }

    /**
     * Creates JsValidator instance based on FormRequest.
     *
     * @param  $formRequest
     * @param  null|string  $selector
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     *
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function formRequest($formRequest, $selector = null)
    {
        if (! is_object($formRequest)) {
            $formRequest = $this->createFormRequest($formRequest);
        }

        if ($formRequest instanceof FormRequest) {
            return $this->newFormRequestValidator($formRequest, $selector);
        }

        return $this->oldFormRequestValidator($formRequest, $selector);
    }

    /**
     * Create form request validator.
     *
     * @param  FormRequest  $formRequest
     * @param  string  $selector
     * @return JavascriptValidator
     */
    private function newFormRequestValidator($formRequest, $selector)
    {
        // Replace all rules with Noop rules which are checked client-side and always valid to true.
        // This is important because jquery-validation expects fields under validation to have rules present. For
        // example, if you mark a field as invalid without a defined rule, then unhighlight won't be called.
        $rules = method_exists($formRequest, 'rules') ? $formRequest->rules() : [];
        foreach ($rules as $key => $value) {
            $rules[$key] = 'proengsoft_noop';
        }

        // This rule controls AJAX validation of all fields.
        $rules['proengsoft_jsvalidation'] = RuleParser::FORM_REQUEST_RULE_NAME;

        $baseValidator = $this->getValidatorInstance($rules);

        return $this->validator($baseValidator, $selector);
    }

    /**
     * Create a form request validator instance.
     *
     * @param  IlluminateFormRequest  $formRequest
     * @param  string  $selector
     * @return JavascriptValidator
     */
    private function oldFormRequestValidator($formRequest, $selector)
    {
        $rules = method_exists($formRequest, 'rules') ? $this->app->call([$formRequest, 'rules']) : [];

        $validator = $this->getValidatorInstance($rules, $formRequest->messages(), $formRequest->attributes());

        $jsValidator = $this->validator($validator, $selector);

        if (method_exists($formRequest, 'withJsValidator')) {
            $formRequest->withJsValidator($jsValidator);
        }

        return $jsValidator;
    }

    /**
     * @param  string|array  $class
     * @return array
     */
    protected function parseFormRequestName($class)
    {
        $params = [];
        if (is_array($class)) {
            $params = empty($class[1]) ? $params : $class[1];
            $class = $class[0];
        }

        return [$class, $params];
    }

    /**
     * Creates and initializes an Form Request instance.
     *
     * @param  string  $class
     * @return IlluminateFormRequest
     *
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    protected function createFormRequest($class)
    {
        /*
         * @var $formRequest \Illuminate\Foundation\Http\FormRequest
         * @var $request Request
         */
        [$class, $params] = $this->parseFormRequestName($class);

        $request = $this->app->__get('request');
        $formRequest = $this->app->build($class, $params);

        if ($request->hasSession() && $session = $request->session()) {
            $formRequest->setLaravelSession($session);
        }
        $formRequest->setUserResolver($request->getUserResolver());
        $formRequest->setRouteResolver($request->getRouteResolver());
        $formRequest->setContainer($this->app);
        $formRequest->query = $request->query;

        return $formRequest;
    }

    /**
     * Creates JsValidator instance based on Validator.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @param  null|string  $selector
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function validator(Validator $validator, $selector = null)
    {
        return $this->jsValidator($validator, $selector);
    }

    /**
     * Creates JsValidator instance based on Validator.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @param  null|string  $selector
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    protected function jsValidator(Validator $validator, $selector = null)
    {
        $remote = ! $this->options['disable_remote_validation'];
        $view = $this->options['view'];
        $selector = is_null($selector) ? $this->options['form_selector'] : $selector;
        $ignore = $this->options['ignore'];

        $delegated = new DelegatedValidator($validator, new ValidationRuleParserProxy($validator->getData()));
        $rules = new RuleParser($delegated, $this->getSessionToken());
        $messages = new MessageParser($delegated, isset($this->options['escape']) ? $this->options['escape'] : false);

        $jsValidator = new ValidatorHandler($rules, $messages);

        return new JavascriptValidator($jsValidator, compact('view', 'selector', 'remote', 'ignore'));
    }

    /**
     * Get and encrypt token from session store.
     *
     * @return null|string
     */
    protected function getSessionToken()
    {
        $token = null;
        if ($session = $this->app->__get('session')) {
            $token = $session->token();
        }

        if ($encrypter = $this->app->__get('encrypter')) {
            $token = $encrypter->encrypt($token);
        }

        return $token;
    }
}
laravel-jsvalidation/src/Support/ValidationRuleParserProxy.php000064400000002767152434177750021027 0ustar00<?php

namespace Proengsoft\JsValidation\Support;

use Illuminate\Validation\ValidationRuleParser;

class ValidationRuleParserProxy
{
    use AccessProtectedTrait;

    /**
     * ValidationRuleParser instance.
     *
     * @var ValidationRuleParser
     */
    protected $parser;

    /**
     * Closure to invoke non accessible Validator methods.
     *
     * @var \Closure
     */
    protected $parserMethod;

    /**
     * ValidationRuleParserProxy constructor.
     *
     * @param  array  $data
     */
    public function __construct($data = [])
    {
        $this->parser = new ValidationRuleParser((array) $data);
        $this->parserMethod = $this->createProtectedCaller($this->parser);
    }

    /**
     * Extract the rule name and parameters from a rule.
     *
     * @param  array|string  $rules
     * @return array
     */
    public function parse($rules)
    {
        return $this->parser->parse($rules);
    }

    /**
     * Explode the rules into an array of explicit rules.
     *
     * @param  array  $rules
     * @return mixed
     */
    public function explodeRules($rules)
    {
        return $this->callProtected($this->parserMethod, 'explodeRules', [$rules]);
    }

    /**
     * Delegate method calls to parser instance.
     *
     * @param  string  $method
     * @param  mixed  $params
     * @return mixed
     */
    public function __call($method, $params)
    {
        $arrCaller = [$this->parser, $method];

        return call_user_func_array($arrCaller, $params);
    }
}
laravel-jsvalidation/src/Support/AccessProtectedTrait.php000064400000002452152434177750017734 0ustar00<?php

namespace Proengsoft\JsValidation\Support;

use Closure;

trait AccessProtectedTrait
{
    /**
     * Create closure to call inaccessible method.
     *
     * @param  $instance
     * @return \Closure
     */
    protected function createProtectedCaller($instance)
    {
        $closure = function ($method, $args) {
            $callable = [$this, $method];

            return call_user_func_array($callable, $args);
        };

        return $closure->bindTo($instance, $instance);
    }

    /**
     * Gets inaccessible property.
     *
     * @param  $instance
     * @param  $property
     * @return \Closure
     */
    protected function getProtected($instance, $property)
    {
        $closure = function ($property) {
            return $this->$property;
        };
        $callback = $closure->bindTo($instance, $instance);

        return $callback($property);
    }

    /**
     * Calls inaccessible method.
     *
     * @param  object|\Closure  $instance
     * @param  $method
     * @param  $args
     * @return mixed
     */
    protected function callProtected($instance, $method, $args = [])
    {
        if (! ($instance instanceof Closure)) {
            $instance = $this->createProtectedCaller($instance);
        }

        return call_user_func($instance, $method, $args);
    }
}
laravel-jsvalidation/src/Support/RuleListTrait.php000064400000005352152434177750016426 0ustar00<?php

namespace Proengsoft\JsValidation\Support;

use Proengsoft\JsValidation\Javascript\RuleParser;

trait RuleListTrait
{
    /**
     *  Rules validated with Javascript.
     *
     * @var array
     */
    protected $clientRules = [
        'Accepted', 'After', 'AfterOrEqual', 'Alpha', 'AlphaDash',
        'AlphaNum', 'Array', 'Bail', 'Before', 'BeforeOrEqual', 'Between', 'Boolean', 'Confirmed', 'Date', 'Dimensions',
        'DateFormat', 'Different', 'Digits', 'DigitsBetween', 'Distinct', 'Email', 'File', 'Filled', 'Image',
        'In', 'InArray', 'Integer', 'Ip', 'Json', 'Max', 'Mimes', 'Mimetypes', 'Min', 'NotIn', 'Nullable',
        'Numeric', 'Regex', 'Required', 'RequiredIf', 'RequiredUnless', 'RequiredWith', 'RequiredWithAll',
        'RequiredWithout', 'RequiredWithoutAll', 'Same', 'Size', 'Sometimes',
        'String', 'Timezone', 'ProengsoftNoop',
    ];

    /**
     * Rules validated in Server-Side.
     *
     * @var array
     */
    protected $serverRules = ['ActiveUrl', 'Exists', 'Unique', 'Url'];

    /**
     * Rules applyed to files.
     *
     * @var array
     */
    protected $fileRules = ['File', 'Image', 'Mimes', 'Mimetypes'];

    /**
     * Rule used to disable validations.
     *
     * @var string
     */
    private $disableJsValidationRule = 'NoJsValidation';

    /**
     * Returns if rule is validated using Javascript.
     *
     * @param  $rule
     * @return bool
     */
    protected function isImplemented($rule)
    {
        return in_array($rule, $this->clientRules) || in_array($rule, $this->serverRules);
    }

    /**
     * Check if rule must be validated in server-side.
     *
     * @param  $rule
     * @return bool
     */
    protected function isRemoteRule($rule)
    {
        return in_array($rule, $this->serverRules) ||
            ! in_array($rule, $this->clientRules);
    }

    /**
     * Form request rule.
     *
     * @param  string  $rule
     * @return bool
     */
    protected function isFormRequestRule($rule)
    {
        return $rule === RuleParser::FORM_REQUEST_RULE_NAME;
    }

    /**
     * Check if rule disables rule processing.
     *
     * @param  $rule
     * @return bool
     */
    protected function isDisableRule($rule)
    {
        return $rule === $this->disableJsValidationRule;
    }

    /**
     * Check if rules should be validated.
     *
     * @param  $rules
     * @return bool
     */
    protected function validationDisabled($rules)
    {
        $rules = (array) $rules;

        return in_array($this->disableJsValidationRule, $rules);
    }

    /**
     * Check if rules is for input file type.
     *
     * @param  $rule
     * @return bool
     */
    protected function isFileRule($rule)
    {
        return in_array($rule, $this->fileRules);
    }
}
laravel-jsvalidation/src/Support/DelegatedValidator.php000064400000011317152434177750017401 0ustar00<?php

namespace Proengsoft\JsValidation\Support;

use Illuminate\Validation\Validator as BaseValidator;

class DelegatedValidator
{
    use AccessProtectedTrait;

    /**
     * The Validator resolved instance.
     *
     * @var \Illuminate\Validation\Validator
     */
    protected $validator;

    /**
     * Validation rule parser instance.
     *
     * @var \Proengsoft\JsValidation\Support\ValidationRuleParserProxy
     */
    protected $ruleParser;

    /**
     * Closure to invoke non accessible Validator methods.
     *
     * @var \Closure
     */
    protected $validatorMethod;

    /**
     * DelegatedValidator constructor.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @param  \Proengsoft\JsValidation\Support\ValidationRuleParserProxy  $ruleParser
     */
    public function __construct(BaseValidator $validator, ValidationRuleParserProxy $ruleParser)
    {
        $this->validator = $validator;
        $this->ruleParser = $ruleParser;
        $this->validatorMethod = $this->createProtectedCaller($validator);
    }

    /**
     * Call validator method.
     *
     * @param  string  $method
     * @param  array  $args
     * @return mixed
     */
    private function callValidator($method, $args = [])
    {
        return $this->callProtected($this->validatorMethod, $method, $args);
    }

    /**
     * Get current \Illuminate\Validation\Validator instance.
     *
     * @return \Illuminate\Validation\Validator
     */
    public function getValidator()
    {
        return $this->validator;
    }

    /**
     * Get the data under validation.
     *
     * @return array
     */
    public function getData()
    {
        return $this->validator->getData();
    }

    /**
     * Set the data under validation.
     *
     * @param array
     */
    public function setData($data)
    {
        $rules = $this->validator->getRules();
        $this->validator->setData($data);
        if (is_array($rules)) {
            $this->validator->setRules($rules);
        }
    }

    /**
     * Get the validation rules.
     *
     * @return array
     */
    public function getRules()
    {
        return $this->validator->getRules();
    }

    /**
     * Determine if a given rule implies the attribute is required.
     *
     * @param  string  $rule
     * @return bool
     */
    public function isImplicit($rule)
    {
        return $this->callValidator('isImplicit', [$rule]);
    }

    /**
     * Replace all error message place-holders with actual values.
     *
     * @param  string  $message
     * @param  string  $attribute
     * @param  string  $rule
     * @param  array  $parameters
     * @return string
     */
    public function makeReplacements($message, $attribute, $rule, $parameters)
    {
        if (is_object($rule)) {
            $rule = get_class($rule);
        }

        return $this->callValidator('makeReplacements', [$message, $attribute, $rule, $parameters]);
    }

    /**
     * Determine if the given attribute has a rule in the given set.
     *
     * @param  string  $attribute
     * @param  string|array  $rules
     * @return bool
     */
    public function hasRule($attribute, $rules)
    {
        return $this->callValidator('hasRule', [$attribute, $rules]);
    }

    /**
     * Get the validation message for an attribute and rule.
     *
     * @param  string  $attribute
     * @param  string  $rule
     * @return string
     */
    public function getMessage($attribute, $rule)
    {
        if (is_object($rule)) {
            $rule = get_class($rule);
        }

        return $this->callValidator('getMessage', [$attribute, $rule]);
    }

    /**
     * Extract the rule name and parameters from a rule.
     *
     * @param  array|string  $rules
     * @return array
     */
    public function parseRule($rules)
    {
        return $this->ruleParser->parse($rules);
    }

    /**
     * Explode the rules into an array of rules.
     *
     * @param  string|array  $rules
     * @return array
     */
    public function explodeRules($rules)
    {
        return $this->ruleParser->explodeRules($rules);
    }

    /**
     * Add conditions to a given field based on a Closure.
     *
     * @param  string  $attribute
     * @param  string|array  $rules
     * @param  callable  $callback
     * @return void
     */
    public function sometimes($attribute, $rules, callable $callback)
    {
        $this->validator->sometimes($attribute, $rules, $callback);
    }

    /**
     * Delegate method calls to validator instance.
     *
     * @param  $method
     * @param  $params
     * @return mixed
     */
    public function __call($method, $params)
    {
        $arrCaller = [$this->validator, $method];

        return call_user_func_array($arrCaller, $params);
    }
}
laravel-jsvalidation/src/Support/UseDelegatedValidatorTrait.php000064400000001353152434177750021061 0ustar00<?php

namespace Proengsoft\JsValidation\Support;

trait UseDelegatedValidatorTrait
{
    /**
     * Delegated validator.
     *
     * @var \Proengsoft\JsValidation\Support\DelegatedValidator
     */
    protected $validator;

    /**
     * Sets delegated Validator instance.
     *
     * @param  \Proengsoft\JsValidation\Support\DelegatedValidator  $validator
     * @return void
     */
    public function setDelegatedValidator(DelegatedValidator $validator)
    {
        $this->validator = $validator;
    }

    /**
     * Gets current DelegatedValidator instance.
     *
     * @return \Proengsoft\JsValidation\Support\DelegatedValidator
     */
    public function getDelegatedValidator()
    {
        return $this->validator;
    }
}
laravel-jsvalidation/src/Facades/JsValidatorFacade.php000064400000000500152434177750017025 0ustar00<?php

namespace Proengsoft\JsValidation\Facades;

use Illuminate\Support\Facades\Facade;

class JsValidatorFacade extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'jsvalidator';
    }
}
laravel-jsvalidation/src/Remote/Resolver.php000064400000005744152434177750015244 0ustar00<?php

namespace Proengsoft\JsValidation\Remote;

use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Support\Arr;
use Illuminate\Validation\Validator as BaseValidator;
use Proengsoft\JsValidation\Support\AccessProtectedTrait;

class Resolver
{
    use AccessProtectedTrait;

    /**
     * @var \Closure
     */
    protected $resolver;

    /**
     * @var \Illuminate\Contracts\Validation\Factory
     */
    protected $factory;

    /**
     * Whether to escape validation messages.
     *
     * @var bool
     */
    protected $escape;

    /**
     * RemoteValidator constructor.
     *
     * @param  \Illuminate\Contracts\Validation\Factory  $factory
     * @param  bool  $escape
     */
    public function __construct(ValidationFactory $factory, $escape = false)
    {
        $this->factory = $factory;
        $this->resolver = $this->getProtected($factory, 'resolver');
        $this->escape = $escape;
    }

    /**
     * Closure used to resolve Validator instance.
     *
     * @param  $field
     * @return \Closure
     */
    public function resolver($field)
    {
        return function ($translator, $data, $rules, $messages, $customAttributes) use ($field) {
            return $this->resolve($translator, $data, $rules, $messages, $customAttributes, $field);
        };
    }

    /**
     * Resolves Validator instance.
     *
     * @param  $translator
     * @param  $data
     * @param  $rules
     * @param  $messages
     * @param  $customAttributes
     * @param  $field
     * @return \Illuminate\Validation\Validator
     */
    protected function resolve($translator, $data, $rules, $messages, $customAttributes, $field)
    {
        $validateAll = Arr::get($data, $field.'_validate_all', false);
        $validationRule = 'bail|'.Validator::EXTENSION_NAME.':'.$validateAll;
        $rules = [$field => $validationRule] + $rules;
        $validator = $this->createValidator($translator, $data, $rules, $messages, $customAttributes);

        return $validator;
    }

    /**
     * Create new validator instance.
     *
     * @param  $translator
     * @param  $data
     * @param  $rules
     * @param  $messages
     * @param  $customAttributes
     * @return \Illuminate\Validation\Validator
     */
    protected function createValidator($translator, $data, $rules, $messages, $customAttributes)
    {
        if (is_null($this->resolver)) {
            return new BaseValidator($translator, $data, $rules, $messages, $customAttributes);
        }

        return call_user_func($this->resolver, $translator, $data, $rules, $messages, $customAttributes);
    }

    /**
     * Closure used to trigger JsValidations.
     *
     * @return \Closure
     */
    public function validatorClosure()
    {
        return function ($attribute, $value, $parameters, BaseValidator $validator) {
            $remoteValidator = new Validator($validator, $this->escape);
            $remoteValidator->validate($value, $parameters);

            return $attribute;
        };
    }
}
laravel-jsvalidation/src/Remote/Validator.php000064400000011500152434177750015353 0ustar00<?php

namespace Proengsoft\JsValidation\Remote;

use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Arr;
use Illuminate\Validation\ValidationException;
use Illuminate\Validation\ValidationRuleParser;
use Illuminate\Validation\Validator as BaseValidator;
use Proengsoft\JsValidation\Support\AccessProtectedTrait;
use Proengsoft\JsValidation\Support\RuleListTrait;

class Validator
{
    use AccessProtectedTrait;
    use RuleListTrait;

    /**
     * Validator extension name.
     */
    const EXTENSION_NAME = 'jsvalidation';

    /**
     * @var \Illuminate\Validation\Validator
     */
    protected $validator;

    /**
     * Whether to escape validation messages.
     *
     * @var bool
     */
    protected $escape;

    /**
     * RemoteValidator constructor.
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @param  bool  $escape
     */
    public function __construct(BaseValidator $validator, $escape = false)
    {
        $this->validator = $validator;
        $this->escape = $escape;
    }

    /**
     * Validate request.
     *
     * @param  $field
     * @param  $parameters
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function validate($field, $parameters = [])
    {
        $attribute = $this->parseAttributeName($field);
        $validationParams = $this->parseParameters($parameters);
        $validationResult = $this->validateJsRemoteRequest($attribute, $validationParams);

        $this->throwValidationException($validationResult, $this->validator);
    }

    /**
     * Throw the failed validation exception.
     *
     * @param  mixed  $result
     * @param  \Illuminate\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException|\Illuminate\Http\Exceptions\HttpResponseException
     */
    protected function throwValidationException($result, $validator)
    {
        $response = new JsonResponse($result, 200);

        if ($result !== true && class_exists(ValidationException::class)) {
            throw new ValidationException($validator, $response);
        }

        throw new HttpResponseException($response);
    }

    /**
     *  Parse Validation input request data.
     *
     * @param  $data
     * @return array
     */
    protected function parseAttributeName($data)
    {
        parse_str($data, $attrParts);
        $attrParts = is_null($attrParts) ? [] : $attrParts;
        $newAttr = array_keys(Arr::dot($attrParts));

        return array_pop($newAttr);
    }

    /**
     *  Parse Validation parameters.
     *
     * @param  $parameters
     * @return array
     */
    protected function parseParameters($parameters)
    {
        $newParams = ['validate_all' => false];
        if (isset($parameters[0])) {
            $newParams['validate_all'] = ($parameters[0] === 'true') ? true : false;
        }

        return $newParams;
    }

    /**
     * Validate remote Javascript Validations.
     *
     * @param  $attribute
     * @param  array  $parameters
     * @return array|bool
     */
    protected function validateJsRemoteRequest($attribute, $parameters)
    {
        $this->setRemoteValidation($attribute, $parameters['validate_all']);

        $validator = $this->validator;
        if ($validator->passes()) {
            return true;
        }

        $messages = $validator->messages()->get($attribute);

        if ($this->escape) {
            foreach ($messages as $key => $value) {
                $messages[$key] = e($value);
            }
        }

        return $messages;
    }

    /**
     * Sets data for validate remote rules.
     *
     * @param  $attribute
     * @param  bool  $validateAll
     * @return void
     */
    protected function setRemoteValidation($attribute, $validateAll = false)
    {
        $validator = $this->validator;
        $rules = $validator->getRules();
        $rules = isset($rules[$attribute]) ? $rules[$attribute] : [];
        if (in_array('no_js_validation', $rules)) {
            $validator->setRules([$attribute => []]);

            return;
        }
        if (! $validateAll) {
            $rules = $this->purgeNonRemoteRules($rules, $validator);
        }
        $validator->setRules([$attribute => $rules]);
    }

    /**
     * Remove rules that should not be validated remotely.
     *
     * @param  $rules
     * @param  BaseValidator  $validator
     * @return mixed
     */
    protected function purgeNonRemoteRules($rules, $validator)
    {
        $protectedValidator = $this->createProtectedCaller($validator);

        foreach ($rules as $i => $rule) {
            $parsedRule = ValidationRuleParser::parse($rule);
            if (! $this->isRemoteRule($parsedRule[0])) {
                unset($rules[$i]);
            }
        }

        return $rules;
    }
}
laravel-jsvalidation/src/Remote/FormRequest.php000064400000003430152434177750015705 0ustar00<?php

namespace Proengsoft\JsValidation\Remote;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest as Request;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Illuminate\Validation\ValidationException;

class FormRequest extends Request
{
    /**
     * Field to identify requests originating from this library.
     */
    const JS_VALIDATION_FIELD = '__proengsoft_form_request';

    /**
     * Validate the class instance.
     *
     * @return void
     */
    public function validateResolved()
    {
        parent::validateResolved();

        // BC for Laravel versions prior to 6.x.
        $this->passedValidation();
    }

    /**
     * Handle a passed validation attempt.
     *
     * @return void
     */
    protected function passedValidation()
    {
        if ($this->isJsValidation()) {
            throw new HttpResponseException(
                new JsonResponse(true, 200)
            );
        }

        parent::passedValidation();
    }

    /**
     * Handle a failed validation attempt.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(Validator $validator)
    {
        if ($this->isJsValidation()) {
            throw new ValidationException(
                $validator,
                new JsonResponse($validator->errors()->messages(), 200)
            );
        }

        parent::failedValidation($validator);
    }

    /**
     * Whether the request originated from laravel-jsvalidation.
     *
     * @return bool
     */
    private function isJsValidation()
    {
        return $this->has(static::JS_VALIDATION_FIELD);
    }
}
laravel-jsvalidation/src/Javascript/JavascriptValidator.php000064400000012270152434177750020262 0ustar00<?php

namespace Proengsoft\JsValidation\Javascript;

use Exception;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Support\Facades\View;
use Proengsoft\JsValidation\Exceptions\PropertyNotFoundException;

class JavascriptValidator implements Arrayable
{
    /**
     * Registered validator instance.
     *
     * @var ValidatorHandler
     */
    protected $validator;

    /**
     * Selector used in javascript generation.
     *
     * @var string
     */
    protected $selector;

    /**
     * View that renders Javascript.
     *
     * @var
     */
    protected $view;

    /**
     * Enable or disable remote validations.
     *
     * @var bool
     */
    protected $remote;

    /**
     * 'ignore' option for jQuery Validation Plugin.
     *
     * @var string
     */
    protected $ignore;

    /**
     * Constructor.
     *
     * @param  ValidatorHandler  $validator
     * @param  array  $options
     */
    public function __construct(ValidatorHandler $validator, $options = [])
    {
        $this->validator = $validator;
        $this->setDefaults($options);
    }

    /**
     * Set default parameters.
     *
     * @param  $options
     * @return void
     */
    protected function setDefaults($options)
    {
        $this->selector = empty($options['selector']) ? 'form' : $options['selector'];
        $this->view = empty($options['view']) ? 'jsvalidation::bootstrap' : $options['view'];
        $this->remote = isset($options['remote']) ? $options['remote'] : true;

        if (isset($options['ignore'])) {
            $this->ignore = $options['ignore'];
        }
    }

    /**
     * Render the specified view with validator data.
     *
     * @param  null|\Illuminate\Contracts\View\View|string  $view
     * @param  null|string  $selector
     * @return string
     */
    public function render($view = null, $selector = null)
    {
        $this->view($view);
        $this->selector($selector);

        return View::make($this->view, ['validator' => $this->getViewData()])
            ->render();
    }

    /**
     * Get the view data as an array.
     *
     * @return array
     */
    public function toArray()
    {
        return $this->getViewData();
    }

    /**
     * Get the string resulting of render default view.
     *
     * @return string
     */
    public function __toString()
    {
        try {
            return $this->render();
        } catch (Exception $exception) {
            return trigger_error($exception->__toString(), E_USER_ERROR);
        }
    }

    /**
     * Gets value from view data.
     *
     * @param  $name
     * @return string
     *
     * @throws \Proengsoft\JsValidation\Exceptions\PropertyNotFoundException
     */
    public function __get($name)
    {
        $data = $this->getViewData();
        if (! array_key_exists($name, $data)) {
            throw new PropertyNotFoundException($name, get_class());
        }

        return $data[$name];
    }

    /**
     * Gets view data.
     *
     * @return array
     */
    protected function getViewData()
    {
        $this->validator->setRemote($this->remote);
        $data = $this->validator->validationData();
        $data['selector'] = $this->selector;

        if (! is_null($this->ignore)) {
            $data['ignore'] = $this->ignore;
        }

        return $data;
    }

    /**
     * Set the form selector to validate.
     *
     * @param  string  $selector
     *
     * @deprecated
     */
    public function setSelector($selector)
    {
        $this->selector = $selector;
    }

    /**
     * Set the form selector to validate.
     *
     * @param  string  $selector
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function selector($selector)
    {
        $this->selector = is_null($selector) ? $this->selector : $selector;

        return $this;
    }

    /**
     * Set the input selector to ignore for validation.
     *
     * @param  string  $ignore
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function ignore($ignore)
    {
        $this->ignore = $ignore;

        return $this;
    }

    /**
     * Set the view to render Javascript Validations.
     *
     * @param  null|\Illuminate\Contracts\View\View|string  $view
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function view($view)
    {
        $this->view = is_null($view) ? $this->view : $view;

        return $this;
    }

    /**
     * Enables or disables remote validations.
     *
     * @param  null|bool  $enabled
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function remote($enabled = true)
    {
        $this->remote = $enabled;

        return $this;
    }

    /**
     * Validate Conditional Validations using Ajax in specified fields.
     *
     * @param  string  $attribute
     * @param  string|array  $rules
     * @param  null  $callback  Dummy attribute to make API seamless with Laravel sometimes()
     * @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
     */
    public function sometimes($attribute, $rules, $callback = null)
    {
        $this->validator->sometimes($attribute, $rules);

        return $this;
    }
}
laravel-jsvalidation/src/Javascript/JavascriptRulesTrait.php000064400000012431152434177750020432 0ustar00<?php

namespace Proengsoft\JsValidation\Javascript;

trait JavascriptRulesTrait
{
    /**
     * Handles multidimensional attribute names.
     *
     * @param  string  $attribute
     * @return string
     */
    abstract protected function getAttributeName($attribute);

    /**
     * Parse named parameters to $key => $value items.
     *
     * @param  array  $parameters
     * @return array
     */
    abstract public function parseNamedParameters($parameters);

    /**
     * Confirmed rule is applied to confirmed attribute.
     *
     * @param  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleConfirmed($attribute, array $parameters)
    {
        $parameters[0] = $this->getAttributeName($attribute);
        $attribute = "{$attribute}_confirmation";

        return [$attribute, $parameters];
    }

    /**
     * Returns Javascript parameters for After rule.
     *
     * @param  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleAfter($attribute, array $parameters)
    {
        if (! ($date = strtotime($parameters[0]))) {
            $date = $this->getAttributeName($parameters[0]);
        }

        return [$attribute, [$date]];
    }

    /**
     * Returns Javascript parameters for Before rule.
     *
     * @param  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleBefore($attribute, array $parameters)
    {
        return $this->ruleAfter($attribute, $parameters);
    }

    /**
     * Validate that two attributes match.
     *
     * @param  string  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleSame($attribute, array $parameters)
    {
        $other = $this->getAttributeName($parameters[0]);

        return [$attribute, [$other]];
    }

    /**
     * Validate that an attribute is different from another attribute.
     *
     * @param  string  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleDifferent($attribute, array $parameters)
    {
        return $this->ruleSame($attribute, $parameters);
    }

    /**
     * Validate that an attribute exists when any other attribute exists.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleRequiredWith($attribute, array $parameters)
    {
        $parameters = array_map([$this, 'getAttributeName'], $parameters);

        return [$attribute, $parameters];
    }

    /**
     * Validate that an attribute exists when all other attributes exists.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleRequiredWithAll($attribute, array $parameters)
    {
        return $this->ruleRequiredWith($attribute, $parameters);
    }

    /**
     * Validate that an attribute exists when another attribute does not.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleRequiredWithout($attribute, array $parameters)
    {
        return $this->ruleRequiredWith($attribute, $parameters);
    }

    /**
     * Validate that an attribute exists when all other attributes do not.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleRequiredWithoutAll($attribute, array $parameters)
    {
        return $this->ruleRequiredWith($attribute, $parameters);
    }

    /**
     * Validate that an attribute exists when another attribute has a given value.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleRequiredIf($attribute, array $parameters)
    {
        $parameters[0] = $this->getAttributeName($parameters[0]);

        return [$attribute, $parameters];
    }

    /**
     * Validate that an attribute exists when another attribute does not have a given value.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleRequiredUnless($attribute, array $parameters)
    {
        return $this->ruleRequiredIf($attribute, $parameters);
    }

    /**
     * Validate that the values of an attribute is in another attribute.
     *
     * @param  string  $attribute
     * @param  mixed  $parameters
     * @return array
     */
    protected function ruleInArray($attribute, array $parameters)
    {
        return $this->ruleRequiredIf($attribute, $parameters);
    }

    /**
     * Validate the dimensions of an image matches the given values.
     *
     * @param  string  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleDimensions($attribute, $parameters)
    {
        $parameters = $this->parseNamedParameters($parameters);

        return [$attribute, $parameters];
    }

    /**
     * Validate an attribute is unique among other values.
     *
     * @param  string  $attribute
     * @param  array  $parameters
     * @return array
     */
    protected function ruleDistinct($attribute, array $parameters)
    {
        $parameters[0] = $attribute;

        return $this->ruleRequiredIf($attribute, $parameters);
    }
}
laravel-jsvalidation/src/Javascript/ValidatorHandler.php000064400000010525152434177750017532 0ustar00<?php

namespace Proengsoft\JsValidation\Javascript;

use Proengsoft\JsValidation\Support\DelegatedValidator;
use Proengsoft\JsValidation\Support\UseDelegatedValidatorTrait;

class ValidatorHandler
{
    use UseDelegatedValidatorTrait;

    /**
     * Rule used to disable validations.
     *
     * @const string
     */
    const JSVALIDATION_DISABLE = 'NoJsValidation';

    /**
     * @var RuleParser
     */
    protected $rules;
    /**
     * @var MessageParser
     */
    protected $messages;

    /**
     * @var bool
     */
    protected $remote = true;

    /**
     * Create a new JsValidation instance.
     *
     * @param  RuleParser  $rules
     * @param  MessageParser  $messages
     */
    public function __construct(RuleParser $rules, MessageParser $messages)
    {
        $this->rules = $rules;
        $this->messages = $messages;
        $this->validator = $rules->getDelegatedValidator();
    }

    /**
     * Sets delegated Validator instance.
     *
     * @param  \Proengsoft\JsValidation\Support\DelegatedValidator  $validator
     * @return void
     */
    public function setDelegatedValidator(DelegatedValidator $validator)
    {
        $this->validator = $validator;
        $this->rules->setDelegatedValidator($validator);
        $this->messages->setDelegatedValidator($validator);
    }

    /**
     * Enable or disables remote validations.
     *
     * @param  bool  $enabled
     * @return void
     */
    public function setRemote($enabled)
    {
        $this->remote = $enabled;
    }

    /**
     * Generate Javascript Validations.
     *
     * @return array
     */
    protected function generateJavascriptValidations()
    {
        $jsValidations = [];

        foreach ($this->validator->getRules() as $attribute => $rules) {
            if (! $this->jsValidationEnabled($attribute)) {
                continue;
            }

            $newRules = $this->jsConvertRules($attribute, $rules, $this->remote);
            $jsValidations = array_merge($jsValidations, $newRules);
        }

        return $jsValidations;
    }

    /**
     * Make Laravel Validations compatible with JQuery Validation Plugin.
     *
     * @param  $attribute
     * @param  $rules
     * @param  bool  $includeRemote
     * @return array
     */
    protected function jsConvertRules($attribute, $rules, $includeRemote)
    {
        $jsRules = [];
        foreach ($rules as $rawRule) {
            [$rule, $parameters] = $this->validator->parseRule($rawRule);
            [$jsAttribute, $jsRule, $jsParams] = $this->rules->getRule($attribute, $rule, $parameters, $rawRule);
            if ($this->isValidatable($jsRule, $includeRemote)) {
                $jsRules[$jsAttribute][$jsRule][] = [
                    $rule,
                    $jsParams,
                    $this->messages->getMessage($attribute, $rule, $parameters),
                    $this->validator->isImplicit($rule),
                    $jsAttribute,
                ];
            }
        }

        return $jsRules;
    }

    /**
     * Check if rule should be validated with javascript.
     *
     * @param  $jsRule
     * @param  bool  $includeRemote
     * @return bool
     */
    protected function isValidatable($jsRule, $includeRemote)
    {
        return $jsRule && ($includeRemote || $jsRule !== RuleParser::REMOTE_RULE);
    }

    /**
     * Check if JS Validation is disabled for attribute.
     *
     * @param  $attribute
     * @return bool
     */
    public function jsValidationEnabled($attribute)
    {
        return ! $this->validator->hasRule($attribute, self::JSVALIDATION_DISABLE);
    }

    /**
     * Returns view data to render javascript.
     *
     * @return array
     */
    public function validationData()
    {
        $jsMessages = [];
        $jsValidations = $this->generateJavascriptValidations();

        return [
            'rules' => $jsValidations,
            'messages' => $jsMessages,
        ];
    }

    /**
     * Validate Conditional Validations using Ajax in specified fields.
     *
     * @param  string  $attribute
     * @param  string|array  $rules
     * @return void
     */
    public function sometimes($attribute, $rules = [])
    {
        $callback = function () {
            return true;
        };
        $this->validator->sometimes($attribute, $rules, $callback);
        $this->rules->addConditionalRules($attribute, (array) $rules);
    }
}
laravel-jsvalidation/src/Javascript/MessageParser.php000064400000006073152434177750017053 0ustar00<?php

namespace Proengsoft\JsValidation\Javascript;

use Proengsoft\JsValidation\JsValidatorFactory;
use Proengsoft\JsValidation\Support\DelegatedValidator;
use Proengsoft\JsValidation\Support\UseDelegatedValidatorTrait;
use Symfony\Component\HttpFoundation\File\UploadedFile;

class MessageParser
{
    use UseDelegatedValidatorTrait;

    /**
     * Whether to escape messages using htmlentities.
     *
     * @var bool
     */
    protected $escape;

    /**
     * Create a new JsValidation instance.
     *
     * @param  \Proengsoft\JsValidation\Support\DelegatedValidator  $validator
     * @param  bool  $escape
     */
    public function __construct(DelegatedValidator $validator, $escape = false)
    {
        $this->validator = $validator;
        $this->escape = $escape;
    }

    /**
     *  Replace javascript error message place-holders with actual values.
     *
     * @param  string  $attribute
     * @param  string  $rule
     * @param  array  $parameters
     * @return mixed
     */
    public function getMessage($attribute, $rule, $parameters)
    {
        $attribute = str_replace(JsValidatorFactory::ASTERISK, '*', $attribute);

        $data = $this->fakeValidationData($attribute, $rule, $parameters);

        $message = $this->validator->getMessage($attribute, $rule);
        $message = $this->validator->makeReplacements($message, $attribute, $rule, $parameters);

        $this->validator->setData($data);

        return $this->escape ? e($message) : $message;
    }

    /**
     * Creates fake data needed to parse messages
     * Returns original data.
     *
     * @param  string  $attribute
     * @param  string  $rule
     * @param  $parameters
     * @return array
     */
    protected function fakeValidationData($attribute, $rule, $parameters)
    {
        $data = $this->validator->getData();

        $this->fakeFileData($data, $attribute);
        $this->fakeRequiredIfData($data, $rule, $parameters);

        return $data;
    }

    /**
     * Generate fake data to get RequiredIf message.
     *
     * @param  $data
     * @param  $rule
     * @param  $parameters
     * @return void
     */
    private function fakeRequiredIfData($data, $rule, $parameters)
    {
        if ($rule !== 'RequiredIf') {
            return;
        }

        $newData = $data;
        $newData[$parameters[0]] = $parameters[1];
        $this->validator->setData($newData);
    }

    /**
     * Generate fake data to get file type messages.
     *
     * @param  $data
     * @param  $attribute
     * @return void
     */
    private function fakeFileData($data, $attribute)
    {
        if (! $this->validator->hasRule($attribute, ['Mimes', 'Image'])) {
            return;
        }

        $newFiles = $data;
        $newFiles[$attribute] = $this->createUploadedFile();
        $this->validator->setData($newFiles);
    }

    /**
     * Create fake UploadedFile to generate file messages.
     *
     * @return UploadedFile
     */
    protected function createUploadedFile()
    {
        return new UploadedFile('fakefile', 'fakefile', null, UPLOAD_ERR_NO_FILE, true);
    }
}
laravel-jsvalidation/src/Javascript/RuleParser.php000064400000012373152434177750016376 0ustar00<?php

namespace Proengsoft\JsValidation\Javascript;

use Proengsoft\JsValidation\JsValidatorFactory;
use Proengsoft\JsValidation\Support\DelegatedValidator;
use Proengsoft\JsValidation\Support\RuleListTrait;
use Proengsoft\JsValidation\Support\UseDelegatedValidatorTrait;

class RuleParser
{
    use JavascriptRulesTrait;
    use RuleListTrait;
    use UseDelegatedValidatorTrait;

    /**
     * Dummy Laravel validation rule for form requests.
     */
    const FORM_REQUEST_RULE_NAME = 'ProengsoftFormRequest';

    /**
     * Js validation rule used to validate form requests.
     */
    const FORM_REQUEST_RULE = 'laravelValidationFormRequest';

    /**
     * Rule used to validate remote requests.
     */
    const REMOTE_RULE = 'laravelValidationRemote';

    /**
     * Rule used to validate javascript fields.
     */
    const JAVASCRIPT_RULE = 'laravelValidation';

    /**
     * Token used to secure romte validations.
     *
     * @var null|string
     */
    protected $remoteToken;

    /**
     * Conditional Validations.
     *
     * @var array
     */
    protected $conditional = [];

    /**
     * Create a new JsValidation instance.
     *
     * @param  \Proengsoft\JsValidation\Support\DelegatedValidator  $validator
     * @param  null|string  $remoteToken
     */
    public function __construct(DelegatedValidator $validator, $remoteToken = null)
    {
        $this->validator = $validator;
        $this->remoteToken = $remoteToken;
    }

    /**
     * Return parsed Javascript Rule.
     *
     * @param  string  $attribute
     * @param  string  $rule
     * @param  $parameters
     * @param  $rawRule
     * @return array
     */
    public function getRule($attribute, $rule, $parameters, $rawRule)
    {
        $isConditional = $this->isConditionalRule($attribute, $rawRule);
        $isRemote = $this->isRemoteRule($rule);
        $isFormRequest = $this->isFormRequestRule($rule);

        if ($isFormRequest || $isConditional || $isRemote) {
            [$attribute, $parameters] = $this->remoteRule($attribute, $isConditional);
            $jsRule = $isFormRequest ? static::FORM_REQUEST_RULE : static::REMOTE_RULE;
        } else {
            [$jsRule, $attribute, $parameters] = $this->clientRule($attribute, $rule, $parameters);
        }

        $attribute = $this->getAttributeName($attribute);

        return [$attribute, $jsRule, $parameters];
    }

    /**
     * Gets rules from Validator instance.
     *
     * @return array
     */
    public function getValidatorRules()
    {
        return $this->validator->getRules();
    }

    /**
     * Add conditional rules.
     *
     * @param  mixed  $attribute
     * @param  array  $rules
     * @return void
     */
    public function addConditionalRules($attribute, $rules = [])
    {
        foreach ((array) $attribute as $key) {
            $current = isset($this->conditional[$key]) ? $this->conditional[$key] : [];
            $merge = head($this->validator->explodeRules((array) $rules));
            $this->conditional[$key] = array_merge($current, $merge);
        }
    }

    /**
     * Determine if rule is passed with sometimes.
     *
     * @param  mixed  $attribute
     * @param  string  $rule
     * @return bool
     */
    protected function isConditionalRule($attribute, $rule)
    {
        return isset($this->conditional[$attribute])
            && in_array($rule, $this->conditional[$attribute]);
    }

    /**
     * Returns Javascript parameters for remote validated rules.
     *
     * @param  string  $attribute
     * @param  string  $rule
     * @param  $parameters
     * @return array
     */
    protected function clientRule($attribute, $rule, $parameters)
    {
        $jsRule = self::JAVASCRIPT_RULE;
        $method = "rule{$rule}";

        if (method_exists($this, $method)) {
            [$attribute, $parameters] = $this->$method($attribute, $parameters);
        }

        return [$jsRule, $attribute, $parameters];
    }

    /**
     * Returns Javascript parameters for remote validated rules.
     *
     * @param  string  $attribute
     * @param  bool  $forceRemote
     * @return array
     */
    protected function remoteRule($attribute, $forceRemote)
    {
        $attrHtmlName = $this->getAttributeName($attribute);
        $params = [
            $attrHtmlName,
            $this->remoteToken,
            $forceRemote,
        ];

        return [$attribute, $params];
    }

    /**
     * Handles multidimensional attribute names.
     *
     * @param  mixed  $attribute
     * @return string
     */
    protected function getAttributeName($attribute)
    {
        $attribute = str_replace(JsValidatorFactory::ASTERISK, '*', $attribute);

        $attributeArray = explode('.', $attribute);
        if (count($attributeArray) > 1) {
            return $attributeArray[0].'['.implode('][', array_slice($attributeArray, 1)).']';
        }

        return $attribute;
    }

    /**
     * Parse named parameters to $key => $value items.
     *
     * @param  array  $parameters
     * @return array
     */
    public function parseNamedParameters($parameters)
    {
        return array_reduce($parameters, function ($result, $item) {
            [$key, $value] = array_pad(explode('=', $item, 2), 2, null);

            $result[$key] = $value;

            return $result;
        });
    }
}
laravel-jsvalidation/src/Exceptions/PropertyNotFoundException.php000064400000000771152434177750021504 0ustar00<?php

namespace Proengsoft\JsValidation\Exceptions;

use Exception;

class PropertyNotFoundException extends Exception
{
    /**
     * Property Not Found Exception.
     *
     * @param  string  $property
     * @param  string  $caller
     * @param  \Exception  $previous
     */
    public function __construct($property = '', $caller = '', Exception $previous = null)
    {
        $message = "'$property' not found in '$caller'' object";
        parent::__construct($message, 0, $previous);
    }
}
laravel-jsvalidation/src/RemoteValidationMiddleware.php000064400000003626152434177750017451 0ustar00<?php

namespace Proengsoft\JsValidation;

use Closure;
use Illuminate\Contracts\Config\Repository as Config;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;
use Illuminate\Http\Request;
use Proengsoft\JsValidation\Remote\Resolver;
use Proengsoft\JsValidation\Remote\Validator as RemoteValidator;

class RemoteValidationMiddleware
{
    /**
     * Validator factory instance to wrap.
     *
     * @var \Illuminate\Contracts\Validation\Factory
     */
    protected $factory;

    /**
     * Field used to detect Javascript validation.
     *
     * @var mixed
     */
    protected $field;

    /**
     * Whether to escape messages or not.
     *
     * @var bool
     */
    protected $escape;

    /**
     * RemoteValidationMiddleware constructor.
     *
     * @param  \Illuminate\Contracts\Validation\Factory  $validator
     * @param  \Illuminate\Contracts\Config\Repository  $config
     */
    public function __construct(ValidationFactory $validator, Config $config)
    {
        $this->factory = $validator;
        $this->field = $config->get('jsvalidation.remote_validation_field');
        $this->escape = (bool) $config->get('jsvalidation.escape', false);
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->has($this->field)) {
            $this->wrapValidator();
        }

        return $next($request);
    }

    /**
     * Wraps Validator resolver with RemoteValidator resolver.
     *
     * @return void
     */
    protected function wrapValidator()
    {
        $resolver = new Resolver($this->factory, $this->escape);
        $this->factory->resolver($resolver->resolver($this->field));
        $this->factory->extend(RemoteValidator::EXTENSION_NAME, $resolver->validatorClosure());
    }
}
laravel-jsvalidation/public/js/jsvalidation.min.js.map000064400001412143152434177750017161 0ustar00{"version":3,"sources":["resources/assets/js/jsvalidation.js","node_modules/jquery-validation/dist/jquery.validate.js","node_modules/php-date-formatter/js/php-date-formatter.js","es-build/helpers.js","resources/assets/js/timezones.js","resources/assets/js/validations.js"],"names":["laravelValidation","factory","define","amd","module","exports","require","jQuery","$","extend","fn","validate","options","this","length","validator","data","attr","settings","onsubmit","on","event","submitButton","currentTarget","hasClass","cancelSubmit","undefined","handle","hidden","result","submitHandler","formSubmitted","name","val","appendTo","currentForm","debug","call","remove","preventDefault","form","pendingRequest","focusInvalid","window","console","warn","valid","errorList","is","each","element","concat","rules","command","argument","staticRules","existingRules","param","filtered","isContentEditable","closest","normalizeRule","messages","split","index","method","normalizeRules","classRules","attributeRules","dataRules","required","remote","trim","str","replace","called","expr","pseudos","blank","a","filled","unchecked","prop","defaults","init","format","source","params","arguments","args","makeArray","unshift","apply","constructor","Array","slice","i","n","RegExp","groups","errorClass","pendingClass","validClass","errorElement","focusCleanup","errorContainer","errorLabelContainer","ignore","ignoreTitle","onfocusin","lastActive","unhighlight","hideThese","errorsFor","onfocusout","checkable","submitted","optional","onkeyup","which","elementValue","inArray","keyCode","invalid","onclick","parentNode","highlight","type","findByName","addClass","removeClass","setDefaults","email","url","date","dateISO","number","digits","equalTo","maxlength","minlength","rangelength","range","max","min","step","autoCreateRanges","prototype","labelContainer","errorContext","containers","add","valueCache","pending","reset","delegate","eventType","key","value","invalidHandler","checkForm","errorMap","triggerHandler","showErrors","prepareForm","elements","currentElements","check","rs","group","cleanElement","clean","checkElement","validationTargetFor","v","prepareElement","testgroup","push","numberOfInvalids","toHide","errors","map","message","successList","grep","defaultShowErrors","resetForm","hideErrors","removeData","removeAttr","resetElements","objectLength","obj","count","not","text","addWrapper","hide","size","findLastActive","filter","trigger","e","rulesCache","find","error","selector","join","resetInternals","toShow","idx","$element","validity","badInput","substr","lastIndexOf","rule","normalizer","rulesCount","dependencyMismatch","abortRequest","parameters","methods","formatAndAdd","log","id","TypeError","customDataMessage","charAt","toUpperCase","substring","toLowerCase","customMessage","m","String","findDefined","defaultMessage","title","theregex","test","toToggle","wrapper","parent","showLabel","success","validElements","show","invalidElements","place","errorID","elementID","idOrName","describedBy","escapeHtml","html","wrap","append","errorPlacement","insertAfter","parents","escapeCssMeta","match","describer","string","getLength","nodeName","depend","dependTypes","boolean","function","elementAjaxPort","startRequest","stopRequest","port","ajaxAbort","previousValue","old","destroy","off","classRuleSettings","creditcard","addClassRules","className","classes","normalizeAttributeRule","Number","isNaN","getAttribute","depends","keepRule","parameter","parts","isArray","transformed","addMethod","Date","toString","decimalPlaces","num","toInt","Math","round","pow","decimals","errorMessage","re","Error","target","optionDataString","previous","originalMessage","ajax","mode","dataType","context","response","pendingRequests","ajaxPrefilter","_","xhr","ajaxSettings","abort","root","DateFormatter","self","$h","DAY","HOUR","dateSettings","days","daysShort","months","monthsShort","meridiem","ordinal","suffixes","1","2","3","floor","separators","validParts","intParts","tzParts","tzClip","getInt","radix","parseInt","compare","str1","str2","lpad","chr","merge","out","hasOwnProperty","getIndex","arr","config","getMonth","parseDate","vDate","vFormat","vFormatParts","vDateParts","vDatePart","iDatePart","vMonth","vMeriIndex","vMeriOffset","len","mer","vDateFlag","vTimeFlag","vSettings","year","month","day","hour","sec","splice","indexOf","varY","varM","varD","guessDate","vDateStr","vYear","iPart","iSec","vParts","vDigit","setMonth","setDate","getFullYear","setFullYear","setHours","setMinutes","setSeconds","parseFormat","vChar","doFormat","t","s","fmt","backslash","d","j","D","w","getDate","l","N","getDay","z","Y","b","W","F","M","L","o","y","A","G","B","H","getUTCHours","getUTCMinutes","getUTCSeconds","g","getHours","h","getMinutes","getSeconds","u","getMilliseconds","exec","I","UTC","O","tzo","getTimezoneOffset","abs","P","T","pop","Z","c","r","U","getTime","formatDate","implicitRules","arrayRules","arrayRulesCache","setupValidations","cache","tmpRules","nameRegExp","newRules","helpers","mergeRules","regexFromWildcard","formMethod","ajaxOpts","beforeSend","token","setRequestHeader","validateLocalRules","values","validated","implicit","laravelValidationRemote","isArrayRule","localRulesResult","arrayValue","arrayRulesResult","arrayEquals","serializeArray","always","textStatus","parseErrorResponse","JSON","stringify","fieldName","errorMessages","encode","isEmptyObject","__webpack_modules__","./node_modules/locutus/php/array/array_diff.js","arr1","retArr","argl","k1","k","arr1keys","./node_modules/locutus/php/datetime/strtotime.js","reSpace","reSpaceOpt","reMeridian","reHour24","reHour24lz","reHour12","reMinute","reMinutelz","reSecond","reSecondlz","reFrac","reDayfull","reDayabbr","reDaytext","reReltextnumber","reReltexttext","reReltextunit","reYear","reYear4","reMonth","reMonthlz","reDay","reDaylz","reMonthFull","reMonthAbbr","reMonthText","reTzCorrection","reDateNoYear","processMeridian","meridian","processYear","yearStr","lookupMonth","monthStr","jan","january","feb","february","ii","mar","march","iii","apr","april","iv","may","jun","june","vi","jul","july","vii","aug","august","viii","sep","sept","september","ix","oct","october","x","nov","november","xi","dec","december","xii","lookupWeekday","dayStr","desiredSundayNumber","mon","monday","tue","tuesday","wed","wednesday","thu","thursday","fri","friday","sat","saturday","sun","sunday","processTzCorrection","tzOffset","oldValue","sign","hours","minutes","tzAbbrOffsets","acdt","acst","addt","adt","aedt","aest","ahdt","ahst","akdt","akst","amt","apt","ast","awdt","awst","awt","bdst","bdt","bmt","bst","cast","cat","cddt","cdt","cemt","cest","cet","cmt","cpt","cst","cwt","chst","dmt","eat","eddt","edt","eest","eet","emt","ept","est","ewt","ffmt","gdt","gmt","gst","hdt","hkst","hkt","hmt","hpt","hst","hwt","iddt","idt","imt","ist","jdt","jmt","jst","kdt","kmt","kst","lst","mddt","mdst","mdt","mest","met","mmt","mpt","msd","msk","mst","mwt","nddt","ndt","npt","nst","nwt","nzdt","nzmt","nzst","pddt","pdt","pkst","pkt","plmt","pmt","ppmt","ppt","pst","pwt","qmt","rmt","sast","sdmt","sjmt","smt","sst","tbmt","tmt","uct","utc","wast","wat","wemt","west","wet","wib","wita","wit","wmt","yddt","ydt","ypt","yst","ywt","f","p","q","formats","yesterday","regex","callback","rd","resetTime","now","noon","time","midnightOrToday","tomorrow","timestamp","dates","zone","firstOrLastDay","firstOrLastDayOfMonth","backOrFrontOf","side","minute","weekdayOf","mssqltime","second","frac","timeLong12","timeShort12","timeTiny12","soap","tzCorrection","ymd","wddx","exif","xmlRpc","xmlRpcNoColon","clf","iso8601long","dateTextual","pointedDate4","pointedDate2","timeLong24","dateNoColon","pgydotd","timeShort24","iso8601noColon","iso8601dateSlash","dateSlash","american","americanShort","gnuDateShortOrIso8601date2","iso8601date4","gnuNoColon","times","gnuDateShorter","pgTextReverse","dateFull","dateNoDay","dateNoDayRev","pgTextShort","dateNoYear","dateNoYearRev","isoWeekDay","week","dayOfWeek","relativeText","relValue","relUnit","relTextLower","_lookupRelative","amount","last","first","next","third","fourth","fifth","sixth","seventh","eight","eighth","ninth","tenth","eleventh","twelfth","behavior","ri","rh","rm","ry","weekday","weekdayBehavior","relative","signs","minuses","dayText","relativeTextWeek","relText","monthFullOrMonthAbbr","tzAbbr","abbr","offset","ago","rf","year4","whitespace","dateShortWithTimeLong","dateShortWithTimeLong12","dateShortWithTimeShort","dateShortWithTimeShort12","resultProto","NaN","zones","toDate","relativeTo","dow","diff","setUTCFullYear","setUTCHours","Object","create","longestMatch","finalRule","./node_modules/locutus/php/info/ini_get.js","__unused_webpack_exports","__webpack_require__","varname","$global","$locutus","php","ini","local_value","./node_modules/locutus/php/strings/strlen.js","lgth","prev","code","charCodeAt","getWholeChar","./node_modules/locutus/php/var/is_numeric.js","mixedVar","__webpack_module_cache__","moduleId","cachedModule","getter","__esModule","definition","defineProperty","enumerable","get","globalThis","Function","Symbol","toStringTag","__webpack_exports__","locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__","locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default","locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__","locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default","locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__","locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default","locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__","locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default","numericRules","fileinfo","fieldObj","FileName","files","file","extension","names","hasNumericRules","hasRules","found","listRules","arrayRule","objRules","_rules","strlen","getSize","is_numeric","parseFloat","getLaravelValidation","parseTime","dateRule","timeValue","strtotime","compareDates","operator","timeCompare","dependentElement","mixed_var","arg","arrayDiff","arr2","ruleName","el","tagName","errorMsg","newResponse","responseText","escapeRegExp","nameParts","rulesList","findByArrayName","sqName","lookups","elem","reconstructed","allElementValues","isTimezone","timezones","africa","america","antarctica","arctic","asia","atlantic","australia","europe","indian","pacific","tzparts","continent","city","jsRemoteTimer","Sometimes","Bail","Nullable","Filled","Required","RequiredWith","currentObject","RequiredWithAll","RequiredWithout","RequiredWithoutAll","RequiredIf","RequiredUnless","Confirmed","Same","InArray","equals","targetName","Distinct","Different","Accepted","Boolean","Integer","Numeric","Digits","DigitsBetween","Size","Between","Min","Max","In","keys","NotIn","Ip","Email","Url","File","FileReader","FileList","Blob","Mimes","lowerParams","item","Mimetypes","Image","Dimensions","fr","onload","img","height","naturalHeight","width","naturalWidth","ratio","notValid","eval","onerror","src","readAsDataURL","Alpha","AlphaNum","AlphaDash","Regex","invalidModifiers","phpReg","matches","php_modifiers","DateFormat","Before","BeforeOrEqual","After","AfterOrEqual","Timezone","Json","parse","ProengsoftNoop"],"mappings":"AASA,IAAAA,mBCDA,SAAAC,GACA,mBAAAC,QAAAA,OAAAC,IACAD,OAAA,CAAA,UAAAD,GACA,iBAAAG,QAAAA,OAAAC,QACAD,OAAAC,QAAAJ,EAAAK,QAAA,WAEAL,EAAAM,QANA,CAQA,SAAAC,GAEAA,EAAAC,OAAAD,EAAAE,GAAA,CAGAC,SAAA,SAAAC,GAGA,GAAAC,KAAAC,OAAA,CAQA,IAAAC,EAAAP,EAAAQ,KAAAH,KAAA,GAAA,aACA,OAAAE,EACAA,GAIAF,KAAAI,KAAA,aAAA,cAEAF,EAAA,IAAAP,EAAAO,UAAAH,EAAAC,KAAA,IACAL,EAAAQ,KAAAH,KAAA,GAAA,YAAAE,GAEAA,EAAAG,SAAAC,WAEAN,KAAAO,GAAA,iBAAA,UAAA,SAAAC,GAIAN,EAAAO,aAAAD,EAAAE,cAGAf,EAAAK,MAAAW,SAAA,YACAT,EAAAU,cAAA,QAIAC,IAAAlB,EAAAK,MAAAI,KAAA,oBACAF,EAAAU,cAAA,KAKAZ,KAAAO,GAAA,kBAAA,SAAAC,GAOA,SAAAM,IACA,IAAAC,EAAAC,EAcA,OAPAd,EAAAO,eAAAP,EAAAG,SAAAY,eAAAf,EAAAgB,iBACAH,EAAApB,EAAA,0BACAS,KAAA,OAAAF,EAAAO,aAAAU,MACAC,IAAAzB,EAAAO,EAAAO,cAAAW,OACAC,SAAAnB,EAAAoB,gBAGApB,EAAAG,SAAAY,gBAAAf,EAAAG,SAAAkB,SACAP,EAAAd,EAAAG,SAAAY,cAAAO,KAAAtB,EAAAA,EAAAoB,YAAAd,GACAO,GAGAA,EAAAU,cAEAZ,IAAAG,GACAA,GAQA,OArCAd,EAAAG,SAAAkB,OAGAf,EAAAkB,iBAkCAxB,EAAAU,cACAV,EAAAU,cAAA,EACAE,KAEAZ,EAAAyB,OACAzB,EAAA0B,iBACA1B,EAAAgB,eAAA,GAGAJ,KAEAZ,EAAA2B,gBACA,MAKA3B,GA7FAH,GAAAA,EAAAwB,OAAAO,OAAAC,SACAA,QAAAC,KAAA,yDAgGAC,MAAA,WACA,IAAAA,EAAA/B,EAAAgC,EAgBA,OAdAvC,EAAAK,KAAA,IAAAmC,GAAA,QACAF,EAAAjC,KAAAF,WAAA6B,QAEAO,EAAA,GACAD,GAAA,EACA/B,EAAAP,EAAAK,KAAA,GAAA2B,MAAA7B,WACAE,KAAAoC,KAAA,YACAH,EAAA/B,EAAAmC,QAAArC,OAAAiC,KAEAC,EAAAA,EAAAI,OAAApC,EAAAgC,cAGAhC,EAAAgC,UAAAA,GAEAD,GAIAM,MAAA,SAAAC,EAAAC,GACA,IAEApC,EAAAqC,EAAAC,EAAAxC,EAAAyC,EAAAC,EAFAR,EAAArC,KAAA,GACA8C,OAAA,IAAA9C,KAAAI,KAAA,oBAAA,UAAAJ,KAAAI,KAAA,mBAIA,GAAA,MAAAiC,KAIAA,EAAAV,MAAAmB,IACAT,EAAAV,KAAA3B,KAAA+C,QAAA,QAAA,GACAV,EAAAlB,KAAAnB,KAAAI,KAAA,SAGA,MAAAiC,EAAAV,MAAA,CAIA,GAAAa,EAIA,OAFAE,GADArC,EAAAV,EAAAQ,KAAAkC,EAAAV,KAAA,aAAAtB,UACAkC,MACAI,EAAAhD,EAAAO,UAAAwC,YAAAL,GACAG,GACA,IAAA,MACA7C,EAAAC,OAAA+C,EAAAhD,EAAAO,UAAA8C,cAAAP,WAGAE,EAAAM,SACAP,EAAAL,EAAAlB,MAAAwB,EACAF,EAAAQ,WACA5C,EAAA4C,SAAAZ,EAAAlB,MAAAxB,EAAAC,OAAAS,EAAA4C,SAAAZ,EAAAlB,MAAAsB,EAAAQ,WAEA,MACA,IAAA,SACA,OAAAR,GAIAI,EAAA,GACAlD,EAAAyC,KAAAK,EAAAS,MAAA,MAAA,SAAAC,EAAAC,GACAP,EAAAO,GAAAT,EAAAS,UACAT,EAAAS,KAEAP,WARAH,EAAAL,EAAAlB,MACAwB,GAkCA,OAvBAxC,EAAAR,EAAAO,UAAAmD,eACA1D,EAAAC,OACA,GACAD,EAAAO,UAAAoD,WAAAjB,GACA1C,EAAAO,UAAAqD,eAAAlB,GACA1C,EAAAO,UAAAsD,UAAAnB,GACA1C,EAAAO,UAAAwC,YAAAL,IACAA,IAGAoB,WACAb,EAAAzC,EAAAsD,gBACAtD,EAAAsD,SACAtD,EAAAR,EAAAC,OAAA,CAAA6D,SAAAb,GAAAzC,IAIAA,EAAAuD,SACAd,EAAAzC,EAAAuD,cACAvD,EAAAuD,OACAvD,EAAAR,EAAAC,OAAAO,EAAA,CAAAuD,OAAAd,KAGAzC,MAKA,SAAAwD,EAAAC,GAGA,OAAAA,EAAAC,QAAA,qCAAA,IAHA,IAyuCAC,EAluCAnE,EAAAC,OAAAD,EAAAoE,KAAAC,SAAArE,EAAAoE,KAAA,KAAA,CAGAE,MAAA,SAAAC,GACA,OAAAP,EAAA,GAAAhE,EAAAuE,GAAA9C,QAIA+C,OAAA,SAAAD,GACA,IAAA9C,EAAAzB,EAAAuE,GAAA9C,MACA,OAAA,OAAAA,KAAAuC,EAAA,GAAAvC,IAIAgD,UAAA,SAAAF,GACA,OAAAvE,EAAAuE,GAAAG,KAAA,cAKA1E,EAAAO,UAAA,SAAAH,EAAA4B,GACA3B,KAAAK,SAAAV,EAAAC,QAAA,EAAA,GAAAD,EAAAO,UAAAoE,SAAAvE,GACAC,KAAAsB,YAAAK,EACA3B,KAAAuE,QAIA5E,EAAAO,UAAAsE,OAAA,SAAAC,EAAAC,GACA,OAAA,IAAAC,UAAA1E,OACA,WACA,IAAA2E,EAAAjF,EAAAkF,UAAAF,WAEA,OADAC,EAAAE,QAAAL,GACA9E,EAAAO,UAAAsE,OAAAO,MAAA/E,KAAA4E,UAGA/D,IAAA6D,IAGA,EAAAC,UAAA1E,QAAAyE,EAAAM,cAAAC,QACAP,EAAA/E,EAAAkF,UAAAF,WAAAO,MAAA,IAEAR,EAAAM,cAAAC,QACAP,EAAA,CAAAA,IAEA/E,EAAAyC,KAAAsC,EAAA,SAAAS,EAAAC,GACAX,EAAAA,EAAAZ,QAAA,IAAAwB,OAAA,MAAAF,EAAA,MAAA,KAAA,WACA,OAAAC,OAVAX,IAgBA9E,EAAAC,OAAAD,EAAAO,UAAA,CAEAoE,SAAA,CACArB,SAAA,GACAqC,OAAA,GACA/C,MAAA,GACAgD,WAAA,QACAC,aAAA,UACAC,WAAA,QACAC,aAAA,QACAC,cAAA,EACA9D,cAAA,EACA+D,eAAAjG,EAAA,IACAkG,oBAAAlG,EAAA,IACAW,UAAA,EACAwF,OAAA,UACAC,aAAA,EACAC,UAAA,SAAA3D,GACArC,KAAAiG,WAAA5D,EAGArC,KAAAK,SAAAsF,eACA3F,KAAAK,SAAA6F,aACAlG,KAAAK,SAAA6F,YAAA1E,KAAAxB,KAAAqC,EAAArC,KAAAK,SAAAkF,WAAAvF,KAAAK,SAAAoF,YAEAzF,KAAAmG,UAAAnG,KAAAoG,UAAA/D,MAGAgE,WAAA,SAAAhE,GACArC,KAAAsG,UAAAjE,MAAAA,EAAAlB,QAAAnB,KAAAuG,YAAAvG,KAAAwG,SAAAnE,IACArC,KAAAqC,QAAAA,IAGAoE,QAAA,SAAApE,EAAA7B,GAqBA,IAAAA,EAAAkG,OAAA,KAAA1G,KAAA2G,aAAAtE,KAAA,IAAA1C,EAAAiH,QAAApG,EAAAqG,QALA,CACA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,IAAA,QAKAxE,EAAAlB,QAAAnB,KAAAuG,WAAAlE,EAAAlB,QAAAnB,KAAA8G,UACA9G,KAAAqC,QAAAA,IAGA0E,QAAA,SAAA1E,GAGAA,EAAAlB,QAAAnB,KAAAuG,UACAvG,KAAAqC,QAAAA,GAGAA,EAAA2E,WAAA7F,QAAAnB,KAAAuG,WACAvG,KAAAqC,QAAAA,EAAA2E,aAGAC,UAAA,SAAA5E,EAAAkD,EAAAE,GACA,UAAApD,EAAA6E,KACAlH,KAAAmH,WAAA9E,EAAAlB,MAAAiG,SAAA7B,GAAA8B,YAAA5B,GAEA9F,EAAA0C,GAAA+E,SAAA7B,GAAA8B,YAAA5B,IAGAS,YAAA,SAAA7D,EAAAkD,EAAAE,GACA,UAAApD,EAAA6E,KACAlH,KAAAmH,WAAA9E,EAAAlB,MAAAkG,YAAA9B,GAAA6B,SAAA3B,GAEA9F,EAAA0C,GAAAgF,YAAA9B,GAAA6B,SAAA3B,KAMA6B,YAAA,SAAAjH,GACAV,EAAAC,OAAAD,EAAAO,UAAAoE,SAAAjE,IAGA4C,SAAA,CACAQ,SAAA,0BACAC,OAAA,yBACA6D,MAAA,sCACAC,IAAA,4BACAC,KAAA,6BACAC,QAAA,mCACAC,OAAA,+BACAC,OAAA,4BACAC,QAAA,qCACAC,UAAAnI,EAAAO,UAAAsE,OAAA,6CACAuD,UAAApI,EAAAO,UAAAsE,OAAA,yCACAwD,YAAArI,EAAAO,UAAAsE,OAAA,6DACAyD,MAAAtI,EAAAO,UAAAsE,OAAA,6CACA0D,IAAAvI,EAAAO,UAAAsE,OAAA,mDACA2D,IAAAxI,EAAAO,UAAAsE,OAAA,sDACA4D,KAAAzI,EAAAO,UAAAsE,OAAA,oCAGA6D,kBAAA,EAEAC,UAAA,CAEA/D,KAAA,WACAvE,KAAAuI,eAAA5I,EAAAK,KAAAK,SAAAwF,qBACA7F,KAAAwI,aAAAxI,KAAAuI,eAAAtI,QAAAD,KAAAuI,gBAAA5I,EAAAK,KAAAsB,aACAtB,KAAAyI,WAAA9I,EAAAK,KAAAK,SAAAuF,gBAAA8C,IAAA1I,KAAAK,SAAAwF,qBACA7F,KAAAuG,UAAA,GACAvG,KAAA2I,WAAA,GACA3I,KAAA4B,eAAA,EACA5B,KAAA4I,QAAA,GACA5I,KAAA8G,QAAA,GACA9G,KAAA6I,QAEA,IAEAtG,EAFAjB,EAAAtB,KAAAsB,YACAgE,EAAAtF,KAAAsF,OAAA,GAeA,SAAAwD,EAAAtI,GACA,IAcAN,EACA6I,EACA1I,EAhBAyC,OAAA,IAAAnD,EAAAK,MAAAI,KAAA,oBAAA,UAAAT,EAAAK,MAAAI,KAAA,oBAGAJ,KAAA2B,MAAAmB,IACA9C,KAAA2B,KAAAhC,EAAAK,MAAA+C,QAAA,QAAA,GACA/C,KAAAmB,KAAAxB,EAAAK,MAAAI,KAAA,SAKAkB,IAAAtB,KAAA2B,OAIAzB,EAAAP,EAAAQ,KAAAH,KAAA2B,KAAA,aACAoH,EAAA,KAAAvI,EAAA0G,KAAArD,QAAA,YAAA,KACAxD,EAAAH,EAAAG,UACA0I,KAAApJ,EAAAK,MAAAmC,GAAA9B,EAAAyF,SACAzF,EAAA0I,GAAAvH,KAAAtB,EAAAF,KAAAQ,IAhCAb,EAAAyC,KAAApC,KAAAK,SAAAiF,OAAA,SAAA0D,EAAAC,GACA,iBAAAA,IACAA,EAAAA,EAAA/F,MAAA,OAEAvD,EAAAyC,KAAA6G,EAAA,SAAA9F,EAAAhC,GACAmE,EAAAnE,GAAA6H,MAGAzG,EAAAvC,KAAAK,SAAAkC,MACA5C,EAAAyC,KAAAG,EAAA,SAAAyG,EAAAC,GACA1G,EAAAyG,GAAArJ,EAAAO,UAAA8C,cAAAiG,KA0BAtJ,EAAAK,KAAAsB,aACAf,GAAA,oDACA,0VAGAuI,GAIAvI,GAAA,iBAAA,oDAAAuI,GAEA9I,KAAAK,SAAA6I,gBACAvJ,EAAAK,KAAAsB,aAAAf,GAAA,wBAAAP,KAAAK,SAAA6I,iBAKAvH,KAAA,WAQA,OAPA3B,KAAAmJ,YACAxJ,EAAAC,OAAAI,KAAAuG,UAAAvG,KAAAoJ,UACApJ,KAAA8G,QAAAnH,EAAAC,OAAA,GAAAI,KAAAoJ,UACApJ,KAAAiC,SACAtC,EAAAK,KAAAsB,aAAA+H,eAAA,eAAA,CAAArJ,OAEAA,KAAAsJ,aACAtJ,KAAAiC,SAGAkH,UAAA,WACAnJ,KAAAuJ,cACA,IAAA,IAAApE,EAAA,EAAAqE,EAAAxJ,KAAAyJ,gBAAAzJ,KAAAwJ,WAAAA,EAAArE,GAAAA,IACAnF,KAAA0J,MAAAF,EAAArE,IAEA,OAAAnF,KAAAiC,SAIAI,QAAA,SAAAA,GACA,IAIAsH,EAAAC,EAJAC,EAAA7J,KAAA8J,MAAAzH,GACA0H,EAAA/J,KAAAgK,oBAAAH,GACAI,EAAAjK,KACAgB,GAAA,EA2CA,YAxCAH,IAAAkJ,SACA/J,KAAA8G,QAAA+C,EAAA1I,OAEAnB,KAAAkK,eAAAH,GACA/J,KAAAyJ,gBAAA9J,EAAAoK,IAIAH,EAAA5J,KAAAsF,OAAAyE,EAAA5I,QAEAxB,EAAAyC,KAAApC,KAAAsF,OAAA,SAAAnE,EAAAgJ,GACAA,IAAAP,GAAAzI,IAAA4I,EAAA5I,OACA0I,EAAAI,EAAAD,oBAAAC,EAAAH,MAAAG,EAAA9C,WAAAhG,OACA0I,EAAA1I,QAAA8I,EAAAnD,UACAmD,EAAAR,gBAAAW,KAAAP,GACA7I,EAAAiJ,EAAAP,MAAAG,IAAA7I,KAMA2I,GAAA,IAAA3J,KAAA0J,MAAAK,GACA/I,EAAAA,GAAA2I,EAEA3J,KAAA8G,QAAAiD,EAAA5I,OADAwI,EAMA3J,KAAAqK,qBAGArK,KAAAsK,OAAAtK,KAAAsK,OAAA5B,IAAA1I,KAAAyI,aAEAzI,KAAAsJ,aAGA3J,EAAA0C,GAAAjC,KAAA,gBAAAuJ,IAGA3I,GAIAsI,WAAA,SAAAiB,GACA,IACArK,EADAqK,IACArK,EAAAF,KAGAL,EAAAC,OAAAI,KAAAoJ,SAAAmB,GACAvK,KAAAkC,UAAAvC,EAAA6K,IAAAxK,KAAAoJ,SAAA,SAAAqB,EAAAtJ,GACA,MAAA,CACAsJ,QAAAA,EACApI,QAAAnC,EAAAiH,WAAAhG,GAAA,MAKAnB,KAAA0K,YAAA/K,EAAAgL,KAAA3K,KAAA0K,YAAA,SAAArI,GACA,QAAAA,EAAAlB,QAAAoJ,MAGAvK,KAAAK,SAAAiJ,WACAtJ,KAAAK,SAAAiJ,WAAA9H,KAAAxB,KAAAA,KAAAoJ,SAAApJ,KAAAkC,WAEAlC,KAAA4K,qBAKAC,UAAA,WACAlL,EAAAE,GAAAgL,WACAlL,EAAAK,KAAAsB,aAAAuJ,YAEA7K,KAAA8G,QAAA,GACA9G,KAAAuG,UAAA,GACAvG,KAAAuJ,cACAvJ,KAAA8K,aACA,IAAAtB,EAAAxJ,KAAAwJ,WACAuB,WAAA,iBACAC,WAAA,gBAEAhL,KAAAiL,cAAAzB,IAGAyB,cAAA,SAAAzB,GACA,IAAArE,EAEA,GAAAnF,KAAAK,SAAA6F,YACA,IAAAf,EAAA,EAAAqE,EAAArE,GAAAA,IACAnF,KAAAK,SAAA6F,YAAA1E,KAAAxB,KAAAwJ,EAAArE,GACAnF,KAAAK,SAAAkF,WAAA,IACAvF,KAAAmH,WAAAqC,EAAArE,GAAAhE,MAAAkG,YAAArH,KAAAK,SAAAoF,iBAGA+D,EACAnC,YAAArH,KAAAK,SAAAkF,YACA8B,YAAArH,KAAAK,SAAAoF,aAIA4E,iBAAA,WACA,OAAArK,KAAAkL,aAAAlL,KAAA8G,UAGAoE,aAAA,SAAAC,GAEA,IACAhG,EADAiG,EAAA,EAEA,IAAAjG,KAAAgG,OAIAtK,IAAAsK,EAAAhG,IAAA,OAAAgG,EAAAhG,KAAA,IAAAgG,EAAAhG,IACAiG,IAGA,OAAAA,GAGAN,WAAA,WACA9K,KAAAmG,UAAAnG,KAAAsK,SAGAnE,UAAA,SAAAoE,GACAA,EAAAc,IAAArL,KAAAyI,YAAA6C,KAAA,IACAtL,KAAAuL,WAAAhB,GAAAiB,QAGAvJ,MAAA,WACA,OAAA,IAAAjC,KAAAyL,QAGAA,KAAA,WACA,OAAAzL,KAAAkC,UAAAjC,QAGA4B,aAAA,WACA,GAAA7B,KAAAK,SAAAwB,aACA,IACAlC,EAAAK,KAAA0L,kBAAA1L,KAAAkC,UAAAjC,QAAAD,KAAAkC,UAAA,GAAAG,SAAA,IACAsJ,OAAA,YACAC,QAAA,SAGAA,QAAA,WACA,MAAAC,MAOAH,eAAA,WACA,IAAAzF,EAAAjG,KAAAiG,WACA,OAAAA,GAEA,IAFAtG,EAAAgL,KAAA3K,KAAAkC,UAAA,SAAAkD,GACA,OAAAA,EAAA/C,QAAAlB,OAAA8E,EAAA9E,OACAlB,QAAAgG,GAGAuD,SAAA,WACA,IAAAtJ,EAAAF,KACA8L,EAAA,GAGA,OAAAnM,EAAAK,KAAAsB,aACAyK,KAAA,8CACAV,IAAA,sCACAA,IAAArL,KAAAK,SAAAyF,QACA6F,OAAA,WACA,IAAAxK,EAAAnB,KAAAmB,MAAAxB,EAAAK,MAAAI,KAAA,QACA0C,OAAA,IAAAnD,EAAAK,MAAAI,KAAA,oBAAA,UAAAT,EAAAK,MAAAI,KAAA,mBAaA,OAXAe,GAAAjB,EAAAG,SAAAkB,OAAAO,OAAAC,SACAA,QAAAiK,MAAA,0BAAAhM,MAIA8C,IACA9C,KAAA2B,KAAAhC,EAAAK,MAAA+C,QAAA,QAAA,GACA/C,KAAAmB,KAAAA,GAIAnB,KAAA2B,OAAAzB,EAAAoB,gBAKAH,KAAA2K,IAAA5L,EAAAgL,aAAAvL,EAAAK,MAAAuC,YAIAuJ,EAAA3K,IAAA,OAKA2I,MAAA,SAAAmC,GACA,OAAAtM,EAAAsM,GAAA,IAGA1B,OAAA,WACA,IAAAhF,EAAAvF,KAAAK,SAAAkF,WAAArC,MAAA,KAAAgJ,KAAA,KACA,OAAAvM,EAAAK,KAAAK,SAAAqF,aAAA,IAAAH,EAAAvF,KAAAwI,eAGA2D,eAAA,WACAnM,KAAA0K,YAAA,GACA1K,KAAAkC,UAAA,GACAlC,KAAAoJ,SAAA,GACApJ,KAAAoM,OAAAzM,EAAA,IACAK,KAAAsK,OAAA3K,EAAA,KAGAkJ,MAAA,WACA7I,KAAAmM,iBACAnM,KAAAyJ,gBAAA9J,EAAA,KAGA4J,YAAA,WACAvJ,KAAA6I,QACA7I,KAAAsK,OAAAtK,KAAAuK,SAAA7B,IAAA1I,KAAAyI,aAGAyB,eAAA,SAAA7H,GACArC,KAAA6I,QACA7I,KAAAsK,OAAAtK,KAAAoG,UAAA/D,IAGAsE,aAAA,SAAAtE,GACA,IAGAjB,EAAAiL,EAHAC,EAAA3M,EAAA0C,GACA6E,EAAA7E,EAAA6E,KACApE,OAAA,IAAAwJ,EAAAlM,KAAA,oBAAA,UAAAkM,EAAAlM,KAAA,mBAGA,MAAA,UAAA8G,GAAA,aAAAA,EACAlH,KAAAmH,WAAA9E,EAAAlB,MAAAwK,OAAA,YAAAvK,MACA,WAAA8F,QAAA,IAAA7E,EAAAkK,SACAlK,EAAAkK,SAAAC,SAAA,MAAAF,EAAAlL,OAIAA,EADA0B,EACAwJ,EAAAhB,OAEAgB,EAAAlL,MAGA,SAAA8F,EAGA,mBAAA9F,EAAAqL,OAAA,EAAA,IACArL,EAAAqL,OAAA,IAMA,IADAJ,EAAAjL,EAAAsL,YAAA,OAOA,IADAL,EAAAjL,EAAAsL,YAAA,OAJAtL,EAAAqL,OAAAJ,EAAA,GAUAjL,EAGA,iBAAAA,EACAA,EAAAyC,QAAA,MAAA,IAEAzC,IAGAsI,MAAA,SAAArH,GACAA,EAAArC,KAAAgK,oBAAAhK,KAAA8J,MAAAzH,IAEA,IAMArB,EAAAoC,EAAAuJ,EAAAC,EANArK,EAAA5C,EAAA0C,GAAAE,QACAsK,EAAAlN,EAAA6K,IAAAjI,EAAA,SAAA6C,EAAAD,GACA,OAAAA,IACAlF,OACA6M,GAAA,EACA1L,EAAApB,KAAA2G,aAAAtE,GAwBA,IAAAe,KApBApD,KAAA+M,aAAA1K,GAIA,mBAAAE,EAAAqK,WACAA,EAAArK,EAAAqK,WACA,mBAAA5M,KAAAK,SAAAuM,aACAA,EAAA5M,KAAAK,SAAAuM,YAMAA,IACAxL,EAAAwL,EAAApL,KAAAa,EAAAjB,UAGAmB,EAAAqK,YAGArK,EAAA,CACAoK,EAAA,CAAAvJ,OAAAA,EAAA4J,WAAAzK,EAAAa,IACA,IAKA,GAAA,yBAJApC,EAAArB,EAAAO,UAAA+M,QAAA7J,GAAA5B,KAAAxB,KAAAoB,EAAAiB,EAAAsK,EAAAK,cAIA,IAAAH,EAAA,CACAC,GAAA,EACA,SAIA,GAFAA,GAAA,EAEA,YAAA9L,EAEA,YADAhB,KAAAsK,OAAAtK,KAAAsK,OAAAe,IAAArL,KAAAoG,UAAA/D,KAIA,IAAArB,EAEA,OADAhB,KAAAkN,aAAA7K,EAAAsK,IACA,EAEA,MAAAd,GAQA,MAPA7L,KAAAK,SAAAkB,OAAAO,OAAAC,SACAA,QAAAoL,IAAA,4CAAA9K,EAAA+K,GAAA,gBAAAT,EAAAvJ,OAAA,YAAAyI,GAEAA,aAAAwB,YACAxB,EAAApB,SAAA,+CAAApI,EAAA+K,GAAA,gBAAAT,EAAAvJ,OAAA,aAGAyI,GAGA,IAAAiB,EAMA,OAHA9M,KAAAkL,aAAA3I,IACAvC,KAAA0K,YAAAN,KAAA/H,IAEA,GAMAiL,kBAAA,SAAAjL,EAAAe,GACA,OAAAzD,EAAA0C,GAAAlC,KAAA,MAAAiD,EAAAmK,OAAA,GAAAC,cACApK,EAAAqK,UAAA,GAAAC,gBAAA/N,EAAA0C,GAAAlC,KAAA,QAIAwN,cAAA,SAAAxM,EAAAiC,GACA,IAAAwK,EAAA5N,KAAAK,SAAA4C,SAAA9B,GACA,OAAAyM,IAAAA,EAAA5I,cAAA6I,OAAAD,EAAAA,EAAAxK,KAIA0K,YAAA,WACA,IAAA,IAAA3I,EAAA,EAAAA,EAAAR,UAAA1E,OAAAkF,IACA,QAAAtE,IAAA8D,UAAAQ,GACA,OAAAR,UAAAQ,IAeA4I,eAAA,SAAA1L,EAAAsK,GACA,iBAAAA,IACAA,EAAA,CAAAvJ,OAAAuJ,IAGA,IAAAlC,EAAAzK,KAAA8N,YACA9N,KAAA2N,cAAAtL,EAAAlB,KAAAwL,EAAAvJ,QACApD,KAAAsN,kBAAAjL,EAAAsK,EAAAvJ,SAGApD,KAAAK,SAAA0F,aAAA1D,EAAA2L,YAAAnN,EACAlB,EAAAO,UAAA+C,SAAA0J,EAAAvJ,QACA,2CAAAf,EAAAlB,KAAA,aAEA8M,EAAA,gBAOA,MANA,mBAAAxD,EACAA,EAAAA,EAAAjJ,KAAAxB,KAAA2M,EAAAK,WAAA3K,GACA4L,EAAAC,KAAAzD,KACAA,EAAA9K,EAAAO,UAAAsE,OAAAiG,EAAA5G,QAAAoK,EAAA,QAAAtB,EAAAK,aAGAvC,GAGAyC,aAAA,SAAA7K,EAAAsK,GACA,IAAAlC,EAAAzK,KAAA+N,eAAA1L,EAAAsK,GAEA3M,KAAAkC,UAAAkI,KAAA,CACAK,QAAAA,EACApI,QAAAA,EACAe,OAAAuJ,EAAAvJ,SAGApD,KAAAoJ,SAAA/G,EAAAlB,MAAAsJ,EACAzK,KAAAuG,UAAAlE,EAAAlB,MAAAsJ,GAGAc,WAAA,SAAA4C,GAIA,OAHAnO,KAAAK,SAAA+N,UACAD,EAAAA,EAAAzF,IAAAyF,EAAAE,OAAArO,KAAAK,SAAA+N,WAEAD,GAGAvD,kBAAA,WAEA,IADA,IAAApB,EAAAwC,EACA7G,EAAA,EAAAnF,KAAAkC,UAAAiD,GAAAA,IACA6G,EAAAhM,KAAAkC,UAAAiD,GACAnF,KAAAK,SAAA4G,WACAjH,KAAAK,SAAA4G,UAAAzF,KAAAxB,KAAAgM,EAAA3J,QAAArC,KAAAK,SAAAkF,WAAAvF,KAAAK,SAAAoF,YAEAzF,KAAAsO,UAAAtC,EAAA3J,QAAA2J,EAAAvB,SAKA,GAHAzK,KAAAkC,UAAAjC,SACAD,KAAAoM,OAAApM,KAAAoM,OAAA1D,IAAA1I,KAAAyI,aAEAzI,KAAAK,SAAAkO,QACA,IAAApJ,EAAA,EAAAnF,KAAA0K,YAAAvF,GAAAA,IACAnF,KAAAsO,UAAAtO,KAAA0K,YAAAvF,IAGA,GAAAnF,KAAAK,SAAA6F,YACA,IAAAf,EAAA,EAAAqE,EAAAxJ,KAAAwO,gBAAAhF,EAAArE,GAAAA,IACAnF,KAAAK,SAAA6F,YAAA1E,KAAAxB,KAAAwJ,EAAArE,GAAAnF,KAAAK,SAAAkF,WAAAvF,KAAAK,SAAAoF,YAGAzF,KAAAsK,OAAAtK,KAAAsK,OAAAe,IAAArL,KAAAoM,QACApM,KAAA8K,aACA9K,KAAAuL,WAAAvL,KAAAoM,QAAAqC,QAGAD,cAAA,WACA,OAAAxO,KAAAyJ,gBAAA4B,IAAArL,KAAA0O,oBAGAA,gBAAA,WACA,OAAA/O,EAAAK,KAAAkC,WAAAsI,IAAA,WACA,OAAAxK,KAAAqC,WAIAiM,UAAA,SAAAjM,EAAAoI,GACA,IAAAkE,EAAA/E,EAAAgF,EAAA3E,EACA+B,EAAAhM,KAAAoG,UAAA/D,GACAwM,EAAA7O,KAAA8O,SAAAzM,GACA0M,EAAApP,EAAA0C,GAAAjC,KAAA,oBAEA4L,EAAA/L,QAGA+L,EAAA3E,YAAArH,KAAAK,SAAAoF,YAAA2B,SAAApH,KAAAK,SAAAkF,YAGAvF,KAAAK,UAAAL,KAAAK,SAAA2O,WACAhD,EAAAV,KAAAb,GAAA,IAEAuB,EAAAiD,KAAAxE,GAAA,MAKAuB,EAAArM,EAAA,IAAAK,KAAAK,SAAAqF,aAAA,KACAtF,KAAA,KAAAyO,EAAA,UACAzH,SAAApH,KAAAK,SAAAkF,YAEAvF,KAAAK,UAAAL,KAAAK,SAAA2O,WACAhD,EAAAV,KAAAb,GAAA,IAEAuB,EAAAiD,KAAAxE,GAAA,IAIAkE,EAAA3C,EACAhM,KAAAK,SAAA+N,UAIAO,EAAA3C,EAAAR,OAAAiD,OAAAS,KAAA,IAAAlP,KAAAK,SAAA+N,QAAA,MAAAC,UAEArO,KAAAuI,eAAAtI,OACAD,KAAAuI,eAAA4G,OAAAR,GACA3O,KAAAK,SAAA+O,eACApP,KAAAK,SAAA+O,eAAA5N,KAAAxB,KAAA2O,EAAAhP,EAAA0C,IAEAsM,EAAAU,YAAAhN,GAIA2J,EAAA7J,GAAA,SAGA6J,EAAA5L,KAAA,MAAAyO,GAIA,IAAA7C,EAAAsD,QAAA,cAAAtP,KAAAuP,cAAAV,GAAA,MAAA5O,SACA2O,EAAA5C,EAAA5L,KAAA,MAGA2O,EAEAA,EAAAS,MAAA,IAAAnK,OAAA,MAAArF,KAAAuP,cAAAX,GAAA,UAGAG,GAAA,IAAAH,GAJAG,EAAAH,EAMAjP,EAAA0C,GAAAjC,KAAA,mBAAA2O,IAGAnF,EAAA5J,KAAAsF,OAAAjD,EAAAlB,SAEA8I,EAAAjK,KACAL,EAAAyC,KAAA6H,EAAA3E,OAAA,SAAAnE,EAAAgJ,GACAA,IAAAP,GACAjK,EAAA,UAAAsK,EAAAsF,cAAApO,GAAA,KAAA8I,EAAA3I,aACAlB,KAAA,mBAAA4L,EAAA5L,KAAA,aAMAqK,GAAAzK,KAAAK,SAAAkO,UACAvC,EAAAV,KAAA,IACA,iBAAAtL,KAAAK,SAAAkO,QACAvC,EAAA5E,SAAApH,KAAAK,SAAAkO,SAEAvO,KAAAK,SAAAkO,QAAAvC,EAAA3J,IAGArC,KAAAoM,OAAApM,KAAAoM,OAAA1D,IAAAsD,IAGA5F,UAAA,SAAA/D,GACA,IAAAlB,EAAAnB,KAAAuP,cAAAvP,KAAA8O,SAAAzM,IACAoN,EAAA9P,EAAA0C,GAAAjC,KAAA,oBACA6L,EAAA,cAAA9K,EAAA,kBAAAA,EAAA,OAQA,OALAsO,IACAxD,EAAAA,EAAA,MAAAjM,KAAAuP,cAAAE,GACA5L,QAAA,OAAA,QAGA7D,KACAuK,SACAoB,OAAAM,IAMAsD,cAAA,SAAAG,GACA,YAAA7O,IAAA6O,EACA,GAGAA,EAAA7L,QAAA,yCAAA,SAGAiL,SAAA,SAAAzM,GACA,OAAArC,KAAAsF,OAAAjD,EAAAlB,QAAAnB,KAAAsG,UAAAjE,IAAAA,EAAA+K,IAAA/K,EAAAlB,MAGA6I,oBAAA,SAAA3H,GAQA,OALArC,KAAAsG,UAAAjE,KACAA,EAAArC,KAAAmH,WAAA9E,EAAAlB,OAIAxB,EAAA0C,GAAAgJ,IAAArL,KAAAK,SAAAyF,QAAA,IAGAQ,UAAA,SAAAjE,GACA,MAAA,kBAAA6L,KAAA7L,EAAA6E,OAGAC,WAAA,SAAAhG,GACA,OAAAxB,EAAAK,KAAAsB,aAAAyK,KAAA,UAAA/L,KAAAuP,cAAApO,GAAA,OAGAwO,UAAA,SAAA1G,EAAA5G,GACA,OAAAA,EAAAuN,SAAAlC,eACA,IAAA,SACA,OAAA/N,EAAA,kBAAA0C,GAAApC,OACA,IAAA,QACA,GAAAD,KAAAsG,UAAAjE,GACA,OAAArC,KAAAmH,WAAA9E,EAAAlB,MAAAwK,OAAA,YAAA1L,OAGA,OAAAgJ,EAAAhJ,QAGA4P,OAAA,SAAAjN,EAAAP,GACA,OAAArC,KAAA8P,mBAAAlN,IAAA5C,KAAA8P,mBAAAlN,GAAAA,EAAAP,IAGAyN,YAAA,CACAC,QAAA,SAAAnN,GACA,OAAAA,GAEA8M,OAAA,SAAA9M,EAAAP,GACA,QAAA1C,EAAAiD,EAAAP,EAAAV,MAAA1B,QAEA+P,SAAA,SAAApN,EAAAP,GACA,OAAAO,EAAAP,KAIAmE,SAAA,SAAAnE,GACA,IAAAjB,EAAApB,KAAA2G,aAAAtE,GACA,OAAA1C,EAAAO,UAAA+M,QAAAxJ,SAAAjC,KAAAxB,KAAAoB,EAAAiB,IAAA,uBAGA4N,gBAAA,SAAA5N,GACA,MAAA,WAAAA,EAAAlB,MAGA+O,aAAA,SAAA7N,GACArC,KAAA4I,QAAAvG,EAAAlB,QACAnB,KAAA4B,iBACAjC,EAAA0C,GAAA+E,SAAApH,KAAAK,SAAAmF,cACAxF,KAAA4I,QAAAvG,EAAAlB,OAAA,IAIAgP,YAAA,SAAA9N,EAAAJ,GACAjC,KAAA4B,iBAGA5B,KAAA4B,eAAA,IACA5B,KAAA4B,eAAA,UAEA5B,KAAA4I,QAAAvG,EAAAlB,MACAxB,EAAA0C,GAAAgF,YAAArH,KAAAK,SAAAmF,cACAvD,GAAA,IAAAjC,KAAA4B,gBAAA5B,KAAAkB,eAAAlB,KAAA2B,QAAA,IAAA3B,KAAA4B,gBACAjC,EAAAK,KAAAsB,aAAAsK,QAAA,UAMA5L,KAAAS,cACAd,EAAA,sBAAAK,KAAAS,aAAAU,KAAA,KAAAnB,KAAAsB,aAAAG,SAGAzB,KAAAkB,eAAA,IACAe,GAAA,IAAAjC,KAAA4B,gBAAA5B,KAAAkB,gBACAvB,EAAAK,KAAAsB,aAAA+H,eAAA,eAAA,CAAArJ,OACAA,KAAAkB,eAAA,IAIA6L,aAAA,SAAA1K,GACA,IAAA+N,EAEApQ,KAAA4I,QAAAvG,EAAAlB,QACAiP,EAAApQ,KAAAiQ,gBAAA5N,GACA1C,EAAA0Q,UAAAD,GAEApQ,KAAA4B,iBAGA5B,KAAA4B,eAAA,IACA5B,KAAA4B,eAAA,UAGA5B,KAAA4I,QAAAvG,EAAAlB,MACAxB,EAAA0C,GAAAgF,YAAArH,KAAAK,SAAAmF,gBAIA8K,cAAA,SAAAjO,EAAAe,GAGA,OAFAA,EAAA,iBAAAA,GAAAA,GAAA,SAEAzD,EAAAQ,KAAAkC,EAAA,kBAAA1C,EAAAQ,KAAAkC,EAAA,gBAAA,CACAkO,IAAA,KACAtO,OAAA,EACAwI,QAAAzK,KAAA+N,eAAA1L,EAAA,CAAAe,OAAAA,OAKAoN,QAAA,WACAxQ,KAAA6K,YAEAlL,EAAAK,KAAAsB,aACAmP,IAAA,aACA1F,WAAA,aACAgB,KAAA,0BACA0E,IAAA,qBACApJ,YAAA,yBACA0E,KAAA,2BACA0E,IAAA,sBACApJ,YAAA,0BACA0E,KAAA,gCACA0E,IAAA,2BACApJ,YAAA,+BACA0E,KAAA,mCACA0E,IAAA,8BACApJ,YAAA,kCACA0E,KAAA,8BACA0E,IAAA,yBACApJ,YAAA,+BAKAqJ,kBAAA,CACAjN,SAAA,CAAAA,UAAA,GACA8D,MAAA,CAAAA,OAAA,GACAC,IAAA,CAAAA,KAAA,GACAC,KAAA,CAAAA,MAAA,GACAC,QAAA,CAAAA,SAAA,GACAC,OAAA,CAAAA,QAAA,GACAC,OAAA,CAAAA,QAAA,GACA+I,WAAA,CAAAA,YAAA,IAGAC,cAAA,SAAAC,EAAAtO,GACAsO,EAAA7L,cAAA6I,OACA7N,KAAA0Q,kBAAAG,GAAAtO,EAEA5C,EAAAC,OAAAI,KAAA0Q,kBAAAG,IAIAvN,WAAA,SAAAjB,GACA,IAAAE,EAAA,GACAuO,EAAAnR,EAAA0C,GAAAjC,KAAA,SASA,OAPA0Q,GACAnR,EAAAyC,KAAA0O,EAAA5N,MAAA,KAAA,WACAlD,QAAAL,EAAAO,UAAAwQ,mBACA/Q,EAAAC,OAAA2C,EAAA5C,EAAAO,UAAAwQ,kBAAA1Q,SAIAuC,GAGAwO,uBAAA,SAAAxO,EAAA2E,EAAA9D,EAAA6F,GAIA,eAAAiF,KAAA9K,KAAA,OAAA8D,GAAA,oBAAAgH,KAAAhH,MACA+B,EAAA+H,OAAA/H,GAGAgI,MAAAhI,KACAA,OAAApI,IAIAoI,GAAA,IAAAA,EACA1G,EAAAa,GAAA6F,EACA/B,IAAA9D,GAAA,UAAA8D,IAIA3E,EAAA,SAAA2E,EAAA,UAAA9D,IAAA,IAIAG,eAAA,SAAAlB,GACA,IAGAe,EAAA6F,EAHA1G,EAAA,GACA+J,EAAA3M,EAAA0C,GACA6E,EAAA7E,EAAA6O,aAAA,QAGA,IAAA9N,KAAAzD,EAAAO,UAAA+M,QAaAhE,EAVA,aAAA7F,GAKA,MAJA6F,EAAA5G,EAAA6O,aAAA9N,MAKA6F,GAAA,KAIAA,GAEAqD,EAAAlM,KAAAgD,GAGApD,KAAA+Q,uBAAAxO,EAAA2E,EAAA9D,EAAA6F,GAQA,OAJA1G,EAAAuF,WAAA,uBAAAoG,KAAA3L,EAAAuF,mBACAvF,EAAAuF,UAGAvF,GAGAiB,UAAA,SAAAnB,GACA,IAGAe,EAAA6F,EAHA1G,EAAA,GACA+J,EAAA3M,EAAA0C,GACA6E,EAAA7E,EAAA6O,aAAA,QAGA,IAAA9N,KAAAzD,EAAAO,UAAA+M,QAIA,MAHAhE,EAAAqD,EAAAnM,KAAA,OAAAiD,EAAAmK,OAAA,GAAAC,cAAApK,EAAAqK,UAAA,GAAAC,kBAIAzE,GAAA,GAGAjJ,KAAA+Q,uBAAAxO,EAAA2E,EAAA9D,EAAA6F,GAEA,OAAA1G,GAGAG,YAAA,SAAAL,GACA,IAAAE,EAAA,GACArC,EAAAP,EAAAQ,KAAAkC,EAAAV,KAAA,aAKA,OAHAzB,EAAAG,SAAAkC,QACAA,EAAA5C,EAAAO,UAAA8C,cAAA9C,EAAAG,SAAAkC,MAAAF,EAAAlB,QAAA,IAEAoB,GAGAc,eAAA,SAAAd,EAAAF,GAmEA,OAhEA1C,EAAAyC,KAAAG,EAAA,SAAA8B,EAAAjD,GAGA,IAAA,IAAAA,GAIA,GAAAA,EAAAwB,OAAAxB,EAAA+P,QAAA,CACA,IAAAC,GAAA,EACA,cAAAhQ,EAAA+P,SACA,IAAA,SACAC,IAAAzR,EAAAyB,EAAA+P,QAAA9O,EAAAV,MAAA1B,OACA,MACA,IAAA,WACAmR,EAAAhQ,EAAA+P,QAAA3P,KAAAa,EAAAA,GAGA+O,EACA7O,EAAA8B,QAAAxD,IAAAO,EAAAwB,OAAAxB,EAAAwB,OAEAjD,EAAAQ,KAAAkC,EAAAV,KAAA,aAAAsJ,cAAAtL,EAAA0C,WACAE,EAAA8B,iBAjBA9B,EAAA8B,KAuBA1E,EAAAyC,KAAAG,EAAA,SAAAoK,EAAA0E,GACA9O,EAAAoK,GAAA,mBAAA0E,GAAA,eAAA1E,EAAA0E,EAAAhP,GAAAgP,IAIA1R,EAAAyC,KAAA,CAAA,YAAA,aAAA,WACAG,EAAAvC,QACAuC,EAAAvC,MAAAgR,OAAAzO,EAAAvC,UAGAL,EAAAyC,KAAA,CAAA,cAAA,SAAA,WACA,IAAAkP,EACA/O,EAAAvC,QACAiF,MAAAsM,QAAAhP,EAAAvC,OACAuC,EAAAvC,MAAA,CAAAgR,OAAAzO,EAAAvC,MAAA,IAAAgR,OAAAzO,EAAAvC,MAAA,KACA,iBAAAuC,EAAAvC,QACAsR,EAAA/O,EAAAvC,MAAA6D,QAAA,UAAA,IAAAX,MAAA,UACAX,EAAAvC,MAAA,CAAAgR,OAAAM,EAAA,IAAAN,OAAAM,EAAA,SAKA3R,EAAAO,UAAAmI,mBAGA,MAAA9F,EAAA4F,KAAA,MAAA5F,EAAA2F,MACA3F,EAAA0F,MAAA,CAAA1F,EAAA4F,IAAA5F,EAAA2F,YACA3F,EAAA4F,WACA5F,EAAA2F,KAEA,MAAA3F,EAAAwF,WAAA,MAAAxF,EAAAuF,YACAvF,EAAAyF,YAAA,CAAAzF,EAAAwF,UAAAxF,EAAAuF,kBACAvF,EAAAwF,iBACAxF,EAAAuF,YAIAvF,GAIAS,cAAA,SAAA7C,GACA,IACAqR,EAMA,MAPA,iBAAArR,IACAqR,EAAA,GACA7R,EAAAyC,KAAAjC,EAAA+C,MAAA,MAAA,WACAsO,EAAAxR,OAAA,IAEAG,EAAAqR,GAEArR,GAIAsR,UAAA,SAAAtQ,EAAAiC,EAAAqH,GACA9K,EAAAO,UAAA+M,QAAA9L,GAAAiC,EACAzD,EAAAO,UAAA+C,SAAA9B,QAAAN,IAAA4J,EAAAA,EAAA9K,EAAAO,UAAA+C,SAAA9B,GACAiC,EAAAnD,OAAA,GACAN,EAAAO,UAAA0Q,cAAAzP,EAAAxB,EAAAO,UAAA8C,cAAA7B,KAKA8L,QAAA,CAGAxJ,SAAA,SAAAwF,EAAA5G,EAAAO,GAGA,IAAA5C,KAAA6P,OAAAjN,EAAAP,GACA,MAAA,sBAEA,GAAA,WAAAA,EAAAuN,SAAAlC,cAMA,OAAA1N,KAAAsG,UAAAjE,GACA,EAAArC,KAAA2P,UAAA1G,EAAA5G,GAEA4G,MAAAA,GAAA,EAAAA,EAAAhJ,OANA,IAAAmB,EAAAzB,EAAA0C,GAAAjB,MACA,OAAAA,GAAA,EAAAA,EAAAnB,QASAsH,MAAA,SAAA0B,EAAA5G,GAMA,OAAArC,KAAAwG,SAAAnE,IAAA,wIAAA6L,KAAAjF,IAIAzB,IAAA,SAAAyB,EAAA5G,GAMA,OAAArC,KAAAwG,SAAAnE,IAAA,khBAAA6L,KAAAjF,IAIAxB,MACA3D,GAAA,EAEA,SAAAmF,EAAA5G,GAcA,OAbAyB,IACAA,GAAA,EACA9D,KAAAK,SAAAkB,OAAAO,OAAAC,SACAA,QAAAC,KACA,uTASAhC,KAAAwG,SAAAnE,KAAA,cAAA6L,KAAA,IAAAwD,KAAAzI,GAAA0I,cAKAjK,QAAA,SAAAuB,EAAA5G,GACA,OAAArC,KAAAwG,SAAAnE,IAAA,+DAAA6L,KAAAjF,IAIAtB,OAAA,SAAAsB,EAAA5G,GACA,OAAArC,KAAAwG,SAAAnE,IAAA,8CAAA6L,KAAAjF,IAIArB,OAAA,SAAAqB,EAAA5G,GACA,OAAArC,KAAAwG,SAAAnE,IAAA,QAAA6L,KAAAjF,IAIAlB,UAAA,SAAAkB,EAAA5G,EAAAO,GACA,IAAA3C,EAAAgF,MAAAsM,QAAAtI,GAAAA,EAAAhJ,OAAAD,KAAA2P,UAAA1G,EAAA5G,GACA,OAAArC,KAAAwG,SAAAnE,IAAAO,GAAA3C,GAIA6H,UAAA,SAAAmB,EAAA5G,EAAAO,GACA,IAAA3C,EAAAgF,MAAAsM,QAAAtI,GAAAA,EAAAhJ,OAAAD,KAAA2P,UAAA1G,EAAA5G,GACA,OAAArC,KAAAwG,SAAAnE,IAAApC,GAAA2C,GAIAoF,YAAA,SAAAiB,EAAA5G,EAAAO,GACA,IAAA3C,EAAAgF,MAAAsM,QAAAtI,GAAAA,EAAAhJ,OAAAD,KAAA2P,UAAA1G,EAAA5G,GACA,OAAArC,KAAAwG,SAAAnE,IAAApC,GAAA2C,EAAA,IAAA3C,GAAA2C,EAAA,IAIAuF,IAAA,SAAAc,EAAA5G,EAAAO,GACA,OAAA5C,KAAAwG,SAAAnE,IAAAO,GAAAqG,GAIAf,IAAA,SAAAe,EAAA5G,EAAAO,GACA,OAAA5C,KAAAwG,SAAAnE,IAAA4G,GAAArG,GAIAqF,MAAA,SAAAgB,EAAA5G,EAAAO,GACA,OAAA5C,KAAAwG,SAAAnE,IAAA4G,GAAArG,EAAA,IAAAqG,GAAArG,EAAA,IAIAwF,KAAA,SAAAa,EAAA5G,EAAAO,GAMA,SAAAgP,EAAAC,GACA,IAAArC,GAAA,GAAAqC,GAAArC,MAAA,iBACA,OAAAA,GAKAA,EAAA,GAAAA,EAAA,GAAAvP,OAJA,EAMA,SAAA6R,EAAAD,GACA,OAAAE,KAAAC,MAAAH,EAAAE,KAAAE,IAAA,GAAAC,IAfA,IAkBAA,EAlBAhL,EAAAvH,EAAA0C,GAAAjC,KAAA,QACA+R,EAAA,gCAAAjL,EAAA,qBAEAkL,EAAA,IAAA/M,OAAA,MAAA6B,EAAA,OAcAjF,GAAA,EAKA,GAlBAiF,IAAAkL,EAAAlE,KAFA,CAAA,OAAA,SAAA,SAEAhC,QAmBA,MAAA,IAAAmG,MAAAF,GAUA,OAPAD,EAAAN,EAAAhP,IAGAgP,EAAA3I,GAAAiJ,GAAAJ,EAAA7I,GAAA6I,EAAAlP,IAAA,KACAX,GAAA,GAGAjC,KAAAwG,SAAAnE,IAAAJ,GAIA4F,QAAA,SAAAoB,EAAA5G,EAAAO,GAGA,IAAA0P,EAAA3S,EAAAiD,GAMA,OALA5C,KAAAK,SAAAgG,YAAAiM,EAAAjH,IAAA,0BAAApL,QACAqS,EAAAlL,SAAA,yBAAA7G,GAAA,wBAAA,WACAZ,EAAA0C,GAAAJ,UAGAgH,IAAAqJ,EAAAlR,OAIAsC,OAAA,SAAAuF,EAAA5G,EAAAO,EAAAQ,GACA,GAAApD,KAAAwG,SAAAnE,GACA,MAAA,sBAGAe,EAAA,iBAAAA,GAAAA,GAAA,SAEA,IACAlD,EAAAC,EAAAoS,EADAC,EAAAxS,KAAAsQ,cAAAjO,EAAAe,GAWA,OARApD,KAAAK,SAAA4C,SAAAZ,EAAAlB,QACAnB,KAAAK,SAAA4C,SAAAZ,EAAAlB,MAAA,IAEAqR,EAAAC,gBAAAD,EAAAC,iBAAAzS,KAAAK,SAAA4C,SAAAZ,EAAAlB,MAAAiC,GACApD,KAAAK,SAAA4C,SAAAZ,EAAAlB,MAAAiC,GAAAoP,EAAA/H,QAEA7H,EAAA,iBAAAA,EAAA,CAAA4E,IAAA5E,GAAAA,EACA2P,EAAA5S,EAAAiD,MAAAjD,EAAAC,OAAA,CAAAO,KAAA8I,GAAArG,EAAAzC,OACAqS,EAAAjC,MAAAgC,EACAC,EAAAvQ,OAGAuQ,EAAAjC,IAAAgC,GACArS,EAAAF,MACAkQ,aAAA7N,IACAlC,EAAA,IACAkC,EAAAlB,MAAA8H,EACAtJ,EAAA+S,KAAA/S,EAAAC,QAAA,EAAA,CACA+S,KAAA,QACAvC,KAAApQ,KAAAiQ,gBAAA5N,GACAuQ,SAAA,OACAzS,KAAAA,EACA0S,QAAA3S,EAAAoB,YACAiN,QAAA,SAAAuE,GACA,IACAvI,EAAAE,EAAAlE,EADAtE,GAAA,IAAA6Q,GAAA,SAAAA,EAGA5S,EAAAG,SAAA4C,SAAAZ,EAAAlB,MAAAiC,GAAAoP,EAAAC,gBACAxQ,GACAsE,EAAArG,EAAAgB,cACAhB,EAAAoK,OAAApK,EAAAkG,UAAA/D,GACAnC,EAAAgB,cAAAqF,EACArG,EAAAwK,YAAAN,KAAA/H,GACAnC,EAAA4G,QAAAzE,EAAAlB,OAAA,EACAjB,EAAAoJ,eAEAiB,EAAA,GACAE,EAAAqI,GAAA5S,EAAA6N,eAAA1L,EAAA,CAAAe,OAAAA,EAAA4J,WAAA/D,IACAsB,EAAAlI,EAAAlB,MAAAqR,EAAA/H,QAAAA,EACAvK,EAAA4G,QAAAzE,EAAAlB,OAAA,EACAjB,EAAAoJ,WAAAiB,IAEAiI,EAAAvQ,MAAAA,EACA/B,EAAAiQ,YAAA9N,EAAAJ,KAEAW,IACA,eAWA,IACA8P,EADAK,EAAA,GAmCA,OA/BApT,EAAAqT,cACArT,EAAAqT,cAAA,SAAA3S,EAAA4S,EAAAC,GACA,IAAA9C,EAAA/P,EAAA+P,KACA,UAAA/P,EAAAsS,OACAhT,EAAA0Q,UAAAD,GACA2C,EAAA3C,GAAA8C,MAMAR,EAAA/S,EAAA+S,KACA/S,EAAA+S,KAAA,SAAArS,GACA,IAAAsS,GAAA,SAAAtS,EAAAA,EAAAV,EAAAwT,cAAAR,KACAvC,GAAA,SAAA/P,EAAAA,EAAAV,EAAAwT,cAAA/C,KACA,MAAA,UAAAuC,GACAhT,EAAA0Q,UAAAD,GACA2C,EAAA3C,GAAAsC,EAAA3N,MAAA/E,KAAA2E,WACAoO,EAAA3C,IAEAsC,EAAA3N,MAAA/E,KAAA2E,aAKAhF,EAAA0Q,UAAA,SAAAD,GACA2C,EAAA3C,KACA2C,EAAA3C,GAAAgD,eACAL,EAAA3C,KAGAzQ,ICrpDA,SAAA0T,EAAAjU,GAEA,mBAAAC,QAAAA,OAAAC,IAEAD,OAAA,GAAAD,GAGA,iBAAAG,QAAAA,OAAAC,QAEAD,OAAAC,QAAAJ,IAEAiU,EAAAC,cAAAlU,IAXA,CAcA,oBAAAmU,KAAAA,KAAAvT,KAAA,WACA,IAIAwT,EAAA,CACAC,IAAA,MACAC,KAAA,KACApP,SAAA,CACAqP,aAAA,CACAC,KAAA,CAAA,SAAA,SAAA,UAAA,YAAA,WAAA,SAAA,YACAC,UAAA,CAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,OACAC,OAAA,CACA,UAAA,WAAA,QAAA,QAAA,MAAA,OAAA,OACA,SAAA,YAAA,UAAA,WAAA,YAEAC,YAAA,CAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,OACAC,SAAA,CAAA,KAAA,MACAC,QAAA,SAAAtM,GACA,IAAAvC,EAAAuC,EAAA,GAAAuM,EAAA,CAAAC,EAAA,KAAAC,EAAA,KAAAC,EAAA,MACA,OAAA,IAAAtC,KAAAuC,MAAA3M,EAAA,IAAA,KAAAuM,EAAA9O,GAAA8O,EAAA9O,GAAA,OAGAmP,WAAA,eACAC,WAAA,2CACAC,SAAA,qBACAC,QAAA,uIACAC,OAAA,eAEAC,OAAA,SAAAhR,EAAAiR,GACA,OAAAC,SAAAlR,EAAAiR,GAAA,KAEAE,QAAA,SAAAC,EAAAC,GACA,MAAA,iBAAA,GAAA,iBAAA,GAAAD,EAAAtH,gBAAAuH,EAAAvH,eAEAwH,KAAA,SAAAjM,EAAAhJ,EAAAkV,GACA,IAAA/T,EAAA6H,EAAA0I,WAEA,OADAwD,EAAAA,GAAA,IACA/T,EAAAnB,OAAAA,EAAAuT,EAAA0B,KAAAC,EAAA/T,EAAAnB,GAAAmB,GAEAgU,MAAA,SAAAC,GACA,IAAAlQ,EAAAgG,EAEA,IADAkK,EAAAA,GAAA,GACAlQ,EAAA,EAAAA,EAAAR,UAAA1E,OAAAkF,IAEA,GADAgG,EAAAxG,UAAAQ,GAIA,IAAA,IAAA6D,KAAAmC,EACAA,EAAAmK,eAAAtM,KACA,iBAAAmC,EAAAnC,GACAwK,EAAA4B,MAAAC,EAAArM,GAAAmC,EAAAnC,IAEAqM,EAAArM,GAAAmC,EAAAnC,IAKA,OAAAqM,GAEAE,SAAA,SAAAnU,EAAAoU,GACA,IAAA,IAAArQ,EAAA,EAAAA,EAAAqQ,EAAAvV,OAAAkF,IACA,GAAAqQ,EAAArQ,GAAAuI,gBAAAtM,EAAAsM,cACA,OAAAvI,EAGA,OAAA,IASAmO,EAAA,SAAAvT,GACA,IAAAwT,EAAAvT,KAAAyV,EAAAjC,EAAA4B,MAAA5B,EAAAlP,SAAAvE,GACAwT,EAAAI,aAAA8B,EAAA9B,aACAJ,EAAAgB,WAAAkB,EAAAlB,WACAhB,EAAAiB,WAAAiB,EAAAjB,WACAjB,EAAAkB,SAAAgB,EAAAhB,SACAlB,EAAAmB,QAAAe,EAAAf,QACAnB,EAAAoB,OAAAc,EAAAd,QA+hBA,OAzhBArB,EAAAhL,UAAA,CACAtD,YAAAsO,EACAoC,SAAA,SAAAtU,GACA,IACA+D,EAAAqO,EAAA+B,SAAAnU,EADApB,KACA2T,aAAAI,aAAA,EAIA,OAHA,IAAA5O,IACAA,EAAAqO,EAAA+B,SAAAnU,EAHApB,KAGA2T,aAAAG,QAAA,GAEA3O,GAEAwQ,UAAA,SAAAC,EAAAC,GACA,IAAAC,EAAAC,EAAA5Q,EAAA6Q,EAAAC,EACAC,EAAAC,EAAAC,EAAAC,EAAAC,EADAC,GAAA,EAAAC,GAAA,EACAC,EADAzW,KACA2T,aACA0B,EAAA,CAAA5N,KAAA,KAAAiP,KAAA,KAAAC,MAAA,KAAAC,IAAA,KAAAC,KAAA,EAAA1O,IAAA,EAAA2O,IAAA,GACA,IAAAlB,EACA,OAAA,KAEA,GAAAA,aAAAlE,KACA,OAAAkE,EAEA,GAAA,MAAAC,EAEA,OADA1Q,EAAAqO,EAAAoB,OAAAgB,IACA,IAAAlE,KAAA,IAAAvM,GAAAyQ,EAEA,cAAAA,GACA,IAAA,SACA,OAAA,IAAAlE,KAAAkE,GACA,IAAA,SACA,MACA,QACA,OAAA,KAGA,KADAE,EAAAD,EAAArG,MArBAxP,KAqBAwU,cACA,IAAAsB,EAAA7V,OACA,MAAA,IAAAoS,MAAA,mCAEA,IAAAlN,EAAA2Q,EAAA7V,OAAA,EAAA,GAAAkF,EAAAA,IACA,MAAA2Q,EAAA3Q,IACA2Q,EAAAiB,OAAA5R,EAAA,GAIA,IADA4Q,EAAAH,EAAA/R,QA9BA7D,KA8BAuU,WAAA,MAAArR,MAAA,MACAiC,EAAA,EAAAA,EAAA4Q,EAAA9V,OAAAkF,IAGA,OAFA6Q,EAAAD,EAAA5Q,GACA8Q,EAAAzC,EAAAoB,OAAAoB,GACAF,EAAA3Q,IACA,IAAA,IACA,IAAA,IACA,IAAA8Q,EAIA,OAAA,KAHAI,EAAAL,EAAA/V,OACAoV,EAAAqB,KAAA,IAAAL,EAAA7C,EAAAoB,QAAAqB,EAAA,GAAA,KAAA,MAAAD,GAAAC,EAIAM,GAAA,EACA,MACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,GAAAtF,MAAAgF,GAAA,CAEA,KAAA,GADAC,EAlDAlW,KAkDA0V,SAAAM,KAIA,OAAA,KAFAX,EAAAsB,MAAAT,MAIA,CACA,KAAA,GAAAD,GAAAA,GAAA,IAGA,OAAA,KAFAZ,EAAAsB,MAAAV,EAKAM,GAAA,EACA,MACA,IAAA,IACA,IAAA,IACA,KAAA,GAAAN,GAAAA,GAAA,IAGA,OAAA,KAFAZ,EAAAuB,IAAAX,EAIAM,GAAA,EACA,MACA,IAAA,IACA,IAAA,IAIA,GADAD,EAAAP,EAFAI,GAAA,EAAAL,EAAAkB,QAAA,KAAAlB,EAAAkB,QAAA,MACA,EAAAlB,EAAAkB,QAAA,KAAAlB,EAAAkB,QAAA,MAAA,IAEA,IAAAb,EACAC,EAAA5C,EAAAuB,QAAAuB,EAAAG,EAAAzC,SAAA,IAAA,EACAR,EAAAuB,QAAAuB,EAAAG,EAAAzC,SAAA,IAAA,IAAA,EACA,GAAAiC,GAAAA,GAAA,KAAA,GAAAG,EACAf,EAAAwB,KAAAZ,EAAA,IAAA,EAAAG,EAAAH,EAAAG,EAEA,GAAAH,GAAAA,GAAA,KACAZ,EAAAwB,KAAAZ,OAGA,CACA,KAAA,GAAAA,GAAAA,GAAA,IAGA,OAAA,KAFAZ,EAAAwB,KAAAZ,EAKAO,GAAA,EACA,MACA,IAAA,IACA,IAAA,IACA,KAAA,GAAAP,GAAAA,GAAA,IAGA,OAAA,KAFAZ,EAAAwB,KAAAZ,EAIAO,GAAA,EACA,MACA,IAAA,IACA,KAAA,GAAAP,GAAAA,GAAA,IAGA,OAAA,KAFAZ,EAAAlN,IAAA8N,EAIAO,GAAA,EACA,MACA,IAAA,IACA,KAAA,GAAAP,GAAAA,GAAA,IAGA,OAAA,KAFAZ,EAAAyB,IAAAb,EAIAO,GAAA,EAIA,IAAA,IAAAD,EAAA,CACA,IAAAU,EAAA5B,EAAAqB,MAAA,EAAAQ,EAAA7B,EAAAsB,MAAAtB,EAAAsB,MAAA,EAAA,EAAAQ,EAAA9B,EAAAuB,KAAA,EACAvB,EAAA5N,KAAA,IAAAiK,KAAAuF,EAAAC,EAAAC,EAAA9B,EAAAwB,KAAAxB,EAAAlN,IAAAkN,EAAAyB,IAAA,OACA,CACA,IAAA,IAAAN,EACA,OAAA,KAEAnB,EAAA5N,KAAA,IAAAiK,KAAA,EAAA,EAAA,EAAA2D,EAAAwB,KAAAxB,EAAAlN,IAAAkN,EAAAyB,IAAA,GAEA,OAAAzB,EAAA5N,MAEA2P,UAAA,SAAAC,EAAAxB,GACA,GAAA,iBAAAwB,EACA,OAAAA,EAEA,IAAAhB,EACAiB,EAAAnS,EAAAC,EAAAmS,EAAAC,EADAC,EAAAJ,EAAAxT,QAAA7D,KAAAuU,WAAA,MAAArR,MAAA,MACA4S,EAAAD,EAAArG,MADAxP,KACAwU,YAAAoB,EAAA,IAAAlE,KAAAgG,EAAA,EAEA,IAHA,WAGAxJ,KAAA4H,EAAA,IACA,OAAAuB,EAGA,IAAAlS,EAAA,EAAAA,EAAAsS,EAAAxX,OAAAkF,IAAA,CAIA,GAHAuS,EAAA,EACAH,EAAAE,EAAAtS,GACAqS,EAAAhE,EAAAoB,OAAA2C,EAAA9K,OAAA,EAAA,IACAwE,MAAAuG,GACA,OAAA,KAEA,OAAArS,GACA,KAAA,EACA,MAAA2Q,EAAA,IAAA,MAAAA,EAAA,GACAF,EAAA+B,SAAAH,EAAA,GAEA5B,EAAAgC,QAAAJ,GAEA,MACA,KAAA,EACA,MAAA1B,EAAA,IAAA,MAAAA,EAAA,GACAF,EAAAgC,QAAAJ,GAEA5B,EAAA+B,SAAAH,EAAA,GAEA,MACA,KAAA,EAKA,GAJAF,EAAA1B,EAAAiC,cAEAH,GADArB,EAAAkB,EAAAtX,QACA,EAAAoW,EAAA,IACAiB,EAAA9D,EAAAoB,OAAAyB,EAAA,EAAAiB,EAAA3F,WAAAlF,OAAA,EAAA,EAAA4J,GAAAkB,EAAAA,EAAA9K,OAAA,EAAA,KAEA,OAAA,KAEAmJ,EAAAkC,YAAAR,GACA,MACA,KAAA,EACA1B,EAAAmC,SAAAP,GACA,MACA,KAAA,EACA5B,EAAAoC,WAAAR,GACA,MACA,KAAA,EACA5B,EAAAqC,WAAAT,GAIA,GADApS,EAAAmS,EAAA9K,OAAAiL,IACAzX,QACAwX,EAAAV,OAAA5R,EAAA,EAAA,EAAAC,GAGA,OAAAwQ,GAEAsC,YAAA,SAAAC,EAAAvC,GACA,SAAAwC,EAAAC,EAAAC,GACA,OAAAC,EAAAF,GAAAE,EAAAF,KAAAC,EADA,IAAA/E,EAAAvT,KAAAyW,EAAAlD,EAAAI,aAAA6E,EAAA,YAGAD,EAAA,CAQAE,EAAA,WACA,OAAAjF,EAAA0B,KAAAqD,EAAAG,IAAA,IAMAC,EAAA,WACA,OAAAlC,EAAA5C,UAAA0E,EAAAK,MAMAF,EAAA,WACA,OAAA9C,EAAAiD,WAMAC,EAAA,WACA,OAAArC,EAAA7C,KAAA2E,EAAAK,MAMAG,EAAA,WACA,OAAAR,EAAAK,KAAA,GAMAA,EAAA,WACA,OAAAhD,EAAAoD,UAMAC,EAAA,WACA,IAAA/U,EAAA,IAAAwN,KAAA6G,EAAAW,IAAAX,EAAAnT,IAAA,EAAAmT,EAAAG,KAAAS,EAAA,IAAAzH,KAAA6G,EAAAW,IAAA,EAAA,GACA,OAAAnH,KAAAC,OAAA9N,EAAAiV,GAAA3F,EAAAC,MAUA2F,EAAA,WACA,IAAAlV,EAAA,IAAAwN,KAAA6G,EAAAW,IAAAX,EAAAnT,IAAA,EAAAmT,EAAAG,IAAAH,EAAAQ,IAAA,GAAAI,EAAA,IAAAzH,KAAAxN,EAAA2T,cAAA,EAAA,GACA,OAAArE,EAAA0B,KAAA,EAAAnD,KAAAC,OAAA9N,EAAAiV,GAAA3F,EAAAC,IAAA,GAAA,IAUA4F,EAAA,WACA,OAAA5C,EAAA3C,OAAA8B,EAAAF,aAMA9H,EAAA,WACA,OAAA4F,EAAA0B,KAAAqD,EAAAnT,IAAA,IAMAkU,EAAA,WACA,OAAA7C,EAAA1C,YAAA6B,EAAAF,aAMAtQ,EAAA,WACA,OAAAwQ,EAAAF,WAAA,GAMA2C,EAAA,WACA,OAAA,IAAA3G,KAAA6G,EAAAW,IAAAX,EAAAnT,IAAA,GAAAyT,WAUAU,EAAA,WACA,IAAAL,EAAAX,EAAAW,IACA,OAAAA,EAAA,GAAA,GAAAA,EAAA,KAAA,GAAAA,EAAA,KAAA,EAAA,EAAA,GAMAM,EAAA,WACA,IAAApU,EAAAmT,EAAAnT,IAAAgU,EAAAb,EAAAa,IACA,OADAb,EAAAW,KACA,KAAA9T,GAAAgU,EAAA,EAAA,EAAA,IAAAhU,GAAA,EAAAgU,GAAA,EAAA,IAMAF,EAAA,WACA,OAAAtD,EAAAiC,eAMA4B,EAAA,WACA,OAAAlB,EAAAW,IAAAvH,WAAAzM,OAAA,IAUAhB,EAAA,WACA,OAAAqU,EAAAmB,IAAAhM,eAMAgM,EAAA,WACA,IAAAtU,EAAAmT,EAAAoB,IAAA,GAAA,EAAA,EACA,OAAAlD,EAAAzC,SAAA5O,IAMAwU,EAAA,WACA,IAAAC,EAAAjE,EAAAkE,cAAAtG,EAAAE,KAAAvO,EAAA,GAAAyQ,EAAAmE,gBAAAzB,EAAA1C,EAAAoE,gBACA,OAAAxG,EAAA0B,KAAAnD,KAAAuC,OAAAuF,EAAA1U,EAAAmT,EAAA9E,EAAAE,MAAA,MAAA,IAAA,IAMAuG,EAAA,WACA,OAAA1B,EAAAoB,IAAA,IAAA,IAMAA,EAAA,WACA,OAAA/D,EAAAsE,YAMAC,EAAA,WACA,OAAA3G,EAAA0B,KAAAqD,EAAA0B,IAAA,IAMAJ,EAAA,WACA,OAAArG,EAAA0B,KAAAqD,EAAAoB,IAAA,IAMAxU,EAAA,WACA,OAAAqO,EAAA0B,KAAAU,EAAAwE,aAAA,IAMA9B,EAAA,WACA,OAAA9E,EAAA0B,KAAAU,EAAAyE,aAAA,IAMAC,EAAA,WACA,OAAA9G,EAAA0B,KAAA,IAAAU,EAAA2E,kBAAA,IAUA1O,EAAA,WAEA,MADA,WAAA2O,KAAA3M,OAAA+H,IAAA,IACA,8BAMA6E,EAAA,WAGA,OAFA,IAAA/I,KAAA6G,EAAAW,IAAA,GAAAxH,KAAAgJ,IAAAnC,EAAAW,IAAA,IACA,IAAAxH,KAAA6G,EAAAW,IAAA,GAAAxH,KAAAgJ,IAAAnC,EAAAW,IAAA,GACA,EAAA,GAMAyB,EAAA,WACA,IAAAC,EAAAhF,EAAAiF,oBAAA3W,EAAA6N,KAAA+I,IAAAF,GACA,OAAA,EAAAA,EAAA,IAAA,KAAApH,EAAA0B,KAAA,IAAAnD,KAAAuC,MAAApQ,EAAA,IAAAA,EAAA,GAAA,IAMA6W,EAAA,WACA,IAAAJ,EAAApC,EAAAoC,IACA,OAAAA,EAAAlO,OAAA,EAAA,GAAA,IAAAkO,EAAAlO,OAAA,EAAA,IAMAuO,EAAA,WAEA,OADAnN,OAAA+H,GAAApG,MAAA+D,EAAAmB,UAAA,CAAA,KAAAuG,MAAApX,QAAA0P,EAAAoB,OAAA,KACA,OAMAuG,EAAA,WACA,OAAA,IAAAtF,EAAAiF,qBAUAM,EAAA,WACA,MAAA,iBAAAtX,QAAA2U,EAAAJ,IAMAgD,EAAA,WACA,MAAA,mBAAAvX,QAAA2U,EAAAJ,IAMAiD,EAAA,WACA,OAAAzF,EAAA0F,UAAA,KAAA,IAGA,OAAAlD,EAAAD,EAAAA,IAEAoD,WAAA,SAAA3F,EAAAC,GACA,IAAA1Q,EAAAC,EAAAiR,EAAAzS,EAAAuU,EAAAd,EAAA,GACA,GAAA,iBAAAzB,KACAA,EAFA5V,KAEA2V,UAAAC,EAAAC,IAEA,OAAA,KAGA,GAAAD,aAAAlE,KAAA,CAEA,IADA2E,EAAAR,EAAA5V,OACAkF,EAAA,EAAAA,EAAAkR,EAAAlR,IAEA,OADAgT,EAAAtC,EAAAtI,OAAApI,KAVA,OAWAgT,IAGA,EAAAhT,GAdA,OAcA0Q,EAAAtI,OAAApI,EAAA,GACAkS,GAAAc,GAGAvU,EAlBA5D,KAkBAkY,YAAAC,EAAAvC,GACAzQ,IAAAkR,EAAA,GAnBArW,KAmBAyU,SAAAvG,KAAAiK,IAAA,MAAAtC,EAAAtI,OAAApI,EAAA,KACAC,EAAAoO,EAAAoB,OAAAhR,IAAA,EACAA,GArBA5D,KAqBA2T,aAAAM,QAAA7O,IAEAiS,GAAAzT,IAEA,OAAAyT,EAEA,MAAA,KAGA/D,IFloBAnU,kBAAA,CAEAqc,cAAA,CAAA,WAAA,aAKAjX,KAAA,WAIA,IAAAS,EAAArF,EAAAE,GAAAC,SACAH,EAAAE,GAAAC,SAAA,SAAAC,GACA,IAAAoB,EAAA,0BAMA,OAJA,IADAxB,EAAAK,MAAA+L,KAAA,eAAA5K,EAAA,MACAlB,QACAN,EAAA,WAAAS,KAAA,CAAA8G,KAAA,SAAA/F,KAAAA,IAAAE,SAAArB,MAGAgF,EAAAD,MAAA/E,KAAA,CAAAD,KAIAJ,EAAAO,UAAAwQ,kBAAA,GACA/Q,EAAAO,UAAAqD,eAAA,aAEA5D,EAAAO,UAAAsD,UAAAxD,KAAAyb,WACA9b,EAAAO,UAAAoI,UAAAoT,gBAAA,GAGA1b,KAAA2b,oBAGAF,WAAA,SAAApZ,GAEA,IAAAE,EAAA,GACArC,EAAAP,EAAAQ,KAAAkC,EAAAV,KAAA,aACAia,EAAA1b,EAAAwb,gBAGA,OAAA,IAAArZ,EAAAlB,KAAA6V,QAAA,OAIA3U,EAAAlB,QAAAya,IACAA,EAAAvZ,EAAAlB,MAAA,IAGAxB,EAAAyC,KAAAlC,EAAAG,SAAAkC,MAAA,SAAApB,EAAA0a,GACA,IAKAC,EAEAC,EAPA5a,KAAAya,EAAAvZ,EAAAlB,MACAoB,EAAApD,kBAAA6c,QAAAC,WAAA1Z,EAAAqZ,EAAAvZ,EAAAlB,MAAAA,KAEAya,EAAAvZ,EAAAlB,MAAAA,GAAA,GAEA2a,EAAA3c,kBAAA6c,QAAAE,kBAAA/a,GACAkB,EAAAlB,KAAAqO,MAAAsM,KACAC,EAAApc,EAAAO,UAAA8C,cAAA6Y,IAAA,GACAD,EAAAvZ,EAAAlB,MAAAA,GAAA4a,EAEAxZ,EAAApD,kBAAA6c,QAAAC,WAAA1Z,EAAAwZ,QAlBAxZ,GA0BAoZ,iBAAA,WA2CA,SAAAQ,EAAAjc,GACA,IAAAic,EAAAxc,EAAAO,EAAAoB,aAAAlB,KAAA,UAKA,OAJAT,EAAAO,EAAAoB,aAAAyK,KAAA,yBAAA9L,SACAkc,EAAAxc,EAAAO,EAAAoB,aAAAyK,KAAA,yBAAA3K,OAGA+a,EAYA,SAAAC,EAAAlc,EAAAmC,EAAAqC,EAAAvE,GACA,MAAA,CACAwS,KAAA,QACAvC,KAAA,WAAA/N,EAAAlB,KACAyR,SAAA,OACAzS,KAAAA,EACA0S,QAAA3S,EAAAoB,YACAkG,IAAA7H,EAAAO,EAAAoB,aAAAlB,KAAA,UACA8G,KAAAiV,EAAAjc,GACAmc,WAAA,SAAAnJ,GACA,IAAAoJ,EAAA5X,EA9DA,GAAA,GAAA,GA+DA,GAAA,QAAAyX,EAAAjc,IAAAoc,EACA,OAAApJ,EAAAqJ,iBAAA,eAAAD,KAeA,SAAAE,EAAAtc,EAAAuc,EAAApa,EAAAE,GACA,IAAAma,GAAA,EACAlK,EAAAtS,EAAAoQ,cAAAjO,GAwDA,OAtDA1C,EAAAyC,KAAAG,EAAA,SAAA4C,EAAAvC,GACA,IAAA+Z,EAAA/Z,EAAA,KAAA,IAAAzD,kBAAAqc,cAAAxE,QAAApU,EAAA,IACA+J,EAAA/J,EAAA,GACA6H,EAAA7H,EAAA,GAEA,OAAA+Z,GAAAzc,EAAAsG,SAAAnE,KACAqa,EAAA,6BAIA7b,IAAA1B,kBAAA8N,QAAAN,GACAhN,EAAAyC,KAAAqa,EAAA,SAAAtZ,EAAA8F,GAuBA,IAAA,KAtBAyT,EAAAvd,kBAAA8N,QAAAN,GAAAnL,KAAAtB,EAAA+I,EAAA5G,EAAAO,EAAA,GAAA,SAAAX,GAEA,IACAsE,EAOAgE,EATArK,EAAAG,SAAA4C,SAAAZ,EAAAlB,MAAAyb,wBAAApK,EAAAC,gBACAxQ,GACAsE,EAAArG,EAAAgB,cACAhB,EAAAgK,eAAA7H,GACAnC,EAAAgB,cAAAqF,EACArG,EAAAwK,YAAAN,KAAA/H,UACAnC,EAAA4G,QAAAzE,EAAAlB,MACAjB,EAAAoJ,gBAEAiB,EAAA,IACAlI,EAAAlB,MACAqR,EAAA/H,QACA,mBAAAA,EAAAA,EAAAxB,GAAAwB,EACAvK,EAAA4G,QAAAzE,EAAAlB,OAAA,EACAjB,EAAAoJ,WAAAiB,IAEArK,EAAAoJ,WAAApJ,EAAAkJ,UACAoJ,EAAAvQ,MAAAA,KAKA,OAAA,IAIAya,GAAA,GAGA,IAAAA,GACAxc,EAAAG,SAAA4C,SAAAZ,EAAAlB,QACAjB,EAAAG,SAAA4C,SAAAZ,EAAAlB,MAAA,IAGAjB,EAAAG,SAAA4C,SAAAZ,EAAAlB,MAAAhC,kBAAAsL,GAEA,QAPA,KAYAiS,EAOA/c,EAAAO,UAAAuR,UAAA,oBAAA,SAAAxI,EAAA5G,EAAAqC,GACA,IAAAnC,EAAA,GACAkZ,EAAA,GACA9b,EAAAyC,KAAAsC,EAAA,SAAAS,EAAAvC,GAEA,IAAAia,GAAA,IAAAja,EAAA,GAAAoU,QAAA,KACApU,EAAA,KAAA,IAAAzD,kBAAAqc,cAAAxE,QAAApU,EAAA,IACAia,EAAApB,EAAA3W,QAAAlC,GAAAL,EAAAuC,QAAAlC,GAEAia,EAAApB,EAAArR,KAAAxH,GAAAL,EAAA6H,KAAAxH,KAKA,IAAAka,EAAAN,EAAAxc,KAAA,CAAAiJ,GAAA5G,EAAAE,GAGAwa,EAAA9X,MAAAsM,QAAAtI,GAAAA,EAAA,CAAAA,GACA+T,EAAAR,EAAAxc,KAAA+c,EAAA1a,EAAAoZ,GAEA,OAAAqB,GAAAE,GACA,IAMArd,EAAAO,UAAAuR,UAAA,0BAAA,SAAAxI,EAAA5G,EAAAqC,GAEA,GA1JAA,EA0JAA,EAzJAiY,GAAA,EACAhd,EAAAyC,KAAAsC,EAAA,SAAAS,EAAA6H,GACA2P,EAAAA,GAAA3P,EAAA,MAGA2P,GAoJA3c,KAAAwG,SAAAnE,GACA,MAAA,sBA3JA,IAAAqC,EACAiY,EA8JAzc,EAAAC,EADAqS,EAAAxS,KAAAsQ,cAAAjO,GASA,OANArC,KAAAK,SAAA4C,SAAAZ,EAAAlB,QACAnB,KAAAK,SAAA4C,SAAAZ,EAAAlB,MAAA,IAEAqR,EAAAC,gBAAAzS,KAAAK,SAAA4C,SAAAZ,EAAAlB,MAAAyb,wBACA5c,KAAAK,SAAA4C,SAAAZ,EAAAlB,MAAAyb,wBAAApK,EAAA/H,QAEAtL,kBAAA6c,QAAAiB,YAAAzK,EAAAjC,IAAAtH,IAAAuJ,EAAAjC,MAAAtH,EACAuJ,EAAAvQ,OAGAuQ,EAAAjC,IAAAtH,GACA/I,EAAAF,MACAkQ,aAAA7N,IAEAlC,EAAAR,EAAAO,EAAAoB,aAAA4b,kBACA9S,KAAA,CAAAjJ,KAAA,gBAAA8H,MAAA5G,EAAAlB,OACAhB,EAAAiK,KAAA,CAAAjJ,KAAA,6BAAA8H,MAAAvE,EA1LA,GAAA,GAAA,KA4LA/E,EAAA+S,KAAA0J,EAAAlc,EAAAmC,EAAAqC,EAAAvE,IACAgd,OAAA,SAAArK,EAAAsK,GACA,IAAA7S,EAAAE,EAAAlE,EAAAtE,EAEA,GAAA,UAAAmb,EACAnb,GAAA,EACA6Q,EAAA3T,kBAAA6c,QAAAqB,mBAAAvK,OACA,CAAA,GAAA,YAAAsK,EAGA,OAFAnb,GAAA,IAAA6Q,GAAA,SAAAA,EAKA5S,EAAAG,SAAA4C,SAAAZ,EAAAlB,MAAAyb,wBAAApK,EAAAC,gBAEAxQ,GACAsE,EAAArG,EAAAgB,cACAhB,EAAAgK,eAAA7H,GACAnC,EAAAgB,cAAAqF,EACArG,EAAAwK,YAAAN,KAAA/H,UACAnC,EAAA4G,QAAAzE,EAAAlB,MACAjB,EAAAoJ,eAEAiB,EAAA,GACAE,EAAAqI,GAAA5S,EAAA6N,eAAA1L,EAAA,UACAkI,EAAAlI,EAAAlB,MACAqR,EAAA/H,QACA,mBAAAA,EAAAA,EAAAxB,GAAAwB,EAAA,GACAvK,EAAA4G,QAAAzE,EAAAlB,OAAA,EACAjB,EAAAoJ,WAAAiB,IAEArK,EAAAoJ,WAAApJ,EAAAkJ,UACAoJ,EAAAvQ,MAAAA,EACA/B,EAAAiQ,YAAA9N,EAAAJ,KAGA,YACA,IAKAtC,EAAAO,UAAAuR,UAAA,+BAAA,SAAAxI,EAAA5G,EAAAqC,GAEA,IAAAxE,EAAAF,KACAwS,EAAAtS,EAAAoQ,cAAAjO,GAEAlC,EAAAR,EAAAO,EAAAoB,aAAA4b,iBAIA,OAHA/c,EAAAiK,KAAA,CAAAjJ,KAAA,4BAAA8H,MAAA,IAGAqU,KAAAC,UAAA/K,EAAAjC,OAAA+M,KAAAC,UAAApd,IACAqS,EAAAvQ,OACA/B,EAAAoJ,WAAAkJ,EAAAjI,QAAA,IAGAiI,EAAAvQ,QAGAuQ,EAAAjC,IAAApQ,EACAH,KAAAkQ,aAAA7N,GAEA1C,EAAA+S,KAAA0J,EAAAlc,EAAAmC,EAAAqC,EAAAvE,IACAgd,OAAA,SAAArK,EAAAsK,GACA,IAAA7S,EAAA,GACAtI,EAAA,YAAAmb,KAAA,IAAAtK,GAAA,SAAAA,GAEA7Q,GACA/B,EAAAiM,iBACAjM,EAAAoK,OAAApK,EAAAkG,UAAA/D,KAEA1C,EAAAyC,KAAA0Q,EAAA,SAAA0K,EAAAC,GACA,IAAA/X,EAAAvG,kBAAA6c,QAAA7U,WAAAjH,EAAAsd,GAAA,GACA9X,IACA6E,EAAA7E,EAAAvE,MAAAhC,kBAAA6c,QAAA0B,OAAAD,EAAA,IAAA,OAMA9d,EAAAge,cAAApT,KACAtI,GAAA,IAIAuQ,EAAAvQ,MAAAA,EACAuQ,EAAAjI,OAAAA,EACArK,EAAAoJ,WAAAiB,GACArK,EAAAiQ,YAAA9N,EAAAJ,KAGA,YACA,MAIAtC,EAAA,WACAR,kBAAAoF,SG7XA,wBAEA,IAAAqZ,EAAA,CAEAC,iDAIA,SAAAte,GAIAA,EAAAC,QAAA,SAAAse,GASA,IAKAtI,EALAuI,EAAA,GACAC,EAAArZ,UAAA1E,OACAge,EAAA,GACA9Y,EAAA,EACA+Y,EAAA,GAGAC,EAAA,IAAAF,KAAAH,EAEA,IAAA3Y,EAAA,EAAAA,EAAA6Y,EAAA7Y,IAAA,CAEA,IAAA+Y,KADA1I,EAAA7Q,UAAAQ,GAEA,GAAAqQ,EAAA0I,KAAAJ,EAAAG,GAEA,SAAAE,EAGAJ,EAAAE,GAAAH,EAAAG,GAIA,OAAAF,IAMAK,mDAIA,SAAA7e,GAIA,IAAA8e,EAAA,UACAC,EAAA,UACAC,EAAA,gCACAC,EAAA,sBACAC,EAAA,qBACAC,EAAA,mBACAC,EAAA,gBACAC,EAAA,eACAC,EAAA,mBACAC,EAAA,kBACAC,EAAA,kBAEAC,EAAA,2DACAC,EAAA,8BACAC,EAAAF,EAAA,IAAAC,EAAA,aAEAE,EAAA,qFACAC,EAAA,0BACAC,EAAA,8EAAAH,EAEAI,EAAA,eAEAC,EAAA,aAEAC,EAAA,mBACAC,EAAA,kBACAC,EAAA,0CACAC,EAAA,4BAEAC,EAAA,wFACAC,EAAA,oDAEAC,EAAA,IAAAF,EAAA,IAAAC,EAAA,iCAEAE,EAAA,kBAAAvB,EAAA,KAAAG,EAAA,KAKAqB,EAAAF,EAAA,YAAAJ,EAAA,kBAEA,SAAAO,EAAApJ,EAAAqJ,GAGA,OAFAA,EAAAA,GAAAA,EAAAxS,eAGA,IAAA,IACAmJ,GAAA,KAAAA,GAAA,GAAA,EACA,MACA,IAAA,IACAA,GAAA,KAAAA,EAAA,GAAA,EAIA,OAAAA,EAGA,SAAAsJ,EAAAC,GACA,IAAA1J,GAAA0J,EAMA,OAJAA,EAAAngB,OAAA,GAAAyW,EAAA,MACAA,GAAAA,EAAA,GAAA,IAAA,MAGAA,EAGA,SAAA2J,EAAAC,GACA,MAAA,CACAC,IAAA,EACAC,QAAA,EACArb,EAAA,EACAsb,IAAA,EACAC,SAAA,EACAC,GAAA,EACAC,IAAA,EACAC,MAAA,EACAC,IAAA,EACAC,IAAA,EACAC,MAAA,EACAC,GAAA,EACAC,IAAA,EACAjX,EAAA,EACAkX,IAAA,EACAC,KAAA,EACAC,GAAA,EACAC,IAAA,EACAC,KAAA,EACAC,IAAA,EACAC,IAAA,EACAC,OAAA,EACAC,KAAA,EACAC,IAAA,EACAC,KAAA,EACAC,UAAA,EACAC,GAAA,EACAC,IAAA,EACAC,QAAA,EACAC,EAAA,EACAC,IAAA,GACAC,SAAA,GACAC,GAAA,GACAC,IAAA,GACAC,SAAA,GACAC,IAAA,IACAlC,EAAA5S,eAGA,SAAA+U,EAAAC,EAAA,GACA,IAAAC,EAAA,EAAAhe,UAAA1E,aAAAY,IADA,EAAA,EACA,EAmBA,MAjBA,CACA+hB,IAAA,EACAC,OAAA,EACAC,IAAA,EACAC,QAAA,EACAC,IAAA,EACAC,UAAA,EACAC,IAAA,EACAC,SAAA,EACAC,IAAA,EACAC,OAAA,EACAC,IAAA,EACAC,SAAA,EACAC,IAAA,EACAC,OAAA,GAGAf,EAAAhV,gBAAAiV,EAoCA,SAAAe,EAAAC,EAAAC,GAIA,KAFAD,EAAAA,GAAAA,EAAAnU,MADA,sCAIA,OAAAoU,EAGA,IAAAC,EAAA,MAAAF,EAAA,IAAA,EAAA,EACAG,GAAAH,EAAA,GACAI,GAAAJ,EAAA,GAQA,OANAA,EAAA,IAAAA,EAAA,KACAI,EAAAhS,KAAAuC,MAAAwP,EAAA,KACAA,EAAA/R,KAAAuC,MAAAwP,EAAA,MAIAD,GAAA,GAAAC,EAAAC,GAAA,GAIA,IAAAC,EAAA,CACAC,KAAA,MACAC,KAAA,MACAC,MAAA,KACAC,KAAA,MACAC,KAAA,MACAC,KAAA,KACAC,MAAA,MACAC,MAAA,KACAC,MAAA,MACAC,MAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,KACAC,KAAA,KACAC,KAAA,MACAC,IAAA,KACAC,KAAA,MACAC,IAAA,KACAC,MAAA,MACAC,KAAA,KACAC,KAAA,MACAC,KAAA,KACAC,IAAA,KACAC,KAAA,MACAC,KAAA,KACAC,KAAA,MACAC,KAAA,KACAC,KAAA,KACAC,KAAA,KACAC,IAAA,MACAC,MAAA,MACAC,KAAA,MACAC,KAAA,MACAC,IAAA,KACAC,KAAA,MACAC,KAAA,MACAC,KAAA,KACAC,KAAA,MACAC,MAAA,MACApO,KAAA,KACAqO,IAAA,MACAC,IAAA,EACAC,IAAA,KACAC,KAAA,MACAC,KAAA,MACAC,IAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,KACAC,KAAA,MACAC,KAAA,MACAC,IAAA,MACAC,IAAA,MACAC,IAAA,KACAC,IAAA,KACAC,IAAA,KACAC,IAAA,MACAC,IAAA,KACAC,IAAA,KACAC,IAAA,MACAC,IAAA,KACAC,MAAA,KACAC,KAAA,MACAC,KAAA,MACAC,KAAA,KACAC,IAAA,KACAC,IAAA,KACAC,KAAA,MACAC,IAAA,MACAC,IAAA,MACAC,KAAA,MACAC,KAAA,MACAC,MAAA,KACAC,KAAA,KACAC,KAAA,IACAC,KAAA,MACAC,KAAA,IACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,MAAA,MACAC,KAAA,MACAC,KAAA,MACAC,IAAA,KACAC,KAAA,MACAC,KAAA,MACAC,MAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,IAAA,KACAC,KAAA,KACAC,MAAA,MACAC,MAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,IAAA,MACAC,IAAA,EACAC,IAAA,EACAC,KAAA,KACAC,IAAA,KACAC,KAAA,KACAC,KAAA,KACAC,IAAA,EACAC,IAAA,MACAC,KAAA,MACAC,IAAA,MACAC,IAAA,KACAC,MAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACAC,KAAA,MACApnB,EAAA,KACAiV,EAAA,KACAgC,EAAA,MACA1C,EAAA,MACA5M,EAAA,KACA0f,EAAA,MACAtR,EAAA,MACAE,EAAA,MACAhV,EAAA,MACA+Y,EAAA,KACApF,EAAA,MACAlL,EAAA,MACAxI,GAAA,KACAoU,GAAA,KACAgS,GAAA,MACAC,GAAA,MACArQ,GAAA,KACA9C,GAAA,MACAD,GAAA,MACAiC,GAAA,MACArQ,GAAA,MACA2O,GAAA,KACAsJ,GAAA,MACAzI,GAAA,MACAR,EAAA,GAGAyS,EAAA,CACAC,UAAA,CACAC,MAAA,cACAzqB,KAAA,YACA0qB,SAAA,WAEA,QADA7rB,KAAA8rB,GACA9rB,KAAA+rB,cAIAC,IAAA,CACAJ,MAAA,QACAzqB,KAAA,OAIA8qB,KAAA,CACAL,MAAA,SACAzqB,KAAA,OACA0qB,SAAA,WACA,OAAA7rB,KAAA+rB,aAAA/rB,KAAAksB,KAAA,GAAA,EAAA,EAAA,KAIAC,gBAAA,CACAP,MAAA,qBACAzqB,KAAA,mBACA0qB,SAAA,WACA,OAAA7rB,KAAA+rB,cAIAK,SAAA,CACAR,MAAA,aACAzqB,KAAA,WACA0qB,SAAA,WAEA,OADA7rB,KAAA8rB,IAAA,EACA9rB,KAAA+rB,cAIAM,UAAA,CACAT,MAAA,aACAzqB,KAAA,YACA0qB,SAAA,SAAArc,EAAA6c,GAOA,OANArsB,KAAA2J,KAAA0iB,EACArsB,KAAAyZ,EAAA,KACAzZ,KAAA4N,EAAA,EACA5N,KAAAyY,EAAA,EACAzY,KAAAssB,MAAA,EAEAtsB,KAAA+rB,aAAA/rB,KAAAusB,KAAA,KAIAC,eAAA,CACAZ,MAAA,wBACAzqB,KAAA,yBACA0qB,SAAA,SAAArc,EAAAoH,GACA,UAAAA,EAAAlJ,cACA1N,KAAAysB,sBAAA,EAEAzsB,KAAAysB,uBAAA,IAKAC,cAAA,CACAd,MAAAvmB,OAAA,oBAAAmZ,EAAAF,EAAAC,EAAA,IAAA,KACApd,KAAA,mBACA0qB,SAAA,SAAArc,EAAAmd,EAAA7I,EAAA5D,GACA,IACArJ,GAAAiN,EACA8I,EAAA,GASA,MAXA,SAAAD,EAAAjf,kBAKAmJ,EACA+V,EAAA,IAGA/V,EAAAoJ,EAAApJ,EAAAqJ,GAEAlgB,KAAA+rB,aAAA/rB,KAAAksB,KAAArV,EAAA+V,EAAA,EAAA,KAIAC,UAAA,CACAjB,MAAAvmB,OAAA,KAAA8Z,EAAA,IAAAC,EAAA,IAAAf,EAAA,IAAAW,EAAA,IAAAC,EAAA,IAAAZ,EAAA,KAAA,KACAld,KAAA,aAIA2rB,UAAA,CACAlB,MAAAvmB,OAAA,IAAAqZ,EAAA,IAAAE,EAAA,IAAAE,EAAA,eAAAP,EAAA,KACApd,KAAA,YACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,EAAAG,EAAAC,EAAA9M,GACA,OAAAlgB,KAAAksB,KAAAjM,GAAApJ,EAAAqJ,IAAA0M,GAAAG,GAAAC,EAAAvgB,OAAA,EAAA,MAIAwgB,WAAA,CACArB,MAAAvmB,OAAA,IAAAqZ,EAAA,OAAAC,EAAA,OAAAG,EAAAR,EAAAC,EAAA,KACApd,KAAA,aACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,EAAAG,EAAA7M,GACA,OAAAlgB,KAAAksB,KAAAjM,GAAApJ,EAAAqJ,IAAA0M,GAAAG,EAAA,KAIAG,YAAA,CACAtB,MAAAvmB,OAAA,IAAAqZ,EAAA,OAAAE,EAAAN,EAAAC,EAAA,KACApd,KAAA,cACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,EAAA1M,GACA,OAAAlgB,KAAAksB,KAAAjM,GAAApJ,EAAAqJ,IAAA0M,EAAA,EAAA,KAIAO,WAAA,CACAvB,MAAAvmB,OAAA,IAAAqZ,EAAAJ,EAAAC,EAAA,KACApd,KAAA,aACA0qB,SAAA,SAAArc,EAAAqH,EAAAqJ,GACA,OAAAlgB,KAAAksB,KAAAjM,GAAApJ,EAAAqJ,GAAA,EAAA,EAAA,KAIAkN,KAAA,CACAxB,MAAAvmB,OAAA,IAAAka,EAAA,IAAAE,EAAA,IAAAE,EAAA,IAAAlB,EAAA,IAAAG,EAAA,IAAAE,EAAAC,EAAAgB,EAAA,IAAA,KACA5e,KAAA,OACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,EAAAC,EAAA+V,EAAAG,EAAAC,EAAAK,GACA,OAAArtB,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,GAAAC,EAAAvgB,OAAA,EAAA,KAAAzM,KAAAusB,KAAA7I,EAAA2J,MAIAE,KAAA,CACA3B,MAAAvmB,OAAA,IAAAka,EAAA,IAAAC,EAAA,IAAAE,EAAA,IAAAlB,EAAA,IAAAG,EAAA,IAAAE,GACA1d,KAAA,OACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,EAAAC,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAS,KAAA,CACA5B,MAAAvmB,OAAA,IAAAka,EAAA,IAAAE,EAAA,IAAAE,EAAA,IAAAlB,EAAA,IAAAG,EAAA,IAAAE,EAAA,KACA3d,KAAA,OACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,EAAAC,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAU,OAAA,CACA7B,MAAAvmB,OAAA,IAAAka,EAAAE,EAAAE,EAAA,IAAAnB,EAAA,IAAAI,EAAA,IAAAE,GACA3d,KAAA,SACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,EAAAC,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAW,cAAA,CACA9B,MAAAvmB,OAAA,IAAAka,EAAAE,EAAAE,EAAA,OAAAnB,EAAAI,EAAAE,GACA3d,KAAA,gBACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,EAAAC,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAY,IAAA,CACA/B,MAAAvmB,OAAA,IAAAqa,EAAA,KAAAG,EAAA,KAAAN,EAAA,IAAAd,EAAA,IAAAG,EAAA,IAAAE,EAAAT,EAAA0B,EAAA,KACA5e,KAAA,MACA0qB,SAAA,SAAArc,EAAAoH,EAAAD,EAAAD,EAAAG,EAAA+V,EAAAG,EAAAM,GACA,OAAArtB,KAAAstB,KAAA5W,EAAA2J,EAAA1J,IAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,IAAA/sB,KAAAusB,KAAA7I,EAAA2J,MAIAO,YAAA,CACAhC,MAAAvmB,OAAA,MAAAmZ,EAAA,OAAAG,EAAA,OAAAE,EAAAE,EAAA,KACA5d,KAAA,cACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,EAAAG,EAAAC,GACA,OAAAhtB,KAAAksB,MAAArV,GAAA+V,GAAAG,GAAAC,EAAAvgB,OAAA,EAAA,MAIAohB,YAAA,CACAjC,MAAAvmB,OAAA,IAAAya,EAAA,YAAAJ,EAAA,kBAAAJ,EAAA,KACAne,KAAA,cACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAF,GACA,OAAA1W,KAAAstB,IAAAnN,EAAAzJ,GAAA2J,EAAA1J,IAAAC,KAIAkX,aAAA,CACAlC,MAAAvmB,OAAA,IAAAqa,EAAA,UAAAF,EAAA,OAAAD,GACApe,KAAA,eACA0qB,SAAA,SAAArc,EAAAoH,EAAAD,EAAAD,GACA,OAAA1W,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,KAIAmX,aAAA,CACAnC,MAAAvmB,OAAA,IAAAqa,EAAA,SAAAF,EAAA,iBACAre,KAAA,eACA0qB,SAAA,SAAArc,EAAAoH,EAAAD,EAAAD,GACA,OAAA1W,KAAAstB,IAAAnN,EAAAzJ,GAAAC,EAAA,GAAAC,KAIAoX,WAAA,CACApC,MAAAvmB,OAAA,MAAAmZ,EAAA,OAAAG,EAAA,OAAAE,GACA1d,KAAA,aACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAkB,YAAA,CACArC,MAAAvmB,OAAA,IAAAka,EAAAE,EAAAE,GACAxe,KAAA,cACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,GACA,OAAA5W,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,KAIAsX,QAAA,CACAtC,MAAAvmB,OAAA,IAAAka,EAAA,gEACApe,KAAA,UACA0qB,SAAA,SAAArc,EAAAkH,EAAAE,GACA,OAAA5W,KAAAstB,KAAA5W,EAAA,GAAAE,KAIAuX,YAAA,CACAvC,MAAAvmB,OAAA,MAAAmZ,EAAA,OAAAG,EAAA,KACAxd,KAAA,cACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,GACA,OAAA5sB,KAAAksB,MAAArV,GAAA+V,EAAA,EAAA,KAIAwB,eAAA,CACAxC,MAAAvmB,OAAA,MAAAoZ,EAAAG,EAAAE,EAAA,KACA3d,KAAA,iBACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAsB,iBAAA,CAIAzC,MAAAvmB,OAAA,IAAAka,EAAA,IAAAE,EAAA,IAAAE,EAAA,KACAxe,KAAA,mBACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,GACA,OAAA5W,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,KAIA0X,UAAA,CACA1C,MAAAvmB,OAAA,IAAAka,EAAA,IAAAC,EAAA,IAAAE,GACAve,KAAA,YACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,GACA,OAAA5W,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,KAIA2X,SAAA,CACA3C,MAAAvmB,OAAA,IAAAma,EAAA,IAAAE,EAAA,IAAAJ,GACAne,KAAA,WACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAF,GACA,OAAA1W,KAAAstB,IAAAnN,EAAAzJ,GAAAC,EAAA,GAAAC,KAIA4X,cAAA,CACA5C,MAAAvmB,OAAA,IAAAma,EAAA,IAAAE,GACAve,KAAA,gBACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,GACA,OAAA5W,KAAAstB,IAAAttB,KAAAyZ,EAAA9C,EAAA,GAAAC,KAIA6X,2BAAA,CAEA7C,MAAAvmB,OAAA,IAAAia,EAAA,IAAAE,EAAA,IAAAE,GACAve,KAAA,8BACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,GACA,OAAA5W,KAAAstB,IAAAnN,EAAAzJ,GAAAC,EAAA,GAAAC,KAIA8X,aAAA,CACA9C,MAAAvmB,OAAA,oBAAAoa,EAAA,IAAAE,GACAxe,KAAA,eACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,GACA,OAAA5W,KAAAstB,KAAA5W,EAAAC,EAAA,GAAAC,KAIA+X,WAAA,CACA/C,MAAAvmB,OAAA,MAAAoZ,EAAAG,EAAA,KACAzd,KAAA,aACA0qB,SAAA,SAAArc,EAAAqH,EAAA+V,GAGA,OAAA5sB,KAAA4uB,OACA,KAAA,EACA,OAAA5uB,KAAAksB,MAAArV,GAAA+V,EAAA,EAAA5sB,KAAAurB,GACA,KAAA,EAIA,OAHAvrB,KAAAyZ,EAAA,IAAA5C,IAAA+V,EACA5sB,KAAA4uB,SAEA,EACA,QACA,OAAA,KAKAC,eAAA,CACAjD,MAAAvmB,OAAA,IAAAka,EAAA,IAAAC,GACAre,KAAA,iBACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,GACA,OAAA3W,KAAAstB,KAAA5W,EAAAC,EAAA,EAAA,KAIAmY,cAAA,CAGAlD,MAAAvmB,OAAA,gCAAAwa,EAAA,KAAAF,EAAA,KACAxe,KAAA,gBACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,EAAAC,GACA,OAAA5W,KAAAstB,IAAAnN,EAAAzJ,GAAA2J,EAAA1J,IAAAC,KAIAmY,SAAA,CACAnD,MAAAvmB,OAAA,IAAAqa,EAAA,YAAAI,EAAA,YAAAR,EAAA,KACAne,KAAA,WACA0qB,SAAA,SAAArc,EAAAoH,EAAAD,EAAAD,GACA,OAAA1W,KAAAstB,IAAAnN,EAAAzJ,GAAA2J,EAAA1J,IAAAC,KAIAoY,UAAA,CACApD,MAAAvmB,OAAA,IAAAya,EAAA,YAAAP,EAAA,KACApe,KAAA,YACA0qB,SAAA,SAAArc,EAAAmH,EAAAD,GACA,OAAA1W,KAAAstB,KAAA5W,EAAA2J,EAAA1J,GAAA,KAIAsY,aAAA,CACArD,MAAAvmB,OAAA,IAAAka,EAAA,YAAAO,EAAA,KACA3e,KAAA,eACA0qB,SAAA,SAAArc,EAAAkH,EAAAC,GACA,OAAA3W,KAAAstB,KAAA5W,EAAA2J,EAAA1J,GAAA,KAIAuY,YAAA,CACAtD,MAAAvmB,OAAA,KAAAwa,EAAA,KAAAF,EAAA,IAAAL,EAAA,KACAne,KAAA,cACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAF,GACA,OAAA1W,KAAAstB,IAAAnN,EAAAzJ,GAAA2J,EAAA1J,IAAAC,KAIAuY,WAAA,CACAvD,MAAAvmB,OAAA,IAAA2a,EAAA,KACA7e,KAAA,aACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,GACA,OAAA5W,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,IAAAC,KAIAwY,cAAA,CACAxD,MAAAvmB,OAAA,IAAAqa,EAAA,YAAAI,EAAA,KACA3e,KAAA,gBACA0qB,SAAA,SAAArc,EAAAoH,EAAAD,GACA,OAAA3W,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,IAAAC,KAIAyY,WAAA,CACAzD,MAAAvmB,OAAA,IAAAka,EAAA,+CACApe,KAAA,uBACA0qB,SAAA,SAAArc,EAAAkH,EAAA4Y,EAAA1Y,GAGA,GAFAA,EAAAA,GAAAA,EAAA,GAEA5W,KAAAstB,KAAA5W,EAAA,EAAA,GACA,OAAA,EAIA,IAGA6Y,EAAA,GAAA,GAHAA,EAAA,IAAA7d,KAAA1R,KAAAyZ,EAAAzZ,KAAA4N,EAAA5N,KAAAyY,GAAAO,UAGAuW,EAAA,EAAAA,GAEAvvB,KAAA8rB,IAAAyD,EAAA,GAAAD,EAAA,GAAA1Y,IAIA4Y,aAAA,CACA5D,MAAAvmB,OAAA,KAAA8Z,EAAA,IAAAC,EAAA,IAAAf,EAAA,IAAAgB,EAAA,IAAA,KACAle,KAAA,eACA0qB,SAAA,SAAArc,EAAAigB,EAAAC,GAGA,IAzkBAC,EAykBAC,EAvkBA,CACAC,OA3BA,CACAC,MAAA,EACAtd,UAAA,EACAxS,KAAA,EACA+vB,MAAA,EACAC,KAAA,EACAjD,OAAA,EACAkD,MAAA,EACAC,OAAA,EACAC,MAAA,EACAC,MAAA,EACAC,QAAA,EACAC,MAAA,EACAC,OAAA,EACAC,MAAA,EACAC,MAAA,GACAC,SAAA,GACAC,QAAA,IAOAhB,EAykBAF,EAzkBA/hB,eAIAkjB,SARA,CACA5wB,KAAA,GAOA2vB,IAAA,GAskBAE,EAAAD,EAAAC,OAGA,OAAAH,EAAAhiB,eACA,IAAA,MACA,IAAA,OACA,IAAA,SACA,IAAA,UACA1N,KAAA2J,IAAAkmB,EACA,MACA,IAAA,MACA,IAAA,OACA,IAAA,SACA,IAAA,UACA7vB,KAAA6wB,IAAAhB,EACA,MACA,IAAA,OACA,IAAA,QACA7vB,KAAA8wB,IAAAjB,EACA,MACA,IAAA,MACA,IAAA,OACA7vB,KAAA8rB,IAAA+D,EACA,MACA,IAAA,YACA,IAAA,aACA,IAAA,aACA,IAAA,cACA7vB,KAAA8rB,IAAA,GAAA+D,EACA,MACA,IAAA,OACA,IAAA,QACA7vB,KAAA8rB,IAAA,EAAA+D,EACA,MACA,IAAA,QACA,IAAA,SACA7vB,KAAA+wB,IAAAlB,EACA,MACA,IAAA,OACA,IAAA,QACA7vB,KAAAgxB,IAAAnB,EACA,MACA,IAAA,MAAA,IAAA,SACA,IAAA,MAAA,IAAA,UACA,IAAA,MAAA,IAAA,YACA,IAAA,MAAA,IAAA,WACA,IAAA,MAAA,IAAA,SACA,IAAA,MAAA,IAAA,WACA,IAAA,MAAA,IAAA,SACA7vB,KAAA+rB,YACA/rB,KAAAixB,QAAAxO,EAAAiN,EAAA,GACA1vB,KAAAkxB,gBAAA,EACAlxB,KAAA8rB,IAAA,GAAA,EAAA+D,EAAAA,EAAA,EAAAA,MAUAsB,SAAA,CACAvF,MAAAvmB,OAAA,wBAAAiZ,EAAA,IAAAe,EAAA,SAAA,KACAle,KAAA,WACA0qB,SAAA,SAAArc,EAAA4hB,EAAA3B,EAAAC,GACA,IAAA2B,EAAAD,EAAAvtB,QAAA,QAAA,IAAA5D,OAEA4vB,EAAAJ,EAAA1d,KAAAE,KAAA,EAAAof,GAEA,OAAA3B,EAAAhiB,eACA,IAAA,MACA,IAAA,OACA,IAAA,SACA,IAAA,UACA1N,KAAA2J,IAAAkmB,EACA,MACA,IAAA,MACA,IAAA,OACA,IAAA,SACA,IAAA,UACA7vB,KAAA6wB,IAAAhB,EACA,MACA,IAAA,OACA,IAAA,QACA7vB,KAAA8wB,IAAAjB,EACA,MACA,IAAA,MACA,IAAA,OACA7vB,KAAA8rB,IAAA+D,EACA,MACA,IAAA,YACA,IAAA,aACA,IAAA,aACA,IAAA,cACA7vB,KAAA8rB,IAAA,GAAA+D,EACA,MACA,IAAA,OACA,IAAA,QACA7vB,KAAA8rB,IAAA,EAAA+D,EACA,MACA,IAAA,QACA,IAAA,SACA7vB,KAAA+wB,IAAAlB,EACA,MACA,IAAA,OACA,IAAA,QACA7vB,KAAAgxB,IAAAnB,EACA,MACA,IAAA,MAAA,IAAA,SACA,IAAA,MAAA,IAAA,UACA,IAAA,MAAA,IAAA,YACA,IAAA,MAAA,IAAA,WACA,IAAA,MAAA,IAAA,SACA,IAAA,MAAA,IAAA,WACA,IAAA,MAAA,IAAA,SACA7vB,KAAA+rB,YACA/rB,KAAAixB,QAAAxO,EAAAiN,EAAA,GACA1vB,KAAAkxB,gBAAA,EACAlxB,KAAA8rB,IAAA,GAAA,EAAA+D,EAAAA,EAAA,EAAAA,MAUAyB,QAAA,CACA1F,MAAAvmB,OAAA,KAAA6Z,EAAA,IAAA,KACA/d,KAAA,UACA0qB,SAAA,SAAArc,EAAA8hB,GACAtxB,KAAA+rB,YACA/rB,KAAAixB,QAAAxO,EAAA6O,EAAA,GAEA,IAAAtxB,KAAAkxB,kBACAlxB,KAAAkxB,gBAAA,KAKAK,iBAAA,CACA3F,MAAAvmB,OAAA,KAAA+Z,EAAA,IAAAf,EAAA,OAAA,KACAld,KAAA,mBACA0qB,SAAA,SAAArc,EAAAgiB,GAGA,OAFAxxB,KAAAkxB,gBAAA,EAEAM,EAAA9jB,eACA,IAAA,OACA1N,KAAA8rB,IAAA,EACA,MACA,IAAA,OACA9rB,KAAA8rB,IAAA,EACA,MACA,IAAA,OACA,IAAA,WACA9rB,KAAA8rB,IAAA,EAIA7a,MAAAjR,KAAAixB,WACAjxB,KAAAixB,QAAA,KAKAQ,qBAAA,CACA7F,MAAAvmB,OAAA,KAAAua,EAAA,IAAAC,EAAA,IAAA,KACA1e,KAAA,wBACA0qB,SAAA,SAAArc,EAAAmH,GACA,OAAA3W,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,GAAA3W,KAAAyY,KAIA4U,aAAA,CACAzB,MAAAvmB,OAAA,IAAA0a,EAAA,KACA5e,KAAA,eACA0qB,SAAA,SAAAwB,GACA,OAAArtB,KAAAusB,KAAA7I,EAAA2J,MAIAqE,OAAA,CACA9F,MAAAvmB,OAAA,4BACAlE,KAAA,SACA0qB,SAAA,SAAArc,EAAAmiB,GACA,IAAAC,EAAA5N,EAAA2N,EAAAjkB,eAEA,OAAAuD,MAAA2gB,IAIA5xB,KAAAusB,KAAAqF,KAIAC,IAAA,CACAjG,MAAA,QACAzqB,KAAA,MACA0qB,SAAA,WACA7rB,KAAAgxB,IAAAhxB,KAAAgxB,GACAhxB,KAAA+wB,IAAA/wB,KAAA+wB,GACA/wB,KAAA8rB,IAAA9rB,KAAA8rB,GACA9rB,KAAA8wB,IAAA9wB,KAAA8wB,GACA9wB,KAAA6wB,IAAA7wB,KAAA6wB,GACA7wB,KAAA2J,IAAA3J,KAAA2J,GACA3J,KAAA8xB,IAAA9xB,KAAA8xB,KAIAC,MAAA,CACAnG,MAAAvmB,OAAA,IAAAka,GACApe,KAAA,QACA0qB,SAAA,SAAArc,EAAAkH,GAEA,OADA1W,KAAAyZ,GAAA/C,GACA,IAIAsb,WAAA,CACApG,MAAA,YACAzqB,KAAA,cAIA8wB,sBAAA,CACArG,MAAAvmB,OAAA,IAAA2a,EAAA,KAAAxB,EAAA,OAAAG,EAAA,OAAAE,EAAA,KACA1d,KAAA,wBACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAC,EAAA+V,EAAAG,GACA,OAAA/sB,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,IAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,GAAAG,EAAA,KAIAmF,wBAAA,CACAtG,MAAAvmB,OAAA,IAAA2a,EAAAtB,EAAA,OAAAC,EAAA,OAAAG,EAAAR,EAAAC,EAAA,KACApd,KAAA,0BACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAC,EAAA+V,EAAAG,EAAA7M,GACA,OAAAlgB,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,IAAAC,IAAA5W,KAAAksB,KAAAjM,GAAApJ,EAAAqJ,IAAA0M,GAAAG,EAAA,KAIAoF,uBAAA,CACAvG,MAAAvmB,OAAA,IAAA2a,EAAA,KAAAxB,EAAA,OAAAG,EAAA,KACAxd,KAAA,yBACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAC,EAAA+V,GACA,OAAA5sB,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,IAAAC,IAAA5W,KAAAksB,MAAArV,GAAA+V,EAAA,EAAA,KAIAwF,yBAAA,CACAxG,MAAAvmB,OAAA,IAAA2a,EAAAtB,EAAA,OAAAE,EAAAN,EAAAC,EAAA,KACApd,KAAA,2BACA0qB,SAAA,SAAArc,EAAAmH,EAAAC,EAAAC,EAAA+V,EAAA1M,GACA,OAAAlgB,KAAAstB,IAAAttB,KAAAyZ,EAAA4G,EAAA1J,IAAAC,IAAA5W,KAAAksB,KAAAjM,GAAApJ,EAAAqJ,IAAA0M,EAAA,EAAA,MAKAyF,EAAA,CAEA5Y,EAAA6Y,IACA1kB,EAAA0kB,IACA7Z,EAAA6Z,IAEAnY,EAAAmY,IACAntB,EAAAmtB,IACAha,EAAAga,IACA/G,EAAA+G,IAGAtB,GAAA,EACAD,GAAA,EACAjF,GAAA,EACAgF,GAAA,EACAD,GAAA,EACAlnB,GAAA,EACAmoB,GAAA,EAGAb,QAAAqB,IACApB,gBAAA,EAIAzE,sBAAA,EAGAxT,EAAAqZ,IAGAhG,MAAA,EACAsC,MAAA,EACA2D,MAAA,EAGAjF,IAAA,SAAA7T,EAAA7L,EAAA6K,GACA,QAAA,EAAAzY,KAAAssB,SAIAtsB,KAAAssB,QACAtsB,KAAAyZ,EAAAA,EACAzZ,KAAA4N,EAAAA,EACA5N,KAAAyY,EAAAA,GACA,IAEAyT,KAAA,SAAA/R,EAAAhV,EAAAmT,EAAAiT,GACA,QAAA,EAAAvrB,KAAA4uB,SAIA5uB,KAAA4uB,QACA5uB,KAAAma,EAAAA,EACAna,KAAAmF,EAAAA,EACAnF,KAAAsY,EAAAA,EACAtY,KAAAurB,EAAAA,GAEA,IAEAQ,UAAA,WAOA,OANA/rB,KAAAma,EAAA,EACAna,KAAAmF,EAAA,EACAnF,KAAAsY,EAAA,EACAtY,KAAAurB,EAAA,IACAvrB,KAAA4uB,MAAA,IAIArC,KAAA,SAAAxI,GACA,OAAA/jB,KAAAuyB,OAAA,IACAvyB,KAAAuyB,QACAvyB,KAAAiZ,EAAA8K,GACA,IAKAyO,OAAA,SAAAC,GAmCA,OAlCAzyB,KAAAssB,QAAAtsB,KAAA4uB,QACA5uB,KAAAma,EAAAna,KAAAmF,EAAAnF,KAAAsY,EAAAtY,KAAAurB,EAAA,GAIAta,MAAAjR,KAAAyZ,KACAzZ,KAAAyZ,EAAAgZ,EAAA5a,eAGA5G,MAAAjR,KAAA4N,KACA5N,KAAA4N,EAAA6kB,EAAA/c,YAGAzE,MAAAjR,KAAAyY,KACAzY,KAAAyY,EAAAga,EAAA5Z,WAGA5H,MAAAjR,KAAAma,KACAna,KAAAma,EAAAsY,EAAAvY,YAGAjJ,MAAAjR,KAAAmF,KACAnF,KAAAmF,EAAAstB,EAAArY,cAGAnJ,MAAAjR,KAAAsY,KACAtY,KAAAsY,EAAAma,EAAApY,cAGApJ,MAAAjR,KAAAurB,KACAvrB,KAAAurB,EAAAkH,EAAAlY,mBAIAva,KAAAysB,uBACA,KAAA,EACAzsB,KAAAyY,EAAA,EACA,MACA,KAAA,EACAzY,KAAAyY,EAAA,EACAzY,KAAA4N,GAAA,EAIA,IACAnG,EAIAirB,EAgBAC,EArBA1hB,MAAAjR,KAAAixB,YACAxpB,EAAA,IAAAiK,KAAA+gB,EAAAnX,YACAxD,YAAA9X,KAAAyZ,EAAAzZ,KAAA4N,EAAA5N,KAAAyY,GACAhR,EAAAsQ,SAAA/X,KAAAma,EAAAna,KAAAmF,EAAAnF,KAAAsY,EAAAtY,KAAAurB,GAEAmH,EAAAjrB,EAAAuR,SAEA,IAAAhZ,KAAAkxB,iBAEA,IAAAwB,GAAA,IAAA1yB,KAAAixB,UACAjxB,KAAAixB,SAAA,GAIA,IAAAjxB,KAAAixB,SAAA,IAAAyB,IACA1yB,KAAAixB,QAAA,GAGAjxB,KAAAyY,GAAAia,EACA1yB,KAAAyY,GAAAzY,KAAAixB,UAEA0B,EAAA3yB,KAAAixB,QAAAyB,GAGA1yB,KAAA8rB,GAAA,GAAA6G,EAAA,GAAA,GAAA3yB,KAAA8rB,IAAA6G,IAAA3yB,KAAAkxB,mBACAyB,GAAA,GAGA,GAAA3yB,KAAAixB,QACAjxB,KAAAyY,GAAAka,EAEA3yB,KAAAyY,GAAA,GAAA1G,KAAA+I,IAAA9a,KAAAixB,SAAAyB,GAGA1yB,KAAAixB,QAAAqB,MAKAtyB,KAAAyZ,GAAAzZ,KAAAgxB,GACAhxB,KAAA4N,GAAA5N,KAAA+wB,GACA/wB,KAAAyY,GAAAzY,KAAA8rB,GAEA9rB,KAAAma,GAAAna,KAAA8wB,GACA9wB,KAAAmF,GAAAnF,KAAA6wB,GACA7wB,KAAAsY,GAAAtY,KAAA2J,GACA3J,KAAAurB,GAAAvrB,KAAA8xB,GAEA9xB,KAAAgxB,GAAAhxB,KAAA+wB,GAAA/wB,KAAA8rB,GAAA,EACA9rB,KAAA8wB,GAAA9wB,KAAA6wB,GAAA7wB,KAAA2J,GAAA3J,KAAA8xB,GAAA,EAEA,IAAA9wB,EAAA,IAAA0Q,KAAA+gB,EAAAnX,WAWA,OARAta,EAAA8W,YAAA9X,KAAAyZ,EAAAzZ,KAAA4N,EAAA5N,KAAAyY,GACAzX,EAAA+W,SAAA/X,KAAAma,EAAAna,KAAAmF,EAAAnF,KAAAsY,EAAAtY,KAAAurB,GAOAvrB,KAAAysB,uBACA,KAAA,EACAzrB,EAAA4W,QAAA,GACA,MACA,KAAA,EACA5W,EAAA2W,SAAA3W,EAAA0U,WAAA,EAAA,GAWA,OANAzE,MAAAjR,KAAAiZ,IAAAjY,EAAA6Z,sBAAA7a,KAAAiZ,IACAjY,EAAA4xB,eAAA5xB,EAAA6W,cAAA7W,EAAA0U,WAAA1U,EAAA6X,WAEA7X,EAAA6xB,YAAA7xB,EAAAkZ,WAAAlZ,EAAAoZ,aAAApZ,EAAAqZ,aAAAra,KAAAiZ,EAAAjY,EAAAuZ,oBAGAvZ,IAIAzB,EAAAC,QAAA,SAAAoE,EAAAooB,GA6BA,MAAAA,IACAA,EAAAja,KAAAuC,MAAA5C,KAAAsa,MAAA,MAYA,IANA,IAAAzpB,EAAA,CAAAmpB,EAAAC,UAAAD,EAAAM,IAAAN,EAAAO,KAAAP,EAAAS,gBAAAT,EAAAU,SAAAV,EAAAW,UAAAX,EAAAc,eAAAd,EAAAgB,cAEAhB,EAAAyB,WAAAzB,EAAAwB,YAAAxB,EAAAuB,WAAAvB,EAAAoB,UAAApB,EAAAyC,YAAAzC,EAAAsC,WAAAtC,EAAAkC,YAAAlC,EAAAiD,WAAAjD,EAAA0C,eAAA1C,EAAA8C,cAAA9C,EAAA6C,SAAA7C,EAAAgD,aAAAhD,EAAA2C,iBAAA3C,EAAA4C,UAAA5C,EAAA+C,2BAAA/C,EAAAmD,eAAAnD,EAAAqD,SAAArD,EAAAoC,aAAApC,EAAAqC,aAAArC,EAAAsD,UAAAtD,EAAAuD,aAAAvD,EAAAmC,YAAAnC,EAAAyD,WAAAzD,EAAA0D,cAAA1D,EAAAuC,YAAAvC,EAAA+B,OAAA/B,EAAAgC,cAAAhC,EAAA0B,KAAA1B,EAAA6B,KAAA7B,EAAA8B,KAAA9B,EAAAwC,QAAAxC,EAAA2D,WAAA3D,EAAAwD,YAAAxD,EAAAoD,cAAApD,EAAAiC,IAAAjC,EAAAqG,MAAArG,EAAAmG,IAAAnG,EAAA4F,QAAA5F,EAAA6F,iBAAA7F,EAAA8D,aAAA9D,EAAA+F,qBAAA/F,EAAA2B,aAAA3B,EAAAgG,OAAAhG,EAAA0G,yBAAA1G,EAAAwG,wBAAAxG,EAAAyG,uBAAAzG,EAAAuG,sBAAAvG,EAAAyF,SAAAzF,EAAAsG,YAEAhxB,EAAA8xB,OAAAC,OAAAV,GAEAzuB,EAAA3D,QAAA,CAIA,IAHA,IAAA+yB,EAAA,KACAC,EAAA,KAEA9tB,EAAA,EAAA2T,EAAAvW,EAAAtC,OAAAkF,EAAA2T,EAAA3T,IAAA,CACA,IAAAX,EAAAjC,EAAA4C,GAEAqK,EAAA5L,EAAA4L,MAAAhL,EAAAonB,OAEApc,KACAwjB,GAAAxjB,EAAA,GAAAvP,OAAA+yB,EAAA,GAAA/yB,UACA+yB,EAAAxjB,EACAyjB,EAAAzuB,GAKA,IAAAyuB,GAAAA,EAAApH,WAAA,IAAAoH,EAAApH,SAAA9mB,MAAA/D,EAAAgyB,GACA,OAAA,EAGApvB,EAAAA,EAAA6I,OAAAumB,EAAA,GAAA/yB,QAEA+yB,EADAC,EAAA,KAIA,OAAAlhB,KAAAuC,MAAAtT,EAAAwxB,OAAA,IAAA9gB,KAAA,IAAAsa,IAAA,OAMAkH,6CAIA,SAAA3zB,EAAA4zB,EAAAC,GAIA7zB,EAAAC,QAAA,SAAA6zB,GASA,IAAAC,EAAA,oBAAAxxB,OAAAA,OAAAsxB,EAAAnZ,EACAqZ,EAAAC,SAAAD,EAAAC,UAAA,GACA,IAAAA,EAAAD,EAAAC,SAIA,OAHAA,EAAAC,IAAAD,EAAAC,KAAA,GACAD,EAAAC,IAAAC,IAAAF,EAAAC,IAAAC,KAAA,IAEAF,EAAAC,IAAAC,IAAAJ,SAAAxyB,IAAA0yB,EAAAC,IAAAC,IAAAJ,GAAAK,aACA,OAAAH,EAAAC,IAAAC,IAAAJ,GAAAK,YAMA,GAHAH,EAAAC,IAAAC,IAAAJ,GAAAK,cASAC,+CAIA,SAAAp0B,EAAA4zB,EAAAC,GAIA7zB,EAAAC,QAAA,SAAAkQ,GAiBA,IAAA9L,EAAA8L,EAAA,GAGA,GAAA,SADA0jB,EAAA,6CAAAA,CAAA,sBAAA,OAEA,OAAAxvB,EAAA3D,OAuCA,IApCA,IAAAkF,EAAA,EACAyuB,EAAA,EAmCAzuB,EAAA,EAAAyuB,EAAA,EAAAzuB,EAAAvB,EAAA3D,OAAAkF,KACA,IAlCA,SAAAvB,EAAAuB,GACA,IACA6qB,EACA6D,EAFAC,EAAAlwB,EAAAmwB,WAAA5uB,GAGA,GAAA,OAAA2uB,GAAAA,GAAA,MAAA,CAGA,GAAAlwB,EAAA3D,QAAAkF,EAAA,EACA,MAAA,IAAAkN,MAAA,kDAGA,IADA2d,EAAApsB,EAAAmwB,WAAA5uB,EAAA,IACA,OAAA,MAAA6qB,EACA,MAAA,IAAA3d,MAAA,kDAEA,OAAAzO,EAAA2J,OAAApI,GAAAvB,EAAA2J,OAAApI,EAAA,GACA,GAAA,OAAA2uB,GAAAA,GAAA,MAAA,CAEA,GAAA,IAAA3uB,EACA,MAAA,IAAAkN,MAAA,kDAGA,IADAwhB,EAAAjwB,EAAAmwB,WAAA5uB,EAAA,IACA,OAAA,MAAA0uB,EAGA,MAAA,IAAAxhB,MAAA,kDAIA,OAAA,EAEA,OAAAzO,EAAA2J,OAAApI,GAIA6uB,CAAApwB,EAAAuB,IAOAyuB,IAGA,OAAAA,IAMAK,+CAIA,SAAA10B,GAIAA,EAAAC,QAAA,SAAA00B,GAuBA,IAAAlC,EAAA,CAAA,IAAA,KAAA,KAAA,KAAA,KAAA,KAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,SAAA,SAAA,KAAA9lB,KAAA,IAGA,OAAA,iBAAAgoB,GAAA,iBAAAA,IAAA,IAAAlC,EAAAhb,QAAAkd,EAAAhvB,OAAA,MAAA,KAAAgvB,IAAAjjB,MAAAijB,MASAC,EAAA,GAGA,SAAAf,EAAAgB,GAEA,IAAAC,EAAAF,EAAAC,GACA,QAAAvzB,IAAAwzB,EACA,OAAAA,EAAA70B,QAGA,IAAAD,EAAA40B,EAAAC,GAAA,CAGA50B,QAAA,IAOA,OAHAoe,EAAAwW,GAAA70B,EAAAA,EAAAC,QAAA4zB,GAGA7zB,EAAAC,QAOA4zB,EAAAhuB,EAAA,SAAA7F,GACA,IAAA+0B,EAAA/0B,GAAAA,EAAAg1B,WACA,WAAA,OAAAh1B,EAAA,SACA,WAAA,OAAAA,GAEA,OADA6zB,EAAA3a,EAAA6b,EAAA,CAAApwB,EAAAowB,IACAA,GAOAlB,EAAA3a,EAAA,SAAAjZ,EAAAg1B,GACA,IAAA,IAAAxrB,KAAAwrB,EACApB,EAAA5Z,EAAAgb,EAAAxrB,KAAAoqB,EAAA5Z,EAAAha,EAAAwJ,IACA8pB,OAAA2B,eAAAj1B,EAAAwJ,EAAA,CAAA0rB,YAAA,EAAAC,IAAAH,EAAAxrB,MAQAoqB,EAAAnZ,EAAA,WACA,GAAA,iBAAA2a,WAAA,OAAAA,WACA,IACA,OAAA50B,MAAA,IAAA60B,SAAA,cAAA,GACA,MAAAhpB,GACA,GAAA,iBAAA/J,OAAA,OAAAA,QALA,GAYAsxB,EAAA5Z,EAAA,SAAArO,EAAA9G,GAAA,OAAAyuB,OAAAxqB,UAAAgN,eAAA9T,KAAA2J,EAAA9G,IAMA+uB,EAAAhY,EAAA,SAAA5b,GACA,oBAAAs1B,QAAAA,OAAAC,aACAjC,OAAA2B,eAAAj1B,EAAAs1B,OAAAC,YAAA,CAAA9rB,MAAA,WAEA6pB,OAAA2B,eAAAj1B,EAAA,aAAA,CAAAyJ,OAAA,KAKA,IAAA+rB,EAAA,IAEA,WAIA5B,EAAAhY,EAAA4Z,GACA,IAAAC,EAAA7B,EAAA,gDACA8B,EAAA9B,EAAAhuB,EAAA6vB,GACAE,EAAA/B,EAAA,kDACAgC,EAAAhC,EAAAhuB,EAAA+vB,GACAE,EAAAjC,EAAA,oDACAkC,EAAAlC,EAAAhuB,EAAAiwB,GACAE,EAAAnC,EAAA,gDACAoC,EAAApC,EAAAhuB,EAAAmwB,GAgBA51B,EAAAC,QAAA,EAAAT,kBAAA,CACA6c,QAAA,CAIAyZ,aAAA,CAAA,UAAA,WAQAC,SAAA,SAAAC,EAAAxyB,GACA,IAAAyyB,EAAAD,EAAA1sB,MAEA,OADA9F,OAAA,IAAAA,EAAAA,EAAA,EACA,OAAAwyB,EAAAE,YACA,IAAAF,EAAAE,MAAA1yB,IACA,CACA2yB,KAAAF,EACAG,UAAAH,EAAAnpB,OAAAmpB,EAAAlpB,YAAA,KAAA,GACAjB,KAAAkqB,EAAAE,MAAA1yB,GAAAsI,KAAA,KACAvE,KAAAyuB,EAAAE,MAAA1yB,GAAA+D,OAYA+E,SAAA,SAAA+pB,GACA,IAAA/pB,EAAA,GACAjM,KAAAuR,QAAAykB,KACAA,EAAA,CAAAA,IAEA,IAAA,IAAA7wB,EAAA,EAAAA,EAAA6wB,EAAA/1B,OAAAkF,IACA8G,EAAA7B,KAAA,UAAA4rB,EAAA7wB,GAAA,MAEA,OAAA8G,EAAAC,QAQA+pB,gBAAA,SAAA5zB,GACA,OAAArC,KAAAk2B,SAAA7zB,EAAArC,KAAAy1B,eASAS,SAAA,SAAA7zB,EAAAE,GACA,IAAA4zB,GAAA,EACA,iBAAA5zB,IACAA,EAAA,CAAAA,IAEA,IAAArC,EAAAP,EAAAQ,KAAAkC,EAAAV,KAAA,aACAy0B,EAAA,GACAxa,EAAA1b,EAAAwb,gBAoBA,OAnBArZ,EAAAlB,QAAAya,GACAjc,EAAAyC,KAAAwZ,EAAAvZ,EAAAlB,MAAA,SAAAgC,EAAAkzB,GACAD,EAAAhsB,KAAAisB,KAGAh0B,EAAAlB,QAAAjB,EAAAG,SAAAkC,OACA6zB,EAAAhsB,KAAAlK,EAAAG,SAAAkC,MAAAF,EAAAlB,OAEAxB,EAAAyC,KAAAg0B,EAAA,SAAAjzB,EAAAmzB,GACA,GAAA,sBAAAA,EAEA,IADA,IAAAC,EAAAD,EAAAn3B,kBACAgG,EAAA,EAAAA,EAAAoxB,EAAAt2B,OAAAkF,IACA,IAAA,IAAAxF,EAAAiH,QAAA2vB,EAAApxB,GAAA,GAAA5C,GAEA,QADA4zB,GAAA,KAMAA,GASAK,OAAA,SAAA9mB,GACA,OAAAwlB,GAAAA,CAAAxlB,IAUA+mB,QAAA,SAAAtrB,EAAA9I,EAAA4G,GACA,OAAAjJ,KAAAi2B,gBAAA5zB,IAAArC,KAAA02B,WAAAztB,GACA0tB,WAAA1tB,GACAjJ,KAAAuR,QAAAtI,GACA0tB,WAAA1tB,EAAAhJ,QACA,SAAAoC,EAAA6E,KACAyvB,WAAA5kB,KAAAuC,MAAAtU,KAAA01B,SAAArzB,GAAAoJ,OAEAkrB,WAAA32B,KAAAw2B,OAAAvtB,KASA2tB,qBAAA,SAAAjqB,EAAAtK,GACA,IAAA8zB,OAAAt1B,EAUA,OATAlB,EAAAyC,KAAAzC,EAAAO,UAAAwC,YAAAL,GAAA,SAAA2G,EAAAzG,GACA,sBAAAyG,GACArJ,EAAAyC,KAAAG,EAAA,SAAA4C,EAAA8D,GACAA,EAAA,KAAA0D,IACAwpB,EAAAltB,OAKAktB,GASAU,UAAA,SAAA5tB,EAAAzE,GACA,IAMAsyB,EANAC,GAAA,EACAxe,EAAA,IAAAjF,cACA,MAAA,iBAAArK,QAAA,IAAAzE,EACAyE,GAEA,iBAAAzE,IAGAA,OADA3D,KADAi2B,EAAA92B,KAAA42B,qBAAA,aAAApyB,IAEAsyB,EAAA,GAAA,GAEA,MAIAC,EADA,MAAAvyB,EACAxE,KAAAg3B,UAAA/tB,IAEA8tB,EAAAxe,EAAA5C,UAAA1M,EAAAzE,cACAkN,MAAA6G,EAAAgD,WAAAwb,EAAAvyB,KAAAyE,GACA8I,KAAAC,MAAA+kB,EAAAzb,UAAA,OAiBA2b,aAAA,SAAA/2B,EAAA+I,EAAA5G,EAAAqC,EAAAwyB,GACA,IAAAC,EAAAn3B,KAAA62B,UAAAnyB,GACA,IAAAyyB,EAAA,CACA,IAAA7kB,EAAAtS,KAAAo3B,iBAAAl3B,EAAAmC,EAAAqC,GACA,QAAA7D,IAAAyR,EACA,OAAA,EAEA6kB,EAAAn3B,KAAA62B,UAAA32B,EAAAyG,aAAA2L,GAAAA,GAEA,IAAAykB,EAAA/2B,KAAA62B,UAAA5tB,EAAA5G,GACA,IAAA,IAAA00B,EACA,OAAA,EAEA,OAAAG,GACA,IAAA,IACA,OAAAH,EAAAI,EACA,IAAA,KACA,OAAAJ,GAAAI,EACA,IAAA,KACA,IAAA,MACA,OAAAJ,IAAAI,EACA,IAAA,IACA,OAAAA,EAAAJ,EACA,IAAA,KACA,OAAAI,GAAAJ,EACA,QACA,MAAA,IAAA1kB,MAAA,2BAUA+E,UAAA,SAAAnO,EAAAzE,GAEA,OADA,IAAA8O,eACA8D,UAAAnO,EAAAzE,IAWAwyB,UAAA,SAAA1rB,EAAA0gB,GACA,OAAAsJ,GAAAA,CAAAhqB,EAAA0gB,IAUA0K,WAAA,SAAAW,GACA,OAAA7B,GAAAA,CAAA6B,IASA9lB,QAAA,SAAA+lB,GACA,MAAA,mBAAAxE,OAAAxqB,UAAAqJ,SAAAnQ,KAAA81B,IAWAC,UAAA,SAAAzZ,EAAA0Z,GACA,OAAApC,GAAAA,CAAAtX,EAAA0Z,IASAva,YAAA,SAAAa,EAAA0Z,GACA,SAAAx3B,KAAAuR,QAAAuM,KAAA9d,KAAAuR,QAAAimB,MAGA1Z,EAAA7d,SAAAu3B,EAAAv3B,QAGAN,EAAAge,cAAA3d,KAAAu3B,UAAAzZ,EAAA0Z,MAUAJ,iBAAA,SAAAl3B,EAAAmC,EAAAlB,GACA,IAEAX,EAIAi3B,EANAC,EAAAx3B,EAAAiH,WAAAhG,GAWA,YAVAN,IAAA62B,EAAA,IAAAx3B,EAAAG,SAAAgG,aACA7F,EAAA,OACA,WAAAk3B,EAAA,GAAAC,SAAA,WAAAD,EAAA,GAAAC,SAAA,aAAAD,EAAA,GAAAxwB,MAAA,UAAAwwB,EAAA,GAAAxwB,OACA1G,EAAA,SAEAi3B,EAAA,8BACAC,EAAAjnB,IAAAgnB,GAAAhnB,IAAAjQ,EAAAi3B,EAAA,IAAAp1B,EAAAlB,MAAAZ,GAAAC,EAAAi3B,EAAA,IAAAp1B,EAAAlB,KAAA,WACAxB,EAAA0C,GAAAJ,WAGAy1B,EAAA,IAQAra,mBAAA,SAAAvK,GACA,IAEA8kB,EAFAC,EAAA,CAAA,4CAOA,MANA,iBAAA/kB,IACA8kB,EAAA9kB,EAAAglB,aAAAtoB,MAAA,yBACAxP,KAAAuR,QAAAqmB,KACAC,EAAA,CAAAD,EAAA,MAGAC,GAQAE,aAAA,SAAAn0B,GACA,OAAAA,EAAAC,QAAA,sCAAA,SAQAqY,kBAAA,SAAA/a,GACA,IAAA62B,EAAA72B,EAAA+B,MAAA,OAEA,OADA,IAAA80B,EAAA/3B,QAAA+3B,EAAA5tB,KAAA,IACA,IAAA/E,OAAA,IAAA2yB,EAAAxtB,IAAA,SAAA0X,GACA,OAAA/iB,kBAAA6c,QAAA+b,aAAA7V,KACAhW,KAAA,iBAAA,MASA+P,WAAA,SAAA1Z,EAAAwZ,GACA,IAAAkc,EAAA,CACA94B,kBAAA4c,EAAA5c,mBAAA,GACAyd,wBAAAb,EAAAa,yBAAA,IAEA,IAAA,IAAA5T,KAAAivB,EACA,IAAAA,EAAAjvB,GAAA/I,cAGA,IAAAsC,EAAAyG,KACAzG,EAAAyG,GAAA,IAEAzG,EAAAyG,GAAAzG,EAAAyG,GAAA1G,OAAA21B,EAAAjvB,KAEA,OAAAzG,GAQAmb,OAAA,SAAAhO,GACA,OAAA/P,EAAA,UAAA2L,KAAAoE,GAAAT,QASAipB,gBAAA,SAAAh4B,EAAAiB,GASA,IARA,IAAAg3B,EAAAh3B,EAAA0C,QAAA,cAAA,QACAu0B,EAAA,CAEAD,EAEAA,EAAA,KAEAA,EAAAt0B,QAAA,iBAAA,SACAsB,EAAA,EAAAA,EAAAizB,EAAAn4B,OAAAkF,IAAA,CACA,IAAAkzB,EAAAn4B,EAAAiH,WAAAixB,EAAAjzB,IACA,GAAA,EAAAkzB,EAAAp4B,OACA,OAAAo4B,EAGA,OAAA14B,EAAA,OAYAwH,WAAA,SAAAjH,EAAAiB,GAEA,IAAAk3B,EAAAn4B,EAAAiH,WAAAhG,GACA,GAAA,EAAAk3B,EAAAp4B,OACA,OAAAo4B,EAMA,IAFA,IACA/mB,EAAAnQ,EAAA+B,MADA,KAEAiC,EAAAmM,EAAArR,OAAA,EAAAkF,EAAAA,IAAA,CAEA,IADA,IAAAmzB,EAAA,GACAnd,EAAA,EAAAA,EAAAhW,EAAAgW,IACAmd,EAAAluB,KAAAkH,EAAA6J,IAGA,GAAA,GADAkd,EAAAr4B,KAAAk4B,gBAAAh4B,EAAAo4B,EAAApsB,KAPA,OAQAjM,OACA,OAAAo4B,EAGA,OAAA14B,EAAA,OASA44B,iBAAA,SAAAr4B,EAAAmC,GACA,OAAA,IAAAA,EAAAlB,KAAA6V,QAAA,MACA9W,EAAAiH,WAAA9E,EAAAlB,MAAAqJ,IAAA,SAAArF,EAAA0G,GACA,OAAA3L,EAAAyG,aAAAkF,KACA8oB,MAEAz0B,EAAAyG,aAAAtE,OAtdA,GA3iDA,GCWA1C,EAAAC,QAAA,EAAAT,kBAAA,CAEA6c,QAAA,CAQAwc,WAAA,SAAAvvB,GAEA,IAAAwvB,EAAA,CACAC,OAAA,CACA,UACA,QACA,cACA,UACA,SACA,SACA,SACA,SACA,SACA,WACA,cACA,YACA,QACA,aACA,QACA,UACA,QACA,gBACA,WACA,SACA,WACA,WACA,WACA,SACA,eACA,OACA,UACA,WACA,SACA,WACA,QACA,aACA,OACA,SACA,aACA,SACA,SACA,SACA,SACA,UACA,YACA,WACA,UACA,WACA,SACA,aACA,cACA,aACA,WACA,UACA,QACA,YAEAC,QAAA,CACA,OACA,YACA,WACA,UACA,YACA,yBACA,sBACA,oBACA,kBACA,qBACA,oBACA,yBACA,kBACA,qBACA,qBACA,oBACA,oBACA,QACA,WACA,WACA,QACA,iBACA,WACA,QACA,SACA,eACA,YACA,SACA,QACA,gBACA,eACA,SACA,UACA,UACA,SACA,UACA,YACA,aACA,UACA,SACA,UACA,eACA,SACA,eACA,SACA,UACA,WACA,WACA,WACA,cACA,YACA,YACA,UACA,YACA,aACA,UACA,aACA,YACA,YACA,SACA,UACA,SACA,aACA,uBACA,eACA,kBACA,qBACA,oBACA,gBACA,oBACA,kBACA,SACA,UACA,UACA,SACA,sBACA,sBACA,aACA,SACA,OACA,cACA,gBACA,SACA,UACA,SACA,UACA,aACA,YACA,WACA,YACA,SACA,aACA,cACA,WACA,UACA,YACA,aACA,WACA,aACA,SACA,WACA,UACA,OACA,UACA,sBACA,sBACA,yBACA,UACA,SACA,cACA,aACA,UACA,iBACA,gBACA,cACA,cACA,cACA,eACA,SACA,SACA,WACA,aACA,eACA,WACA,WACA,gBACA,YACA,eACA,WACA,QACA,gBACA,WACA,WACA,WACA,YACA,aACA,gBACA,cACA,QACA,cACA,UACA,UACA,UACA,YACA,aACA,WACA,UACA,eAEAC,WAAA,CACA,QACA,QACA,iBACA,YACA,SACA,UACA,SACA,UACA,aACA,QACA,UAEAC,OAAA,CACA,gBAEAC,KAAA,CACA,OACA,SACA,QACA,SACA,QACA,SACA,WACA,UACA,UACA,OACA,UACA,SACA,UACA,SACA,aACA,YACA,UACA,WACA,QACA,OACA,QACA,WACA,OACA,SACA,SACA,cACA,YACA,OACA,UACA,UACA,WACA,YACA,QACA,YACA,UACA,UACA,YACA,WACA,UACA,cACA,eACA,UACA,SACA,QACA,UACA,WACA,SACA,SACA,UACA,eACA,cACA,OACA,OACA,aACA,YACA,YACA,QACA,YACA,UACA,SACA,WACA,YACA,QACA,WACA,YACA,SACA,WACA,UACA,SACA,UACA,QACA,cACA,SACA,WACA,YACA,cACA,UACA,gBACA,WAEAC,SAAA,CACA,SACA,UACA,SACA,aACA,QACA,UACA,YACA,gBACA,YACA,WAEAC,UAAA,CACA,WACA,WACA,cACA,SACA,SACA,QACA,SACA,WACA,YACA,YACA,QACA,UAEAC,OAAA,CACA,YACA,UACA,SACA,WACA,SACA,aACA,WACA,YACA,WACA,WACA,WACA,aACA,SACA,YACA,WACA,WACA,cACA,WACA,SACA,cACA,OACA,SACA,YACA,SACA,aACA,SACA,QACA,YACA,QACA,SACA,SACA,OACA,QACA,YACA,SACA,OACA,OACA,SACA,aACA,WACA,aACA,SACA,QACA,YACA,UACA,SACA,WACA,QACA,UACA,SACA,UACA,YACA,SACA,SACA,aACA,UAEAC,OAAA,CACA,eACA,SACA,YACA,QACA,SACA,YACA,OACA,WACA,YACA,UACA,WAEAC,QAAA,CACA,OACA,WACA,UACA,QACA,SACA,QACA,YACA,UACA,OACA,WACA,YACA,UACA,cACA,OACA,WACA,WACA,aACA,SACA,YACA,SACA,YACA,SACA,QACA,OACA,UACA,SACA,YACA,QACA,WACA,UACA,eACA,YACA,SACA,SACA,SACA,YACA,OACA,UAEA3O,IAAA,CACA,KAIA4O,EAAAnwB,EAAA/F,MAAA,IAAA,GACAm2B,EAAAD,EAAA,GAAA1rB,cACA4rB,EAAA,GAKA,OAJAF,EAAA,KACAE,EAAAF,EAAA,GAAA1rB,eAGA2rB,KAAAZ,IAAA,IAAAA,EAAAY,GAAAp5B,SAAA,IAAAw4B,EAAAY,GAAAriB,QAAAsiB,QC/cA35B,EAAAC,QAAA,EAAAT,kBAAA,CAEA8N,QAAA,CAEA+O,QAAA7c,kBAAA6c,QAEAud,cAAA,EAQAC,UAAA,WACA,OAAA,GASAC,KAAA,WACA,OAAA,GASAC,SAAA,WACA,OAAA,GAMAC,OAAA,SAAA1wB,EAAA5G,GACA,OAAA1C,EAAA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","file":"jsvalidation.min.js","sourcesContent":["/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\nvar laravelValidation;\nlaravelValidation = {\n\n    implicitRules: ['Required','Confirmed'],\n\n    /**\n     * Initialize laravel validations.\n     */\n    init: function () {\n\n        // jquery-validation requires the field under validation to be present. We're adding a dummy hidden\n        // field so that any errors are not visible.\n        var constructor = $.fn.validate;\n        $.fn.validate = function( options ) {\n            var name = 'proengsoft_jsvalidation'; // must match the name defined in JsValidatorFactory.newFormRequestValidator\n            var $elm = $(this).find('input[name=\"' + name + '\"]');\n            if ($elm.length === 0) {\n                $('<input>').attr({type: 'hidden', name: name}).appendTo(this);\n            }\n\n            return constructor.apply(this, [options]);\n        };\n\n        // Disable class rules and attribute rules\n        $.validator.classRuleSettings = {};\n        $.validator.attributeRules = function () {};\n\n        $.validator.dataRules = this.arrayRules;\n        $.validator.prototype.arrayRulesCache = {};\n\n        // Register validations methods\n        this.setupValidations();\n    },\n\n    arrayRules: function(element) {\n\n        var rules = {},\n            validator = $.data( element.form, \"validator\"),\n            cache = validator.arrayRulesCache;\n\n        // Is not an Array\n        if (element.name.indexOf('[') === -1) {\n            return rules;\n        }\n\n        if (! (element.name in cache)) {\n            cache[element.name] = {};\n        }\n\n        $.each(validator.settings.rules, function(name, tmpRules) {\n            if (name in cache[element.name]) {\n                rules = laravelValidation.helpers.mergeRules(rules, cache[element.name][name]);\n            } else {\n                cache[element.name][name] = {};\n\n                var nameRegExp = laravelValidation.helpers.regexFromWildcard(name);\n                if (element.name.match(nameRegExp)) {\n                    var newRules = $.validator.normalizeRule(tmpRules) || {};\n                    cache[element.name][name] = newRules;\n\n                    rules = laravelValidation.helpers.mergeRules(rules, newRules);\n                }\n            }\n        });\n\n        return rules;\n    },\n\n    setupValidations: function () {\n\n        /**\n         * Get CSRF token.\n         *\n         * @param params\n         * @returns {string}\n         */\n        var getCsrfToken = function (params) {\n            return params[0][1][1];\n        };\n\n        /**\n         * Whether to validate all attributes.\n         *\n         * @param params\n         * @returns {boolean}\n         */\n        var isValidateAll = function (params) {\n            return params[0][1][2];\n        };\n\n        /**\n         * Determine whether the rule is implicit.\n         *\n         * @param params\n         * @returns {boolean}\n         */\n        var isImplicit = function (params) {\n            var implicit = false;\n            $.each(params, function (i, parameters) {\n                implicit = implicit || parameters[3];\n            });\n\n            return implicit;\n        };\n\n        /**\n         * Get form method from a validator instance.\n         *\n         * @param validator\n         * @returns {string}\n         */\n        var formMethod = function (validator) {\n            var formMethod = $(validator.currentForm).attr('method');\n            if ($(validator.currentForm).find('input[name=\"_method\"]').length) {\n                formMethod = $(validator.currentForm).find('input[name=\"_method\"]').val();\n            }\n\n            return formMethod;\n        };\n\n        /**\n         * Get AJAX parameters for remote requests.\n         *\n         * @param validator\n         * @param element\n         * @param params\n         * @param data\n         * @returns {object}\n         */\n        var ajaxOpts = function (validator, element, params, data) {\n            return {\n                mode: 'abort',\n                port: 'validate' + element.name,\n                dataType: 'json',\n                data: data,\n                context: validator.currentForm,\n                url: $(validator.currentForm).attr('action'),\n                type: formMethod(validator),\n                beforeSend: function (xhr) {\n                    var token = getCsrfToken(params);\n                    if (formMethod(validator) !== 'get' && token) {\n                        return xhr.setRequestHeader('X-XSRF-TOKEN', token);\n                    }\n                },\n            };\n        };\n\n        /**\n         * Validate a set of local JS based rules against an element.\n         *\n         * @param validator\n         * @param values\n         * @param element\n         * @param rules\n         * @returns {boolean}\n         */\n        var validateLocalRules = function (validator, values, element, rules) {\n            var validated = true,\n                previous = validator.previousValue(element);\n\n            $.each(rules, function (i, param) {\n                var implicit = param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1;\n                var rule = param[0];\n                var message = param[2];\n\n                if (! implicit && validator.optional(element)) {\n                    validated = \"dependency-mismatch\";\n                    return false;\n                }\n\n                if (laravelValidation.methods[rule] !== undefined) {\n                    $.each(values, function(index, value) {\n                        validated = laravelValidation.methods[rule].call(validator, value, element, param[1], function(valid) {\n                            validator.settings.messages[element.name].laravelValidationRemote = previous.originalMessage;\n                            if (valid) {\n                                var submitted = validator.formSubmitted;\n                                validator.prepareElement(element);\n                                validator.formSubmitted = submitted;\n                                validator.successList.push(element);\n                                delete validator.invalid[element.name];\n                                validator.showErrors();\n                            } else {\n                                var errors = {};\n                                errors[ element.name ]\n                                    = previous.message\n                                    = typeof message === \"function\" ? message( value ) : message;\n                                validator.invalid[element.name] = true;\n                                validator.showErrors(errors);\n                            }\n                            validator.showErrors(validator.errorMap);\n                            previous.valid = valid;\n                        });\n\n                        // Break loop.\n                        if (validated === false) {\n                            return false;\n                        }\n                    });\n                } else {\n                    validated = false;\n                }\n\n                if (validated !== true) {\n                    if (!validator.settings.messages[element.name] ) {\n                        validator.settings.messages[element.name] = {};\n                    }\n\n                    validator.settings.messages[element.name].laravelValidation= message;\n\n                    return false;\n                }\n\n            });\n\n            return validated;\n        };\n\n        /**\n         * Create JQueryValidation check to validate Laravel rules.\n         */\n\n        $.validator.addMethod(\"laravelValidation\", function (value, element, params) {\n            var rules = [],\n                arrayRules = [];\n            $.each(params, function (i, param) {\n                // put Implicit rules in front\n                var isArrayRule = param[4].indexOf('[') !== -1;\n                if (param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1) {\n                    isArrayRule ? arrayRules.unshift(param) : rules.unshift(param);\n                } else {\n                    isArrayRule ? arrayRules.push(param) : rules.push(param);\n                }\n            });\n\n            // Validate normal rules.\n            var localRulesResult = validateLocalRules(this, [value], element, rules);\n\n            // Validate items of the array using array rules.\n            var arrayValue = ! Array.isArray(value) ? [value] : value;\n            var arrayRulesResult = validateLocalRules(this, arrayValue, element, arrayRules);\n\n            return localRulesResult && arrayRulesResult;\n        }, '');\n\n\n        /**\n         * Create JQueryValidation check to validate Remote Laravel rules.\n         */\n        $.validator.addMethod(\"laravelValidationRemote\", function (value, element, params) {\n\n            if (! isImplicit(params) && this.optional( element )) {\n                return \"dependency-mismatch\";\n            }\n\n            var previous = this.previousValue( element ),\n                validator, data;\n\n            if (! this.settings.messages[ element.name ]) {\n                this.settings.messages[ element.name ] = {};\n            }\n            previous.originalMessage = this.settings.messages[ element.name ].laravelValidationRemote;\n            this.settings.messages[ element.name ].laravelValidationRemote = previous.message;\n\n            if (laravelValidation.helpers.arrayEquals(previous.old, value) || previous.old === value) {\n                return previous.valid;\n            }\n\n            previous.old = value;\n            validator = this;\n            this.startRequest( element );\n\n            data = $(validator.currentForm).serializeArray();\n            data.push({'name': '_jsvalidation', 'value': element.name});\n            data.push({'name': '_jsvalidation_validate_all', 'value': isValidateAll(params)});\n\n            $.ajax( ajaxOpts(validator, element, params, data) )\n                .always(function( response, textStatus ) {\n                    var errors, message, submitted, valid;\n\n                    if (textStatus === 'error') {\n                        valid = false;\n                        response = laravelValidation.helpers.parseErrorResponse(response);\n                    } else if (textStatus === 'success') {\n                        valid = response === true || response === \"true\";\n                    } else {\n                        return;\n                    }\n\n                    validator.settings.messages[ element.name ].laravelValidationRemote = previous.originalMessage;\n\n                    if ( valid ) {\n                        submitted = validator.formSubmitted;\n                        validator.prepareElement( element );\n                        validator.formSubmitted = submitted;\n                        validator.successList.push( element );\n                        delete validator.invalid[ element.name ];\n                        validator.showErrors();\n                    } else {\n                        errors = {};\n                        message = response || validator.defaultMessage( element, \"remote\" );\n                        errors[ element.name ]\n                            = previous.message\n                            = typeof message === \"function\" ? message( value ) : message[0];\n                        validator.invalid[ element.name ] = true;\n                        validator.showErrors( errors );\n                    }\n                    validator.showErrors(validator.errorMap);\n                    previous.valid = valid;\n                    validator.stopRequest( element, valid );\n                }\n            );\n            return \"pending\";\n        }, '');\n\n        /**\n         * Create JQueryValidation check to form requests.\n         */\n        $.validator.addMethod(\"laravelValidationFormRequest\", function (value, element, params) {\n\n            var validator = this,\n                previous = validator.previousValue(element);\n\n            var data = $(validator.currentForm).serializeArray();\n            data.push({name: '__proengsoft_form_request', value: 1}); // must match FormRequest.JS_VALIDATION_FIELD\n\n            // Skip AJAX if the value remains the same as a prior request.\n            if (JSON.stringify(previous.old) === JSON.stringify(data)) {\n                if (! previous.valid) {\n                    validator.showErrors(previous.errors || {});\n                }\n\n                return previous.valid;\n            }\n\n            previous.old = data;\n            this.startRequest( element );\n\n            $.ajax(ajaxOpts(validator, element, params, data))\n                .always(function( response, textStatus ) {\n                    var errors = {},\n                        valid = textStatus === 'success' && (response === true || response === 'true');\n\n                    if (valid) {\n                        validator.resetInternals();\n                        validator.toHide = validator.errorsFor( element );\n                    } else {\n                        $.each( response, function( fieldName, errorMessages ) {\n                            var errorElement = laravelValidation.helpers.findByName(validator, fieldName)[0];\n                            if (errorElement) {\n                                errors[errorElement.name] = laravelValidation.helpers.encode(errorMessages[0] || '');\n                            }\n                        });\n\n                        // Failed to find the error fields so mark the form as valid otherwise user\n                        // will be left in limbo with no visible error messages.\n                        if ($.isEmptyObject(errors)) {\n                            valid = true;\n                        }\n                    }\n\n                    previous.valid = valid;\n                    previous.errors = errors;\n                    validator.showErrors(errors);\n                    validator.stopRequest(element, valid);\n                });\n\n            return 'pending';\n        }, '');\n    }\n};\n\n$(function() {\n    laravelValidation.init();\n});\n","/*!\n * jQuery Validation Plugin v1.20.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2023 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t//   - A user defined a `submitHandler`\n\t\t\t\t\t//   - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t//     was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler && !validator.settings.debug ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tisContentEditable = typeof this.attr( \"contenteditable\" ) !== \"undefined\" && this.attr( \"contenteditable\" ) !== \"false\",\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && isContentEditable ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// JQuery trim is deprecated, provide a trim method based on String.prototype.trim\nvar trim = function( str ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n\treturn str.replace( /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\" );\n};\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar currentForm = this.currentForm,\n\t\t\t\tgroups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\t// Ignore the element if it belongs to another form. This will happen mainly\n\t\t\t\t// when setting the `form` attribute of an input to the id of another form.\n\t\t\t\tif ( currentForm !== this.form ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.trigger( \"focus\" )\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Ignore elements that belong to other/nested forms\n\t\t\t\tif ( this.form !== validator.currentForm ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tisContentEditable = typeof $element.attr( \"contenteditable\" ) !== \"undefined\" && $element.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( isContentEditable ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Abort any pending Ajax request from a previous call to this method.\n\t\t\tthis.abortRequest( element );\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass );\n\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\tif ( string === undefined ) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\telementAjaxPort: function( element ) {\n\t\t\treturn \"validate\" + element.name;\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {\n\t\t\t\t$( this.currentForm ).trigger( \"submit\" );\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tabortRequest: function( element ) {\n\t\t\tvar port;\n\n\t\t\tif ( this.pending[ element.name ] ) {\n\t\t\t\tport = this.elementAjaxPort( element );\n\t\t\t\t$.ajaxAbort( port );\n\n\t\t\t\tthis.pendingRequest--;\n\n\t\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\t}\n\n\t\t\t\tdelete this.pending[ element.name ];\n\t\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" )\n\t\t\t\t.find( \".validate-lessThan-blur\" )\n\t\t\t\t\t.off( \".validate-lessThan\" )\n\t\t\t\t\t.removeClass( \"validate-lessThan-blur\" )\n\t\t\t\t.find( \".validate-lessThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-lessThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-lessThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThan-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThan\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThan-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ type === \"date\" ? \"dateISO\" : method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\n\t\t\t// Cast empty attributes like `data-rule-required` to `true`\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = true;\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( Array.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value !== undefined && value !== null && value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: ( function() {\n\t\t\tvar called = false;\n\n\t\t\treturn function( value, element ) {\n\t\t\t\tif ( !called ) {\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" +\n\t\t\t\t\t\t\t\"Please don't use it, since it relies on the Date constructor, which\\n\" +\n\t\t\t\t\t\t\t\"behaves very differently across browsers and locales. Use `dateISO`\\n\" +\n\t\t\t\t\t\t\t\"instead or one of the locale specific methods in `localizations/`\\n\" +\n\t\t\t\t\t\t\t\"and `additional-methods.js`.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t\t};\n\t\t}() ),\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: this.elementAjaxPort( element ),\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n//        $.ajaxAbort( port );\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\n\n// Abort the previous request without sending a new one\n$.ajaxAbort = function( port ) {\n\tif ( pendingRequests[ port ] ) {\n\t\tpendingRequests[ port ].abort();\n\t\tdelete pendingRequests[ port ];\n\t}\n};\nreturn $;\n}));","/*!\r\n * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014 - 2020\r\n * @version 1.3.6\r\n *\r\n * Date formatter utility library that allows formatting date/time variables or Date objects using PHP DateTime format.\r\n * This library is a standalone javascript library and does not depend on other libraries or plugins like jQuery. The\r\n * library also adds support for Universal Module Definition (UMD).\r\n * \r\n * @see http://php.net/manual/en/function.date.php\r\n *\r\n * For more JQuery plugins visit http://plugins.krajee.com\r\n * For more Yii related demos visit http://demos.krajee.com\r\n */\r\n(function (root, factory) {\r\n    // noinspection JSUnresolvedVariable\r\n    if (typeof define === 'function' && define.amd) { // AMD\r\n        // noinspection JSUnresolvedFunction\r\n        define([], factory);\r\n    } else {\r\n        // noinspection JSUnresolvedVariable\r\n        if (typeof module === 'object' && module.exports) { // Node\r\n            // noinspection JSUnresolvedVariable\r\n            module.exports = factory();\r\n        } else { // Browser globals\r\n            root.DateFormatter = factory();\r\n        }\r\n    }\r\n}(typeof self !== 'undefined' ? self : this, function () {\r\n    var DateFormatter, $h;\r\n    /**\r\n     * Global helper object\r\n     */\r\n    $h = {\r\n        DAY: 1000 * 60 * 60 * 24,\r\n        HOUR: 3600,\r\n        defaults: {\r\n            dateSettings: {\r\n                days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\r\n                daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n                months: [\r\n                    'January', 'February', 'March', 'April', 'May', 'June', 'July',\r\n                    'August', 'September', 'October', 'November', 'December'\r\n                ],\r\n                monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n                meridiem: ['AM', 'PM'],\r\n                ordinal: function (number) {\r\n                    var n = number % 10, suffixes = {1: 'st', 2: 'nd', 3: 'rd'};\r\n                    return Math.floor(number % 100 / 10) === 1 || !suffixes[n] ? 'th' : suffixes[n];\r\n                }\r\n            },\r\n            separators: /[ \\-+\\/.:@]/g,\r\n            validParts: /[dDjlNSwzWFmMntLoYyaABgGhHisueTIOPZcrU]/g,\r\n            intParts: /[djwNzmnyYhHgGis]/g,\r\n            tzParts: /\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,\r\n            tzClip: /[^-+\\dA-Z]/g\r\n        },\r\n        getInt: function (str, radix) {\r\n            return parseInt(str, (radix ? radix : 10));\r\n        },\r\n        compare: function (str1, str2) {\r\n            return typeof (str1) === 'string' && typeof (str2) === 'string' && str1.toLowerCase() === str2.toLowerCase();\r\n        },\r\n        lpad: function (value, length, chr) {\r\n            var val = value.toString();\r\n            chr = chr || '0';\r\n            return val.length < length ? $h.lpad(chr + val, length) : val;\r\n        },\r\n        merge: function (out) {\r\n            var i, obj;\r\n            out = out || {};\r\n            for (i = 1; i < arguments.length; i++) {\r\n                obj = arguments[i];\r\n                if (!obj) {\r\n                    continue;\r\n                }\r\n                for (var key in obj) {\r\n                    if (obj.hasOwnProperty(key)) {\r\n                        if (typeof obj[key] === 'object') {\r\n                            $h.merge(out[key], obj[key]);\r\n                        } else {\r\n                            out[key] = obj[key];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return out;\r\n        },\r\n        getIndex: function (val, arr) {\r\n            for (var i = 0; i < arr.length; i++) {\r\n                if (arr[i].toLowerCase() === val.toLowerCase()) {\r\n                    return i;\r\n                }\r\n            }\r\n            return -1;\r\n        }\r\n    };\r\n\r\n    /**\r\n     * Date Formatter Library Constructor\r\n     * @param options\r\n     * @constructor\r\n     */\r\n    DateFormatter = function (options) {\r\n        var self = this, config = $h.merge($h.defaults, options);\r\n        self.dateSettings = config.dateSettings;\r\n        self.separators = config.separators;\r\n        self.validParts = config.validParts;\r\n        self.intParts = config.intParts;\r\n        self.tzParts = config.tzParts;\r\n        self.tzClip = config.tzClip;\r\n    };\r\n\r\n    /**\r\n     * DateFormatter Library Prototype\r\n     */\r\n    DateFormatter.prototype = {\r\n        constructor: DateFormatter,\r\n        getMonth: function (val) {\r\n            var self = this, i;\r\n            i = $h.getIndex(val, self.dateSettings.monthsShort) + 1;\r\n            if (i === 0) {\r\n                i = $h.getIndex(val, self.dateSettings.months) + 1;\r\n            }\r\n            return i;\r\n        },\r\n        parseDate: function (vDate, vFormat) {\r\n            var self = this, vFormatParts, vDateParts, i, vDateFlag = false, vTimeFlag = false, vDatePart, iDatePart,\r\n                vSettings = self.dateSettings, vMonth, vMeriIndex, vMeriOffset, len, mer,\r\n                out = {date: null, year: null, month: null, day: null, hour: 0, min: 0, sec: 0};\r\n            if (!vDate) {\r\n                return null;\r\n            }\r\n            if (vDate instanceof Date) {\r\n                return vDate;\r\n            }\r\n            if (vFormat === 'U') {\r\n                i = $h.getInt(vDate);\r\n                return i ? new Date(i * 1000) : vDate;\r\n            }\r\n            switch (typeof vDate) {\r\n                case 'number':\r\n                    return new Date(vDate);\r\n                case 'string':\r\n                    break;\r\n                default:\r\n                    return null;\r\n            }\r\n            vFormatParts = vFormat.match(self.validParts);\r\n            if (!vFormatParts || vFormatParts.length === 0) {\r\n                throw new Error('Invalid date format definition.');\r\n            }\r\n            for (i = vFormatParts.length - 1; i >= 0; i--) {\r\n                if (vFormatParts[i] === 'S') {\r\n                    vFormatParts.splice(i, 1);\r\n                }\r\n            }\r\n            vDateParts = vDate.replace(self.separators, '\\0').split('\\0');\r\n            for (i = 0; i < vDateParts.length; i++) {\r\n                vDatePart = vDateParts[i];\r\n                iDatePart = $h.getInt(vDatePart);\r\n                switch (vFormatParts[i]) {\r\n                    case 'y':\r\n                    case 'Y':\r\n                        if (iDatePart) {\r\n                            len = vDatePart.length;\r\n                            out.year = len === 2 ? $h.getInt((iDatePart < 70 ? '20' : '19') + vDatePart) : iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vDateFlag = true;\r\n                        break;\r\n                    case 'm':\r\n                    case 'n':\r\n                    case 'M':\r\n                    case 'F':\r\n                        if (isNaN(iDatePart)) {\r\n                            vMonth = self.getMonth(vDatePart);\r\n                            if (vMonth > 0) {\r\n                                out.month = vMonth;\r\n                            } else {\r\n                                return null;\r\n                            }\r\n                        } else {\r\n                            if (iDatePart >= 1 && iDatePart <= 12) {\r\n                                out.month = iDatePart;\r\n                            } else {\r\n                                return null;\r\n                            }\r\n                        }\r\n                        vDateFlag = true;\r\n                        break;\r\n                    case 'd':\r\n                    case 'j':\r\n                        if (iDatePart >= 1 && iDatePart <= 31) {\r\n                            out.day = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vDateFlag = true;\r\n                        break;\r\n                    case 'g':\r\n                    case 'h':\r\n                        vMeriIndex = (vFormatParts.indexOf('a') > -1) ? vFormatParts.indexOf('a') :\r\n                            ((vFormatParts.indexOf('A') > -1) ? vFormatParts.indexOf('A') : -1);\r\n                        mer = vDateParts[vMeriIndex];\r\n                        if (vMeriIndex !== -1) {\r\n                            vMeriOffset = $h.compare(mer, vSettings.meridiem[0]) ? 0 :\r\n                                ($h.compare(mer, vSettings.meridiem[1]) ? 12 : -1);\r\n                            if (iDatePart >= 1 && iDatePart <= 12 && vMeriOffset !== -1) {\r\n                                out.hour = iDatePart % 12 === 0 ? vMeriOffset : iDatePart + vMeriOffset;\r\n                            } else {\r\n                                if (iDatePart >= 0 && iDatePart <= 23) {\r\n                                    out.hour = iDatePart;\r\n                                }\r\n                            }\r\n                        } else {\r\n                            if (iDatePart >= 0 && iDatePart <= 23) {\r\n                                out.hour = iDatePart;\r\n                            } else {\r\n                                return null;\r\n                            }\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                    case 'G':\r\n                    case 'H':\r\n                        if (iDatePart >= 0 && iDatePart <= 23) {\r\n                            out.hour = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                    case 'i':\r\n                        if (iDatePart >= 0 && iDatePart <= 59) {\r\n                            out.min = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                    case 's':\r\n                        if (iDatePart >= 0 && iDatePart <= 59) {\r\n                            out.sec = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                }\r\n            }\r\n            if (vDateFlag === true) {\r\n                var varY = out.year || 0, varM = out.month ? out.month - 1 : 0, varD = out.day || 1;\r\n                out.date = new Date(varY, varM, varD, out.hour, out.min, out.sec, 0);\r\n            } else {\r\n                if (vTimeFlag !== true) {\r\n                    return null;\r\n                }\r\n                out.date = new Date(0, 0, 0, out.hour, out.min, out.sec, 0);\r\n            }\r\n            return out.date;\r\n        },\r\n        guessDate: function (vDateStr, vFormat) {\r\n            if (typeof vDateStr !== 'string') {\r\n                return vDateStr;\r\n            }\r\n            var self = this, vParts = vDateStr.replace(self.separators, '\\0').split('\\0'), vPattern = /^[djmn]/g, len,\r\n                vFormatParts = vFormat.match(self.validParts), vDate = new Date(), vDigit = 0, vYear, i, n, iPart, iSec;\r\n\r\n            if (!vPattern.test(vFormatParts[0])) {\r\n                return vDateStr;\r\n            }\r\n\r\n            for (i = 0; i < vParts.length; i++) {\r\n                vDigit = 2;\r\n                iPart = vParts[i];\r\n                iSec = $h.getInt(iPart.substr(0, 2));\r\n                if (isNaN(iSec)) {\r\n                    return null;\r\n                }\r\n                switch (i) {\r\n                    case 0:\r\n                        if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {\r\n                            vDate.setMonth(iSec - 1);\r\n                        } else {\r\n                            vDate.setDate(iSec);\r\n                        }\r\n                        break;\r\n                    case 1:\r\n                        if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {\r\n                            vDate.setDate(iSec);\r\n                        } else {\r\n                            vDate.setMonth(iSec - 1);\r\n                        }\r\n                        break;\r\n                    case 2:\r\n                        vYear = vDate.getFullYear();\r\n                        len = iPart.length;\r\n                        vDigit = len < 4 ? len : 4;\r\n                        vYear = $h.getInt(len < 4 ? vYear.toString().substr(0, 4 - len) + iPart : iPart.substr(0, 4));\r\n                        if (!vYear) {\r\n                            return null;\r\n                        }\r\n                        vDate.setFullYear(vYear);\r\n                        break;\r\n                    case 3:\r\n                        vDate.setHours(iSec);\r\n                        break;\r\n                    case 4:\r\n                        vDate.setMinutes(iSec);\r\n                        break;\r\n                    case 5:\r\n                        vDate.setSeconds(iSec);\r\n                        break;\r\n                }\r\n                n = iPart.substr(vDigit);\r\n                if (n.length > 0) {\r\n                    vParts.splice(i + 1, 0, n);\r\n                }\r\n            }\r\n            return vDate;\r\n        },\r\n        parseFormat: function (vChar, vDate) {\r\n            var self = this, vSettings = self.dateSettings, fmt, backslash = /\\\\?(.?)/gi, doFormat = function (t, s) {\r\n                return fmt[t] ? fmt[t]() : s;\r\n            };\r\n            fmt = {\r\n                /////////\r\n                // DAY //\r\n                /////////\r\n                /**\r\n                 * Day of month with leading 0: `01..31`\r\n                 * @return {string}\r\n                 */\r\n                d: function () {\r\n                    return $h.lpad(fmt.j(), 2);\r\n                },\r\n                /**\r\n                 * Shorthand day name: `Mon...Sun`\r\n                 * @return {string}\r\n                 */\r\n                D: function () {\r\n                    return vSettings.daysShort[fmt.w()];\r\n                },\r\n                /**\r\n                 * Day of month: `1..31`\r\n                 * @return {number}\r\n                 */\r\n                j: function () {\r\n                    return vDate.getDate();\r\n                },\r\n                /**\r\n                 * Full day name: `Monday...Sunday`\r\n                 * @return {string}\r\n                 */\r\n                l: function () {\r\n                    return vSettings.days[fmt.w()];\r\n                },\r\n                /**\r\n                 * ISO-8601 day of week: `1[Mon]..7[Sun]`\r\n                 * @return {number}\r\n                 */\r\n                N: function () {\r\n                    return fmt.w() || 7;\r\n                },\r\n                /**\r\n                 * Day of week: `0[Sun]..6[Sat]`\r\n                 * @return {number}\r\n                 */\r\n                w: function () {\r\n                    return vDate.getDay();\r\n                },\r\n                /**\r\n                 * Day of year: `0..365`\r\n                 * @return {number}\r\n                 */\r\n                z: function () {\r\n                    var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j()), b = new Date(fmt.Y(), 0, 1);\r\n                    return Math.round((a - b) / $h.DAY);\r\n                },\r\n\r\n                //////////\r\n                // WEEK //\r\n                //////////\r\n                /**\r\n                 * ISO-8601 week number\r\n                 * @return {number}\r\n                 */\r\n                W: function () {\r\n                    var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j() - fmt.N() + 3), b = new Date(a.getFullYear(), 0, 4);\r\n                    return $h.lpad(1 + Math.round((a - b) / $h.DAY / 7), 2);\r\n                },\r\n\r\n                ///////////\r\n                // MONTH //\r\n                ///////////\r\n                /**\r\n                 * Full month name: `January...December`\r\n                 * @return {string}\r\n                 */\r\n                F: function () {\r\n                    return vSettings.months[vDate.getMonth()];\r\n                },\r\n                /**\r\n                 * Month w/leading 0: `01..12`\r\n                 * @return {string}\r\n                 */\r\n                m: function () {\r\n                    return $h.lpad(fmt.n(), 2);\r\n                },\r\n                /**\r\n                 * Shorthand month name; `Jan...Dec`\r\n                 * @return {string}\r\n                 */\r\n                M: function () {\r\n                    return vSettings.monthsShort[vDate.getMonth()];\r\n                },\r\n                /**\r\n                 * Month: `1...12`\r\n                 * @return {number}\r\n                 */\r\n                n: function () {\r\n                    return vDate.getMonth() + 1;\r\n                },\r\n                /**\r\n                 * Days in month: `28...31`\r\n                 * @return {number}\r\n                 */\r\n                t: function () {\r\n                    return (new Date(fmt.Y(), fmt.n(), 0)).getDate();\r\n                },\r\n\r\n                //////////\r\n                // YEAR //\r\n                //////////\r\n                /**\r\n                 * Is leap year? `0 or 1`\r\n                 * @return {number}\r\n                 */\r\n                L: function () {\r\n                    var Y = fmt.Y();\r\n                    return (Y % 4 === 0 && Y % 100 !== 0 || Y % 400 === 0) ? 1 : 0;\r\n                },\r\n                /**\r\n                 * ISO-8601 year\r\n                 * @return {number}\r\n                 */\r\n                o: function () {\r\n                    var n = fmt.n(), W = fmt.W(), Y = fmt.Y();\r\n                    return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);\r\n                },\r\n                /**\r\n                 * Full year: `e.g. 1980...2010`\r\n                 * @return {number}\r\n                 */\r\n                Y: function () {\r\n                    return vDate.getFullYear();\r\n                },\r\n                /**\r\n                 * Last two digits of year: `00...99`\r\n                 * @return {string}\r\n                 */\r\n                y: function () {\r\n                    return fmt.Y().toString().slice(-2);\r\n                },\r\n\r\n                //////////\r\n                // TIME //\r\n                //////////\r\n                /**\r\n                 * Meridian lower: `am or pm`\r\n                 * @return {string}\r\n                 */\r\n                a: function () {\r\n                    return fmt.A().toLowerCase();\r\n                },\r\n                /**\r\n                 * Meridian upper: `AM or PM`\r\n                 * @return {string}\r\n                 */\r\n                A: function () {\r\n                    var n = fmt.G() < 12 ? 0 : 1;\r\n                    return vSettings.meridiem[n];\r\n                },\r\n                /**\r\n                 * Swatch Internet time: `000..999`\r\n                 * @return {string}\r\n                 */\r\n                B: function () {\r\n                    var H = vDate.getUTCHours() * $h.HOUR, i = vDate.getUTCMinutes() * 60, s = vDate.getUTCSeconds();\r\n                    return $h.lpad(Math.floor((H + i + s + $h.HOUR) / 86.4) % 1000, 3);\r\n                },\r\n                /**\r\n                 * 12-Hours: `1..12`\r\n                 * @return {number}\r\n                 */\r\n                g: function () {\r\n                    return fmt.G() % 12 || 12;\r\n                },\r\n                /**\r\n                 * 24-Hours: `0..23`\r\n                 * @return {number}\r\n                 */\r\n                G: function () {\r\n                    return vDate.getHours();\r\n                },\r\n                /**\r\n                 * 12-Hours with leading 0: `01..12`\r\n                 * @return {string}\r\n                 */\r\n                h: function () {\r\n                    return $h.lpad(fmt.g(), 2);\r\n                },\r\n                /**\r\n                 * 24-Hours w/leading 0: `00..23`\r\n                 * @return {string}\r\n                 */\r\n                H: function () {\r\n                    return $h.lpad(fmt.G(), 2);\r\n                },\r\n                /**\r\n                 * Minutes w/leading 0: `00..59`\r\n                 * @return {string}\r\n                 */\r\n                i: function () {\r\n                    return $h.lpad(vDate.getMinutes(), 2);\r\n                },\r\n                /**\r\n                 * Seconds w/leading 0: `00..59`\r\n                 * @return {string}\r\n                 */\r\n                s: function () {\r\n                    return $h.lpad(vDate.getSeconds(), 2);\r\n                },\r\n                /**\r\n                 * Microseconds: `000000-999000`\r\n                 * @return {string}\r\n                 */\r\n                u: function () {\r\n                    return $h.lpad(vDate.getMilliseconds() * 1000, 6);\r\n                },\r\n\r\n                //////////////\r\n                // TIMEZONE //\r\n                //////////////\r\n                /**\r\n                 * Timezone identifier: `e.g. Atlantic/Azores, ...`\r\n                 * @return {string}\r\n                 */\r\n                e: function () {\r\n                    var str = /\\((.*)\\)/.exec(String(vDate))[1];\r\n                    return str || 'Coordinated Universal Time';\r\n                },\r\n                /**\r\n                 * DST observed? `0 or 1`\r\n                 * @return {number}\r\n                 */\r\n                I: function () {\r\n                    var a = new Date(fmt.Y(), 0), c = Date.UTC(fmt.Y(), 0),\r\n                        b = new Date(fmt.Y(), 6), d = Date.UTC(fmt.Y(), 6);\r\n                    return ((a - c) !== (b - d)) ? 1 : 0;\r\n                },\r\n                /**\r\n                 * Difference to GMT in hour format: `e.g. +0200`\r\n                 * @return {string}\r\n                 */\r\n                O: function () {\r\n                    var tzo = vDate.getTimezoneOffset(), a = Math.abs(tzo);\r\n                    return (tzo > 0 ? '-' : '+') + $h.lpad(Math.floor(a / 60) * 100 + a % 60, 4);\r\n                },\r\n                /**\r\n                 * Difference to GMT with colon: `e.g. +02:00`\r\n                 * @return {string}\r\n                 */\r\n                P: function () {\r\n                    var O = fmt.O();\r\n                    return (O.substr(0, 3) + ':' + O.substr(3, 2));\r\n                },\r\n                /**\r\n                 * Timezone abbreviation: `e.g. EST, MDT, ...`\r\n                 * @return {string}\r\n                 */\r\n                T: function () {\r\n                    var str = (String(vDate).match(self.tzParts) || ['']).pop().replace(self.tzClip, '');\r\n                    return str || 'UTC';\r\n                },\r\n                /**\r\n                 * Timezone offset in seconds: `-43200...50400`\r\n                 * @return {number}\r\n                 */\r\n                Z: function () {\r\n                    return -vDate.getTimezoneOffset() * 60;\r\n                },\r\n\r\n                ////////////////////\r\n                // FULL DATE TIME //\r\n                ////////////////////\r\n                /**\r\n                 * ISO-8601 date\r\n                 * @return {string}\r\n                 */\r\n                c: function () {\r\n                    return 'Y-m-d\\\\TH:i:sP'.replace(backslash, doFormat);\r\n                },\r\n                /**\r\n                 * RFC 2822 date\r\n                 * @return {string}\r\n                 */\r\n                r: function () {\r\n                    return 'D, d M Y H:i:s O'.replace(backslash, doFormat);\r\n                },\r\n                /**\r\n                 * Seconds since UNIX epoch\r\n                 * @return {number}\r\n                 */\r\n                U: function () {\r\n                    return vDate.getTime() / 1000 || 0;\r\n                }\r\n            };\r\n            return doFormat(vChar, vChar);\r\n        },\r\n        formatDate: function (vDate, vFormat) {\r\n            var self = this, i, n, len, str, vChar, vDateStr = '', BACKSLASH = '\\\\';\r\n            if (typeof vDate === 'string') {\r\n                vDate = self.parseDate(vDate, vFormat);\r\n                if (!vDate) {\r\n                    return null;\r\n                }\r\n            }\r\n            if (vDate instanceof Date) {\r\n                len = vFormat.length;\r\n                for (i = 0; i < len; i++) {\r\n                    vChar = vFormat.charAt(i);\r\n                    if (vChar === 'S' || vChar === BACKSLASH) {\r\n                        continue;\r\n                    }\r\n                    if (i > 0 && vFormat.charAt(i - 1) === BACKSLASH) {\r\n                        vDateStr += vChar;\r\n                        continue;\r\n                    }\r\n                    str = self.parseFormat(vChar, vDate);\r\n                    if (i !== (len - 1) && self.intParts.test(vChar) && vFormat.charAt(i + 1) === 'S') {\r\n                        n = $h.getInt(str) || 0;\r\n                        str += self.dateSettings.ordinal(n);\r\n                    }\r\n                    vDateStr += str;\r\n                }\r\n                return vDateStr;\r\n            }\r\n            return '';\r\n        }\r\n    };\r\n    return DateFormatter;\r\n}));","/******/ (function() { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./node_modules/locutus/php/array/array_diff.js\":\n/*!******************************************************!*\\\n  !*** ./node_modules/locutus/php/array/array_diff.js ***!\n  \\******************************************************/\n/***/ (function(module) {\n\n\n\nmodule.exports = function array_diff(arr1) {\n  // eslint-disable-line camelcase\n  //  discuss at: https://locutus.io/php/array_diff/\n  // original by: Kevin van Zonneveld (https://kvz.io)\n  // improved by: Sanjoy Roy\n  //  revised by: Brett Zamir (https://brett-zamir.me)\n  //   example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld'])\n  //   returns 1: {0:'Kevin'}\n\n  var retArr = {};\n  var argl = arguments.length;\n  var k1 = '';\n  var i = 1;\n  var k = '';\n  var arr = {};\n\n  arr1keys: for (k1 in arr1) {\n    // eslint-disable-line no-labels\n    for (i = 1; i < argl; i++) {\n      arr = arguments[i];\n      for (k in arr) {\n        if (arr[k] === arr1[k1]) {\n          // If it reaches here, it was found in at least one array, so try next value\n          continue arr1keys; // eslint-disable-line no-labels\n        }\n      }\n      retArr[k1] = arr1[k1];\n    }\n  }\n\n  return retArr;\n};\n//# sourceMappingURL=array_diff.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/datetime/strtotime.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/locutus/php/datetime/strtotime.js ***!\n  \\********************************************************/\n/***/ (function(module) {\n\n\n\nvar reSpace = '[ \\\\t]+';\nvar reSpaceOpt = '[ \\\\t]*';\nvar reMeridian = '(?:([ap])\\\\.?m\\\\.?([\\\\t ]|$))';\nvar reHour24 = '(2[0-4]|[01]?[0-9])';\nvar reHour24lz = '([01][0-9]|2[0-4])';\nvar reHour12 = '(0?[1-9]|1[0-2])';\nvar reMinute = '([0-5]?[0-9])';\nvar reMinutelz = '([0-5][0-9])';\nvar reSecond = '(60|[0-5]?[0-9])';\nvar reSecondlz = '(60|[0-5][0-9])';\nvar reFrac = '(?:\\\\.([0-9]+))';\n\nvar reDayfull = 'sunday|monday|tuesday|wednesday|thursday|friday|saturday';\nvar reDayabbr = 'sun|mon|tue|wed|thu|fri|sat';\nvar reDaytext = reDayfull + '|' + reDayabbr + '|weekdays?';\n\nvar reReltextnumber = 'first|second|third|fourth|fifth|sixth|seventh|eighth?|ninth|tenth|eleventh|twelfth';\nvar reReltexttext = 'next|last|previous|this';\nvar reReltextunit = '(?:second|sec|minute|min|hour|day|fortnight|forthnight|month|year)s?|weeks|' + reDaytext;\n\nvar reYear = '([0-9]{1,4})';\nvar reYear2 = '([0-9]{2})';\nvar reYear4 = '([0-9]{4})';\nvar reYear4withSign = '([+-]?[0-9]{4})';\nvar reMonth = '(1[0-2]|0?[0-9])';\nvar reMonthlz = '(0[0-9]|1[0-2])';\nvar reDay = '(?:(3[01]|[0-2]?[0-9])(?:st|nd|rd|th)?)';\nvar reDaylz = '(0[0-9]|[1-2][0-9]|3[01])';\n\nvar reMonthFull = 'january|february|march|april|may|june|july|august|september|october|november|december';\nvar reMonthAbbr = 'jan|feb|mar|apr|may|jun|jul|aug|sept?|oct|nov|dec';\nvar reMonthroman = 'i[vx]|vi{0,3}|xi{0,2}|i{1,3}';\nvar reMonthText = '(' + reMonthFull + '|' + reMonthAbbr + '|' + reMonthroman + ')';\n\nvar reTzCorrection = '((?:GMT)?([+-])' + reHour24 + ':?' + reMinute + '?)';\nvar reTzAbbr = '\\\\(?([a-zA-Z]{1,6})\\\\)?';\nvar reDayOfYear = '(00[1-9]|0[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6])';\nvar reWeekOfYear = '(0[1-9]|[1-4][0-9]|5[0-3])';\n\nvar reDateNoYear = reMonthText + '[ .\\\\t-]*' + reDay + '[,.stndrh\\\\t ]*';\n\nfunction processMeridian(hour, meridian) {\n  meridian = meridian && meridian.toLowerCase();\n\n  switch (meridian) {\n    case 'a':\n      hour += hour === 12 ? -12 : 0;\n      break;\n    case 'p':\n      hour += hour !== 12 ? 12 : 0;\n      break;\n  }\n\n  return hour;\n}\n\nfunction processYear(yearStr) {\n  var year = +yearStr;\n\n  if (yearStr.length < 4 && year < 100) {\n    year += year < 70 ? 2000 : 1900;\n  }\n\n  return year;\n}\n\nfunction lookupMonth(monthStr) {\n  return {\n    jan: 0,\n    january: 0,\n    i: 0,\n    feb: 1,\n    february: 1,\n    ii: 1,\n    mar: 2,\n    march: 2,\n    iii: 2,\n    apr: 3,\n    april: 3,\n    iv: 3,\n    may: 4,\n    v: 4,\n    jun: 5,\n    june: 5,\n    vi: 5,\n    jul: 6,\n    july: 6,\n    vii: 6,\n    aug: 7,\n    august: 7,\n    viii: 7,\n    sep: 8,\n    sept: 8,\n    september: 8,\n    ix: 8,\n    oct: 9,\n    october: 9,\n    x: 9,\n    nov: 10,\n    november: 10,\n    xi: 10,\n    dec: 11,\n    december: 11,\n    xii: 11\n  }[monthStr.toLowerCase()];\n}\n\nfunction lookupWeekday(dayStr) {\n  var desiredSundayNumber = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n  var dayNumbers = {\n    mon: 1,\n    monday: 1,\n    tue: 2,\n    tuesday: 2,\n    wed: 3,\n    wednesday: 3,\n    thu: 4,\n    thursday: 4,\n    fri: 5,\n    friday: 5,\n    sat: 6,\n    saturday: 6,\n    sun: 0,\n    sunday: 0\n  };\n\n  return dayNumbers[dayStr.toLowerCase()] || desiredSundayNumber;\n}\n\nfunction lookupRelative(relText) {\n  var relativeNumbers = {\n    last: -1,\n    previous: -1,\n    this: 0,\n    first: 1,\n    next: 1,\n    second: 2,\n    third: 3,\n    fourth: 4,\n    fifth: 5,\n    sixth: 6,\n    seventh: 7,\n    eight: 8,\n    eighth: 8,\n    ninth: 9,\n    tenth: 10,\n    eleventh: 11,\n    twelfth: 12\n  };\n\n  var relativeBehavior = {\n    this: 1\n  };\n\n  var relTextLower = relText.toLowerCase();\n\n  return {\n    amount: relativeNumbers[relTextLower],\n    behavior: relativeBehavior[relTextLower] || 0\n  };\n}\n\nfunction processTzCorrection(tzOffset, oldValue) {\n  var reTzCorrectionLoose = /(?:GMT)?([+-])(\\d+)(:?)(\\d{0,2})/i;\n  tzOffset = tzOffset && tzOffset.match(reTzCorrectionLoose);\n\n  if (!tzOffset) {\n    return oldValue;\n  }\n\n  var sign = tzOffset[1] === '-' ? -1 : 1;\n  var hours = +tzOffset[2];\n  var minutes = +tzOffset[4];\n\n  if (!tzOffset[4] && !tzOffset[3]) {\n    minutes = Math.floor(hours % 100);\n    hours = Math.floor(hours / 100);\n  }\n\n  // timezone offset in seconds\n  return sign * (hours * 60 + minutes) * 60;\n}\n\n// tz abbrevation : tz offset in seconds\nvar tzAbbrOffsets = {\n  acdt: 37800,\n  acst: 34200,\n  addt: -7200,\n  adt: -10800,\n  aedt: 39600,\n  aest: 36000,\n  ahdt: -32400,\n  ahst: -36000,\n  akdt: -28800,\n  akst: -32400,\n  amt: -13840,\n  apt: -10800,\n  ast: -14400,\n  awdt: 32400,\n  awst: 28800,\n  awt: -10800,\n  bdst: 7200,\n  bdt: -36000,\n  bmt: -14309,\n  bst: 3600,\n  cast: 34200,\n  cat: 7200,\n  cddt: -14400,\n  cdt: -18000,\n  cemt: 10800,\n  cest: 7200,\n  cet: 3600,\n  cmt: -15408,\n  cpt: -18000,\n  cst: -21600,\n  cwt: -18000,\n  chst: 36000,\n  dmt: -1521,\n  eat: 10800,\n  eddt: -10800,\n  edt: -14400,\n  eest: 10800,\n  eet: 7200,\n  emt: -26248,\n  ept: -14400,\n  est: -18000,\n  ewt: -14400,\n  ffmt: -14660,\n  fmt: -4056,\n  gdt: 39600,\n  gmt: 0,\n  gst: 36000,\n  hdt: -34200,\n  hkst: 32400,\n  hkt: 28800,\n  hmt: -19776,\n  hpt: -34200,\n  hst: -36000,\n  hwt: -34200,\n  iddt: 14400,\n  idt: 10800,\n  imt: 25025,\n  ist: 7200,\n  jdt: 36000,\n  jmt: 8440,\n  jst: 32400,\n  kdt: 36000,\n  kmt: 5736,\n  kst: 30600,\n  lst: 9394,\n  mddt: -18000,\n  mdst: 16279,\n  mdt: -21600,\n  mest: 7200,\n  met: 3600,\n  mmt: 9017,\n  mpt: -21600,\n  msd: 14400,\n  msk: 10800,\n  mst: -25200,\n  mwt: -21600,\n  nddt: -5400,\n  ndt: -9052,\n  npt: -9000,\n  nst: -12600,\n  nwt: -9000,\n  nzdt: 46800,\n  nzmt: 41400,\n  nzst: 43200,\n  pddt: -21600,\n  pdt: -25200,\n  pkst: 21600,\n  pkt: 18000,\n  plmt: 25590,\n  pmt: -13236,\n  ppmt: -17340,\n  ppt: -25200,\n  pst: -28800,\n  pwt: -25200,\n  qmt: -18840,\n  rmt: 5794,\n  sast: 7200,\n  sdmt: -16800,\n  sjmt: -20173,\n  smt: -13884,\n  sst: -39600,\n  tbmt: 10751,\n  tmt: 12344,\n  uct: 0,\n  utc: 0,\n  wast: 7200,\n  wat: 3600,\n  wemt: 7200,\n  west: 3600,\n  wet: 0,\n  wib: 25200,\n  wita: 28800,\n  wit: 32400,\n  wmt: 5040,\n  yddt: -25200,\n  ydt: -28800,\n  ypt: -28800,\n  yst: -32400,\n  ywt: -28800,\n  a: 3600,\n  b: 7200,\n  c: 10800,\n  d: 14400,\n  e: 18000,\n  f: 21600,\n  g: 25200,\n  h: 28800,\n  i: 32400,\n  k: 36000,\n  l: 39600,\n  m: 43200,\n  n: -3600,\n  o: -7200,\n  p: -10800,\n  q: -14400,\n  r: -18000,\n  s: -21600,\n  t: -25200,\n  u: -28800,\n  v: -32400,\n  w: -36000,\n  x: -39600,\n  y: -43200,\n  z: 0\n};\n\nvar formats = {\n  yesterday: {\n    regex: /^yesterday/i,\n    name: 'yesterday',\n    callback: function callback() {\n      this.rd -= 1;\n      return this.resetTime();\n    }\n  },\n\n  now: {\n    regex: /^now/i,\n    name: 'now'\n    // do nothing\n  },\n\n  noon: {\n    regex: /^noon/i,\n    name: 'noon',\n    callback: function callback() {\n      return this.resetTime() && this.time(12, 0, 0, 0);\n    }\n  },\n\n  midnightOrToday: {\n    regex: /^(midnight|today)/i,\n    name: 'midnight | today',\n    callback: function callback() {\n      return this.resetTime();\n    }\n  },\n\n  tomorrow: {\n    regex: /^tomorrow/i,\n    name: 'tomorrow',\n    callback: function callback() {\n      this.rd += 1;\n      return this.resetTime();\n    }\n  },\n\n  timestamp: {\n    regex: /^@(-?\\d+)/i,\n    name: 'timestamp',\n    callback: function callback(match, timestamp) {\n      this.rs += +timestamp;\n      this.y = 1970;\n      this.m = 0;\n      this.d = 1;\n      this.dates = 0;\n\n      return this.resetTime() && this.zone(0);\n    }\n  },\n\n  firstOrLastDay: {\n    regex: /^(first|last) day of/i,\n    name: 'firstdayof | lastdayof',\n    callback: function callback(match, day) {\n      if (day.toLowerCase() === 'first') {\n        this.firstOrLastDayOfMonth = 1;\n      } else {\n        this.firstOrLastDayOfMonth = -1;\n      }\n    }\n  },\n\n  backOrFrontOf: {\n    regex: RegExp('^(back|front) of ' + reHour24 + reSpaceOpt + reMeridian + '?', 'i'),\n    name: 'backof | frontof',\n    callback: function callback(match, side, hours, meridian) {\n      var back = side.toLowerCase() === 'back';\n      var hour = +hours;\n      var minute = 15;\n\n      if (!back) {\n        hour -= 1;\n        minute = 45;\n      }\n\n      hour = processMeridian(hour, meridian);\n\n      return this.resetTime() && this.time(hour, minute, 0, 0);\n    }\n  },\n\n  weekdayOf: {\n    regex: RegExp('^(' + reReltextnumber + '|' + reReltexttext + ')' + reSpace + '(' + reDayfull + '|' + reDayabbr + ')' + reSpace + 'of', 'i'),\n    name: 'weekdayof'\n    // todo\n  },\n\n  mssqltime: {\n    regex: RegExp('^' + reHour12 + ':' + reMinutelz + ':' + reSecondlz + '[:.]([0-9]+)' + reMeridian, 'i'),\n    name: 'mssqltime',\n    callback: function callback(match, hour, minute, second, frac, meridian) {\n      return this.time(processMeridian(+hour, meridian), +minute, +second, +frac.substr(0, 3));\n    }\n  },\n\n  timeLong12: {\n    regex: RegExp('^' + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),\n    name: 'timelong12',\n    callback: function callback(match, hour, minute, second, meridian) {\n      return this.time(processMeridian(+hour, meridian), +minute, +second, 0);\n    }\n  },\n\n  timeShort12: {\n    regex: RegExp('^' + reHour12 + '[:.]' + reMinutelz + reSpaceOpt + reMeridian, 'i'),\n    name: 'timeshort12',\n    callback: function callback(match, hour, minute, meridian) {\n      return this.time(processMeridian(+hour, meridian), +minute, 0, 0);\n    }\n  },\n\n  timeTiny12: {\n    regex: RegExp('^' + reHour12 + reSpaceOpt + reMeridian, 'i'),\n    name: 'timetiny12',\n    callback: function callback(match, hour, meridian) {\n      return this.time(processMeridian(+hour, meridian), 0, 0, 0);\n    }\n  },\n\n  soap: {\n    regex: RegExp('^' + reYear4 + '-' + reMonthlz + '-' + reDaylz + 'T' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz + reFrac + reTzCorrection + '?', 'i'),\n    name: 'soap',\n    callback: function callback(match, year, month, day, hour, minute, second, frac, tzCorrection) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, +frac.substr(0, 3)) && this.zone(processTzCorrection(tzCorrection));\n    }\n  },\n\n  wddx: {\n    regex: RegExp('^' + reYear4 + '-' + reMonth + '-' + reDay + 'T' + reHour24 + ':' + reMinute + ':' + reSecond),\n    name: 'wddx',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  exif: {\n    regex: RegExp('^' + reYear4 + ':' + reMonthlz + ':' + reDaylz + ' ' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz, 'i'),\n    name: 'exif',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  xmlRpc: {\n    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz + 'T' + reHour24 + ':' + reMinutelz + ':' + reSecondlz),\n    name: 'xmlrpc',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  xmlRpcNoColon: {\n    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz + '[Tt]' + reHour24 + reMinutelz + reSecondlz),\n    name: 'xmlrpcnocolon',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  clf: {\n    regex: RegExp('^' + reDay + '/(' + reMonthAbbr + ')/' + reYear4 + ':' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz + reSpace + reTzCorrection, 'i'),\n    name: 'clf',\n    callback: function callback(match, day, month, year, hour, minute, second, tzCorrection) {\n      return this.ymd(+year, lookupMonth(month), +day) && this.time(+hour, +minute, +second, 0) && this.zone(processTzCorrection(tzCorrection));\n    }\n  },\n\n  iso8601long: {\n    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond + reFrac, 'i'),\n    name: 'iso8601long',\n    callback: function callback(match, hour, minute, second, frac) {\n      return this.time(+hour, +minute, +second, +frac.substr(0, 3));\n    }\n  },\n\n  dateTextual: {\n    regex: RegExp('^' + reMonthText + '[ .\\\\t-]*' + reDay + '[,.stndrh\\\\t ]+' + reYear, 'i'),\n    name: 'datetextual',\n    callback: function callback(match, month, day, year) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  pointedDate4: {\n    regex: RegExp('^' + reDay + '[.\\\\t-]' + reMonth + '[.-]' + reYear4),\n    name: 'pointeddate4',\n    callback: function callback(match, day, month, year) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  pointedDate2: {\n    regex: RegExp('^' + reDay + '[.\\\\t]' + reMonth + '\\\\.' + reYear2),\n    name: 'pointeddate2',\n    callback: function callback(match, day, month, year) {\n      return this.ymd(processYear(year), month - 1, +day);\n    }\n  },\n\n  timeLong24: {\n    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond),\n    name: 'timelong24',\n    callback: function callback(match, hour, minute, second) {\n      return this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  dateNoColon: {\n    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz),\n    name: 'datenocolon',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  pgydotd: {\n    regex: RegExp('^' + reYear4 + '\\\\.?' + reDayOfYear),\n    name: 'pgydotd',\n    callback: function callback(match, year, day) {\n      return this.ymd(+year, 0, +day);\n    }\n  },\n\n  timeShort24: {\n    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute, 'i'),\n    name: 'timeshort24',\n    callback: function callback(match, hour, minute) {\n      return this.time(+hour, +minute, 0, 0);\n    }\n  },\n\n  iso8601noColon: {\n    regex: RegExp('^t?' + reHour24lz + reMinutelz + reSecondlz, 'i'),\n    name: 'iso8601nocolon',\n    callback: function callback(match, hour, minute, second) {\n      return this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  iso8601dateSlash: {\n    // eventhough the trailing slash is optional in PHP\n    // here it's mandatory and inputs without the slash\n    // are handled by dateslash\n    regex: RegExp('^' + reYear4 + '/' + reMonthlz + '/' + reDaylz + '/'),\n    name: 'iso8601dateslash',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  dateSlash: {\n    regex: RegExp('^' + reYear4 + '/' + reMonth + '/' + reDay),\n    name: 'dateslash',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  american: {\n    regex: RegExp('^' + reMonth + '/' + reDay + '/' + reYear),\n    name: 'american',\n    callback: function callback(match, month, day, year) {\n      return this.ymd(processYear(year), month - 1, +day);\n    }\n  },\n\n  americanShort: {\n    regex: RegExp('^' + reMonth + '/' + reDay),\n    name: 'americanshort',\n    callback: function callback(match, month, day) {\n      return this.ymd(this.y, month - 1, +day);\n    }\n  },\n\n  gnuDateShortOrIso8601date2: {\n    // iso8601date2 is complete subset of gnudateshort\n    regex: RegExp('^' + reYear + '-' + reMonth + '-' + reDay),\n    name: 'gnudateshort | iso8601date2',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(processYear(year), month - 1, +day);\n    }\n  },\n\n  iso8601date4: {\n    regex: RegExp('^' + reYear4withSign + '-' + reMonthlz + '-' + reDaylz),\n    name: 'iso8601date4',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  gnuNoColon: {\n    regex: RegExp('^t?' + reHour24lz + reMinutelz, 'i'),\n    name: 'gnunocolon',\n    callback: function callback(match, hour, minute) {\n      // this rule is a special case\n      // if time was already set once by any preceding rule, it sets the captured value as year\n      switch (this.times) {\n        case 0:\n          return this.time(+hour, +minute, 0, this.f);\n        case 1:\n          this.y = hour * 100 + +minute;\n          this.times++;\n\n          return true;\n        default:\n          return false;\n      }\n    }\n  },\n\n  gnuDateShorter: {\n    regex: RegExp('^' + reYear4 + '-' + reMonth),\n    name: 'gnudateshorter',\n    callback: function callback(match, year, month) {\n      return this.ymd(+year, month - 1, 1);\n    }\n  },\n\n  pgTextReverse: {\n    // note: allowed years are from 32-9999\n    // years below 32 should be treated as days in datefull\n    regex: RegExp('^' + '(\\\\d{3,4}|[4-9]\\\\d|3[2-9])-(' + reMonthAbbr + ')-' + reDaylz, 'i'),\n    name: 'pgtextreverse',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  dateFull: {\n    regex: RegExp('^' + reDay + '[ \\\\t.-]*' + reMonthText + '[ \\\\t.-]*' + reYear, 'i'),\n    name: 'datefull',\n    callback: function callback(match, day, month, year) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  dateNoDay: {\n    regex: RegExp('^' + reMonthText + '[ .\\\\t-]*' + reYear4, 'i'),\n    name: 'datenoday',\n    callback: function callback(match, month, year) {\n      return this.ymd(+year, lookupMonth(month), 1);\n    }\n  },\n\n  dateNoDayRev: {\n    regex: RegExp('^' + reYear4 + '[ .\\\\t-]*' + reMonthText, 'i'),\n    name: 'datenodayrev',\n    callback: function callback(match, year, month) {\n      return this.ymd(+year, lookupMonth(month), 1);\n    }\n  },\n\n  pgTextShort: {\n    regex: RegExp('^(' + reMonthAbbr + ')-' + reDaylz + '-' + reYear, 'i'),\n    name: 'pgtextshort',\n    callback: function callback(match, month, day, year) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  dateNoYear: {\n    regex: RegExp('^' + reDateNoYear, 'i'),\n    name: 'datenoyear',\n    callback: function callback(match, month, day) {\n      return this.ymd(this.y, lookupMonth(month), +day);\n    }\n  },\n\n  dateNoYearRev: {\n    regex: RegExp('^' + reDay + '[ .\\\\t-]*' + reMonthText, 'i'),\n    name: 'datenoyearrev',\n    callback: function callback(match, day, month) {\n      return this.ymd(this.y, lookupMonth(month), +day);\n    }\n  },\n\n  isoWeekDay: {\n    regex: RegExp('^' + reYear4 + '-?W' + reWeekOfYear + '(?:-?([0-7]))?'),\n    name: 'isoweekday | isoweek',\n    callback: function callback(match, year, week, day) {\n      day = day ? +day : 1;\n\n      if (!this.ymd(+year, 0, 1)) {\n        return false;\n      }\n\n      // get day of week for Jan 1st\n      var dayOfWeek = new Date(this.y, this.m, this.d).getDay();\n\n      // and use the day to figure out the offset for day 1 of week 1\n      dayOfWeek = 0 - (dayOfWeek > 4 ? dayOfWeek - 7 : dayOfWeek);\n\n      this.rd += dayOfWeek + (week - 1) * 7 + day;\n    }\n  },\n\n  relativeText: {\n    regex: RegExp('^(' + reReltextnumber + '|' + reReltexttext + ')' + reSpace + '(' + reReltextunit + ')', 'i'),\n    name: 'relativetext',\n    callback: function callback(match, relValue, relUnit) {\n      // todo: implement handling of 'this time-unit'\n      // eslint-disable-next-line no-unused-vars\n      var _lookupRelative = lookupRelative(relValue),\n          amount = _lookupRelative.amount,\n          behavior = _lookupRelative.behavior;\n\n      switch (relUnit.toLowerCase()) {\n        case 'sec':\n        case 'secs':\n        case 'second':\n        case 'seconds':\n          this.rs += amount;\n          break;\n        case 'min':\n        case 'mins':\n        case 'minute':\n        case 'minutes':\n          this.ri += amount;\n          break;\n        case 'hour':\n        case 'hours':\n          this.rh += amount;\n          break;\n        case 'day':\n        case 'days':\n          this.rd += amount;\n          break;\n        case 'fortnight':\n        case 'fortnights':\n        case 'forthnight':\n        case 'forthnights':\n          this.rd += amount * 14;\n          break;\n        case 'week':\n        case 'weeks':\n          this.rd += amount * 7;\n          break;\n        case 'month':\n        case 'months':\n          this.rm += amount;\n          break;\n        case 'year':\n        case 'years':\n          this.ry += amount;\n          break;\n        case 'mon':case 'monday':\n        case 'tue':case 'tuesday':\n        case 'wed':case 'wednesday':\n        case 'thu':case 'thursday':\n        case 'fri':case 'friday':\n        case 'sat':case 'saturday':\n        case 'sun':case 'sunday':\n          this.resetTime();\n          this.weekday = lookupWeekday(relUnit, 7);\n          this.weekdayBehavior = 1;\n          this.rd += (amount > 0 ? amount - 1 : amount) * 7;\n          break;\n        case 'weekday':\n        case 'weekdays':\n          // todo\n          break;\n      }\n    }\n  },\n\n  relative: {\n    regex: RegExp('^([+-]*)[ \\\\t]*(\\\\d+)' + reSpaceOpt + '(' + reReltextunit + '|week)', 'i'),\n    name: 'relative',\n    callback: function callback(match, signs, relValue, relUnit) {\n      var minuses = signs.replace(/[^-]/g, '').length;\n\n      var amount = +relValue * Math.pow(-1, minuses);\n\n      switch (relUnit.toLowerCase()) {\n        case 'sec':\n        case 'secs':\n        case 'second':\n        case 'seconds':\n          this.rs += amount;\n          break;\n        case 'min':\n        case 'mins':\n        case 'minute':\n        case 'minutes':\n          this.ri += amount;\n          break;\n        case 'hour':\n        case 'hours':\n          this.rh += amount;\n          break;\n        case 'day':\n        case 'days':\n          this.rd += amount;\n          break;\n        case 'fortnight':\n        case 'fortnights':\n        case 'forthnight':\n        case 'forthnights':\n          this.rd += amount * 14;\n          break;\n        case 'week':\n        case 'weeks':\n          this.rd += amount * 7;\n          break;\n        case 'month':\n        case 'months':\n          this.rm += amount;\n          break;\n        case 'year':\n        case 'years':\n          this.ry += amount;\n          break;\n        case 'mon':case 'monday':\n        case 'tue':case 'tuesday':\n        case 'wed':case 'wednesday':\n        case 'thu':case 'thursday':\n        case 'fri':case 'friday':\n        case 'sat':case 'saturday':\n        case 'sun':case 'sunday':\n          this.resetTime();\n          this.weekday = lookupWeekday(relUnit, 7);\n          this.weekdayBehavior = 1;\n          this.rd += (amount > 0 ? amount - 1 : amount) * 7;\n          break;\n        case 'weekday':\n        case 'weekdays':\n          // todo\n          break;\n      }\n    }\n  },\n\n  dayText: {\n    regex: RegExp('^(' + reDaytext + ')', 'i'),\n    name: 'daytext',\n    callback: function callback(match, dayText) {\n      this.resetTime();\n      this.weekday = lookupWeekday(dayText, 0);\n\n      if (this.weekdayBehavior !== 2) {\n        this.weekdayBehavior = 1;\n      }\n    }\n  },\n\n  relativeTextWeek: {\n    regex: RegExp('^(' + reReltexttext + ')' + reSpace + 'week', 'i'),\n    name: 'relativetextweek',\n    callback: function callback(match, relText) {\n      this.weekdayBehavior = 2;\n\n      switch (relText.toLowerCase()) {\n        case 'this':\n          this.rd += 0;\n          break;\n        case 'next':\n          this.rd += 7;\n          break;\n        case 'last':\n        case 'previous':\n          this.rd -= 7;\n          break;\n      }\n\n      if (isNaN(this.weekday)) {\n        this.weekday = 1;\n      }\n    }\n  },\n\n  monthFullOrMonthAbbr: {\n    regex: RegExp('^(' + reMonthFull + '|' + reMonthAbbr + ')', 'i'),\n    name: 'monthfull | monthabbr',\n    callback: function callback(match, month) {\n      return this.ymd(this.y, lookupMonth(month), this.d);\n    }\n  },\n\n  tzCorrection: {\n    regex: RegExp('^' + reTzCorrection, 'i'),\n    name: 'tzcorrection',\n    callback: function callback(tzCorrection) {\n      return this.zone(processTzCorrection(tzCorrection));\n    }\n  },\n\n  tzAbbr: {\n    regex: RegExp('^' + reTzAbbr),\n    name: 'tzabbr',\n    callback: function callback(match, abbr) {\n      var offset = tzAbbrOffsets[abbr.toLowerCase()];\n\n      if (isNaN(offset)) {\n        return false;\n      }\n\n      return this.zone(offset);\n    }\n  },\n\n  ago: {\n    regex: /^ago/i,\n    name: 'ago',\n    callback: function callback() {\n      this.ry = -this.ry;\n      this.rm = -this.rm;\n      this.rd = -this.rd;\n      this.rh = -this.rh;\n      this.ri = -this.ri;\n      this.rs = -this.rs;\n      this.rf = -this.rf;\n    }\n  },\n\n  year4: {\n    regex: RegExp('^' + reYear4),\n    name: 'year4',\n    callback: function callback(match, year) {\n      this.y = +year;\n      return true;\n    }\n  },\n\n  whitespace: {\n    regex: /^[ .,\\t]+/,\n    name: 'whitespace'\n    // do nothing\n  },\n\n  dateShortWithTimeLong: {\n    regex: RegExp('^' + reDateNoYear + 't?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond, 'i'),\n    name: 'dateshortwithtimelong',\n    callback: function callback(match, month, day, hour, minute, second) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  dateShortWithTimeLong12: {\n    regex: RegExp('^' + reDateNoYear + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),\n    name: 'dateshortwithtimelong12',\n    callback: function callback(match, month, day, hour, minute, second, meridian) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(processMeridian(+hour, meridian), +minute, +second, 0);\n    }\n  },\n\n  dateShortWithTimeShort: {\n    regex: RegExp('^' + reDateNoYear + 't?' + reHour24 + '[:.]' + reMinute, 'i'),\n    name: 'dateshortwithtimeshort',\n    callback: function callback(match, month, day, hour, minute) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(+hour, +minute, 0, 0);\n    }\n  },\n\n  dateShortWithTimeShort12: {\n    regex: RegExp('^' + reDateNoYear + reHour12 + '[:.]' + reMinutelz + reSpaceOpt + reMeridian, 'i'),\n    name: 'dateshortwithtimeshort12',\n    callback: function callback(match, month, day, hour, minute, meridian) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(processMeridian(+hour, meridian), +minute, 0, 0);\n    }\n  }\n};\n\nvar resultProto = {\n  // date\n  y: NaN,\n  m: NaN,\n  d: NaN,\n  // time\n  h: NaN,\n  i: NaN,\n  s: NaN,\n  f: NaN,\n\n  // relative shifts\n  ry: 0,\n  rm: 0,\n  rd: 0,\n  rh: 0,\n  ri: 0,\n  rs: 0,\n  rf: 0,\n\n  // weekday related shifts\n  weekday: NaN,\n  weekdayBehavior: 0,\n\n  // first or last day of month\n  // 0 none, 1 first, -1 last\n  firstOrLastDayOfMonth: 0,\n\n  // timezone correction in minutes\n  z: NaN,\n\n  // counters\n  dates: 0,\n  times: 0,\n  zones: 0,\n\n  // helper functions\n  ymd: function ymd(y, m, d) {\n    if (this.dates > 0) {\n      return false;\n    }\n\n    this.dates++;\n    this.y = y;\n    this.m = m;\n    this.d = d;\n    return true;\n  },\n  time: function time(h, i, s, f) {\n    if (this.times > 0) {\n      return false;\n    }\n\n    this.times++;\n    this.h = h;\n    this.i = i;\n    this.s = s;\n    this.f = f;\n\n    return true;\n  },\n  resetTime: function resetTime() {\n    this.h = 0;\n    this.i = 0;\n    this.s = 0;\n    this.f = 0;\n    this.times = 0;\n\n    return true;\n  },\n  zone: function zone(minutes) {\n    if (this.zones <= 1) {\n      this.zones++;\n      this.z = minutes;\n      return true;\n    }\n\n    return false;\n  },\n  toDate: function toDate(relativeTo) {\n    if (this.dates && !this.times) {\n      this.h = this.i = this.s = this.f = 0;\n    }\n\n    // fill holes\n    if (isNaN(this.y)) {\n      this.y = relativeTo.getFullYear();\n    }\n\n    if (isNaN(this.m)) {\n      this.m = relativeTo.getMonth();\n    }\n\n    if (isNaN(this.d)) {\n      this.d = relativeTo.getDate();\n    }\n\n    if (isNaN(this.h)) {\n      this.h = relativeTo.getHours();\n    }\n\n    if (isNaN(this.i)) {\n      this.i = relativeTo.getMinutes();\n    }\n\n    if (isNaN(this.s)) {\n      this.s = relativeTo.getSeconds();\n    }\n\n    if (isNaN(this.f)) {\n      this.f = relativeTo.getMilliseconds();\n    }\n\n    // adjust special early\n    switch (this.firstOrLastDayOfMonth) {\n      case 1:\n        this.d = 1;\n        break;\n      case -1:\n        this.d = 0;\n        this.m += 1;\n        break;\n    }\n\n    if (!isNaN(this.weekday)) {\n      var date = new Date(relativeTo.getTime());\n      date.setFullYear(this.y, this.m, this.d);\n      date.setHours(this.h, this.i, this.s, this.f);\n\n      var dow = date.getDay();\n\n      if (this.weekdayBehavior === 2) {\n        // To make \"this week\" work, where the current day of week is a \"sunday\"\n        if (dow === 0 && this.weekday !== 0) {\n          this.weekday = -6;\n        }\n\n        // To make \"sunday this week\" work, where the current day of week is not a \"sunday\"\n        if (this.weekday === 0 && dow !== 0) {\n          this.weekday = 7;\n        }\n\n        this.d -= dow;\n        this.d += this.weekday;\n      } else {\n        var diff = this.weekday - dow;\n\n        // some PHP magic\n        if (this.rd < 0 && diff < 0 || this.rd >= 0 && diff <= -this.weekdayBehavior) {\n          diff += 7;\n        }\n\n        if (this.weekday >= 0) {\n          this.d += diff;\n        } else {\n          this.d -= 7 - (Math.abs(this.weekday) - dow);\n        }\n\n        this.weekday = NaN;\n      }\n    }\n\n    // adjust relative\n    this.y += this.ry;\n    this.m += this.rm;\n    this.d += this.rd;\n\n    this.h += this.rh;\n    this.i += this.ri;\n    this.s += this.rs;\n    this.f += this.rf;\n\n    this.ry = this.rm = this.rd = 0;\n    this.rh = this.ri = this.rs = this.rf = 0;\n\n    var result = new Date(relativeTo.getTime());\n    // since Date constructor treats years <= 99 as 1900+\n    // it can't be used, thus this weird way\n    result.setFullYear(this.y, this.m, this.d);\n    result.setHours(this.h, this.i, this.s, this.f);\n\n    // note: this is done twice in PHP\n    // early when processing special relatives\n    // and late\n    // todo: check if the logic can be reduced\n    // to just one time action\n    switch (this.firstOrLastDayOfMonth) {\n      case 1:\n        result.setDate(1);\n        break;\n      case -1:\n        result.setMonth(result.getMonth() + 1, 0);\n        break;\n    }\n\n    // adjust timezone\n    if (!isNaN(this.z) && result.getTimezoneOffset() !== this.z) {\n      result.setUTCFullYear(result.getFullYear(), result.getMonth(), result.getDate());\n\n      result.setUTCHours(result.getHours(), result.getMinutes(), result.getSeconds() - this.z, result.getMilliseconds());\n    }\n\n    return result;\n  }\n};\n\nmodule.exports = function strtotime(str, now) {\n  //       discuss at: https://locutus.io/php/strtotime/\n  //      original by: Caio Ariede (https://caioariede.com)\n  //      improved by: Kevin van Zonneveld (https://kvz.io)\n  //      improved by: Caio Ariede (https://caioariede.com)\n  //      improved by: A. Matías Quezada (https://amatiasq.com)\n  //      improved by: preuter\n  //      improved by: Brett Zamir (https://brett-zamir.me)\n  //      improved by: Mirko Faber\n  //         input by: David\n  //      bugfixed by: Wagner B. Soares\n  //      bugfixed by: Artur Tchernychev\n  //      bugfixed by: Stephan Bösch-Plepelits (https://github.com/plepe)\n  // reimplemented by: Rafał Kukawski\n  //           note 1: Examples all have a fixed timestamp to prevent\n  //           note 1: tests to fail because of variable time(zones)\n  //        example 1: strtotime('+1 day', 1129633200)\n  //        returns 1: 1129719600\n  //        example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200)\n  //        returns 2: 1130425202\n  //        example 3: strtotime('last month', 1129633200)\n  //        returns 3: 1127041200\n  //        example 4: strtotime('2009-05-04 08:30:00+00')\n  //        returns 4: 1241425800\n  //        example 5: strtotime('2009-05-04 08:30:00+02:00')\n  //        returns 5: 1241418600\n  //        example 6: strtotime('2009-05-04 08:30:00 YWT')\n  //        returns 6: 1241454600\n\n  if (now == null) {\n    now = Math.floor(Date.now() / 1000);\n  }\n\n  // the rule order is important\n  // if multiple rules match, the longest match wins\n  // if multiple rules match the same string, the first match wins\n  var rules = [formats.yesterday, formats.now, formats.noon, formats.midnightOrToday, formats.tomorrow, formats.timestamp, formats.firstOrLastDay, formats.backOrFrontOf,\n  // formats.weekdayOf, // not yet implemented\n  formats.timeTiny12, formats.timeShort12, formats.timeLong12, formats.mssqltime, formats.timeShort24, formats.timeLong24, formats.iso8601long, formats.gnuNoColon, formats.iso8601noColon, formats.americanShort, formats.american, formats.iso8601date4, formats.iso8601dateSlash, formats.dateSlash, formats.gnuDateShortOrIso8601date2, formats.gnuDateShorter, formats.dateFull, formats.pointedDate4, formats.pointedDate2, formats.dateNoDay, formats.dateNoDayRev, formats.dateTextual, formats.dateNoYear, formats.dateNoYearRev, formats.dateNoColon, formats.xmlRpc, formats.xmlRpcNoColon, formats.soap, formats.wddx, formats.exif, formats.pgydotd, formats.isoWeekDay, formats.pgTextShort, formats.pgTextReverse, formats.clf, formats.year4, formats.ago, formats.dayText, formats.relativeTextWeek, formats.relativeText, formats.monthFullOrMonthAbbr, formats.tzCorrection, formats.tzAbbr, formats.dateShortWithTimeShort12, formats.dateShortWithTimeLong12, formats.dateShortWithTimeShort, formats.dateShortWithTimeLong, formats.relative, formats.whitespace];\n\n  var result = Object.create(resultProto);\n\n  while (str.length) {\n    var longestMatch = null;\n    var finalRule = null;\n\n    for (var i = 0, l = rules.length; i < l; i++) {\n      var format = rules[i];\n\n      var match = str.match(format.regex);\n\n      if (match) {\n        if (!longestMatch || match[0].length > longestMatch[0].length) {\n          longestMatch = match;\n          finalRule = format;\n        }\n      }\n    }\n\n    if (!finalRule || finalRule.callback && finalRule.callback.apply(result, longestMatch) === false) {\n      return false;\n    }\n\n    str = str.substr(longestMatch[0].length);\n    finalRule = null;\n    longestMatch = null;\n  }\n\n  return Math.floor(result.toDate(new Date(now * 1000)) / 1000);\n};\n//# sourceMappingURL=strtotime.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/info/ini_get.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/locutus/php/info/ini_get.js ***!\n  \\**************************************************/\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\n\nmodule.exports = function ini_get(varname) {\n  // eslint-disable-line camelcase\n  //  discuss at: https://locutus.io/php/ini_get/\n  // original by: Brett Zamir (https://brett-zamir.me)\n  //      note 1: The ini values must be set by ini_set or manually within an ini file\n  //   example 1: ini_set('date.timezone', 'Asia/Hong_Kong')\n  //   example 1: ini_get('date.timezone')\n  //   returns 1: 'Asia/Hong_Kong'\n\n  var $global = typeof window !== 'undefined' ? window : __webpack_require__.g;\n  $global.$locutus = $global.$locutus || {};\n  var $locutus = $global.$locutus;\n  $locutus.php = $locutus.php || {};\n  $locutus.php.ini = $locutus.php.ini || {};\n\n  if ($locutus.php.ini[varname] && $locutus.php.ini[varname].local_value !== undefined) {\n    if ($locutus.php.ini[varname].local_value === null) {\n      return '';\n    }\n    return $locutus.php.ini[varname].local_value;\n  }\n\n  return '';\n};\n//# sourceMappingURL=ini_get.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/strings/strlen.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/locutus/php/strings/strlen.js ***!\n  \\****************************************************/\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\n\nmodule.exports = function strlen(string) {\n  //  discuss at: https://locutus.io/php/strlen/\n  // original by: Kevin van Zonneveld (https://kvz.io)\n  // improved by: Sakimori\n  // improved by: Kevin van Zonneveld (https://kvz.io)\n  //    input by: Kirk Strobeck\n  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)\n  //  revised by: Brett Zamir (https://brett-zamir.me)\n  //      note 1: May look like overkill, but in order to be truly faithful to handling all Unicode\n  //      note 1: characters and to this function in PHP which does not count the number of bytes\n  //      note 1: but counts the number of characters, something like this is really necessary.\n  //   example 1: strlen('Kevin van Zonneveld')\n  //   returns 1: 19\n  //   example 2: ini_set('unicode.semantics', 'on')\n  //   example 2: strlen('A\\ud87e\\udc04Z')\n  //   returns 2: 3\n\n  var str = string + '';\n\n  var iniVal = ( true ? __webpack_require__(/*! ../info/ini_get */ \"./node_modules/locutus/php/info/ini_get.js\")('unicode.semantics') : 0) || 'off';\n  if (iniVal === 'off') {\n    return str.length;\n  }\n\n  var i = 0;\n  var lgth = 0;\n\n  var getWholeChar = function getWholeChar(str, i) {\n    var code = str.charCodeAt(i);\n    var next = '';\n    var prev = '';\n    if (code >= 0xD800 && code <= 0xDBFF) {\n      // High surrogate (could change last hex to 0xDB7F to\n      // treat high private surrogates as single characters)\n      if (str.length <= i + 1) {\n        throw new Error('High surrogate without following low surrogate');\n      }\n      next = str.charCodeAt(i + 1);\n      if (next < 0xDC00 || next > 0xDFFF) {\n        throw new Error('High surrogate without following low surrogate');\n      }\n      return str.charAt(i) + str.charAt(i + 1);\n    } else if (code >= 0xDC00 && code <= 0xDFFF) {\n      // Low surrogate\n      if (i === 0) {\n        throw new Error('Low surrogate without preceding high surrogate');\n      }\n      prev = str.charCodeAt(i - 1);\n      if (prev < 0xD800 || prev > 0xDBFF) {\n        // (could change last hex to 0xDB7F to treat high private surrogates\n        // as single characters)\n        throw new Error('Low surrogate without preceding high surrogate');\n      }\n      // We can pass over low surrogates now as the second\n      // component in a pair which we have already processed\n      return false;\n    }\n    return str.charAt(i);\n  };\n\n  for (i = 0, lgth = 0; i < str.length; i++) {\n    if (getWholeChar(str, i) === false) {\n      continue;\n    }\n    // Adapt this line at the top of any loop, passing in the whole string and\n    // the current iteration and returning a variable to represent the individual character;\n    // purpose is to treat the first part of a surrogate pair as the whole character and then\n    // ignore the second part\n    lgth++;\n  }\n\n  return lgth;\n};\n//# sourceMappingURL=strlen.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/var/is_numeric.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/locutus/php/var/is_numeric.js ***!\n  \\****************************************************/\n/***/ (function(module) {\n\n\n\nmodule.exports = function is_numeric(mixedVar) {\n  // eslint-disable-line camelcase\n  //  discuss at: https://locutus.io/php/is_numeric/\n  // original by: Kevin van Zonneveld (https://kvz.io)\n  // improved by: David\n  // improved by: taith\n  // bugfixed by: Tim de Koning\n  // bugfixed by: WebDevHobo (https://webdevhobo.blogspot.com/)\n  // bugfixed by: Brett Zamir (https://brett-zamir.me)\n  // bugfixed by: Denis Chenu (https://shnoulle.net)\n  //   example 1: is_numeric(186.31)\n  //   returns 1: true\n  //   example 2: is_numeric('Kevin van Zonneveld')\n  //   returns 2: false\n  //   example 3: is_numeric(' +186.31e2')\n  //   returns 3: true\n  //   example 4: is_numeric('')\n  //   returns 4: false\n  //   example 5: is_numeric([])\n  //   returns 5: false\n  //   example 6: is_numeric('1 ')\n  //   returns 6: false\n\n  var whitespace = [' ', '\\n', '\\r', '\\t', '\\f', '\\x0b', '\\xa0', '\\u2000', '\\u2001', '\\u2002', '\\u2003', '\\u2004', '\\u2005', '\\u2006', '\\u2007', '\\u2008', '\\u2009', '\\u200A', '\\u200B', '\\u2028', '\\u2029', '\\u3000'].join('');\n\n  // @todo: Break this up using many single conditions with early returns\n  return (typeof mixedVar === 'number' || typeof mixedVar === 'string' && whitespace.indexOf(mixedVar.slice(-1)) === -1) && mixedVar !== '' && !isNaN(mixedVar);\n};\n//# sourceMappingURL=is_numeric.js.map\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t!function() {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = function(exports) {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n!function() {\n/*!****************************************!*\\\n  !*** ./resources/assets/js/helpers.js ***!\n  \\****************************************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! locutus/php/strings/strlen */ \"./node_modules/locutus/php/strings/strlen.js\");\n/* harmony import */ var locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! locutus/php/array/array_diff */ \"./node_modules/locutus/php/array/array_diff.js\");\n/* harmony import */ var locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! locutus/php/datetime/strtotime */ \"./node_modules/locutus/php/datetime/strtotime.js\");\n/* harmony import */ var locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! locutus/php/var/is_numeric */ \"./node_modules/locutus/php/var/is_numeric.js\");\n/* harmony import */ var locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__);\n/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Helper functions used by validators\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\n\n\n\n\n$.extend(true, laravelValidation, {\n  helpers: {\n    /**\n     * Numeric rules\n     */\n    numericRules: ['Integer', 'Numeric'],\n    /**\n     * Gets the file information from file input.\n     *\n     * @param fieldObj\n     * @param index\n     * @returns {{file: *, extension: string, size: number}}\n     */\n    fileinfo: function (fieldObj, index) {\n      var FileName = fieldObj.value;\n      index = typeof index !== 'undefined' ? index : 0;\n      if (fieldObj.files !== null) {\n        if (typeof fieldObj.files[index] !== 'undefined') {\n          return {\n            file: FileName,\n            extension: FileName.substr(FileName.lastIndexOf('.') + 1),\n            size: fieldObj.files[index].size / 1024,\n            type: fieldObj.files[index].type\n          };\n        }\n      }\n      return false;\n    },\n    /**\n     * Gets the selectors for th specified field names.\n     *\n     * @param names\n     * @returns {string}\n     */\n    selector: function (names) {\n      var selector = [];\n      if (!this.isArray(names)) {\n        names = [names];\n      }\n      for (var i = 0; i < names.length; i++) {\n        selector.push(\"[name='\" + names[i] + \"']\");\n      }\n      return selector.join();\n    },\n    /**\n     * Check if element has numeric rules.\n     *\n     * @param element\n     * @returns {boolean}\n     */\n    hasNumericRules: function (element) {\n      return this.hasRules(element, this.numericRules);\n    },\n    /**\n     * Check if element has passed rules.\n     *\n     * @param element\n     * @param rules\n     * @returns {boolean}\n     */\n    hasRules: function (element, rules) {\n      var found = false;\n      if (typeof rules === 'string') {\n        rules = [rules];\n      }\n      var validator = $.data(element.form, \"validator\");\n      var listRules = [];\n      var cache = validator.arrayRulesCache;\n      if (element.name in cache) {\n        $.each(cache[element.name], function (index, arrayRule) {\n          listRules.push(arrayRule);\n        });\n      }\n      if (element.name in validator.settings.rules) {\n        listRules.push(validator.settings.rules[element.name]);\n      }\n      $.each(listRules, function (index, objRules) {\n        if ('laravelValidation' in objRules) {\n          var _rules = objRules.laravelValidation;\n          for (var i = 0; i < _rules.length; i++) {\n            if ($.inArray(_rules[i][0], rules) !== -1) {\n              found = true;\n              return false;\n            }\n          }\n        }\n      });\n      return found;\n    },\n    /**\n     * Return the string length using PHP function.\n     * http://php.net/manual/en/function.strlen.php\n     * http://phpjs.org/functions/strlen/\n     *\n     * @param string\n     */\n    strlen: function (string) {\n      return locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default()(string);\n    },\n    /**\n     * Get the size of the object depending of his type.\n     *\n     * @param obj\n     * @param element\n     * @param value\n     * @returns int\n     */\n    getSize: function getSize(obj, element, value) {\n      if (this.hasNumericRules(element) && this.is_numeric(value)) {\n        return parseFloat(value);\n      } else if (this.isArray(value)) {\n        return parseFloat(value.length);\n      } else if (element.type === 'file') {\n        return parseFloat(Math.floor(this.fileinfo(element).size));\n      }\n      return parseFloat(this.strlen(value));\n    },\n    /**\n     * Return specified rule from element.\n     *\n     * @param rule\n     * @param element\n     * @returns object\n     */\n    getLaravelValidation: function (rule, element) {\n      var found = undefined;\n      $.each($.validator.staticRules(element), function (key, rules) {\n        if (key === \"laravelValidation\") {\n          $.each(rules, function (i, value) {\n            if (value[0] === rule) {\n              found = value;\n            }\n          });\n        }\n      });\n      return found;\n    },\n    /**\n     * Return he timestamp of value passed using format or default format in element.\n     *\n     * @param value\n     * @param format\n     * @returns {boolean|int}\n     */\n    parseTime: function (value, format) {\n      var timeValue = false;\n      var fmt = new DateFormatter();\n      if (typeof value === 'number' && typeof format === 'undefined') {\n        return value;\n      }\n      if (typeof format === 'object') {\n        var dateRule = this.getLaravelValidation('DateFormat', format);\n        if (dateRule !== undefined) {\n          format = dateRule[1][0];\n        } else {\n          format = null;\n        }\n      }\n      if (format == null) {\n        timeValue = this.strtotime(value);\n      } else {\n        timeValue = fmt.parseDate(value, format);\n        if (timeValue instanceof Date && fmt.formatDate(timeValue, format) === value) {\n          timeValue = Math.round(timeValue.getTime() / 1000);\n        } else {\n          timeValue = false;\n        }\n      }\n      return timeValue;\n    },\n    /**\n     * Compare a given date against another using an operator.\n     *\n     * @param validator\n     * @param value\n     * @param element\n     * @param params\n     * @param operator\n     * @return {boolean}\n     */\n    compareDates: function (validator, value, element, params, operator) {\n      var timeCompare = this.parseTime(params);\n      if (!timeCompare) {\n        var target = this.dependentElement(validator, element, params);\n        if (target === undefined) {\n          return false;\n        }\n        timeCompare = this.parseTime(validator.elementValue(target), target);\n      }\n      var timeValue = this.parseTime(value, element);\n      if (timeValue === false) {\n        return false;\n      }\n      switch (operator) {\n        case '<':\n          return timeValue < timeCompare;\n        case '<=':\n          return timeValue <= timeCompare;\n        case '==':\n        case '===':\n          return timeValue === timeCompare;\n        case '>':\n          return timeValue > timeCompare;\n        case '>=':\n          return timeValue >= timeCompare;\n        default:\n          throw new Error('Unsupported operator.');\n      }\n    },\n    /**\n     * This method allows you to intelligently guess the date by closely matching the specific format.\n     *\n     * @param value\n     * @param format\n     * @returns {Date}\n     */\n    guessDate: function (value, format) {\n      var fmt = new DateFormatter();\n      return fmt.guessDate(value, format);\n    },\n    /**\n     * Returns Unix timestamp based on PHP function strototime.\n     * http://php.net/manual/es/function.strtotime.php\n     * http://phpjs.org/functions/strtotime/\n     *\n     * @param text\n     * @param now\n     * @returns {*}\n     */\n    strtotime: function (text, now) {\n      return locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default()(text, now);\n    },\n    /**\n     * Returns if value is numeric.\n     * http://php.net/manual/es/var.is_numeric.php\n     * http://phpjs.org/functions/is_numeric/\n     *\n     * @param mixed_var\n     * @returns {*}\n     */\n    is_numeric: function (mixed_var) {\n      return locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default()(mixed_var);\n    },\n    /**\n     * Check whether the argument is of type Array.\n     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Polyfill\n     *\n     * @param arg\n     * @returns {boolean}\n     */\n    isArray: function (arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    },\n    /**\n     * Returns Array diff based on PHP function array_diff.\n     * http://php.net/manual/es/function.array_diff.php\n     * http://phpjs.org/functions/array_diff/\n     *\n     * @param arr1\n     * @param arr2\n     * @returns {*}\n     */\n    arrayDiff: function (arr1, arr2) {\n      return locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default()(arr1, arr2);\n    },\n    /**\n     * Check whether two arrays are equal to one another.\n     *\n     * @param arr1\n     * @param arr2\n     * @returns {*}\n     */\n    arrayEquals: function (arr1, arr2) {\n      if (!this.isArray(arr1) || !this.isArray(arr2)) {\n        return false;\n      }\n      if (arr1.length !== arr2.length) {\n        return false;\n      }\n      return $.isEmptyObject(this.arrayDiff(arr1, arr2));\n    },\n    /**\n     * Makes element dependant from other.\n     *\n     * @param validator\n     * @param element\n     * @param name\n     * @returns {*}\n     */\n    dependentElement: function (validator, element, name) {\n      var el = validator.findByName(name);\n      if (el[0] !== undefined && validator.settings.onfocusout) {\n        var event = 'blur';\n        if (el[0].tagName === 'SELECT' || el[0].tagName === 'OPTION' || el[0].type === 'checkbox' || el[0].type === 'radio') {\n          event = 'click';\n        }\n        var ruleName = '.validate-laravelValidation';\n        el.off(ruleName).off(event + ruleName + '-' + element.name).on(event + ruleName + '-' + element.name, function () {\n          $(element).valid();\n        });\n      }\n      return el[0];\n    },\n    /**\n     * Parses error Ajax response and gets the message.\n     *\n     * @param response\n     * @returns {string[]}\n     */\n    parseErrorResponse: function (response) {\n      var newResponse = ['Whoops, looks like something went wrong.'];\n      if ('responseText' in response) {\n        var errorMsg = response.responseText.match(/<h1\\s*>(.*)<\\/h1\\s*>/i);\n        if (this.isArray(errorMsg)) {\n          newResponse = [errorMsg[1]];\n        }\n      }\n      return newResponse;\n    },\n    /**\n     * Escape string to use as Regular Expression.\n     *\n     * @param str\n     * @returns string\n     */\n    escapeRegExp: function (str) {\n      return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n    },\n    /**\n     * Generate RegExp from wildcard attributes.\n     *\n     * @param name\n     * @returns {RegExp}\n     */\n    regexFromWildcard: function (name) {\n      var nameParts = name.split('[*]');\n      if (nameParts.length === 1) nameParts.push('');\n      return new RegExp('^' + nameParts.map(function (x) {\n        return laravelValidation.helpers.escapeRegExp(x);\n      }).join('\\\\[[^\\\\]]*\\\\]') + '$');\n    },\n    /**\n     * Merge additional laravel validation rules into the current rule set.\n     *\n     * @param {object} rules\n     * @param {object} newRules\n     * @returns {object}\n     */\n    mergeRules: function (rules, newRules) {\n      var rulesList = {\n        'laravelValidation': newRules.laravelValidation || [],\n        'laravelValidationRemote': newRules.laravelValidationRemote || []\n      };\n      for (var key in rulesList) {\n        if (rulesList[key].length === 0) {\n          continue;\n        }\n        if (typeof rules[key] === \"undefined\") {\n          rules[key] = [];\n        }\n        rules[key] = rules[key].concat(rulesList[key]);\n      }\n      return rules;\n    },\n    /**\n     * HTML entity encode a string.\n     *\n     * @param string\n     * @returns {string}\n     */\n    encode: function (string) {\n      return $('<div/>').text(string).html();\n    },\n    /**\n     * Lookup name in an array.\n     *\n     * @param validator\n     * @param {string} name Name in dot notation format.\n     * @returns {*}\n     */\n    findByArrayName: function (validator, name) {\n      var sqName = name.replace(/\\.([^\\.]+)/g, '[$1]'),\n        lookups = [\n        // Convert dot to square brackets. e.g. foo.bar.0 becomes foo[bar][0]\n        sqName,\n        // Append [] to the name e.g. foo becomes foo[] or foo.bar.0 becomes foo[bar][0][]\n        sqName + '[]',\n        // Remove key from last array e.g. foo[bar][0] becomes foo[bar][]\n        sqName.replace(/(.*)\\[(.*)\\]$/g, '$1[]')];\n      for (var i = 0; i < lookups.length; i++) {\n        var elem = validator.findByName(lookups[i]);\n        if (elem.length > 0) {\n          return elem;\n        }\n      }\n      return $(null);\n    },\n    /**\n     * Attempt to find an element in the DOM matching the given name.\n     * Example names include:\n     *    - domain.0 which matches domain[]\n     *    - customfield.3 which matches customfield[3]\n     *\n     * @param validator\n     * @param {string} name\n     * @returns {*}\n     */\n    findByName: function (validator, name) {\n      // Exact match.\n      var elem = validator.findByName(name);\n      if (elem.length > 0) {\n        return elem;\n      }\n\n      // Find name in data, using dot notation.\n      var delim = '.',\n        parts = name.split(delim);\n      for (var i = parts.length; i > 0; i--) {\n        var reconstructed = [];\n        for (var c = 0; c < i; c++) {\n          reconstructed.push(parts[c]);\n        }\n        elem = this.findByArrayName(validator, reconstructed.join(delim));\n        if (elem.length > 0) {\n          return elem;\n        }\n      }\n      return $(null);\n    },\n    /**\n     * If it's an array element, get all values.\n     *\n     * @param validator\n     * @param element\n     * @returns {*|string}\n     */\n    allElementValues: function (validator, element) {\n      if (element.name.indexOf('[]') !== -1) {\n        return validator.findByName(element.name).map(function (i, e) {\n          return validator.elementValue(e);\n        }).get();\n      }\n      return validator.elementValue(element);\n    }\n  }\n});\n}();\n/******/ })()\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNsQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixJQUFJO0FBQ3pCLHNCQUFzQixFQUFFO0FBQ3hCLHNCQUFzQixFQUFFO0FBQ3hCLG1DQUFtQyxFQUFFO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJO0FBQ2hEOztBQUVBO0FBQ0EsOEJBQThCLElBQUk7QUFDbEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3REFBd0QsSUFBSTtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLElBQUk7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0lBQ1E2SCxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVaEcsU0FBUyxFQUFFSixPQUFPLEVBQUU7TUFDNUMsSUFBSUEsT0FBTyxDQUFDVSxJQUFJLENBQUMyRixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDbkMsT0FBT2pHLFNBQVMsQ0FBQzBELFVBQVUsQ0FBQzlELE9BQU8sQ0FBQ1UsSUFBSSxDQUFDLENBQUN5RSxHQUFHLENBQUMsVUFBVXhGLENBQUMsRUFBRTJHLENBQUMsRUFBRTtVQUMxRCxPQUFPbEcsU0FBUyxDQUFDeUMsWUFBWSxDQUFDeUQsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUMsQ0FBQztNQUNaO01BRUEsT0FBT25HLFNBQVMsQ0FBQ3lDLFlBQVksQ0FBQzdDLE9BQU8sQ0FBQztJQUMxQztFQUNKO0FBQ0osQ0FBQyxDQUFDLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9jdXR1cy9waHAvYXJyYXkvYXJyYXlfZGlmZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9jdXR1cy9waHAvZGF0ZXRpbWUvc3RydG90aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2N1dHVzL3BocC9pbmZvL2luaV9nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvY3V0dXMvcGhwL3N0cmluZ3Mvc3RybGVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2N1dHVzL3BocC92YXIvaXNfbnVtZXJpYy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhcnJheV9kaWZmKGFycjEpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvYXJyYXlfZGlmZi9cbiAgLy8gb3JpZ2luYWwgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHBzOi8va3Z6LmlvKVxuICAvLyBpbXByb3ZlZCBieTogU2Fuam95IFJveVxuICAvLyAgcmV2aXNlZCBieTogQnJldHQgWmFtaXIgKGh0dHBzOi8vYnJldHQtemFtaXIubWUpXG4gIC8vICAgZXhhbXBsZSAxOiBhcnJheV9kaWZmKFsnS2V2aW4nLCAndmFuJywgJ1pvbm5ldmVsZCddLCBbJ3ZhbicsICdab25uZXZlbGQnXSlcbiAgLy8gICByZXR1cm5zIDE6IHswOidLZXZpbid9XG5cbiAgdmFyIHJldEFyciA9IHt9O1xuICB2YXIgYXJnbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBrMSA9ICcnO1xuICB2YXIgaSA9IDE7XG4gIHZhciBrID0gJyc7XG4gIHZhciBhcnIgPSB7fTtcblxuICBhcnIxa2V5czogZm9yIChrMSBpbiBhcnIxKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sYWJlbHNcbiAgICBmb3IgKGkgPSAxOyBpIDwgYXJnbDsgaSsrKSB7XG4gICAgICBhcnIgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKGsgaW4gYXJyKSB7XG4gICAgICAgIGlmIChhcnJba10gPT09IGFycjFbazFdKSB7XG4gICAgICAgICAgLy8gSWYgaXQgcmVhY2hlcyBoZXJlLCBpdCB3YXMgZm91bmQgaW4gYXQgbGVhc3Qgb25lIGFycmF5LCBzbyB0cnkgbmV4dCB2YWx1ZVxuICAgICAgICAgIGNvbnRpbnVlIGFycjFrZXlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxhYmVsc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXRBcnJbazFdID0gYXJyMVtrMV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldEFycjtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJheV9kaWZmLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlU3BhY2UgPSAnWyBcXFxcdF0rJztcbnZhciByZVNwYWNlT3B0ID0gJ1sgXFxcXHRdKic7XG52YXIgcmVNZXJpZGlhbiA9ICcoPzooW2FwXSlcXFxcLj9tXFxcXC4/KFtcXFxcdCBdfCQpKSc7XG52YXIgcmVIb3VyMjQgPSAnKDJbMC00XXxbMDFdP1swLTldKSc7XG52YXIgcmVIb3VyMjRseiA9ICcoWzAxXVswLTldfDJbMC00XSknO1xudmFyIHJlSG91cjEyID0gJygwP1sxLTldfDFbMC0yXSknO1xudmFyIHJlTWludXRlID0gJyhbMC01XT9bMC05XSknO1xudmFyIHJlTWludXRlbHogPSAnKFswLTVdWzAtOV0pJztcbnZhciByZVNlY29uZCA9ICcoNjB8WzAtNV0/WzAtOV0pJztcbnZhciByZVNlY29uZGx6ID0gJyg2MHxbMC01XVswLTldKSc7XG52YXIgcmVGcmFjID0gJyg/OlxcXFwuKFswLTldKykpJztcblxudmFyIHJlRGF5ZnVsbCA9ICdzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSc7XG52YXIgcmVEYXlhYmJyID0gJ3N1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCc7XG52YXIgcmVEYXl0ZXh0ID0gcmVEYXlmdWxsICsgJ3wnICsgcmVEYXlhYmJyICsgJ3x3ZWVrZGF5cz8nO1xuXG52YXIgcmVSZWx0ZXh0bnVtYmVyID0gJ2ZpcnN0fHNlY29uZHx0aGlyZHxmb3VydGh8ZmlmdGh8c2l4dGh8c2V2ZW50aHxlaWdodGg/fG5pbnRofHRlbnRofGVsZXZlbnRofHR3ZWxmdGgnO1xudmFyIHJlUmVsdGV4dHRleHQgPSAnbmV4dHxsYXN0fHByZXZpb3VzfHRoaXMnO1xudmFyIHJlUmVsdGV4dHVuaXQgPSAnKD86c2Vjb25kfHNlY3xtaW51dGV8bWlufGhvdXJ8ZGF5fGZvcnRuaWdodHxmb3J0aG5pZ2h0fG1vbnRofHllYXIpcz98d2Vla3N8JyArIHJlRGF5dGV4dDtcblxudmFyIHJlWWVhciA9ICcoWzAtOV17MSw0fSknO1xudmFyIHJlWWVhcjIgPSAnKFswLTldezJ9KSc7XG52YXIgcmVZZWFyNCA9ICcoWzAtOV17NH0pJztcbnZhciByZVllYXI0d2l0aFNpZ24gPSAnKFsrLV0/WzAtOV17NH0pJztcbnZhciByZU1vbnRoID0gJygxWzAtMl18MD9bMC05XSknO1xudmFyIHJlTW9udGhseiA9ICcoMFswLTldfDFbMC0yXSknO1xudmFyIHJlRGF5ID0gJyg/OigzWzAxXXxbMC0yXT9bMC05XSkoPzpzdHxuZHxyZHx0aCk/KSc7XG52YXIgcmVEYXlseiA9ICcoMFswLTldfFsxLTJdWzAtOV18M1swMV0pJztcblxudmFyIHJlTW9udGhGdWxsID0gJ2phbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXInO1xudmFyIHJlTW9udGhBYmJyID0gJ2phbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwdD98b2N0fG5vdnxkZWMnO1xudmFyIHJlTW9udGhyb21hbiA9ICdpW3Z4XXx2aXswLDN9fHhpezAsMn18aXsxLDN9JztcbnZhciByZU1vbnRoVGV4dCA9ICcoJyArIHJlTW9udGhGdWxsICsgJ3wnICsgcmVNb250aEFiYnIgKyAnfCcgKyByZU1vbnRocm9tYW4gKyAnKSc7XG5cbnZhciByZVR6Q29ycmVjdGlvbiA9ICcoKD86R01UKT8oWystXSknICsgcmVIb3VyMjQgKyAnOj8nICsgcmVNaW51dGUgKyAnPyknO1xudmFyIHJlVHpBYmJyID0gJ1xcXFwoPyhbYS16QS1aXXsxLDZ9KVxcXFwpPyc7XG52YXIgcmVEYXlPZlllYXIgPSAnKDAwWzEtOV18MFsxLTldWzAtOV18WzEyXVswLTldWzAtOV18M1swLTVdWzAtOV18MzZbMC02XSknO1xudmFyIHJlV2Vla09mWWVhciA9ICcoMFsxLTldfFsxLTRdWzAtOV18NVswLTNdKSc7XG5cbnZhciByZURhdGVOb1llYXIgPSByZU1vbnRoVGV4dCArICdbIC5cXFxcdC1dKicgKyByZURheSArICdbLC5zdG5kcmhcXFxcdCBdKic7XG5cbmZ1bmN0aW9uIHByb2Nlc3NNZXJpZGlhbihob3VyLCBtZXJpZGlhbikge1xuICBtZXJpZGlhbiA9IG1lcmlkaWFuICYmIG1lcmlkaWFuLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChtZXJpZGlhbikge1xuICAgIGNhc2UgJ2EnOlxuICAgICAgaG91ciArPSBob3VyID09PSAxMiA/IC0xMiA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwJzpcbiAgICAgIGhvdXIgKz0gaG91ciAhPT0gMTIgPyAxMiA6IDA7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBob3VyO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzWWVhcih5ZWFyU3RyKSB7XG4gIHZhciB5ZWFyID0gK3llYXJTdHI7XG5cbiAgaWYgKHllYXJTdHIubGVuZ3RoIDwgNCAmJiB5ZWFyIDwgMTAwKSB7XG4gICAgeWVhciArPSB5ZWFyIDwgNzAgPyAyMDAwIDogMTkwMDtcbiAgfVxuXG4gIHJldHVybiB5ZWFyO1xufVxuXG5mdW5jdGlvbiBsb29rdXBNb250aChtb250aFN0cikge1xuICByZXR1cm4ge1xuICAgIGphbjogMCxcbiAgICBqYW51YXJ5OiAwLFxuICAgIGk6IDAsXG4gICAgZmViOiAxLFxuICAgIGZlYnJ1YXJ5OiAxLFxuICAgIGlpOiAxLFxuICAgIG1hcjogMixcbiAgICBtYXJjaDogMixcbiAgICBpaWk6IDIsXG4gICAgYXByOiAzLFxuICAgIGFwcmlsOiAzLFxuICAgIGl2OiAzLFxuICAgIG1heTogNCxcbiAgICB2OiA0LFxuICAgIGp1bjogNSxcbiAgICBqdW5lOiA1LFxuICAgIHZpOiA1LFxuICAgIGp1bDogNixcbiAgICBqdWx5OiA2LFxuICAgIHZpaTogNixcbiAgICBhdWc6IDcsXG4gICAgYXVndXN0OiA3LFxuICAgIHZpaWk6IDcsXG4gICAgc2VwOiA4LFxuICAgIHNlcHQ6IDgsXG4gICAgc2VwdGVtYmVyOiA4LFxuICAgIGl4OiA4LFxuICAgIG9jdDogOSxcbiAgICBvY3RvYmVyOiA5LFxuICAgIHg6IDksXG4gICAgbm92OiAxMCxcbiAgICBub3ZlbWJlcjogMTAsXG4gICAgeGk6IDEwLFxuICAgIGRlYzogMTEsXG4gICAgZGVjZW1iZXI6IDExLFxuICAgIHhpaTogMTFcbiAgfVttb250aFN0ci50b0xvd2VyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gbG9va3VwV2Vla2RheShkYXlTdHIpIHtcbiAgdmFyIGRlc2lyZWRTdW5kYXlOdW1iZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG5cbiAgdmFyIGRheU51bWJlcnMgPSB7XG4gICAgbW9uOiAxLFxuICAgIG1vbmRheTogMSxcbiAgICB0dWU6IDIsXG4gICAgdHVlc2RheTogMixcbiAgICB3ZWQ6IDMsXG4gICAgd2VkbmVzZGF5OiAzLFxuICAgIHRodTogNCxcbiAgICB0aHVyc2RheTogNCxcbiAgICBmcmk6IDUsXG4gICAgZnJpZGF5OiA1LFxuICAgIHNhdDogNixcbiAgICBzYXR1cmRheTogNixcbiAgICBzdW46IDAsXG4gICAgc3VuZGF5OiAwXG4gIH07XG5cbiAgcmV0dXJuIGRheU51bWJlcnNbZGF5U3RyLnRvTG93ZXJDYXNlKCldIHx8IGRlc2lyZWRTdW5kYXlOdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFJlbGF0aXZlKHJlbFRleHQpIHtcbiAgdmFyIHJlbGF0aXZlTnVtYmVycyA9IHtcbiAgICBsYXN0OiAtMSxcbiAgICBwcmV2aW91czogLTEsXG4gICAgdGhpczogMCxcbiAgICBmaXJzdDogMSxcbiAgICBuZXh0OiAxLFxuICAgIHNlY29uZDogMixcbiAgICB0aGlyZDogMyxcbiAgICBmb3VydGg6IDQsXG4gICAgZmlmdGg6IDUsXG4gICAgc2l4dGg6IDYsXG4gICAgc2V2ZW50aDogNyxcbiAgICBlaWdodDogOCxcbiAgICBlaWdodGg6IDgsXG4gICAgbmludGg6IDksXG4gICAgdGVudGg6IDEwLFxuICAgIGVsZXZlbnRoOiAxMSxcbiAgICB0d2VsZnRoOiAxMlxuICB9O1xuXG4gIHZhciByZWxhdGl2ZUJlaGF2aW9yID0ge1xuICAgIHRoaXM6IDFcbiAgfTtcblxuICB2YXIgcmVsVGV4dExvd2VyID0gcmVsVGV4dC50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiB7XG4gICAgYW1vdW50OiByZWxhdGl2ZU51bWJlcnNbcmVsVGV4dExvd2VyXSxcbiAgICBiZWhhdmlvcjogcmVsYXRpdmVCZWhhdmlvcltyZWxUZXh0TG93ZXJdIHx8IDBcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1R6Q29ycmVjdGlvbih0ek9mZnNldCwgb2xkVmFsdWUpIHtcbiAgdmFyIHJlVHpDb3JyZWN0aW9uTG9vc2UgPSAvKD86R01UKT8oWystXSkoXFxkKykoOj8pKFxcZHswLDJ9KS9pO1xuICB0ek9mZnNldCA9IHR6T2Zmc2V0ICYmIHR6T2Zmc2V0Lm1hdGNoKHJlVHpDb3JyZWN0aW9uTG9vc2UpO1xuXG4gIGlmICghdHpPZmZzZXQpIHtcbiAgICByZXR1cm4gb2xkVmFsdWU7XG4gIH1cblxuICB2YXIgc2lnbiA9IHR6T2Zmc2V0WzFdID09PSAnLScgPyAtMSA6IDE7XG4gIHZhciBob3VycyA9ICt0ek9mZnNldFsyXTtcbiAgdmFyIG1pbnV0ZXMgPSArdHpPZmZzZXRbNF07XG5cbiAgaWYgKCF0ek9mZnNldFs0XSAmJiAhdHpPZmZzZXRbM10pIHtcbiAgICBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAlIDEwMCk7XG4gICAgaG91cnMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMTAwKTtcbiAgfVxuXG4gIC8vIHRpbWV6b25lIG9mZnNldCBpbiBzZWNvbmRzXG4gIHJldHVybiBzaWduICogKGhvdXJzICogNjAgKyBtaW51dGVzKSAqIDYwO1xufVxuXG4vLyB0eiBhYmJyZXZhdGlvbiA6IHR6IG9mZnNldCBpbiBzZWNvbmRzXG52YXIgdHpBYmJyT2Zmc2V0cyA9IHtcbiAgYWNkdDogMzc4MDAsXG4gIGFjc3Q6IDM0MjAwLFxuICBhZGR0OiAtNzIwMCxcbiAgYWR0OiAtMTA4MDAsXG4gIGFlZHQ6IDM5NjAwLFxuICBhZXN0OiAzNjAwMCxcbiAgYWhkdDogLTMyNDAwLFxuICBhaHN0OiAtMzYwMDAsXG4gIGFrZHQ6IC0yODgwMCxcbiAgYWtzdDogLTMyNDAwLFxuICBhbXQ6IC0xMzg0MCxcbiAgYXB0OiAtMTA4MDAsXG4gIGFzdDogLTE0NDAwLFxuICBhd2R0OiAzMjQwMCxcbiAgYXdzdDogMjg4MDAsXG4gIGF3dDogLTEwODAwLFxuICBiZHN0OiA3MjAwLFxuICBiZHQ6IC0zNjAwMCxcbiAgYm10OiAtMTQzMDksXG4gIGJzdDogMzYwMCxcbiAgY2FzdDogMzQyMDAsXG4gIGNhdDogNzIwMCxcbiAgY2RkdDogLTE0NDAwLFxuICBjZHQ6IC0xODAwMCxcbiAgY2VtdDogMTA4MDAsXG4gIGNlc3Q6IDcyMDAsXG4gIGNldDogMzYwMCxcbiAgY210OiAtMTU0MDgsXG4gIGNwdDogLTE4MDAwLFxuICBjc3Q6IC0yMTYwMCxcbiAgY3d0OiAtMTgwMDAsXG4gIGNoc3Q6IDM2MDAwLFxuICBkbXQ6IC0xNTIxLFxuICBlYXQ6IDEwODAwLFxuICBlZGR0OiAtMTA4MDAsXG4gIGVkdDogLTE0NDAwLFxuICBlZXN0OiAxMDgwMCxcbiAgZWV0OiA3MjAwLFxuICBlbXQ6IC0yNjI0OCxcbiAgZXB0OiAtMTQ0MDAsXG4gIGVzdDogLTE4MDAwLFxuICBld3Q6IC0xNDQwMCxcbiAgZmZtdDogLTE0NjYwLFxuICBmbXQ6IC00MDU2LFxuICBnZHQ6IDM5NjAwLFxuICBnbXQ6IDAsXG4gIGdzdDogMzYwMDAsXG4gIGhkdDogLTM0MjAwLFxuICBoa3N0OiAzMjQwMCxcbiAgaGt0OiAyODgwMCxcbiAgaG10OiAtMTk3NzYsXG4gIGhwdDogLTM0MjAwLFxuICBoc3Q6IC0zNjAwMCxcbiAgaHd0OiAtMzQyMDAsXG4gIGlkZHQ6IDE0NDAwLFxuICBpZHQ6IDEwODAwLFxuICBpbXQ6IDI1MDI1LFxuICBpc3Q6IDcyMDAsXG4gIGpkdDogMzYwMDAsXG4gIGptdDogODQ0MCxcbiAganN0OiAzMjQwMCxcbiAga2R0OiAzNjAwMCxcbiAga210OiA1NzM2LFxuICBrc3Q6IDMwNjAwLFxuICBsc3Q6IDkzOTQsXG4gIG1kZHQ6IC0xODAwMCxcbiAgbWRzdDogMTYyNzksXG4gIG1kdDogLTIxNjAwLFxuICBtZXN0OiA3MjAwLFxuICBtZXQ6IDM2MDAsXG4gIG1tdDogOTAxNyxcbiAgbXB0OiAtMjE2MDAsXG4gIG1zZDogMTQ0MDAsXG4gIG1zazogMTA4MDAsXG4gIG1zdDogLTI1MjAwLFxuICBtd3Q6IC0yMTYwMCxcbiAgbmRkdDogLTU0MDAsXG4gIG5kdDogLTkwNTIsXG4gIG5wdDogLTkwMDAsXG4gIG5zdDogLTEyNjAwLFxuICBud3Q6IC05MDAwLFxuICBuemR0OiA0NjgwMCxcbiAgbnptdDogNDE0MDAsXG4gIG56c3Q6IDQzMjAwLFxuICBwZGR0OiAtMjE2MDAsXG4gIHBkdDogLTI1MjAwLFxuICBwa3N0OiAyMTYwMCxcbiAgcGt0OiAxODAwMCxcbiAgcGxtdDogMjU1OTAsXG4gIHBtdDogLTEzMjM2LFxuICBwcG10OiAtMTczNDAsXG4gIHBwdDogLTI1MjAwLFxuICBwc3Q6IC0yODgwMCxcbiAgcHd0OiAtMjUyMDAsXG4gIHFtdDogLTE4ODQwLFxuICBybXQ6IDU3OTQsXG4gIHNhc3Q6IDcyMDAsXG4gIHNkbXQ6IC0xNjgwMCxcbiAgc2ptdDogLTIwMTczLFxuICBzbXQ6IC0xMzg4NCxcbiAgc3N0OiAtMzk2MDAsXG4gIHRibXQ6IDEwNzUxLFxuICB0bXQ6IDEyMzQ0LFxuICB1Y3Q6IDAsXG4gIHV0YzogMCxcbiAgd2FzdDogNzIwMCxcbiAgd2F0OiAzNjAwLFxuICB3ZW10OiA3MjAwLFxuICB3ZXN0OiAzNjAwLFxuICB3ZXQ6IDAsXG4gIHdpYjogMjUyMDAsXG4gIHdpdGE6IDI4ODAwLFxuICB3aXQ6IDMyNDAwLFxuICB3bXQ6IDUwNDAsXG4gIHlkZHQ6IC0yNTIwMCxcbiAgeWR0OiAtMjg4MDAsXG4gIHlwdDogLTI4ODAwLFxuICB5c3Q6IC0zMjQwMCxcbiAgeXd0OiAtMjg4MDAsXG4gIGE6IDM2MDAsXG4gIGI6IDcyMDAsXG4gIGM6IDEwODAwLFxuICBkOiAxNDQwMCxcbiAgZTogMTgwMDAsXG4gIGY6IDIxNjAwLFxuICBnOiAyNTIwMCxcbiAgaDogMjg4MDAsXG4gIGk6IDMyNDAwLFxuICBrOiAzNjAwMCxcbiAgbDogMzk2MDAsXG4gIG06IDQzMjAwLFxuICBuOiAtMzYwMCxcbiAgbzogLTcyMDAsXG4gIHA6IC0xMDgwMCxcbiAgcTogLTE0NDAwLFxuICByOiAtMTgwMDAsXG4gIHM6IC0yMTYwMCxcbiAgdDogLTI1MjAwLFxuICB1OiAtMjg4MDAsXG4gIHY6IC0zMjQwMCxcbiAgdzogLTM2MDAwLFxuICB4OiAtMzk2MDAsXG4gIHk6IC00MzIwMCxcbiAgejogMFxufTtcblxudmFyIGZvcm1hdHMgPSB7XG4gIHllc3RlcmRheToge1xuICAgIHJlZ2V4OiAvXnllc3RlcmRheS9pLFxuICAgIG5hbWU6ICd5ZXN0ZXJkYXknLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmQgLT0gMTtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpO1xuICAgIH1cbiAgfSxcblxuICBub3c6IHtcbiAgICByZWdleDogL15ub3cvaSxcbiAgICBuYW1lOiAnbm93J1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSxcblxuICBub29uOiB7XG4gICAgcmVnZXg6IC9ebm9vbi9pLFxuICAgIG5hbWU6ICdub29uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKSAmJiB0aGlzLnRpbWUoMTIsIDAsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICBtaWRuaWdodE9yVG9kYXk6IHtcbiAgICByZWdleDogL14obWlkbmlnaHR8dG9kYXkpL2ksXG4gICAgbmFtZTogJ21pZG5pZ2h0IHwgdG9kYXknLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpO1xuICAgIH1cbiAgfSxcblxuICB0b21vcnJvdzoge1xuICAgIHJlZ2V4OiAvXnRvbW9ycm93L2ksXG4gICAgbmFtZTogJ3RvbW9ycm93JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB0aGlzLnJkICs9IDE7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZXN0YW1wOiB7XG4gICAgcmVnZXg6IC9eQCgtP1xcZCspL2ksXG4gICAgbmFtZTogJ3RpbWVzdGFtcCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB0aW1lc3RhbXApIHtcbiAgICAgIHRoaXMucnMgKz0gK3RpbWVzdGFtcDtcbiAgICAgIHRoaXMueSA9IDE5NzA7XG4gICAgICB0aGlzLm0gPSAwO1xuICAgICAgdGhpcy5kID0gMTtcbiAgICAgIHRoaXMuZGF0ZXMgPSAwO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKSAmJiB0aGlzLnpvbmUoMCk7XG4gICAgfVxuICB9LFxuXG4gIGZpcnN0T3JMYXN0RGF5OiB7XG4gICAgcmVnZXg6IC9eKGZpcnN0fGxhc3QpIGRheSBvZi9pLFxuICAgIG5hbWU6ICdmaXJzdGRheW9mIHwgbGFzdGRheW9mJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGRheSkge1xuICAgICAgaWYgKGRheS50b0xvd2VyQ2FzZSgpID09PSAnZmlyc3QnKSB7XG4gICAgICAgIHRoaXMuZmlyc3RPckxhc3REYXlPZk1vbnRoID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyc3RPckxhc3REYXlPZk1vbnRoID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGJhY2tPckZyb250T2Y6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKGJhY2t8ZnJvbnQpIG9mICcgKyByZUhvdXIyNCArIHJlU3BhY2VPcHQgKyByZU1lcmlkaWFuICsgJz8nLCAnaScpLFxuICAgIG5hbWU6ICdiYWNrb2YgfCBmcm9udG9mJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHNpZGUsIGhvdXJzLCBtZXJpZGlhbikge1xuICAgICAgdmFyIGJhY2sgPSBzaWRlLnRvTG93ZXJDYXNlKCkgPT09ICdiYWNrJztcbiAgICAgIHZhciBob3VyID0gK2hvdXJzO1xuICAgICAgdmFyIG1pbnV0ZSA9IDE1O1xuXG4gICAgICBpZiAoIWJhY2spIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgPSA0NTtcbiAgICAgIH1cblxuICAgICAgaG91ciA9IHByb2Nlc3NNZXJpZGlhbihob3VyLCBtZXJpZGlhbik7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpICYmIHRoaXMudGltZShob3VyLCBtaW51dGUsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICB3ZWVrZGF5T2Y6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHRudW1iZXIgKyAnfCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICcoJyArIHJlRGF5ZnVsbCArICd8JyArIHJlRGF5YWJiciArICcpJyArIHJlU3BhY2UgKyAnb2YnLCAnaScpLFxuICAgIG5hbWU6ICd3ZWVrZGF5b2YnXG4gICAgLy8gdG9kb1xuICB9LFxuXG4gIG1zc3FsdGltZToge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnOicgKyByZU1pbnV0ZWx6ICsgJzonICsgcmVTZWNvbmRseiArICdbOi5dKFswLTldKyknICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAnbXNzcWx0aW1lJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjLCBtZXJpZGlhbikge1xuICAgICAgcmV0dXJuIHRoaXMudGltZShwcm9jZXNzTWVyaWRpYW4oK2hvdXIsIG1lcmlkaWFuKSwgK21pbnV0ZSwgK3NlY29uZCwgK2ZyYWMuc3Vic3RyKDAsIDMpKTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZUxvbmcxMjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kbHogKyByZVNwYWNlT3B0ICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAndGltZWxvbmcxMicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICB0aW1lU2hvcnQxMjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnWzouXScgKyByZU1pbnV0ZWx6ICsgcmVTcGFjZU9wdCArIHJlTWVyaWRpYW4sICdpJyksXG4gICAgbmFtZTogJ3RpbWVzaG9ydDEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1pbnV0ZSwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICB0aW1lVGlueTEyOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZUhvdXIxMiArIHJlU3BhY2VPcHQgKyByZU1lcmlkaWFuLCAnaScpLFxuICAgIG5hbWU6ICd0aW1ldGlueTEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1lcmlkaWFuKSB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lKHByb2Nlc3NNZXJpZGlhbigraG91ciwgbWVyaWRpYW4pLCAwLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgc29hcDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICctJyArIHJlTW9udGhseiArICctJyArIHJlRGF5bHogKyAnVCcgKyByZUhvdXIyNGx6ICsgJzonICsgcmVNaW51dGVseiArICc6JyArIHJlU2Vjb25kbHogKyByZUZyYWMgKyByZVR6Q29ycmVjdGlvbiArICc/JywgJ2knKSxcbiAgICBuYW1lOiAnc29hcCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhYywgdHpDb3JyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCArZnJhYy5zdWJzdHIoMCwgMykpICYmIHRoaXMuem9uZShwcm9jZXNzVHpDb3JyZWN0aW9uKHR6Q29ycmVjdGlvbikpO1xuICAgIH1cbiAgfSxcblxuICB3ZGR4OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgJy0nICsgcmVNb250aCArICctJyArIHJlRGF5ICsgJ1QnICsgcmVIb3VyMjQgKyAnOicgKyByZU1pbnV0ZSArICc6JyArIHJlU2Vjb25kKSxcbiAgICBuYW1lOiAnd2RkeCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBtb250aCAtIDEsICtkYXkpICYmIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGV4aWY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnOicgKyByZU1vbnRobHogKyAnOicgKyByZURheWx6ICsgJyAnICsgcmVIb3VyMjRseiArICc6JyArIHJlTWludXRlbHogKyAnOicgKyByZVNlY29uZGx6LCAnaScpLFxuICAgIG5hbWU6ICdleGlmJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgeG1sUnBjOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiArICdUJyArIHJlSG91cjI0ICsgJzonICsgcmVNaW51dGVseiArICc6JyArIHJlU2Vjb25kbHopLFxuICAgIG5hbWU6ICd4bWxycGMnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KSAmJiB0aGlzLnRpbWUoK2hvdXIsICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICB4bWxScGNOb0NvbG9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiArICdbVHRdJyArIHJlSG91cjI0ICsgcmVNaW51dGVseiArIHJlU2Vjb25kbHopLFxuICAgIG5hbWU6ICd4bWxycGNub2NvbG9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgY2xmOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURheSArICcvKCcgKyByZU1vbnRoQWJiciArICcpLycgKyByZVllYXI0ICsgJzonICsgcmVIb3VyMjRseiArICc6JyArIHJlTWludXRlbHogKyAnOicgKyByZVNlY29uZGx6ICsgcmVTcGFjZSArIHJlVHpDb3JyZWN0aW9uLCAnaScpLFxuICAgIG5hbWU6ICdjbGYnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhciwgaG91ciwgbWludXRlLCBzZWNvbmQsIHR6Q29ycmVjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksICtkYXkpICYmIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCkgJiYgdGhpcy56b25lKHByb2Nlc3NUekNvcnJlY3Rpb24odHpDb3JyZWN0aW9uKSk7XG4gICAgfVxuICB9LFxuXG4gIGlzbzg2MDFsb25nOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXnQ/JyArIHJlSG91cjI0ICsgJ1s6Ll0nICsgcmVNaW51dGUgKyAnWzouXScgKyByZVNlY29uZCArIHJlRnJhYywgJ2knKSxcbiAgICBuYW1lOiAnaXNvODYwMWxvbmcnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWMpIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUoK2hvdXIsICttaW51dGUsICtzZWNvbmQsICtmcmFjLnN1YnN0cigwLCAzKSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVUZXh0dWFsOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZU1vbnRoVGV4dCArICdbIC5cXFxcdC1dKicgKyByZURheSArICdbLC5zdG5kcmhcXFxcdCBdKycgKyByZVllYXIsICdpJyksXG4gICAgbmFtZTogJ2RhdGV0ZXh0dWFsJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIHllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgcG9pbnRlZERhdGU0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURheSArICdbLlxcXFx0LV0nICsgcmVNb250aCArICdbLi1dJyArIHJlWWVhcjQpLFxuICAgIG5hbWU6ICdwb2ludGVkZGF0ZTQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBtb250aCAtIDEsICtkYXkpO1xuICAgIH1cbiAgfSxcblxuICBwb2ludGVkRGF0ZTI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1suXFxcXHRdJyArIHJlTW9udGggKyAnXFxcXC4nICsgcmVZZWFyMiksXG4gICAgbmFtZTogJ3BvaW50ZWRkYXRlMicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBkYXksIG1vbnRoLCB5ZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQocHJvY2Vzc1llYXIoeWVhciksIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIHRpbWVMb25nMjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kKSxcbiAgICBuYW1lOiAndGltZWxvbmcyNCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVOb0NvbG9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiksXG4gICAgbmFtZTogJ2RhdGVub2NvbG9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgcGd5ZG90ZDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICdcXFxcLj8nICsgcmVEYXlPZlllYXIpLFxuICAgIG5hbWU6ICdwZ3lkb3RkJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCAwLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZVNob3J0MjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSwgJ2knKSxcbiAgICBuYW1lOiAndGltZXNob3J0MjQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgaG91ciwgbWludXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lKCtob3VyLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNvODYwMW5vQ29sb246IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjRseiArIHJlTWludXRlbHogKyByZVNlY29uZGx6LCAnaScpLFxuICAgIG5hbWU6ICdpc284NjAxbm9jb2xvbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGlzbzg2MDFkYXRlU2xhc2g6IHtcbiAgICAvLyBldmVudGhvdWdoIHRoZSB0cmFpbGluZyBzbGFzaCBpcyBvcHRpb25hbCBpbiBQSFBcbiAgICAvLyBoZXJlIGl0J3MgbWFuZGF0b3J5IGFuZCBpbnB1dHMgd2l0aG91dCB0aGUgc2xhc2hcbiAgICAvLyBhcmUgaGFuZGxlZCBieSBkYXRlc2xhc2hcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLycgKyByZU1vbnRobHogKyAnLycgKyByZURheWx6ICsgJy8nKSxcbiAgICBuYW1lOiAnaXNvODYwMWRhdGVzbGFzaCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVTbGFzaDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICcvJyArIHJlTW9udGggKyAnLycgKyByZURheSksXG4gICAgbmFtZTogJ2RhdGVzbGFzaCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGFtZXJpY2FuOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZU1vbnRoICsgJy8nICsgcmVEYXkgKyAnLycgKyByZVllYXIpLFxuICAgIG5hbWU6ICdhbWVyaWNhbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgZGF5LCB5ZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQocHJvY2Vzc1llYXIoeWVhciksIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGFtZXJpY2FuU2hvcnQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlTW9udGggKyAnLycgKyByZURheSksXG4gICAgbmFtZTogJ2FtZXJpY2Fuc2hvcnQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgsIGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHRoaXMueSwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZ251RGF0ZVNob3J0T3JJc284NjAxZGF0ZTI6IHtcbiAgICAvLyBpc284NjAxZGF0ZTIgaXMgY29tcGxldGUgc3Vic2V0IG9mIGdudWRhdGVzaG9ydFxuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyICsgJy0nICsgcmVNb250aCArICctJyArIHJlRGF5KSxcbiAgICBuYW1lOiAnZ251ZGF0ZXNob3J0IHwgaXNvODYwMWRhdGUyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgaXNvODYwMWRhdGU0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0d2l0aFNpZ24gKyAnLScgKyByZU1vbnRobHogKyAnLScgKyByZURheWx6KSxcbiAgICBuYW1lOiAnaXNvODYwMWRhdGU0JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZ251Tm9Db2xvbjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ150PycgKyByZUhvdXIyNGx6ICsgcmVNaW51dGVseiwgJ2knKSxcbiAgICBuYW1lOiAnZ251bm9jb2xvbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUpIHtcbiAgICAgIC8vIHRoaXMgcnVsZSBpcyBhIHNwZWNpYWwgY2FzZVxuICAgICAgLy8gaWYgdGltZSB3YXMgYWxyZWFkeSBzZXQgb25jZSBieSBhbnkgcHJlY2VkaW5nIHJ1bGUsIGl0IHNldHMgdGhlIGNhcHR1cmVkIHZhbHVlIGFzIHllYXJcbiAgICAgIHN3aXRjaCAodGhpcy50aW1lcykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgMCwgdGhpcy5mKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMueSA9IGhvdXIgKiAxMDAgKyArbWludXRlO1xuICAgICAgICAgIHRoaXMudGltZXMrKztcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ251RGF0ZVNob3J0ZXI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLScgKyByZU1vbnRoKSxcbiAgICBuYW1lOiAnZ251ZGF0ZXNob3J0ZXInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgeWVhciwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCAxKTtcbiAgICB9XG4gIH0sXG5cbiAgcGdUZXh0UmV2ZXJzZToge1xuICAgIC8vIG5vdGU6IGFsbG93ZWQgeWVhcnMgYXJlIGZyb20gMzItOTk5OVxuICAgIC8vIHllYXJzIGJlbG93IDMyIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRheXMgaW4gZGF0ZWZ1bGxcbiAgICByZWdleDogUmVnRXhwKCdeJyArICcoXFxcXGR7Myw0fXxbNC05XVxcXFxkfDNbMi05XSktKCcgKyByZU1vbnRoQWJiciArICcpLScgKyByZURheWx6LCAnaScpLFxuICAgIG5hbWU6ICdwZ3RleHRyZXZlcnNlJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZUZ1bGw6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1sgXFxcXHQuLV0qJyArIHJlTW9udGhUZXh0ICsgJ1sgXFxcXHQuLV0qJyArIHJlWWVhciwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZWZ1bGwnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHByb2Nlc3NZZWFyKHllYXIpLCBsb29rdXBNb250aChtb250aCksICtkYXkpO1xuICAgIH1cbiAgfSxcblxuICBkYXRlTm9EYXk6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlTW9udGhUZXh0ICsgJ1sgLlxcXFx0LV0qJyArIHJlWWVhcjQsICdpJyksXG4gICAgbmFtZTogJ2RhdGVub2RheScsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksIDEpO1xuICAgIH1cbiAgfSxcblxuICBkYXRlTm9EYXlSZXY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnWyAuXFxcXHQtXSonICsgcmVNb250aFRleHQsICdpJyksXG4gICAgbmFtZTogJ2RhdGVub2RheXJldicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksIDEpO1xuICAgIH1cbiAgfSxcblxuICBwZ1RleHRTaG9ydDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14oJyArIHJlTW9udGhBYmJyICsgJyktJyArIHJlRGF5bHogKyAnLScgKyByZVllYXIsICdpJyksXG4gICAgbmFtZTogJ3BndGV4dHNob3J0JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIHllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZU5vWWVhcjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVEYXRlTm9ZZWFyLCAnaScpLFxuICAgIG5hbWU6ICdkYXRlbm95ZWFyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVOb1llYXJSZXY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1sgLlxcXFx0LV0qJyArIHJlTW9udGhUZXh0LCAnaScpLFxuICAgIG5hbWU6ICdkYXRlbm95ZWFycmV2JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGRheSwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGlzb1dlZWtEYXk6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLT9XJyArIHJlV2Vla09mWWVhciArICcoPzotPyhbMC03XSkpPycpLFxuICAgIG5hbWU6ICdpc293ZWVrZGF5IHwgaXNvd2VlaycsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgICAgIGRheSA9IGRheSA/ICtkYXkgOiAxO1xuXG4gICAgICBpZiAoIXRoaXMueW1kKCt5ZWFyLCAwLCAxKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIGdldCBkYXkgb2Ygd2VlayBmb3IgSmFuIDFzdFxuICAgICAgdmFyIGRheU9mV2VlayA9IG5ldyBEYXRlKHRoaXMueSwgdGhpcy5tLCB0aGlzLmQpLmdldERheSgpO1xuXG4gICAgICAvLyBhbmQgdXNlIHRoZSBkYXkgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IGZvciBkYXkgMSBvZiB3ZWVrIDFcbiAgICAgIGRheU9mV2VlayA9IDAgLSAoZGF5T2ZXZWVrID4gNCA/IGRheU9mV2VlayAtIDcgOiBkYXlPZldlZWspO1xuXG4gICAgICB0aGlzLnJkICs9IGRheU9mV2VlayArICh3ZWVrIC0gMSkgKiA3ICsgZGF5O1xuICAgIH1cbiAgfSxcblxuICByZWxhdGl2ZVRleHQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHRudW1iZXIgKyAnfCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICcoJyArIHJlUmVsdGV4dHVuaXQgKyAnKScsICdpJyksXG4gICAgbmFtZTogJ3JlbGF0aXZldGV4dCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCByZWxWYWx1ZSwgcmVsVW5pdCkge1xuICAgICAgLy8gdG9kbzogaW1wbGVtZW50IGhhbmRsaW5nIG9mICd0aGlzIHRpbWUtdW5pdCdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdmFyIF9sb29rdXBSZWxhdGl2ZSA9IGxvb2t1cFJlbGF0aXZlKHJlbFZhbHVlKSxcbiAgICAgICAgICBhbW91bnQgPSBfbG9va3VwUmVsYXRpdmUuYW1vdW50LFxuICAgICAgICAgIGJlaGF2aW9yID0gX2xvb2t1cFJlbGF0aXZlLmJlaGF2aW9yO1xuXG4gICAgICBzd2l0Y2ggKHJlbFVuaXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgdGhpcy5ycyArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICB0aGlzLnJpICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLnJoICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodCc6XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodHMnOlxuICAgICAgICBjYXNlICdmb3J0aG5pZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9ydGhuaWdodHMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gYW1vdW50ICogMTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQgKiA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgICAgdGhpcy5ybSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgdGhpcy5yeSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbic6Y2FzZSAnbW9uZGF5JzpcbiAgICAgICAgY2FzZSAndHVlJzpjYXNlICd0dWVzZGF5JzpcbiAgICAgICAgY2FzZSAnd2VkJzpjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICBjYXNlICd0aHUnOmNhc2UgJ3RodXJzZGF5JzpcbiAgICAgICAgY2FzZSAnZnJpJzpjYXNlICdmcmlkYXknOlxuICAgICAgICBjYXNlICdzYXQnOmNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgY2FzZSAnc3VuJzpjYXNlICdzdW5kYXknOlxuICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gbG9va3VwV2Vla2RheShyZWxVbml0LCA3KTtcbiAgICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICAgICAgdGhpcy5yZCArPSAoYW1vdW50ID4gMCA/IGFtb3VudCAtIDEgOiBhbW91bnQpICogNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ3dlZWtkYXlzJzpcbiAgICAgICAgICAvLyB0b2RvXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbGF0aXZlOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXihbKy1dKilbIFxcXFx0XSooXFxcXGQrKScgKyByZVNwYWNlT3B0ICsgJygnICsgcmVSZWx0ZXh0dW5pdCArICd8d2VlayknLCAnaScpLFxuICAgIG5hbWU6ICdyZWxhdGl2ZScsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBzaWducywgcmVsVmFsdWUsIHJlbFVuaXQpIHtcbiAgICAgIHZhciBtaW51c2VzID0gc2lnbnMucmVwbGFjZSgvW14tXS9nLCAnJykubGVuZ3RoO1xuXG4gICAgICB2YXIgYW1vdW50ID0gK3JlbFZhbHVlICogTWF0aC5wb3coLTEsIG1pbnVzZXMpO1xuXG4gICAgICBzd2l0Y2ggKHJlbFVuaXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgdGhpcy5ycyArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICB0aGlzLnJpICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLnJoICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodCc6XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodHMnOlxuICAgICAgICBjYXNlICdmb3J0aG5pZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9ydGhuaWdodHMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gYW1vdW50ICogMTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQgKiA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgICAgdGhpcy5ybSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgdGhpcy5yeSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbic6Y2FzZSAnbW9uZGF5JzpcbiAgICAgICAgY2FzZSAndHVlJzpjYXNlICd0dWVzZGF5JzpcbiAgICAgICAgY2FzZSAnd2VkJzpjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICBjYXNlICd0aHUnOmNhc2UgJ3RodXJzZGF5JzpcbiAgICAgICAgY2FzZSAnZnJpJzpjYXNlICdmcmlkYXknOlxuICAgICAgICBjYXNlICdzYXQnOmNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgY2FzZSAnc3VuJzpjYXNlICdzdW5kYXknOlxuICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gbG9va3VwV2Vla2RheShyZWxVbml0LCA3KTtcbiAgICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICAgICAgdGhpcy5yZCArPSAoYW1vdW50ID4gMCA/IGFtb3VudCAtIDEgOiBhbW91bnQpICogNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ3dlZWtkYXlzJzpcbiAgICAgICAgICAvLyB0b2RvXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRheVRleHQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZURheXRleHQgKyAnKScsICdpJyksXG4gICAgbmFtZTogJ2RheXRleHQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5VGV4dCkge1xuICAgICAgdGhpcy5yZXNldFRpbWUoKTtcbiAgICAgIHRoaXMud2Vla2RheSA9IGxvb2t1cFdlZWtkYXkoZGF5VGV4dCwgMCk7XG5cbiAgICAgIGlmICh0aGlzLndlZWtkYXlCZWhhdmlvciAhPT0gMikge1xuICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbGF0aXZlVGV4dFdlZWs6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICd3ZWVrJywgJ2knKSxcbiAgICBuYW1lOiAncmVsYXRpdmV0ZXh0d2VlaycsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCByZWxUZXh0KSB7XG4gICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDI7XG5cbiAgICAgIHN3aXRjaCAocmVsVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ3RoaXMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgdGhpcy5yZCArPSA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsYXN0JzpcbiAgICAgICAgY2FzZSAncHJldmlvdXMnOlxuICAgICAgICAgIHRoaXMucmQgLT0gNztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTmFOKHRoaXMud2Vla2RheSkpIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5ID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW9udGhGdWxsT3JNb250aEFiYnI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZU1vbnRoRnVsbCArICd8JyArIHJlTW9udGhBYmJyICsgJyknLCAnaScpLFxuICAgIG5hbWU6ICdtb250aGZ1bGwgfCBtb250aGFiYnInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgdGhpcy5kKTtcbiAgICB9XG4gIH0sXG5cbiAgdHpDb3JyZWN0aW9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVR6Q29ycmVjdGlvbiwgJ2knKSxcbiAgICBuYW1lOiAndHpjb3JyZWN0aW9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sodHpDb3JyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lKHByb2Nlc3NUekNvcnJlY3Rpb24odHpDb3JyZWN0aW9uKSk7XG4gICAgfVxuICB9LFxuXG4gIHR6QWJicjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVUekFiYnIpLFxuICAgIG5hbWU6ICd0emFiYnInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgYWJicikge1xuICAgICAgdmFyIG9mZnNldCA9IHR6QWJick9mZnNldHNbYWJici50b0xvd2VyQ2FzZSgpXTtcblxuICAgICAgaWYgKGlzTmFOKG9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy56b25lKG9mZnNldCk7XG4gICAgfVxuICB9LFxuXG4gIGFnbzoge1xuICAgIHJlZ2V4OiAvXmFnby9pLFxuICAgIG5hbWU6ICdhZ28nLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucnkgPSAtdGhpcy5yeTtcbiAgICAgIHRoaXMucm0gPSAtdGhpcy5ybTtcbiAgICAgIHRoaXMucmQgPSAtdGhpcy5yZDtcbiAgICAgIHRoaXMucmggPSAtdGhpcy5yaDtcbiAgICAgIHRoaXMucmkgPSAtdGhpcy5yaTtcbiAgICAgIHRoaXMucnMgPSAtdGhpcy5ycztcbiAgICAgIHRoaXMucmYgPSAtdGhpcy5yZjtcbiAgICB9XG4gIH0sXG5cbiAgeWVhcjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQpLFxuICAgIG5hbWU6ICd5ZWFyNCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyKSB7XG4gICAgICB0aGlzLnkgPSAreWVhcjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICB3aGl0ZXNwYWNlOiB7XG4gICAgcmVnZXg6IC9eWyAuLFxcdF0rLyxcbiAgICBuYW1lOiAnd2hpdGVzcGFjZSdcbiAgICAvLyBkbyBub3RoaW5nXG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVMb25nOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyAndD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kLCAnaScpLFxuICAgIG5hbWU6ICdkYXRlc2hvcnR3aXRodGltZWxvbmcnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVMb25nMTI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF0ZU5vWWVhciArIHJlSG91cjEyICsgJ1s6Ll0nICsgcmVNaW51dGUgKyAnWzouXScgKyByZVNlY29uZGx6ICsgcmVTcGFjZU9wdCArIHJlTWVyaWRpYW4sICdpJyksXG4gICAgbmFtZTogJ2RhdGVzaG9ydHdpdGh0aW1lbG9uZzEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtZXJpZGlhbikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHRoaXMueSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KSAmJiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICBkYXRlU2hvcnRXaXRoVGltZVNob3J0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyAndD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZXNob3J0d2l0aHRpbWVzaG9ydCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVTaG9ydDEyOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyByZUhvdXIxMiArICdbOi5dJyArIHJlTWludXRlbHogKyByZVNwYWNlT3B0ICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZXNob3J0d2l0aHRpbWVzaG9ydDEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKHByb2Nlc3NNZXJpZGlhbigraG91ciwgbWVyaWRpYW4pLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciByZXN1bHRQcm90byA9IHtcbiAgLy8gZGF0ZVxuICB5OiBOYU4sXG4gIG06IE5hTixcbiAgZDogTmFOLFxuICAvLyB0aW1lXG4gIGg6IE5hTixcbiAgaTogTmFOLFxuICBzOiBOYU4sXG4gIGY6IE5hTixcblxuICAvLyByZWxhdGl2ZSBzaGlmdHNcbiAgcnk6IDAsXG4gIHJtOiAwLFxuICByZDogMCxcbiAgcmg6IDAsXG4gIHJpOiAwLFxuICByczogMCxcbiAgcmY6IDAsXG5cbiAgLy8gd2Vla2RheSByZWxhdGVkIHNoaWZ0c1xuICB3ZWVrZGF5OiBOYU4sXG4gIHdlZWtkYXlCZWhhdmlvcjogMCxcblxuICAvLyBmaXJzdCBvciBsYXN0IGRheSBvZiBtb250aFxuICAvLyAwIG5vbmUsIDEgZmlyc3QsIC0xIGxhc3RcbiAgZmlyc3RPckxhc3REYXlPZk1vbnRoOiAwLFxuXG4gIC8vIHRpbWV6b25lIGNvcnJlY3Rpb24gaW4gbWludXRlc1xuICB6OiBOYU4sXG5cbiAgLy8gY291bnRlcnNcbiAgZGF0ZXM6IDAsXG4gIHRpbWVzOiAwLFxuICB6b25lczogMCxcblxuICAvLyBoZWxwZXIgZnVuY3Rpb25zXG4gIHltZDogZnVuY3Rpb24geW1kKHksIG0sIGQpIHtcbiAgICBpZiAodGhpcy5kYXRlcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVzKys7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLm0gPSBtO1xuICAgIHRoaXMuZCA9IGQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHRpbWU6IGZ1bmN0aW9uIHRpbWUoaCwgaSwgcywgZikge1xuICAgIGlmICh0aGlzLnRpbWVzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudGltZXMrKztcbiAgICB0aGlzLmggPSBoO1xuICAgIHRoaXMuaSA9IGk7XG4gICAgdGhpcy5zID0gcztcbiAgICB0aGlzLmYgPSBmO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHJlc2V0VGltZTogZnVuY3Rpb24gcmVzZXRUaW1lKCkge1xuICAgIHRoaXMuaCA9IDA7XG4gICAgdGhpcy5pID0gMDtcbiAgICB0aGlzLnMgPSAwO1xuICAgIHRoaXMuZiA9IDA7XG4gICAgdGhpcy50aW1lcyA9IDA7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgem9uZTogZnVuY3Rpb24gem9uZShtaW51dGVzKSB7XG4gICAgaWYgKHRoaXMuem9uZXMgPD0gMSkge1xuICAgICAgdGhpcy56b25lcysrO1xuICAgICAgdGhpcy56ID0gbWludXRlcztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgdG9EYXRlOiBmdW5jdGlvbiB0b0RhdGUocmVsYXRpdmVUbykge1xuICAgIGlmICh0aGlzLmRhdGVzICYmICF0aGlzLnRpbWVzKSB7XG4gICAgICB0aGlzLmggPSB0aGlzLmkgPSB0aGlzLnMgPSB0aGlzLmYgPSAwO1xuICAgIH1cblxuICAgIC8vIGZpbGwgaG9sZXNcbiAgICBpZiAoaXNOYU4odGhpcy55KSkge1xuICAgICAgdGhpcy55ID0gcmVsYXRpdmVUby5nZXRGdWxsWWVhcigpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLm0pKSB7XG4gICAgICB0aGlzLm0gPSByZWxhdGl2ZVRvLmdldE1vbnRoKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHRoaXMuZCkpIHtcbiAgICAgIHRoaXMuZCA9IHJlbGF0aXZlVG8uZ2V0RGF0ZSgpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLmgpKSB7XG4gICAgICB0aGlzLmggPSByZWxhdGl2ZVRvLmdldEhvdXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHRoaXMuaSkpIHtcbiAgICAgIHRoaXMuaSA9IHJlbGF0aXZlVG8uZ2V0TWludXRlcygpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLnMpKSB7XG4gICAgICB0aGlzLnMgPSByZWxhdGl2ZVRvLmdldFNlY29uZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odGhpcy5mKSkge1xuICAgICAgdGhpcy5mID0gcmVsYXRpdmVUby5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICB9XG5cbiAgICAvLyBhZGp1c3Qgc3BlY2lhbCBlYXJseVxuICAgIHN3aXRjaCAodGhpcy5maXJzdE9yTGFzdERheU9mTW9udGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5kID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICB0aGlzLmQgPSAwO1xuICAgICAgICB0aGlzLm0gKz0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTih0aGlzLndlZWtkYXkpKSB7XG4gICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHJlbGF0aXZlVG8uZ2V0VGltZSgpKTtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIodGhpcy55LCB0aGlzLm0sIHRoaXMuZCk7XG4gICAgICBkYXRlLnNldEhvdXJzKHRoaXMuaCwgdGhpcy5pLCB0aGlzLnMsIHRoaXMuZik7XG5cbiAgICAgIHZhciBkb3cgPSBkYXRlLmdldERheSgpO1xuXG4gICAgICBpZiAodGhpcy53ZWVrZGF5QmVoYXZpb3IgPT09IDIpIHtcbiAgICAgICAgLy8gVG8gbWFrZSBcInRoaXMgd2Vla1wiIHdvcmssIHdoZXJlIHRoZSBjdXJyZW50IGRheSBvZiB3ZWVrIGlzIGEgXCJzdW5kYXlcIlxuICAgICAgICBpZiAoZG93ID09PSAwICYmIHRoaXMud2Vla2RheSAhPT0gMCkge1xuICAgICAgICAgIHRoaXMud2Vla2RheSA9IC02O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gbWFrZSBcInN1bmRheSB0aGlzIHdlZWtcIiB3b3JrLCB3aGVyZSB0aGUgY3VycmVudCBkYXkgb2Ygd2VlayBpcyBub3QgYSBcInN1bmRheVwiXG4gICAgICAgIGlmICh0aGlzLndlZWtkYXkgPT09IDAgJiYgZG93ICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gNztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZCAtPSBkb3c7XG4gICAgICAgIHRoaXMuZCArPSB0aGlzLndlZWtkYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGlmZiA9IHRoaXMud2Vla2RheSAtIGRvdztcblxuICAgICAgICAvLyBzb21lIFBIUCBtYWdpY1xuICAgICAgICBpZiAodGhpcy5yZCA8IDAgJiYgZGlmZiA8IDAgfHwgdGhpcy5yZCA+PSAwICYmIGRpZmYgPD0gLXRoaXMud2Vla2RheUJlaGF2aW9yKSB7XG4gICAgICAgICAgZGlmZiArPSA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud2Vla2RheSA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5kICs9IGRpZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kIC09IDcgLSAoTWF0aC5hYnModGhpcy53ZWVrZGF5KSAtIGRvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndlZWtkYXkgPSBOYU47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRqdXN0IHJlbGF0aXZlXG4gICAgdGhpcy55ICs9IHRoaXMucnk7XG4gICAgdGhpcy5tICs9IHRoaXMucm07XG4gICAgdGhpcy5kICs9IHRoaXMucmQ7XG5cbiAgICB0aGlzLmggKz0gdGhpcy5yaDtcbiAgICB0aGlzLmkgKz0gdGhpcy5yaTtcbiAgICB0aGlzLnMgKz0gdGhpcy5ycztcbiAgICB0aGlzLmYgKz0gdGhpcy5yZjtcblxuICAgIHRoaXMucnkgPSB0aGlzLnJtID0gdGhpcy5yZCA9IDA7XG4gICAgdGhpcy5yaCA9IHRoaXMucmkgPSB0aGlzLnJzID0gdGhpcy5yZiA9IDA7XG5cbiAgICB2YXIgcmVzdWx0ID0gbmV3IERhdGUocmVsYXRpdmVUby5nZXRUaW1lKCkpO1xuICAgIC8vIHNpbmNlIERhdGUgY29uc3RydWN0b3IgdHJlYXRzIHllYXJzIDw9IDk5IGFzIDE5MDArXG4gICAgLy8gaXQgY2FuJ3QgYmUgdXNlZCwgdGh1cyB0aGlzIHdlaXJkIHdheVxuICAgIHJlc3VsdC5zZXRGdWxsWWVhcih0aGlzLnksIHRoaXMubSwgdGhpcy5kKTtcbiAgICByZXN1bHQuc2V0SG91cnModGhpcy5oLCB0aGlzLmksIHRoaXMucywgdGhpcy5mKTtcblxuICAgIC8vIG5vdGU6IHRoaXMgaXMgZG9uZSB0d2ljZSBpbiBQSFBcbiAgICAvLyBlYXJseSB3aGVuIHByb2Nlc3Npbmcgc3BlY2lhbCByZWxhdGl2ZXNcbiAgICAvLyBhbmQgbGF0ZVxuICAgIC8vIHRvZG86IGNoZWNrIGlmIHRoZSBsb2dpYyBjYW4gYmUgcmVkdWNlZFxuICAgIC8vIHRvIGp1c3Qgb25lIHRpbWUgYWN0aW9uXG4gICAgc3dpdGNoICh0aGlzLmZpcnN0T3JMYXN0RGF5T2ZNb250aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXN1bHQuc2V0RGF0ZSgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICByZXN1bHQuc2V0TW9udGgocmVzdWx0LmdldE1vbnRoKCkgKyAxLCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gYWRqdXN0IHRpbWV6b25lXG4gICAgaWYgKCFpc05hTih0aGlzLnopICYmIHJlc3VsdC5nZXRUaW1lem9uZU9mZnNldCgpICE9PSB0aGlzLnopIHtcbiAgICAgIHJlc3VsdC5zZXRVVENGdWxsWWVhcihyZXN1bHQuZ2V0RnVsbFllYXIoKSwgcmVzdWx0LmdldE1vbnRoKCksIHJlc3VsdC5nZXREYXRlKCkpO1xuXG4gICAgICByZXN1bHQuc2V0VVRDSG91cnMocmVzdWx0LmdldEhvdXJzKCksIHJlc3VsdC5nZXRNaW51dGVzKCksIHJlc3VsdC5nZXRTZWNvbmRzKCkgLSB0aGlzLnosIHJlc3VsdC5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJ0b3RpbWUoc3RyLCBub3cpIHtcbiAgLy8gICAgICAgZGlzY3VzcyBhdDogaHR0cHM6Ly9sb2N1dHVzLmlvL3BocC9zdHJ0b3RpbWUvXG4gIC8vICAgICAgb3JpZ2luYWwgYnk6IENhaW8gQXJpZWRlIChodHRwczovL2NhaW9hcmllZGUuY29tKVxuICAvLyAgICAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gICAgICBpbXByb3ZlZCBieTogQ2FpbyBBcmllZGUgKGh0dHBzOi8vY2Fpb2FyaWVkZS5jb20pXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IEEuIE1hdMOtYXMgUXVlemFkYSAoaHR0cHM6Ly9hbWF0aWFzcS5jb20pXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IHByZXV0ZXJcbiAgLy8gICAgICBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHBzOi8vYnJldHQtemFtaXIubWUpXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IE1pcmtvIEZhYmVyXG4gIC8vICAgICAgICAgaW5wdXQgYnk6IERhdmlkXG4gIC8vICAgICAgYnVnZml4ZWQgYnk6IFdhZ25lciBCLiBTb2FyZXNcbiAgLy8gICAgICBidWdmaXhlZCBieTogQXJ0dXIgVGNoZXJueWNoZXZcbiAgLy8gICAgICBidWdmaXhlZCBieTogU3RlcGhhbiBCw7ZzY2gtUGxlcGVsaXRzIChodHRwczovL2dpdGh1Yi5jb20vcGxlcGUpXG4gIC8vIHJlaW1wbGVtZW50ZWQgYnk6IFJhZmHFgiBLdWthd3NraVxuICAvLyAgICAgICAgICAgbm90ZSAxOiBFeGFtcGxlcyBhbGwgaGF2ZSBhIGZpeGVkIHRpbWVzdGFtcCB0byBwcmV2ZW50XG4gIC8vICAgICAgICAgICBub3RlIDE6IHRlc3RzIHRvIGZhaWwgYmVjYXVzZSBvZiB2YXJpYWJsZSB0aW1lKHpvbmVzKVxuICAvLyAgICAgICAgZXhhbXBsZSAxOiBzdHJ0b3RpbWUoJysxIGRheScsIDExMjk2MzMyMDApXG4gIC8vICAgICAgICByZXR1cm5zIDE6IDExMjk3MTk2MDBcbiAgLy8gICAgICAgIGV4YW1wbGUgMjogc3RydG90aW1lKCcrMSB3ZWVrIDIgZGF5cyA0IGhvdXJzIDIgc2Vjb25kcycsIDExMjk2MzMyMDApXG4gIC8vICAgICAgICByZXR1cm5zIDI6IDExMzA0MjUyMDJcbiAgLy8gICAgICAgIGV4YW1wbGUgMzogc3RydG90aW1lKCdsYXN0IG1vbnRoJywgMTEyOTYzMzIwMClcbiAgLy8gICAgICAgIHJldHVybnMgMzogMTEyNzA0MTIwMFxuICAvLyAgICAgICAgZXhhbXBsZSA0OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDArMDAnKVxuICAvLyAgICAgICAgcmV0dXJucyA0OiAxMjQxNDI1ODAwXG4gIC8vICAgICAgICBleGFtcGxlIDU6IHN0cnRvdGltZSgnMjAwOS0wNS0wNCAwODozMDowMCswMjowMCcpXG4gIC8vICAgICAgICByZXR1cm5zIDU6IDEyNDE0MTg2MDBcbiAgLy8gICAgICAgIGV4YW1wbGUgNjogc3RydG90aW1lKCcyMDA5LTA1LTA0IDA4OjMwOjAwIFlXVCcpXG4gIC8vICAgICAgICByZXR1cm5zIDY6IDEyNDE0NTQ2MDBcblxuICBpZiAobm93ID09IG51bGwpIHtcbiAgICBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgfVxuXG4gIC8vIHRoZSBydWxlIG9yZGVyIGlzIGltcG9ydGFudFxuICAvLyBpZiBtdWx0aXBsZSBydWxlcyBtYXRjaCwgdGhlIGxvbmdlc3QgbWF0Y2ggd2luc1xuICAvLyBpZiBtdWx0aXBsZSBydWxlcyBtYXRjaCB0aGUgc2FtZSBzdHJpbmcsIHRoZSBmaXJzdCBtYXRjaCB3aW5zXG4gIHZhciBydWxlcyA9IFtmb3JtYXRzLnllc3RlcmRheSwgZm9ybWF0cy5ub3csIGZvcm1hdHMubm9vbiwgZm9ybWF0cy5taWRuaWdodE9yVG9kYXksIGZvcm1hdHMudG9tb3Jyb3csIGZvcm1hdHMudGltZXN0YW1wLCBmb3JtYXRzLmZpcnN0T3JMYXN0RGF5LCBmb3JtYXRzLmJhY2tPckZyb250T2YsXG4gIC8vIGZvcm1hdHMud2Vla2RheU9mLCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG4gIGZvcm1hdHMudGltZVRpbnkxMiwgZm9ybWF0cy50aW1lU2hvcnQxMiwgZm9ybWF0cy50aW1lTG9uZzEyLCBmb3JtYXRzLm1zc3FsdGltZSwgZm9ybWF0cy50aW1lU2hvcnQyNCwgZm9ybWF0cy50aW1lTG9uZzI0LCBmb3JtYXRzLmlzbzg2MDFsb25nLCBmb3JtYXRzLmdudU5vQ29sb24sIGZvcm1hdHMuaXNvODYwMW5vQ29sb24sIGZvcm1hdHMuYW1lcmljYW5TaG9ydCwgZm9ybWF0cy5hbWVyaWNhbiwgZm9ybWF0cy5pc284NjAxZGF0ZTQsIGZvcm1hdHMuaXNvODYwMWRhdGVTbGFzaCwgZm9ybWF0cy5kYXRlU2xhc2gsIGZvcm1hdHMuZ251RGF0ZVNob3J0T3JJc284NjAxZGF0ZTIsIGZvcm1hdHMuZ251RGF0ZVNob3J0ZXIsIGZvcm1hdHMuZGF0ZUZ1bGwsIGZvcm1hdHMucG9pbnRlZERhdGU0LCBmb3JtYXRzLnBvaW50ZWREYXRlMiwgZm9ybWF0cy5kYXRlTm9EYXksIGZvcm1hdHMuZGF0ZU5vRGF5UmV2LCBmb3JtYXRzLmRhdGVUZXh0dWFsLCBmb3JtYXRzLmRhdGVOb1llYXIsIGZvcm1hdHMuZGF0ZU5vWWVhclJldiwgZm9ybWF0cy5kYXRlTm9Db2xvbiwgZm9ybWF0cy54bWxScGMsIGZvcm1hdHMueG1sUnBjTm9Db2xvbiwgZm9ybWF0cy5zb2FwLCBmb3JtYXRzLndkZHgsIGZvcm1hdHMuZXhpZiwgZm9ybWF0cy5wZ3lkb3RkLCBmb3JtYXRzLmlzb1dlZWtEYXksIGZvcm1hdHMucGdUZXh0U2hvcnQsIGZvcm1hdHMucGdUZXh0UmV2ZXJzZSwgZm9ybWF0cy5jbGYsIGZvcm1hdHMueWVhcjQsIGZvcm1hdHMuYWdvLCBmb3JtYXRzLmRheVRleHQsIGZvcm1hdHMucmVsYXRpdmVUZXh0V2VlaywgZm9ybWF0cy5yZWxhdGl2ZVRleHQsIGZvcm1hdHMubW9udGhGdWxsT3JNb250aEFiYnIsIGZvcm1hdHMudHpDb3JyZWN0aW9uLCBmb3JtYXRzLnR6QWJiciwgZm9ybWF0cy5kYXRlU2hvcnRXaXRoVGltZVNob3J0MTIsIGZvcm1hdHMuZGF0ZVNob3J0V2l0aFRpbWVMb25nMTIsIGZvcm1hdHMuZGF0ZVNob3J0V2l0aFRpbWVTaG9ydCwgZm9ybWF0cy5kYXRlU2hvcnRXaXRoVGltZUxvbmcsIGZvcm1hdHMucmVsYXRpdmUsIGZvcm1hdHMud2hpdGVzcGFjZV07XG5cbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUocmVzdWx0UHJvdG8pO1xuXG4gIHdoaWxlIChzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGxvbmdlc3RNYXRjaCA9IG51bGw7XG4gICAgdmFyIGZpbmFsUnVsZSA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGZvcm1hdCA9IHJ1bGVzW2ldO1xuXG4gICAgICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2goZm9ybWF0LnJlZ2V4KTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGlmICghbG9uZ2VzdE1hdGNoIHx8IG1hdGNoWzBdLmxlbmd0aCA+IGxvbmdlc3RNYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgICBsb25nZXN0TWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgICBmaW5hbFJ1bGUgPSBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZpbmFsUnVsZSB8fCBmaW5hbFJ1bGUuY2FsbGJhY2sgJiYgZmluYWxSdWxlLmNhbGxiYWNrLmFwcGx5KHJlc3VsdCwgbG9uZ2VzdE1hdGNoKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdHIgPSBzdHIuc3Vic3RyKGxvbmdlc3RNYXRjaFswXS5sZW5ndGgpO1xuICAgIGZpbmFsUnVsZSA9IG51bGw7XG4gICAgbG9uZ2VzdE1hdGNoID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHJlc3VsdC50b0RhdGUobmV3IERhdGUobm93ICogMTAwMCkpIC8gMTAwMCk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RydG90aW1lLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmlfZ2V0KHZhcm5hbWUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvaW5pX2dldC9cbiAgLy8gb3JpZ2luYWwgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyAgICAgIG5vdGUgMTogVGhlIGluaSB2YWx1ZXMgbXVzdCBiZSBzZXQgYnkgaW5pX3NldCBvciBtYW51YWxseSB3aXRoaW4gYW4gaW5pIGZpbGVcbiAgLy8gICBleGFtcGxlIDE6IGluaV9zZXQoJ2RhdGUudGltZXpvbmUnLCAnQXNpYS9Ib25nX0tvbmcnKVxuICAvLyAgIGV4YW1wbGUgMTogaW5pX2dldCgnZGF0ZS50aW1lem9uZScpXG4gIC8vICAgcmV0dXJucyAxOiAnQXNpYS9Ib25nX0tvbmcnXG5cbiAgdmFyICRnbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbiAgJGdsb2JhbC4kbG9jdXR1cyA9ICRnbG9iYWwuJGxvY3V0dXMgfHwge307XG4gIHZhciAkbG9jdXR1cyA9ICRnbG9iYWwuJGxvY3V0dXM7XG4gICRsb2N1dHVzLnBocCA9ICRsb2N1dHVzLnBocCB8fCB7fTtcbiAgJGxvY3V0dXMucGhwLmluaSA9ICRsb2N1dHVzLnBocC5pbmkgfHwge307XG5cbiAgaWYgKCRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0gJiYgJGxvY3V0dXMucGhwLmluaVt2YXJuYW1lXS5sb2NhbF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0ubG9jYWxfdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuICRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0ubG9jYWxfdmFsdWU7XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5pX2dldC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RybGVuKHN0cmluZykge1xuICAvLyAgZGlzY3VzcyBhdDogaHR0cHM6Ly9sb2N1dHVzLmlvL3BocC9zdHJsZW4vXG4gIC8vIG9yaWdpbmFsIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gaW1wcm92ZWQgYnk6IFNha2ltb3JpXG4gIC8vIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gICAgaW5wdXQgYnk6IEtpcmsgU3Ryb2JlY2tcbiAgLy8gYnVnZml4ZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcbiAgLy8gIHJldmlzZWQgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyAgICAgIG5vdGUgMTogTWF5IGxvb2sgbGlrZSBvdmVya2lsbCwgYnV0IGluIG9yZGVyIHRvIGJlIHRydWx5IGZhaXRoZnVsIHRvIGhhbmRsaW5nIGFsbCBVbmljb2RlXG4gIC8vICAgICAgbm90ZSAxOiBjaGFyYWN0ZXJzIGFuZCB0byB0aGlzIGZ1bmN0aW9uIGluIFBIUCB3aGljaCBkb2VzIG5vdCBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4gIC8vICAgICAgbm90ZSAxOiBidXQgY291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgc29tZXRoaW5nIGxpa2UgdGhpcyBpcyByZWFsbHkgbmVjZXNzYXJ5LlxuICAvLyAgIGV4YW1wbGUgMTogc3RybGVuKCdLZXZpbiB2YW4gWm9ubmV2ZWxkJylcbiAgLy8gICByZXR1cm5zIDE6IDE5XG4gIC8vICAgZXhhbXBsZSAyOiBpbmlfc2V0KCd1bmljb2RlLnNlbWFudGljcycsICdvbicpXG4gIC8vICAgZXhhbXBsZSAyOiBzdHJsZW4oJ0FcXHVkODdlXFx1ZGMwNFonKVxuICAvLyAgIHJldHVybnMgMjogM1xuXG4gIHZhciBzdHIgPSBzdHJpbmcgKyAnJztcblxuICB2YXIgaW5pVmFsID0gKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUoJy4uL2luZm8vaW5pX2dldCcpKCd1bmljb2RlLnNlbWFudGljcycpIDogdW5kZWZpbmVkKSB8fCAnb2ZmJztcbiAgaWYgKGluaVZhbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gc3RyLmxlbmd0aDtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIGxndGggPSAwO1xuXG4gIHZhciBnZXRXaG9sZUNoYXIgPSBmdW5jdGlvbiBnZXRXaG9sZUNoYXIoc3RyLCBpKSB7XG4gICAgdmFyIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB2YXIgbmV4dCA9ICcnO1xuICAgIHZhciBwcmV2ID0gJyc7XG4gICAgaWYgKGNvZGUgPj0gMHhEODAwICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAvLyBIaWdoIHN1cnJvZ2F0ZSAoY291bGQgY2hhbmdlIGxhc3QgaGV4IHRvIDB4REI3RiB0b1xuICAgICAgLy8gdHJlYXQgaGlnaCBwcml2YXRlIHN1cnJvZ2F0ZXMgYXMgc2luZ2xlIGNoYXJhY3RlcnMpXG4gICAgICBpZiAoc3RyLmxlbmd0aCA8PSBpICsgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hpZ2ggc3Vycm9nYXRlIHdpdGhvdXQgZm9sbG93aW5nIGxvdyBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIG5leHQgPSBzdHIuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dCA8IDB4REMwMCB8fCBuZXh0ID4gMHhERkZGKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSGlnaCBzdXJyb2dhdGUgd2l0aG91dCBmb2xsb3dpbmcgbG93IHN1cnJvZ2F0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoaSkgKyBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMHhEQzAwICYmIGNvZGUgPD0gMHhERkZGKSB7XG4gICAgICAvLyBMb3cgc3Vycm9nYXRlXG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvdyBzdXJyb2dhdGUgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIHByZXYgPSBzdHIuY2hhckNvZGVBdChpIC0gMSk7XG4gICAgICBpZiAocHJldiA8IDB4RDgwMCB8fCBwcmV2ID4gMHhEQkZGKSB7XG4gICAgICAgIC8vIChjb3VsZCBjaGFuZ2UgbGFzdCBoZXggdG8gMHhEQjdGIHRvIHRyZWF0IGhpZ2ggcHJpdmF0ZSBzdXJyb2dhdGVzXG4gICAgICAgIC8vIGFzIHNpbmdsZSBjaGFyYWN0ZXJzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvdyBzdXJyb2dhdGUgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGNhbiBwYXNzIG92ZXIgbG93IHN1cnJvZ2F0ZXMgbm93IGFzIHRoZSBzZWNvbmRcbiAgICAgIC8vIGNvbXBvbmVudCBpbiBhIHBhaXIgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLmNoYXJBdChpKTtcbiAgfTtcblxuICBmb3IgKGkgPSAwLCBsZ3RoID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChnZXRXaG9sZUNoYXIoc3RyLCBpKSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBZGFwdCB0aGlzIGxpbmUgYXQgdGhlIHRvcCBvZiBhbnkgbG9vcCwgcGFzc2luZyBpbiB0aGUgd2hvbGUgc3RyaW5nIGFuZFxuICAgIC8vIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhbmQgcmV0dXJuaW5nIGEgdmFyaWFibGUgdG8gcmVwcmVzZW50IHRoZSBpbmRpdmlkdWFsIGNoYXJhY3RlcjtcbiAgICAvLyBwdXJwb3NlIGlzIHRvIHRyZWF0IHRoZSBmaXJzdCBwYXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgYXMgdGhlIHdob2xlIGNoYXJhY3RlciBhbmQgdGhlblxuICAgIC8vIGlnbm9yZSB0aGUgc2Vjb25kIHBhcnRcbiAgICBsZ3RoKys7XG4gIH1cblxuICByZXR1cm4gbGd0aDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJsZW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzX251bWVyaWMobWl4ZWRWYXIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvaXNfbnVtZXJpYy9cbiAgLy8gb3JpZ2luYWwgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHBzOi8va3Z6LmlvKVxuICAvLyBpbXByb3ZlZCBieTogRGF2aWRcbiAgLy8gaW1wcm92ZWQgYnk6IHRhaXRoXG4gIC8vIGJ1Z2ZpeGVkIGJ5OiBUaW0gZGUgS29uaW5nXG4gIC8vIGJ1Z2ZpeGVkIGJ5OiBXZWJEZXZIb2JvIChodHRwczovL3dlYmRldmhvYm8uYmxvZ3Nwb3QuY29tLylcbiAgLy8gYnVnZml4ZWQgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyBidWdmaXhlZCBieTogRGVuaXMgQ2hlbnUgKGh0dHBzOi8vc2hub3VsbGUubmV0KVxuICAvLyAgIGV4YW1wbGUgMTogaXNfbnVtZXJpYygxODYuMzEpXG4gIC8vICAgcmV0dXJucyAxOiB0cnVlXG4gIC8vICAgZXhhbXBsZSAyOiBpc19udW1lcmljKCdLZXZpbiB2YW4gWm9ubmV2ZWxkJylcbiAgLy8gICByZXR1cm5zIDI6IGZhbHNlXG4gIC8vICAgZXhhbXBsZSAzOiBpc19udW1lcmljKCcgKzE4Ni4zMWUyJylcbiAgLy8gICByZXR1cm5zIDM6IHRydWVcbiAgLy8gICBleGFtcGxlIDQ6IGlzX251bWVyaWMoJycpXG4gIC8vICAgcmV0dXJucyA0OiBmYWxzZVxuICAvLyAgIGV4YW1wbGUgNTogaXNfbnVtZXJpYyhbXSlcbiAgLy8gICByZXR1cm5zIDU6IGZhbHNlXG4gIC8vICAgZXhhbXBsZSA2OiBpc19udW1lcmljKCcxICcpXG4gIC8vICAgcmV0dXJucyA2OiBmYWxzZVxuXG4gIHZhciB3aGl0ZXNwYWNlID0gWycgJywgJ1xcbicsICdcXHInLCAnXFx0JywgJ1xcZicsICdcXHgwYicsICdcXHhhMCcsICdcXHUyMDAwJywgJ1xcdTIwMDEnLCAnXFx1MjAwMicsICdcXHUyMDAzJywgJ1xcdTIwMDQnLCAnXFx1MjAwNScsICdcXHUyMDA2JywgJ1xcdTIwMDcnLCAnXFx1MjAwOCcsICdcXHUyMDA5JywgJ1xcdTIwMEEnLCAnXFx1MjAwQicsICdcXHUyMDI4JywgJ1xcdTIwMjknLCAnXFx1MzAwMCddLmpvaW4oJycpO1xuXG4gIC8vIEB0b2RvOiBCcmVhayB0aGlzIHVwIHVzaW5nIG1hbnkgc2luZ2xlIGNvbmRpdGlvbnMgd2l0aCBlYXJseSByZXR1cm5zXG4gIHJldHVybiAodHlwZW9mIG1peGVkVmFyID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbWl4ZWRWYXIgPT09ICdzdHJpbmcnICYmIHdoaXRlc3BhY2UuaW5kZXhPZihtaXhlZFZhci5zbGljZSgtMSkpID09PSAtMSkgJiYgbWl4ZWRWYXIgIT09ICcnICYmICFpc05hTihtaXhlZFZhcik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbnVtZXJpYy5qcy5tYXAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKiFcbiAqIExhcmF2ZWwgSmF2YXNjcmlwdCBWYWxpZGF0aW9uXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3Byb2VuZ3NvZnQvbGFyYXZlbC1qc3ZhbGlkYXRpb25cbiAqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgYnkgdmFsaWRhdG9yc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNyBQcm9lbmdzb2Z0XG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgc3RybGVuIGZyb20gJ2xvY3V0dXMvcGhwL3N0cmluZ3Mvc3RybGVuJztcbmltcG9ydCBhcnJheV9kaWZmIGZyb20gJ2xvY3V0dXMvcGhwL2FycmF5L2FycmF5X2RpZmYnO1xuaW1wb3J0IHN0cnRvdGltZSBmcm9tICdsb2N1dHVzL3BocC9kYXRldGltZS9zdHJ0b3RpbWUnO1xuaW1wb3J0IGlzX251bWVyaWMgZnJvbSAnbG9jdXR1cy9waHAvdmFyL2lzX251bWVyaWMnO1xuXG4kLmV4dGVuZCh0cnVlLCBsYXJhdmVsVmFsaWRhdGlvbiwge1xuXG4gICAgaGVscGVyczoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1lcmljIHJ1bGVzXG4gICAgICAgICAqL1xuICAgICAgICBudW1lcmljUnVsZXM6IFsnSW50ZWdlcicsICdOdW1lcmljJ10sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBmaWxlIGlucHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZmllbGRPYmpcbiAgICAgICAgICogQHBhcmFtIGluZGV4XG4gICAgICAgICAqIEByZXR1cm5zIHt7ZmlsZTogKiwgZXh0ZW5zaW9uOiBzdHJpbmcsIHNpemU6IG51bWJlcn19XG4gICAgICAgICAqL1xuICAgICAgICBmaWxlaW5mbzogZnVuY3Rpb24gKGZpZWxkT2JqLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIEZpbGVOYW1lID0gZmllbGRPYmoudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcgPyBpbmRleCA6IDA7XG4gICAgICAgICAgICBpZiAoIGZpZWxkT2JqLmZpbGVzICE9PSBudWxsICkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmouZmlsZXNbaW5kZXhdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogRmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb246IEZpbGVOYW1lLnN1YnN0cihGaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWVsZE9iai5maWxlc1tpbmRleF0uc2l6ZSAvIDEwMjQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZE9iai5maWxlc1tpbmRleF0udHlwZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBzZWxlY3RvcnMgZm9yIHRoIHNwZWNpZmllZCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG5hbWVzXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgIGlmICghIHRoaXMuaXNBcnJheShuYW1lcykpICB7XG4gICAgICAgICAgICAgICAgbmFtZXMgPSBbbmFtZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2goXCJbbmFtZT0nXCIgKyBuYW1lc1tpXSArIFwiJ11cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3Iuam9pbigpO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIG51bWVyaWMgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgaGFzTnVtZXJpY1J1bGVzOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzUnVsZXMoZWxlbWVudCwgdGhpcy5udW1lcmljUnVsZXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayBpZiBlbGVtZW50IGhhcyBwYXNzZWQgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBydWxlc1xuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGhhc1J1bGVzOiBmdW5jdGlvbiAoZWxlbWVudCwgcnVsZXMpIHtcblxuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9ICQuZGF0YShlbGVtZW50LmZvcm0sIFwidmFsaWRhdG9yXCIpO1xuICAgICAgICAgICAgdmFyIGxpc3RSdWxlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdmFsaWRhdG9yLmFycmF5UnVsZXNDYWNoZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5hbWUgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goY2FjaGVbZWxlbWVudC5uYW1lXSwgZnVuY3Rpb24gKGluZGV4LCBhcnJheVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdFJ1bGVzLnB1c2goYXJyYXlSdWxlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5hbWUgaW4gdmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgbGlzdFJ1bGVzLnB1c2godmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzW2VsZW1lbnQubmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJC5lYWNoKGxpc3RSdWxlcywgZnVuY3Rpb24oaW5kZXgsb2JqUnVsZXMpe1xuICAgICAgICAgICAgICAgIGlmICgnbGFyYXZlbFZhbGlkYXRpb24nIGluIG9ialJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfcnVsZXM9b2JqUnVsZXMubGFyYXZlbFZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KF9ydWxlc1tpXVswXSxydWxlcykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiB0aGUgc3RyaW5nIGxlbmd0aCB1c2luZyBQSFAgZnVuY3Rpb24uXG4gICAgICAgICAqIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5zdHJsZW4ucGhwXG4gICAgICAgICAqIGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL3N0cmxlbi9cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHN0cmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgc3RybGVuOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RybGVuKHN0cmluZyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGRlcGVuZGluZyBvZiBoaXMgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9ialxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHJldHVybnMgaW50XG4gICAgICAgICAqL1xuICAgICAgICBnZXRTaXplOiBmdW5jdGlvbiBnZXRTaXplKG9iaiwgZWxlbWVudCwgdmFsdWUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTnVtZXJpY1J1bGVzKGVsZW1lbnQpICYmIHRoaXMuaXNfbnVtZXJpYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KE1hdGguZmxvb3IodGhpcy5maWxlaW5mbyhlbGVtZW50KS5zaXplKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuc3RybGVuKHZhbHVlKSk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJuIHNwZWNpZmllZCBydWxlIGZyb20gZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIGVsZW1lbnRcbiAgICAgICAgICogQHJldHVybnMgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBnZXRMYXJhdmVsVmFsaWRhdGlvbjogZnVuY3Rpb24ocnVsZSwgZWxlbWVudCkge1xuXG4gICAgICAgICAgICB2YXIgZm91bmQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAkLmVhY2goJC52YWxpZGF0b3Iuc3RhdGljUnVsZXMoZWxlbWVudCksIGZ1bmN0aW9uKGtleSwgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5PT09XCJsYXJhdmVsVmFsaWRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICQuZWFjaChydWxlcywgZnVuY3Rpb24gKGksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF09PT1ydWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQ9dmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiBoZSB0aW1lc3RhbXAgb2YgdmFsdWUgcGFzc2VkIHVzaW5nIGZvcm1hdCBvciBkZWZhdWx0IGZvcm1hdCBpbiBlbGVtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbnxpbnR9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJzZVRpbWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XG5cbiAgICAgICAgICAgIHZhciB0aW1lVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBmbXQgPSBuZXcgRGF0ZUZvcm1hdHRlcigpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGVSdWxlID0gdGhpcy5nZXRMYXJhdmVsVmFsaWRhdGlvbignRGF0ZUZvcm1hdCcsIGZvcm1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVSdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZGF0ZVJ1bGVbMV1bMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRpbWVWYWx1ZSA9IHRoaXMuc3RydG90aW1lKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZVZhbHVlID0gZm10LnBhcnNlRGF0ZSh2YWx1ZSwgZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBpZiAodGltZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiBmbXQuZm9ybWF0RGF0ZSh0aW1lVmFsdWUsIGZvcm1hdCkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVWYWx1ZSA9IE1hdGgucm91bmQoKHRpbWVWYWx1ZS5nZXRUaW1lKCkgLyAxMDAwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wYXJlIGEgZ2l2ZW4gZGF0ZSBhZ2FpbnN0IGFub3RoZXIgdXNpbmcgYW4gb3BlcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0b3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgICAgICogQHBhcmFtIG9wZXJhdG9yXG4gICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBjb21wYXJlRGF0ZXM6IGZ1bmN0aW9uICh2YWxpZGF0b3IsIHZhbHVlLCBlbGVtZW50LCBwYXJhbXMsIG9wZXJhdG9yKSB7XG5cbiAgICAgICAgICAgIHZhciB0aW1lQ29tcGFyZSA9IHRoaXMucGFyc2VUaW1lKHBhcmFtcyk7XG5cbiAgICAgICAgICAgIGlmICghdGltZUNvbXBhcmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kZXBlbmRlbnRFbGVtZW50KHZhbGlkYXRvciwgZWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aW1lQ29tcGFyZSA9IHRoaXMucGFyc2VUaW1lKHZhbGlkYXRvci5lbGVtZW50VmFsdWUodGFyZ2V0KSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRpbWVWYWx1ZSA9IHRoaXMucGFyc2VUaW1lKHZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0aW1lVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVmFsdWUgPCB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVWYWx1ZSA8PSB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlID09PSB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlID4gdGltZUNvbXBhcmU7XG5cbiAgICAgICAgICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVmFsdWUgPj0gdGltZUNvbXBhcmU7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdG9yLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGludGVsbGlnZW50bHkgZ3Vlc3MgdGhlIGRhdGUgYnkgY2xvc2VseSBtYXRjaGluZyB0aGUgc3BlY2lmaWMgZm9ybWF0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAgICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICAgICAgICovXG4gICAgICAgIGd1ZXNzRGF0ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIHZhciBmbXQgPSBuZXcgRGF0ZUZvcm1hdHRlcigpO1xuICAgICAgICAgICAgcmV0dXJuIGZtdC5ndWVzc0RhdGUodmFsdWUsIGZvcm1hdClcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBVbml4IHRpbWVzdGFtcCBiYXNlZCBvbiBQSFAgZnVuY3Rpb24gc3Ryb3RvdGltZS5cbiAgICAgICAgICogaHR0cDovL3BocC5uZXQvbWFudWFsL2VzL2Z1bmN0aW9uLnN0cnRvdGltZS5waHBcbiAgICAgICAgICogaHR0cDovL3BocGpzLm9yZy9mdW5jdGlvbnMvc3RydG90aW1lL1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGV4dFxuICAgICAgICAgKiBAcGFyYW0gbm93XG4gICAgICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RydG90aW1lOiBmdW5jdGlvbiAodGV4dCwgbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RydG90aW1lKHRleHQsIG5vdylcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpZiB2YWx1ZSBpcyBudW1lcmljLlxuICAgICAgICAgKiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZXMvdmFyLmlzX251bWVyaWMucGhwXG4gICAgICAgICAqIGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL2lzX251bWVyaWMvXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBtaXhlZF92YXJcbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBpc19udW1lcmljOiBmdW5jdGlvbiAobWl4ZWRfdmFyKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfbnVtZXJpYyhtaXhlZF92YXIpXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIG9mIHR5cGUgQXJyYXkuXG4gICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2lzQXJyYXkjUG9seWZpbGxcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGFyZ1xuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzQXJyYXk6IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEFycmF5IGRpZmYgYmFzZWQgb24gUEhQIGZ1bmN0aW9uIGFycmF5X2RpZmYuXG4gICAgICAgICAqIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lcy9mdW5jdGlvbi5hcnJheV9kaWZmLnBocFxuICAgICAgICAgKiBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9hcnJheV9kaWZmL1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gYXJyMVxuICAgICAgICAgKiBAcGFyYW0gYXJyMlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGFycmF5RGlmZjogZnVuY3Rpb24gKGFycjEsIGFycjIpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheV9kaWZmKGFycjEsIGFycjIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHR3byBhcnJheXMgYXJlIGVxdWFsIHRvIG9uZSBhbm90aGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gYXJyMVxuICAgICAgICAgKiBAcGFyYW0gYXJyMlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGFycmF5RXF1YWxzOiBmdW5jdGlvbiAoYXJyMSwgYXJyMikge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5pc0FycmF5KGFycjEpIHx8ICEgdGhpcy5pc0FycmF5KGFycjIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gJC5pc0VtcHR5T2JqZWN0KHRoaXMuYXJyYXlEaWZmKGFycjEsIGFycjIpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFrZXMgZWxlbWVudCBkZXBlbmRhbnQgZnJvbSBvdGhlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcGVuZGVudEVsZW1lbnQ6IGZ1bmN0aW9uKHZhbGlkYXRvciwgZWxlbWVudCwgbmFtZSkge1xuXG4gICAgICAgICAgICB2YXIgZWw9dmFsaWRhdG9yLmZpbmRCeU5hbWUobmFtZSk7XG5cbiAgICAgICAgICAgIGlmICggZWxbMF0hPT11bmRlZmluZWQgICYmIHZhbGlkYXRvci5zZXR0aW5ncy5vbmZvY3Vzb3V0ICkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9ICdibHVyJztcbiAgICAgICAgICAgICAgICBpZiAoZWxbMF0udGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHxcbiAgICAgICAgICAgICAgICAgICAgZWxbMF0udGFnTmFtZSA9PT0gJ09QVElPTicgfHxcbiAgICAgICAgICAgICAgICAgICAgZWxbMF0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fFxuICAgICAgICAgICAgICAgICAgICBlbFswXS50eXBlID09PSAncmFkaW8nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gJ2NsaWNrJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcnVsZU5hbWUgPSAnLnZhbGlkYXRlLWxhcmF2ZWxWYWxpZGF0aW9uJztcbiAgICAgICAgICAgICAgICBlbC5vZmYoIHJ1bGVOYW1lIClcbiAgICAgICAgICAgICAgICAgICAgLm9mZihldmVudCArIHJ1bGVOYW1lICsgJy0nICsgZWxlbWVudC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAub24oIGV2ZW50ICsgcnVsZU5hbWUgKyAnLScgKyBlbGVtZW50Lm5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCggZWxlbWVudCApLnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxbMF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBlcnJvciBBamF4IHJlc3BvbnNlIGFuZCBnZXRzIHRoZSBtZXNzYWdlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2VFcnJvclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHZhciBuZXdSZXNwb25zZSA9IFsnV2hvb3BzLCBsb29rcyBsaWtlIHNvbWV0aGluZyB3ZW50IHdyb25nLiddO1xuICAgICAgICAgICAgaWYgKCdyZXNwb25zZVRleHQnIGluIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0Lm1hdGNoKC88aDFcXHMqPiguKik8XFwvaDFcXHMqPi9pKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FycmF5KGVycm9yTXNnKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdSZXNwb25zZSA9IFtlcnJvck1zZ1sxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld1Jlc3BvbnNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFc2NhcGUgc3RyaW5nIHRvIHVzZSBhcyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzdHJcbiAgICAgICAgICogQHJldHVybnMgc3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBlc2NhcGVSZWdFeHA6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXF5cXCRcXHxdL2csIFwiXFxcXCQmXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZSBSZWdFeHAgZnJvbSB3aWxkY2FyZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgICAgICAgKi9cbiAgICAgICAgcmVnZXhGcm9tV2lsZGNhcmQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB2YXIgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnWypdJyk7XG4gICAgICAgICAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA9PT0gMSkgbmFtZVBhcnRzLnB1c2goJycpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyBuYW1lUGFydHMubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFyYXZlbFZhbGlkYXRpb24uaGVscGVycy5lc2NhcGVSZWdFeHAoeClcbiAgICAgICAgICAgIH0pLmpvaW4oJ1xcXFxbW15cXFxcXV0qXFxcXF0nKSArICckJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1lcmdlIGFkZGl0aW9uYWwgbGFyYXZlbCB2YWxpZGF0aW9uIHJ1bGVzIGludG8gdGhlIGN1cnJlbnQgcnVsZSBzZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBydWxlc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UnVsZXNcbiAgICAgICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIG1lcmdlUnVsZXM6IGZ1bmN0aW9uIChydWxlcywgbmV3UnVsZXMpIHtcbiAgICAgICAgICAgIHZhciBydWxlc0xpc3QgPSB7XG4gICAgICAgICAgICAgICAgJ2xhcmF2ZWxWYWxpZGF0aW9uJzogbmV3UnVsZXMubGFyYXZlbFZhbGlkYXRpb24gfHwgW10sXG4gICAgICAgICAgICAgICAgJ2xhcmF2ZWxWYWxpZGF0aW9uUmVtb3RlJzogbmV3UnVsZXMubGFyYXZlbFZhbGlkYXRpb25SZW1vdGUgfHwgW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBydWxlc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZXNMaXN0W2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZXNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBydWxlc1trZXldID0gW107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcnVsZXNba2V5XSA9IHJ1bGVzW2tleV0uY29uY2F0KHJ1bGVzTGlzdFtrZXldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIVE1MIGVudGl0eSBlbmNvZGUgYSBzdHJpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzdHJpbmdcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIGVuY29kZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYvPicpLnRleHQoc3RyaW5nKS5odG1sKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb2t1cCBuYW1lIGluIGFuIGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgaW4gZG90IG5vdGF0aW9uIGZvcm1hdC5cbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBmaW5kQnlBcnJheU5hbWU6IGZ1bmN0aW9uICh2YWxpZGF0b3IsIG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBzcU5hbWUgPSBuYW1lLnJlcGxhY2UoL1xcLihbXlxcLl0rKS9nLCAnWyQxXScpLFxuICAgICAgICAgICAgICAgIGxvb2t1cHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZG90IHRvIHNxdWFyZSBicmFja2V0cy4gZS5nLiBmb28uYmFyLjAgYmVjb21lcyBmb29bYmFyXVswXVxuICAgICAgICAgICAgICAgICAgICBzcU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBbXSB0byB0aGUgbmFtZSBlLmcuIGZvbyBiZWNvbWVzIGZvb1tdIG9yIGZvby5iYXIuMCBiZWNvbWVzIGZvb1tiYXJdWzBdW11cbiAgICAgICAgICAgICAgICAgICAgc3FOYW1lICsgJ1tdJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGtleSBmcm9tIGxhc3QgYXJyYXkgZS5nLiBmb29bYmFyXVswXSBiZWNvbWVzIGZvb1tiYXJdW11cbiAgICAgICAgICAgICAgICAgICAgc3FOYW1lLnJlcGxhY2UoLyguKilcXFsoLiopXFxdJC9nLCAnJDFbXScpXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb29rdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB2YWxpZGF0b3IuZmluZEJ5TmFtZShsb29rdXBzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICQobnVsbCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF0dGVtcHQgdG8gZmluZCBhbiBlbGVtZW50IGluIHRoZSBET00gbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUuXG4gICAgICAgICAqIEV4YW1wbGUgbmFtZXMgaW5jbHVkZTpcbiAgICAgICAgICogICAgLSBkb21haW4uMCB3aGljaCBtYXRjaGVzIGRvbWFpbltdXG4gICAgICAgICAqICAgIC0gY3VzdG9tZmllbGQuMyB3aGljaCBtYXRjaGVzIGN1c3RvbWZpZWxkWzNdXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0b3JcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBmaW5kQnlOYW1lOiBmdW5jdGlvbiAodmFsaWRhdG9yLCBuYW1lKSB7XG4gICAgICAgICAgICAvLyBFeGFjdCBtYXRjaC5cbiAgICAgICAgICAgIHZhciBlbGVtID0gdmFsaWRhdG9yLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmQgbmFtZSBpbiBkYXRhLCB1c2luZyBkb3Qgbm90YXRpb24uXG4gICAgICAgICAgICB2YXIgZGVsaW0gPSAnLicsXG4gICAgICAgICAgICAgICAgcGFydHMgID0gbmFtZS5zcGxpdChkZWxpbSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlY29uc3RydWN0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGk7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkLnB1c2gocGFydHNbY10pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVsZW0gPSB0aGlzLmZpbmRCeUFycmF5TmFtZSh2YWxpZGF0b3IsIHJlY29uc3RydWN0ZWQuam9pbihkZWxpbSkpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJChudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgaXQncyBhbiBhcnJheSBlbGVtZW50LCBnZXQgYWxsIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcmV0dXJucyB7KnxzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBhbGxFbGVtZW50VmFsdWVzOiBmdW5jdGlvbiAodmFsaWRhdG9yLCBlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5uYW1lLmluZGV4T2YoJ1tdJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5maW5kQnlOYW1lKGVsZW1lbnQubmFtZSkubWFwKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IuZWxlbWVudFZhbHVlKGUpO1xuICAgICAgICAgICAgICAgIH0pLmdldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLmVsZW1lbnRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sIm5hbWVzIjpbInN0cmxlbiIsImFycmF5X2RpZmYiLCJzdHJ0b3RpbWUiLCJpc19udW1lcmljIiwiJCIsImV4dGVuZCIsImxhcmF2ZWxWYWxpZGF0aW9uIiwiaGVscGVycyIsIm51bWVyaWNSdWxlcyIsImZpbGVpbmZvIiwiZmllbGRPYmoiLCJpbmRleCIsIkZpbGVOYW1lIiwidmFsdWUiLCJmaWxlcyIsImZpbGUiLCJleHRlbnNpb24iLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsInNpemUiLCJ0eXBlIiwic2VsZWN0b3IiLCJuYW1lcyIsImlzQXJyYXkiLCJpIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJoYXNOdW1lcmljUnVsZXMiLCJlbGVtZW50IiwiaGFzUnVsZXMiLCJydWxlcyIsImZvdW5kIiwidmFsaWRhdG9yIiwiZGF0YSIsImZvcm0iLCJsaXN0UnVsZXMiLCJjYWNoZSIsImFycmF5UnVsZXNDYWNoZSIsIm5hbWUiLCJlYWNoIiwiYXJyYXlSdWxlIiwic2V0dGluZ3MiLCJvYmpSdWxlcyIsIl9ydWxlcyIsImluQXJyYXkiLCJzdHJpbmciLCJnZXRTaXplIiwib2JqIiwicGFyc2VGbG9hdCIsIk1hdGgiLCJmbG9vciIsImdldExhcmF2ZWxWYWxpZGF0aW9uIiwicnVsZSIsInVuZGVmaW5lZCIsInN0YXRpY1J1bGVzIiwia2V5IiwicGFyc2VUaW1lIiwiZm9ybWF0IiwidGltZVZhbHVlIiwiZm10IiwiRGF0ZUZvcm1hdHRlciIsImRhdGVSdWxlIiwicGFyc2VEYXRlIiwiRGF0ZSIsImZvcm1hdERhdGUiLCJyb3VuZCIsImdldFRpbWUiLCJjb21wYXJlRGF0ZXMiLCJwYXJhbXMiLCJvcGVyYXRvciIsInRpbWVDb21wYXJlIiwidGFyZ2V0IiwiZGVwZW5kZW50RWxlbWVudCIsImVsZW1lbnRWYWx1ZSIsIkVycm9yIiwiZ3Vlc3NEYXRlIiwidGV4dCIsIm5vdyIsIm1peGVkX3ZhciIsImFyZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImFycmF5RGlmZiIsImFycjEiLCJhcnIyIiwiYXJyYXlFcXVhbHMiLCJpc0VtcHR5T2JqZWN0IiwiZWwiLCJmaW5kQnlOYW1lIiwib25mb2N1c291dCIsImV2ZW50IiwidGFnTmFtZSIsInJ1bGVOYW1lIiwib2ZmIiwib24iLCJ2YWxpZCIsInBhcnNlRXJyb3JSZXNwb25zZSIsInJlc3BvbnNlIiwibmV3UmVzcG9uc2UiLCJlcnJvck1zZyIsInJlc3BvbnNlVGV4dCIsIm1hdGNoIiwiZXNjYXBlUmVnRXhwIiwic3RyIiwicmVwbGFjZSIsInJlZ2V4RnJvbVdpbGRjYXJkIiwibmFtZVBhcnRzIiwic3BsaXQiLCJSZWdFeHAiLCJtYXAiLCJ4IiwibWVyZ2VSdWxlcyIsIm5ld1J1bGVzIiwicnVsZXNMaXN0IiwibGFyYXZlbFZhbGlkYXRpb25SZW1vdGUiLCJjb25jYXQiLCJlbmNvZGUiLCJodG1sIiwiZmluZEJ5QXJyYXlOYW1lIiwic3FOYW1lIiwibG9va3VwcyIsImVsZW0iLCJkZWxpbSIsInBhcnRzIiwicmVjb25zdHJ1Y3RlZCIsImMiLCJhbGxFbGVtZW50VmFsdWVzIiwiaW5kZXhPZiIsImUiLCJnZXQiXSwic291cmNlUm9vdCI6IiJ9","/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Timezone Helper functions used by validators\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\n$.extend(true, laravelValidation, {\n\n    helpers: {\n\n        /**\n         * Check if the specified timezone is valid.\n         *\n         * @param value\n         * @returns {boolean}\n         */\n        isTimezone: function (value) {\n\n            var timezones={\n                \"africa\": [\n                    \"abidjan\",\n                    \"accra\",\n                    \"addis_ababa\",\n                    \"algiers\",\n                    \"asmara\",\n                    \"bamako\",\n                    \"bangui\",\n                    \"banjul\",\n                    \"bissau\",\n                    \"blantyre\",\n                    \"brazzaville\",\n                    \"bujumbura\",\n                    \"cairo\",\n                    \"casablanca\",\n                    \"ceuta\",\n                    \"conakry\",\n                    \"dakar\",\n                    \"dar_es_salaam\",\n                    \"djibouti\",\n                    \"douala\",\n                    \"el_aaiun\",\n                    \"freetown\",\n                    \"gaborone\",\n                    \"harare\",\n                    \"johannesburg\",\n                    \"juba\",\n                    \"kampala\",\n                    \"khartoum\",\n                    \"kigali\",\n                    \"kinshasa\",\n                    \"lagos\",\n                    \"libreville\",\n                    \"lome\",\n                    \"luanda\",\n                    \"lubumbashi\",\n                    \"lusaka\",\n                    \"malabo\",\n                    \"maputo\",\n                    \"maseru\",\n                    \"mbabane\",\n                    \"mogadishu\",\n                    \"monrovia\",\n                    \"nairobi\",\n                    \"ndjamena\",\n                    \"niamey\",\n                    \"nouakchott\",\n                    \"ouagadougou\",\n                    \"porto-novo\",\n                    \"sao_tome\",\n                    \"tripoli\",\n                    \"tunis\",\n                    \"windhoek\"\n                ],\n                \"america\": [\n                    \"adak\",\n                    \"anchorage\",\n                    \"anguilla\",\n                    \"antigua\",\n                    \"araguaina\",\n                    \"argentina\\/buenos_aires\",\n                    \"argentina\\/catamarca\",\n                    \"argentina\\/cordoba\",\n                    \"argentina\\/jujuy\",\n                    \"argentina\\/la_rioja\",\n                    \"argentina\\/mendoza\",\n                    \"argentina\\/rio_gallegos\",\n                    \"argentina\\/salta\",\n                    \"argentina\\/san_juan\",\n                    \"argentina\\/san_luis\",\n                    \"argentina\\/tucuman\",\n                    \"argentina\\/ushuaia\",\n                    \"aruba\",\n                    \"asuncion\",\n                    \"atikokan\",\n                    \"bahia\",\n                    \"bahia_banderas\",\n                    \"barbados\",\n                    \"belem\",\n                    \"belize\",\n                    \"blanc-sablon\",\n                    \"boa_vista\",\n                    \"bogota\",\n                    \"boise\",\n                    \"cambridge_bay\",\n                    \"campo_grande\",\n                    \"cancun\",\n                    \"caracas\",\n                    \"cayenne\",\n                    \"cayman\",\n                    \"chicago\",\n                    \"chihuahua\",\n                    \"costa_rica\",\n                    \"creston\",\n                    \"cuiaba\",\n                    \"curacao\",\n                    \"danmarkshavn\",\n                    \"dawson\",\n                    \"dawson_creek\",\n                    \"denver\",\n                    \"detroit\",\n                    \"dominica\",\n                    \"edmonton\",\n                    \"eirunepe\",\n                    \"el_salvador\",\n                    \"fortaleza\",\n                    \"glace_bay\",\n                    \"godthab\",\n                    \"goose_bay\",\n                    \"grand_turk\",\n                    \"grenada\",\n                    \"guadeloupe\",\n                    \"guatemala\",\n                    \"guayaquil\",\n                    \"guyana\",\n                    \"halifax\",\n                    \"havana\",\n                    \"hermosillo\",\n                    \"indiana\\/indianapolis\",\n                    \"indiana\\/knox\",\n                    \"indiana\\/marengo\",\n                    \"indiana\\/petersburg\",\n                    \"indiana\\/tell_city\",\n                    \"indiana\\/vevay\",\n                    \"indiana\\/vincennes\",\n                    \"indiana\\/winamac\",\n                    \"inuvik\",\n                    \"iqaluit\",\n                    \"jamaica\",\n                    \"juneau\",\n                    \"kentucky\\/louisville\",\n                    \"kentucky\\/monticello\",\n                    \"kralendijk\",\n                    \"la_paz\",\n                    \"lima\",\n                    \"los_angeles\",\n                    \"lower_princes\",\n                    \"maceio\",\n                    \"managua\",\n                    \"manaus\",\n                    \"marigot\",\n                    \"martinique\",\n                    \"matamoros\",\n                    \"mazatlan\",\n                    \"menominee\",\n                    \"merida\",\n                    \"metlakatla\",\n                    \"mexico_city\",\n                    \"miquelon\",\n                    \"moncton\",\n                    \"monterrey\",\n                    \"montevideo\",\n                    \"montreal\",\n                    \"montserrat\",\n                    \"nassau\",\n                    \"new_york\",\n                    \"nipigon\",\n                    \"nome\",\n                    \"noronha\",\n                    \"north_dakota\\/beulah\",\n                    \"north_dakota\\/center\",\n                    \"north_dakota\\/new_salem\",\n                    \"ojinaga\",\n                    \"panama\",\n                    \"pangnirtung\",\n                    \"paramaribo\",\n                    \"phoenix\",\n                    \"port-au-prince\",\n                    \"port_of_spain\",\n                    \"porto_velho\",\n                    \"puerto_rico\",\n                    \"rainy_river\",\n                    \"rankin_inlet\",\n                    \"recife\",\n                    \"regina\",\n                    \"resolute\",\n                    \"rio_branco\",\n                    \"santa_isabel\",\n                    \"santarem\",\n                    \"santiago\",\n                    \"santo_domingo\",\n                    \"sao_paulo\",\n                    \"scoresbysund\",\n                    \"shiprock\",\n                    \"sitka\",\n                    \"st_barthelemy\",\n                    \"st_johns\",\n                    \"st_kitts\",\n                    \"st_lucia\",\n                    \"st_thomas\",\n                    \"st_vincent\",\n                    \"swift_current\",\n                    \"tegucigalpa\",\n                    \"thule\",\n                    \"thunder_bay\",\n                    \"tijuana\",\n                    \"toronto\",\n                    \"tortola\",\n                    \"vancouver\",\n                    \"whitehorse\",\n                    \"winnipeg\",\n                    \"yakutat\",\n                    \"yellowknife\"\n                ],\n                \"antarctica\": [\n                    \"casey\",\n                    \"davis\",\n                    \"dumontdurville\",\n                    \"macquarie\",\n                    \"mawson\",\n                    \"mcmurdo\",\n                    \"palmer\",\n                    \"rothera\",\n                    \"south_pole\",\n                    \"syowa\",\n                    \"vostok\"\n                ],\n                \"arctic\": [\n                    \"longyearbyen\"\n                ],\n                \"asia\": [\n                    \"aden\",\n                    \"almaty\",\n                    \"amman\",\n                    \"anadyr\",\n                    \"aqtau\",\n                    \"aqtobe\",\n                    \"ashgabat\",\n                    \"baghdad\",\n                    \"bahrain\",\n                    \"baku\",\n                    \"bangkok\",\n                    \"beirut\",\n                    \"bishkek\",\n                    \"brunei\",\n                    \"choibalsan\",\n                    \"chongqing\",\n                    \"colombo\",\n                    \"damascus\",\n                    \"dhaka\",\n                    \"dili\",\n                    \"dubai\",\n                    \"dushanbe\",\n                    \"gaza\",\n                    \"harbin\",\n                    \"hebron\",\n                    \"ho_chi_minh\",\n                    \"hong_kong\",\n                    \"hovd\",\n                    \"irkutsk\",\n                    \"jakarta\",\n                    \"jayapura\",\n                    \"jerusalem\",\n                    \"kabul\",\n                    \"kamchatka\",\n                    \"karachi\",\n                    \"kashgar\",\n                    \"kathmandu\",\n                    \"khandyga\",\n                    \"kolkata\",\n                    \"krasnoyarsk\",\n                    \"kuala_lumpur\",\n                    \"kuching\",\n                    \"kuwait\",\n                    \"macau\",\n                    \"magadan\",\n                    \"makassar\",\n                    \"manila\",\n                    \"muscat\",\n                    \"nicosia\",\n                    \"novokuznetsk\",\n                    \"novosibirsk\",\n                    \"omsk\",\n                    \"oral\",\n                    \"phnom_penh\",\n                    \"pontianak\",\n                    \"pyongyang\",\n                    \"qatar\",\n                    \"qyzylorda\",\n                    \"rangoon\",\n                    \"riyadh\",\n                    \"sakhalin\",\n                    \"samarkand\",\n                    \"seoul\",\n                    \"shanghai\",\n                    \"singapore\",\n                    \"taipei\",\n                    \"tashkent\",\n                    \"tbilisi\",\n                    \"tehran\",\n                    \"thimphu\",\n                    \"tokyo\",\n                    \"ulaanbaatar\",\n                    \"urumqi\",\n                    \"ust-nera\",\n                    \"vientiane\",\n                    \"vladivostok\",\n                    \"yakutsk\",\n                    \"yekaterinburg\",\n                    \"yerevan\"\n                ],\n                \"atlantic\": [\n                    \"azores\",\n                    \"bermuda\",\n                    \"canary\",\n                    \"cape_verde\",\n                    \"faroe\",\n                    \"madeira\",\n                    \"reykjavik\",\n                    \"south_georgia\",\n                    \"st_helena\",\n                    \"stanley\"\n                ],\n                \"australia\": [\n                    \"adelaide\",\n                    \"brisbane\",\n                    \"broken_hill\",\n                    \"currie\",\n                    \"darwin\",\n                    \"eucla\",\n                    \"hobart\",\n                    \"lindeman\",\n                    \"lord_howe\",\n                    \"melbourne\",\n                    \"perth\",\n                    \"sydney\"\n                ],\n                \"europe\": [\n                    \"amsterdam\",\n                    \"andorra\",\n                    \"athens\",\n                    \"belgrade\",\n                    \"berlin\",\n                    \"bratislava\",\n                    \"brussels\",\n                    \"bucharest\",\n                    \"budapest\",\n                    \"busingen\",\n                    \"chisinau\",\n                    \"copenhagen\",\n                    \"dublin\",\n                    \"gibraltar\",\n                    \"guernsey\",\n                    \"helsinki\",\n                    \"isle_of_man\",\n                    \"istanbul\",\n                    \"jersey\",\n                    \"kaliningrad\",\n                    \"kiev\",\n                    \"lisbon\",\n                    \"ljubljana\",\n                    \"london\",\n                    \"luxembourg\",\n                    \"madrid\",\n                    \"malta\",\n                    \"mariehamn\",\n                    \"minsk\",\n                    \"monaco\",\n                    \"moscow\",\n                    \"oslo\",\n                    \"paris\",\n                    \"podgorica\",\n                    \"prague\",\n                    \"riga\",\n                    \"rome\",\n                    \"samara\",\n                    \"san_marino\",\n                    \"sarajevo\",\n                    \"simferopol\",\n                    \"skopje\",\n                    \"sofia\",\n                    \"stockholm\",\n                    \"tallinn\",\n                    \"tirane\",\n                    \"uzhgorod\",\n                    \"vaduz\",\n                    \"vatican\",\n                    \"vienna\",\n                    \"vilnius\",\n                    \"volgograd\",\n                    \"warsaw\",\n                    \"zagreb\",\n                    \"zaporozhye\",\n                    \"zurich\"\n                ],\n                \"indian\": [\n                    \"antananarivo\",\n                    \"chagos\",\n                    \"christmas\",\n                    \"cocos\",\n                    \"comoro\",\n                    \"kerguelen\",\n                    \"mahe\",\n                    \"maldives\",\n                    \"mauritius\",\n                    \"mayotte\",\n                    \"reunion\"\n                ],\n                \"pacific\": [\n                    \"apia\",\n                    \"auckland\",\n                    \"chatham\",\n                    \"chuuk\",\n                    \"easter\",\n                    \"efate\",\n                    \"enderbury\",\n                    \"fakaofo\",\n                    \"fiji\",\n                    \"funafuti\",\n                    \"galapagos\",\n                    \"gambier\",\n                    \"guadalcanal\",\n                    \"guam\",\n                    \"honolulu\",\n                    \"johnston\",\n                    \"kiritimati\",\n                    \"kosrae\",\n                    \"kwajalein\",\n                    \"majuro\",\n                    \"marquesas\",\n                    \"midway\",\n                    \"nauru\",\n                    \"niue\",\n                    \"norfolk\",\n                    \"noumea\",\n                    \"pago_pago\",\n                    \"palau\",\n                    \"pitcairn\",\n                    \"pohnpei\",\n                    \"port_moresby\",\n                    \"rarotonga\",\n                    \"saipan\",\n                    \"tahiti\",\n                    \"tarawa\",\n                    \"tongatapu\",\n                    \"wake\",\n                    \"wallis\"\n                ],\n                \"utc\": [\n                    \"\"\n                ]\n            };\n\n            var tzparts= value.split('/',2);\n            var continent=tzparts[0].toLowerCase();\n            var city='';\n            if (tzparts[1]) {\n                city=tzparts[1].toLowerCase();\n            }\n\n            return (continent in timezones && ( timezones[continent].length===0 || timezones[continent].indexOf(city)!==-1))\n        }\n    }\n});\n","/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Methods that implement Laravel Validations\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\n$.extend(true, laravelValidation, {\n\n    methods:{\n\n        helpers: laravelValidation.helpers,\n\n        jsRemoteTimer:0,\n\n        /**\n         * \"Validate\" optional attributes.\n         * Always returns true, just lets us put sometimes in rules.\n         *\n         * @return {boolean}\n         */\n        Sometimes: function() {\n            return true;\n        },\n\n        /**\n         * Bail This is the default behaivour os JSValidation.\n         * Always returns true, just lets us put sometimes in rules.\n         *\n         * @return {boolean}\n         */\n        Bail: function() {\n            return true;\n        },\n\n        /**\n         * \"Indicate\" validation should pass if value is null.\n         * Always returns true, just lets us put \"nullable\" in rules.\n         *\n         * @return {boolean}\n         */\n        Nullable: function() {\n            return true;\n        },\n\n        /**\n         * Validate the given attribute is filled if it is present.\n         */\n        Filled: function(value, element) {\n            return $.validator.methods.required.call(this, value, element, true);\n        },\n\n\n        /**\n         * Validate that a required attribute exists.\n         */\n        Required: function(value, element) {\n            return  $.validator.methods.required.call(this, value, element);\n        },\n\n        /**\n         * Validate that an attribute exists when any other attribute exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWith: function(value, element, params) {\n            var validator=this,\n                required=false;\n            var currentObject=this;\n\n            $.each(params,function(i,param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required=required || (\n                    target!==undefined &&\n                    $.validator.methods.required.call(\n                        validator,\n                        currentObject.elementValue(target),\n                        target,true\n                    ));\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when all other attribute exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWithAll: function(value, element, params) {\n            var validator=this,\n                required=true;\n            var currentObject=this;\n\n            $.each(params,function(i,param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required = required && (\n                      target!==undefined &&\n                      $.validator.methods.required.call(\n                          validator,\n                          currentObject.elementValue(target),\n                          target,true\n                      ));\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when any other attribute does not exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWithout: function(value, element, params) {\n            var validator=this,\n                required=false;\n            var currentObject=this;\n\n            $.each(params,function(i,param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required = required ||\n                    target===undefined||\n                    !$.validator.methods.required.call(\n                        validator,\n                        currentObject.elementValue(target),\n                        target,true\n                    );\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when all other attribute does not exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWithoutAll: function(value, element, params) {\n            var validator=this,\n                required=true,\n                currentObject=this;\n\n            $.each(params,function(i, param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required = required && (\n                    target===undefined ||\n                    !$.validator.methods.required.call(\n                        validator,\n                        currentObject.elementValue(target),\n                        target,true\n                    ));\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when another attribute has a given value.\n         *\n         * @return {boolean}\n         */\n        RequiredIf: function(value, element, params) {\n\n            var target=laravelValidation.helpers.dependentElement(\n                this, element, params[0]\n            );\n\n            if (target!==undefined) {\n                var val=String(this.elementValue(target));\n                if (typeof val !== 'undefined') {\n                    var data = params.slice(1);\n                    if ($.inArray(val, data) !== -1) {\n                        return $.validator.methods.required.call(\n                            this, value, element, true\n                        );\n                    }\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when another\n         * attribute does not have a given value.\n         *\n         * @return {boolean}\n         */\n        RequiredUnless: function(value, element, params) {\n\n            var target=laravelValidation.helpers.dependentElement(\n                this, element, params[0]\n            );\n\n            if (target!==undefined) {\n                var val=String(this.elementValue(target));\n                if (typeof val !== 'undefined') {\n                    var data = params.slice(1);\n                    if ($.inArray(val, data) !== -1) {\n                        return true;\n                    }\n                }\n            }\n\n            return $.validator.methods.required.call(\n                this, value, element, true\n            );\n\n        },\n\n        /**\n         * Validate that an attribute has a matching confirmation.\n         *\n         * @return {boolean}\n         */\n        Confirmed: function(value, element, params) {\n            return laravelValidation.methods.Same.call(this,value, element, params);\n        },\n\n        /**\n         * Validate that two attributes match.\n         *\n         * @return {boolean}\n         */\n        Same: function(value, element, params) {\n\n            var target=laravelValidation.helpers.dependentElement(\n                this, element, params[0]\n            );\n\n            if (target!==undefined) {\n                return String(value) === String(this.elementValue(target));\n            }\n            return false;\n        },\n\n        /**\n         * Validate that the values of an attribute is in another attribute.\n         *\n         * @param value\n         * @param element\n         * @param params\n         * @returns {boolean}\n         * @constructor\n         */\n        InArray: function (value, element, params) {\n            if (typeof params[0] === 'undefined') {\n                return false;\n            }\n            var elements = this.elements();\n            var found = false;\n            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);\n\n            for ( var i = 0; i < elements.length ; i++ ) {\n                var targetName = elements[i].name;\n                if (targetName.match(nameRegExp)) {\n                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);\n                    found = found || equals;\n                }\n            }\n\n            return found;\n        },\n\n        /**\n         * Validate an attribute is unique among other values.\n         *\n         * @param value\n         * @param element\n         * @param params\n         * @returns {boolean}\n         */\n        Distinct: function (value, element, params) {\n            if (typeof params[0] === 'undefined') {\n                return false;\n            }\n\n            var elements = this.elements();\n            var found = false;\n            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);\n\n            for ( var i = 0; i < elements.length ; i++ ) {\n                var targetName = elements[i].name;\n                if (targetName !== element.name && targetName.match(nameRegExp)) {\n                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);\n                    found = found || equals;\n                }\n            }\n\n            return !found;\n        },\n\n\n        /**\n         * Validate that an attribute is different from another attribute.\n         *\n         * @return {boolean}\n         */\n        Different: function(value, element, params) {\n            return ! laravelValidation.methods.Same.call(this,value, element, params);\n        },\n\n        /**\n         * Validate that an attribute was \"accepted\".\n         * This validation rule implies the attribute is \"required\".\n         *\n         * @return {boolean}\n         */\n        Accepted: function(value) {\n            var regex = new RegExp(\"^(?:(yes|on|1|true))$\",'i');\n            return regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is an array.\n         *\n         * @param value\n         * @param element\n         */\n        Array: function(value, element) {\n            if (element.name.indexOf('[') !== -1 && element.name.indexOf(']') !== -1) {\n                return true;\n            }\n\n            return laravelValidation.helpers.isArray(value);\n        },\n\n        /**\n         * Validate that an attribute is a boolean.\n         *\n         * @return {boolean}\n         */\n        Boolean: function(value) {\n            var regex= new RegExp(\"^(?:(true|false|1|0))$\",'i');\n            return  regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is an integer.\n         *\n         * @return {boolean}\n         */\n        Integer: function(value) {\n            var regex= new RegExp(\"^(?:-?\\\\d+)$\",'i');\n            return  regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is numeric.\n         */\n        Numeric: function(value, element) {\n            return $.validator.methods.number.call(this, value, element, true);\n        },\n\n        /**\n         * Validate that an attribute is a string.\n         *\n         * @return {boolean}\n         */\n        String: function(value) {\n            return typeof value === 'string';\n        },\n\n        /**\n         * The field under validation must be numeric and must have an exact length of value.\n         */\n        Digits: function(value, element, params) {\n            return (\n                $.validator.methods.number.call(this, value, element, true) &&\n                value.length === parseInt(params, 10)\n            );\n        },\n\n        /**\n         * The field under validation must have a length between the given min and max.\n         */\n        DigitsBetween: function(value, element, params) {\n            return ($.validator.methods.number.call(this, value, element, true)\n                && value.length>=parseFloat(params[0]) && value.length<=parseFloat(params[1]));\n        },\n\n        /**\n         * Validate the size of an attribute.\n         *\n         * @return {boolean}\n         */\n        Size: function(value, element, params) {\n            return laravelValidation.helpers.getSize(this, element,value) === parseFloat(params[0]);\n        },\n\n        /**\n         * Validate the size of an attribute is between a set of values.\n         *\n         * @return {boolean}\n         */\n        Between: function(value, element, params) {\n            return ( laravelValidation.helpers.getSize(this, element,value) >= parseFloat(params[0]) &&\n                laravelValidation.helpers.getSize(this,element,value) <= parseFloat(params[1]));\n        },\n\n        /**\n         * Validate the size of an attribute is greater than a minimum value.\n         *\n         * @return {boolean}\n         */\n        Min: function(value, element, params) {\n            value = laravelValidation.helpers.allElementValues(this, element);\n\n            return laravelValidation.helpers.getSize(this, element, value) >= parseFloat(params[0]);\n        },\n\n        /**\n         * Validate the size of an attribute is less than a maximum value.\n         *\n         * @return {boolean}\n         */\n        Max: function(value, element, params) {\n            value = laravelValidation.helpers.allElementValues(this, element);\n\n            return laravelValidation.helpers.getSize(this, element, value) <= parseFloat(params[0]);\n        },\n\n        /**\n         * Validate an attribute is contained within a list of values.\n         *\n         * @return {boolean}\n         */\n        In: function(value, element, params) {\n            if (laravelValidation.helpers.isArray(value)\n                && laravelValidation.helpers.hasRules(element, \"Array\")\n            ) {\n                var diff = laravelValidation.helpers.arrayDiff(value, params);\n\n                return Object.keys(diff).length === 0;\n            }\n\n            return params.indexOf(value.toString()) !== -1;\n        },\n\n        /**\n         * Validate an attribute is not contained within a list of values.\n         *\n         * @return {boolean}\n         */\n        NotIn: function(value, element, params) {\n            return params.indexOf(value.toString()) === -1;\n        },\n\n        /**\n         * Validate that an attribute is a valid IP.\n         *\n         * @return {boolean}\n         */\n        Ip: function(value) {\n            return /^(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/i.test(value) ||\n                /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);\n        },\n\n        /**\n         * Validate that an attribute is a valid e-mail address.\n         */\n        Email: function(value, element) {\n            return $.validator.methods.email.call(this, value, element, true);\n        },\n\n        /**\n         * Validate that an attribute is a valid URL.\n         */\n        Url: function(value, element) {\n            return $.validator.methods.url.call(this, value, element, true);\n        },\n\n        /**\n         * The field under validation must be a successfully uploaded file.\n         *\n         * @return {boolean}\n         */\n        File: function(value, element) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            if ('files' in element ) {\n                return (element.files.length > 0);\n            }\n            return false;\n        },\n\n        /**\n         * Validate the MIME type of a file upload attribute is in a set of MIME types.\n         *\n         * @return {boolean}\n         */\n        Mimes: function(value, element, params) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            var lowerParams = $.map(params, function(item) {\n                return item.toLowerCase();\n            });\n\n            var fileinfo = laravelValidation.helpers.fileinfo(element);\n            return (fileinfo !== false && lowerParams.indexOf(fileinfo.extension.toLowerCase())!==-1);\n        },\n\n        /**\n         * The file under validation must match one of the given MIME types.\n         *\n         * @return {boolean}\n         */\n        Mimetypes: function(value, element, params) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            var lowerParams = $.map(params, function(item) {\n                return item.toLowerCase();\n            });\n\n            var fileinfo = laravelValidation.helpers.fileinfo(element);\n\n            if (fileinfo === false) {\n                return false;\n            }\n            return (lowerParams.indexOf(fileinfo.type.toLowerCase())!==-1);\n        },\n\n        /**\n         * Validate the MIME type of a file upload attribute is in a set of MIME types.\n         */\n        Image: function(value, element) {\n            return laravelValidation.methods.Mimes.call(this, value, element, [\n                'jpg', 'png', 'gif', 'bmp', 'svg', 'jpeg'\n            ]);\n        },\n\n        /**\n         * Validate dimensions of Image.\n         *\n         * @return {boolean|string}\n         */\n        Dimensions: function(value, element, params, callback) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            if (element.files === null || typeof element.files[0] === 'undefined') {\n                return false;\n            }\n\n            var fr = new FileReader;\n            fr.onload = function () {\n                var img = new Image();\n                img.onload = function () {\n                    var height = parseFloat(img.naturalHeight);\n                    var width = parseFloat(img.naturalWidth);\n                    var ratio = width / height;\n                    var notValid = ((params['width']) && parseFloat(params['width'] !== width)) ||\n                        ((params['min_width']) && parseFloat(params['min_width']) > width) ||\n                        ((params['max_width']) && parseFloat(params['max_width']) < width) ||\n                        ((params['height']) && parseFloat(params['height']) !== height) ||\n                        ((params['min_height']) && parseFloat(params['min_height']) > height) ||\n                        ((params['max_height']) && parseFloat(params['max_height']) < height) ||\n                        ((params['ratio']) && ratio !== parseFloat(eval(params['ratio']))\n                        );\n                    callback(! notValid);\n                };\n                img.onerror = function() {\n                    callback(false);\n                };\n                img.src = fr.result;\n            };\n            fr.readAsDataURL(element.files[0]);\n\n            return 'pending';\n        },\n\n        /**\n         * Validate that an attribute contains only alphabetic characters.\n         *\n         * @return {boolean}\n         */\n        Alpha: function(value) {\n            if (typeof  value !== 'string') {\n                return false;\n            }\n\n            var regex = new RegExp(\"^(?:^[a-z\\u00E0-\\u00FC]+$)$\",'i');\n            return  regex.test(value);\n\n        },\n\n        /**\n         * Validate that an attribute contains only alpha-numeric characters.\n         *\n         * @return {boolean}\n         */\n        AlphaNum: function(value) {\n            if (typeof  value !== 'string') {\n                return false;\n            }\n            var regex = new RegExp(\"^(?:^[a-z0-9\\u00E0-\\u00FC]+$)$\",'i');\n            return regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute contains only alphabetic characters.\n         *\n         * @return {boolean}\n         */\n        AlphaDash: function(value) {\n            if (typeof  value !== 'string') {\n                return false;\n            }\n            var regex = new RegExp(\"^(?:^[a-z0-9\\u00E0-\\u00FC_-]+$)$\",'i');\n            return regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute passes a regular expression check.\n         *\n         * @return {boolean}\n         */\n        Regex: function(value, element, params) {\n            var invalidModifiers=['x','s','u','X','U','A'];\n            // Converting php regular expression\n            var phpReg= new RegExp('^(?:\\/)(.*\\\\\\/?[^\\/]*|[^\\/]*)(?:\\/)([gmixXsuUAJ]*)?$');\n            var matches=params[0].match(phpReg);\n            if (matches === null) {\n                return false;\n            }\n            // checking modifiers\n            var php_modifiers=[];\n            if (matches[2]!==undefined) {\n                php_modifiers=matches[2].split('');\n                for (var i=0; i<php_modifiers.length<i ;i++) {\n                    if (invalidModifiers.indexOf(php_modifiers[i])!==-1) {\n                        return true;\n                    }\n                }\n            }\n            var regex = new RegExp(\"^(?:\"+matches[1]+\")$\",php_modifiers.join());\n            return   regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is a valid date.\n         *\n         * @return {boolean}\n         */\n        Date: function(value) {\n            return (laravelValidation.helpers.strtotime(value)!==false);\n        },\n\n        /**\n         * Validate that an attribute matches a date format.\n         *\n         * @return {boolean}\n         */\n        DateFormat: function(value, element, params) {\n            return laravelValidation.helpers.parseTime(value,params[0])!==false;\n        },\n\n        /**\n         * Validate the date is before a given date.\n         *\n         * @return {boolean}\n         */\n        Before: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<');\n        },\n\n        /**\n         * Validate the date is equal or before a given date.\n         *\n         * @return {boolean}\n         */\n        BeforeOrEqual: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<=');\n        },\n\n        /**\n         * Validate the date is after a given date.\n         *\n         * @return {boolean}\n         */\n        After: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>');\n        },\n\n        /**\n         * Validate the date is equal or after a given date.\n         *\n         * @return {boolean}\n         */\n        AfterOrEqual: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>=');\n        },\n\n\n        /**\n         * Validate that an attribute is a valid date.\n         */\n        Timezone: function(value) {\n            return  laravelValidation.helpers.isTimezone(value);\n        },\n\n\n        /**\n         * Validate the attribute is a valid JSON string.\n         *\n         * @param  value\n         * @return bool\n         */\n        Json: function(value) {\n            var result = true;\n            try {\n                JSON.parse(value);\n            } catch (e) {\n                result = false;\n            }\n            return result;\n        },\n\n        /**\n         * Noop (always returns true).\n         *\n         * @param value\n         * @returns {boolean}\n         */\n        ProengsoftNoop: function (value) {\n            return true;\n        },\n    }\n});\n"]}laravel-jsvalidation/public/js/jsvalidation.js.map000064400001234540152434177750016402 0ustar00{"version":3,"sources":["node_modules/jquery-validation/dist/jquery.validate.js","node_modules/php-date-formatter/js/php-date-formatter.js","resources/assets/js/jsvalidation.js","es-build/helpers.js","resources/assets/js/timezones.js","resources/assets/js/validations.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnqDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC7oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxgEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"jsvalidation.js","sourcesContent":["/*!\n * jQuery Validation Plugin v1.20.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2023 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t//   - A user defined a `submitHandler`\n\t\t\t\t\t//   - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t//     was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler && !validator.settings.debug ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tisContentEditable = typeof this.attr( \"contenteditable\" ) !== \"undefined\" && this.attr( \"contenteditable\" ) !== \"false\",\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && isContentEditable ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// JQuery trim is deprecated, provide a trim method based on String.prototype.trim\nvar trim = function( str ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill\n\treturn str.replace( /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\" );\n};\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar currentForm = this.currentForm,\n\t\t\t\tgroups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\t// Ignore the element if it belongs to another form. This will happen mainly\n\t\t\t\t// when setting the `form` attribute of an input to the id of another form.\n\t\t\t\tif ( currentForm !== this.form ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.trigger( \"focus\" )\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tvar isContentEditable = typeof $( this ).attr( \"contenteditable\" ) !== \"undefined\" && $( this ).attr( \"contenteditable\" ) !== \"false\";\n\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( isContentEditable ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Ignore elements that belong to other/nested forms\n\t\t\t\tif ( this.form !== validator.currentForm ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tisContentEditable = typeof $element.attr( \"contenteditable\" ) !== \"undefined\" && $element.attr( \"contenteditable\" ) !== \"false\",\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( isContentEditable ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Abort any pending Ajax request from a previous call to this method.\n\t\t\tthis.abortRequest( element );\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass );\n\n\t\t\t\tif ( this.settings && this.settings.escapeHtml ) {\n\t\t\t\t\terror.text( message || \"\" );\n\t\t\t\t} else {\n\t\t\t\t\terror.html( message || \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\tif ( string === undefined ) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\telementAjaxPort: function( element ) {\n\t\t\treturn \"validate\" + element.name;\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {\n\t\t\t\t$( this.currentForm ).trigger( \"submit\" );\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tabortRequest: function( element ) {\n\t\t\tvar port;\n\n\t\t\tif ( this.pending[ element.name ] ) {\n\t\t\t\tport = this.elementAjaxPort( element );\n\t\t\t\t$.ajaxAbort( port );\n\n\t\t\t\tthis.pendingRequest--;\n\n\t\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\t\tthis.pendingRequest = 0;\n\t\t\t\t}\n\n\t\t\t\tdelete this.pending[ element.name ];\n\t\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" )\n\t\t\t\t.find( \".validate-lessThan-blur\" )\n\t\t\t\t\t.off( \".validate-lessThan\" )\n\t\t\t\t\t.removeClass( \"validate-lessThan-blur\" )\n\t\t\t\t.find( \".validate-lessThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-lessThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-lessThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThanEqual-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThanEqual\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThanEqual-blur\" )\n\t\t\t\t.find( \".validate-greaterThan-blur\" )\n\t\t\t\t\t.off( \".validate-greaterThan\" )\n\t\t\t\t\t.removeClass( \"validate-greaterThan-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ type === \"date\" ? \"dateISO\" : method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\n\t\t\t// Cast empty attributes like `data-rule-required` to `true`\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = true;\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = typeof parameter === \"function\" && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( Array.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value !== undefined && value !== null && value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\\]\\[?\\/<~#`!@$^&*()+=}|:\";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: ( function() {\n\t\t\tvar called = false;\n\n\t\t\treturn function( value, element ) {\n\t\t\t\tif ( !called ) {\n\t\t\t\t\tcalled = true;\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\"The `date` method is deprecated and will be removed in version '2.0.0'.\\n\" +\n\t\t\t\t\t\t\t\"Please don't use it, since it relies on the Date constructor, which\\n\" +\n\t\t\t\t\t\t\t\"behaves very differently across browsers and locales. Use `dateISO`\\n\" +\n\t\t\t\t\t\t\t\"instead or one of the locale specific methods in `localizations/`\\n\" +\n\t\t\t\t\t\t\t\"and `additional-methods.js`.\"\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t\t};\n\t\t}() ),\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = Array.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: this.elementAjaxPort( element ),\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n//        $.ajaxAbort( port );\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\t$.ajaxAbort( port );\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\n\n// Abort the previous request without sending a new one\n$.ajaxAbort = function( port ) {\n\tif ( pendingRequests[ port ] ) {\n\t\tpendingRequests[ port ].abort();\n\t\tdelete pendingRequests[ port ];\n\t}\n};\nreturn $;\n}));","/*!\r\n * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014 - 2020\r\n * @version 1.3.6\r\n *\r\n * Date formatter utility library that allows formatting date/time variables or Date objects using PHP DateTime format.\r\n * This library is a standalone javascript library and does not depend on other libraries or plugins like jQuery. The\r\n * library also adds support for Universal Module Definition (UMD).\r\n * \r\n * @see http://php.net/manual/en/function.date.php\r\n *\r\n * For more JQuery plugins visit http://plugins.krajee.com\r\n * For more Yii related demos visit http://demos.krajee.com\r\n */\r\n(function (root, factory) {\r\n    // noinspection JSUnresolvedVariable\r\n    if (typeof define === 'function' && define.amd) { // AMD\r\n        // noinspection JSUnresolvedFunction\r\n        define([], factory);\r\n    } else {\r\n        // noinspection JSUnresolvedVariable\r\n        if (typeof module === 'object' && module.exports) { // Node\r\n            // noinspection JSUnresolvedVariable\r\n            module.exports = factory();\r\n        } else { // Browser globals\r\n            root.DateFormatter = factory();\r\n        }\r\n    }\r\n}(typeof self !== 'undefined' ? self : this, function () {\r\n    var DateFormatter, $h;\r\n    /**\r\n     * Global helper object\r\n     */\r\n    $h = {\r\n        DAY: 1000 * 60 * 60 * 24,\r\n        HOUR: 3600,\r\n        defaults: {\r\n            dateSettings: {\r\n                days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\r\n                daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n                months: [\r\n                    'January', 'February', 'March', 'April', 'May', 'June', 'July',\r\n                    'August', 'September', 'October', 'November', 'December'\r\n                ],\r\n                monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n                meridiem: ['AM', 'PM'],\r\n                ordinal: function (number) {\r\n                    var n = number % 10, suffixes = {1: 'st', 2: 'nd', 3: 'rd'};\r\n                    return Math.floor(number % 100 / 10) === 1 || !suffixes[n] ? 'th' : suffixes[n];\r\n                }\r\n            },\r\n            separators: /[ \\-+\\/.:@]/g,\r\n            validParts: /[dDjlNSwzWFmMntLoYyaABgGhHisueTIOPZcrU]/g,\r\n            intParts: /[djwNzmnyYhHgGis]/g,\r\n            tzParts: /\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,\r\n            tzClip: /[^-+\\dA-Z]/g\r\n        },\r\n        getInt: function (str, radix) {\r\n            return parseInt(str, (radix ? radix : 10));\r\n        },\r\n        compare: function (str1, str2) {\r\n            return typeof (str1) === 'string' && typeof (str2) === 'string' && str1.toLowerCase() === str2.toLowerCase();\r\n        },\r\n        lpad: function (value, length, chr) {\r\n            var val = value.toString();\r\n            chr = chr || '0';\r\n            return val.length < length ? $h.lpad(chr + val, length) : val;\r\n        },\r\n        merge: function (out) {\r\n            var i, obj;\r\n            out = out || {};\r\n            for (i = 1; i < arguments.length; i++) {\r\n                obj = arguments[i];\r\n                if (!obj) {\r\n                    continue;\r\n                }\r\n                for (var key in obj) {\r\n                    if (obj.hasOwnProperty(key)) {\r\n                        if (typeof obj[key] === 'object') {\r\n                            $h.merge(out[key], obj[key]);\r\n                        } else {\r\n                            out[key] = obj[key];\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return out;\r\n        },\r\n        getIndex: function (val, arr) {\r\n            for (var i = 0; i < arr.length; i++) {\r\n                if (arr[i].toLowerCase() === val.toLowerCase()) {\r\n                    return i;\r\n                }\r\n            }\r\n            return -1;\r\n        }\r\n    };\r\n\r\n    /**\r\n     * Date Formatter Library Constructor\r\n     * @param options\r\n     * @constructor\r\n     */\r\n    DateFormatter = function (options) {\r\n        var self = this, config = $h.merge($h.defaults, options);\r\n        self.dateSettings = config.dateSettings;\r\n        self.separators = config.separators;\r\n        self.validParts = config.validParts;\r\n        self.intParts = config.intParts;\r\n        self.tzParts = config.tzParts;\r\n        self.tzClip = config.tzClip;\r\n    };\r\n\r\n    /**\r\n     * DateFormatter Library Prototype\r\n     */\r\n    DateFormatter.prototype = {\r\n        constructor: DateFormatter,\r\n        getMonth: function (val) {\r\n            var self = this, i;\r\n            i = $h.getIndex(val, self.dateSettings.monthsShort) + 1;\r\n            if (i === 0) {\r\n                i = $h.getIndex(val, self.dateSettings.months) + 1;\r\n            }\r\n            return i;\r\n        },\r\n        parseDate: function (vDate, vFormat) {\r\n            var self = this, vFormatParts, vDateParts, i, vDateFlag = false, vTimeFlag = false, vDatePart, iDatePart,\r\n                vSettings = self.dateSettings, vMonth, vMeriIndex, vMeriOffset, len, mer,\r\n                out = {date: null, year: null, month: null, day: null, hour: 0, min: 0, sec: 0};\r\n            if (!vDate) {\r\n                return null;\r\n            }\r\n            if (vDate instanceof Date) {\r\n                return vDate;\r\n            }\r\n            if (vFormat === 'U') {\r\n                i = $h.getInt(vDate);\r\n                return i ? new Date(i * 1000) : vDate;\r\n            }\r\n            switch (typeof vDate) {\r\n                case 'number':\r\n                    return new Date(vDate);\r\n                case 'string':\r\n                    break;\r\n                default:\r\n                    return null;\r\n            }\r\n            vFormatParts = vFormat.match(self.validParts);\r\n            if (!vFormatParts || vFormatParts.length === 0) {\r\n                throw new Error('Invalid date format definition.');\r\n            }\r\n            for (i = vFormatParts.length - 1; i >= 0; i--) {\r\n                if (vFormatParts[i] === 'S') {\r\n                    vFormatParts.splice(i, 1);\r\n                }\r\n            }\r\n            vDateParts = vDate.replace(self.separators, '\\0').split('\\0');\r\n            for (i = 0; i < vDateParts.length; i++) {\r\n                vDatePart = vDateParts[i];\r\n                iDatePart = $h.getInt(vDatePart);\r\n                switch (vFormatParts[i]) {\r\n                    case 'y':\r\n                    case 'Y':\r\n                        if (iDatePart) {\r\n                            len = vDatePart.length;\r\n                            out.year = len === 2 ? $h.getInt((iDatePart < 70 ? '20' : '19') + vDatePart) : iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vDateFlag = true;\r\n                        break;\r\n                    case 'm':\r\n                    case 'n':\r\n                    case 'M':\r\n                    case 'F':\r\n                        if (isNaN(iDatePart)) {\r\n                            vMonth = self.getMonth(vDatePart);\r\n                            if (vMonth > 0) {\r\n                                out.month = vMonth;\r\n                            } else {\r\n                                return null;\r\n                            }\r\n                        } else {\r\n                            if (iDatePart >= 1 && iDatePart <= 12) {\r\n                                out.month = iDatePart;\r\n                            } else {\r\n                                return null;\r\n                            }\r\n                        }\r\n                        vDateFlag = true;\r\n                        break;\r\n                    case 'd':\r\n                    case 'j':\r\n                        if (iDatePart >= 1 && iDatePart <= 31) {\r\n                            out.day = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vDateFlag = true;\r\n                        break;\r\n                    case 'g':\r\n                    case 'h':\r\n                        vMeriIndex = (vFormatParts.indexOf('a') > -1) ? vFormatParts.indexOf('a') :\r\n                            ((vFormatParts.indexOf('A') > -1) ? vFormatParts.indexOf('A') : -1);\r\n                        mer = vDateParts[vMeriIndex];\r\n                        if (vMeriIndex !== -1) {\r\n                            vMeriOffset = $h.compare(mer, vSettings.meridiem[0]) ? 0 :\r\n                                ($h.compare(mer, vSettings.meridiem[1]) ? 12 : -1);\r\n                            if (iDatePart >= 1 && iDatePart <= 12 && vMeriOffset !== -1) {\r\n                                out.hour = iDatePart % 12 === 0 ? vMeriOffset : iDatePart + vMeriOffset;\r\n                            } else {\r\n                                if (iDatePart >= 0 && iDatePart <= 23) {\r\n                                    out.hour = iDatePart;\r\n                                }\r\n                            }\r\n                        } else {\r\n                            if (iDatePart >= 0 && iDatePart <= 23) {\r\n                                out.hour = iDatePart;\r\n                            } else {\r\n                                return null;\r\n                            }\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                    case 'G':\r\n                    case 'H':\r\n                        if (iDatePart >= 0 && iDatePart <= 23) {\r\n                            out.hour = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                    case 'i':\r\n                        if (iDatePart >= 0 && iDatePart <= 59) {\r\n                            out.min = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                    case 's':\r\n                        if (iDatePart >= 0 && iDatePart <= 59) {\r\n                            out.sec = iDatePart;\r\n                        } else {\r\n                            return null;\r\n                        }\r\n                        vTimeFlag = true;\r\n                        break;\r\n                }\r\n            }\r\n            if (vDateFlag === true) {\r\n                var varY = out.year || 0, varM = out.month ? out.month - 1 : 0, varD = out.day || 1;\r\n                out.date = new Date(varY, varM, varD, out.hour, out.min, out.sec, 0);\r\n            } else {\r\n                if (vTimeFlag !== true) {\r\n                    return null;\r\n                }\r\n                out.date = new Date(0, 0, 0, out.hour, out.min, out.sec, 0);\r\n            }\r\n            return out.date;\r\n        },\r\n        guessDate: function (vDateStr, vFormat) {\r\n            if (typeof vDateStr !== 'string') {\r\n                return vDateStr;\r\n            }\r\n            var self = this, vParts = vDateStr.replace(self.separators, '\\0').split('\\0'), vPattern = /^[djmn]/g, len,\r\n                vFormatParts = vFormat.match(self.validParts), vDate = new Date(), vDigit = 0, vYear, i, n, iPart, iSec;\r\n\r\n            if (!vPattern.test(vFormatParts[0])) {\r\n                return vDateStr;\r\n            }\r\n\r\n            for (i = 0; i < vParts.length; i++) {\r\n                vDigit = 2;\r\n                iPart = vParts[i];\r\n                iSec = $h.getInt(iPart.substr(0, 2));\r\n                if (isNaN(iSec)) {\r\n                    return null;\r\n                }\r\n                switch (i) {\r\n                    case 0:\r\n                        if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {\r\n                            vDate.setMonth(iSec - 1);\r\n                        } else {\r\n                            vDate.setDate(iSec);\r\n                        }\r\n                        break;\r\n                    case 1:\r\n                        if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {\r\n                            vDate.setDate(iSec);\r\n                        } else {\r\n                            vDate.setMonth(iSec - 1);\r\n                        }\r\n                        break;\r\n                    case 2:\r\n                        vYear = vDate.getFullYear();\r\n                        len = iPart.length;\r\n                        vDigit = len < 4 ? len : 4;\r\n                        vYear = $h.getInt(len < 4 ? vYear.toString().substr(0, 4 - len) + iPart : iPart.substr(0, 4));\r\n                        if (!vYear) {\r\n                            return null;\r\n                        }\r\n                        vDate.setFullYear(vYear);\r\n                        break;\r\n                    case 3:\r\n                        vDate.setHours(iSec);\r\n                        break;\r\n                    case 4:\r\n                        vDate.setMinutes(iSec);\r\n                        break;\r\n                    case 5:\r\n                        vDate.setSeconds(iSec);\r\n                        break;\r\n                }\r\n                n = iPart.substr(vDigit);\r\n                if (n.length > 0) {\r\n                    vParts.splice(i + 1, 0, n);\r\n                }\r\n            }\r\n            return vDate;\r\n        },\r\n        parseFormat: function (vChar, vDate) {\r\n            var self = this, vSettings = self.dateSettings, fmt, backslash = /\\\\?(.?)/gi, doFormat = function (t, s) {\r\n                return fmt[t] ? fmt[t]() : s;\r\n            };\r\n            fmt = {\r\n                /////////\r\n                // DAY //\r\n                /////////\r\n                /**\r\n                 * Day of month with leading 0: `01..31`\r\n                 * @return {string}\r\n                 */\r\n                d: function () {\r\n                    return $h.lpad(fmt.j(), 2);\r\n                },\r\n                /**\r\n                 * Shorthand day name: `Mon...Sun`\r\n                 * @return {string}\r\n                 */\r\n                D: function () {\r\n                    return vSettings.daysShort[fmt.w()];\r\n                },\r\n                /**\r\n                 * Day of month: `1..31`\r\n                 * @return {number}\r\n                 */\r\n                j: function () {\r\n                    return vDate.getDate();\r\n                },\r\n                /**\r\n                 * Full day name: `Monday...Sunday`\r\n                 * @return {string}\r\n                 */\r\n                l: function () {\r\n                    return vSettings.days[fmt.w()];\r\n                },\r\n                /**\r\n                 * ISO-8601 day of week: `1[Mon]..7[Sun]`\r\n                 * @return {number}\r\n                 */\r\n                N: function () {\r\n                    return fmt.w() || 7;\r\n                },\r\n                /**\r\n                 * Day of week: `0[Sun]..6[Sat]`\r\n                 * @return {number}\r\n                 */\r\n                w: function () {\r\n                    return vDate.getDay();\r\n                },\r\n                /**\r\n                 * Day of year: `0..365`\r\n                 * @return {number}\r\n                 */\r\n                z: function () {\r\n                    var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j()), b = new Date(fmt.Y(), 0, 1);\r\n                    return Math.round((a - b) / $h.DAY);\r\n                },\r\n\r\n                //////////\r\n                // WEEK //\r\n                //////////\r\n                /**\r\n                 * ISO-8601 week number\r\n                 * @return {number}\r\n                 */\r\n                W: function () {\r\n                    var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j() - fmt.N() + 3), b = new Date(a.getFullYear(), 0, 4);\r\n                    return $h.lpad(1 + Math.round((a - b) / $h.DAY / 7), 2);\r\n                },\r\n\r\n                ///////////\r\n                // MONTH //\r\n                ///////////\r\n                /**\r\n                 * Full month name: `January...December`\r\n                 * @return {string}\r\n                 */\r\n                F: function () {\r\n                    return vSettings.months[vDate.getMonth()];\r\n                },\r\n                /**\r\n                 * Month w/leading 0: `01..12`\r\n                 * @return {string}\r\n                 */\r\n                m: function () {\r\n                    return $h.lpad(fmt.n(), 2);\r\n                },\r\n                /**\r\n                 * Shorthand month name; `Jan...Dec`\r\n                 * @return {string}\r\n                 */\r\n                M: function () {\r\n                    return vSettings.monthsShort[vDate.getMonth()];\r\n                },\r\n                /**\r\n                 * Month: `1...12`\r\n                 * @return {number}\r\n                 */\r\n                n: function () {\r\n                    return vDate.getMonth() + 1;\r\n                },\r\n                /**\r\n                 * Days in month: `28...31`\r\n                 * @return {number}\r\n                 */\r\n                t: function () {\r\n                    return (new Date(fmt.Y(), fmt.n(), 0)).getDate();\r\n                },\r\n\r\n                //////////\r\n                // YEAR //\r\n                //////////\r\n                /**\r\n                 * Is leap year? `0 or 1`\r\n                 * @return {number}\r\n                 */\r\n                L: function () {\r\n                    var Y = fmt.Y();\r\n                    return (Y % 4 === 0 && Y % 100 !== 0 || Y % 400 === 0) ? 1 : 0;\r\n                },\r\n                /**\r\n                 * ISO-8601 year\r\n                 * @return {number}\r\n                 */\r\n                o: function () {\r\n                    var n = fmt.n(), W = fmt.W(), Y = fmt.Y();\r\n                    return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);\r\n                },\r\n                /**\r\n                 * Full year: `e.g. 1980...2010`\r\n                 * @return {number}\r\n                 */\r\n                Y: function () {\r\n                    return vDate.getFullYear();\r\n                },\r\n                /**\r\n                 * Last two digits of year: `00...99`\r\n                 * @return {string}\r\n                 */\r\n                y: function () {\r\n                    return fmt.Y().toString().slice(-2);\r\n                },\r\n\r\n                //////////\r\n                // TIME //\r\n                //////////\r\n                /**\r\n                 * Meridian lower: `am or pm`\r\n                 * @return {string}\r\n                 */\r\n                a: function () {\r\n                    return fmt.A().toLowerCase();\r\n                },\r\n                /**\r\n                 * Meridian upper: `AM or PM`\r\n                 * @return {string}\r\n                 */\r\n                A: function () {\r\n                    var n = fmt.G() < 12 ? 0 : 1;\r\n                    return vSettings.meridiem[n];\r\n                },\r\n                /**\r\n                 * Swatch Internet time: `000..999`\r\n                 * @return {string}\r\n                 */\r\n                B: function () {\r\n                    var H = vDate.getUTCHours() * $h.HOUR, i = vDate.getUTCMinutes() * 60, s = vDate.getUTCSeconds();\r\n                    return $h.lpad(Math.floor((H + i + s + $h.HOUR) / 86.4) % 1000, 3);\r\n                },\r\n                /**\r\n                 * 12-Hours: `1..12`\r\n                 * @return {number}\r\n                 */\r\n                g: function () {\r\n                    return fmt.G() % 12 || 12;\r\n                },\r\n                /**\r\n                 * 24-Hours: `0..23`\r\n                 * @return {number}\r\n                 */\r\n                G: function () {\r\n                    return vDate.getHours();\r\n                },\r\n                /**\r\n                 * 12-Hours with leading 0: `01..12`\r\n                 * @return {string}\r\n                 */\r\n                h: function () {\r\n                    return $h.lpad(fmt.g(), 2);\r\n                },\r\n                /**\r\n                 * 24-Hours w/leading 0: `00..23`\r\n                 * @return {string}\r\n                 */\r\n                H: function () {\r\n                    return $h.lpad(fmt.G(), 2);\r\n                },\r\n                /**\r\n                 * Minutes w/leading 0: `00..59`\r\n                 * @return {string}\r\n                 */\r\n                i: function () {\r\n                    return $h.lpad(vDate.getMinutes(), 2);\r\n                },\r\n                /**\r\n                 * Seconds w/leading 0: `00..59`\r\n                 * @return {string}\r\n                 */\r\n                s: function () {\r\n                    return $h.lpad(vDate.getSeconds(), 2);\r\n                },\r\n                /**\r\n                 * Microseconds: `000000-999000`\r\n                 * @return {string}\r\n                 */\r\n                u: function () {\r\n                    return $h.lpad(vDate.getMilliseconds() * 1000, 6);\r\n                },\r\n\r\n                //////////////\r\n                // TIMEZONE //\r\n                //////////////\r\n                /**\r\n                 * Timezone identifier: `e.g. Atlantic/Azores, ...`\r\n                 * @return {string}\r\n                 */\r\n                e: function () {\r\n                    var str = /\\((.*)\\)/.exec(String(vDate))[1];\r\n                    return str || 'Coordinated Universal Time';\r\n                },\r\n                /**\r\n                 * DST observed? `0 or 1`\r\n                 * @return {number}\r\n                 */\r\n                I: function () {\r\n                    var a = new Date(fmt.Y(), 0), c = Date.UTC(fmt.Y(), 0),\r\n                        b = new Date(fmt.Y(), 6), d = Date.UTC(fmt.Y(), 6);\r\n                    return ((a - c) !== (b - d)) ? 1 : 0;\r\n                },\r\n                /**\r\n                 * Difference to GMT in hour format: `e.g. +0200`\r\n                 * @return {string}\r\n                 */\r\n                O: function () {\r\n                    var tzo = vDate.getTimezoneOffset(), a = Math.abs(tzo);\r\n                    return (tzo > 0 ? '-' : '+') + $h.lpad(Math.floor(a / 60) * 100 + a % 60, 4);\r\n                },\r\n                /**\r\n                 * Difference to GMT with colon: `e.g. +02:00`\r\n                 * @return {string}\r\n                 */\r\n                P: function () {\r\n                    var O = fmt.O();\r\n                    return (O.substr(0, 3) + ':' + O.substr(3, 2));\r\n                },\r\n                /**\r\n                 * Timezone abbreviation: `e.g. EST, MDT, ...`\r\n                 * @return {string}\r\n                 */\r\n                T: function () {\r\n                    var str = (String(vDate).match(self.tzParts) || ['']).pop().replace(self.tzClip, '');\r\n                    return str || 'UTC';\r\n                },\r\n                /**\r\n                 * Timezone offset in seconds: `-43200...50400`\r\n                 * @return {number}\r\n                 */\r\n                Z: function () {\r\n                    return -vDate.getTimezoneOffset() * 60;\r\n                },\r\n\r\n                ////////////////////\r\n                // FULL DATE TIME //\r\n                ////////////////////\r\n                /**\r\n                 * ISO-8601 date\r\n                 * @return {string}\r\n                 */\r\n                c: function () {\r\n                    return 'Y-m-d\\\\TH:i:sP'.replace(backslash, doFormat);\r\n                },\r\n                /**\r\n                 * RFC 2822 date\r\n                 * @return {string}\r\n                 */\r\n                r: function () {\r\n                    return 'D, d M Y H:i:s O'.replace(backslash, doFormat);\r\n                },\r\n                /**\r\n                 * Seconds since UNIX epoch\r\n                 * @return {number}\r\n                 */\r\n                U: function () {\r\n                    return vDate.getTime() / 1000 || 0;\r\n                }\r\n            };\r\n            return doFormat(vChar, vChar);\r\n        },\r\n        formatDate: function (vDate, vFormat) {\r\n            var self = this, i, n, len, str, vChar, vDateStr = '', BACKSLASH = '\\\\';\r\n            if (typeof vDate === 'string') {\r\n                vDate = self.parseDate(vDate, vFormat);\r\n                if (!vDate) {\r\n                    return null;\r\n                }\r\n            }\r\n            if (vDate instanceof Date) {\r\n                len = vFormat.length;\r\n                for (i = 0; i < len; i++) {\r\n                    vChar = vFormat.charAt(i);\r\n                    if (vChar === 'S' || vChar === BACKSLASH) {\r\n                        continue;\r\n                    }\r\n                    if (i > 0 && vFormat.charAt(i - 1) === BACKSLASH) {\r\n                        vDateStr += vChar;\r\n                        continue;\r\n                    }\r\n                    str = self.parseFormat(vChar, vDate);\r\n                    if (i !== (len - 1) && self.intParts.test(vChar) && vFormat.charAt(i + 1) === 'S') {\r\n                        n = $h.getInt(str) || 0;\r\n                        str += self.dateSettings.ordinal(n);\r\n                    }\r\n                    vDateStr += str;\r\n                }\r\n                return vDateStr;\r\n            }\r\n            return '';\r\n        }\r\n    };\r\n    return DateFormatter;\r\n}));","/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\nvar laravelValidation;\nlaravelValidation = {\n\n    implicitRules: ['Required','Confirmed'],\n\n    /**\n     * Initialize laravel validations.\n     */\n    init: function () {\n\n        // jquery-validation requires the field under validation to be present. We're adding a dummy hidden\n        // field so that any errors are not visible.\n        var constructor = $.fn.validate;\n        $.fn.validate = function( options ) {\n            var name = 'proengsoft_jsvalidation'; // must match the name defined in JsValidatorFactory.newFormRequestValidator\n            var $elm = $(this).find('input[name=\"' + name + '\"]');\n            if ($elm.length === 0) {\n                $('<input>').attr({type: 'hidden', name: name}).appendTo(this);\n            }\n\n            return constructor.apply(this, [options]);\n        };\n\n        // Disable class rules and attribute rules\n        $.validator.classRuleSettings = {};\n        $.validator.attributeRules = function () {};\n\n        $.validator.dataRules = this.arrayRules;\n        $.validator.prototype.arrayRulesCache = {};\n\n        // Register validations methods\n        this.setupValidations();\n    },\n\n    arrayRules: function(element) {\n\n        var rules = {},\n            validator = $.data( element.form, \"validator\"),\n            cache = validator.arrayRulesCache;\n\n        // Is not an Array\n        if (element.name.indexOf('[') === -1) {\n            return rules;\n        }\n\n        if (! (element.name in cache)) {\n            cache[element.name] = {};\n        }\n\n        $.each(validator.settings.rules, function(name, tmpRules) {\n            if (name in cache[element.name]) {\n                rules = laravelValidation.helpers.mergeRules(rules, cache[element.name][name]);\n            } else {\n                cache[element.name][name] = {};\n\n                var nameRegExp = laravelValidation.helpers.regexFromWildcard(name);\n                if (element.name.match(nameRegExp)) {\n                    var newRules = $.validator.normalizeRule(tmpRules) || {};\n                    cache[element.name][name] = newRules;\n\n                    rules = laravelValidation.helpers.mergeRules(rules, newRules);\n                }\n            }\n        });\n\n        return rules;\n    },\n\n    setupValidations: function () {\n\n        /**\n         * Get CSRF token.\n         *\n         * @param params\n         * @returns {string}\n         */\n        var getCsrfToken = function (params) {\n            return params[0][1][1];\n        };\n\n        /**\n         * Whether to validate all attributes.\n         *\n         * @param params\n         * @returns {boolean}\n         */\n        var isValidateAll = function (params) {\n            return params[0][1][2];\n        };\n\n        /**\n         * Determine whether the rule is implicit.\n         *\n         * @param params\n         * @returns {boolean}\n         */\n        var isImplicit = function (params) {\n            var implicit = false;\n            $.each(params, function (i, parameters) {\n                implicit = implicit || parameters[3];\n            });\n\n            return implicit;\n        };\n\n        /**\n         * Get form method from a validator instance.\n         *\n         * @param validator\n         * @returns {string}\n         */\n        var formMethod = function (validator) {\n            var formMethod = $(validator.currentForm).attr('method');\n            if ($(validator.currentForm).find('input[name=\"_method\"]').length) {\n                formMethod = $(validator.currentForm).find('input[name=\"_method\"]').val();\n            }\n\n            return formMethod;\n        };\n\n        /**\n         * Get AJAX parameters for remote requests.\n         *\n         * @param validator\n         * @param element\n         * @param params\n         * @param data\n         * @returns {object}\n         */\n        var ajaxOpts = function (validator, element, params, data) {\n            return {\n                mode: 'abort',\n                port: 'validate' + element.name,\n                dataType: 'json',\n                data: data,\n                context: validator.currentForm,\n                url: $(validator.currentForm).attr('action'),\n                type: formMethod(validator),\n                beforeSend: function (xhr) {\n                    var token = getCsrfToken(params);\n                    if (formMethod(validator) !== 'get' && token) {\n                        return xhr.setRequestHeader('X-XSRF-TOKEN', token);\n                    }\n                },\n            };\n        };\n\n        /**\n         * Validate a set of local JS based rules against an element.\n         *\n         * @param validator\n         * @param values\n         * @param element\n         * @param rules\n         * @returns {boolean}\n         */\n        var validateLocalRules = function (validator, values, element, rules) {\n            var validated = true,\n                previous = validator.previousValue(element);\n\n            $.each(rules, function (i, param) {\n                var implicit = param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1;\n                var rule = param[0];\n                var message = param[2];\n\n                if (! implicit && validator.optional(element)) {\n                    validated = \"dependency-mismatch\";\n                    return false;\n                }\n\n                if (laravelValidation.methods[rule] !== undefined) {\n                    $.each(values, function(index, value) {\n                        validated = laravelValidation.methods[rule].call(validator, value, element, param[1], function(valid) {\n                            validator.settings.messages[element.name].laravelValidationRemote = previous.originalMessage;\n                            if (valid) {\n                                var submitted = validator.formSubmitted;\n                                validator.prepareElement(element);\n                                validator.formSubmitted = submitted;\n                                validator.successList.push(element);\n                                delete validator.invalid[element.name];\n                                validator.showErrors();\n                            } else {\n                                var errors = {};\n                                errors[ element.name ]\n                                    = previous.message\n                                    = typeof message === \"function\" ? message( value ) : message;\n                                validator.invalid[element.name] = true;\n                                validator.showErrors(errors);\n                            }\n                            validator.showErrors(validator.errorMap);\n                            previous.valid = valid;\n                        });\n\n                        // Break loop.\n                        if (validated === false) {\n                            return false;\n                        }\n                    });\n                } else {\n                    validated = false;\n                }\n\n                if (validated !== true) {\n                    if (!validator.settings.messages[element.name] ) {\n                        validator.settings.messages[element.name] = {};\n                    }\n\n                    validator.settings.messages[element.name].laravelValidation= message;\n\n                    return false;\n                }\n\n            });\n\n            return validated;\n        };\n\n        /**\n         * Create JQueryValidation check to validate Laravel rules.\n         */\n\n        $.validator.addMethod(\"laravelValidation\", function (value, element, params) {\n            var rules = [],\n                arrayRules = [];\n            $.each(params, function (i, param) {\n                // put Implicit rules in front\n                var isArrayRule = param[4].indexOf('[') !== -1;\n                if (param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1) {\n                    isArrayRule ? arrayRules.unshift(param) : rules.unshift(param);\n                } else {\n                    isArrayRule ? arrayRules.push(param) : rules.push(param);\n                }\n            });\n\n            // Validate normal rules.\n            var localRulesResult = validateLocalRules(this, [value], element, rules);\n\n            // Validate items of the array using array rules.\n            var arrayValue = ! Array.isArray(value) ? [value] : value;\n            var arrayRulesResult = validateLocalRules(this, arrayValue, element, arrayRules);\n\n            return localRulesResult && arrayRulesResult;\n        }, '');\n\n\n        /**\n         * Create JQueryValidation check to validate Remote Laravel rules.\n         */\n        $.validator.addMethod(\"laravelValidationRemote\", function (value, element, params) {\n\n            if (! isImplicit(params) && this.optional( element )) {\n                return \"dependency-mismatch\";\n            }\n\n            var previous = this.previousValue( element ),\n                validator, data;\n\n            if (! this.settings.messages[ element.name ]) {\n                this.settings.messages[ element.name ] = {};\n            }\n            previous.originalMessage = this.settings.messages[ element.name ].laravelValidationRemote;\n            this.settings.messages[ element.name ].laravelValidationRemote = previous.message;\n\n            if (laravelValidation.helpers.arrayEquals(previous.old, value) || previous.old === value) {\n                return previous.valid;\n            }\n\n            previous.old = value;\n            validator = this;\n            this.startRequest( element );\n\n            data = $(validator.currentForm).serializeArray();\n            data.push({'name': '_jsvalidation', 'value': element.name});\n            data.push({'name': '_jsvalidation_validate_all', 'value': isValidateAll(params)});\n\n            $.ajax( ajaxOpts(validator, element, params, data) )\n                .always(function( response, textStatus ) {\n                    var errors, message, submitted, valid;\n\n                    if (textStatus === 'error') {\n                        valid = false;\n                        response = laravelValidation.helpers.parseErrorResponse(response);\n                    } else if (textStatus === 'success') {\n                        valid = response === true || response === \"true\";\n                    } else {\n                        return;\n                    }\n\n                    validator.settings.messages[ element.name ].laravelValidationRemote = previous.originalMessage;\n\n                    if ( valid ) {\n                        submitted = validator.formSubmitted;\n                        validator.prepareElement( element );\n                        validator.formSubmitted = submitted;\n                        validator.successList.push( element );\n                        delete validator.invalid[ element.name ];\n                        validator.showErrors();\n                    } else {\n                        errors = {};\n                        message = response || validator.defaultMessage( element, \"remote\" );\n                        errors[ element.name ]\n                            = previous.message\n                            = typeof message === \"function\" ? message( value ) : message[0];\n                        validator.invalid[ element.name ] = true;\n                        validator.showErrors( errors );\n                    }\n                    validator.showErrors(validator.errorMap);\n                    previous.valid = valid;\n                    validator.stopRequest( element, valid );\n                }\n            );\n            return \"pending\";\n        }, '');\n\n        /**\n         * Create JQueryValidation check to form requests.\n         */\n        $.validator.addMethod(\"laravelValidationFormRequest\", function (value, element, params) {\n\n            var validator = this,\n                previous = validator.previousValue(element);\n\n            var data = $(validator.currentForm).serializeArray();\n            data.push({name: '__proengsoft_form_request', value: 1}); // must match FormRequest.JS_VALIDATION_FIELD\n\n            // Skip AJAX if the value remains the same as a prior request.\n            if (JSON.stringify(previous.old) === JSON.stringify(data)) {\n                if (! previous.valid) {\n                    validator.showErrors(previous.errors || {});\n                }\n\n                return previous.valid;\n            }\n\n            previous.old = data;\n            this.startRequest( element );\n\n            $.ajax(ajaxOpts(validator, element, params, data))\n                .always(function( response, textStatus ) {\n                    var errors = {},\n                        valid = textStatus === 'success' && (response === true || response === 'true');\n\n                    if (valid) {\n                        validator.resetInternals();\n                        validator.toHide = validator.errorsFor( element );\n                    } else {\n                        $.each( response, function( fieldName, errorMessages ) {\n                            var errorElement = laravelValidation.helpers.findByName(validator, fieldName)[0];\n                            if (errorElement) {\n                                errors[errorElement.name] = laravelValidation.helpers.encode(errorMessages[0] || '');\n                            }\n                        });\n\n                        // Failed to find the error fields so mark the form as valid otherwise user\n                        // will be left in limbo with no visible error messages.\n                        if ($.isEmptyObject(errors)) {\n                            valid = true;\n                        }\n                    }\n\n                    previous.valid = valid;\n                    previous.errors = errors;\n                    validator.showErrors(errors);\n                    validator.stopRequest(element, valid);\n                });\n\n            return 'pending';\n        }, '');\n    }\n};\n\n$(function() {\n    laravelValidation.init();\n});\n","/******/ (function() { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ \"./node_modules/locutus/php/array/array_diff.js\":\n/*!******************************************************!*\\\n  !*** ./node_modules/locutus/php/array/array_diff.js ***!\n  \\******************************************************/\n/***/ (function(module) {\n\n\n\nmodule.exports = function array_diff(arr1) {\n  // eslint-disable-line camelcase\n  //  discuss at: https://locutus.io/php/array_diff/\n  // original by: Kevin van Zonneveld (https://kvz.io)\n  // improved by: Sanjoy Roy\n  //  revised by: Brett Zamir (https://brett-zamir.me)\n  //   example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld'])\n  //   returns 1: {0:'Kevin'}\n\n  var retArr = {};\n  var argl = arguments.length;\n  var k1 = '';\n  var i = 1;\n  var k = '';\n  var arr = {};\n\n  arr1keys: for (k1 in arr1) {\n    // eslint-disable-line no-labels\n    for (i = 1; i < argl; i++) {\n      arr = arguments[i];\n      for (k in arr) {\n        if (arr[k] === arr1[k1]) {\n          // If it reaches here, it was found in at least one array, so try next value\n          continue arr1keys; // eslint-disable-line no-labels\n        }\n      }\n      retArr[k1] = arr1[k1];\n    }\n  }\n\n  return retArr;\n};\n//# sourceMappingURL=array_diff.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/datetime/strtotime.js\":\n/*!********************************************************!*\\\n  !*** ./node_modules/locutus/php/datetime/strtotime.js ***!\n  \\********************************************************/\n/***/ (function(module) {\n\n\n\nvar reSpace = '[ \\\\t]+';\nvar reSpaceOpt = '[ \\\\t]*';\nvar reMeridian = '(?:([ap])\\\\.?m\\\\.?([\\\\t ]|$))';\nvar reHour24 = '(2[0-4]|[01]?[0-9])';\nvar reHour24lz = '([01][0-9]|2[0-4])';\nvar reHour12 = '(0?[1-9]|1[0-2])';\nvar reMinute = '([0-5]?[0-9])';\nvar reMinutelz = '([0-5][0-9])';\nvar reSecond = '(60|[0-5]?[0-9])';\nvar reSecondlz = '(60|[0-5][0-9])';\nvar reFrac = '(?:\\\\.([0-9]+))';\n\nvar reDayfull = 'sunday|monday|tuesday|wednesday|thursday|friday|saturday';\nvar reDayabbr = 'sun|mon|tue|wed|thu|fri|sat';\nvar reDaytext = reDayfull + '|' + reDayabbr + '|weekdays?';\n\nvar reReltextnumber = 'first|second|third|fourth|fifth|sixth|seventh|eighth?|ninth|tenth|eleventh|twelfth';\nvar reReltexttext = 'next|last|previous|this';\nvar reReltextunit = '(?:second|sec|minute|min|hour|day|fortnight|forthnight|month|year)s?|weeks|' + reDaytext;\n\nvar reYear = '([0-9]{1,4})';\nvar reYear2 = '([0-9]{2})';\nvar reYear4 = '([0-9]{4})';\nvar reYear4withSign = '([+-]?[0-9]{4})';\nvar reMonth = '(1[0-2]|0?[0-9])';\nvar reMonthlz = '(0[0-9]|1[0-2])';\nvar reDay = '(?:(3[01]|[0-2]?[0-9])(?:st|nd|rd|th)?)';\nvar reDaylz = '(0[0-9]|[1-2][0-9]|3[01])';\n\nvar reMonthFull = 'january|february|march|april|may|june|july|august|september|october|november|december';\nvar reMonthAbbr = 'jan|feb|mar|apr|may|jun|jul|aug|sept?|oct|nov|dec';\nvar reMonthroman = 'i[vx]|vi{0,3}|xi{0,2}|i{1,3}';\nvar reMonthText = '(' + reMonthFull + '|' + reMonthAbbr + '|' + reMonthroman + ')';\n\nvar reTzCorrection = '((?:GMT)?([+-])' + reHour24 + ':?' + reMinute + '?)';\nvar reTzAbbr = '\\\\(?([a-zA-Z]{1,6})\\\\)?';\nvar reDayOfYear = '(00[1-9]|0[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6])';\nvar reWeekOfYear = '(0[1-9]|[1-4][0-9]|5[0-3])';\n\nvar reDateNoYear = reMonthText + '[ .\\\\t-]*' + reDay + '[,.stndrh\\\\t ]*';\n\nfunction processMeridian(hour, meridian) {\n  meridian = meridian && meridian.toLowerCase();\n\n  switch (meridian) {\n    case 'a':\n      hour += hour === 12 ? -12 : 0;\n      break;\n    case 'p':\n      hour += hour !== 12 ? 12 : 0;\n      break;\n  }\n\n  return hour;\n}\n\nfunction processYear(yearStr) {\n  var year = +yearStr;\n\n  if (yearStr.length < 4 && year < 100) {\n    year += year < 70 ? 2000 : 1900;\n  }\n\n  return year;\n}\n\nfunction lookupMonth(monthStr) {\n  return {\n    jan: 0,\n    january: 0,\n    i: 0,\n    feb: 1,\n    february: 1,\n    ii: 1,\n    mar: 2,\n    march: 2,\n    iii: 2,\n    apr: 3,\n    april: 3,\n    iv: 3,\n    may: 4,\n    v: 4,\n    jun: 5,\n    june: 5,\n    vi: 5,\n    jul: 6,\n    july: 6,\n    vii: 6,\n    aug: 7,\n    august: 7,\n    viii: 7,\n    sep: 8,\n    sept: 8,\n    september: 8,\n    ix: 8,\n    oct: 9,\n    october: 9,\n    x: 9,\n    nov: 10,\n    november: 10,\n    xi: 10,\n    dec: 11,\n    december: 11,\n    xii: 11\n  }[monthStr.toLowerCase()];\n}\n\nfunction lookupWeekday(dayStr) {\n  var desiredSundayNumber = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n  var dayNumbers = {\n    mon: 1,\n    monday: 1,\n    tue: 2,\n    tuesday: 2,\n    wed: 3,\n    wednesday: 3,\n    thu: 4,\n    thursday: 4,\n    fri: 5,\n    friday: 5,\n    sat: 6,\n    saturday: 6,\n    sun: 0,\n    sunday: 0\n  };\n\n  return dayNumbers[dayStr.toLowerCase()] || desiredSundayNumber;\n}\n\nfunction lookupRelative(relText) {\n  var relativeNumbers = {\n    last: -1,\n    previous: -1,\n    this: 0,\n    first: 1,\n    next: 1,\n    second: 2,\n    third: 3,\n    fourth: 4,\n    fifth: 5,\n    sixth: 6,\n    seventh: 7,\n    eight: 8,\n    eighth: 8,\n    ninth: 9,\n    tenth: 10,\n    eleventh: 11,\n    twelfth: 12\n  };\n\n  var relativeBehavior = {\n    this: 1\n  };\n\n  var relTextLower = relText.toLowerCase();\n\n  return {\n    amount: relativeNumbers[relTextLower],\n    behavior: relativeBehavior[relTextLower] || 0\n  };\n}\n\nfunction processTzCorrection(tzOffset, oldValue) {\n  var reTzCorrectionLoose = /(?:GMT)?([+-])(\\d+)(:?)(\\d{0,2})/i;\n  tzOffset = tzOffset && tzOffset.match(reTzCorrectionLoose);\n\n  if (!tzOffset) {\n    return oldValue;\n  }\n\n  var sign = tzOffset[1] === '-' ? -1 : 1;\n  var hours = +tzOffset[2];\n  var minutes = +tzOffset[4];\n\n  if (!tzOffset[4] && !tzOffset[3]) {\n    minutes = Math.floor(hours % 100);\n    hours = Math.floor(hours / 100);\n  }\n\n  // timezone offset in seconds\n  return sign * (hours * 60 + minutes) * 60;\n}\n\n// tz abbrevation : tz offset in seconds\nvar tzAbbrOffsets = {\n  acdt: 37800,\n  acst: 34200,\n  addt: -7200,\n  adt: -10800,\n  aedt: 39600,\n  aest: 36000,\n  ahdt: -32400,\n  ahst: -36000,\n  akdt: -28800,\n  akst: -32400,\n  amt: -13840,\n  apt: -10800,\n  ast: -14400,\n  awdt: 32400,\n  awst: 28800,\n  awt: -10800,\n  bdst: 7200,\n  bdt: -36000,\n  bmt: -14309,\n  bst: 3600,\n  cast: 34200,\n  cat: 7200,\n  cddt: -14400,\n  cdt: -18000,\n  cemt: 10800,\n  cest: 7200,\n  cet: 3600,\n  cmt: -15408,\n  cpt: -18000,\n  cst: -21600,\n  cwt: -18000,\n  chst: 36000,\n  dmt: -1521,\n  eat: 10800,\n  eddt: -10800,\n  edt: -14400,\n  eest: 10800,\n  eet: 7200,\n  emt: -26248,\n  ept: -14400,\n  est: -18000,\n  ewt: -14400,\n  ffmt: -14660,\n  fmt: -4056,\n  gdt: 39600,\n  gmt: 0,\n  gst: 36000,\n  hdt: -34200,\n  hkst: 32400,\n  hkt: 28800,\n  hmt: -19776,\n  hpt: -34200,\n  hst: -36000,\n  hwt: -34200,\n  iddt: 14400,\n  idt: 10800,\n  imt: 25025,\n  ist: 7200,\n  jdt: 36000,\n  jmt: 8440,\n  jst: 32400,\n  kdt: 36000,\n  kmt: 5736,\n  kst: 30600,\n  lst: 9394,\n  mddt: -18000,\n  mdst: 16279,\n  mdt: -21600,\n  mest: 7200,\n  met: 3600,\n  mmt: 9017,\n  mpt: -21600,\n  msd: 14400,\n  msk: 10800,\n  mst: -25200,\n  mwt: -21600,\n  nddt: -5400,\n  ndt: -9052,\n  npt: -9000,\n  nst: -12600,\n  nwt: -9000,\n  nzdt: 46800,\n  nzmt: 41400,\n  nzst: 43200,\n  pddt: -21600,\n  pdt: -25200,\n  pkst: 21600,\n  pkt: 18000,\n  plmt: 25590,\n  pmt: -13236,\n  ppmt: -17340,\n  ppt: -25200,\n  pst: -28800,\n  pwt: -25200,\n  qmt: -18840,\n  rmt: 5794,\n  sast: 7200,\n  sdmt: -16800,\n  sjmt: -20173,\n  smt: -13884,\n  sst: -39600,\n  tbmt: 10751,\n  tmt: 12344,\n  uct: 0,\n  utc: 0,\n  wast: 7200,\n  wat: 3600,\n  wemt: 7200,\n  west: 3600,\n  wet: 0,\n  wib: 25200,\n  wita: 28800,\n  wit: 32400,\n  wmt: 5040,\n  yddt: -25200,\n  ydt: -28800,\n  ypt: -28800,\n  yst: -32400,\n  ywt: -28800,\n  a: 3600,\n  b: 7200,\n  c: 10800,\n  d: 14400,\n  e: 18000,\n  f: 21600,\n  g: 25200,\n  h: 28800,\n  i: 32400,\n  k: 36000,\n  l: 39600,\n  m: 43200,\n  n: -3600,\n  o: -7200,\n  p: -10800,\n  q: -14400,\n  r: -18000,\n  s: -21600,\n  t: -25200,\n  u: -28800,\n  v: -32400,\n  w: -36000,\n  x: -39600,\n  y: -43200,\n  z: 0\n};\n\nvar formats = {\n  yesterday: {\n    regex: /^yesterday/i,\n    name: 'yesterday',\n    callback: function callback() {\n      this.rd -= 1;\n      return this.resetTime();\n    }\n  },\n\n  now: {\n    regex: /^now/i,\n    name: 'now'\n    // do nothing\n  },\n\n  noon: {\n    regex: /^noon/i,\n    name: 'noon',\n    callback: function callback() {\n      return this.resetTime() && this.time(12, 0, 0, 0);\n    }\n  },\n\n  midnightOrToday: {\n    regex: /^(midnight|today)/i,\n    name: 'midnight | today',\n    callback: function callback() {\n      return this.resetTime();\n    }\n  },\n\n  tomorrow: {\n    regex: /^tomorrow/i,\n    name: 'tomorrow',\n    callback: function callback() {\n      this.rd += 1;\n      return this.resetTime();\n    }\n  },\n\n  timestamp: {\n    regex: /^@(-?\\d+)/i,\n    name: 'timestamp',\n    callback: function callback(match, timestamp) {\n      this.rs += +timestamp;\n      this.y = 1970;\n      this.m = 0;\n      this.d = 1;\n      this.dates = 0;\n\n      return this.resetTime() && this.zone(0);\n    }\n  },\n\n  firstOrLastDay: {\n    regex: /^(first|last) day of/i,\n    name: 'firstdayof | lastdayof',\n    callback: function callback(match, day) {\n      if (day.toLowerCase() === 'first') {\n        this.firstOrLastDayOfMonth = 1;\n      } else {\n        this.firstOrLastDayOfMonth = -1;\n      }\n    }\n  },\n\n  backOrFrontOf: {\n    regex: RegExp('^(back|front) of ' + reHour24 + reSpaceOpt + reMeridian + '?', 'i'),\n    name: 'backof | frontof',\n    callback: function callback(match, side, hours, meridian) {\n      var back = side.toLowerCase() === 'back';\n      var hour = +hours;\n      var minute = 15;\n\n      if (!back) {\n        hour -= 1;\n        minute = 45;\n      }\n\n      hour = processMeridian(hour, meridian);\n\n      return this.resetTime() && this.time(hour, minute, 0, 0);\n    }\n  },\n\n  weekdayOf: {\n    regex: RegExp('^(' + reReltextnumber + '|' + reReltexttext + ')' + reSpace + '(' + reDayfull + '|' + reDayabbr + ')' + reSpace + 'of', 'i'),\n    name: 'weekdayof'\n    // todo\n  },\n\n  mssqltime: {\n    regex: RegExp('^' + reHour12 + ':' + reMinutelz + ':' + reSecondlz + '[:.]([0-9]+)' + reMeridian, 'i'),\n    name: 'mssqltime',\n    callback: function callback(match, hour, minute, second, frac, meridian) {\n      return this.time(processMeridian(+hour, meridian), +minute, +second, +frac.substr(0, 3));\n    }\n  },\n\n  timeLong12: {\n    regex: RegExp('^' + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),\n    name: 'timelong12',\n    callback: function callback(match, hour, minute, second, meridian) {\n      return this.time(processMeridian(+hour, meridian), +minute, +second, 0);\n    }\n  },\n\n  timeShort12: {\n    regex: RegExp('^' + reHour12 + '[:.]' + reMinutelz + reSpaceOpt + reMeridian, 'i'),\n    name: 'timeshort12',\n    callback: function callback(match, hour, minute, meridian) {\n      return this.time(processMeridian(+hour, meridian), +minute, 0, 0);\n    }\n  },\n\n  timeTiny12: {\n    regex: RegExp('^' + reHour12 + reSpaceOpt + reMeridian, 'i'),\n    name: 'timetiny12',\n    callback: function callback(match, hour, meridian) {\n      return this.time(processMeridian(+hour, meridian), 0, 0, 0);\n    }\n  },\n\n  soap: {\n    regex: RegExp('^' + reYear4 + '-' + reMonthlz + '-' + reDaylz + 'T' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz + reFrac + reTzCorrection + '?', 'i'),\n    name: 'soap',\n    callback: function callback(match, year, month, day, hour, minute, second, frac, tzCorrection) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, +frac.substr(0, 3)) && this.zone(processTzCorrection(tzCorrection));\n    }\n  },\n\n  wddx: {\n    regex: RegExp('^' + reYear4 + '-' + reMonth + '-' + reDay + 'T' + reHour24 + ':' + reMinute + ':' + reSecond),\n    name: 'wddx',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  exif: {\n    regex: RegExp('^' + reYear4 + ':' + reMonthlz + ':' + reDaylz + ' ' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz, 'i'),\n    name: 'exif',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  xmlRpc: {\n    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz + 'T' + reHour24 + ':' + reMinutelz + ':' + reSecondlz),\n    name: 'xmlrpc',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  xmlRpcNoColon: {\n    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz + '[Tt]' + reHour24 + reMinutelz + reSecondlz),\n    name: 'xmlrpcnocolon',\n    callback: function callback(match, year, month, day, hour, minute, second) {\n      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  clf: {\n    regex: RegExp('^' + reDay + '/(' + reMonthAbbr + ')/' + reYear4 + ':' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz + reSpace + reTzCorrection, 'i'),\n    name: 'clf',\n    callback: function callback(match, day, month, year, hour, minute, second, tzCorrection) {\n      return this.ymd(+year, lookupMonth(month), +day) && this.time(+hour, +minute, +second, 0) && this.zone(processTzCorrection(tzCorrection));\n    }\n  },\n\n  iso8601long: {\n    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond + reFrac, 'i'),\n    name: 'iso8601long',\n    callback: function callback(match, hour, minute, second, frac) {\n      return this.time(+hour, +minute, +second, +frac.substr(0, 3));\n    }\n  },\n\n  dateTextual: {\n    regex: RegExp('^' + reMonthText + '[ .\\\\t-]*' + reDay + '[,.stndrh\\\\t ]+' + reYear, 'i'),\n    name: 'datetextual',\n    callback: function callback(match, month, day, year) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  pointedDate4: {\n    regex: RegExp('^' + reDay + '[.\\\\t-]' + reMonth + '[.-]' + reYear4),\n    name: 'pointeddate4',\n    callback: function callback(match, day, month, year) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  pointedDate2: {\n    regex: RegExp('^' + reDay + '[.\\\\t]' + reMonth + '\\\\.' + reYear2),\n    name: 'pointeddate2',\n    callback: function callback(match, day, month, year) {\n      return this.ymd(processYear(year), month - 1, +day);\n    }\n  },\n\n  timeLong24: {\n    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond),\n    name: 'timelong24',\n    callback: function callback(match, hour, minute, second) {\n      return this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  dateNoColon: {\n    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz),\n    name: 'datenocolon',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  pgydotd: {\n    regex: RegExp('^' + reYear4 + '\\\\.?' + reDayOfYear),\n    name: 'pgydotd',\n    callback: function callback(match, year, day) {\n      return this.ymd(+year, 0, +day);\n    }\n  },\n\n  timeShort24: {\n    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute, 'i'),\n    name: 'timeshort24',\n    callback: function callback(match, hour, minute) {\n      return this.time(+hour, +minute, 0, 0);\n    }\n  },\n\n  iso8601noColon: {\n    regex: RegExp('^t?' + reHour24lz + reMinutelz + reSecondlz, 'i'),\n    name: 'iso8601nocolon',\n    callback: function callback(match, hour, minute, second) {\n      return this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  iso8601dateSlash: {\n    // eventhough the trailing slash is optional in PHP\n    // here it's mandatory and inputs without the slash\n    // are handled by dateslash\n    regex: RegExp('^' + reYear4 + '/' + reMonthlz + '/' + reDaylz + '/'),\n    name: 'iso8601dateslash',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  dateSlash: {\n    regex: RegExp('^' + reYear4 + '/' + reMonth + '/' + reDay),\n    name: 'dateslash',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  american: {\n    regex: RegExp('^' + reMonth + '/' + reDay + '/' + reYear),\n    name: 'american',\n    callback: function callback(match, month, day, year) {\n      return this.ymd(processYear(year), month - 1, +day);\n    }\n  },\n\n  americanShort: {\n    regex: RegExp('^' + reMonth + '/' + reDay),\n    name: 'americanshort',\n    callback: function callback(match, month, day) {\n      return this.ymd(this.y, month - 1, +day);\n    }\n  },\n\n  gnuDateShortOrIso8601date2: {\n    // iso8601date2 is complete subset of gnudateshort\n    regex: RegExp('^' + reYear + '-' + reMonth + '-' + reDay),\n    name: 'gnudateshort | iso8601date2',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(processYear(year), month - 1, +day);\n    }\n  },\n\n  iso8601date4: {\n    regex: RegExp('^' + reYear4withSign + '-' + reMonthlz + '-' + reDaylz),\n    name: 'iso8601date4',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(+year, month - 1, +day);\n    }\n  },\n\n  gnuNoColon: {\n    regex: RegExp('^t?' + reHour24lz + reMinutelz, 'i'),\n    name: 'gnunocolon',\n    callback: function callback(match, hour, minute) {\n      // this rule is a special case\n      // if time was already set once by any preceding rule, it sets the captured value as year\n      switch (this.times) {\n        case 0:\n          return this.time(+hour, +minute, 0, this.f);\n        case 1:\n          this.y = hour * 100 + +minute;\n          this.times++;\n\n          return true;\n        default:\n          return false;\n      }\n    }\n  },\n\n  gnuDateShorter: {\n    regex: RegExp('^' + reYear4 + '-' + reMonth),\n    name: 'gnudateshorter',\n    callback: function callback(match, year, month) {\n      return this.ymd(+year, month - 1, 1);\n    }\n  },\n\n  pgTextReverse: {\n    // note: allowed years are from 32-9999\n    // years below 32 should be treated as days in datefull\n    regex: RegExp('^' + '(\\\\d{3,4}|[4-9]\\\\d|3[2-9])-(' + reMonthAbbr + ')-' + reDaylz, 'i'),\n    name: 'pgtextreverse',\n    callback: function callback(match, year, month, day) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  dateFull: {\n    regex: RegExp('^' + reDay + '[ \\\\t.-]*' + reMonthText + '[ \\\\t.-]*' + reYear, 'i'),\n    name: 'datefull',\n    callback: function callback(match, day, month, year) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  dateNoDay: {\n    regex: RegExp('^' + reMonthText + '[ .\\\\t-]*' + reYear4, 'i'),\n    name: 'datenoday',\n    callback: function callback(match, month, year) {\n      return this.ymd(+year, lookupMonth(month), 1);\n    }\n  },\n\n  dateNoDayRev: {\n    regex: RegExp('^' + reYear4 + '[ .\\\\t-]*' + reMonthText, 'i'),\n    name: 'datenodayrev',\n    callback: function callback(match, year, month) {\n      return this.ymd(+year, lookupMonth(month), 1);\n    }\n  },\n\n  pgTextShort: {\n    regex: RegExp('^(' + reMonthAbbr + ')-' + reDaylz + '-' + reYear, 'i'),\n    name: 'pgtextshort',\n    callback: function callback(match, month, day, year) {\n      return this.ymd(processYear(year), lookupMonth(month), +day);\n    }\n  },\n\n  dateNoYear: {\n    regex: RegExp('^' + reDateNoYear, 'i'),\n    name: 'datenoyear',\n    callback: function callback(match, month, day) {\n      return this.ymd(this.y, lookupMonth(month), +day);\n    }\n  },\n\n  dateNoYearRev: {\n    regex: RegExp('^' + reDay + '[ .\\\\t-]*' + reMonthText, 'i'),\n    name: 'datenoyearrev',\n    callback: function callback(match, day, month) {\n      return this.ymd(this.y, lookupMonth(month), +day);\n    }\n  },\n\n  isoWeekDay: {\n    regex: RegExp('^' + reYear4 + '-?W' + reWeekOfYear + '(?:-?([0-7]))?'),\n    name: 'isoweekday | isoweek',\n    callback: function callback(match, year, week, day) {\n      day = day ? +day : 1;\n\n      if (!this.ymd(+year, 0, 1)) {\n        return false;\n      }\n\n      // get day of week for Jan 1st\n      var dayOfWeek = new Date(this.y, this.m, this.d).getDay();\n\n      // and use the day to figure out the offset for day 1 of week 1\n      dayOfWeek = 0 - (dayOfWeek > 4 ? dayOfWeek - 7 : dayOfWeek);\n\n      this.rd += dayOfWeek + (week - 1) * 7 + day;\n    }\n  },\n\n  relativeText: {\n    regex: RegExp('^(' + reReltextnumber + '|' + reReltexttext + ')' + reSpace + '(' + reReltextunit + ')', 'i'),\n    name: 'relativetext',\n    callback: function callback(match, relValue, relUnit) {\n      // todo: implement handling of 'this time-unit'\n      // eslint-disable-next-line no-unused-vars\n      var _lookupRelative = lookupRelative(relValue),\n          amount = _lookupRelative.amount,\n          behavior = _lookupRelative.behavior;\n\n      switch (relUnit.toLowerCase()) {\n        case 'sec':\n        case 'secs':\n        case 'second':\n        case 'seconds':\n          this.rs += amount;\n          break;\n        case 'min':\n        case 'mins':\n        case 'minute':\n        case 'minutes':\n          this.ri += amount;\n          break;\n        case 'hour':\n        case 'hours':\n          this.rh += amount;\n          break;\n        case 'day':\n        case 'days':\n          this.rd += amount;\n          break;\n        case 'fortnight':\n        case 'fortnights':\n        case 'forthnight':\n        case 'forthnights':\n          this.rd += amount * 14;\n          break;\n        case 'week':\n        case 'weeks':\n          this.rd += amount * 7;\n          break;\n        case 'month':\n        case 'months':\n          this.rm += amount;\n          break;\n        case 'year':\n        case 'years':\n          this.ry += amount;\n          break;\n        case 'mon':case 'monday':\n        case 'tue':case 'tuesday':\n        case 'wed':case 'wednesday':\n        case 'thu':case 'thursday':\n        case 'fri':case 'friday':\n        case 'sat':case 'saturday':\n        case 'sun':case 'sunday':\n          this.resetTime();\n          this.weekday = lookupWeekday(relUnit, 7);\n          this.weekdayBehavior = 1;\n          this.rd += (amount > 0 ? amount - 1 : amount) * 7;\n          break;\n        case 'weekday':\n        case 'weekdays':\n          // todo\n          break;\n      }\n    }\n  },\n\n  relative: {\n    regex: RegExp('^([+-]*)[ \\\\t]*(\\\\d+)' + reSpaceOpt + '(' + reReltextunit + '|week)', 'i'),\n    name: 'relative',\n    callback: function callback(match, signs, relValue, relUnit) {\n      var minuses = signs.replace(/[^-]/g, '').length;\n\n      var amount = +relValue * Math.pow(-1, minuses);\n\n      switch (relUnit.toLowerCase()) {\n        case 'sec':\n        case 'secs':\n        case 'second':\n        case 'seconds':\n          this.rs += amount;\n          break;\n        case 'min':\n        case 'mins':\n        case 'minute':\n        case 'minutes':\n          this.ri += amount;\n          break;\n        case 'hour':\n        case 'hours':\n          this.rh += amount;\n          break;\n        case 'day':\n        case 'days':\n          this.rd += amount;\n          break;\n        case 'fortnight':\n        case 'fortnights':\n        case 'forthnight':\n        case 'forthnights':\n          this.rd += amount * 14;\n          break;\n        case 'week':\n        case 'weeks':\n          this.rd += amount * 7;\n          break;\n        case 'month':\n        case 'months':\n          this.rm += amount;\n          break;\n        case 'year':\n        case 'years':\n          this.ry += amount;\n          break;\n        case 'mon':case 'monday':\n        case 'tue':case 'tuesday':\n        case 'wed':case 'wednesday':\n        case 'thu':case 'thursday':\n        case 'fri':case 'friday':\n        case 'sat':case 'saturday':\n        case 'sun':case 'sunday':\n          this.resetTime();\n          this.weekday = lookupWeekday(relUnit, 7);\n          this.weekdayBehavior = 1;\n          this.rd += (amount > 0 ? amount - 1 : amount) * 7;\n          break;\n        case 'weekday':\n        case 'weekdays':\n          // todo\n          break;\n      }\n    }\n  },\n\n  dayText: {\n    regex: RegExp('^(' + reDaytext + ')', 'i'),\n    name: 'daytext',\n    callback: function callback(match, dayText) {\n      this.resetTime();\n      this.weekday = lookupWeekday(dayText, 0);\n\n      if (this.weekdayBehavior !== 2) {\n        this.weekdayBehavior = 1;\n      }\n    }\n  },\n\n  relativeTextWeek: {\n    regex: RegExp('^(' + reReltexttext + ')' + reSpace + 'week', 'i'),\n    name: 'relativetextweek',\n    callback: function callback(match, relText) {\n      this.weekdayBehavior = 2;\n\n      switch (relText.toLowerCase()) {\n        case 'this':\n          this.rd += 0;\n          break;\n        case 'next':\n          this.rd += 7;\n          break;\n        case 'last':\n        case 'previous':\n          this.rd -= 7;\n          break;\n      }\n\n      if (isNaN(this.weekday)) {\n        this.weekday = 1;\n      }\n    }\n  },\n\n  monthFullOrMonthAbbr: {\n    regex: RegExp('^(' + reMonthFull + '|' + reMonthAbbr + ')', 'i'),\n    name: 'monthfull | monthabbr',\n    callback: function callback(match, month) {\n      return this.ymd(this.y, lookupMonth(month), this.d);\n    }\n  },\n\n  tzCorrection: {\n    regex: RegExp('^' + reTzCorrection, 'i'),\n    name: 'tzcorrection',\n    callback: function callback(tzCorrection) {\n      return this.zone(processTzCorrection(tzCorrection));\n    }\n  },\n\n  tzAbbr: {\n    regex: RegExp('^' + reTzAbbr),\n    name: 'tzabbr',\n    callback: function callback(match, abbr) {\n      var offset = tzAbbrOffsets[abbr.toLowerCase()];\n\n      if (isNaN(offset)) {\n        return false;\n      }\n\n      return this.zone(offset);\n    }\n  },\n\n  ago: {\n    regex: /^ago/i,\n    name: 'ago',\n    callback: function callback() {\n      this.ry = -this.ry;\n      this.rm = -this.rm;\n      this.rd = -this.rd;\n      this.rh = -this.rh;\n      this.ri = -this.ri;\n      this.rs = -this.rs;\n      this.rf = -this.rf;\n    }\n  },\n\n  year4: {\n    regex: RegExp('^' + reYear4),\n    name: 'year4',\n    callback: function callback(match, year) {\n      this.y = +year;\n      return true;\n    }\n  },\n\n  whitespace: {\n    regex: /^[ .,\\t]+/,\n    name: 'whitespace'\n    // do nothing\n  },\n\n  dateShortWithTimeLong: {\n    regex: RegExp('^' + reDateNoYear + 't?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond, 'i'),\n    name: 'dateshortwithtimelong',\n    callback: function callback(match, month, day, hour, minute, second) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(+hour, +minute, +second, 0);\n    }\n  },\n\n  dateShortWithTimeLong12: {\n    regex: RegExp('^' + reDateNoYear + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),\n    name: 'dateshortwithtimelong12',\n    callback: function callback(match, month, day, hour, minute, second, meridian) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(processMeridian(+hour, meridian), +minute, +second, 0);\n    }\n  },\n\n  dateShortWithTimeShort: {\n    regex: RegExp('^' + reDateNoYear + 't?' + reHour24 + '[:.]' + reMinute, 'i'),\n    name: 'dateshortwithtimeshort',\n    callback: function callback(match, month, day, hour, minute) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(+hour, +minute, 0, 0);\n    }\n  },\n\n  dateShortWithTimeShort12: {\n    regex: RegExp('^' + reDateNoYear + reHour12 + '[:.]' + reMinutelz + reSpaceOpt + reMeridian, 'i'),\n    name: 'dateshortwithtimeshort12',\n    callback: function callback(match, month, day, hour, minute, meridian) {\n      return this.ymd(this.y, lookupMonth(month), +day) && this.time(processMeridian(+hour, meridian), +minute, 0, 0);\n    }\n  }\n};\n\nvar resultProto = {\n  // date\n  y: NaN,\n  m: NaN,\n  d: NaN,\n  // time\n  h: NaN,\n  i: NaN,\n  s: NaN,\n  f: NaN,\n\n  // relative shifts\n  ry: 0,\n  rm: 0,\n  rd: 0,\n  rh: 0,\n  ri: 0,\n  rs: 0,\n  rf: 0,\n\n  // weekday related shifts\n  weekday: NaN,\n  weekdayBehavior: 0,\n\n  // first or last day of month\n  // 0 none, 1 first, -1 last\n  firstOrLastDayOfMonth: 0,\n\n  // timezone correction in minutes\n  z: NaN,\n\n  // counters\n  dates: 0,\n  times: 0,\n  zones: 0,\n\n  // helper functions\n  ymd: function ymd(y, m, d) {\n    if (this.dates > 0) {\n      return false;\n    }\n\n    this.dates++;\n    this.y = y;\n    this.m = m;\n    this.d = d;\n    return true;\n  },\n  time: function time(h, i, s, f) {\n    if (this.times > 0) {\n      return false;\n    }\n\n    this.times++;\n    this.h = h;\n    this.i = i;\n    this.s = s;\n    this.f = f;\n\n    return true;\n  },\n  resetTime: function resetTime() {\n    this.h = 0;\n    this.i = 0;\n    this.s = 0;\n    this.f = 0;\n    this.times = 0;\n\n    return true;\n  },\n  zone: function zone(minutes) {\n    if (this.zones <= 1) {\n      this.zones++;\n      this.z = minutes;\n      return true;\n    }\n\n    return false;\n  },\n  toDate: function toDate(relativeTo) {\n    if (this.dates && !this.times) {\n      this.h = this.i = this.s = this.f = 0;\n    }\n\n    // fill holes\n    if (isNaN(this.y)) {\n      this.y = relativeTo.getFullYear();\n    }\n\n    if (isNaN(this.m)) {\n      this.m = relativeTo.getMonth();\n    }\n\n    if (isNaN(this.d)) {\n      this.d = relativeTo.getDate();\n    }\n\n    if (isNaN(this.h)) {\n      this.h = relativeTo.getHours();\n    }\n\n    if (isNaN(this.i)) {\n      this.i = relativeTo.getMinutes();\n    }\n\n    if (isNaN(this.s)) {\n      this.s = relativeTo.getSeconds();\n    }\n\n    if (isNaN(this.f)) {\n      this.f = relativeTo.getMilliseconds();\n    }\n\n    // adjust special early\n    switch (this.firstOrLastDayOfMonth) {\n      case 1:\n        this.d = 1;\n        break;\n      case -1:\n        this.d = 0;\n        this.m += 1;\n        break;\n    }\n\n    if (!isNaN(this.weekday)) {\n      var date = new Date(relativeTo.getTime());\n      date.setFullYear(this.y, this.m, this.d);\n      date.setHours(this.h, this.i, this.s, this.f);\n\n      var dow = date.getDay();\n\n      if (this.weekdayBehavior === 2) {\n        // To make \"this week\" work, where the current day of week is a \"sunday\"\n        if (dow === 0 && this.weekday !== 0) {\n          this.weekday = -6;\n        }\n\n        // To make \"sunday this week\" work, where the current day of week is not a \"sunday\"\n        if (this.weekday === 0 && dow !== 0) {\n          this.weekday = 7;\n        }\n\n        this.d -= dow;\n        this.d += this.weekday;\n      } else {\n        var diff = this.weekday - dow;\n\n        // some PHP magic\n        if (this.rd < 0 && diff < 0 || this.rd >= 0 && diff <= -this.weekdayBehavior) {\n          diff += 7;\n        }\n\n        if (this.weekday >= 0) {\n          this.d += diff;\n        } else {\n          this.d -= 7 - (Math.abs(this.weekday) - dow);\n        }\n\n        this.weekday = NaN;\n      }\n    }\n\n    // adjust relative\n    this.y += this.ry;\n    this.m += this.rm;\n    this.d += this.rd;\n\n    this.h += this.rh;\n    this.i += this.ri;\n    this.s += this.rs;\n    this.f += this.rf;\n\n    this.ry = this.rm = this.rd = 0;\n    this.rh = this.ri = this.rs = this.rf = 0;\n\n    var result = new Date(relativeTo.getTime());\n    // since Date constructor treats years <= 99 as 1900+\n    // it can't be used, thus this weird way\n    result.setFullYear(this.y, this.m, this.d);\n    result.setHours(this.h, this.i, this.s, this.f);\n\n    // note: this is done twice in PHP\n    // early when processing special relatives\n    // and late\n    // todo: check if the logic can be reduced\n    // to just one time action\n    switch (this.firstOrLastDayOfMonth) {\n      case 1:\n        result.setDate(1);\n        break;\n      case -1:\n        result.setMonth(result.getMonth() + 1, 0);\n        break;\n    }\n\n    // adjust timezone\n    if (!isNaN(this.z) && result.getTimezoneOffset() !== this.z) {\n      result.setUTCFullYear(result.getFullYear(), result.getMonth(), result.getDate());\n\n      result.setUTCHours(result.getHours(), result.getMinutes(), result.getSeconds() - this.z, result.getMilliseconds());\n    }\n\n    return result;\n  }\n};\n\nmodule.exports = function strtotime(str, now) {\n  //       discuss at: https://locutus.io/php/strtotime/\n  //      original by: Caio Ariede (https://caioariede.com)\n  //      improved by: Kevin van Zonneveld (https://kvz.io)\n  //      improved by: Caio Ariede (https://caioariede.com)\n  //      improved by: A. Matías Quezada (https://amatiasq.com)\n  //      improved by: preuter\n  //      improved by: Brett Zamir (https://brett-zamir.me)\n  //      improved by: Mirko Faber\n  //         input by: David\n  //      bugfixed by: Wagner B. Soares\n  //      bugfixed by: Artur Tchernychev\n  //      bugfixed by: Stephan Bösch-Plepelits (https://github.com/plepe)\n  // reimplemented by: Rafał Kukawski\n  //           note 1: Examples all have a fixed timestamp to prevent\n  //           note 1: tests to fail because of variable time(zones)\n  //        example 1: strtotime('+1 day', 1129633200)\n  //        returns 1: 1129719600\n  //        example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200)\n  //        returns 2: 1130425202\n  //        example 3: strtotime('last month', 1129633200)\n  //        returns 3: 1127041200\n  //        example 4: strtotime('2009-05-04 08:30:00+00')\n  //        returns 4: 1241425800\n  //        example 5: strtotime('2009-05-04 08:30:00+02:00')\n  //        returns 5: 1241418600\n  //        example 6: strtotime('2009-05-04 08:30:00 YWT')\n  //        returns 6: 1241454600\n\n  if (now == null) {\n    now = Math.floor(Date.now() / 1000);\n  }\n\n  // the rule order is important\n  // if multiple rules match, the longest match wins\n  // if multiple rules match the same string, the first match wins\n  var rules = [formats.yesterday, formats.now, formats.noon, formats.midnightOrToday, formats.tomorrow, formats.timestamp, formats.firstOrLastDay, formats.backOrFrontOf,\n  // formats.weekdayOf, // not yet implemented\n  formats.timeTiny12, formats.timeShort12, formats.timeLong12, formats.mssqltime, formats.timeShort24, formats.timeLong24, formats.iso8601long, formats.gnuNoColon, formats.iso8601noColon, formats.americanShort, formats.american, formats.iso8601date4, formats.iso8601dateSlash, formats.dateSlash, formats.gnuDateShortOrIso8601date2, formats.gnuDateShorter, formats.dateFull, formats.pointedDate4, formats.pointedDate2, formats.dateNoDay, formats.dateNoDayRev, formats.dateTextual, formats.dateNoYear, formats.dateNoYearRev, formats.dateNoColon, formats.xmlRpc, formats.xmlRpcNoColon, formats.soap, formats.wddx, formats.exif, formats.pgydotd, formats.isoWeekDay, formats.pgTextShort, formats.pgTextReverse, formats.clf, formats.year4, formats.ago, formats.dayText, formats.relativeTextWeek, formats.relativeText, formats.monthFullOrMonthAbbr, formats.tzCorrection, formats.tzAbbr, formats.dateShortWithTimeShort12, formats.dateShortWithTimeLong12, formats.dateShortWithTimeShort, formats.dateShortWithTimeLong, formats.relative, formats.whitespace];\n\n  var result = Object.create(resultProto);\n\n  while (str.length) {\n    var longestMatch = null;\n    var finalRule = null;\n\n    for (var i = 0, l = rules.length; i < l; i++) {\n      var format = rules[i];\n\n      var match = str.match(format.regex);\n\n      if (match) {\n        if (!longestMatch || match[0].length > longestMatch[0].length) {\n          longestMatch = match;\n          finalRule = format;\n        }\n      }\n    }\n\n    if (!finalRule || finalRule.callback && finalRule.callback.apply(result, longestMatch) === false) {\n      return false;\n    }\n\n    str = str.substr(longestMatch[0].length);\n    finalRule = null;\n    longestMatch = null;\n  }\n\n  return Math.floor(result.toDate(new Date(now * 1000)) / 1000);\n};\n//# sourceMappingURL=strtotime.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/info/ini_get.js\":\n/*!**************************************************!*\\\n  !*** ./node_modules/locutus/php/info/ini_get.js ***!\n  \\**************************************************/\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\n\nmodule.exports = function ini_get(varname) {\n  // eslint-disable-line camelcase\n  //  discuss at: https://locutus.io/php/ini_get/\n  // original by: Brett Zamir (https://brett-zamir.me)\n  //      note 1: The ini values must be set by ini_set or manually within an ini file\n  //   example 1: ini_set('date.timezone', 'Asia/Hong_Kong')\n  //   example 1: ini_get('date.timezone')\n  //   returns 1: 'Asia/Hong_Kong'\n\n  var $global = typeof window !== 'undefined' ? window : __webpack_require__.g;\n  $global.$locutus = $global.$locutus || {};\n  var $locutus = $global.$locutus;\n  $locutus.php = $locutus.php || {};\n  $locutus.php.ini = $locutus.php.ini || {};\n\n  if ($locutus.php.ini[varname] && $locutus.php.ini[varname].local_value !== undefined) {\n    if ($locutus.php.ini[varname].local_value === null) {\n      return '';\n    }\n    return $locutus.php.ini[varname].local_value;\n  }\n\n  return '';\n};\n//# sourceMappingURL=ini_get.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/strings/strlen.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/locutus/php/strings/strlen.js ***!\n  \\****************************************************/\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\n\nmodule.exports = function strlen(string) {\n  //  discuss at: https://locutus.io/php/strlen/\n  // original by: Kevin van Zonneveld (https://kvz.io)\n  // improved by: Sakimori\n  // improved by: Kevin van Zonneveld (https://kvz.io)\n  //    input by: Kirk Strobeck\n  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)\n  //  revised by: Brett Zamir (https://brett-zamir.me)\n  //      note 1: May look like overkill, but in order to be truly faithful to handling all Unicode\n  //      note 1: characters and to this function in PHP which does not count the number of bytes\n  //      note 1: but counts the number of characters, something like this is really necessary.\n  //   example 1: strlen('Kevin van Zonneveld')\n  //   returns 1: 19\n  //   example 2: ini_set('unicode.semantics', 'on')\n  //   example 2: strlen('A\\ud87e\\udc04Z')\n  //   returns 2: 3\n\n  var str = string + '';\n\n  var iniVal = ( true ? __webpack_require__(/*! ../info/ini_get */ \"./node_modules/locutus/php/info/ini_get.js\")('unicode.semantics') : 0) || 'off';\n  if (iniVal === 'off') {\n    return str.length;\n  }\n\n  var i = 0;\n  var lgth = 0;\n\n  var getWholeChar = function getWholeChar(str, i) {\n    var code = str.charCodeAt(i);\n    var next = '';\n    var prev = '';\n    if (code >= 0xD800 && code <= 0xDBFF) {\n      // High surrogate (could change last hex to 0xDB7F to\n      // treat high private surrogates as single characters)\n      if (str.length <= i + 1) {\n        throw new Error('High surrogate without following low surrogate');\n      }\n      next = str.charCodeAt(i + 1);\n      if (next < 0xDC00 || next > 0xDFFF) {\n        throw new Error('High surrogate without following low surrogate');\n      }\n      return str.charAt(i) + str.charAt(i + 1);\n    } else if (code >= 0xDC00 && code <= 0xDFFF) {\n      // Low surrogate\n      if (i === 0) {\n        throw new Error('Low surrogate without preceding high surrogate');\n      }\n      prev = str.charCodeAt(i - 1);\n      if (prev < 0xD800 || prev > 0xDBFF) {\n        // (could change last hex to 0xDB7F to treat high private surrogates\n        // as single characters)\n        throw new Error('Low surrogate without preceding high surrogate');\n      }\n      // We can pass over low surrogates now as the second\n      // component in a pair which we have already processed\n      return false;\n    }\n    return str.charAt(i);\n  };\n\n  for (i = 0, lgth = 0; i < str.length; i++) {\n    if (getWholeChar(str, i) === false) {\n      continue;\n    }\n    // Adapt this line at the top of any loop, passing in the whole string and\n    // the current iteration and returning a variable to represent the individual character;\n    // purpose is to treat the first part of a surrogate pair as the whole character and then\n    // ignore the second part\n    lgth++;\n  }\n\n  return lgth;\n};\n//# sourceMappingURL=strlen.js.map\n\n/***/ }),\n\n/***/ \"./node_modules/locutus/php/var/is_numeric.js\":\n/*!****************************************************!*\\\n  !*** ./node_modules/locutus/php/var/is_numeric.js ***!\n  \\****************************************************/\n/***/ (function(module) {\n\n\n\nmodule.exports = function is_numeric(mixedVar) {\n  // eslint-disable-line camelcase\n  //  discuss at: https://locutus.io/php/is_numeric/\n  // original by: Kevin van Zonneveld (https://kvz.io)\n  // improved by: David\n  // improved by: taith\n  // bugfixed by: Tim de Koning\n  // bugfixed by: WebDevHobo (https://webdevhobo.blogspot.com/)\n  // bugfixed by: Brett Zamir (https://brett-zamir.me)\n  // bugfixed by: Denis Chenu (https://shnoulle.net)\n  //   example 1: is_numeric(186.31)\n  //   returns 1: true\n  //   example 2: is_numeric('Kevin van Zonneveld')\n  //   returns 2: false\n  //   example 3: is_numeric(' +186.31e2')\n  //   returns 3: true\n  //   example 4: is_numeric('')\n  //   returns 4: false\n  //   example 5: is_numeric([])\n  //   returns 5: false\n  //   example 6: is_numeric('1 ')\n  //   returns 6: false\n\n  var whitespace = [' ', '\\n', '\\r', '\\t', '\\f', '\\x0b', '\\xa0', '\\u2000', '\\u2001', '\\u2002', '\\u2003', '\\u2004', '\\u2005', '\\u2006', '\\u2007', '\\u2008', '\\u2009', '\\u200A', '\\u200B', '\\u2028', '\\u2029', '\\u3000'].join('');\n\n  // @todo: Break this up using many single conditions with early returns\n  return (typeof mixedVar === 'number' || typeof mixedVar === 'string' && whitespace.indexOf(mixedVar.slice(-1)) === -1) && mixedVar !== '' && !isNaN(mixedVar);\n};\n//# sourceMappingURL=is_numeric.js.map\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/global */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.g = (function() {\n/******/ \t\t\tif (typeof globalThis === 'object') return globalThis;\n/******/ \t\t\ttry {\n/******/ \t\t\t\treturn this || new Function('return this')();\n/******/ \t\t\t} catch (e) {\n/******/ \t\t\t\tif (typeof window === 'object') return window;\n/******/ \t\t\t}\n/******/ \t\t})();\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/make namespace object */\n/******/ \t!function() {\n/******/ \t\t// define __esModule on exports\n/******/ \t\t__webpack_require__.r = function(exports) {\n/******/ \t\t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t\t}\n/******/ \t\t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.\n!function() {\n/*!****************************************!*\\\n  !*** ./resources/assets/js/helpers.js ***!\n  \\****************************************/\n__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! locutus/php/strings/strlen */ \"./node_modules/locutus/php/strings/strlen.js\");\n/* harmony import */ var locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! locutus/php/array/array_diff */ \"./node_modules/locutus/php/array/array_diff.js\");\n/* harmony import */ var locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! locutus/php/datetime/strtotime */ \"./node_modules/locutus/php/datetime/strtotime.js\");\n/* harmony import */ var locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! locutus/php/var/is_numeric */ \"./node_modules/locutus/php/var/is_numeric.js\");\n/* harmony import */ var locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__);\n/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Helper functions used by validators\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\n\n\n\n\n$.extend(true, laravelValidation, {\n  helpers: {\n    /**\n     * Numeric rules\n     */\n    numericRules: ['Integer', 'Numeric'],\n    /**\n     * Gets the file information from file input.\n     *\n     * @param fieldObj\n     * @param index\n     * @returns {{file: *, extension: string, size: number}}\n     */\n    fileinfo: function (fieldObj, index) {\n      var FileName = fieldObj.value;\n      index = typeof index !== 'undefined' ? index : 0;\n      if (fieldObj.files !== null) {\n        if (typeof fieldObj.files[index] !== 'undefined') {\n          return {\n            file: FileName,\n            extension: FileName.substr(FileName.lastIndexOf('.') + 1),\n            size: fieldObj.files[index].size / 1024,\n            type: fieldObj.files[index].type\n          };\n        }\n      }\n      return false;\n    },\n    /**\n     * Gets the selectors for th specified field names.\n     *\n     * @param names\n     * @returns {string}\n     */\n    selector: function (names) {\n      var selector = [];\n      if (!this.isArray(names)) {\n        names = [names];\n      }\n      for (var i = 0; i < names.length; i++) {\n        selector.push(\"[name='\" + names[i] + \"']\");\n      }\n      return selector.join();\n    },\n    /**\n     * Check if element has numeric rules.\n     *\n     * @param element\n     * @returns {boolean}\n     */\n    hasNumericRules: function (element) {\n      return this.hasRules(element, this.numericRules);\n    },\n    /**\n     * Check if element has passed rules.\n     *\n     * @param element\n     * @param rules\n     * @returns {boolean}\n     */\n    hasRules: function (element, rules) {\n      var found = false;\n      if (typeof rules === 'string') {\n        rules = [rules];\n      }\n      var validator = $.data(element.form, \"validator\");\n      var listRules = [];\n      var cache = validator.arrayRulesCache;\n      if (element.name in cache) {\n        $.each(cache[element.name], function (index, arrayRule) {\n          listRules.push(arrayRule);\n        });\n      }\n      if (element.name in validator.settings.rules) {\n        listRules.push(validator.settings.rules[element.name]);\n      }\n      $.each(listRules, function (index, objRules) {\n        if ('laravelValidation' in objRules) {\n          var _rules = objRules.laravelValidation;\n          for (var i = 0; i < _rules.length; i++) {\n            if ($.inArray(_rules[i][0], rules) !== -1) {\n              found = true;\n              return false;\n            }\n          }\n        }\n      });\n      return found;\n    },\n    /**\n     * Return the string length using PHP function.\n     * http://php.net/manual/en/function.strlen.php\n     * http://phpjs.org/functions/strlen/\n     *\n     * @param string\n     */\n    strlen: function (string) {\n      return locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default()(string);\n    },\n    /**\n     * Get the size of the object depending of his type.\n     *\n     * @param obj\n     * @param element\n     * @param value\n     * @returns int\n     */\n    getSize: function getSize(obj, element, value) {\n      if (this.hasNumericRules(element) && this.is_numeric(value)) {\n        return parseFloat(value);\n      } else if (this.isArray(value)) {\n        return parseFloat(value.length);\n      } else if (element.type === 'file') {\n        return parseFloat(Math.floor(this.fileinfo(element).size));\n      }\n      return parseFloat(this.strlen(value));\n    },\n    /**\n     * Return specified rule from element.\n     *\n     * @param rule\n     * @param element\n     * @returns object\n     */\n    getLaravelValidation: function (rule, element) {\n      var found = undefined;\n      $.each($.validator.staticRules(element), function (key, rules) {\n        if (key === \"laravelValidation\") {\n          $.each(rules, function (i, value) {\n            if (value[0] === rule) {\n              found = value;\n            }\n          });\n        }\n      });\n      return found;\n    },\n    /**\n     * Return he timestamp of value passed using format or default format in element.\n     *\n     * @param value\n     * @param format\n     * @returns {boolean|int}\n     */\n    parseTime: function (value, format) {\n      var timeValue = false;\n      var fmt = new DateFormatter();\n      if (typeof value === 'number' && typeof format === 'undefined') {\n        return value;\n      }\n      if (typeof format === 'object') {\n        var dateRule = this.getLaravelValidation('DateFormat', format);\n        if (dateRule !== undefined) {\n          format = dateRule[1][0];\n        } else {\n          format = null;\n        }\n      }\n      if (format == null) {\n        timeValue = this.strtotime(value);\n      } else {\n        timeValue = fmt.parseDate(value, format);\n        if (timeValue instanceof Date && fmt.formatDate(timeValue, format) === value) {\n          timeValue = Math.round(timeValue.getTime() / 1000);\n        } else {\n          timeValue = false;\n        }\n      }\n      return timeValue;\n    },\n    /**\n     * Compare a given date against another using an operator.\n     *\n     * @param validator\n     * @param value\n     * @param element\n     * @param params\n     * @param operator\n     * @return {boolean}\n     */\n    compareDates: function (validator, value, element, params, operator) {\n      var timeCompare = this.parseTime(params);\n      if (!timeCompare) {\n        var target = this.dependentElement(validator, element, params);\n        if (target === undefined) {\n          return false;\n        }\n        timeCompare = this.parseTime(validator.elementValue(target), target);\n      }\n      var timeValue = this.parseTime(value, element);\n      if (timeValue === false) {\n        return false;\n      }\n      switch (operator) {\n        case '<':\n          return timeValue < timeCompare;\n        case '<=':\n          return timeValue <= timeCompare;\n        case '==':\n        case '===':\n          return timeValue === timeCompare;\n        case '>':\n          return timeValue > timeCompare;\n        case '>=':\n          return timeValue >= timeCompare;\n        default:\n          throw new Error('Unsupported operator.');\n      }\n    },\n    /**\n     * This method allows you to intelligently guess the date by closely matching the specific format.\n     *\n     * @param value\n     * @param format\n     * @returns {Date}\n     */\n    guessDate: function (value, format) {\n      var fmt = new DateFormatter();\n      return fmt.guessDate(value, format);\n    },\n    /**\n     * Returns Unix timestamp based on PHP function strototime.\n     * http://php.net/manual/es/function.strtotime.php\n     * http://phpjs.org/functions/strtotime/\n     *\n     * @param text\n     * @param now\n     * @returns {*}\n     */\n    strtotime: function (text, now) {\n      return locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default()(text, now);\n    },\n    /**\n     * Returns if value is numeric.\n     * http://php.net/manual/es/var.is_numeric.php\n     * http://phpjs.org/functions/is_numeric/\n     *\n     * @param mixed_var\n     * @returns {*}\n     */\n    is_numeric: function (mixed_var) {\n      return locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default()(mixed_var);\n    },\n    /**\n     * Check whether the argument is of type Array.\n     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Polyfill\n     *\n     * @param arg\n     * @returns {boolean}\n     */\n    isArray: function (arg) {\n      return Object.prototype.toString.call(arg) === '[object Array]';\n    },\n    /**\n     * Returns Array diff based on PHP function array_diff.\n     * http://php.net/manual/es/function.array_diff.php\n     * http://phpjs.org/functions/array_diff/\n     *\n     * @param arr1\n     * @param arr2\n     * @returns {*}\n     */\n    arrayDiff: function (arr1, arr2) {\n      return locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default()(arr1, arr2);\n    },\n    /**\n     * Check whether two arrays are equal to one another.\n     *\n     * @param arr1\n     * @param arr2\n     * @returns {*}\n     */\n    arrayEquals: function (arr1, arr2) {\n      if (!this.isArray(arr1) || !this.isArray(arr2)) {\n        return false;\n      }\n      if (arr1.length !== arr2.length) {\n        return false;\n      }\n      return $.isEmptyObject(this.arrayDiff(arr1, arr2));\n    },\n    /**\n     * Makes element dependant from other.\n     *\n     * @param validator\n     * @param element\n     * @param name\n     * @returns {*}\n     */\n    dependentElement: function (validator, element, name) {\n      var el = validator.findByName(name);\n      if (el[0] !== undefined && validator.settings.onfocusout) {\n        var event = 'blur';\n        if (el[0].tagName === 'SELECT' || el[0].tagName === 'OPTION' || el[0].type === 'checkbox' || el[0].type === 'radio') {\n          event = 'click';\n        }\n        var ruleName = '.validate-laravelValidation';\n        el.off(ruleName).off(event + ruleName + '-' + element.name).on(event + ruleName + '-' + element.name, function () {\n          $(element).valid();\n        });\n      }\n      return el[0];\n    },\n    /**\n     * Parses error Ajax response and gets the message.\n     *\n     * @param response\n     * @returns {string[]}\n     */\n    parseErrorResponse: function (response) {\n      var newResponse = ['Whoops, looks like something went wrong.'];\n      if ('responseText' in response) {\n        var errorMsg = response.responseText.match(/<h1\\s*>(.*)<\\/h1\\s*>/i);\n        if (this.isArray(errorMsg)) {\n          newResponse = [errorMsg[1]];\n        }\n      }\n      return newResponse;\n    },\n    /**\n     * Escape string to use as Regular Expression.\n     *\n     * @param str\n     * @returns string\n     */\n    escapeRegExp: function (str) {\n      return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n    },\n    /**\n     * Generate RegExp from wildcard attributes.\n     *\n     * @param name\n     * @returns {RegExp}\n     */\n    regexFromWildcard: function (name) {\n      var nameParts = name.split('[*]');\n      if (nameParts.length === 1) nameParts.push('');\n      return new RegExp('^' + nameParts.map(function (x) {\n        return laravelValidation.helpers.escapeRegExp(x);\n      }).join('\\\\[[^\\\\]]*\\\\]') + '$');\n    },\n    /**\n     * Merge additional laravel validation rules into the current rule set.\n     *\n     * @param {object} rules\n     * @param {object} newRules\n     * @returns {object}\n     */\n    mergeRules: function (rules, newRules) {\n      var rulesList = {\n        'laravelValidation': newRules.laravelValidation || [],\n        'laravelValidationRemote': newRules.laravelValidationRemote || []\n      };\n      for (var key in rulesList) {\n        if (rulesList[key].length === 0) {\n          continue;\n        }\n        if (typeof rules[key] === \"undefined\") {\n          rules[key] = [];\n        }\n        rules[key] = rules[key].concat(rulesList[key]);\n      }\n      return rules;\n    },\n    /**\n     * HTML entity encode a string.\n     *\n     * @param string\n     * @returns {string}\n     */\n    encode: function (string) {\n      return $('<div/>').text(string).html();\n    },\n    /**\n     * Lookup name in an array.\n     *\n     * @param validator\n     * @param {string} name Name in dot notation format.\n     * @returns {*}\n     */\n    findByArrayName: function (validator, name) {\n      var sqName = name.replace(/\\.([^\\.]+)/g, '[$1]'),\n        lookups = [\n        // Convert dot to square brackets. e.g. foo.bar.0 becomes foo[bar][0]\n        sqName,\n        // Append [] to the name e.g. foo becomes foo[] or foo.bar.0 becomes foo[bar][0][]\n        sqName + '[]',\n        // Remove key from last array e.g. foo[bar][0] becomes foo[bar][]\n        sqName.replace(/(.*)\\[(.*)\\]$/g, '$1[]')];\n      for (var i = 0; i < lookups.length; i++) {\n        var elem = validator.findByName(lookups[i]);\n        if (elem.length > 0) {\n          return elem;\n        }\n      }\n      return $(null);\n    },\n    /**\n     * Attempt to find an element in the DOM matching the given name.\n     * Example names include:\n     *    - domain.0 which matches domain[]\n     *    - customfield.3 which matches customfield[3]\n     *\n     * @param validator\n     * @param {string} name\n     * @returns {*}\n     */\n    findByName: function (validator, name) {\n      // Exact match.\n      var elem = validator.findByName(name);\n      if (elem.length > 0) {\n        return elem;\n      }\n\n      // Find name in data, using dot notation.\n      var delim = '.',\n        parts = name.split(delim);\n      for (var i = parts.length; i > 0; i--) {\n        var reconstructed = [];\n        for (var c = 0; c < i; c++) {\n          reconstructed.push(parts[c]);\n        }\n        elem = this.findByArrayName(validator, reconstructed.join(delim));\n        if (elem.length > 0) {\n          return elem;\n        }\n      }\n      return $(null);\n    },\n    /**\n     * If it's an array element, get all values.\n     *\n     * @param validator\n     * @param element\n     * @returns {*|string}\n     */\n    allElementValues: function (validator, element) {\n      if (element.name.indexOf('[]') !== -1) {\n        return validator.findByName(element.name).map(function (i, e) {\n          return validator.elementValue(e);\n        }).get();\n      }\n      return validator.elementValue(element);\n    }\n  }\n});\n}();\n/******/ })()\n;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNsQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixJQUFJO0FBQ3pCLHNCQUFzQixFQUFFO0FBQ3hCLHNCQUFzQixFQUFFO0FBQ3hCLG1DQUFtQyxFQUFFO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJO0FBQ2hEOztBQUVBO0FBQ0EsOEJBQThCLElBQUk7QUFDbEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3REFBd0QsSUFBSTtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLElBQUk7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0lBQ1E2SCxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVaEcsU0FBUyxFQUFFSixPQUFPLEVBQUU7TUFDNUMsSUFBSUEsT0FBTyxDQUFDVSxJQUFJLENBQUMyRixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDbkMsT0FBT2pHLFNBQVMsQ0FBQzBELFVBQVUsQ0FBQzlELE9BQU8sQ0FBQ1UsSUFBSSxDQUFDLENBQUN5RSxHQUFHLENBQUMsVUFBVXhGLENBQUMsRUFBRTJHLENBQUMsRUFBRTtVQUMxRCxPQUFPbEcsU0FBUyxDQUFDeUMsWUFBWSxDQUFDeUQsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUMsQ0FBQztNQUNaO01BRUEsT0FBT25HLFNBQVMsQ0FBQ3lDLFlBQVksQ0FBQzdDLE9BQU8sQ0FBQztJQUMxQztFQUNKO0FBQ0osQ0FBQyxDQUFDLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9jdXR1cy9waHAvYXJyYXkvYXJyYXlfZGlmZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9jdXR1cy9waHAvZGF0ZXRpbWUvc3RydG90aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2N1dHVzL3BocC9pbmZvL2luaV9nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvY3V0dXMvcGhwL3N0cmluZ3Mvc3RybGVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2N1dHVzL3BocC92YXIvaXNfbnVtZXJpYy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhcnJheV9kaWZmKGFycjEpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvYXJyYXlfZGlmZi9cbiAgLy8gb3JpZ2luYWwgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHBzOi8va3Z6LmlvKVxuICAvLyBpbXByb3ZlZCBieTogU2Fuam95IFJveVxuICAvLyAgcmV2aXNlZCBieTogQnJldHQgWmFtaXIgKGh0dHBzOi8vYnJldHQtemFtaXIubWUpXG4gIC8vICAgZXhhbXBsZSAxOiBhcnJheV9kaWZmKFsnS2V2aW4nLCAndmFuJywgJ1pvbm5ldmVsZCddLCBbJ3ZhbicsICdab25uZXZlbGQnXSlcbiAgLy8gICByZXR1cm5zIDE6IHswOidLZXZpbid9XG5cbiAgdmFyIHJldEFyciA9IHt9O1xuICB2YXIgYXJnbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBrMSA9ICcnO1xuICB2YXIgaSA9IDE7XG4gIHZhciBrID0gJyc7XG4gIHZhciBhcnIgPSB7fTtcblxuICBhcnIxa2V5czogZm9yIChrMSBpbiBhcnIxKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sYWJlbHNcbiAgICBmb3IgKGkgPSAxOyBpIDwgYXJnbDsgaSsrKSB7XG4gICAgICBhcnIgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKGsgaW4gYXJyKSB7XG4gICAgICAgIGlmIChhcnJba10gPT09IGFycjFbazFdKSB7XG4gICAgICAgICAgLy8gSWYgaXQgcmVhY2hlcyBoZXJlLCBpdCB3YXMgZm91bmQgaW4gYXQgbGVhc3Qgb25lIGFycmF5LCBzbyB0cnkgbmV4dCB2YWx1ZVxuICAgICAgICAgIGNvbnRpbnVlIGFycjFrZXlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxhYmVsc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXRBcnJbazFdID0gYXJyMVtrMV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldEFycjtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJheV9kaWZmLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlU3BhY2UgPSAnWyBcXFxcdF0rJztcbnZhciByZVNwYWNlT3B0ID0gJ1sgXFxcXHRdKic7XG52YXIgcmVNZXJpZGlhbiA9ICcoPzooW2FwXSlcXFxcLj9tXFxcXC4/KFtcXFxcdCBdfCQpKSc7XG52YXIgcmVIb3VyMjQgPSAnKDJbMC00XXxbMDFdP1swLTldKSc7XG52YXIgcmVIb3VyMjRseiA9ICcoWzAxXVswLTldfDJbMC00XSknO1xudmFyIHJlSG91cjEyID0gJygwP1sxLTldfDFbMC0yXSknO1xudmFyIHJlTWludXRlID0gJyhbMC01XT9bMC05XSknO1xudmFyIHJlTWludXRlbHogPSAnKFswLTVdWzAtOV0pJztcbnZhciByZVNlY29uZCA9ICcoNjB8WzAtNV0/WzAtOV0pJztcbnZhciByZVNlY29uZGx6ID0gJyg2MHxbMC01XVswLTldKSc7XG52YXIgcmVGcmFjID0gJyg/OlxcXFwuKFswLTldKykpJztcblxudmFyIHJlRGF5ZnVsbCA9ICdzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSc7XG52YXIgcmVEYXlhYmJyID0gJ3N1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCc7XG52YXIgcmVEYXl0ZXh0ID0gcmVEYXlmdWxsICsgJ3wnICsgcmVEYXlhYmJyICsgJ3x3ZWVrZGF5cz8nO1xuXG52YXIgcmVSZWx0ZXh0bnVtYmVyID0gJ2ZpcnN0fHNlY29uZHx0aGlyZHxmb3VydGh8ZmlmdGh8c2l4dGh8c2V2ZW50aHxlaWdodGg/fG5pbnRofHRlbnRofGVsZXZlbnRofHR3ZWxmdGgnO1xudmFyIHJlUmVsdGV4dHRleHQgPSAnbmV4dHxsYXN0fHByZXZpb3VzfHRoaXMnO1xudmFyIHJlUmVsdGV4dHVuaXQgPSAnKD86c2Vjb25kfHNlY3xtaW51dGV8bWlufGhvdXJ8ZGF5fGZvcnRuaWdodHxmb3J0aG5pZ2h0fG1vbnRofHllYXIpcz98d2Vla3N8JyArIHJlRGF5dGV4dDtcblxudmFyIHJlWWVhciA9ICcoWzAtOV17MSw0fSknO1xudmFyIHJlWWVhcjIgPSAnKFswLTldezJ9KSc7XG52YXIgcmVZZWFyNCA9ICcoWzAtOV17NH0pJztcbnZhciByZVllYXI0d2l0aFNpZ24gPSAnKFsrLV0/WzAtOV17NH0pJztcbnZhciByZU1vbnRoID0gJygxWzAtMl18MD9bMC05XSknO1xudmFyIHJlTW9udGhseiA9ICcoMFswLTldfDFbMC0yXSknO1xudmFyIHJlRGF5ID0gJyg/OigzWzAxXXxbMC0yXT9bMC05XSkoPzpzdHxuZHxyZHx0aCk/KSc7XG52YXIgcmVEYXlseiA9ICcoMFswLTldfFsxLTJdWzAtOV18M1swMV0pJztcblxudmFyIHJlTW9udGhGdWxsID0gJ2phbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXInO1xudmFyIHJlTW9udGhBYmJyID0gJ2phbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwdD98b2N0fG5vdnxkZWMnO1xudmFyIHJlTW9udGhyb21hbiA9ICdpW3Z4XXx2aXswLDN9fHhpezAsMn18aXsxLDN9JztcbnZhciByZU1vbnRoVGV4dCA9ICcoJyArIHJlTW9udGhGdWxsICsgJ3wnICsgcmVNb250aEFiYnIgKyAnfCcgKyByZU1vbnRocm9tYW4gKyAnKSc7XG5cbnZhciByZVR6Q29ycmVjdGlvbiA9ICcoKD86R01UKT8oWystXSknICsgcmVIb3VyMjQgKyAnOj8nICsgcmVNaW51dGUgKyAnPyknO1xudmFyIHJlVHpBYmJyID0gJ1xcXFwoPyhbYS16QS1aXXsxLDZ9KVxcXFwpPyc7XG52YXIgcmVEYXlPZlllYXIgPSAnKDAwWzEtOV18MFsxLTldWzAtOV18WzEyXVswLTldWzAtOV18M1swLTVdWzAtOV18MzZbMC02XSknO1xudmFyIHJlV2Vla09mWWVhciA9ICcoMFsxLTldfFsxLTRdWzAtOV18NVswLTNdKSc7XG5cbnZhciByZURhdGVOb1llYXIgPSByZU1vbnRoVGV4dCArICdbIC5cXFxcdC1dKicgKyByZURheSArICdbLC5zdG5kcmhcXFxcdCBdKic7XG5cbmZ1bmN0aW9uIHByb2Nlc3NNZXJpZGlhbihob3VyLCBtZXJpZGlhbikge1xuICBtZXJpZGlhbiA9IG1lcmlkaWFuICYmIG1lcmlkaWFuLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChtZXJpZGlhbikge1xuICAgIGNhc2UgJ2EnOlxuICAgICAgaG91ciArPSBob3VyID09PSAxMiA/IC0xMiA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwJzpcbiAgICAgIGhvdXIgKz0gaG91ciAhPT0gMTIgPyAxMiA6IDA7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBob3VyO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzWWVhcih5ZWFyU3RyKSB7XG4gIHZhciB5ZWFyID0gK3llYXJTdHI7XG5cbiAgaWYgKHllYXJTdHIubGVuZ3RoIDwgNCAmJiB5ZWFyIDwgMTAwKSB7XG4gICAgeWVhciArPSB5ZWFyIDwgNzAgPyAyMDAwIDogMTkwMDtcbiAgfVxuXG4gIHJldHVybiB5ZWFyO1xufVxuXG5mdW5jdGlvbiBsb29rdXBNb250aChtb250aFN0cikge1xuICByZXR1cm4ge1xuICAgIGphbjogMCxcbiAgICBqYW51YXJ5OiAwLFxuICAgIGk6IDAsXG4gICAgZmViOiAxLFxuICAgIGZlYnJ1YXJ5OiAxLFxuICAgIGlpOiAxLFxuICAgIG1hcjogMixcbiAgICBtYXJjaDogMixcbiAgICBpaWk6IDIsXG4gICAgYXByOiAzLFxuICAgIGFwcmlsOiAzLFxuICAgIGl2OiAzLFxuICAgIG1heTogNCxcbiAgICB2OiA0LFxuICAgIGp1bjogNSxcbiAgICBqdW5lOiA1LFxuICAgIHZpOiA1LFxuICAgIGp1bDogNixcbiAgICBqdWx5OiA2LFxuICAgIHZpaTogNixcbiAgICBhdWc6IDcsXG4gICAgYXVndXN0OiA3LFxuICAgIHZpaWk6IDcsXG4gICAgc2VwOiA4LFxuICAgIHNlcHQ6IDgsXG4gICAgc2VwdGVtYmVyOiA4LFxuICAgIGl4OiA4LFxuICAgIG9jdDogOSxcbiAgICBvY3RvYmVyOiA5LFxuICAgIHg6IDksXG4gICAgbm92OiAxMCxcbiAgICBub3ZlbWJlcjogMTAsXG4gICAgeGk6IDEwLFxuICAgIGRlYzogMTEsXG4gICAgZGVjZW1iZXI6IDExLFxuICAgIHhpaTogMTFcbiAgfVttb250aFN0ci50b0xvd2VyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gbG9va3VwV2Vla2RheShkYXlTdHIpIHtcbiAgdmFyIGRlc2lyZWRTdW5kYXlOdW1iZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG5cbiAgdmFyIGRheU51bWJlcnMgPSB7XG4gICAgbW9uOiAxLFxuICAgIG1vbmRheTogMSxcbiAgICB0dWU6IDIsXG4gICAgdHVlc2RheTogMixcbiAgICB3ZWQ6IDMsXG4gICAgd2VkbmVzZGF5OiAzLFxuICAgIHRodTogNCxcbiAgICB0aHVyc2RheTogNCxcbiAgICBmcmk6IDUsXG4gICAgZnJpZGF5OiA1LFxuICAgIHNhdDogNixcbiAgICBzYXR1cmRheTogNixcbiAgICBzdW46IDAsXG4gICAgc3VuZGF5OiAwXG4gIH07XG5cbiAgcmV0dXJuIGRheU51bWJlcnNbZGF5U3RyLnRvTG93ZXJDYXNlKCldIHx8IGRlc2lyZWRTdW5kYXlOdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFJlbGF0aXZlKHJlbFRleHQpIHtcbiAgdmFyIHJlbGF0aXZlTnVtYmVycyA9IHtcbiAgICBsYXN0OiAtMSxcbiAgICBwcmV2aW91czogLTEsXG4gICAgdGhpczogMCxcbiAgICBmaXJzdDogMSxcbiAgICBuZXh0OiAxLFxuICAgIHNlY29uZDogMixcbiAgICB0aGlyZDogMyxcbiAgICBmb3VydGg6IDQsXG4gICAgZmlmdGg6IDUsXG4gICAgc2l4dGg6IDYsXG4gICAgc2V2ZW50aDogNyxcbiAgICBlaWdodDogOCxcbiAgICBlaWdodGg6IDgsXG4gICAgbmludGg6IDksXG4gICAgdGVudGg6IDEwLFxuICAgIGVsZXZlbnRoOiAxMSxcbiAgICB0d2VsZnRoOiAxMlxuICB9O1xuXG4gIHZhciByZWxhdGl2ZUJlaGF2aW9yID0ge1xuICAgIHRoaXM6IDFcbiAgfTtcblxuICB2YXIgcmVsVGV4dExvd2VyID0gcmVsVGV4dC50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiB7XG4gICAgYW1vdW50OiByZWxhdGl2ZU51bWJlcnNbcmVsVGV4dExvd2VyXSxcbiAgICBiZWhhdmlvcjogcmVsYXRpdmVCZWhhdmlvcltyZWxUZXh0TG93ZXJdIHx8IDBcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1R6Q29ycmVjdGlvbih0ek9mZnNldCwgb2xkVmFsdWUpIHtcbiAgdmFyIHJlVHpDb3JyZWN0aW9uTG9vc2UgPSAvKD86R01UKT8oWystXSkoXFxkKykoOj8pKFxcZHswLDJ9KS9pO1xuICB0ek9mZnNldCA9IHR6T2Zmc2V0ICYmIHR6T2Zmc2V0Lm1hdGNoKHJlVHpDb3JyZWN0aW9uTG9vc2UpO1xuXG4gIGlmICghdHpPZmZzZXQpIHtcbiAgICByZXR1cm4gb2xkVmFsdWU7XG4gIH1cblxuICB2YXIgc2lnbiA9IHR6T2Zmc2V0WzFdID09PSAnLScgPyAtMSA6IDE7XG4gIHZhciBob3VycyA9ICt0ek9mZnNldFsyXTtcbiAgdmFyIG1pbnV0ZXMgPSArdHpPZmZzZXRbNF07XG5cbiAgaWYgKCF0ek9mZnNldFs0XSAmJiAhdHpPZmZzZXRbM10pIHtcbiAgICBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAlIDEwMCk7XG4gICAgaG91cnMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMTAwKTtcbiAgfVxuXG4gIC8vIHRpbWV6b25lIG9mZnNldCBpbiBzZWNvbmRzXG4gIHJldHVybiBzaWduICogKGhvdXJzICogNjAgKyBtaW51dGVzKSAqIDYwO1xufVxuXG4vLyB0eiBhYmJyZXZhdGlvbiA6IHR6IG9mZnNldCBpbiBzZWNvbmRzXG52YXIgdHpBYmJyT2Zmc2V0cyA9IHtcbiAgYWNkdDogMzc4MDAsXG4gIGFjc3Q6IDM0MjAwLFxuICBhZGR0OiAtNzIwMCxcbiAgYWR0OiAtMTA4MDAsXG4gIGFlZHQ6IDM5NjAwLFxuICBhZXN0OiAzNjAwMCxcbiAgYWhkdDogLTMyNDAwLFxuICBhaHN0OiAtMzYwMDAsXG4gIGFrZHQ6IC0yODgwMCxcbiAgYWtzdDogLTMyNDAwLFxuICBhbXQ6IC0xMzg0MCxcbiAgYXB0OiAtMTA4MDAsXG4gIGFzdDogLTE0NDAwLFxuICBhd2R0OiAzMjQwMCxcbiAgYXdzdDogMjg4MDAsXG4gIGF3dDogLTEwODAwLFxuICBiZHN0OiA3MjAwLFxuICBiZHQ6IC0zNjAwMCxcbiAgYm10OiAtMTQzMDksXG4gIGJzdDogMzYwMCxcbiAgY2FzdDogMzQyMDAsXG4gIGNhdDogNzIwMCxcbiAgY2RkdDogLTE0NDAwLFxuICBjZHQ6IC0xODAwMCxcbiAgY2VtdDogMTA4MDAsXG4gIGNlc3Q6IDcyMDAsXG4gIGNldDogMzYwMCxcbiAgY210OiAtMTU0MDgsXG4gIGNwdDogLTE4MDAwLFxuICBjc3Q6IC0yMTYwMCxcbiAgY3d0OiAtMTgwMDAsXG4gIGNoc3Q6IDM2MDAwLFxuICBkbXQ6IC0xNTIxLFxuICBlYXQ6IDEwODAwLFxuICBlZGR0OiAtMTA4MDAsXG4gIGVkdDogLTE0NDAwLFxuICBlZXN0OiAxMDgwMCxcbiAgZWV0OiA3MjAwLFxuICBlbXQ6IC0yNjI0OCxcbiAgZXB0OiAtMTQ0MDAsXG4gIGVzdDogLTE4MDAwLFxuICBld3Q6IC0xNDQwMCxcbiAgZmZtdDogLTE0NjYwLFxuICBmbXQ6IC00MDU2LFxuICBnZHQ6IDM5NjAwLFxuICBnbXQ6IDAsXG4gIGdzdDogMzYwMDAsXG4gIGhkdDogLTM0MjAwLFxuICBoa3N0OiAzMjQwMCxcbiAgaGt0OiAyODgwMCxcbiAgaG10OiAtMTk3NzYsXG4gIGhwdDogLTM0MjAwLFxuICBoc3Q6IC0zNjAwMCxcbiAgaHd0OiAtMzQyMDAsXG4gIGlkZHQ6IDE0NDAwLFxuICBpZHQ6IDEwODAwLFxuICBpbXQ6IDI1MDI1LFxuICBpc3Q6IDcyMDAsXG4gIGpkdDogMzYwMDAsXG4gIGptdDogODQ0MCxcbiAganN0OiAzMjQwMCxcbiAga2R0OiAzNjAwMCxcbiAga210OiA1NzM2LFxuICBrc3Q6IDMwNjAwLFxuICBsc3Q6IDkzOTQsXG4gIG1kZHQ6IC0xODAwMCxcbiAgbWRzdDogMTYyNzksXG4gIG1kdDogLTIxNjAwLFxuICBtZXN0OiA3MjAwLFxuICBtZXQ6IDM2MDAsXG4gIG1tdDogOTAxNyxcbiAgbXB0OiAtMjE2MDAsXG4gIG1zZDogMTQ0MDAsXG4gIG1zazogMTA4MDAsXG4gIG1zdDogLTI1MjAwLFxuICBtd3Q6IC0yMTYwMCxcbiAgbmRkdDogLTU0MDAsXG4gIG5kdDogLTkwNTIsXG4gIG5wdDogLTkwMDAsXG4gIG5zdDogLTEyNjAwLFxuICBud3Q6IC05MDAwLFxuICBuemR0OiA0NjgwMCxcbiAgbnptdDogNDE0MDAsXG4gIG56c3Q6IDQzMjAwLFxuICBwZGR0OiAtMjE2MDAsXG4gIHBkdDogLTI1MjAwLFxuICBwa3N0OiAyMTYwMCxcbiAgcGt0OiAxODAwMCxcbiAgcGxtdDogMjU1OTAsXG4gIHBtdDogLTEzMjM2LFxuICBwcG10OiAtMTczNDAsXG4gIHBwdDogLTI1MjAwLFxuICBwc3Q6IC0yODgwMCxcbiAgcHd0OiAtMjUyMDAsXG4gIHFtdDogLTE4ODQwLFxuICBybXQ6IDU3OTQsXG4gIHNhc3Q6IDcyMDAsXG4gIHNkbXQ6IC0xNjgwMCxcbiAgc2ptdDogLTIwMTczLFxuICBzbXQ6IC0xMzg4NCxcbiAgc3N0OiAtMzk2MDAsXG4gIHRibXQ6IDEwNzUxLFxuICB0bXQ6IDEyMzQ0LFxuICB1Y3Q6IDAsXG4gIHV0YzogMCxcbiAgd2FzdDogNzIwMCxcbiAgd2F0OiAzNjAwLFxuICB3ZW10OiA3MjAwLFxuICB3ZXN0OiAzNjAwLFxuICB3ZXQ6IDAsXG4gIHdpYjogMjUyMDAsXG4gIHdpdGE6IDI4ODAwLFxuICB3aXQ6IDMyNDAwLFxuICB3bXQ6IDUwNDAsXG4gIHlkZHQ6IC0yNTIwMCxcbiAgeWR0OiAtMjg4MDAsXG4gIHlwdDogLTI4ODAwLFxuICB5c3Q6IC0zMjQwMCxcbiAgeXd0OiAtMjg4MDAsXG4gIGE6IDM2MDAsXG4gIGI6IDcyMDAsXG4gIGM6IDEwODAwLFxuICBkOiAxNDQwMCxcbiAgZTogMTgwMDAsXG4gIGY6IDIxNjAwLFxuICBnOiAyNTIwMCxcbiAgaDogMjg4MDAsXG4gIGk6IDMyNDAwLFxuICBrOiAzNjAwMCxcbiAgbDogMzk2MDAsXG4gIG06IDQzMjAwLFxuICBuOiAtMzYwMCxcbiAgbzogLTcyMDAsXG4gIHA6IC0xMDgwMCxcbiAgcTogLTE0NDAwLFxuICByOiAtMTgwMDAsXG4gIHM6IC0yMTYwMCxcbiAgdDogLTI1MjAwLFxuICB1OiAtMjg4MDAsXG4gIHY6IC0zMjQwMCxcbiAgdzogLTM2MDAwLFxuICB4OiAtMzk2MDAsXG4gIHk6IC00MzIwMCxcbiAgejogMFxufTtcblxudmFyIGZvcm1hdHMgPSB7XG4gIHllc3RlcmRheToge1xuICAgIHJlZ2V4OiAvXnllc3RlcmRheS9pLFxuICAgIG5hbWU6ICd5ZXN0ZXJkYXknLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmQgLT0gMTtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpO1xuICAgIH1cbiAgfSxcblxuICBub3c6IHtcbiAgICByZWdleDogL15ub3cvaSxcbiAgICBuYW1lOiAnbm93J1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSxcblxuICBub29uOiB7XG4gICAgcmVnZXg6IC9ebm9vbi9pLFxuICAgIG5hbWU6ICdub29uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKSAmJiB0aGlzLnRpbWUoMTIsIDAsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICBtaWRuaWdodE9yVG9kYXk6IHtcbiAgICByZWdleDogL14obWlkbmlnaHR8dG9kYXkpL2ksXG4gICAgbmFtZTogJ21pZG5pZ2h0IHwgdG9kYXknLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpO1xuICAgIH1cbiAgfSxcblxuICB0b21vcnJvdzoge1xuICAgIHJlZ2V4OiAvXnRvbW9ycm93L2ksXG4gICAgbmFtZTogJ3RvbW9ycm93JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB0aGlzLnJkICs9IDE7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZXN0YW1wOiB7XG4gICAgcmVnZXg6IC9eQCgtP1xcZCspL2ksXG4gICAgbmFtZTogJ3RpbWVzdGFtcCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB0aW1lc3RhbXApIHtcbiAgICAgIHRoaXMucnMgKz0gK3RpbWVzdGFtcDtcbiAgICAgIHRoaXMueSA9IDE5NzA7XG4gICAgICB0aGlzLm0gPSAwO1xuICAgICAgdGhpcy5kID0gMTtcbiAgICAgIHRoaXMuZGF0ZXMgPSAwO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKSAmJiB0aGlzLnpvbmUoMCk7XG4gICAgfVxuICB9LFxuXG4gIGZpcnN0T3JMYXN0RGF5OiB7XG4gICAgcmVnZXg6IC9eKGZpcnN0fGxhc3QpIGRheSBvZi9pLFxuICAgIG5hbWU6ICdmaXJzdGRheW9mIHwgbGFzdGRheW9mJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGRheSkge1xuICAgICAgaWYgKGRheS50b0xvd2VyQ2FzZSgpID09PSAnZmlyc3QnKSB7XG4gICAgICAgIHRoaXMuZmlyc3RPckxhc3REYXlPZk1vbnRoID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyc3RPckxhc3REYXlPZk1vbnRoID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGJhY2tPckZyb250T2Y6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKGJhY2t8ZnJvbnQpIG9mICcgKyByZUhvdXIyNCArIHJlU3BhY2VPcHQgKyByZU1lcmlkaWFuICsgJz8nLCAnaScpLFxuICAgIG5hbWU6ICdiYWNrb2YgfCBmcm9udG9mJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHNpZGUsIGhvdXJzLCBtZXJpZGlhbikge1xuICAgICAgdmFyIGJhY2sgPSBzaWRlLnRvTG93ZXJDYXNlKCkgPT09ICdiYWNrJztcbiAgICAgIHZhciBob3VyID0gK2hvdXJzO1xuICAgICAgdmFyIG1pbnV0ZSA9IDE1O1xuXG4gICAgICBpZiAoIWJhY2spIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgPSA0NTtcbiAgICAgIH1cblxuICAgICAgaG91ciA9IHByb2Nlc3NNZXJpZGlhbihob3VyLCBtZXJpZGlhbik7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpICYmIHRoaXMudGltZShob3VyLCBtaW51dGUsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICB3ZWVrZGF5T2Y6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHRudW1iZXIgKyAnfCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICcoJyArIHJlRGF5ZnVsbCArICd8JyArIHJlRGF5YWJiciArICcpJyArIHJlU3BhY2UgKyAnb2YnLCAnaScpLFxuICAgIG5hbWU6ICd3ZWVrZGF5b2YnXG4gICAgLy8gdG9kb1xuICB9LFxuXG4gIG1zc3FsdGltZToge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnOicgKyByZU1pbnV0ZWx6ICsgJzonICsgcmVTZWNvbmRseiArICdbOi5dKFswLTldKyknICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAnbXNzcWx0aW1lJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjLCBtZXJpZGlhbikge1xuICAgICAgcmV0dXJuIHRoaXMudGltZShwcm9jZXNzTWVyaWRpYW4oK2hvdXIsIG1lcmlkaWFuKSwgK21pbnV0ZSwgK3NlY29uZCwgK2ZyYWMuc3Vic3RyKDAsIDMpKTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZUxvbmcxMjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kbHogKyByZVNwYWNlT3B0ICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAndGltZWxvbmcxMicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICB0aW1lU2hvcnQxMjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnWzouXScgKyByZU1pbnV0ZWx6ICsgcmVTcGFjZU9wdCArIHJlTWVyaWRpYW4sICdpJyksXG4gICAgbmFtZTogJ3RpbWVzaG9ydDEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1pbnV0ZSwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICB0aW1lVGlueTEyOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZUhvdXIxMiArIHJlU3BhY2VPcHQgKyByZU1lcmlkaWFuLCAnaScpLFxuICAgIG5hbWU6ICd0aW1ldGlueTEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1lcmlkaWFuKSB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lKHByb2Nlc3NNZXJpZGlhbigraG91ciwgbWVyaWRpYW4pLCAwLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgc29hcDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICctJyArIHJlTW9udGhseiArICctJyArIHJlRGF5bHogKyAnVCcgKyByZUhvdXIyNGx6ICsgJzonICsgcmVNaW51dGVseiArICc6JyArIHJlU2Vjb25kbHogKyByZUZyYWMgKyByZVR6Q29ycmVjdGlvbiArICc/JywgJ2knKSxcbiAgICBuYW1lOiAnc29hcCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhYywgdHpDb3JyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCArZnJhYy5zdWJzdHIoMCwgMykpICYmIHRoaXMuem9uZShwcm9jZXNzVHpDb3JyZWN0aW9uKHR6Q29ycmVjdGlvbikpO1xuICAgIH1cbiAgfSxcblxuICB3ZGR4OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgJy0nICsgcmVNb250aCArICctJyArIHJlRGF5ICsgJ1QnICsgcmVIb3VyMjQgKyAnOicgKyByZU1pbnV0ZSArICc6JyArIHJlU2Vjb25kKSxcbiAgICBuYW1lOiAnd2RkeCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBtb250aCAtIDEsICtkYXkpICYmIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGV4aWY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnOicgKyByZU1vbnRobHogKyAnOicgKyByZURheWx6ICsgJyAnICsgcmVIb3VyMjRseiArICc6JyArIHJlTWludXRlbHogKyAnOicgKyByZVNlY29uZGx6LCAnaScpLFxuICAgIG5hbWU6ICdleGlmJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgeG1sUnBjOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiArICdUJyArIHJlSG91cjI0ICsgJzonICsgcmVNaW51dGVseiArICc6JyArIHJlU2Vjb25kbHopLFxuICAgIG5hbWU6ICd4bWxycGMnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KSAmJiB0aGlzLnRpbWUoK2hvdXIsICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICB4bWxScGNOb0NvbG9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiArICdbVHRdJyArIHJlSG91cjI0ICsgcmVNaW51dGVseiArIHJlU2Vjb25kbHopLFxuICAgIG5hbWU6ICd4bWxycGNub2NvbG9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgY2xmOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURheSArICcvKCcgKyByZU1vbnRoQWJiciArICcpLycgKyByZVllYXI0ICsgJzonICsgcmVIb3VyMjRseiArICc6JyArIHJlTWludXRlbHogKyAnOicgKyByZVNlY29uZGx6ICsgcmVTcGFjZSArIHJlVHpDb3JyZWN0aW9uLCAnaScpLFxuICAgIG5hbWU6ICdjbGYnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhciwgaG91ciwgbWludXRlLCBzZWNvbmQsIHR6Q29ycmVjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksICtkYXkpICYmIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCkgJiYgdGhpcy56b25lKHByb2Nlc3NUekNvcnJlY3Rpb24odHpDb3JyZWN0aW9uKSk7XG4gICAgfVxuICB9LFxuXG4gIGlzbzg2MDFsb25nOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXnQ/JyArIHJlSG91cjI0ICsgJ1s6Ll0nICsgcmVNaW51dGUgKyAnWzouXScgKyByZVNlY29uZCArIHJlRnJhYywgJ2knKSxcbiAgICBuYW1lOiAnaXNvODYwMWxvbmcnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWMpIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUoK2hvdXIsICttaW51dGUsICtzZWNvbmQsICtmcmFjLnN1YnN0cigwLCAzKSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVUZXh0dWFsOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZU1vbnRoVGV4dCArICdbIC5cXFxcdC1dKicgKyByZURheSArICdbLC5zdG5kcmhcXFxcdCBdKycgKyByZVllYXIsICdpJyksXG4gICAgbmFtZTogJ2RhdGV0ZXh0dWFsJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIHllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgcG9pbnRlZERhdGU0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURheSArICdbLlxcXFx0LV0nICsgcmVNb250aCArICdbLi1dJyArIHJlWWVhcjQpLFxuICAgIG5hbWU6ICdwb2ludGVkZGF0ZTQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBtb250aCAtIDEsICtkYXkpO1xuICAgIH1cbiAgfSxcblxuICBwb2ludGVkRGF0ZTI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1suXFxcXHRdJyArIHJlTW9udGggKyAnXFxcXC4nICsgcmVZZWFyMiksXG4gICAgbmFtZTogJ3BvaW50ZWRkYXRlMicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBkYXksIG1vbnRoLCB5ZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQocHJvY2Vzc1llYXIoeWVhciksIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIHRpbWVMb25nMjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kKSxcbiAgICBuYW1lOiAndGltZWxvbmcyNCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVOb0NvbG9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiksXG4gICAgbmFtZTogJ2RhdGVub2NvbG9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgcGd5ZG90ZDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICdcXFxcLj8nICsgcmVEYXlPZlllYXIpLFxuICAgIG5hbWU6ICdwZ3lkb3RkJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCAwLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZVNob3J0MjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSwgJ2knKSxcbiAgICBuYW1lOiAndGltZXNob3J0MjQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgaG91ciwgbWludXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lKCtob3VyLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNvODYwMW5vQ29sb246IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjRseiArIHJlTWludXRlbHogKyByZVNlY29uZGx6LCAnaScpLFxuICAgIG5hbWU6ICdpc284NjAxbm9jb2xvbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGlzbzg2MDFkYXRlU2xhc2g6IHtcbiAgICAvLyBldmVudGhvdWdoIHRoZSB0cmFpbGluZyBzbGFzaCBpcyBvcHRpb25hbCBpbiBQSFBcbiAgICAvLyBoZXJlIGl0J3MgbWFuZGF0b3J5IGFuZCBpbnB1dHMgd2l0aG91dCB0aGUgc2xhc2hcbiAgICAvLyBhcmUgaGFuZGxlZCBieSBkYXRlc2xhc2hcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLycgKyByZU1vbnRobHogKyAnLycgKyByZURheWx6ICsgJy8nKSxcbiAgICBuYW1lOiAnaXNvODYwMWRhdGVzbGFzaCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVTbGFzaDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICcvJyArIHJlTW9udGggKyAnLycgKyByZURheSksXG4gICAgbmFtZTogJ2RhdGVzbGFzaCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGFtZXJpY2FuOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZU1vbnRoICsgJy8nICsgcmVEYXkgKyAnLycgKyByZVllYXIpLFxuICAgIG5hbWU6ICdhbWVyaWNhbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgZGF5LCB5ZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQocHJvY2Vzc1llYXIoeWVhciksIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGFtZXJpY2FuU2hvcnQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlTW9udGggKyAnLycgKyByZURheSksXG4gICAgbmFtZTogJ2FtZXJpY2Fuc2hvcnQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgsIGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHRoaXMueSwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZ251RGF0ZVNob3J0T3JJc284NjAxZGF0ZTI6IHtcbiAgICAvLyBpc284NjAxZGF0ZTIgaXMgY29tcGxldGUgc3Vic2V0IG9mIGdudWRhdGVzaG9ydFxuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyICsgJy0nICsgcmVNb250aCArICctJyArIHJlRGF5KSxcbiAgICBuYW1lOiAnZ251ZGF0ZXNob3J0IHwgaXNvODYwMWRhdGUyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgaXNvODYwMWRhdGU0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0d2l0aFNpZ24gKyAnLScgKyByZU1vbnRobHogKyAnLScgKyByZURheWx6KSxcbiAgICBuYW1lOiAnaXNvODYwMWRhdGU0JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZ251Tm9Db2xvbjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ150PycgKyByZUhvdXIyNGx6ICsgcmVNaW51dGVseiwgJ2knKSxcbiAgICBuYW1lOiAnZ251bm9jb2xvbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUpIHtcbiAgICAgIC8vIHRoaXMgcnVsZSBpcyBhIHNwZWNpYWwgY2FzZVxuICAgICAgLy8gaWYgdGltZSB3YXMgYWxyZWFkeSBzZXQgb25jZSBieSBhbnkgcHJlY2VkaW5nIHJ1bGUsIGl0IHNldHMgdGhlIGNhcHR1cmVkIHZhbHVlIGFzIHllYXJcbiAgICAgIHN3aXRjaCAodGhpcy50aW1lcykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgMCwgdGhpcy5mKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMueSA9IGhvdXIgKiAxMDAgKyArbWludXRlO1xuICAgICAgICAgIHRoaXMudGltZXMrKztcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ251RGF0ZVNob3J0ZXI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLScgKyByZU1vbnRoKSxcbiAgICBuYW1lOiAnZ251ZGF0ZXNob3J0ZXInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgeWVhciwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCAxKTtcbiAgICB9XG4gIH0sXG5cbiAgcGdUZXh0UmV2ZXJzZToge1xuICAgIC8vIG5vdGU6IGFsbG93ZWQgeWVhcnMgYXJlIGZyb20gMzItOTk5OVxuICAgIC8vIHllYXJzIGJlbG93IDMyIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRheXMgaW4gZGF0ZWZ1bGxcbiAgICByZWdleDogUmVnRXhwKCdeJyArICcoXFxcXGR7Myw0fXxbNC05XVxcXFxkfDNbMi05XSktKCcgKyByZU1vbnRoQWJiciArICcpLScgKyByZURheWx6LCAnaScpLFxuICAgIG5hbWU6ICdwZ3RleHRyZXZlcnNlJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZUZ1bGw6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1sgXFxcXHQuLV0qJyArIHJlTW9udGhUZXh0ICsgJ1sgXFxcXHQuLV0qJyArIHJlWWVhciwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZWZ1bGwnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHByb2Nlc3NZZWFyKHllYXIpLCBsb29rdXBNb250aChtb250aCksICtkYXkpO1xuICAgIH1cbiAgfSxcblxuICBkYXRlTm9EYXk6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlTW9udGhUZXh0ICsgJ1sgLlxcXFx0LV0qJyArIHJlWWVhcjQsICdpJyksXG4gICAgbmFtZTogJ2RhdGVub2RheScsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksIDEpO1xuICAgIH1cbiAgfSxcblxuICBkYXRlTm9EYXlSZXY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnWyAuXFxcXHQtXSonICsgcmVNb250aFRleHQsICdpJyksXG4gICAgbmFtZTogJ2RhdGVub2RheXJldicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksIDEpO1xuICAgIH1cbiAgfSxcblxuICBwZ1RleHRTaG9ydDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14oJyArIHJlTW9udGhBYmJyICsgJyktJyArIHJlRGF5bHogKyAnLScgKyByZVllYXIsICdpJyksXG4gICAgbmFtZTogJ3BndGV4dHNob3J0JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIHllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZU5vWWVhcjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVEYXRlTm9ZZWFyLCAnaScpLFxuICAgIG5hbWU6ICdkYXRlbm95ZWFyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVOb1llYXJSZXY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1sgLlxcXFx0LV0qJyArIHJlTW9udGhUZXh0LCAnaScpLFxuICAgIG5hbWU6ICdkYXRlbm95ZWFycmV2JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGRheSwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGlzb1dlZWtEYXk6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLT9XJyArIHJlV2Vla09mWWVhciArICcoPzotPyhbMC03XSkpPycpLFxuICAgIG5hbWU6ICdpc293ZWVrZGF5IHwgaXNvd2VlaycsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgICAgIGRheSA9IGRheSA/ICtkYXkgOiAxO1xuXG4gICAgICBpZiAoIXRoaXMueW1kKCt5ZWFyLCAwLCAxKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIGdldCBkYXkgb2Ygd2VlayBmb3IgSmFuIDFzdFxuICAgICAgdmFyIGRheU9mV2VlayA9IG5ldyBEYXRlKHRoaXMueSwgdGhpcy5tLCB0aGlzLmQpLmdldERheSgpO1xuXG4gICAgICAvLyBhbmQgdXNlIHRoZSBkYXkgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IGZvciBkYXkgMSBvZiB3ZWVrIDFcbiAgICAgIGRheU9mV2VlayA9IDAgLSAoZGF5T2ZXZWVrID4gNCA/IGRheU9mV2VlayAtIDcgOiBkYXlPZldlZWspO1xuXG4gICAgICB0aGlzLnJkICs9IGRheU9mV2VlayArICh3ZWVrIC0gMSkgKiA3ICsgZGF5O1xuICAgIH1cbiAgfSxcblxuICByZWxhdGl2ZVRleHQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHRudW1iZXIgKyAnfCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICcoJyArIHJlUmVsdGV4dHVuaXQgKyAnKScsICdpJyksXG4gICAgbmFtZTogJ3JlbGF0aXZldGV4dCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCByZWxWYWx1ZSwgcmVsVW5pdCkge1xuICAgICAgLy8gdG9kbzogaW1wbGVtZW50IGhhbmRsaW5nIG9mICd0aGlzIHRpbWUtdW5pdCdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdmFyIF9sb29rdXBSZWxhdGl2ZSA9IGxvb2t1cFJlbGF0aXZlKHJlbFZhbHVlKSxcbiAgICAgICAgICBhbW91bnQgPSBfbG9va3VwUmVsYXRpdmUuYW1vdW50LFxuICAgICAgICAgIGJlaGF2aW9yID0gX2xvb2t1cFJlbGF0aXZlLmJlaGF2aW9yO1xuXG4gICAgICBzd2l0Y2ggKHJlbFVuaXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgdGhpcy5ycyArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICB0aGlzLnJpICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLnJoICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodCc6XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodHMnOlxuICAgICAgICBjYXNlICdmb3J0aG5pZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9ydGhuaWdodHMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gYW1vdW50ICogMTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQgKiA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgICAgdGhpcy5ybSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgdGhpcy5yeSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbic6Y2FzZSAnbW9uZGF5JzpcbiAgICAgICAgY2FzZSAndHVlJzpjYXNlICd0dWVzZGF5JzpcbiAgICAgICAgY2FzZSAnd2VkJzpjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICBjYXNlICd0aHUnOmNhc2UgJ3RodXJzZGF5JzpcbiAgICAgICAgY2FzZSAnZnJpJzpjYXNlICdmcmlkYXknOlxuICAgICAgICBjYXNlICdzYXQnOmNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgY2FzZSAnc3VuJzpjYXNlICdzdW5kYXknOlxuICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gbG9va3VwV2Vla2RheShyZWxVbml0LCA3KTtcbiAgICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICAgICAgdGhpcy5yZCArPSAoYW1vdW50ID4gMCA/IGFtb3VudCAtIDEgOiBhbW91bnQpICogNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ3dlZWtkYXlzJzpcbiAgICAgICAgICAvLyB0b2RvXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbGF0aXZlOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXihbKy1dKilbIFxcXFx0XSooXFxcXGQrKScgKyByZVNwYWNlT3B0ICsgJygnICsgcmVSZWx0ZXh0dW5pdCArICd8d2VlayknLCAnaScpLFxuICAgIG5hbWU6ICdyZWxhdGl2ZScsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBzaWducywgcmVsVmFsdWUsIHJlbFVuaXQpIHtcbiAgICAgIHZhciBtaW51c2VzID0gc2lnbnMucmVwbGFjZSgvW14tXS9nLCAnJykubGVuZ3RoO1xuXG4gICAgICB2YXIgYW1vdW50ID0gK3JlbFZhbHVlICogTWF0aC5wb3coLTEsIG1pbnVzZXMpO1xuXG4gICAgICBzd2l0Y2ggKHJlbFVuaXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgdGhpcy5ycyArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICB0aGlzLnJpICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLnJoICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodCc6XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodHMnOlxuICAgICAgICBjYXNlICdmb3J0aG5pZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9ydGhuaWdodHMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gYW1vdW50ICogMTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQgKiA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgICAgdGhpcy5ybSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgdGhpcy5yeSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbic6Y2FzZSAnbW9uZGF5JzpcbiAgICAgICAgY2FzZSAndHVlJzpjYXNlICd0dWVzZGF5JzpcbiAgICAgICAgY2FzZSAnd2VkJzpjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICBjYXNlICd0aHUnOmNhc2UgJ3RodXJzZGF5JzpcbiAgICAgICAgY2FzZSAnZnJpJzpjYXNlICdmcmlkYXknOlxuICAgICAgICBjYXNlICdzYXQnOmNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgY2FzZSAnc3VuJzpjYXNlICdzdW5kYXknOlxuICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gbG9va3VwV2Vla2RheShyZWxVbml0LCA3KTtcbiAgICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICAgICAgdGhpcy5yZCArPSAoYW1vdW50ID4gMCA/IGFtb3VudCAtIDEgOiBhbW91bnQpICogNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ3dlZWtkYXlzJzpcbiAgICAgICAgICAvLyB0b2RvXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRheVRleHQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZURheXRleHQgKyAnKScsICdpJyksXG4gICAgbmFtZTogJ2RheXRleHQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5VGV4dCkge1xuICAgICAgdGhpcy5yZXNldFRpbWUoKTtcbiAgICAgIHRoaXMud2Vla2RheSA9IGxvb2t1cFdlZWtkYXkoZGF5VGV4dCwgMCk7XG5cbiAgICAgIGlmICh0aGlzLndlZWtkYXlCZWhhdmlvciAhPT0gMikge1xuICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbGF0aXZlVGV4dFdlZWs6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICd3ZWVrJywgJ2knKSxcbiAgICBuYW1lOiAncmVsYXRpdmV0ZXh0d2VlaycsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCByZWxUZXh0KSB7XG4gICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDI7XG5cbiAgICAgIHN3aXRjaCAocmVsVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ3RoaXMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgdGhpcy5yZCArPSA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsYXN0JzpcbiAgICAgICAgY2FzZSAncHJldmlvdXMnOlxuICAgICAgICAgIHRoaXMucmQgLT0gNztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTmFOKHRoaXMud2Vla2RheSkpIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5ID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW9udGhGdWxsT3JNb250aEFiYnI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZU1vbnRoRnVsbCArICd8JyArIHJlTW9udGhBYmJyICsgJyknLCAnaScpLFxuICAgIG5hbWU6ICdtb250aGZ1bGwgfCBtb250aGFiYnInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgdGhpcy5kKTtcbiAgICB9XG4gIH0sXG5cbiAgdHpDb3JyZWN0aW9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVR6Q29ycmVjdGlvbiwgJ2knKSxcbiAgICBuYW1lOiAndHpjb3JyZWN0aW9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sodHpDb3JyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lKHByb2Nlc3NUekNvcnJlY3Rpb24odHpDb3JyZWN0aW9uKSk7XG4gICAgfVxuICB9LFxuXG4gIHR6QWJicjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVUekFiYnIpLFxuICAgIG5hbWU6ICd0emFiYnInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgYWJicikge1xuICAgICAgdmFyIG9mZnNldCA9IHR6QWJick9mZnNldHNbYWJici50b0xvd2VyQ2FzZSgpXTtcblxuICAgICAgaWYgKGlzTmFOKG9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy56b25lKG9mZnNldCk7XG4gICAgfVxuICB9LFxuXG4gIGFnbzoge1xuICAgIHJlZ2V4OiAvXmFnby9pLFxuICAgIG5hbWU6ICdhZ28nLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucnkgPSAtdGhpcy5yeTtcbiAgICAgIHRoaXMucm0gPSAtdGhpcy5ybTtcbiAgICAgIHRoaXMucmQgPSAtdGhpcy5yZDtcbiAgICAgIHRoaXMucmggPSAtdGhpcy5yaDtcbiAgICAgIHRoaXMucmkgPSAtdGhpcy5yaTtcbiAgICAgIHRoaXMucnMgPSAtdGhpcy5ycztcbiAgICAgIHRoaXMucmYgPSAtdGhpcy5yZjtcbiAgICB9XG4gIH0sXG5cbiAgeWVhcjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQpLFxuICAgIG5hbWU6ICd5ZWFyNCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyKSB7XG4gICAgICB0aGlzLnkgPSAreWVhcjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICB3aGl0ZXNwYWNlOiB7XG4gICAgcmVnZXg6IC9eWyAuLFxcdF0rLyxcbiAgICBuYW1lOiAnd2hpdGVzcGFjZSdcbiAgICAvLyBkbyBub3RoaW5nXG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVMb25nOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyAndD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kLCAnaScpLFxuICAgIG5hbWU6ICdkYXRlc2hvcnR3aXRodGltZWxvbmcnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVMb25nMTI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF0ZU5vWWVhciArIHJlSG91cjEyICsgJ1s6Ll0nICsgcmVNaW51dGUgKyAnWzouXScgKyByZVNlY29uZGx6ICsgcmVTcGFjZU9wdCArIHJlTWVyaWRpYW4sICdpJyksXG4gICAgbmFtZTogJ2RhdGVzaG9ydHdpdGh0aW1lbG9uZzEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtZXJpZGlhbikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHRoaXMueSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KSAmJiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICBkYXRlU2hvcnRXaXRoVGltZVNob3J0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyAndD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZXNob3J0d2l0aHRpbWVzaG9ydCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVTaG9ydDEyOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyByZUhvdXIxMiArICdbOi5dJyArIHJlTWludXRlbHogKyByZVNwYWNlT3B0ICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZXNob3J0d2l0aHRpbWVzaG9ydDEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKHByb2Nlc3NNZXJpZGlhbigraG91ciwgbWVyaWRpYW4pLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciByZXN1bHRQcm90byA9IHtcbiAgLy8gZGF0ZVxuICB5OiBOYU4sXG4gIG06IE5hTixcbiAgZDogTmFOLFxuICAvLyB0aW1lXG4gIGg6IE5hTixcbiAgaTogTmFOLFxuICBzOiBOYU4sXG4gIGY6IE5hTixcblxuICAvLyByZWxhdGl2ZSBzaGlmdHNcbiAgcnk6IDAsXG4gIHJtOiAwLFxuICByZDogMCxcbiAgcmg6IDAsXG4gIHJpOiAwLFxuICByczogMCxcbiAgcmY6IDAsXG5cbiAgLy8gd2Vla2RheSByZWxhdGVkIHNoaWZ0c1xuICB3ZWVrZGF5OiBOYU4sXG4gIHdlZWtkYXlCZWhhdmlvcjogMCxcblxuICAvLyBmaXJzdCBvciBsYXN0IGRheSBvZiBtb250aFxuICAvLyAwIG5vbmUsIDEgZmlyc3QsIC0xIGxhc3RcbiAgZmlyc3RPckxhc3REYXlPZk1vbnRoOiAwLFxuXG4gIC8vIHRpbWV6b25lIGNvcnJlY3Rpb24gaW4gbWludXRlc1xuICB6OiBOYU4sXG5cbiAgLy8gY291bnRlcnNcbiAgZGF0ZXM6IDAsXG4gIHRpbWVzOiAwLFxuICB6b25lczogMCxcblxuICAvLyBoZWxwZXIgZnVuY3Rpb25zXG4gIHltZDogZnVuY3Rpb24geW1kKHksIG0sIGQpIHtcbiAgICBpZiAodGhpcy5kYXRlcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVzKys7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLm0gPSBtO1xuICAgIHRoaXMuZCA9IGQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHRpbWU6IGZ1bmN0aW9uIHRpbWUoaCwgaSwgcywgZikge1xuICAgIGlmICh0aGlzLnRpbWVzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudGltZXMrKztcbiAgICB0aGlzLmggPSBoO1xuICAgIHRoaXMuaSA9IGk7XG4gICAgdGhpcy5zID0gcztcbiAgICB0aGlzLmYgPSBmO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHJlc2V0VGltZTogZnVuY3Rpb24gcmVzZXRUaW1lKCkge1xuICAgIHRoaXMuaCA9IDA7XG4gICAgdGhpcy5pID0gMDtcbiAgICB0aGlzLnMgPSAwO1xuICAgIHRoaXMuZiA9IDA7XG4gICAgdGhpcy50aW1lcyA9IDA7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgem9uZTogZnVuY3Rpb24gem9uZShtaW51dGVzKSB7XG4gICAgaWYgKHRoaXMuem9uZXMgPD0gMSkge1xuICAgICAgdGhpcy56b25lcysrO1xuICAgICAgdGhpcy56ID0gbWludXRlcztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgdG9EYXRlOiBmdW5jdGlvbiB0b0RhdGUocmVsYXRpdmVUbykge1xuICAgIGlmICh0aGlzLmRhdGVzICYmICF0aGlzLnRpbWVzKSB7XG4gICAgICB0aGlzLmggPSB0aGlzLmkgPSB0aGlzLnMgPSB0aGlzLmYgPSAwO1xuICAgIH1cblxuICAgIC8vIGZpbGwgaG9sZXNcbiAgICBpZiAoaXNOYU4odGhpcy55KSkge1xuICAgICAgdGhpcy55ID0gcmVsYXRpdmVUby5nZXRGdWxsWWVhcigpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLm0pKSB7XG4gICAgICB0aGlzLm0gPSByZWxhdGl2ZVRvLmdldE1vbnRoKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHRoaXMuZCkpIHtcbiAgICAgIHRoaXMuZCA9IHJlbGF0aXZlVG8uZ2V0RGF0ZSgpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLmgpKSB7XG4gICAgICB0aGlzLmggPSByZWxhdGl2ZVRvLmdldEhvdXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHRoaXMuaSkpIHtcbiAgICAgIHRoaXMuaSA9IHJlbGF0aXZlVG8uZ2V0TWludXRlcygpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLnMpKSB7XG4gICAgICB0aGlzLnMgPSByZWxhdGl2ZVRvLmdldFNlY29uZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odGhpcy5mKSkge1xuICAgICAgdGhpcy5mID0gcmVsYXRpdmVUby5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICB9XG5cbiAgICAvLyBhZGp1c3Qgc3BlY2lhbCBlYXJseVxuICAgIHN3aXRjaCAodGhpcy5maXJzdE9yTGFzdERheU9mTW9udGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5kID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICB0aGlzLmQgPSAwO1xuICAgICAgICB0aGlzLm0gKz0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTih0aGlzLndlZWtkYXkpKSB7XG4gICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHJlbGF0aXZlVG8uZ2V0VGltZSgpKTtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIodGhpcy55LCB0aGlzLm0sIHRoaXMuZCk7XG4gICAgICBkYXRlLnNldEhvdXJzKHRoaXMuaCwgdGhpcy5pLCB0aGlzLnMsIHRoaXMuZik7XG5cbiAgICAgIHZhciBkb3cgPSBkYXRlLmdldERheSgpO1xuXG4gICAgICBpZiAodGhpcy53ZWVrZGF5QmVoYXZpb3IgPT09IDIpIHtcbiAgICAgICAgLy8gVG8gbWFrZSBcInRoaXMgd2Vla1wiIHdvcmssIHdoZXJlIHRoZSBjdXJyZW50IGRheSBvZiB3ZWVrIGlzIGEgXCJzdW5kYXlcIlxuICAgICAgICBpZiAoZG93ID09PSAwICYmIHRoaXMud2Vla2RheSAhPT0gMCkge1xuICAgICAgICAgIHRoaXMud2Vla2RheSA9IC02O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gbWFrZSBcInN1bmRheSB0aGlzIHdlZWtcIiB3b3JrLCB3aGVyZSB0aGUgY3VycmVudCBkYXkgb2Ygd2VlayBpcyBub3QgYSBcInN1bmRheVwiXG4gICAgICAgIGlmICh0aGlzLndlZWtkYXkgPT09IDAgJiYgZG93ICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gNztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZCAtPSBkb3c7XG4gICAgICAgIHRoaXMuZCArPSB0aGlzLndlZWtkYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGlmZiA9IHRoaXMud2Vla2RheSAtIGRvdztcblxuICAgICAgICAvLyBzb21lIFBIUCBtYWdpY1xuICAgICAgICBpZiAodGhpcy5yZCA8IDAgJiYgZGlmZiA8IDAgfHwgdGhpcy5yZCA+PSAwICYmIGRpZmYgPD0gLXRoaXMud2Vla2RheUJlaGF2aW9yKSB7XG4gICAgICAgICAgZGlmZiArPSA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud2Vla2RheSA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5kICs9IGRpZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kIC09IDcgLSAoTWF0aC5hYnModGhpcy53ZWVrZGF5KSAtIGRvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndlZWtkYXkgPSBOYU47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRqdXN0IHJlbGF0aXZlXG4gICAgdGhpcy55ICs9IHRoaXMucnk7XG4gICAgdGhpcy5tICs9IHRoaXMucm07XG4gICAgdGhpcy5kICs9IHRoaXMucmQ7XG5cbiAgICB0aGlzLmggKz0gdGhpcy5yaDtcbiAgICB0aGlzLmkgKz0gdGhpcy5yaTtcbiAgICB0aGlzLnMgKz0gdGhpcy5ycztcbiAgICB0aGlzLmYgKz0gdGhpcy5yZjtcblxuICAgIHRoaXMucnkgPSB0aGlzLnJtID0gdGhpcy5yZCA9IDA7XG4gICAgdGhpcy5yaCA9IHRoaXMucmkgPSB0aGlzLnJzID0gdGhpcy5yZiA9IDA7XG5cbiAgICB2YXIgcmVzdWx0ID0gbmV3IERhdGUocmVsYXRpdmVUby5nZXRUaW1lKCkpO1xuICAgIC8vIHNpbmNlIERhdGUgY29uc3RydWN0b3IgdHJlYXRzIHllYXJzIDw9IDk5IGFzIDE5MDArXG4gICAgLy8gaXQgY2FuJ3QgYmUgdXNlZCwgdGh1cyB0aGlzIHdlaXJkIHdheVxuICAgIHJlc3VsdC5zZXRGdWxsWWVhcih0aGlzLnksIHRoaXMubSwgdGhpcy5kKTtcbiAgICByZXN1bHQuc2V0SG91cnModGhpcy5oLCB0aGlzLmksIHRoaXMucywgdGhpcy5mKTtcblxuICAgIC8vIG5vdGU6IHRoaXMgaXMgZG9uZSB0d2ljZSBpbiBQSFBcbiAgICAvLyBlYXJseSB3aGVuIHByb2Nlc3Npbmcgc3BlY2lhbCByZWxhdGl2ZXNcbiAgICAvLyBhbmQgbGF0ZVxuICAgIC8vIHRvZG86IGNoZWNrIGlmIHRoZSBsb2dpYyBjYW4gYmUgcmVkdWNlZFxuICAgIC8vIHRvIGp1c3Qgb25lIHRpbWUgYWN0aW9uXG4gICAgc3dpdGNoICh0aGlzLmZpcnN0T3JMYXN0RGF5T2ZNb250aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXN1bHQuc2V0RGF0ZSgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICByZXN1bHQuc2V0TW9udGgocmVzdWx0LmdldE1vbnRoKCkgKyAxLCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gYWRqdXN0IHRpbWV6b25lXG4gICAgaWYgKCFpc05hTih0aGlzLnopICYmIHJlc3VsdC5nZXRUaW1lem9uZU9mZnNldCgpICE9PSB0aGlzLnopIHtcbiAgICAgIHJlc3VsdC5zZXRVVENGdWxsWWVhcihyZXN1bHQuZ2V0RnVsbFllYXIoKSwgcmVzdWx0LmdldE1vbnRoKCksIHJlc3VsdC5nZXREYXRlKCkpO1xuXG4gICAgICByZXN1bHQuc2V0VVRDSG91cnMocmVzdWx0LmdldEhvdXJzKCksIHJlc3VsdC5nZXRNaW51dGVzKCksIHJlc3VsdC5nZXRTZWNvbmRzKCkgLSB0aGlzLnosIHJlc3VsdC5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJ0b3RpbWUoc3RyLCBub3cpIHtcbiAgLy8gICAgICAgZGlzY3VzcyBhdDogaHR0cHM6Ly9sb2N1dHVzLmlvL3BocC9zdHJ0b3RpbWUvXG4gIC8vICAgICAgb3JpZ2luYWwgYnk6IENhaW8gQXJpZWRlIChodHRwczovL2NhaW9hcmllZGUuY29tKVxuICAvLyAgICAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gICAgICBpbXByb3ZlZCBieTogQ2FpbyBBcmllZGUgKGh0dHBzOi8vY2Fpb2FyaWVkZS5jb20pXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IEEuIE1hdMOtYXMgUXVlemFkYSAoaHR0cHM6Ly9hbWF0aWFzcS5jb20pXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IHByZXV0ZXJcbiAgLy8gICAgICBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHBzOi8vYnJldHQtemFtaXIubWUpXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IE1pcmtvIEZhYmVyXG4gIC8vICAgICAgICAgaW5wdXQgYnk6IERhdmlkXG4gIC8vICAgICAgYnVnZml4ZWQgYnk6IFdhZ25lciBCLiBTb2FyZXNcbiAgLy8gICAgICBidWdmaXhlZCBieTogQXJ0dXIgVGNoZXJueWNoZXZcbiAgLy8gICAgICBidWdmaXhlZCBieTogU3RlcGhhbiBCw7ZzY2gtUGxlcGVsaXRzIChodHRwczovL2dpdGh1Yi5jb20vcGxlcGUpXG4gIC8vIHJlaW1wbGVtZW50ZWQgYnk6IFJhZmHFgiBLdWthd3NraVxuICAvLyAgICAgICAgICAgbm90ZSAxOiBFeGFtcGxlcyBhbGwgaGF2ZSBhIGZpeGVkIHRpbWVzdGFtcCB0byBwcmV2ZW50XG4gIC8vICAgICAgICAgICBub3RlIDE6IHRlc3RzIHRvIGZhaWwgYmVjYXVzZSBvZiB2YXJpYWJsZSB0aW1lKHpvbmVzKVxuICAvLyAgICAgICAgZXhhbXBsZSAxOiBzdHJ0b3RpbWUoJysxIGRheScsIDExMjk2MzMyMDApXG4gIC8vICAgICAgICByZXR1cm5zIDE6IDExMjk3MTk2MDBcbiAgLy8gICAgICAgIGV4YW1wbGUgMjogc3RydG90aW1lKCcrMSB3ZWVrIDIgZGF5cyA0IGhvdXJzIDIgc2Vjb25kcycsIDExMjk2MzMyMDApXG4gIC8vICAgICAgICByZXR1cm5zIDI6IDExMzA0MjUyMDJcbiAgLy8gICAgICAgIGV4YW1wbGUgMzogc3RydG90aW1lKCdsYXN0IG1vbnRoJywgMTEyOTYzMzIwMClcbiAgLy8gICAgICAgIHJldHVybnMgMzogMTEyNzA0MTIwMFxuICAvLyAgICAgICAgZXhhbXBsZSA0OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDArMDAnKVxuICAvLyAgICAgICAgcmV0dXJucyA0OiAxMjQxNDI1ODAwXG4gIC8vICAgICAgICBleGFtcGxlIDU6IHN0cnRvdGltZSgnMjAwOS0wNS0wNCAwODozMDowMCswMjowMCcpXG4gIC8vICAgICAgICByZXR1cm5zIDU6IDEyNDE0MTg2MDBcbiAgLy8gICAgICAgIGV4YW1wbGUgNjogc3RydG90aW1lKCcyMDA5LTA1LTA0IDA4OjMwOjAwIFlXVCcpXG4gIC8vICAgICAgICByZXR1cm5zIDY6IDEyNDE0NTQ2MDBcblxuICBpZiAobm93ID09IG51bGwpIHtcbiAgICBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgfVxuXG4gIC8vIHRoZSBydWxlIG9yZGVyIGlzIGltcG9ydGFudFxuICAvLyBpZiBtdWx0aXBsZSBydWxlcyBtYXRjaCwgdGhlIGxvbmdlc3QgbWF0Y2ggd2luc1xuICAvLyBpZiBtdWx0aXBsZSBydWxlcyBtYXRjaCB0aGUgc2FtZSBzdHJpbmcsIHRoZSBmaXJzdCBtYXRjaCB3aW5zXG4gIHZhciBydWxlcyA9IFtmb3JtYXRzLnllc3RlcmRheSwgZm9ybWF0cy5ub3csIGZvcm1hdHMubm9vbiwgZm9ybWF0cy5taWRuaWdodE9yVG9kYXksIGZvcm1hdHMudG9tb3Jyb3csIGZvcm1hdHMudGltZXN0YW1wLCBmb3JtYXRzLmZpcnN0T3JMYXN0RGF5LCBmb3JtYXRzLmJhY2tPckZyb250T2YsXG4gIC8vIGZvcm1hdHMud2Vla2RheU9mLCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG4gIGZvcm1hdHMudGltZVRpbnkxMiwgZm9ybWF0cy50aW1lU2hvcnQxMiwgZm9ybWF0cy50aW1lTG9uZzEyLCBmb3JtYXRzLm1zc3FsdGltZSwgZm9ybWF0cy50aW1lU2hvcnQyNCwgZm9ybWF0cy50aW1lTG9uZzI0LCBmb3JtYXRzLmlzbzg2MDFsb25nLCBmb3JtYXRzLmdudU5vQ29sb24sIGZvcm1hdHMuaXNvODYwMW5vQ29sb24sIGZvcm1hdHMuYW1lcmljYW5TaG9ydCwgZm9ybWF0cy5hbWVyaWNhbiwgZm9ybWF0cy5pc284NjAxZGF0ZTQsIGZvcm1hdHMuaXNvODYwMWRhdGVTbGFzaCwgZm9ybWF0cy5kYXRlU2xhc2gsIGZvcm1hdHMuZ251RGF0ZVNob3J0T3JJc284NjAxZGF0ZTIsIGZvcm1hdHMuZ251RGF0ZVNob3J0ZXIsIGZvcm1hdHMuZGF0ZUZ1bGwsIGZvcm1hdHMucG9pbnRlZERhdGU0LCBmb3JtYXRzLnBvaW50ZWREYXRlMiwgZm9ybWF0cy5kYXRlTm9EYXksIGZvcm1hdHMuZGF0ZU5vRGF5UmV2LCBmb3JtYXRzLmRhdGVUZXh0dWFsLCBmb3JtYXRzLmRhdGVOb1llYXIsIGZvcm1hdHMuZGF0ZU5vWWVhclJldiwgZm9ybWF0cy5kYXRlTm9Db2xvbiwgZm9ybWF0cy54bWxScGMsIGZvcm1hdHMueG1sUnBjTm9Db2xvbiwgZm9ybWF0cy5zb2FwLCBmb3JtYXRzLndkZHgsIGZvcm1hdHMuZXhpZiwgZm9ybWF0cy5wZ3lkb3RkLCBmb3JtYXRzLmlzb1dlZWtEYXksIGZvcm1hdHMucGdUZXh0U2hvcnQsIGZvcm1hdHMucGdUZXh0UmV2ZXJzZSwgZm9ybWF0cy5jbGYsIGZvcm1hdHMueWVhcjQsIGZvcm1hdHMuYWdvLCBmb3JtYXRzLmRheVRleHQsIGZvcm1hdHMucmVsYXRpdmVUZXh0V2VlaywgZm9ybWF0cy5yZWxhdGl2ZVRleHQsIGZvcm1hdHMubW9udGhGdWxsT3JNb250aEFiYnIsIGZvcm1hdHMudHpDb3JyZWN0aW9uLCBmb3JtYXRzLnR6QWJiciwgZm9ybWF0cy5kYXRlU2hvcnRXaXRoVGltZVNob3J0MTIsIGZvcm1hdHMuZGF0ZVNob3J0V2l0aFRpbWVMb25nMTIsIGZvcm1hdHMuZGF0ZVNob3J0V2l0aFRpbWVTaG9ydCwgZm9ybWF0cy5kYXRlU2hvcnRXaXRoVGltZUxvbmcsIGZvcm1hdHMucmVsYXRpdmUsIGZvcm1hdHMud2hpdGVzcGFjZV07XG5cbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUocmVzdWx0UHJvdG8pO1xuXG4gIHdoaWxlIChzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGxvbmdlc3RNYXRjaCA9IG51bGw7XG4gICAgdmFyIGZpbmFsUnVsZSA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGZvcm1hdCA9IHJ1bGVzW2ldO1xuXG4gICAgICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2goZm9ybWF0LnJlZ2V4KTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGlmICghbG9uZ2VzdE1hdGNoIHx8IG1hdGNoWzBdLmxlbmd0aCA+IGxvbmdlc3RNYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgICBsb25nZXN0TWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgICBmaW5hbFJ1bGUgPSBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZpbmFsUnVsZSB8fCBmaW5hbFJ1bGUuY2FsbGJhY2sgJiYgZmluYWxSdWxlLmNhbGxiYWNrLmFwcGx5KHJlc3VsdCwgbG9uZ2VzdE1hdGNoKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdHIgPSBzdHIuc3Vic3RyKGxvbmdlc3RNYXRjaFswXS5sZW5ndGgpO1xuICAgIGZpbmFsUnVsZSA9IG51bGw7XG4gICAgbG9uZ2VzdE1hdGNoID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHJlc3VsdC50b0RhdGUobmV3IERhdGUobm93ICogMTAwMCkpIC8gMTAwMCk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RydG90aW1lLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmlfZ2V0KHZhcm5hbWUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvaW5pX2dldC9cbiAgLy8gb3JpZ2luYWwgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyAgICAgIG5vdGUgMTogVGhlIGluaSB2YWx1ZXMgbXVzdCBiZSBzZXQgYnkgaW5pX3NldCBvciBtYW51YWxseSB3aXRoaW4gYW4gaW5pIGZpbGVcbiAgLy8gICBleGFtcGxlIDE6IGluaV9zZXQoJ2RhdGUudGltZXpvbmUnLCAnQXNpYS9Ib25nX0tvbmcnKVxuICAvLyAgIGV4YW1wbGUgMTogaW5pX2dldCgnZGF0ZS50aW1lem9uZScpXG4gIC8vICAgcmV0dXJucyAxOiAnQXNpYS9Ib25nX0tvbmcnXG5cbiAgdmFyICRnbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbiAgJGdsb2JhbC4kbG9jdXR1cyA9ICRnbG9iYWwuJGxvY3V0dXMgfHwge307XG4gIHZhciAkbG9jdXR1cyA9ICRnbG9iYWwuJGxvY3V0dXM7XG4gICRsb2N1dHVzLnBocCA9ICRsb2N1dHVzLnBocCB8fCB7fTtcbiAgJGxvY3V0dXMucGhwLmluaSA9ICRsb2N1dHVzLnBocC5pbmkgfHwge307XG5cbiAgaWYgKCRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0gJiYgJGxvY3V0dXMucGhwLmluaVt2YXJuYW1lXS5sb2NhbF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0ubG9jYWxfdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuICRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0ubG9jYWxfdmFsdWU7XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5pX2dldC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RybGVuKHN0cmluZykge1xuICAvLyAgZGlzY3VzcyBhdDogaHR0cHM6Ly9sb2N1dHVzLmlvL3BocC9zdHJsZW4vXG4gIC8vIG9yaWdpbmFsIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gaW1wcm92ZWQgYnk6IFNha2ltb3JpXG4gIC8vIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gICAgaW5wdXQgYnk6IEtpcmsgU3Ryb2JlY2tcbiAgLy8gYnVnZml4ZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcbiAgLy8gIHJldmlzZWQgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyAgICAgIG5vdGUgMTogTWF5IGxvb2sgbGlrZSBvdmVya2lsbCwgYnV0IGluIG9yZGVyIHRvIGJlIHRydWx5IGZhaXRoZnVsIHRvIGhhbmRsaW5nIGFsbCBVbmljb2RlXG4gIC8vICAgICAgbm90ZSAxOiBjaGFyYWN0ZXJzIGFuZCB0byB0aGlzIGZ1bmN0aW9uIGluIFBIUCB3aGljaCBkb2VzIG5vdCBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4gIC8vICAgICAgbm90ZSAxOiBidXQgY291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgc29tZXRoaW5nIGxpa2UgdGhpcyBpcyByZWFsbHkgbmVjZXNzYXJ5LlxuICAvLyAgIGV4YW1wbGUgMTogc3RybGVuKCdLZXZpbiB2YW4gWm9ubmV2ZWxkJylcbiAgLy8gICByZXR1cm5zIDE6IDE5XG4gIC8vICAgZXhhbXBsZSAyOiBpbmlfc2V0KCd1bmljb2RlLnNlbWFudGljcycsICdvbicpXG4gIC8vICAgZXhhbXBsZSAyOiBzdHJsZW4oJ0FcXHVkODdlXFx1ZGMwNFonKVxuICAvLyAgIHJldHVybnMgMjogM1xuXG4gIHZhciBzdHIgPSBzdHJpbmcgKyAnJztcblxuICB2YXIgaW5pVmFsID0gKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUoJy4uL2luZm8vaW5pX2dldCcpKCd1bmljb2RlLnNlbWFudGljcycpIDogdW5kZWZpbmVkKSB8fCAnb2ZmJztcbiAgaWYgKGluaVZhbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gc3RyLmxlbmd0aDtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIGxndGggPSAwO1xuXG4gIHZhciBnZXRXaG9sZUNoYXIgPSBmdW5jdGlvbiBnZXRXaG9sZUNoYXIoc3RyLCBpKSB7XG4gICAgdmFyIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB2YXIgbmV4dCA9ICcnO1xuICAgIHZhciBwcmV2ID0gJyc7XG4gICAgaWYgKGNvZGUgPj0gMHhEODAwICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAvLyBIaWdoIHN1cnJvZ2F0ZSAoY291bGQgY2hhbmdlIGxhc3QgaGV4IHRvIDB4REI3RiB0b1xuICAgICAgLy8gdHJlYXQgaGlnaCBwcml2YXRlIHN1cnJvZ2F0ZXMgYXMgc2luZ2xlIGNoYXJhY3RlcnMpXG4gICAgICBpZiAoc3RyLmxlbmd0aCA8PSBpICsgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hpZ2ggc3Vycm9nYXRlIHdpdGhvdXQgZm9sbG93aW5nIGxvdyBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIG5leHQgPSBzdHIuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dCA8IDB4REMwMCB8fCBuZXh0ID4gMHhERkZGKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSGlnaCBzdXJyb2dhdGUgd2l0aG91dCBmb2xsb3dpbmcgbG93IHN1cnJvZ2F0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoaSkgKyBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMHhEQzAwICYmIGNvZGUgPD0gMHhERkZGKSB7XG4gICAgICAvLyBMb3cgc3Vycm9nYXRlXG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvdyBzdXJyb2dhdGUgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIHByZXYgPSBzdHIuY2hhckNvZGVBdChpIC0gMSk7XG4gICAgICBpZiAocHJldiA8IDB4RDgwMCB8fCBwcmV2ID4gMHhEQkZGKSB7XG4gICAgICAgIC8vIChjb3VsZCBjaGFuZ2UgbGFzdCBoZXggdG8gMHhEQjdGIHRvIHRyZWF0IGhpZ2ggcHJpdmF0ZSBzdXJyb2dhdGVzXG4gICAgICAgIC8vIGFzIHNpbmdsZSBjaGFyYWN0ZXJzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvdyBzdXJyb2dhdGUgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGNhbiBwYXNzIG92ZXIgbG93IHN1cnJvZ2F0ZXMgbm93IGFzIHRoZSBzZWNvbmRcbiAgICAgIC8vIGNvbXBvbmVudCBpbiBhIHBhaXIgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLmNoYXJBdChpKTtcbiAgfTtcblxuICBmb3IgKGkgPSAwLCBsZ3RoID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChnZXRXaG9sZUNoYXIoc3RyLCBpKSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBZGFwdCB0aGlzIGxpbmUgYXQgdGhlIHRvcCBvZiBhbnkgbG9vcCwgcGFzc2luZyBpbiB0aGUgd2hvbGUgc3RyaW5nIGFuZFxuICAgIC8vIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhbmQgcmV0dXJuaW5nIGEgdmFyaWFibGUgdG8gcmVwcmVzZW50IHRoZSBpbmRpdmlkdWFsIGNoYXJhY3RlcjtcbiAgICAvLyBwdXJwb3NlIGlzIHRvIHRyZWF0IHRoZSBmaXJzdCBwYXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgYXMgdGhlIHdob2xlIGNoYXJhY3RlciBhbmQgdGhlblxuICAgIC8vIGlnbm9yZSB0aGUgc2Vjb25kIHBhcnRcbiAgICBsZ3RoKys7XG4gIH1cblxuICByZXR1cm4gbGd0aDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJsZW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzX251bWVyaWMobWl4ZWRWYXIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvaXNfbnVtZXJpYy9cbiAgLy8gb3JpZ2luYWwgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHBzOi8va3Z6LmlvKVxuICAvLyBpbXByb3ZlZCBieTogRGF2aWRcbiAgLy8gaW1wcm92ZWQgYnk6IHRhaXRoXG4gIC8vIGJ1Z2ZpeGVkIGJ5OiBUaW0gZGUgS29uaW5nXG4gIC8vIGJ1Z2ZpeGVkIGJ5OiBXZWJEZXZIb2JvIChodHRwczovL3dlYmRldmhvYm8uYmxvZ3Nwb3QuY29tLylcbiAgLy8gYnVnZml4ZWQgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyBidWdmaXhlZCBieTogRGVuaXMgQ2hlbnUgKGh0dHBzOi8vc2hub3VsbGUubmV0KVxuICAvLyAgIGV4YW1wbGUgMTogaXNfbnVtZXJpYygxODYuMzEpXG4gIC8vICAgcmV0dXJucyAxOiB0cnVlXG4gIC8vICAgZXhhbXBsZSAyOiBpc19udW1lcmljKCdLZXZpbiB2YW4gWm9ubmV2ZWxkJylcbiAgLy8gICByZXR1cm5zIDI6IGZhbHNlXG4gIC8vICAgZXhhbXBsZSAzOiBpc19udW1lcmljKCcgKzE4Ni4zMWUyJylcbiAgLy8gICByZXR1cm5zIDM6IHRydWVcbiAgLy8gICBleGFtcGxlIDQ6IGlzX251bWVyaWMoJycpXG4gIC8vICAgcmV0dXJucyA0OiBmYWxzZVxuICAvLyAgIGV4YW1wbGUgNTogaXNfbnVtZXJpYyhbXSlcbiAgLy8gICByZXR1cm5zIDU6IGZhbHNlXG4gIC8vICAgZXhhbXBsZSA2OiBpc19udW1lcmljKCcxICcpXG4gIC8vICAgcmV0dXJucyA2OiBmYWxzZVxuXG4gIHZhciB3aGl0ZXNwYWNlID0gWycgJywgJ1xcbicsICdcXHInLCAnXFx0JywgJ1xcZicsICdcXHgwYicsICdcXHhhMCcsICdcXHUyMDAwJywgJ1xcdTIwMDEnLCAnXFx1MjAwMicsICdcXHUyMDAzJywgJ1xcdTIwMDQnLCAnXFx1MjAwNScsICdcXHUyMDA2JywgJ1xcdTIwMDcnLCAnXFx1MjAwOCcsICdcXHUyMDA5JywgJ1xcdTIwMEEnLCAnXFx1MjAwQicsICdcXHUyMDI4JywgJ1xcdTIwMjknLCAnXFx1MzAwMCddLmpvaW4oJycpO1xuXG4gIC8vIEB0b2RvOiBCcmVhayB0aGlzIHVwIHVzaW5nIG1hbnkgc2luZ2xlIGNvbmRpdGlvbnMgd2l0aCBlYXJseSByZXR1cm5zXG4gIHJldHVybiAodHlwZW9mIG1peGVkVmFyID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbWl4ZWRWYXIgPT09ICdzdHJpbmcnICYmIHdoaXRlc3BhY2UuaW5kZXhPZihtaXhlZFZhci5zbGljZSgtMSkpID09PSAtMSkgJiYgbWl4ZWRWYXIgIT09ICcnICYmICFpc05hTihtaXhlZFZhcik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbnVtZXJpYy5qcy5tYXAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKiFcbiAqIExhcmF2ZWwgSmF2YXNjcmlwdCBWYWxpZGF0aW9uXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3Byb2VuZ3NvZnQvbGFyYXZlbC1qc3ZhbGlkYXRpb25cbiAqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgYnkgdmFsaWRhdG9yc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNyBQcm9lbmdzb2Z0XG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgc3RybGVuIGZyb20gJ2xvY3V0dXMvcGhwL3N0cmluZ3Mvc3RybGVuJztcbmltcG9ydCBhcnJheV9kaWZmIGZyb20gJ2xvY3V0dXMvcGhwL2FycmF5L2FycmF5X2RpZmYnO1xuaW1wb3J0IHN0cnRvdGltZSBmcm9tICdsb2N1dHVzL3BocC9kYXRldGltZS9zdHJ0b3RpbWUnO1xuaW1wb3J0IGlzX251bWVyaWMgZnJvbSAnbG9jdXR1cy9waHAvdmFyL2lzX251bWVyaWMnO1xuXG4kLmV4dGVuZCh0cnVlLCBsYXJhdmVsVmFsaWRhdGlvbiwge1xuXG4gICAgaGVscGVyczoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1lcmljIHJ1bGVzXG4gICAgICAgICAqL1xuICAgICAgICBudW1lcmljUnVsZXM6IFsnSW50ZWdlcicsICdOdW1lcmljJ10sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBmaWxlIGlucHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZmllbGRPYmpcbiAgICAgICAgICogQHBhcmFtIGluZGV4XG4gICAgICAgICAqIEByZXR1cm5zIHt7ZmlsZTogKiwgZXh0ZW5zaW9uOiBzdHJpbmcsIHNpemU6IG51bWJlcn19XG4gICAgICAgICAqL1xuICAgICAgICBmaWxlaW5mbzogZnVuY3Rpb24gKGZpZWxkT2JqLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIEZpbGVOYW1lID0gZmllbGRPYmoudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcgPyBpbmRleCA6IDA7XG4gICAgICAgICAgICBpZiAoIGZpZWxkT2JqLmZpbGVzICE9PSBudWxsICkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmouZmlsZXNbaW5kZXhdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogRmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb246IEZpbGVOYW1lLnN1YnN0cihGaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWVsZE9iai5maWxlc1tpbmRleF0uc2l6ZSAvIDEwMjQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZE9iai5maWxlc1tpbmRleF0udHlwZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBzZWxlY3RvcnMgZm9yIHRoIHNwZWNpZmllZCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG5hbWVzXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgIGlmICghIHRoaXMuaXNBcnJheShuYW1lcykpICB7XG4gICAgICAgICAgICAgICAgbmFtZXMgPSBbbmFtZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2goXCJbbmFtZT0nXCIgKyBuYW1lc1tpXSArIFwiJ11cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3Iuam9pbigpO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIG51bWVyaWMgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgaGFzTnVtZXJpY1J1bGVzOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzUnVsZXMoZWxlbWVudCwgdGhpcy5udW1lcmljUnVsZXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayBpZiBlbGVtZW50IGhhcyBwYXNzZWQgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBydWxlc1xuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGhhc1J1bGVzOiBmdW5jdGlvbiAoZWxlbWVudCwgcnVsZXMpIHtcblxuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9ICQuZGF0YShlbGVtZW50LmZvcm0sIFwidmFsaWRhdG9yXCIpO1xuICAgICAgICAgICAgdmFyIGxpc3RSdWxlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdmFsaWRhdG9yLmFycmF5UnVsZXNDYWNoZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5hbWUgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goY2FjaGVbZWxlbWVudC5uYW1lXSwgZnVuY3Rpb24gKGluZGV4LCBhcnJheVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdFJ1bGVzLnB1c2goYXJyYXlSdWxlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5hbWUgaW4gdmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgbGlzdFJ1bGVzLnB1c2godmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzW2VsZW1lbnQubmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJC5lYWNoKGxpc3RSdWxlcywgZnVuY3Rpb24oaW5kZXgsb2JqUnVsZXMpe1xuICAgICAgICAgICAgICAgIGlmICgnbGFyYXZlbFZhbGlkYXRpb24nIGluIG9ialJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfcnVsZXM9b2JqUnVsZXMubGFyYXZlbFZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KF9ydWxlc1tpXVswXSxydWxlcykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiB0aGUgc3RyaW5nIGxlbmd0aCB1c2luZyBQSFAgZnVuY3Rpb24uXG4gICAgICAgICAqIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5zdHJsZW4ucGhwXG4gICAgICAgICAqIGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL3N0cmxlbi9cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHN0cmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgc3RybGVuOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RybGVuKHN0cmluZyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGRlcGVuZGluZyBvZiBoaXMgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9ialxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHJldHVybnMgaW50XG4gICAgICAgICAqL1xuICAgICAgICBnZXRTaXplOiBmdW5jdGlvbiBnZXRTaXplKG9iaiwgZWxlbWVudCwgdmFsdWUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTnVtZXJpY1J1bGVzKGVsZW1lbnQpICYmIHRoaXMuaXNfbnVtZXJpYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KE1hdGguZmxvb3IodGhpcy5maWxlaW5mbyhlbGVtZW50KS5zaXplKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuc3RybGVuKHZhbHVlKSk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJuIHNwZWNpZmllZCBydWxlIGZyb20gZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIGVsZW1lbnRcbiAgICAgICAgICogQHJldHVybnMgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBnZXRMYXJhdmVsVmFsaWRhdGlvbjogZnVuY3Rpb24ocnVsZSwgZWxlbWVudCkge1xuXG4gICAgICAgICAgICB2YXIgZm91bmQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAkLmVhY2goJC52YWxpZGF0b3Iuc3RhdGljUnVsZXMoZWxlbWVudCksIGZ1bmN0aW9uKGtleSwgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5PT09XCJsYXJhdmVsVmFsaWRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICQuZWFjaChydWxlcywgZnVuY3Rpb24gKGksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF09PT1ydWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQ9dmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiBoZSB0aW1lc3RhbXAgb2YgdmFsdWUgcGFzc2VkIHVzaW5nIGZvcm1hdCBvciBkZWZhdWx0IGZvcm1hdCBpbiBlbGVtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbnxpbnR9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJzZVRpbWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XG5cbiAgICAgICAgICAgIHZhciB0aW1lVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBmbXQgPSBuZXcgRGF0ZUZvcm1hdHRlcigpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGVSdWxlID0gdGhpcy5nZXRMYXJhdmVsVmFsaWRhdGlvbignRGF0ZUZvcm1hdCcsIGZvcm1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVSdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZGF0ZVJ1bGVbMV1bMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRpbWVWYWx1ZSA9IHRoaXMuc3RydG90aW1lKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZVZhbHVlID0gZm10LnBhcnNlRGF0ZSh2YWx1ZSwgZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBpZiAodGltZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiBmbXQuZm9ybWF0RGF0ZSh0aW1lVmFsdWUsIGZvcm1hdCkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVWYWx1ZSA9IE1hdGgucm91bmQoKHRpbWVWYWx1ZS5nZXRUaW1lKCkgLyAxMDAwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wYXJlIGEgZ2l2ZW4gZGF0ZSBhZ2FpbnN0IGFub3RoZXIgdXNpbmcgYW4gb3BlcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0b3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgICAgICogQHBhcmFtIG9wZXJhdG9yXG4gICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBjb21wYXJlRGF0ZXM6IGZ1bmN0aW9uICh2YWxpZGF0b3IsIHZhbHVlLCBlbGVtZW50LCBwYXJhbXMsIG9wZXJhdG9yKSB7XG5cbiAgICAgICAgICAgIHZhciB0aW1lQ29tcGFyZSA9IHRoaXMucGFyc2VUaW1lKHBhcmFtcyk7XG5cbiAgICAgICAgICAgIGlmICghdGltZUNvbXBhcmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kZXBlbmRlbnRFbGVtZW50KHZhbGlkYXRvciwgZWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aW1lQ29tcGFyZSA9IHRoaXMucGFyc2VUaW1lKHZhbGlkYXRvci5lbGVtZW50VmFsdWUodGFyZ2V0KSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRpbWVWYWx1ZSA9IHRoaXMucGFyc2VUaW1lKHZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0aW1lVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVmFsdWUgPCB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVWYWx1ZSA8PSB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlID09PSB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlID4gdGltZUNvbXBhcmU7XG5cbiAgICAgICAgICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVmFsdWUgPj0gdGltZUNvbXBhcmU7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdG9yLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGludGVsbGlnZW50bHkgZ3Vlc3MgdGhlIGRhdGUgYnkgY2xvc2VseSBtYXRjaGluZyB0aGUgc3BlY2lmaWMgZm9ybWF0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAgICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICAgICAgICovXG4gICAgICAgIGd1ZXNzRGF0ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIHZhciBmbXQgPSBuZXcgRGF0ZUZvcm1hdHRlcigpO1xuICAgICAgICAgICAgcmV0dXJuIGZtdC5ndWVzc0RhdGUodmFsdWUsIGZvcm1hdClcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBVbml4IHRpbWVzdGFtcCBiYXNlZCBvbiBQSFAgZnVuY3Rpb24gc3Ryb3RvdGltZS5cbiAgICAgICAgICogaHR0cDovL3BocC5uZXQvbWFudWFsL2VzL2Z1bmN0aW9uLnN0cnRvdGltZS5waHBcbiAgICAgICAgICogaHR0cDovL3BocGpzLm9yZy9mdW5jdGlvbnMvc3RydG90aW1lL1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGV4dFxuICAgICAgICAgKiBAcGFyYW0gbm93XG4gICAgICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RydG90aW1lOiBmdW5jdGlvbiAodGV4dCwgbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RydG90aW1lKHRleHQsIG5vdylcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpZiB2YWx1ZSBpcyBudW1lcmljLlxuICAgICAgICAgKiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZXMvdmFyLmlzX251bWVyaWMucGhwXG4gICAgICAgICAqIGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL2lzX251bWVyaWMvXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBtaXhlZF92YXJcbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBpc19udW1lcmljOiBmdW5jdGlvbiAobWl4ZWRfdmFyKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfbnVtZXJpYyhtaXhlZF92YXIpXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIG9mIHR5cGUgQXJyYXkuXG4gICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2lzQXJyYXkjUG9seWZpbGxcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGFyZ1xuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzQXJyYXk6IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEFycmF5IGRpZmYgYmFzZWQgb24gUEhQIGZ1bmN0aW9uIGFycmF5X2RpZmYuXG4gICAgICAgICAqIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lcy9mdW5jdGlvbi5hcnJheV9kaWZmLnBocFxuICAgICAgICAgKiBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9hcnJheV9kaWZmL1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gYXJyMVxuICAgICAgICAgKiBAcGFyYW0gYXJyMlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGFycmF5RGlmZjogZnVuY3Rpb24gKGFycjEsIGFycjIpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheV9kaWZmKGFycjEsIGFycjIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHR3byBhcnJheXMgYXJlIGVxdWFsIHRvIG9uZSBhbm90aGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gYXJyMVxuICAgICAgICAgKiBAcGFyYW0gYXJyMlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGFycmF5RXF1YWxzOiBmdW5jdGlvbiAoYXJyMSwgYXJyMikge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5pc0FycmF5KGFycjEpIHx8ICEgdGhpcy5pc0FycmF5KGFycjIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gJC5pc0VtcHR5T2JqZWN0KHRoaXMuYXJyYXlEaWZmKGFycjEsIGFycjIpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFrZXMgZWxlbWVudCBkZXBlbmRhbnQgZnJvbSBvdGhlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcGVuZGVudEVsZW1lbnQ6IGZ1bmN0aW9uKHZhbGlkYXRvciwgZWxlbWVudCwgbmFtZSkge1xuXG4gICAgICAgICAgICB2YXIgZWw9dmFsaWRhdG9yLmZpbmRCeU5hbWUobmFtZSk7XG5cbiAgICAgICAgICAgIGlmICggZWxbMF0hPT11bmRlZmluZWQgICYmIHZhbGlkYXRvci5zZXR0aW5ncy5vbmZvY3Vzb3V0ICkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9ICdibHVyJztcbiAgICAgICAgICAgICAgICBpZiAoZWxbMF0udGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHxcbiAgICAgICAgICAgICAgICAgICAgZWxbMF0udGFnTmFtZSA9PT0gJ09QVElPTicgfHxcbiAgICAgICAgICAgICAgICAgICAgZWxbMF0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fFxuICAgICAgICAgICAgICAgICAgICBlbFswXS50eXBlID09PSAncmFkaW8nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gJ2NsaWNrJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcnVsZU5hbWUgPSAnLnZhbGlkYXRlLWxhcmF2ZWxWYWxpZGF0aW9uJztcbiAgICAgICAgICAgICAgICBlbC5vZmYoIHJ1bGVOYW1lIClcbiAgICAgICAgICAgICAgICAgICAgLm9mZihldmVudCArIHJ1bGVOYW1lICsgJy0nICsgZWxlbWVudC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAub24oIGV2ZW50ICsgcnVsZU5hbWUgKyAnLScgKyBlbGVtZW50Lm5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCggZWxlbWVudCApLnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxbMF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBlcnJvciBBamF4IHJlc3BvbnNlIGFuZCBnZXRzIHRoZSBtZXNzYWdlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2VFcnJvclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHZhciBuZXdSZXNwb25zZSA9IFsnV2hvb3BzLCBsb29rcyBsaWtlIHNvbWV0aGluZyB3ZW50IHdyb25nLiddO1xuICAgICAgICAgICAgaWYgKCdyZXNwb25zZVRleHQnIGluIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0Lm1hdGNoKC88aDFcXHMqPiguKik8XFwvaDFcXHMqPi9pKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FycmF5KGVycm9yTXNnKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdSZXNwb25zZSA9IFtlcnJvck1zZ1sxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld1Jlc3BvbnNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFc2NhcGUgc3RyaW5nIHRvIHVzZSBhcyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzdHJcbiAgICAgICAgICogQHJldHVybnMgc3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBlc2NhcGVSZWdFeHA6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXF5cXCRcXHxdL2csIFwiXFxcXCQmXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZSBSZWdFeHAgZnJvbSB3aWxkY2FyZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgICAgICAgKi9cbiAgICAgICAgcmVnZXhGcm9tV2lsZGNhcmQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB2YXIgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnWypdJyk7XG4gICAgICAgICAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA9PT0gMSkgbmFtZVBhcnRzLnB1c2goJycpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyBuYW1lUGFydHMubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFyYXZlbFZhbGlkYXRpb24uaGVscGVycy5lc2NhcGVSZWdFeHAoeClcbiAgICAgICAgICAgIH0pLmpvaW4oJ1xcXFxbW15cXFxcXV0qXFxcXF0nKSArICckJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1lcmdlIGFkZGl0aW9uYWwgbGFyYXZlbCB2YWxpZGF0aW9uIHJ1bGVzIGludG8gdGhlIGN1cnJlbnQgcnVsZSBzZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBydWxlc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UnVsZXNcbiAgICAgICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIG1lcmdlUnVsZXM6IGZ1bmN0aW9uIChydWxlcywgbmV3UnVsZXMpIHtcbiAgICAgICAgICAgIHZhciBydWxlc0xpc3QgPSB7XG4gICAgICAgICAgICAgICAgJ2xhcmF2ZWxWYWxpZGF0aW9uJzogbmV3UnVsZXMubGFyYXZlbFZhbGlkYXRpb24gfHwgW10sXG4gICAgICAgICAgICAgICAgJ2xhcmF2ZWxWYWxpZGF0aW9uUmVtb3RlJzogbmV3UnVsZXMubGFyYXZlbFZhbGlkYXRpb25SZW1vdGUgfHwgW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBydWxlc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZXNMaXN0W2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZXNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBydWxlc1trZXldID0gW107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcnVsZXNba2V5XSA9IHJ1bGVzW2tleV0uY29uY2F0KHJ1bGVzTGlzdFtrZXldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIVE1MIGVudGl0eSBlbmNvZGUgYSBzdHJpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzdHJpbmdcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIGVuY29kZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYvPicpLnRleHQoc3RyaW5nKS5odG1sKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb2t1cCBuYW1lIGluIGFuIGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgaW4gZG90IG5vdGF0aW9uIGZvcm1hdC5cbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBmaW5kQnlBcnJheU5hbWU6IGZ1bmN0aW9uICh2YWxpZGF0b3IsIG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBzcU5hbWUgPSBuYW1lLnJlcGxhY2UoL1xcLihbXlxcLl0rKS9nLCAnWyQxXScpLFxuICAgICAgICAgICAgICAgIGxvb2t1cHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZG90IHRvIHNxdWFyZSBicmFja2V0cy4gZS5nLiBmb28uYmFyLjAgYmVjb21lcyBmb29bYmFyXVswXVxuICAgICAgICAgICAgICAgICAgICBzcU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBbXSB0byB0aGUgbmFtZSBlLmcuIGZvbyBiZWNvbWVzIGZvb1tdIG9yIGZvby5iYXIuMCBiZWNvbWVzIGZvb1tiYXJdWzBdW11cbiAgICAgICAgICAgICAgICAgICAgc3FOYW1lICsgJ1tdJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGtleSBmcm9tIGxhc3QgYXJyYXkgZS5nLiBmb29bYmFyXVswXSBiZWNvbWVzIGZvb1tiYXJdW11cbiAgICAgICAgICAgICAgICAgICAgc3FOYW1lLnJlcGxhY2UoLyguKilcXFsoLiopXFxdJC9nLCAnJDFbXScpXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb29rdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB2YWxpZGF0b3IuZmluZEJ5TmFtZShsb29rdXBzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICQobnVsbCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF0dGVtcHQgdG8gZmluZCBhbiBlbGVtZW50IGluIHRoZSBET00gbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUuXG4gICAgICAgICAqIEV4YW1wbGUgbmFtZXMgaW5jbHVkZTpcbiAgICAgICAgICogICAgLSBkb21haW4uMCB3aGljaCBtYXRjaGVzIGRvbWFpbltdXG4gICAgICAgICAqICAgIC0gY3VzdG9tZmllbGQuMyB3aGljaCBtYXRjaGVzIGN1c3RvbWZpZWxkWzNdXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0b3JcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBmaW5kQnlOYW1lOiBmdW5jdGlvbiAodmFsaWRhdG9yLCBuYW1lKSB7XG4gICAgICAgICAgICAvLyBFeGFjdCBtYXRjaC5cbiAgICAgICAgICAgIHZhciBlbGVtID0gdmFsaWRhdG9yLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmQgbmFtZSBpbiBkYXRhLCB1c2luZyBkb3Qgbm90YXRpb24uXG4gICAgICAgICAgICB2YXIgZGVsaW0gPSAnLicsXG4gICAgICAgICAgICAgICAgcGFydHMgID0gbmFtZS5zcGxpdChkZWxpbSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlY29uc3RydWN0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGk7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkLnB1c2gocGFydHNbY10pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVsZW0gPSB0aGlzLmZpbmRCeUFycmF5TmFtZSh2YWxpZGF0b3IsIHJlY29uc3RydWN0ZWQuam9pbihkZWxpbSkpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJChudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgaXQncyBhbiBhcnJheSBlbGVtZW50LCBnZXQgYWxsIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcmV0dXJucyB7KnxzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBhbGxFbGVtZW50VmFsdWVzOiBmdW5jdGlvbiAodmFsaWRhdG9yLCBlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5uYW1lLmluZGV4T2YoJ1tdJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5maW5kQnlOYW1lKGVsZW1lbnQubmFtZSkubWFwKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IuZWxlbWVudFZhbHVlKGUpO1xuICAgICAgICAgICAgICAgIH0pLmdldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLmVsZW1lbnRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sIm5hbWVzIjpbInN0cmxlbiIsImFycmF5X2RpZmYiLCJzdHJ0b3RpbWUiLCJpc19udW1lcmljIiwiJCIsImV4dGVuZCIsImxhcmF2ZWxWYWxpZGF0aW9uIiwiaGVscGVycyIsIm51bWVyaWNSdWxlcyIsImZpbGVpbmZvIiwiZmllbGRPYmoiLCJpbmRleCIsIkZpbGVOYW1lIiwidmFsdWUiLCJmaWxlcyIsImZpbGUiLCJleHRlbnNpb24iLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsInNpemUiLCJ0eXBlIiwic2VsZWN0b3IiLCJuYW1lcyIsImlzQXJyYXkiLCJpIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJoYXNOdW1lcmljUnVsZXMiLCJlbGVtZW50IiwiaGFzUnVsZXMiLCJydWxlcyIsImZvdW5kIiwidmFsaWRhdG9yIiwiZGF0YSIsImZvcm0iLCJsaXN0UnVsZXMiLCJjYWNoZSIsImFycmF5UnVsZXNDYWNoZSIsIm5hbWUiLCJlYWNoIiwiYXJyYXlSdWxlIiwic2V0dGluZ3MiLCJvYmpSdWxlcyIsIl9ydWxlcyIsImluQXJyYXkiLCJzdHJpbmciLCJnZXRTaXplIiwib2JqIiwicGFyc2VGbG9hdCIsIk1hdGgiLCJmbG9vciIsImdldExhcmF2ZWxWYWxpZGF0aW9uIiwicnVsZSIsInVuZGVmaW5lZCIsInN0YXRpY1J1bGVzIiwia2V5IiwicGFyc2VUaW1lIiwiZm9ybWF0IiwidGltZVZhbHVlIiwiZm10IiwiRGF0ZUZvcm1hdHRlciIsImRhdGVSdWxlIiwicGFyc2VEYXRlIiwiRGF0ZSIsImZvcm1hdERhdGUiLCJyb3VuZCIsImdldFRpbWUiLCJjb21wYXJlRGF0ZXMiLCJwYXJhbXMiLCJvcGVyYXRvciIsInRpbWVDb21wYXJlIiwidGFyZ2V0IiwiZGVwZW5kZW50RWxlbWVudCIsImVsZW1lbnRWYWx1ZSIsIkVycm9yIiwiZ3Vlc3NEYXRlIiwidGV4dCIsIm5vdyIsIm1peGVkX3ZhciIsImFyZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImFycmF5RGlmZiIsImFycjEiLCJhcnIyIiwiYXJyYXlFcXVhbHMiLCJpc0VtcHR5T2JqZWN0IiwiZWwiLCJmaW5kQnlOYW1lIiwib25mb2N1c291dCIsImV2ZW50IiwidGFnTmFtZSIsInJ1bGVOYW1lIiwib2ZmIiwib24iLCJ2YWxpZCIsInBhcnNlRXJyb3JSZXNwb25zZSIsInJlc3BvbnNlIiwibmV3UmVzcG9uc2UiLCJlcnJvck1zZyIsInJlc3BvbnNlVGV4dCIsIm1hdGNoIiwiZXNjYXBlUmVnRXhwIiwic3RyIiwicmVwbGFjZSIsInJlZ2V4RnJvbVdpbGRjYXJkIiwibmFtZVBhcnRzIiwic3BsaXQiLCJSZWdFeHAiLCJtYXAiLCJ4IiwibWVyZ2VSdWxlcyIsIm5ld1J1bGVzIiwicnVsZXNMaXN0IiwibGFyYXZlbFZhbGlkYXRpb25SZW1vdGUiLCJjb25jYXQiLCJlbmNvZGUiLCJodG1sIiwiZmluZEJ5QXJyYXlOYW1lIiwic3FOYW1lIiwibG9va3VwcyIsImVsZW0iLCJkZWxpbSIsInBhcnRzIiwicmVjb25zdHJ1Y3RlZCIsImMiLCJhbGxFbGVtZW50VmFsdWVzIiwiaW5kZXhPZiIsImUiLCJnZXQiXSwic291cmNlUm9vdCI6IiJ9","/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Timezone Helper functions used by validators\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\n$.extend(true, laravelValidation, {\n\n    helpers: {\n\n        /**\n         * Check if the specified timezone is valid.\n         *\n         * @param value\n         * @returns {boolean}\n         */\n        isTimezone: function (value) {\n\n            var timezones={\n                \"africa\": [\n                    \"abidjan\",\n                    \"accra\",\n                    \"addis_ababa\",\n                    \"algiers\",\n                    \"asmara\",\n                    \"bamako\",\n                    \"bangui\",\n                    \"banjul\",\n                    \"bissau\",\n                    \"blantyre\",\n                    \"brazzaville\",\n                    \"bujumbura\",\n                    \"cairo\",\n                    \"casablanca\",\n                    \"ceuta\",\n                    \"conakry\",\n                    \"dakar\",\n                    \"dar_es_salaam\",\n                    \"djibouti\",\n                    \"douala\",\n                    \"el_aaiun\",\n                    \"freetown\",\n                    \"gaborone\",\n                    \"harare\",\n                    \"johannesburg\",\n                    \"juba\",\n                    \"kampala\",\n                    \"khartoum\",\n                    \"kigali\",\n                    \"kinshasa\",\n                    \"lagos\",\n                    \"libreville\",\n                    \"lome\",\n                    \"luanda\",\n                    \"lubumbashi\",\n                    \"lusaka\",\n                    \"malabo\",\n                    \"maputo\",\n                    \"maseru\",\n                    \"mbabane\",\n                    \"mogadishu\",\n                    \"monrovia\",\n                    \"nairobi\",\n                    \"ndjamena\",\n                    \"niamey\",\n                    \"nouakchott\",\n                    \"ouagadougou\",\n                    \"porto-novo\",\n                    \"sao_tome\",\n                    \"tripoli\",\n                    \"tunis\",\n                    \"windhoek\"\n                ],\n                \"america\": [\n                    \"adak\",\n                    \"anchorage\",\n                    \"anguilla\",\n                    \"antigua\",\n                    \"araguaina\",\n                    \"argentina\\/buenos_aires\",\n                    \"argentina\\/catamarca\",\n                    \"argentina\\/cordoba\",\n                    \"argentina\\/jujuy\",\n                    \"argentina\\/la_rioja\",\n                    \"argentina\\/mendoza\",\n                    \"argentina\\/rio_gallegos\",\n                    \"argentina\\/salta\",\n                    \"argentina\\/san_juan\",\n                    \"argentina\\/san_luis\",\n                    \"argentina\\/tucuman\",\n                    \"argentina\\/ushuaia\",\n                    \"aruba\",\n                    \"asuncion\",\n                    \"atikokan\",\n                    \"bahia\",\n                    \"bahia_banderas\",\n                    \"barbados\",\n                    \"belem\",\n                    \"belize\",\n                    \"blanc-sablon\",\n                    \"boa_vista\",\n                    \"bogota\",\n                    \"boise\",\n                    \"cambridge_bay\",\n                    \"campo_grande\",\n                    \"cancun\",\n                    \"caracas\",\n                    \"cayenne\",\n                    \"cayman\",\n                    \"chicago\",\n                    \"chihuahua\",\n                    \"costa_rica\",\n                    \"creston\",\n                    \"cuiaba\",\n                    \"curacao\",\n                    \"danmarkshavn\",\n                    \"dawson\",\n                    \"dawson_creek\",\n                    \"denver\",\n                    \"detroit\",\n                    \"dominica\",\n                    \"edmonton\",\n                    \"eirunepe\",\n                    \"el_salvador\",\n                    \"fortaleza\",\n                    \"glace_bay\",\n                    \"godthab\",\n                    \"goose_bay\",\n                    \"grand_turk\",\n                    \"grenada\",\n                    \"guadeloupe\",\n                    \"guatemala\",\n                    \"guayaquil\",\n                    \"guyana\",\n                    \"halifax\",\n                    \"havana\",\n                    \"hermosillo\",\n                    \"indiana\\/indianapolis\",\n                    \"indiana\\/knox\",\n                    \"indiana\\/marengo\",\n                    \"indiana\\/petersburg\",\n                    \"indiana\\/tell_city\",\n                    \"indiana\\/vevay\",\n                    \"indiana\\/vincennes\",\n                    \"indiana\\/winamac\",\n                    \"inuvik\",\n                    \"iqaluit\",\n                    \"jamaica\",\n                    \"juneau\",\n                    \"kentucky\\/louisville\",\n                    \"kentucky\\/monticello\",\n                    \"kralendijk\",\n                    \"la_paz\",\n                    \"lima\",\n                    \"los_angeles\",\n                    \"lower_princes\",\n                    \"maceio\",\n                    \"managua\",\n                    \"manaus\",\n                    \"marigot\",\n                    \"martinique\",\n                    \"matamoros\",\n                    \"mazatlan\",\n                    \"menominee\",\n                    \"merida\",\n                    \"metlakatla\",\n                    \"mexico_city\",\n                    \"miquelon\",\n                    \"moncton\",\n                    \"monterrey\",\n                    \"montevideo\",\n                    \"montreal\",\n                    \"montserrat\",\n                    \"nassau\",\n                    \"new_york\",\n                    \"nipigon\",\n                    \"nome\",\n                    \"noronha\",\n                    \"north_dakota\\/beulah\",\n                    \"north_dakota\\/center\",\n                    \"north_dakota\\/new_salem\",\n                    \"ojinaga\",\n                    \"panama\",\n                    \"pangnirtung\",\n                    \"paramaribo\",\n                    \"phoenix\",\n                    \"port-au-prince\",\n                    \"port_of_spain\",\n                    \"porto_velho\",\n                    \"puerto_rico\",\n                    \"rainy_river\",\n                    \"rankin_inlet\",\n                    \"recife\",\n                    \"regina\",\n                    \"resolute\",\n                    \"rio_branco\",\n                    \"santa_isabel\",\n                    \"santarem\",\n                    \"santiago\",\n                    \"santo_domingo\",\n                    \"sao_paulo\",\n                    \"scoresbysund\",\n                    \"shiprock\",\n                    \"sitka\",\n                    \"st_barthelemy\",\n                    \"st_johns\",\n                    \"st_kitts\",\n                    \"st_lucia\",\n                    \"st_thomas\",\n                    \"st_vincent\",\n                    \"swift_current\",\n                    \"tegucigalpa\",\n                    \"thule\",\n                    \"thunder_bay\",\n                    \"tijuana\",\n                    \"toronto\",\n                    \"tortola\",\n                    \"vancouver\",\n                    \"whitehorse\",\n                    \"winnipeg\",\n                    \"yakutat\",\n                    \"yellowknife\"\n                ],\n                \"antarctica\": [\n                    \"casey\",\n                    \"davis\",\n                    \"dumontdurville\",\n                    \"macquarie\",\n                    \"mawson\",\n                    \"mcmurdo\",\n                    \"palmer\",\n                    \"rothera\",\n                    \"south_pole\",\n                    \"syowa\",\n                    \"vostok\"\n                ],\n                \"arctic\": [\n                    \"longyearbyen\"\n                ],\n                \"asia\": [\n                    \"aden\",\n                    \"almaty\",\n                    \"amman\",\n                    \"anadyr\",\n                    \"aqtau\",\n                    \"aqtobe\",\n                    \"ashgabat\",\n                    \"baghdad\",\n                    \"bahrain\",\n                    \"baku\",\n                    \"bangkok\",\n                    \"beirut\",\n                    \"bishkek\",\n                    \"brunei\",\n                    \"choibalsan\",\n                    \"chongqing\",\n                    \"colombo\",\n                    \"damascus\",\n                    \"dhaka\",\n                    \"dili\",\n                    \"dubai\",\n                    \"dushanbe\",\n                    \"gaza\",\n                    \"harbin\",\n                    \"hebron\",\n                    \"ho_chi_minh\",\n                    \"hong_kong\",\n                    \"hovd\",\n                    \"irkutsk\",\n                    \"jakarta\",\n                    \"jayapura\",\n                    \"jerusalem\",\n                    \"kabul\",\n                    \"kamchatka\",\n                    \"karachi\",\n                    \"kashgar\",\n                    \"kathmandu\",\n                    \"khandyga\",\n                    \"kolkata\",\n                    \"krasnoyarsk\",\n                    \"kuala_lumpur\",\n                    \"kuching\",\n                    \"kuwait\",\n                    \"macau\",\n                    \"magadan\",\n                    \"makassar\",\n                    \"manila\",\n                    \"muscat\",\n                    \"nicosia\",\n                    \"novokuznetsk\",\n                    \"novosibirsk\",\n                    \"omsk\",\n                    \"oral\",\n                    \"phnom_penh\",\n                    \"pontianak\",\n                    \"pyongyang\",\n                    \"qatar\",\n                    \"qyzylorda\",\n                    \"rangoon\",\n                    \"riyadh\",\n                    \"sakhalin\",\n                    \"samarkand\",\n                    \"seoul\",\n                    \"shanghai\",\n                    \"singapore\",\n                    \"taipei\",\n                    \"tashkent\",\n                    \"tbilisi\",\n                    \"tehran\",\n                    \"thimphu\",\n                    \"tokyo\",\n                    \"ulaanbaatar\",\n                    \"urumqi\",\n                    \"ust-nera\",\n                    \"vientiane\",\n                    \"vladivostok\",\n                    \"yakutsk\",\n                    \"yekaterinburg\",\n                    \"yerevan\"\n                ],\n                \"atlantic\": [\n                    \"azores\",\n                    \"bermuda\",\n                    \"canary\",\n                    \"cape_verde\",\n                    \"faroe\",\n                    \"madeira\",\n                    \"reykjavik\",\n                    \"south_georgia\",\n                    \"st_helena\",\n                    \"stanley\"\n                ],\n                \"australia\": [\n                    \"adelaide\",\n                    \"brisbane\",\n                    \"broken_hill\",\n                    \"currie\",\n                    \"darwin\",\n                    \"eucla\",\n                    \"hobart\",\n                    \"lindeman\",\n                    \"lord_howe\",\n                    \"melbourne\",\n                    \"perth\",\n                    \"sydney\"\n                ],\n                \"europe\": [\n                    \"amsterdam\",\n                    \"andorra\",\n                    \"athens\",\n                    \"belgrade\",\n                    \"berlin\",\n                    \"bratislava\",\n                    \"brussels\",\n                    \"bucharest\",\n                    \"budapest\",\n                    \"busingen\",\n                    \"chisinau\",\n                    \"copenhagen\",\n                    \"dublin\",\n                    \"gibraltar\",\n                    \"guernsey\",\n                    \"helsinki\",\n                    \"isle_of_man\",\n                    \"istanbul\",\n                    \"jersey\",\n                    \"kaliningrad\",\n                    \"kiev\",\n                    \"lisbon\",\n                    \"ljubljana\",\n                    \"london\",\n                    \"luxembourg\",\n                    \"madrid\",\n                    \"malta\",\n                    \"mariehamn\",\n                    \"minsk\",\n                    \"monaco\",\n                    \"moscow\",\n                    \"oslo\",\n                    \"paris\",\n                    \"podgorica\",\n                    \"prague\",\n                    \"riga\",\n                    \"rome\",\n                    \"samara\",\n                    \"san_marino\",\n                    \"sarajevo\",\n                    \"simferopol\",\n                    \"skopje\",\n                    \"sofia\",\n                    \"stockholm\",\n                    \"tallinn\",\n                    \"tirane\",\n                    \"uzhgorod\",\n                    \"vaduz\",\n                    \"vatican\",\n                    \"vienna\",\n                    \"vilnius\",\n                    \"volgograd\",\n                    \"warsaw\",\n                    \"zagreb\",\n                    \"zaporozhye\",\n                    \"zurich\"\n                ],\n                \"indian\": [\n                    \"antananarivo\",\n                    \"chagos\",\n                    \"christmas\",\n                    \"cocos\",\n                    \"comoro\",\n                    \"kerguelen\",\n                    \"mahe\",\n                    \"maldives\",\n                    \"mauritius\",\n                    \"mayotte\",\n                    \"reunion\"\n                ],\n                \"pacific\": [\n                    \"apia\",\n                    \"auckland\",\n                    \"chatham\",\n                    \"chuuk\",\n                    \"easter\",\n                    \"efate\",\n                    \"enderbury\",\n                    \"fakaofo\",\n                    \"fiji\",\n                    \"funafuti\",\n                    \"galapagos\",\n                    \"gambier\",\n                    \"guadalcanal\",\n                    \"guam\",\n                    \"honolulu\",\n                    \"johnston\",\n                    \"kiritimati\",\n                    \"kosrae\",\n                    \"kwajalein\",\n                    \"majuro\",\n                    \"marquesas\",\n                    \"midway\",\n                    \"nauru\",\n                    \"niue\",\n                    \"norfolk\",\n                    \"noumea\",\n                    \"pago_pago\",\n                    \"palau\",\n                    \"pitcairn\",\n                    \"pohnpei\",\n                    \"port_moresby\",\n                    \"rarotonga\",\n                    \"saipan\",\n                    \"tahiti\",\n                    \"tarawa\",\n                    \"tongatapu\",\n                    \"wake\",\n                    \"wallis\"\n                ],\n                \"utc\": [\n                    \"\"\n                ]\n            };\n\n            var tzparts= value.split('/',2);\n            var continent=tzparts[0].toLowerCase();\n            var city='';\n            if (tzparts[1]) {\n                city=tzparts[1].toLowerCase();\n            }\n\n            return (continent in timezones && ( timezones[continent].length===0 || timezones[continent].indexOf(city)!==-1))\n        }\n    }\n});\n","/*!\n * Laravel Javascript Validation\n *\n * https://github.com/proengsoft/laravel-jsvalidation\n *\n * Methods that implement Laravel Validations\n *\n * Copyright (c) 2017 Proengsoft\n * Released under the MIT license\n */\n\n$.extend(true, laravelValidation, {\n\n    methods:{\n\n        helpers: laravelValidation.helpers,\n\n        jsRemoteTimer:0,\n\n        /**\n         * \"Validate\" optional attributes.\n         * Always returns true, just lets us put sometimes in rules.\n         *\n         * @return {boolean}\n         */\n        Sometimes: function() {\n            return true;\n        },\n\n        /**\n         * Bail This is the default behaivour os JSValidation.\n         * Always returns true, just lets us put sometimes in rules.\n         *\n         * @return {boolean}\n         */\n        Bail: function() {\n            return true;\n        },\n\n        /**\n         * \"Indicate\" validation should pass if value is null.\n         * Always returns true, just lets us put \"nullable\" in rules.\n         *\n         * @return {boolean}\n         */\n        Nullable: function() {\n            return true;\n        },\n\n        /**\n         * Validate the given attribute is filled if it is present.\n         */\n        Filled: function(value, element) {\n            return $.validator.methods.required.call(this, value, element, true);\n        },\n\n\n        /**\n         * Validate that a required attribute exists.\n         */\n        Required: function(value, element) {\n            return  $.validator.methods.required.call(this, value, element);\n        },\n\n        /**\n         * Validate that an attribute exists when any other attribute exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWith: function(value, element, params) {\n            var validator=this,\n                required=false;\n            var currentObject=this;\n\n            $.each(params,function(i,param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required=required || (\n                    target!==undefined &&\n                    $.validator.methods.required.call(\n                        validator,\n                        currentObject.elementValue(target),\n                        target,true\n                    ));\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when all other attribute exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWithAll: function(value, element, params) {\n            var validator=this,\n                required=true;\n            var currentObject=this;\n\n            $.each(params,function(i,param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required = required && (\n                      target!==undefined &&\n                      $.validator.methods.required.call(\n                          validator,\n                          currentObject.elementValue(target),\n                          target,true\n                      ));\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when any other attribute does not exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWithout: function(value, element, params) {\n            var validator=this,\n                required=false;\n            var currentObject=this;\n\n            $.each(params,function(i,param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required = required ||\n                    target===undefined||\n                    !$.validator.methods.required.call(\n                        validator,\n                        currentObject.elementValue(target),\n                        target,true\n                    );\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when all other attribute does not exists.\n         *\n         * @return {boolean}\n         */\n        RequiredWithoutAll: function(value, element, params) {\n            var validator=this,\n                required=true,\n                currentObject=this;\n\n            $.each(params,function(i, param) {\n                var target=laravelValidation.helpers.dependentElement(\n                    currentObject, element, param\n                );\n                required = required && (\n                    target===undefined ||\n                    !$.validator.methods.required.call(\n                        validator,\n                        currentObject.elementValue(target),\n                        target,true\n                    ));\n            });\n\n            if (required) {\n                return  $.validator.methods.required.call(this, value, element, true);\n            }\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when another attribute has a given value.\n         *\n         * @return {boolean}\n         */\n        RequiredIf: function(value, element, params) {\n\n            var target=laravelValidation.helpers.dependentElement(\n                this, element, params[0]\n            );\n\n            if (target!==undefined) {\n                var val=String(this.elementValue(target));\n                if (typeof val !== 'undefined') {\n                    var data = params.slice(1);\n                    if ($.inArray(val, data) !== -1) {\n                        return $.validator.methods.required.call(\n                            this, value, element, true\n                        );\n                    }\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Validate that an attribute exists when another\n         * attribute does not have a given value.\n         *\n         * @return {boolean}\n         */\n        RequiredUnless: function(value, element, params) {\n\n            var target=laravelValidation.helpers.dependentElement(\n                this, element, params[0]\n            );\n\n            if (target!==undefined) {\n                var val=String(this.elementValue(target));\n                if (typeof val !== 'undefined') {\n                    var data = params.slice(1);\n                    if ($.inArray(val, data) !== -1) {\n                        return true;\n                    }\n                }\n            }\n\n            return $.validator.methods.required.call(\n                this, value, element, true\n            );\n\n        },\n\n        /**\n         * Validate that an attribute has a matching confirmation.\n         *\n         * @return {boolean}\n         */\n        Confirmed: function(value, element, params) {\n            return laravelValidation.methods.Same.call(this,value, element, params);\n        },\n\n        /**\n         * Validate that two attributes match.\n         *\n         * @return {boolean}\n         */\n        Same: function(value, element, params) {\n\n            var target=laravelValidation.helpers.dependentElement(\n                this, element, params[0]\n            );\n\n            if (target!==undefined) {\n                return String(value) === String(this.elementValue(target));\n            }\n            return false;\n        },\n\n        /**\n         * Validate that the values of an attribute is in another attribute.\n         *\n         * @param value\n         * @param element\n         * @param params\n         * @returns {boolean}\n         * @constructor\n         */\n        InArray: function (value, element, params) {\n            if (typeof params[0] === 'undefined') {\n                return false;\n            }\n            var elements = this.elements();\n            var found = false;\n            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);\n\n            for ( var i = 0; i < elements.length ; i++ ) {\n                var targetName = elements[i].name;\n                if (targetName.match(nameRegExp)) {\n                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);\n                    found = found || equals;\n                }\n            }\n\n            return found;\n        },\n\n        /**\n         * Validate an attribute is unique among other values.\n         *\n         * @param value\n         * @param element\n         * @param params\n         * @returns {boolean}\n         */\n        Distinct: function (value, element, params) {\n            if (typeof params[0] === 'undefined') {\n                return false;\n            }\n\n            var elements = this.elements();\n            var found = false;\n            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);\n\n            for ( var i = 0; i < elements.length ; i++ ) {\n                var targetName = elements[i].name;\n                if (targetName !== element.name && targetName.match(nameRegExp)) {\n                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);\n                    found = found || equals;\n                }\n            }\n\n            return !found;\n        },\n\n\n        /**\n         * Validate that an attribute is different from another attribute.\n         *\n         * @return {boolean}\n         */\n        Different: function(value, element, params) {\n            return ! laravelValidation.methods.Same.call(this,value, element, params);\n        },\n\n        /**\n         * Validate that an attribute was \"accepted\".\n         * This validation rule implies the attribute is \"required\".\n         *\n         * @return {boolean}\n         */\n        Accepted: function(value) {\n            var regex = new RegExp(\"^(?:(yes|on|1|true))$\",'i');\n            return regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is an array.\n         *\n         * @param value\n         * @param element\n         */\n        Array: function(value, element) {\n            if (element.name.indexOf('[') !== -1 && element.name.indexOf(']') !== -1) {\n                return true;\n            }\n\n            return laravelValidation.helpers.isArray(value);\n        },\n\n        /**\n         * Validate that an attribute is a boolean.\n         *\n         * @return {boolean}\n         */\n        Boolean: function(value) {\n            var regex= new RegExp(\"^(?:(true|false|1|0))$\",'i');\n            return  regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is an integer.\n         *\n         * @return {boolean}\n         */\n        Integer: function(value) {\n            var regex= new RegExp(\"^(?:-?\\\\d+)$\",'i');\n            return  regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is numeric.\n         */\n        Numeric: function(value, element) {\n            return $.validator.methods.number.call(this, value, element, true);\n        },\n\n        /**\n         * Validate that an attribute is a string.\n         *\n         * @return {boolean}\n         */\n        String: function(value) {\n            return typeof value === 'string';\n        },\n\n        /**\n         * The field under validation must be numeric and must have an exact length of value.\n         */\n        Digits: function(value, element, params) {\n            return (\n                $.validator.methods.number.call(this, value, element, true) &&\n                value.length === parseInt(params, 10)\n            );\n        },\n\n        /**\n         * The field under validation must have a length between the given min and max.\n         */\n        DigitsBetween: function(value, element, params) {\n            return ($.validator.methods.number.call(this, value, element, true)\n                && value.length>=parseFloat(params[0]) && value.length<=parseFloat(params[1]));\n        },\n\n        /**\n         * Validate the size of an attribute.\n         *\n         * @return {boolean}\n         */\n        Size: function(value, element, params) {\n            return laravelValidation.helpers.getSize(this, element,value) === parseFloat(params[0]);\n        },\n\n        /**\n         * Validate the size of an attribute is between a set of values.\n         *\n         * @return {boolean}\n         */\n        Between: function(value, element, params) {\n            return ( laravelValidation.helpers.getSize(this, element,value) >= parseFloat(params[0]) &&\n                laravelValidation.helpers.getSize(this,element,value) <= parseFloat(params[1]));\n        },\n\n        /**\n         * Validate the size of an attribute is greater than a minimum value.\n         *\n         * @return {boolean}\n         */\n        Min: function(value, element, params) {\n            value = laravelValidation.helpers.allElementValues(this, element);\n\n            return laravelValidation.helpers.getSize(this, element, value) >= parseFloat(params[0]);\n        },\n\n        /**\n         * Validate the size of an attribute is less than a maximum value.\n         *\n         * @return {boolean}\n         */\n        Max: function(value, element, params) {\n            value = laravelValidation.helpers.allElementValues(this, element);\n\n            return laravelValidation.helpers.getSize(this, element, value) <= parseFloat(params[0]);\n        },\n\n        /**\n         * Validate an attribute is contained within a list of values.\n         *\n         * @return {boolean}\n         */\n        In: function(value, element, params) {\n            if (laravelValidation.helpers.isArray(value)\n                && laravelValidation.helpers.hasRules(element, \"Array\")\n            ) {\n                var diff = laravelValidation.helpers.arrayDiff(value, params);\n\n                return Object.keys(diff).length === 0;\n            }\n\n            return params.indexOf(value.toString()) !== -1;\n        },\n\n        /**\n         * Validate an attribute is not contained within a list of values.\n         *\n         * @return {boolean}\n         */\n        NotIn: function(value, element, params) {\n            return params.indexOf(value.toString()) === -1;\n        },\n\n        /**\n         * Validate that an attribute is a valid IP.\n         *\n         * @return {boolean}\n         */\n        Ip: function(value) {\n            return /^(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/i.test(value) ||\n                /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);\n        },\n\n        /**\n         * Validate that an attribute is a valid e-mail address.\n         */\n        Email: function(value, element) {\n            return $.validator.methods.email.call(this, value, element, true);\n        },\n\n        /**\n         * Validate that an attribute is a valid URL.\n         */\n        Url: function(value, element) {\n            return $.validator.methods.url.call(this, value, element, true);\n        },\n\n        /**\n         * The field under validation must be a successfully uploaded file.\n         *\n         * @return {boolean}\n         */\n        File: function(value, element) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            if ('files' in element ) {\n                return (element.files.length > 0);\n            }\n            return false;\n        },\n\n        /**\n         * Validate the MIME type of a file upload attribute is in a set of MIME types.\n         *\n         * @return {boolean}\n         */\n        Mimes: function(value, element, params) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            var lowerParams = $.map(params, function(item) {\n                return item.toLowerCase();\n            });\n\n            var fileinfo = laravelValidation.helpers.fileinfo(element);\n            return (fileinfo !== false && lowerParams.indexOf(fileinfo.extension.toLowerCase())!==-1);\n        },\n\n        /**\n         * The file under validation must match one of the given MIME types.\n         *\n         * @return {boolean}\n         */\n        Mimetypes: function(value, element, params) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            var lowerParams = $.map(params, function(item) {\n                return item.toLowerCase();\n            });\n\n            var fileinfo = laravelValidation.helpers.fileinfo(element);\n\n            if (fileinfo === false) {\n                return false;\n            }\n            return (lowerParams.indexOf(fileinfo.type.toLowerCase())!==-1);\n        },\n\n        /**\n         * Validate the MIME type of a file upload attribute is in a set of MIME types.\n         */\n        Image: function(value, element) {\n            return laravelValidation.methods.Mimes.call(this, value, element, [\n                'jpg', 'png', 'gif', 'bmp', 'svg', 'jpeg'\n            ]);\n        },\n\n        /**\n         * Validate dimensions of Image.\n         *\n         * @return {boolean|string}\n         */\n        Dimensions: function(value, element, params, callback) {\n            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {\n                return true;\n            }\n            if (element.files === null || typeof element.files[0] === 'undefined') {\n                return false;\n            }\n\n            var fr = new FileReader;\n            fr.onload = function () {\n                var img = new Image();\n                img.onload = function () {\n                    var height = parseFloat(img.naturalHeight);\n                    var width = parseFloat(img.naturalWidth);\n                    var ratio = width / height;\n                    var notValid = ((params['width']) && parseFloat(params['width'] !== width)) ||\n                        ((params['min_width']) && parseFloat(params['min_width']) > width) ||\n                        ((params['max_width']) && parseFloat(params['max_width']) < width) ||\n                        ((params['height']) && parseFloat(params['height']) !== height) ||\n                        ((params['min_height']) && parseFloat(params['min_height']) > height) ||\n                        ((params['max_height']) && parseFloat(params['max_height']) < height) ||\n                        ((params['ratio']) && ratio !== parseFloat(eval(params['ratio']))\n                        );\n                    callback(! notValid);\n                };\n                img.onerror = function() {\n                    callback(false);\n                };\n                img.src = fr.result;\n            };\n            fr.readAsDataURL(element.files[0]);\n\n            return 'pending';\n        },\n\n        /**\n         * Validate that an attribute contains only alphabetic characters.\n         *\n         * @return {boolean}\n         */\n        Alpha: function(value) {\n            if (typeof  value !== 'string') {\n                return false;\n            }\n\n            var regex = new RegExp(\"^(?:^[a-z\\u00E0-\\u00FC]+$)$\",'i');\n            return  regex.test(value);\n\n        },\n\n        /**\n         * Validate that an attribute contains only alpha-numeric characters.\n         *\n         * @return {boolean}\n         */\n        AlphaNum: function(value) {\n            if (typeof  value !== 'string') {\n                return false;\n            }\n            var regex = new RegExp(\"^(?:^[a-z0-9\\u00E0-\\u00FC]+$)$\",'i');\n            return regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute contains only alphabetic characters.\n         *\n         * @return {boolean}\n         */\n        AlphaDash: function(value) {\n            if (typeof  value !== 'string') {\n                return false;\n            }\n            var regex = new RegExp(\"^(?:^[a-z0-9\\u00E0-\\u00FC_-]+$)$\",'i');\n            return regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute passes a regular expression check.\n         *\n         * @return {boolean}\n         */\n        Regex: function(value, element, params) {\n            var invalidModifiers=['x','s','u','X','U','A'];\n            // Converting php regular expression\n            var phpReg= new RegExp('^(?:\\/)(.*\\\\\\/?[^\\/]*|[^\\/]*)(?:\\/)([gmixXsuUAJ]*)?$');\n            var matches=params[0].match(phpReg);\n            if (matches === null) {\n                return false;\n            }\n            // checking modifiers\n            var php_modifiers=[];\n            if (matches[2]!==undefined) {\n                php_modifiers=matches[2].split('');\n                for (var i=0; i<php_modifiers.length<i ;i++) {\n                    if (invalidModifiers.indexOf(php_modifiers[i])!==-1) {\n                        return true;\n                    }\n                }\n            }\n            var regex = new RegExp(\"^(?:\"+matches[1]+\")$\",php_modifiers.join());\n            return   regex.test(value);\n        },\n\n        /**\n         * Validate that an attribute is a valid date.\n         *\n         * @return {boolean}\n         */\n        Date: function(value) {\n            return (laravelValidation.helpers.strtotime(value)!==false);\n        },\n\n        /**\n         * Validate that an attribute matches a date format.\n         *\n         * @return {boolean}\n         */\n        DateFormat: function(value, element, params) {\n            return laravelValidation.helpers.parseTime(value,params[0])!==false;\n        },\n\n        /**\n         * Validate the date is before a given date.\n         *\n         * @return {boolean}\n         */\n        Before: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<');\n        },\n\n        /**\n         * Validate the date is equal or before a given date.\n         *\n         * @return {boolean}\n         */\n        BeforeOrEqual: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<=');\n        },\n\n        /**\n         * Validate the date is after a given date.\n         *\n         * @return {boolean}\n         */\n        After: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>');\n        },\n\n        /**\n         * Validate the date is equal or after a given date.\n         *\n         * @return {boolean}\n         */\n        AfterOrEqual: function(value, element, params) {\n            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>=');\n        },\n\n\n        /**\n         * Validate that an attribute is a valid date.\n         */\n        Timezone: function(value) {\n            return  laravelValidation.helpers.isTimezone(value);\n        },\n\n\n        /**\n         * Validate the attribute is a valid JSON string.\n         *\n         * @param  value\n         * @return bool\n         */\n        Json: function(value) {\n            var result = true;\n            try {\n                JSON.parse(value);\n            } catch (e) {\n                result = false;\n            }\n            return result;\n        },\n\n        /**\n         * Noop (always returns true).\n         *\n         * @param value\n         * @returns {boolean}\n         */\n        ProengsoftNoop: function (value) {\n            return true;\n        },\n    }\n});\n"]}laravel-jsvalidation/public/js/jsvalidation.min.js000064400000215343152434177750016407 0ustar00var laravelValidation;!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(h){h.extend(h.fn,{validate:function(e){if(this.length){var i=h.data(this[0],"validator");return i?i:(this.attr("novalidate","novalidate"),i=new h.validator(e,this[0]),h.data(this[0],"validator",i),i.settings.onsubmit&&(this.on("click.validate",":submit",function(e){i.submitButton=e.currentTarget,h(this).hasClass("cancel")&&(i.cancelSubmit=!0),void 0!==h(this).attr("formnovalidate")&&(i.cancelSubmit=!0)}),this.on("submit.validate",function(a){function e(){var e,t;return i.submitButton&&(i.settings.submitHandler||i.formSubmitted)&&(e=h("<input type='hidden'/>").attr("name",i.submitButton.name).val(h(i.submitButton).val()).appendTo(i.currentForm)),!(i.settings.submitHandler&&!i.settings.debug)||(t=i.settings.submitHandler.call(i,i.currentForm,a),e&&e.remove(),void 0!==t&&t)}return i.settings.debug&&a.preventDefault(),i.cancelSubmit?(i.cancelSubmit=!1,e()):i.form()?i.pendingRequest?!(i.formSubmitted=!0):e():(i.focusInvalid(),!1)})),i)}e&&e.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing.")},valid:function(){var e,t,a;return h(this[0]).is("form")?e=this.validate().form():(a=[],e=!0,t=h(this[0].form).validate(),this.each(function(){(e=t.element(this)&&e)||(a=a.concat(t.errorList))}),t.errorList=a),e},rules:function(e,t){var a,i,r,n,s,o,l=this[0],u=void 0!==this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=l&&(!l.form&&u&&(l.form=this.closest("form")[0],l.name=this.attr("name")),null!=l.form)){if(e)switch(i=(a=h.data(l.form,"validator").settings).rules,r=h.validator.staticRules(l),e){case"add":h.extend(r,h.validator.normalizeRule(t)),delete r.messages,i[l.name]=r,t.messages&&(a.messages[l.name]=h.extend(a.messages[l.name],t.messages));break;case"remove":return t?(o={},h.each(t.split(/\s/),function(e,t){o[t]=r[t],delete r[t]}),o):(delete i[l.name],r)}return(n=h.validator.normalizeRules(h.extend({},h.validator.classRules(l),h.validator.attributeRules(l),h.validator.dataRules(l),h.validator.staticRules(l)),l)).required&&(s=n.required,delete n.required,n=h.extend({required:s},n)),n.remote&&(s=n.remote,delete n.remote,n=h.extend(n,{remote:s})),n}}});function a(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}var i;h.extend(h.expr.pseudos||h.expr[":"],{blank:function(e){return!a(""+h(e).val())},filled:function(e){var t=h(e).val();return null!==t&&!!a(""+t)},unchecked:function(e){return!h(e).prop("checked")}}),h.validator=function(e,t){this.settings=h.extend(!0,{},h.validator.defaults,e),this.currentForm=t,this.init()},h.validator.format=function(a,e){return 1===arguments.length?function(){var e=h.makeArray(arguments);return e.unshift(a),h.validator.format.apply(this,e)}:(void 0===e||(2<arguments.length&&e.constructor!==Array&&(e=h.makeArray(arguments).slice(1)),e.constructor!==Array&&(e=[e]),h.each(e,function(e,t){a=a.replace(new RegExp("\\{"+e+"\\}","g"),function(){return t})})),a)},h.extend(h.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:h([]),errorLabelContainer:h([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(e){this.lastActive=e,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,e,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(e)))},onfocusout:function(e){this.checkable(e)||!(e.name in this.submitted)&&this.optional(e)||this.element(e)},onkeyup:function(e,t){9===t.which&&""===this.elementValue(e)||-1!==h.inArray(t.keyCode,[16,17,18,20,35,36,37,38,39,40,45,144,225])||(e.name in this.submitted||e.name in this.invalid)&&this.element(e)},onclick:function(e){e.name in this.submitted?this.element(e):e.parentNode.name in this.submitted&&this.element(e.parentNode)},highlight:function(e,t,a){"radio"===e.type?this.findByName(e.name).addClass(t).removeClass(a):h(e).addClass(t).removeClass(a)},unhighlight:function(e,t,a){"radio"===e.type?this.findByName(e.name).removeClass(t).addClass(a):h(e).removeClass(t).addClass(a)}},setDefaults:function(e){h.extend(h.validator.defaults,e)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:h.validator.format("Please enter no more than {0} characters."),minlength:h.validator.format("Please enter at least {0} characters."),rangelength:h.validator.format("Please enter a value between {0} and {1} characters long."),range:h.validator.format("Please enter a value between {0} and {1}."),max:h.validator.format("Please enter a value less than or equal to {0}."),min:h.validator.format("Please enter a value greater than or equal to {0}."),step:h.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){this.labelContainer=h(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||h(this.currentForm),this.containers=h(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var a,n=this.currentForm,i=this.groups={};function e(e){var t,a,i,r=void 0!==h(this).attr("contenteditable")&&"false"!==h(this).attr("contenteditable");!this.form&&r&&(this.form=h(this).closest("form")[0],this.name=h(this).attr("name")),n===this.form&&(t=h.data(this.form,"validator"),a="on"+e.type.replace(/^validate/,""),(i=t.settings)[a]&&!h(this).is(i.ignore)&&i[a].call(t,this,e))}h.each(this.settings.groups,function(a,e){"string"==typeof e&&(e=e.split(/\s/)),h.each(e,function(e,t){i[t]=a})}),a=this.settings.rules,h.each(a,function(e,t){a[e]=h.validator.normalizeRule(t)}),h(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",e).on("click.validate","select, option, [type='radio'], [type='checkbox']",e),this.settings.invalidHandler&&h(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),h.extend(this.submitted,this.errorMap),this.invalid=h.extend({},this.errorMap),this.valid()||h(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var e=0,t=this.currentElements=this.elements();t[e];e++)this.check(t[e]);return this.valid()},element:function(e){var t,a,i=this.clean(e),r=this.validationTargetFor(i),n=this,s=!0;return void 0===r?delete this.invalid[i.name]:(this.prepareElement(r),this.currentElements=h(r),(a=this.groups[r.name])&&h.each(this.groups,function(e,t){t===a&&e!==r.name&&(i=n.validationTargetFor(n.clean(n.findByName(e))))&&i.name in n.invalid&&(n.currentElements.push(i),s=n.check(i)&&s)}),t=!1!==this.check(r),s=s&&t,this.invalid[r.name]=!t,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),h(e).attr("aria-invalid",!t)),s},showErrors:function(t){var a;t&&(a=this,h.extend(this.errorMap,t),this.errorList=h.map(this.errorMap,function(e,t){return{message:e,element:a.findByName(t)[0]}}),this.successList=h.grep(this.successList,function(e){return!(e.name in t)})),this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){h.fn.resetForm&&h(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var e=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(e)},resetElements:function(e){var t;if(this.settings.unhighlight)for(t=0;e[t];t++)this.settings.unhighlight.call(this,e[t],this.settings.errorClass,""),this.findByName(e[t].name).removeClass(this.settings.validClass);else e.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(e){var t,a=0;for(t in e)void 0!==e[t]&&null!==e[t]&&!1!==e[t]&&a++;return a},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(e){e.not(this.containers).text(""),this.addWrapper(e).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{h(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(e){}},findLastActive:function(){var t=this.lastActive;return t&&1===h.grep(this.errorList,function(e){return e.element.name===t.name}).length&&t},elements:function(){var a=this,i={};return h(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var e=this.name||h(this).attr("name"),t=void 0!==h(this).attr("contenteditable")&&"false"!==h(this).attr("contenteditable");return!e&&a.settings.debug&&window.console&&console.error("%o has no name assigned",this),t&&(this.form=h(this).closest("form")[0],this.name=e),this.form===a.currentForm&&(!(e in i||!a.objectLength(h(this).rules()))&&(i[e]=!0))})},clean:function(e){return h(e)[0]},errors:function(){var e=this.settings.errorClass.split(" ").join(".");return h(this.settings.errorElement+"."+e,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=h([]),this.toHide=h([])},reset:function(){this.resetInternals(),this.currentElements=h([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(e){this.reset(),this.toHide=this.errorsFor(e)},elementValue:function(e){var t,a,i=h(e),r=e.type,n=void 0!==i.attr("contenteditable")&&"false"!==i.attr("contenteditable");return"radio"===r||"checkbox"===r?this.findByName(e.name).filter(":checked").val():"number"===r&&void 0!==e.validity?e.validity.badInput?"NaN":i.val():(t=n?i.text():i.val(),"file"===r?"C:\\fakepath\\"===t.substr(0,12)?t.substr(12):0<=(a=t.lastIndexOf("/"))||0<=(a=t.lastIndexOf("\\"))?t.substr(a+1):t:"string"==typeof t?t.replace(/\r/g,""):t)},check:function(t){t=this.validationTargetFor(this.clean(t));var e,a,i,r,n=h(t).rules(),s=h.map(n,function(e,t){return t}).length,o=!1,l=this.elementValue(t);for(a in this.abortRequest(t),"function"==typeof n.normalizer?r=n.normalizer:"function"==typeof this.settings.normalizer&&(r=this.settings.normalizer),r&&(l=r.call(t,l),delete n.normalizer),n){i={method:a,parameters:n[a]};try{if("dependency-mismatch"===(e=h.validator.methods[a].call(this,l,t,i.parameters))&&1===s){o=!0;continue}if(o=!1,"pending"===e)return void(this.toHide=this.toHide.not(this.errorsFor(t)));if(!e)return this.formatAndAdd(t,i),!1}catch(e){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+t.id+", check the '"+i.method+"' method.",e),e instanceof TypeError&&(e.message+=".  Exception occurred when checking element "+t.id+", check the '"+i.method+"' method."),e}}if(!o)return this.objectLength(n)&&this.successList.push(t),!0},customDataMessage:function(e,t){return h(e).data("msg"+t.charAt(0).toUpperCase()+t.substring(1).toLowerCase())||h(e).data("msg")},customMessage:function(e,t){var a=this.settings.messages[e];return a&&(a.constructor===String?a:a[t])},findDefined:function(){for(var e=0;e<arguments.length;e++)if(void 0!==arguments[e])return arguments[e]},defaultMessage:function(e,t){"string"==typeof t&&(t={method:t});var a=this.findDefined(this.customMessage(e.name,t.method),this.customDataMessage(e,t.method),!this.settings.ignoreTitle&&e.title||void 0,h.validator.messages[t.method],"<strong>Warning: No message defined for "+e.name+"</strong>"),i=/\$?\{(\d+)\}/g;return"function"==typeof a?a=a.call(this,t.parameters,e):i.test(a)&&(a=h.validator.format(a.replace(i,"{$1}"),t.parameters)),a},formatAndAdd:function(e,t){var a=this.defaultMessage(e,t);this.errorList.push({message:a,element:e,method:t.method}),this.errorMap[e.name]=a,this.submitted[e.name]=a},addWrapper:function(e){return this.settings.wrapper&&(e=e.add(e.parent(this.settings.wrapper))),e},defaultShowErrors:function(){for(var e,t,a=0;this.errorList[a];a++)t=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,t.element,this.settings.errorClass,this.settings.validClass),this.showLabel(t.element,t.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,e=this.validElements();e[a];a++)this.settings.unhighlight.call(this,e[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return h(this.errorList).map(function(){return this.element})},showLabel:function(e,t){var a,i,r,n,s=this.errorsFor(e),o=this.idOrName(e),l=h(e).attr("aria-describedby");s.length?(s.removeClass(this.settings.validClass).addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?s.text(t||""):s.html(t||"")):(s=h("<"+this.settings.errorElement+">").attr("id",o+"-error").addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?s.text(t||""):s.html(t||""),a=s,this.settings.wrapper&&(a=s.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(a):this.settings.errorPlacement?this.settings.errorPlacement.call(this,a,h(e)):a.insertAfter(e),s.is("label")?s.attr("for",o):0===s.parents("label[for='"+this.escapeCssMeta(o)+"']").length&&(r=s.attr("id"),l?l.match(new RegExp("\\b"+this.escapeCssMeta(r)+"\\b"))||(l+=" "+r):l=r,h(e).attr("aria-describedby",l),(i=this.groups[e.name])&&(n=this,h.each(n.groups,function(e,t){t===i&&h("[name='"+n.escapeCssMeta(e)+"']",n.currentForm).attr("aria-describedby",s.attr("id"))})))),!t&&this.settings.success&&(s.text(""),"string"==typeof this.settings.success?s.addClass(this.settings.success):this.settings.success(s,e)),this.toShow=this.toShow.add(s)},errorsFor:function(e){var t=this.escapeCssMeta(this.idOrName(e)),a=h(e).attr("aria-describedby"),i="label[for='"+t+"'], label[for='"+t+"'] *";return a&&(i=i+", #"+this.escapeCssMeta(a).replace(/\s+/g,", #")),this.errors().filter(i)},escapeCssMeta:function(e){return void 0===e?"":e.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(e){return this.groups[e.name]||!this.checkable(e)&&e.id||e.name},validationTargetFor:function(e){return this.checkable(e)&&(e=this.findByName(e.name)),h(e).not(this.settings.ignore)[0]},checkable:function(e){return/radio|checkbox/i.test(e.type)},findByName:function(e){return h(this.currentForm).find("[name='"+this.escapeCssMeta(e)+"']")},getLength:function(e,t){switch(t.nodeName.toLowerCase()){case"select":return h("option:selected",t).length;case"input":if(this.checkable(t))return this.findByName(t.name).filter(":checked").length}return e.length},depend:function(e,t){return!this.dependTypes[typeof e]||this.dependTypes[typeof e](e,t)},dependTypes:{boolean:function(e){return e},string:function(e,t){return!!h(e,t.form).length},function:function(e,t){return e(t)}},optional:function(e){var t=this.elementValue(e);return!h.validator.methods.required.call(this,t,e)&&"dependency-mismatch"},elementAjaxPort:function(e){return"validate"+e.name},startRequest:function(e){this.pending[e.name]||(this.pendingRequest++,h(e).addClass(this.settings.pendingClass),this.pending[e.name]=!0)},stopRequest:function(e,t){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[e.name],h(e).removeClass(this.settings.pendingClass),t&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(h(this.currentForm).trigger("submit"),this.submitButton&&h("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!t&&0===this.pendingRequest&&this.formSubmitted&&(h(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},abortRequest:function(e){var t;this.pending[e.name]&&(t=this.elementAjaxPort(e),h.ajaxAbort(t),this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[e.name],h(e).removeClass(this.settings.pendingClass))},previousValue:function(e,t){return t="string"==typeof t&&t||"remote",h.data(e,"previousValue")||h.data(e,"previousValue",{old:null,valid:!0,message:this.defaultMessage(e,{method:t})})},destroy:function(){this.resetForm(),h(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(e,t){e.constructor===String?this.classRuleSettings[e]=t:h.extend(this.classRuleSettings,e)},classRules:function(e){var t={},a=h(e).attr("class");return a&&h.each(a.split(" "),function(){this in h.validator.classRuleSettings&&h.extend(t,h.validator.classRuleSettings[this])}),t},normalizeAttributeRule:function(e,t,a,i){/min|max|step/.test(a)&&(null===t||/number|range|text/.test(t))&&(i=Number(i),isNaN(i)&&(i=void 0)),i||0===i?e[a]=i:t===a&&"range"!==t&&(e["date"===t?"dateISO":a]=!0)},attributeRules:function(e){var t,a,i={},r=h(e),n=e.getAttribute("type");for(t in h.validator.methods)a="required"===t?(""===(a=e.getAttribute(t))&&(a=!0),!!a):r.attr(t),this.normalizeAttributeRule(i,n,t,a);return i.maxlength&&/-1|2147483647|524288/.test(i.maxlength)&&delete i.maxlength,i},dataRules:function(e){var t,a,i={},r=h(e),n=e.getAttribute("type");for(t in h.validator.methods)""===(a=r.data("rule"+t.charAt(0).toUpperCase()+t.substring(1).toLowerCase()))&&(a=!0),this.normalizeAttributeRule(i,n,t,a);return i},staticRules:function(e){var t={},a=h.data(e.form,"validator");return a.settings.rules&&(t=h.validator.normalizeRule(a.settings.rules[e.name])||{}),t},normalizeRules:function(i,r){return h.each(i,function(e,t){if(!1!==t){if(t.param||t.depends){var a=!0;switch(typeof t.depends){case"string":a=!!h(t.depends,r.form).length;break;case"function":a=t.depends.call(r,r)}a?i[e]=void 0===t.param||t.param:(h.data(r.form,"validator").resetElements(h(r)),delete i[e])}}else delete i[e]}),h.each(i,function(e,t){i[e]="function"==typeof t&&"normalizer"!==e?t(r):t}),h.each(["minlength","maxlength"],function(){i[this]&&(i[this]=Number(i[this]))}),h.each(["rangelength","range"],function(){var e;i[this]&&(Array.isArray(i[this])?i[this]=[Number(i[this][0]),Number(i[this][1])]:"string"==typeof i[this]&&(e=i[this].replace(/[\[\]]/g,"").split(/[\s,]+/),i[this]=[Number(e[0]),Number(e[1])]))}),h.validator.autoCreateRanges&&(null!=i.min&&null!=i.max&&(i.range=[i.min,i.max],delete i.min,delete i.max),null!=i.minlength&&null!=i.maxlength&&(i.rangelength=[i.minlength,i.maxlength],delete i.minlength,delete i.maxlength)),i},normalizeRule:function(e){var t;return"string"==typeof e&&(t={},h.each(e.split(/\s/),function(){t[this]=!0}),e=t),e},addMethod:function(e,t,a){h.validator.methods[e]=t,h.validator.messages[e]=void 0!==a?a:h.validator.messages[e],t.length<3&&h.validator.addClassRules(e,h.validator.normalizeRule(e))},methods:{required:function(e,t,a){if(!this.depend(a,t))return"dependency-mismatch";if("select"!==t.nodeName.toLowerCase())return this.checkable(t)?0<this.getLength(e,t):null!=e&&0<e.length;var i=h(t).val();return i&&0<i.length},email:function(e,t){return this.optional(t)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(e)},url:function(e,t){return this.optional(t)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(e)},date:(i=!1,function(e,t){return i||(i=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(t)||!/Invalid|NaN/.test(new Date(e).toString())}),dateISO:function(e,t){return this.optional(t)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(e)},number:function(e,t){return this.optional(t)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(e)},digits:function(e,t){return this.optional(t)||/^\d+$/.test(e)},minlength:function(e,t,a){var i=Array.isArray(e)?e.length:this.getLength(e,t);return this.optional(t)||a<=i},maxlength:function(e,t,a){var i=Array.isArray(e)?e.length:this.getLength(e,t);return this.optional(t)||i<=a},rangelength:function(e,t,a){var i=Array.isArray(e)?e.length:this.getLength(e,t);return this.optional(t)||i>=a[0]&&i<=a[1]},min:function(e,t,a){return this.optional(t)||a<=e},max:function(e,t,a){return this.optional(t)||e<=a},range:function(e,t,a){return this.optional(t)||e>=a[0]&&e<=a[1]},step:function(e,t,a){function i(e){var t=(""+e).match(/(?:\.(\d+))?$/);return t&&t[1]?t[1].length:0}function r(e){return Math.round(e*Math.pow(10,n))}var n,s=h(t).attr("type"),o="Step attribute on input type "+s+" is not supported.",l=new RegExp("\\b"+s+"\\b"),u=!0;if(s&&!l.test(["text","number","range"].join()))throw new Error(o);return n=i(a),(i(e)>n||r(e)%r(a)!=0)&&(u=!1),this.optional(t)||u},equalTo:function(e,t,a){var i=h(a);return this.settings.onfocusout&&i.not(".validate-equalTo-blur").length&&i.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){h(t).valid()}),e===i.val()},remote:function(n,s,e,o){if(this.optional(s))return"dependency-mismatch";o="string"==typeof o&&o||"remote";var l,t,a,u=this.previousValue(s,o);return this.settings.messages[s.name]||(this.settings.messages[s.name]={}),u.originalMessage=u.originalMessage||this.settings.messages[s.name][o],this.settings.messages[s.name][o]=u.message,e="string"==typeof e?{url:e}:e,a=h.param(h.extend({data:n},e.data)),u.old===a?u.valid:(u.old=a,(l=this).startRequest(s),(t={})[s.name]=n,h.ajax(h.extend(!0,{mode:"abort",port:this.elementAjaxPort(s),dataType:"json",data:t,context:l.currentForm,success:function(e){var t,a,i,r=!0===e||"true"===e;l.settings.messages[s.name][o]=u.originalMessage,r?(i=l.formSubmitted,l.toHide=l.errorsFor(s),l.formSubmitted=i,l.successList.push(s),l.invalid[s.name]=!1,l.showErrors()):(t={},a=e||l.defaultMessage(s,{method:o,parameters:n}),t[s.name]=u.message=a,l.invalid[s.name]=!0,l.showErrors(t)),u.valid=r,l.stopRequest(s,r)}},e)),"pending")}}});var r,n={};return h.ajaxPrefilter?h.ajaxPrefilter(function(e,t,a){var i=e.port;"abort"===e.mode&&(h.ajaxAbort(i),n[i]=a)}):(r=h.ajax,h.ajax=function(e){var t=("mode"in e?e:h.ajaxSettings).mode,a=("port"in e?e:h.ajaxSettings).port;return"abort"===t?(h.ajaxAbort(a),n[a]=r.apply(this,arguments),n[a]):r.apply(this,arguments)}),h.ajaxAbort=function(e){n[e]&&(n[e].abort(),delete n[e])},h}),function(e,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof module&&module.exports?module.exports=t():e.DateFormatter=t()}("undefined"!=typeof self?self:this,function(){var b={DAY:864e5,HOUR:3600,defaults:{dateSettings:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],meridiem:["AM","PM"],ordinal:function(e){var t=e%10,a={1:"st",2:"nd",3:"rd"};return 1!==Math.floor(e%100/10)&&a[t]?a[t]:"th"}},separators:/[ \-+\/.:@]/g,validParts:/[dDjlNSwzWFmMntLoYyaABgGhHisueTIOPZcrU]/g,intParts:/[djwNzmnyYhHgGis]/g,tzParts:/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,tzClip:/[^-+\dA-Z]/g},getInt:function(e,t){return parseInt(e,t||10)},compare:function(e,t){return"string"==typeof e&&"string"==typeof t&&e.toLowerCase()===t.toLowerCase()},lpad:function(e,t,a){var i=e.toString();return a=a||"0",i.length<t?b.lpad(a+i,t):i},merge:function(e){var t,a;for(e=e||{},t=1;t<arguments.length;t++)if(a=arguments[t])for(var i in a)a.hasOwnProperty(i)&&("object"==typeof a[i]?b.merge(e[i],a[i]):e[i]=a[i]);return e},getIndex:function(e,t){for(var a=0;a<t.length;a++)if(t[a].toLowerCase()===e.toLowerCase())return a;return-1}},e=function(e){var t=this,a=b.merge(b.defaults,e);t.dateSettings=a.dateSettings,t.separators=a.separators,t.validParts=a.validParts,t.intParts=a.intParts,t.tzParts=a.tzParts,t.tzClip=a.tzClip};return e.prototype={constructor:e,getMonth:function(e){var t=b.getIndex(e,this.dateSettings.monthsShort)+1;return 0===t&&(t=b.getIndex(e,this.dateSettings.months)+1),t},parseDate:function(e,t){var a,i,r,n,s,o,l,u,h,d,c=!1,m=!1,f=this.dateSettings,g={date:null,year:null,month:null,day:null,hour:0,min:0,sec:0};if(!e)return null;if(e instanceof Date)return e;if("U"===t)return(r=b.getInt(e))?new Date(1e3*r):e;switch(typeof e){case"number":return new Date(e);case"string":break;default:return null}if(!(a=t.match(this.validParts))||0===a.length)throw new Error("Invalid date format definition.");for(r=a.length-1;0<=r;r--)"S"===a[r]&&a.splice(r,1);for(i=e.replace(this.separators,"\0").split("\0"),r=0;r<i.length;r++)switch(n=i[r],s=b.getInt(n),a[r]){case"y":case"Y":if(!s)return null;h=n.length,g.year=2===h?b.getInt((s<70?"20":"19")+n):s,c=!0;break;case"m":case"n":case"M":case"F":if(isNaN(s)){if(!(0<(o=this.getMonth(n))))return null;g.month=o}else{if(!(1<=s&&s<=12))return null;g.month=s}c=!0;break;case"d":case"j":if(!(1<=s&&s<=31))return null;g.day=s,c=!0;break;case"g":case"h":if(d=i[l=-1<a.indexOf("a")?a.indexOf("a"):-1<a.indexOf("A")?a.indexOf("A"):-1],-1!==l)u=b.compare(d,f.meridiem[0])?0:b.compare(d,f.meridiem[1])?12:-1,1<=s&&s<=12&&-1!=u?g.hour=s%12==0?u:s+u:0<=s&&s<=23&&(g.hour=s);else{if(!(0<=s&&s<=23))return null;g.hour=s}m=!0;break;case"G":case"H":if(!(0<=s&&s<=23))return null;g.hour=s,m=!0;break;case"i":if(!(0<=s&&s<=59))return null;g.min=s,m=!0;break;case"s":if(!(0<=s&&s<=59))return null;g.sec=s,m=!0}if(!0===c){var p=g.year||0,v=g.month?g.month-1:0,y=g.day||1;g.date=new Date(p,v,y,g.hour,g.min,g.sec,0)}else{if(!0!==m)return null;g.date=new Date(0,0,0,g.hour,g.min,g.sec,0)}return g.date},guessDate:function(e,t){if("string"!=typeof e)return e;var a,i,r,n,s,o,l=e.replace(this.separators,"\0").split("\0"),u=t.match(this.validParts),h=new Date,d=0;if(!/^[djmn]/g.test(u[0]))return e;for(r=0;r<l.length;r++){if(d=2,s=l[r],o=b.getInt(s.substr(0,2)),isNaN(o))return null;switch(r){case 0:"m"===u[0]||"n"===u[0]?h.setMonth(o-1):h.setDate(o);break;case 1:"m"===u[0]||"n"===u[0]?h.setDate(o):h.setMonth(o-1);break;case 2:if(i=h.getFullYear(),d=(a=s.length)<4?a:4,!(i=b.getInt(a<4?i.toString().substr(0,4-a)+s:s.substr(0,4))))return null;h.setFullYear(i);break;case 3:h.setHours(o);break;case 4:h.setMinutes(o);break;case 5:h.setSeconds(o)}0<(n=s.substr(d)).length&&l.splice(r+1,0,n)}return h},parseFormat:function(e,i){function t(e,t){return s[e]?s[e]():t}var a=this,r=a.dateSettings,n=/\\?(.?)/gi,s={d:function(){return b.lpad(s.j(),2)},D:function(){return r.daysShort[s.w()]},j:function(){return i.getDate()},l:function(){return r.days[s.w()]},N:function(){return s.w()||7},w:function(){return i.getDay()},z:function(){var e=new Date(s.Y(),s.n()-1,s.j()),t=new Date(s.Y(),0,1);return Math.round((e-t)/b.DAY)},W:function(){var e=new Date(s.Y(),s.n()-1,s.j()-s.N()+3),t=new Date(e.getFullYear(),0,4);return b.lpad(1+Math.round((e-t)/b.DAY/7),2)},F:function(){return r.months[i.getMonth()]},m:function(){return b.lpad(s.n(),2)},M:function(){return r.monthsShort[i.getMonth()]},n:function(){return i.getMonth()+1},t:function(){return new Date(s.Y(),s.n(),0).getDate()},L:function(){var e=s.Y();return e%4==0&&e%100!=0||e%400==0?1:0},o:function(){var e=s.n(),t=s.W();return s.Y()+(12===e&&t<9?1:1===e&&9<t?-1:0)},Y:function(){return i.getFullYear()},y:function(){return s.Y().toString().slice(-2)},a:function(){return s.A().toLowerCase()},A:function(){var e=s.G()<12?0:1;return r.meridiem[e]},B:function(){var e=i.getUTCHours()*b.HOUR,t=60*i.getUTCMinutes(),a=i.getUTCSeconds();return b.lpad(Math.floor((e+t+a+b.HOUR)/86.4)%1e3,3)},g:function(){return s.G()%12||12},G:function(){return i.getHours()},h:function(){return b.lpad(s.g(),2)},H:function(){return b.lpad(s.G(),2)},i:function(){return b.lpad(i.getMinutes(),2)},s:function(){return b.lpad(i.getSeconds(),2)},u:function(){return b.lpad(1e3*i.getMilliseconds(),6)},e:function(){return/\((.*)\)/.exec(String(i))[1]||"Coordinated Universal Time"},I:function(){return new Date(s.Y(),0)-Date.UTC(s.Y(),0)!=new Date(s.Y(),6)-Date.UTC(s.Y(),6)?1:0},O:function(){var e=i.getTimezoneOffset(),t=Math.abs(e);return(0<e?"-":"+")+b.lpad(100*Math.floor(t/60)+t%60,4)},P:function(){var e=s.O();return e.substr(0,3)+":"+e.substr(3,2)},T:function(){return(String(i).match(a.tzParts)||[""]).pop().replace(a.tzClip,"")||"UTC"},Z:function(){return 60*-i.getTimezoneOffset()},c:function(){return"Y-m-d\\TH:i:sP".replace(n,t)},r:function(){return"D, d M Y H:i:s O".replace(n,t)},U:function(){return i.getTime()/1e3||0}};return t(e,e)},formatDate:function(e,t){var a,i,r,n,s,o="";if("string"==typeof e&&!(e=this.parseDate(e,t)))return null;if(e instanceof Date){for(r=t.length,a=0;a<r;a++)"S"!==(s=t.charAt(a))&&"\\"!==s&&(0<a&&"\\"===t.charAt(a-1)?o+=s:(n=this.parseFormat(s,e),a!==r-1&&this.intParts.test(s)&&"S"===t.charAt(a+1)&&(i=b.getInt(n)||0,n+=this.dateSettings.ordinal(i)),o+=n));return o}return""}},e}),laravelValidation={implicitRules:["Required","Confirmed"],init:function(){var a=$.fn.validate;$.fn.validate=function(e){var t="proengsoft_jsvalidation";return 0===$(this).find('input[name="'+t+'"]').length&&$("<input>").attr({type:"hidden",name:t}).appendTo(this),a.apply(this,[e])},$.validator.classRuleSettings={},$.validator.attributeRules=function(){},$.validator.dataRules=this.arrayRules,$.validator.prototype.arrayRulesCache={},this.setupValidations()},arrayRules:function(r){var n={},e=$.data(r.form,"validator"),s=e.arrayRulesCache;return-1===r.name.indexOf("[")||(r.name in s||(s[r.name]={}),$.each(e.settings.rules,function(e,t){var a,i;e in s[r.name]?n=laravelValidation.helpers.mergeRules(n,s[r.name][e]):(s[r.name][e]={},a=laravelValidation.helpers.regexFromWildcard(e),r.name.match(a)&&(i=$.validator.normalizeRule(t)||{},s[r.name][e]=i,n=laravelValidation.helpers.mergeRules(n,i)))})),n},setupValidations:function(){function r(e){var t=$(e.currentForm).attr("method");return $(e.currentForm).find('input[name="_method"]').length&&(t=$(e.currentForm).find('input[name="_method"]').val()),t}function h(a,e,i,t){return{mode:"abort",port:"validate"+e.name,dataType:"json",data:t,context:a.currentForm,url:$(a.currentForm).attr("action"),type:r(a),beforeSend:function(e){var t=i[0][1][1];if("get"!==r(a)&&t)return e.setRequestHeader("X-XSRF-TOKEN",t)}}}function l(s,i,o,e){var l=!0,u=s.previousValue(o);return $.each(e,function(e,t){var a=t[3]||-1!==laravelValidation.implicitRules.indexOf(t[0]),r=t[0],n=t[2];return!a&&s.optional(o)?!(l="dependency-mismatch"):(void 0!==laravelValidation.methods[r]?$.each(i,function(e,i){if(!1===(l=laravelValidation.methods[r].call(s,i,o,t[1],function(e){var t,a;s.settings.messages[o.name].laravelValidationRemote=u.originalMessage,e?(t=s.formSubmitted,s.prepareElement(o),s.formSubmitted=t,s.successList.push(o),delete s.invalid[o.name],s.showErrors()):((a={})[o.name]=u.message="function"==typeof n?n(i):n,s.invalid[o.name]=!0,s.showErrors(a)),s.showErrors(s.errorMap),u.valid=e})))return!1}):l=!1,!0!==l?(s.settings.messages[o.name]||(s.settings.messages[o.name]={}),s.settings.messages[o.name].laravelValidation=n,!1):void 0)}),l}$.validator.addMethod("laravelValidation",function(e,t,a){var i=[],r=[];$.each(a,function(e,t){var a=-1!==t[4].indexOf("[");t[3]||-1!==laravelValidation.implicitRules.indexOf(t[0])?a?r.unshift(t):i.unshift(t):a?r.push(t):i.push(t)});var n=l(this,[e],t,i),s=Array.isArray(e)?e:[e],o=l(this,s,t,r);return n&&o},""),$.validator.addMethod("laravelValidationRemote",function(s,o,e){if(t=e,a=!1,$.each(t,function(e,t){a=a||t[3]}),!a&&this.optional(o))return"dependency-mismatch";var t,a,l,i,u=this.previousValue(o);return this.settings.messages[o.name]||(this.settings.messages[o.name]={}),u.originalMessage=this.settings.messages[o.name].laravelValidationRemote,this.settings.messages[o.name].laravelValidationRemote=u.message,laravelValidation.helpers.arrayEquals(u.old,s)||u.old===s?u.valid:(u.old=s,(l=this).startRequest(o),(i=$(l.currentForm).serializeArray()).push({name:"_jsvalidation",value:o.name}),i.push({name:"_jsvalidation_validate_all",value:e[0][1][2]}),$.ajax(h(l,o,e,i)).always(function(e,t){var a,i,r,n;if("error"===t)n=!1,e=laravelValidation.helpers.parseErrorResponse(e);else{if("success"!==t)return;n=!0===e||"true"===e}l.settings.messages[o.name].laravelValidationRemote=u.originalMessage,n?(r=l.formSubmitted,l.prepareElement(o),l.formSubmitted=r,l.successList.push(o),delete l.invalid[o.name],l.showErrors()):(a={},i=e||l.defaultMessage(o,"remote"),a[o.name]=u.message="function"==typeof i?i(s):i[0],l.invalid[o.name]=!0,l.showErrors(a)),l.showErrors(l.errorMap),u.valid=n,l.stopRequest(o,n)}),"pending")},""),$.validator.addMethod("laravelValidationFormRequest",function(e,r,t){var n=this,s=n.previousValue(r),a=$(n.currentForm).serializeArray();return a.push({name:"__proengsoft_form_request",value:1}),JSON.stringify(s.old)===JSON.stringify(a)?(s.valid||n.showErrors(s.errors||{}),s.valid):(s.old=a,this.startRequest(r),$.ajax(h(n,r,t,a)).always(function(e,t){var i={},a="success"===t&&(!0===e||"true"===e);a?(n.resetInternals(),n.toHide=n.errorsFor(r)):($.each(e,function(e,t){var a=laravelValidation.helpers.findByName(n,e)[0];a&&(i[a.name]=laravelValidation.helpers.encode(t[0]||""))}),$.isEmptyObject(i)&&(a=!0)),s.valid=a,s.errors=i,n.showErrors(i),n.stopRequest(r,a)}),"pending")},"")}},$(function(){laravelValidation.init()}),function(){"use strict";var i={"./node_modules/locutus/php/array/array_diff.js":function(e){e.exports=function(e){var t,a={},i=arguments.length,r="",n=1,s="";e:for(r in e)for(n=1;n<i;n++){for(s in t=arguments[n])if(t[s]===e[r])continue e;a[r]=e[r]}return a}},"./node_modules/locutus/php/datetime/strtotime.js":function(e){var t="[ \\t]+",a="[ \\t]*",i="(?:([ap])\\.?m\\.?([\\t ]|$))",r="(2[0-4]|[01]?[0-9])",n="([01][0-9]|2[0-4])",s="(0?[1-9]|1[0-2])",o="([0-5]?[0-9])",l="([0-5][0-9])",u="(60|[0-5]?[0-9])",h="(60|[0-5][0-9])",d="(?:\\.([0-9]+))",c="sunday|monday|tuesday|wednesday|thursday|friday|saturday",m="sun|mon|tue|wed|thu|fri|sat",f=c+"|"+m+"|weekdays?",g="first|second|third|fourth|fifth|sixth|seventh|eighth?|ninth|tenth|eleventh|twelfth",p="next|last|previous|this",v="(?:second|sec|minute|min|hour|day|fortnight|forthnight|month|year)s?|weeks|"+f,y="([0-9]{1,4})",b="([0-9]{4})",w="(1[0-2]|0?[0-9])",x="(0[0-9]|1[0-2])",k="(?:(3[01]|[0-2]?[0-9])(?:st|nd|rd|th)?)",R="(0[0-9]|[1-2][0-9]|3[01])",F="january|february|march|april|may|june|july|august|september|october|november|december",E="jan|feb|mar|apr|may|jun|jul|aug|sept?|oct|nov|dec",S="("+F+"|"+E+"|i[vx]|vi{0,3}|xi{0,2}|i{1,3})",A="((?:GMT)?([+-])"+r+":?"+o+"?)",C=S+"[ .\\t-]*"+k+"[,.stndrh\\t ]*";function T(e,t){switch(t=t&&t.toLowerCase()){case"a":e+=12===e?-12:0;break;case"p":e+=12!==e?12:0}return e}function N(e){var t=+e;return e.length<4&&t<100&&(t+=t<70?2e3:1900),t}function j(e){return{jan:0,january:0,i:0,feb:1,february:1,ii:1,mar:2,march:2,iii:2,apr:3,april:3,iv:3,may:4,v:4,jun:5,june:5,vi:5,jul:6,july:6,vii:6,aug:7,august:7,viii:7,sep:8,sept:8,september:8,ix:8,oct:9,october:9,x:9,nov:10,november:10,xi:10,dec:11,december:11,xii:11}[e.toLowerCase()]}function _(e,t){var a=1<arguments.length&&void 0!==t?t:0;return{mon:1,monday:1,tue:2,tuesday:2,wed:3,wednesday:3,thu:4,thursday:4,fri:5,friday:5,sat:6,saturday:6,sun:0,sunday:0}[e.toLowerCase()]||a}function $(e,t){if(!(e=e&&e.match(/(?:GMT)?([+-])(\d+)(:?)(\d{0,2})/i)))return t;var a="-"===e[1]?-1:1,i=+e[2],r=+e[4];return e[4]||e[3]||(r=Math.floor(i%100),i=Math.floor(i/100)),a*(60*i+r)*60}var z={acdt:37800,acst:34200,addt:-7200,adt:-10800,aedt:39600,aest:36e3,ahdt:-32400,ahst:-36e3,akdt:-28800,akst:-32400,amt:-13840,apt:-10800,ast:-14400,awdt:32400,awst:28800,awt:-10800,bdst:7200,bdt:-36e3,bmt:-14309,bst:3600,cast:34200,cat:7200,cddt:-14400,cdt:-18e3,cemt:10800,cest:7200,cet:3600,cmt:-15408,cpt:-18e3,cst:-21600,cwt:-18e3,chst:36e3,dmt:-1521,eat:10800,eddt:-10800,edt:-14400,eest:10800,eet:7200,emt:-26248,ept:-14400,est:-18e3,ewt:-14400,ffmt:-14660,fmt:-4056,gdt:39600,gmt:0,gst:36e3,hdt:-34200,hkst:32400,hkt:28800,hmt:-19776,hpt:-34200,hst:-36e3,hwt:-34200,iddt:14400,idt:10800,imt:25025,ist:7200,jdt:36e3,jmt:8440,jst:32400,kdt:36e3,kmt:5736,kst:30600,lst:9394,mddt:-18e3,mdst:16279,mdt:-21600,mest:7200,met:3600,mmt:9017,mpt:-21600,msd:14400,msk:10800,mst:-25200,mwt:-21600,nddt:-5400,ndt:-9052,npt:-9e3,nst:-12600,nwt:-9e3,nzdt:46800,nzmt:41400,nzst:43200,pddt:-21600,pdt:-25200,pkst:21600,pkt:18e3,plmt:25590,pmt:-13236,ppmt:-17340,ppt:-25200,pst:-28800,pwt:-25200,qmt:-18840,rmt:5794,sast:7200,sdmt:-16800,sjmt:-20173,smt:-13884,sst:-39600,tbmt:10751,tmt:12344,uct:0,utc:0,wast:7200,wat:3600,wemt:7200,west:3600,wet:0,wib:25200,wita:28800,wit:32400,wmt:5040,yddt:-25200,ydt:-28800,ypt:-28800,yst:-32400,ywt:-28800,a:3600,b:7200,c:10800,d:14400,e:18e3,f:21600,g:25200,h:28800,i:32400,k:36e3,l:39600,m:43200,n:-3600,o:-7200,p:-10800,q:-14400,r:-18e3,s:-21600,t:-25200,u:-28800,v:-32400,w:-36e3,x:-39600,y:-43200,z:0},D={yesterday:{regex:/^yesterday/i,name:"yesterday",callback:function(){return--this.rd,this.resetTime()}},now:{regex:/^now/i,name:"now"},noon:{regex:/^noon/i,name:"noon",callback:function(){return this.resetTime()&&this.time(12,0,0,0)}},midnightOrToday:{regex:/^(midnight|today)/i,name:"midnight | today",callback:function(){return this.resetTime()}},tomorrow:{regex:/^tomorrow/i,name:"tomorrow",callback:function(){return this.rd+=1,this.resetTime()}},timestamp:{regex:/^@(-?\d+)/i,name:"timestamp",callback:function(e,t){return this.rs+=+t,this.y=1970,this.m=0,this.d=1,this.dates=0,this.resetTime()&&this.zone(0)}},firstOrLastDay:{regex:/^(first|last) day of/i,name:"firstdayof | lastdayof",callback:function(e,t){"first"===t.toLowerCase()?this.firstOrLastDayOfMonth=1:this.firstOrLastDayOfMonth=-1}},backOrFrontOf:{regex:RegExp("^(back|front) of "+r+a+i+"?","i"),name:"backof | frontof",callback:function(e,t,a,i){var r=+a,n=15;return"back"===t.toLowerCase()||(--r,n=45),r=T(r,i),this.resetTime()&&this.time(r,n,0,0)}},weekdayOf:{regex:RegExp("^("+g+"|"+p+")"+t+"("+c+"|"+m+")"+t+"of","i"),name:"weekdayof"},mssqltime:{regex:RegExp("^"+s+":"+l+":"+h+"[:.]([0-9]+)"+i,"i"),name:"mssqltime",callback:function(e,t,a,i,r,n){return this.time(T(+t,n),+a,+i,+r.substr(0,3))}},timeLong12:{regex:RegExp("^"+s+"[:.]"+o+"[:.]"+h+a+i,"i"),name:"timelong12",callback:function(e,t,a,i,r){return this.time(T(+t,r),+a,+i,0)}},timeShort12:{regex:RegExp("^"+s+"[:.]"+l+a+i,"i"),name:"timeshort12",callback:function(e,t,a,i){return this.time(T(+t,i),+a,0,0)}},timeTiny12:{regex:RegExp("^"+s+a+i,"i"),name:"timetiny12",callback:function(e,t,a){return this.time(T(+t,a),0,0,0)}},soap:{regex:RegExp("^"+b+"-"+x+"-"+R+"T"+n+":"+l+":"+h+d+A+"?","i"),name:"soap",callback:function(e,t,a,i,r,n,s,o,l){return this.ymd(+t,a-1,+i)&&this.time(+r,+n,+s,+o.substr(0,3))&&this.zone($(l))}},wddx:{regex:RegExp("^"+b+"-"+w+"-"+k+"T"+r+":"+o+":"+u),name:"wddx",callback:function(e,t,a,i,r,n,s){return this.ymd(+t,a-1,+i)&&this.time(+r,+n,+s,0)}},exif:{regex:RegExp("^"+b+":"+x+":"+R+" "+n+":"+l+":"+h,"i"),name:"exif",callback:function(e,t,a,i,r,n,s){return this.ymd(+t,a-1,+i)&&this.time(+r,+n,+s,0)}},xmlRpc:{regex:RegExp("^"+b+x+R+"T"+r+":"+l+":"+h),name:"xmlrpc",callback:function(e,t,a,i,r,n,s){return this.ymd(+t,a-1,+i)&&this.time(+r,+n,+s,0)}},xmlRpcNoColon:{regex:RegExp("^"+b+x+R+"[Tt]"+r+l+h),name:"xmlrpcnocolon",callback:function(e,t,a,i,r,n,s){return this.ymd(+t,a-1,+i)&&this.time(+r,+n,+s,0)}},clf:{regex:RegExp("^"+k+"/("+E+")/"+b+":"+n+":"+l+":"+h+t+A,"i"),name:"clf",callback:function(e,t,a,i,r,n,s,o){return this.ymd(+i,j(a),+t)&&this.time(+r,+n,+s,0)&&this.zone($(o))}},iso8601long:{regex:RegExp("^t?"+r+"[:.]"+o+"[:.]"+u+d,"i"),name:"iso8601long",callback:function(e,t,a,i,r){return this.time(+t,+a,+i,+r.substr(0,3))}},dateTextual:{regex:RegExp("^"+S+"[ .\\t-]*"+k+"[,.stndrh\\t ]+"+y,"i"),name:"datetextual",callback:function(e,t,a,i){return this.ymd(N(i),j(t),+a)}},pointedDate4:{regex:RegExp("^"+k+"[.\\t-]"+w+"[.-]"+b),name:"pointeddate4",callback:function(e,t,a,i){return this.ymd(+i,a-1,+t)}},pointedDate2:{regex:RegExp("^"+k+"[.\\t]"+w+"\\.([0-9]{2})"),name:"pointeddate2",callback:function(e,t,a,i){return this.ymd(N(i),a-1,+t)}},timeLong24:{regex:RegExp("^t?"+r+"[:.]"+o+"[:.]"+u),name:"timelong24",callback:function(e,t,a,i){return this.time(+t,+a,+i,0)}},dateNoColon:{regex:RegExp("^"+b+x+R),name:"datenocolon",callback:function(e,t,a,i){return this.ymd(+t,a-1,+i)}},pgydotd:{regex:RegExp("^"+b+"\\.?(00[1-9]|0[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6])"),name:"pgydotd",callback:function(e,t,a){return this.ymd(+t,0,+a)}},timeShort24:{regex:RegExp("^t?"+r+"[:.]"+o,"i"),name:"timeshort24",callback:function(e,t,a){return this.time(+t,+a,0,0)}},iso8601noColon:{regex:RegExp("^t?"+n+l+h,"i"),name:"iso8601nocolon",callback:function(e,t,a,i){return this.time(+t,+a,+i,0)}},iso8601dateSlash:{regex:RegExp("^"+b+"/"+x+"/"+R+"/"),name:"iso8601dateslash",callback:function(e,t,a,i){return this.ymd(+t,a-1,+i)}},dateSlash:{regex:RegExp("^"+b+"/"+w+"/"+k),name:"dateslash",callback:function(e,t,a,i){return this.ymd(+t,a-1,+i)}},american:{regex:RegExp("^"+w+"/"+k+"/"+y),name:"american",callback:function(e,t,a,i){return this.ymd(N(i),t-1,+a)}},americanShort:{regex:RegExp("^"+w+"/"+k),name:"americanshort",callback:function(e,t,a){return this.ymd(this.y,t-1,+a)}},gnuDateShortOrIso8601date2:{regex:RegExp("^"+y+"-"+w+"-"+k),name:"gnudateshort | iso8601date2",callback:function(e,t,a,i){return this.ymd(N(t),a-1,+i)}},iso8601date4:{regex:RegExp("^([+-]?[0-9]{4})-"+x+"-"+R),name:"iso8601date4",callback:function(e,t,a,i){return this.ymd(+t,a-1,+i)}},gnuNoColon:{regex:RegExp("^t?"+n+l,"i"),name:"gnunocolon",callback:function(e,t,a){switch(this.times){case 0:return this.time(+t,+a,0,this.f);case 1:return this.y=100*t+ +a,this.times++,!0;default:return!1}}},gnuDateShorter:{regex:RegExp("^"+b+"-"+w),name:"gnudateshorter",callback:function(e,t,a){return this.ymd(+t,a-1,1)}},pgTextReverse:{regex:RegExp("^(\\d{3,4}|[4-9]\\d|3[2-9])-("+E+")-"+R,"i"),name:"pgtextreverse",callback:function(e,t,a,i){return this.ymd(N(t),j(a),+i)}},dateFull:{regex:RegExp("^"+k+"[ \\t.-]*"+S+"[ \\t.-]*"+y,"i"),name:"datefull",callback:function(e,t,a,i){return this.ymd(N(i),j(a),+t)}},dateNoDay:{regex:RegExp("^"+S+"[ .\\t-]*"+b,"i"),name:"datenoday",callback:function(e,t,a){return this.ymd(+a,j(t),1)}},dateNoDayRev:{regex:RegExp("^"+b+"[ .\\t-]*"+S,"i"),name:"datenodayrev",callback:function(e,t,a){return this.ymd(+t,j(a),1)}},pgTextShort:{regex:RegExp("^("+E+")-"+R+"-"+y,"i"),name:"pgtextshort",callback:function(e,t,a,i){return this.ymd(N(i),j(t),+a)}},dateNoYear:{regex:RegExp("^"+C,"i"),name:"datenoyear",callback:function(e,t,a){return this.ymd(this.y,j(t),+a)}},dateNoYearRev:{regex:RegExp("^"+k+"[ .\\t-]*"+S,"i"),name:"datenoyearrev",callback:function(e,t,a){return this.ymd(this.y,j(a),+t)}},isoWeekDay:{regex:RegExp("^"+b+"-?W(0[1-9]|[1-4][0-9]|5[0-3])(?:-?([0-7]))?"),name:"isoweekday | isoweek",callback:function(e,t,a,i){if(i=i?+i:1,!this.ymd(+t,0,1))return!1;var r=0-(4<(r=new Date(this.y,this.m,this.d).getDay())?r-7:r);this.rd+=r+7*(a-1)+i}},relativeText:{regex:RegExp("^("+g+"|"+p+")"+t+"("+v+")","i"),name:"relativetext",callback:function(e,t,a){var i,r={amount:{last:-1,previous:-1,this:0,first:1,next:1,second:2,third:3,fourth:4,fifth:5,sixth:6,seventh:7,eight:8,eighth:8,ninth:9,tenth:10,eleventh:11,twelfth:12}[i=t.toLowerCase()],behavior:{this:1}[i]||0},n=r.amount;switch(a.toLowerCase()){case"sec":case"secs":case"second":case"seconds":this.rs+=n;break;case"min":case"mins":case"minute":case"minutes":this.ri+=n;break;case"hour":case"hours":this.rh+=n;break;case"day":case"days":this.rd+=n;break;case"fortnight":case"fortnights":case"forthnight":case"forthnights":this.rd+=14*n;break;case"week":case"weeks":this.rd+=7*n;break;case"month":case"months":this.rm+=n;break;case"year":case"years":this.ry+=n;break;case"mon":case"monday":case"tue":case"tuesday":case"wed":case"wednesday":case"thu":case"thursday":case"fri":case"friday":case"sat":case"saturday":case"sun":case"sunday":this.resetTime(),this.weekday=_(a,7),this.weekdayBehavior=1,this.rd+=7*(0<n?n-1:n)}}},relative:{regex:RegExp("^([+-]*)[ \\t]*(\\d+)"+a+"("+v+"|week)","i"),name:"relative",callback:function(e,t,a,i){var r=t.replace(/[^-]/g,"").length,n=a*Math.pow(-1,r);switch(i.toLowerCase()){case"sec":case"secs":case"second":case"seconds":this.rs+=n;break;case"min":case"mins":case"minute":case"minutes":this.ri+=n;break;case"hour":case"hours":this.rh+=n;break;case"day":case"days":this.rd+=n;break;case"fortnight":case"fortnights":case"forthnight":case"forthnights":this.rd+=14*n;break;case"week":case"weeks":this.rd+=7*n;break;case"month":case"months":this.rm+=n;break;case"year":case"years":this.ry+=n;break;case"mon":case"monday":case"tue":case"tuesday":case"wed":case"wednesday":case"thu":case"thursday":case"fri":case"friday":case"sat":case"saturday":case"sun":case"sunday":this.resetTime(),this.weekday=_(i,7),this.weekdayBehavior=1,this.rd+=7*(0<n?n-1:n)}}},dayText:{regex:RegExp("^("+f+")","i"),name:"daytext",callback:function(e,t){this.resetTime(),this.weekday=_(t,0),2!==this.weekdayBehavior&&(this.weekdayBehavior=1)}},relativeTextWeek:{regex:RegExp("^("+p+")"+t+"week","i"),name:"relativetextweek",callback:function(e,t){switch(this.weekdayBehavior=2,t.toLowerCase()){case"this":this.rd+=0;break;case"next":this.rd+=7;break;case"last":case"previous":this.rd-=7}isNaN(this.weekday)&&(this.weekday=1)}},monthFullOrMonthAbbr:{regex:RegExp("^("+F+"|"+E+")","i"),name:"monthfull | monthabbr",callback:function(e,t){return this.ymd(this.y,j(t),this.d)}},tzCorrection:{regex:RegExp("^"+A,"i"),name:"tzcorrection",callback:function(e){return this.zone($(e))}},tzAbbr:{regex:RegExp("^\\(?([a-zA-Z]{1,6})\\)?"),name:"tzabbr",callback:function(e,t){var a=z[t.toLowerCase()];return!isNaN(a)&&this.zone(a)}},ago:{regex:/^ago/i,name:"ago",callback:function(){this.ry=-this.ry,this.rm=-this.rm,this.rd=-this.rd,this.rh=-this.rh,this.ri=-this.ri,this.rs=-this.rs,this.rf=-this.rf}},year4:{regex:RegExp("^"+b),name:"year4",callback:function(e,t){return this.y=+t,!0}},whitespace:{regex:/^[ .,\t]+/,name:"whitespace"},dateShortWithTimeLong:{regex:RegExp("^"+C+"t?"+r+"[:.]"+o+"[:.]"+u,"i"),name:"dateshortwithtimelong",callback:function(e,t,a,i,r,n){return this.ymd(this.y,j(t),+a)&&this.time(+i,+r,+n,0)}},dateShortWithTimeLong12:{regex:RegExp("^"+C+s+"[:.]"+o+"[:.]"+h+a+i,"i"),name:"dateshortwithtimelong12",callback:function(e,t,a,i,r,n,s){return this.ymd(this.y,j(t),+a)&&this.time(T(+i,s),+r,+n,0)}},dateShortWithTimeShort:{regex:RegExp("^"+C+"t?"+r+"[:.]"+o,"i"),name:"dateshortwithtimeshort",callback:function(e,t,a,i,r){return this.ymd(this.y,j(t),+a)&&this.time(+i,+r,0,0)}},dateShortWithTimeShort12:{regex:RegExp("^"+C+s+"[:.]"+l+a+i,"i"),name:"dateshortwithtimeshort12",callback:function(e,t,a,i,r,n){return this.ymd(this.y,j(t),+a)&&this.time(T(+i,n),+r,0,0)}}},M={y:NaN,m:NaN,d:NaN,h:NaN,i:NaN,s:NaN,f:NaN,ry:0,rm:0,rd:0,rh:0,ri:0,rs:0,rf:0,weekday:NaN,weekdayBehavior:0,firstOrLastDayOfMonth:0,z:NaN,dates:0,times:0,zones:0,ymd:function(e,t,a){return!(0<this.dates)&&(this.dates++,this.y=e,this.m=t,this.d=a,!0)},time:function(e,t,a,i){return!(0<this.times)&&(this.times++,this.h=e,this.i=t,this.s=a,this.f=i,!0)},resetTime:function(){return this.h=0,this.i=0,this.s=0,this.f=0,!(this.times=0)},zone:function(e){return this.zones<=1&&(this.zones++,this.z=e,!0)},toDate:function(e){switch(this.dates&&!this.times&&(this.h=this.i=this.s=this.f=0),isNaN(this.y)&&(this.y=e.getFullYear()),isNaN(this.m)&&(this.m=e.getMonth()),isNaN(this.d)&&(this.d=e.getDate()),isNaN(this.h)&&(this.h=e.getHours()),isNaN(this.i)&&(this.i=e.getMinutes()),isNaN(this.s)&&(this.s=e.getSeconds()),isNaN(this.f)&&(this.f=e.getMilliseconds()),this.firstOrLastDayOfMonth){case 1:this.d=1;break;case-1:this.d=0,this.m+=1}var t,a,i;isNaN(this.weekday)||((t=new Date(e.getTime())).setFullYear(this.y,this.m,this.d),t.setHours(this.h,this.i,this.s,this.f),a=t.getDay(),2===this.weekdayBehavior?(0===a&&0!==this.weekday&&(this.weekday=-6),0===this.weekday&&0!==a&&(this.weekday=7),this.d-=a,this.d+=this.weekday):(i=this.weekday-a,(this.rd<0&&i<0||0<=this.rd&&i<=-this.weekdayBehavior)&&(i+=7),0<=this.weekday?this.d+=i:this.d-=7-(Math.abs(this.weekday)-a),this.weekday=NaN)),this.y+=this.ry,this.m+=this.rm,this.d+=this.rd,this.h+=this.rh,this.i+=this.ri,this.s+=this.rs,this.f+=this.rf,this.ry=this.rm=this.rd=0,this.rh=this.ri=this.rs=this.rf=0;var r=new Date(e.getTime());switch(r.setFullYear(this.y,this.m,this.d),r.setHours(this.h,this.i,this.s,this.f),this.firstOrLastDayOfMonth){case 1:r.setDate(1);break;case-1:r.setMonth(r.getMonth()+1,0)}return isNaN(this.z)||r.getTimezoneOffset()===this.z||(r.setUTCFullYear(r.getFullYear(),r.getMonth(),r.getDate()),r.setUTCHours(r.getHours(),r.getMinutes(),r.getSeconds()-this.z,r.getMilliseconds())),r}};e.exports=function(e,t){null==t&&(t=Math.floor(Date.now()/1e3));for(var a=[D.yesterday,D.now,D.noon,D.midnightOrToday,D.tomorrow,D.timestamp,D.firstOrLastDay,D.backOrFrontOf,D.timeTiny12,D.timeShort12,D.timeLong12,D.mssqltime,D.timeShort24,D.timeLong24,D.iso8601long,D.gnuNoColon,D.iso8601noColon,D.americanShort,D.american,D.iso8601date4,D.iso8601dateSlash,D.dateSlash,D.gnuDateShortOrIso8601date2,D.gnuDateShorter,D.dateFull,D.pointedDate4,D.pointedDate2,D.dateNoDay,D.dateNoDayRev,D.dateTextual,D.dateNoYear,D.dateNoYearRev,D.dateNoColon,D.xmlRpc,D.xmlRpcNoColon,D.soap,D.wddx,D.exif,D.pgydotd,D.isoWeekDay,D.pgTextShort,D.pgTextReverse,D.clf,D.year4,D.ago,D.dayText,D.relativeTextWeek,D.relativeText,D.monthFullOrMonthAbbr,D.tzCorrection,D.tzAbbr,D.dateShortWithTimeShort12,D.dateShortWithTimeLong12,D.dateShortWithTimeShort,D.dateShortWithTimeLong,D.relative,D.whitespace],i=Object.create(M);e.length;){for(var r=null,n=null,s=0,o=a.length;s<o;s++){var l=a[s],u=e.match(l.regex);u&&(!r||u[0].length>r[0].length)&&(r=u,n=l)}if(!n||n.callback&&!1===n.callback.apply(i,r))return!1;e=e.substr(r[0].length),r=n=null}return Math.floor(i.toDate(new Date(1e3*t))/1e3)}},"./node_modules/locutus/php/info/ini_get.js":function(e,t,i){e.exports=function(e){var t="undefined"!=typeof window?window:i.g;t.$locutus=t.$locutus||{};var a=t.$locutus;return a.php=a.php||{},a.php.ini=a.php.ini||{},!a.php.ini[e]||void 0===a.php.ini[e].local_value||null===a.php.ini[e].local_value?"":a.php.ini[e].local_value}},"./node_modules/locutus/php/strings/strlen.js":function(e,t,r){e.exports=function(e){var t=e+"";if("off"===(r("./node_modules/locutus/php/info/ini_get.js")("unicode.semantics")||"off"))return t.length;for(var a=0,i=0,a=0,i=0;a<t.length;a++)!1!==function(e,t){var a,i,r=e.charCodeAt(t);if(55296<=r&&r<=56319){if(e.length<=t+1)throw new Error("High surrogate without following low surrogate");if((a=e.charCodeAt(t+1))<56320||57343<a)throw new Error("High surrogate without following low surrogate");return e.charAt(t)+e.charAt(t+1)}if(56320<=r&&r<=57343){if(0===t)throw new Error("Low surrogate without preceding high surrogate");if((i=e.charCodeAt(t-1))<55296||56319<i)throw new Error("Low surrogate without preceding high surrogate");return!1}return e.charAt(t)}(t,a)&&i++;return i}},"./node_modules/locutus/php/var/is_numeric.js":function(e){e.exports=function(e){var t=[" ","\n","\r","\t","\f","\v"," "," "," "," "," "," "," "," "," "," "," "," ","​","\u2028","\u2029"," "].join("");return("number"==typeof e||"string"==typeof e&&-1===t.indexOf(e.slice(-1)))&&""!==e&&!isNaN(e)}}},r={};function l(e){var t=r[e];if(void 0!==t)return t.exports;var a=r[e]={exports:{}};return i[e](a,a.exports,l),a.exports}l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,{a:t}),t},l.d=function(e,t){for(var a in t)l.o(t,a)&&!l.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};!function(){l.r(u);var e=l("./node_modules/locutus/php/strings/strlen.js"),t=l.n(e),a=l("./node_modules/locutus/php/array/array_diff.js"),i=l.n(a),r=l("./node_modules/locutus/php/datetime/strtotime.js"),n=l.n(r),s=l("./node_modules/locutus/php/var/is_numeric.js"),o=l.n(s);$.extend(!0,laravelValidation,{helpers:{numericRules:["Integer","Numeric"],fileinfo:function(e,t){var a=e.value;return t=void 0!==t?t:0,null!==e.files&&void 0!==e.files[t]&&{file:a,extension:a.substr(a.lastIndexOf(".")+1),size:e.files[t].size/1024,type:e.files[t].type}},selector:function(e){var t=[];this.isArray(e)||(e=[e]);for(var a=0;a<e.length;a++)t.push("[name='"+e[a]+"']");return t.join()},hasNumericRules:function(e){return this.hasRules(e,this.numericRules)},hasRules:function(e,r){var n=!1;"string"==typeof r&&(r=[r]);var t=$.data(e.form,"validator"),a=[],i=t.arrayRulesCache;return e.name in i&&$.each(i[e.name],function(e,t){a.push(t)}),e.name in t.settings.rules&&a.push(t.settings.rules[e.name]),$.each(a,function(e,t){if("laravelValidation"in t)for(var a=t.laravelValidation,i=0;i<a.length;i++)if(-1!==$.inArray(a[i][0],r))return!(n=!0)}),n},strlen:function(e){return t()(e)},getSize:function(e,t,a){return this.hasNumericRules(t)&&this.is_numeric(a)?parseFloat(a):this.isArray(a)?parseFloat(a.length):"file"===t.type?parseFloat(Math.floor(this.fileinfo(t).size)):parseFloat(this.strlen(a))},getLaravelValidation:function(a,e){var i=void 0;return $.each($.validator.staticRules(e),function(e,t){"laravelValidation"===e&&$.each(t,function(e,t){t[0]===a&&(i=t)})}),i},parseTime:function(e,t){var a,i=!1,r=new DateFormatter;return"number"==typeof e&&void 0===t?e:("object"==typeof t&&(t=void 0!==(a=this.getLaravelValidation("DateFormat",t))?a[1][0]:null),i=null==t?this.strtotime(e):(i=r.parseDate(e,t))instanceof Date&&r.formatDate(i,t)===e&&Math.round(i.getTime()/1e3))},compareDates:function(e,t,a,i,r){var n=this.parseTime(i);if(!n){var s=this.dependentElement(e,a,i);if(void 0===s)return!1;n=this.parseTime(e.elementValue(s),s)}var o=this.parseTime(t,a);if(!1===o)return!1;switch(r){case"<":return o<n;case"<=":return o<=n;case"==":case"===":return o===n;case">":return n<o;case">=":return n<=o;default:throw new Error("Unsupported operator.")}},guessDate:function(e,t){return(new DateFormatter).guessDate(e,t)},strtotime:function(e,t){return n()(e,t)},is_numeric:function(e){return o()(e)},isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},arrayDiff:function(e,t){return i()(e,t)},arrayEquals:function(e,t){return!(!this.isArray(e)||!this.isArray(t))&&(e.length===t.length&&$.isEmptyObject(this.arrayDiff(e,t)))},dependentElement:function(e,t,a){var i,r,n=e.findByName(a);return void 0!==n[0]&&e.settings.onfocusout&&(i="blur","SELECT"!==n[0].tagName&&"OPTION"!==n[0].tagName&&"checkbox"!==n[0].type&&"radio"!==n[0].type||(i="click"),r=".validate-laravelValidation",n.off(r).off(i+r+"-"+t.name).on(i+r+"-"+t.name,function(){$(t).valid()})),n[0]},parseErrorResponse:function(e){var t,a=["Whoops, looks like something went wrong."];return"responseText"in e&&(t=e.responseText.match(/<h1\s*>(.*)<\/h1\s*>/i),this.isArray(t)&&(a=[t[1]])),a},escapeRegExp:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},regexFromWildcard:function(e){var t=e.split("[*]");return 1===t.length&&t.push(""),new RegExp("^"+t.map(function(e){return laravelValidation.helpers.escapeRegExp(e)}).join("\\[[^\\]]*\\]")+"$")},mergeRules:function(e,t){var a={laravelValidation:t.laravelValidation||[],laravelValidationRemote:t.laravelValidationRemote||[]};for(var i in a)0!==a[i].length&&(void 0===e[i]&&(e[i]=[]),e[i]=e[i].concat(a[i]));return e},encode:function(e){return $("<div/>").text(e).html()},findByArrayName:function(e,t){for(var a=t.replace(/\.([^\.]+)/g,"[$1]"),i=[a,a+"[]",a.replace(/(.*)\[(.*)\]$/g,"$1[]")],r=0;r<i.length;r++){var n=e.findByName(i[r]);if(0<n.length)return n}return $(null)},findByName:function(e,t){var a=e.findByName(t);if(0<a.length)return a;for(var i=t.split("."),r=i.length;0<r;r--){for(var n=[],s=0;s<r;s++)n.push(i[s]);if(0<(a=this.findByArrayName(e,n.join("."))).length)return a}return $(null)},allElementValues:function(a,e){return-1!==e.name.indexOf("[]")?a.findByName(e.name).map(function(e,t){return a.elementValue(t)}).get():a.elementValue(e)}}})}()}(),$.extend(!0,laravelValidation,{helpers:{isTimezone:function(e){var t={africa:["abidjan","accra","addis_ababa","algiers","asmara","bamako","bangui","banjul","bissau","blantyre","brazzaville","bujumbura","cairo","casablanca","ceuta","conakry","dakar","dar_es_salaam","djibouti","douala","el_aaiun","freetown","gaborone","harare","johannesburg","juba","kampala","khartoum","kigali","kinshasa","lagos","libreville","lome","luanda","lubumbashi","lusaka","malabo","maputo","maseru","mbabane","mogadishu","monrovia","nairobi","ndjamena","niamey","nouakchott","ouagadougou","porto-novo","sao_tome","tripoli","tunis","windhoek"],america:["adak","anchorage","anguilla","antigua","araguaina","argentina/buenos_aires","argentina/catamarca","argentina/cordoba","argentina/jujuy","argentina/la_rioja","argentina/mendoza","argentina/rio_gallegos","argentina/salta","argentina/san_juan","argentina/san_luis","argentina/tucuman","argentina/ushuaia","aruba","asuncion","atikokan","bahia","bahia_banderas","barbados","belem","belize","blanc-sablon","boa_vista","bogota","boise","cambridge_bay","campo_grande","cancun","caracas","cayenne","cayman","chicago","chihuahua","costa_rica","creston","cuiaba","curacao","danmarkshavn","dawson","dawson_creek","denver","detroit","dominica","edmonton","eirunepe","el_salvador","fortaleza","glace_bay","godthab","goose_bay","grand_turk","grenada","guadeloupe","guatemala","guayaquil","guyana","halifax","havana","hermosillo","indiana/indianapolis","indiana/knox","indiana/marengo","indiana/petersburg","indiana/tell_city","indiana/vevay","indiana/vincennes","indiana/winamac","inuvik","iqaluit","jamaica","juneau","kentucky/louisville","kentucky/monticello","kralendijk","la_paz","lima","los_angeles","lower_princes","maceio","managua","manaus","marigot","martinique","matamoros","mazatlan","menominee","merida","metlakatla","mexico_city","miquelon","moncton","monterrey","montevideo","montreal","montserrat","nassau","new_york","nipigon","nome","noronha","north_dakota/beulah","north_dakota/center","north_dakota/new_salem","ojinaga","panama","pangnirtung","paramaribo","phoenix","port-au-prince","port_of_spain","porto_velho","puerto_rico","rainy_river","rankin_inlet","recife","regina","resolute","rio_branco","santa_isabel","santarem","santiago","santo_domingo","sao_paulo","scoresbysund","shiprock","sitka","st_barthelemy","st_johns","st_kitts","st_lucia","st_thomas","st_vincent","swift_current","tegucigalpa","thule","thunder_bay","tijuana","toronto","tortola","vancouver","whitehorse","winnipeg","yakutat","yellowknife"],antarctica:["casey","davis","dumontdurville","macquarie","mawson","mcmurdo","palmer","rothera","south_pole","syowa","vostok"],arctic:["longyearbyen"],asia:["aden","almaty","amman","anadyr","aqtau","aqtobe","ashgabat","baghdad","bahrain","baku","bangkok","beirut","bishkek","brunei","choibalsan","chongqing","colombo","damascus","dhaka","dili","dubai","dushanbe","gaza","harbin","hebron","ho_chi_minh","hong_kong","hovd","irkutsk","jakarta","jayapura","jerusalem","kabul","kamchatka","karachi","kashgar","kathmandu","khandyga","kolkata","krasnoyarsk","kuala_lumpur","kuching","kuwait","macau","magadan","makassar","manila","muscat","nicosia","novokuznetsk","novosibirsk","omsk","oral","phnom_penh","pontianak","pyongyang","qatar","qyzylorda","rangoon","riyadh","sakhalin","samarkand","seoul","shanghai","singapore","taipei","tashkent","tbilisi","tehran","thimphu","tokyo","ulaanbaatar","urumqi","ust-nera","vientiane","vladivostok","yakutsk","yekaterinburg","yerevan"],atlantic:["azores","bermuda","canary","cape_verde","faroe","madeira","reykjavik","south_georgia","st_helena","stanley"],australia:["adelaide","brisbane","broken_hill","currie","darwin","eucla","hobart","lindeman","lord_howe","melbourne","perth","sydney"],europe:["amsterdam","andorra","athens","belgrade","berlin","bratislava","brussels","bucharest","budapest","busingen","chisinau","copenhagen","dublin","gibraltar","guernsey","helsinki","isle_of_man","istanbul","jersey","kaliningrad","kiev","lisbon","ljubljana","london","luxembourg","madrid","malta","mariehamn","minsk","monaco","moscow","oslo","paris","podgorica","prague","riga","rome","samara","san_marino","sarajevo","simferopol","skopje","sofia","stockholm","tallinn","tirane","uzhgorod","vaduz","vatican","vienna","vilnius","volgograd","warsaw","zagreb","zaporozhye","zurich"],indian:["antananarivo","chagos","christmas","cocos","comoro","kerguelen","mahe","maldives","mauritius","mayotte","reunion"],pacific:["apia","auckland","chatham","chuuk","easter","efate","enderbury","fakaofo","fiji","funafuti","galapagos","gambier","guadalcanal","guam","honolulu","johnston","kiritimati","kosrae","kwajalein","majuro","marquesas","midway","nauru","niue","norfolk","noumea","pago_pago","palau","pitcairn","pohnpei","port_moresby","rarotonga","saipan","tahiti","tarawa","tongatapu","wake","wallis"],utc:[""]},a=e.split("/",2),i=a[0].toLowerCase(),r="";return a[1]&&(r=a[1].toLowerCase()),i in t&&(0===t[i].length||-1!==t[i].indexOf(r))}}}),$.extend(!0,laravelValidation,{methods:{helpers:laravelValidation.helpers,jsRemoteTimer:0,Sometimes:function(){return!0},Bail:function(){return!0},Nullable:function(){return!0},Filled:function(e,t){return $.validator.methods.required.call(this,e,t,!0)},Required:function(e,t){return $.validator.methods.required.call(this,e,t)},RequiredWith:function(e,i,t){var r=this,n=!1,s=this;return $.each(t,function(e,t){var a=laravelValidation.helpers.dependentElement(s,i,t);n=n||void 0!==a&&$.validator.methods.required.call(r,s.elementValue(a),a,!0)}),!n||$.validator.methods.required.call(this,e,i,!0)},RequiredWithAll:function(e,i,t){var r=this,n=!0,s=this;return $.each(t,function(e,t){var a=laravelValidation.helpers.dependentElement(s,i,t);n=n&&void 0!==a&&$.validator.methods.required.call(r,s.elementValue(a),a,!0)}),!n||$.validator.methods.required.call(this,e,i,!0)},RequiredWithout:function(e,i,t){var r=this,n=!1,s=this;return $.each(t,function(e,t){var a=laravelValidation.helpers.dependentElement(s,i,t);n=n||void 0===a||!$.validator.methods.required.call(r,s.elementValue(a),a,!0)}),!n||$.validator.methods.required.call(this,e,i,!0)},RequiredWithoutAll:function(e,i,t){var r=this,n=!0,s=this;return $.each(t,function(e,t){var a=laravelValidation.helpers.dependentElement(s,i,t);n=n&&(void 0===a||!$.validator.methods.required.call(r,s.elementValue(a),a,!0))}),!n||$.validator.methods.required.call(this,e,i,!0)},RequiredIf:function(e,t,a){var i=laravelValidation.helpers.dependentElement(this,t,a[0]);if(void 0!==i){var r=String(this.elementValue(i));if(void 0!==r){var n=a.slice(1);if(-1!==$.inArray(r,n))return $.validator.methods.required.call(this,e,t,!0)}}return!0},RequiredUnless:function(e,t,a){var i=laravelValidation.helpers.dependentElement(this,t,a[0]);if(void 0!==i){var r=String(this.elementValue(i));if(void 0!==r){var n=a.slice(1);if(-1!==$.inArray(r,n))return!0}}return $.validator.methods.required.call(this,e,t,!0)},Confirmed:function(e,t,a){return laravelValidation.methods.Same.call(this,e,t,a)},Same:function(e,t,a){var i=laravelValidation.helpers.dependentElement(this,t,a[0]);return void 0!==i&&String(e)===String(this.elementValue(i))},InArray:function(e,t,a){if(void 0===a[0])return!1;for(var i=this.elements(),r=!1,n=laravelValidation.helpers.regexFromWildcard(a[0]),s=0;s<i.length;s++){var o,l=i[s].name;l.match(n)&&(o=laravelValidation.methods.Same.call(this,e,t,[l]),r=r||o)}return r},Distinct:function(e,t,a){if(void 0===a[0])return!1;for(var i=this.elements(),r=!1,n=laravelValidation.helpers.regexFromWildcard(a[0]),s=0;s<i.length;s++){var o,l=i[s].name;l!==t.name&&l.match(n)&&(o=laravelValidation.methods.Same.call(this,e,t,[l]),r=r||o)}return!r},Different:function(e,t,a){return!laravelValidation.methods.Same.call(this,e,t,a)},Accepted:function(e){return new RegExp("^(?:(yes|on|1|true))$","i").test(e)},Array:function(e,t){return-1!==t.name.indexOf("[")&&-1!==t.name.indexOf("]")||laravelValidation.helpers.isArray(e)},Boolean:function(e){return new RegExp("^(?:(true|false|1|0))$","i").test(e)},Integer:function(e){return new RegExp("^(?:-?\\d+)$","i").test(e)},Numeric:function(e,t){return $.validator.methods.number.call(this,e,t,!0)},String:function(e){return"string"==typeof e},Digits:function(e,t,a){return $.validator.methods.number.call(this,e,t,!0)&&e.length===parseInt(a,10)},DigitsBetween:function(e,t,a){return $.validator.methods.number.call(this,e,t,!0)&&e.length>=parseFloat(a[0])&&e.length<=parseFloat(a[1])},Size:function(e,t,a){return laravelValidation.helpers.getSize(this,t,e)===parseFloat(a[0])},Between:function(e,t,a){return laravelValidation.helpers.getSize(this,t,e)>=parseFloat(a[0])&&laravelValidation.helpers.getSize(this,t,e)<=parseFloat(a[1])},Min:function(e,t,a){return e=laravelValidation.helpers.allElementValues(this,t),laravelValidation.helpers.getSize(this,t,e)>=parseFloat(a[0])},Max:function(e,t,a){return e=laravelValidation.helpers.allElementValues(this,t),laravelValidation.helpers.getSize(this,t,e)<=parseFloat(a[0])},In:function(e,t,a){if(laravelValidation.helpers.isArray(e)&&laravelValidation.helpers.hasRules(t,"Array")){var i=laravelValidation.helpers.arrayDiff(e,a);return 0===Object.keys(i).length}return-1!==a.indexOf(e.toString())},NotIn:function(e,t,a){return-1===a.indexOf(e.toString())},Ip:function(e){return/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(e)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(e)},Email:function(e,t){return $.validator.methods.email.call(this,e,t,!0)},Url:function(e,t){return $.validator.methods.url.call(this,e,t,!0)},File:function(e,t){return!(window.File&&window.FileReader&&window.FileList&&window.Blob)||"files"in t&&0<t.files.length},Mimes:function(e,t,a){if(!(window.File&&window.FileReader&&window.FileList&&window.Blob))return!0;var i=$.map(a,function(e){return e.toLowerCase()}),r=laravelValidation.helpers.fileinfo(t);return!1!==r&&-1!==i.indexOf(r.extension.toLowerCase())},Mimetypes:function(e,t,a){if(!(window.File&&window.FileReader&&window.FileList&&window.Blob))return!0;var i=$.map(a,function(e){return e.toLowerCase()}),r=laravelValidation.helpers.fileinfo(t);return!1!==r&&-1!==i.indexOf(r.type.toLowerCase())},Image:function(e,t){return laravelValidation.methods.Mimes.call(this,e,t,["jpg","png","gif","bmp","svg","jpeg"])},Dimensions:function(value,element,params,callback){if(!(window.File&&window.FileReader&&window.FileList&&window.Blob))return!0;if(null===element.files||void 0===element.files[0])return!1;var fr=new FileReader;return fr.onload=function(){var img=new Image;img.onload=function(){var height=parseFloat(img.naturalHeight),width=parseFloat(img.naturalWidth),ratio=width/height,notValid=params.width&&parseFloat(params.width!==width)||params.min_width&&parseFloat(params.min_width)>width||params.max_width&&parseFloat(params.max_width)<width||params.height&&parseFloat(params.height)!==height||params.min_height&&parseFloat(params.min_height)>height||params.max_height&&parseFloat(params.max_height)<height||params.ratio&&ratio!==parseFloat(eval(params.ratio));callback(!notValid)},img.onerror=function(){callback(!1)},img.src=fr.result},fr.readAsDataURL(element.files[0]),"pending"},Alpha:function(e){return"string"==typeof e&&new RegExp("^(?:^[a-zà-ü]+$)$","i").test(e)},AlphaNum:function(e){return"string"==typeof e&&new RegExp("^(?:^[a-z0-9à-ü]+$)$","i").test(e)},AlphaDash:function(e){return"string"==typeof e&&new RegExp("^(?:^[a-z0-9à-ü_-]+$)$","i").test(e)},Regex:function(e,t,a){var i=["x","s","u","X","U","A"],r=new RegExp("^(?:/)(.*\\/?[^/]*|[^/]*)(?:/)([gmixXsuUAJ]*)?$"),n=a[0].match(r);if(null===n)return!1;var s=[];if(void 0!==n[2]){s=n[2].split("");for(var o=0;o<s.length<o;o++)if(-1!==i.indexOf(s[o]))return!0}return new RegExp("^(?:"+n[1]+")$",s.join()).test(e)},Date:function(e){return!1!==laravelValidation.helpers.strtotime(e)},DateFormat:function(e,t,a){return!1!==laravelValidation.helpers.parseTime(e,a[0])},Before:function(e,t,a){return laravelValidation.helpers.compareDates(this,e,t,a[0],"<")},BeforeOrEqual:function(e,t,a){return laravelValidation.helpers.compareDates(this,e,t,a[0],"<=")},After:function(e,t,a){return laravelValidation.helpers.compareDates(this,e,t,a[0],">")},AfterOrEqual:function(e,t,a){return laravelValidation.helpers.compareDates(this,e,t,a[0],">=")},Timezone:function(e){return laravelValidation.helpers.isTimezone(e)},Json:function(e){var t=!0;try{JSON.parse(e)}catch(e){t=!1}return t},ProengsoftNoop:function(e){return!0}}});
//# sourceMappingURL=jsvalidation.min.js.map
laravel-jsvalidation/public/js/jsvalidation.js000064400001107177152434177750015633 0ustar00/*!
 * jQuery Validation Plugin v1.20.0
 *
 * https://jqueryvalidation.org/
 *
 * Copyright (c) 2023 Jörn Zaefferer
 * Released under the MIT license
 */
(function( factory ) {
	if ( typeof define === "function" && define.amd ) {
		define( ["jquery"], factory );
	} else if (typeof module === "object" && module.exports) {
		module.exports = factory( require( "jquery" ) );
	} else {
		factory( jQuery );
	}
}(function( $ ) {

$.extend( $.fn, {

	// https://jqueryvalidation.org/validate/
	validate: function( options ) {

		// If nothing is selected, return nothing; can't chain anyway
		if ( !this.length ) {
			if ( options && options.debug && window.console ) {
				console.warn( "Nothing selected, can't validate, returning nothing." );
			}
			return;
		}

		// Check if a validator for this form was already created
		var validator = $.data( this[ 0 ], "validator" );
		if ( validator ) {
			return validator;
		}

		// Add novalidate tag if HTML5.
		this.attr( "novalidate", "novalidate" );

		validator = new $.validator( options, this[ 0 ] );
		$.data( this[ 0 ], "validator", validator );

		if ( validator.settings.onsubmit ) {

			this.on( "click.validate", ":submit", function( event ) {

				// Track the used submit button to properly handle scripted
				// submits later.
				validator.submitButton = event.currentTarget;

				// Allow suppressing validation by adding a cancel class to the submit button
				if ( $( this ).hasClass( "cancel" ) ) {
					validator.cancelSubmit = true;
				}

				// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
				if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
					validator.cancelSubmit = true;
				}
			} );

			// Validate the form on submit
			this.on( "submit.validate", function( event ) {
				if ( validator.settings.debug ) {

					// Prevent form submit to be able to see console output
					event.preventDefault();
				}

				function handle() {
					var hidden, result;

					// Insert a hidden input as a replacement for the missing submit button
					// The hidden input is inserted in two cases:
					//   - A user defined a `submitHandler`
					//   - There was a pending request due to `remote` method and `stopRequest()`
					//     was called to submit the form in case it's valid
					if ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {
						hidden = $( "<input type='hidden'/>" )
							.attr( "name", validator.submitButton.name )
							.val( $( validator.submitButton ).val() )
							.appendTo( validator.currentForm );
					}

					if ( validator.settings.submitHandler && !validator.settings.debug ) {
						result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
						if ( hidden ) {

							// And clean up afterwards; thanks to no-block-scope, hidden can be referenced
							hidden.remove();
						}
						if ( result !== undefined ) {
							return result;
						}
						return false;
					}
					return true;
				}

				// Prevent submit for invalid forms or custom submit handlers
				if ( validator.cancelSubmit ) {
					validator.cancelSubmit = false;
					return handle();
				}
				if ( validator.form() ) {
					if ( validator.pendingRequest ) {
						validator.formSubmitted = true;
						return false;
					}
					return handle();
				} else {
					validator.focusInvalid();
					return false;
				}
			} );
		}

		return validator;
	},

	// https://jqueryvalidation.org/valid/
	valid: function() {
		var valid, validator, errorList;

		if ( $( this[ 0 ] ).is( "form" ) ) {
			valid = this.validate().form();
		} else {
			errorList = [];
			valid = true;
			validator = $( this[ 0 ].form ).validate();
			this.each( function() {
				valid = validator.element( this ) && valid;
				if ( !valid ) {
					errorList = errorList.concat( validator.errorList );
				}
			} );
			validator.errorList = errorList;
		}
		return valid;
	},

	// https://jqueryvalidation.org/rules/
	rules: function( command, argument ) {
		var element = this[ 0 ],
			isContentEditable = typeof this.attr( "contenteditable" ) !== "undefined" && this.attr( "contenteditable" ) !== "false",
			settings, staticRules, existingRules, data, param, filtered;

		// If nothing is selected, return empty object; can't chain anyway
		if ( element == null ) {
			return;
		}

		if ( !element.form && isContentEditable ) {
			element.form = this.closest( "form" )[ 0 ];
			element.name = this.attr( "name" );
		}

		if ( element.form == null ) {
			return;
		}

		if ( command ) {
			settings = $.data( element.form, "validator" ).settings;
			staticRules = settings.rules;
			existingRules = $.validator.staticRules( element );
			switch ( command ) {
			case "add":
				$.extend( existingRules, $.validator.normalizeRule( argument ) );

				// Remove messages from rules, but allow them to be set separately
				delete existingRules.messages;
				staticRules[ element.name ] = existingRules;
				if ( argument.messages ) {
					settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
				}
				break;
			case "remove":
				if ( !argument ) {
					delete staticRules[ element.name ];
					return existingRules;
				}
				filtered = {};
				$.each( argument.split( /\s/ ), function( index, method ) {
					filtered[ method ] = existingRules[ method ];
					delete existingRules[ method ];
				} );
				return filtered;
			}
		}

		data = $.validator.normalizeRules(
		$.extend(
			{},
			$.validator.classRules( element ),
			$.validator.attributeRules( element ),
			$.validator.dataRules( element ),
			$.validator.staticRules( element )
		), element );

		// Make sure required is at front
		if ( data.required ) {
			param = data.required;
			delete data.required;
			data = $.extend( { required: param }, data );
		}

		// Make sure remote is at back
		if ( data.remote ) {
			param = data.remote;
			delete data.remote;
			data = $.extend( data, { remote: param } );
		}

		return data;
	}
} );

// JQuery trim is deprecated, provide a trim method based on String.prototype.trim
var trim = function( str ) {

	// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill
	return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "" );
};

// Custom selectors
$.extend( $.expr.pseudos || $.expr[ ":" ], {		// '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support

	// https://jqueryvalidation.org/blank-selector/
	blank: function( a ) {
		return !trim( "" + $( a ).val() );
	},

	// https://jqueryvalidation.org/filled-selector/
	filled: function( a ) {
		var val = $( a ).val();
		return val !== null && !!trim( "" + val );
	},

	// https://jqueryvalidation.org/unchecked-selector/
	unchecked: function( a ) {
		return !$( a ).prop( "checked" );
	}
} );

// Constructor for validator
$.validator = function( options, form ) {
	this.settings = $.extend( true, {}, $.validator.defaults, options );
	this.currentForm = form;
	this.init();
};

// https://jqueryvalidation.org/jQuery.validator.format/
$.validator.format = function( source, params ) {
	if ( arguments.length === 1 ) {
		return function() {
			var args = $.makeArray( arguments );
			args.unshift( source );
			return $.validator.format.apply( this, args );
		};
	}
	if ( params === undefined ) {
		return source;
	}
	if ( arguments.length > 2 && params.constructor !== Array  ) {
		params = $.makeArray( arguments ).slice( 1 );
	}
	if ( params.constructor !== Array ) {
		params = [ params ];
	}
	$.each( params, function( i, n ) {
		source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
			return n;
		} );
	} );
	return source;
};

$.extend( $.validator, {

	defaults: {
		messages: {},
		groups: {},
		rules: {},
		errorClass: "error",
		pendingClass: "pending",
		validClass: "valid",
		errorElement: "label",
		focusCleanup: false,
		focusInvalid: true,
		errorContainer: $( [] ),
		errorLabelContainer: $( [] ),
		onsubmit: true,
		ignore: ":hidden",
		ignoreTitle: false,
		onfocusin: function( element ) {
			this.lastActive = element;

			// Hide error label and remove error class on focus if enabled
			if ( this.settings.focusCleanup ) {
				if ( this.settings.unhighlight ) {
					this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
				}
				this.hideThese( this.errorsFor( element ) );
			}
		},
		onfocusout: function( element ) {
			if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
				this.element( element );
			}
		},
		onkeyup: function( element, event ) {

			// Avoid revalidate the field when pressing one of the following keys
			// Shift       => 16
			// Ctrl        => 17
			// Alt         => 18
			// Caps lock   => 20
			// End         => 35
			// Home        => 36
			// Left arrow  => 37
			// Up arrow    => 38
			// Right arrow => 39
			// Down arrow  => 40
			// Insert      => 45
			// Num lock    => 144
			// AltGr key   => 225
			var excludedKeys = [
				16, 17, 18, 20, 35, 36, 37,
				38, 39, 40, 45, 144, 225
			];

			if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
				return;
			} else if ( element.name in this.submitted || element.name in this.invalid ) {
				this.element( element );
			}
		},
		onclick: function( element ) {

			// Click on selects, radiobuttons and checkboxes
			if ( element.name in this.submitted ) {
				this.element( element );

			// Or option elements, check parent select in that case
			} else if ( element.parentNode.name in this.submitted ) {
				this.element( element.parentNode );
			}
		},
		highlight: function( element, errorClass, validClass ) {
			if ( element.type === "radio" ) {
				this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
			} else {
				$( element ).addClass( errorClass ).removeClass( validClass );
			}
		},
		unhighlight: function( element, errorClass, validClass ) {
			if ( element.type === "radio" ) {
				this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
			} else {
				$( element ).removeClass( errorClass ).addClass( validClass );
			}
		}
	},

	// https://jqueryvalidation.org/jQuery.validator.setDefaults/
	setDefaults: function( settings ) {
		$.extend( $.validator.defaults, settings );
	},

	messages: {
		required: "This field is required.",
		remote: "Please fix this field.",
		email: "Please enter a valid email address.",
		url: "Please enter a valid URL.",
		date: "Please enter a valid date.",
		dateISO: "Please enter a valid date (ISO).",
		number: "Please enter a valid number.",
		digits: "Please enter only digits.",
		equalTo: "Please enter the same value again.",
		maxlength: $.validator.format( "Please enter no more than {0} characters." ),
		minlength: $.validator.format( "Please enter at least {0} characters." ),
		rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
		range: $.validator.format( "Please enter a value between {0} and {1}." ),
		max: $.validator.format( "Please enter a value less than or equal to {0}." ),
		min: $.validator.format( "Please enter a value greater than or equal to {0}." ),
		step: $.validator.format( "Please enter a multiple of {0}." )
	},

	autoCreateRanges: false,

	prototype: {

		init: function() {
			this.labelContainer = $( this.settings.errorLabelContainer );
			this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
			this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
			this.submitted = {};
			this.valueCache = {};
			this.pendingRequest = 0;
			this.pending = {};
			this.invalid = {};
			this.reset();

			var currentForm = this.currentForm,
				groups = ( this.groups = {} ),
				rules;
			$.each( this.settings.groups, function( key, value ) {
				if ( typeof value === "string" ) {
					value = value.split( /\s/ );
				}
				$.each( value, function( index, name ) {
					groups[ name ] = key;
				} );
			} );
			rules = this.settings.rules;
			$.each( rules, function( key, value ) {
				rules[ key ] = $.validator.normalizeRule( value );
			} );

			function delegate( event ) {
				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";

				// Set form expando on contenteditable
				if ( !this.form && isContentEditable ) {
					this.form = $( this ).closest( "form" )[ 0 ];
					this.name = $( this ).attr( "name" );
				}

				// Ignore the element if it belongs to another form. This will happen mainly
				// when setting the `form` attribute of an input to the id of another form.
				if ( currentForm !== this.form ) {
					return;
				}

				var validator = $.data( this.form, "validator" ),
					eventType = "on" + event.type.replace( /^validate/, "" ),
					settings = validator.settings;
				if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
					settings[ eventType ].call( validator, this, event );
				}
			}

			$( this.currentForm )
				.on( "focusin.validate focusout.validate keyup.validate",
					":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
					"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
					"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
					"[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate )

				// Support: Chrome, oldIE
				// "select" is provided as event.target when clicking a option
				.on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate );

			if ( this.settings.invalidHandler ) {
				$( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
			}
		},

		// https://jqueryvalidation.org/Validator.form/
		form: function() {
			this.checkForm();
			$.extend( this.submitted, this.errorMap );
			this.invalid = $.extend( {}, this.errorMap );
			if ( !this.valid() ) {
				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
			}
			this.showErrors();
			return this.valid();
		},

		checkForm: function() {
			this.prepareForm();
			for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
				this.check( elements[ i ] );
			}
			return this.valid();
		},

		// https://jqueryvalidation.org/Validator.element/
		element: function( element ) {
			var cleanElement = this.clean( element ),
				checkElement = this.validationTargetFor( cleanElement ),
				v = this,
				result = true,
				rs, group;

			if ( checkElement === undefined ) {
				delete this.invalid[ cleanElement.name ];
			} else {
				this.prepareElement( checkElement );
				this.currentElements = $( checkElement );

				// If this element is grouped, then validate all group elements already
				// containing a value
				group = this.groups[ checkElement.name ];
				if ( group ) {
					$.each( this.groups, function( name, testgroup ) {
						if ( testgroup === group && name !== checkElement.name ) {
							cleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );
							if ( cleanElement && cleanElement.name in v.invalid ) {
								v.currentElements.push( cleanElement );
								result = v.check( cleanElement ) && result;
							}
						}
					} );
				}

				rs = this.check( checkElement ) !== false;
				result = result && rs;
				if ( rs ) {
					this.invalid[ checkElement.name ] = false;
				} else {
					this.invalid[ checkElement.name ] = true;
				}

				if ( !this.numberOfInvalids() ) {

					// Hide error containers on last error
					this.toHide = this.toHide.add( this.containers );
				}
				this.showErrors();

				// Add aria-invalid status for screen readers
				$( element ).attr( "aria-invalid", !rs );
			}

			return result;
		},

		// https://jqueryvalidation.org/Validator.showErrors/
		showErrors: function( errors ) {
			if ( errors ) {
				var validator = this;

				// Add items to error list and map
				$.extend( this.errorMap, errors );
				this.errorList = $.map( this.errorMap, function( message, name ) {
					return {
						message: message,
						element: validator.findByName( name )[ 0 ]
					};
				} );

				// Remove items from success list
				this.successList = $.grep( this.successList, function( element ) {
					return !( element.name in errors );
				} );
			}
			if ( this.settings.showErrors ) {
				this.settings.showErrors.call( this, this.errorMap, this.errorList );
			} else {
				this.defaultShowErrors();
			}
		},

		// https://jqueryvalidation.org/Validator.resetForm/
		resetForm: function() {
			if ( $.fn.resetForm ) {
				$( this.currentForm ).resetForm();
			}
			this.invalid = {};
			this.submitted = {};
			this.prepareForm();
			this.hideErrors();
			var elements = this.elements()
				.removeData( "previousValue" )
				.removeAttr( "aria-invalid" );

			this.resetElements( elements );
		},

		resetElements: function( elements ) {
			var i;

			if ( this.settings.unhighlight ) {
				for ( i = 0; elements[ i ]; i++ ) {
					this.settings.unhighlight.call( this, elements[ i ],
						this.settings.errorClass, "" );
					this.findByName( elements[ i ].name ).removeClass( this.settings.validClass );
				}
			} else {
				elements
					.removeClass( this.settings.errorClass )
					.removeClass( this.settings.validClass );
			}
		},

		numberOfInvalids: function() {
			return this.objectLength( this.invalid );
		},

		objectLength: function( obj ) {
			/* jshint unused: false */
			var count = 0,
				i;
			for ( i in obj ) {

				// This check allows counting elements with empty error
				// message as invalid elements
				if ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {
					count++;
				}
			}
			return count;
		},

		hideErrors: function() {
			this.hideThese( this.toHide );
		},

		hideThese: function( errors ) {
			errors.not( this.containers ).text( "" );
			this.addWrapper( errors ).hide();
		},

		valid: function() {
			return this.size() === 0;
		},

		size: function() {
			return this.errorList.length;
		},

		focusInvalid: function() {
			if ( this.settings.focusInvalid ) {
				try {
					$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )
					.filter( ":visible" )
					.trigger( "focus" )

					// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
					.trigger( "focusin" );
				} catch ( e ) {

					// Ignore IE throwing errors when focusing hidden elements
				}
			}
		},

		findLastActive: function() {
			var lastActive = this.lastActive;
			return lastActive && $.grep( this.errorList, function( n ) {
				return n.element.name === lastActive.name;
			} ).length === 1 && lastActive;
		},

		elements: function() {
			var validator = this,
				rulesCache = {};

			// Select all valid inputs inside the form (no submit or reset buttons)
			return $( this.currentForm )
			.find( "input, select, textarea, [contenteditable]" )
			.not( ":submit, :reset, :image, :disabled" )
			.not( this.settings.ignore )
			.filter( function() {
				var name = this.name || $( this ).attr( "name" ); // For contenteditable
				var isContentEditable = typeof $( this ).attr( "contenteditable" ) !== "undefined" && $( this ).attr( "contenteditable" ) !== "false";

				if ( !name && validator.settings.debug && window.console ) {
					console.error( "%o has no name assigned", this );
				}

				// Set form expando on contenteditable
				if ( isContentEditable ) {
					this.form = $( this ).closest( "form" )[ 0 ];
					this.name = name;
				}

				// Ignore elements that belong to other/nested forms
				if ( this.form !== validator.currentForm ) {
					return false;
				}

				// Select only the first element for each name, and only those with rules specified
				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
					return false;
				}

				rulesCache[ name ] = true;
				return true;
			} );
		},

		clean: function( selector ) {
			return $( selector )[ 0 ];
		},

		errors: function() {
			var errorClass = this.settings.errorClass.split( " " ).join( "." );
			return $( this.settings.errorElement + "." + errorClass, this.errorContext );
		},

		resetInternals: function() {
			this.successList = [];
			this.errorList = [];
			this.errorMap = {};
			this.toShow = $( [] );
			this.toHide = $( [] );
		},

		reset: function() {
			this.resetInternals();
			this.currentElements = $( [] );
		},

		prepareForm: function() {
			this.reset();
			this.toHide = this.errors().add( this.containers );
		},

		prepareElement: function( element ) {
			this.reset();
			this.toHide = this.errorsFor( element );
		},

		elementValue: function( element ) {
			var $element = $( element ),
				type = element.type,
				isContentEditable = typeof $element.attr( "contenteditable" ) !== "undefined" && $element.attr( "contenteditable" ) !== "false",
				val, idx;

			if ( type === "radio" || type === "checkbox" ) {
				return this.findByName( element.name ).filter( ":checked" ).val();
			} else if ( type === "number" && typeof element.validity !== "undefined" ) {
				return element.validity.badInput ? "NaN" : $element.val();
			}

			if ( isContentEditable ) {
				val = $element.text();
			} else {
				val = $element.val();
			}

			if ( type === "file" ) {

				// Modern browser (chrome & safari)
				if ( val.substr( 0, 12 ) === "C:\\fakepath\\" ) {
					return val.substr( 12 );
				}

				// Legacy browsers
				// Unix-based path
				idx = val.lastIndexOf( "/" );
				if ( idx >= 0 ) {
					return val.substr( idx + 1 );
				}

				// Windows-based path
				idx = val.lastIndexOf( "\\" );
				if ( idx >= 0 ) {
					return val.substr( idx + 1 );
				}

				// Just the file name
				return val;
			}

			if ( typeof val === "string" ) {
				return val.replace( /\r/g, "" );
			}
			return val;
		},

		check: function( element ) {
			element = this.validationTargetFor( this.clean( element ) );

			var rules = $( element ).rules(),
				rulesCount = $.map( rules, function( n, i ) {
					return i;
				} ).length,
				dependencyMismatch = false,
				val = this.elementValue( element ),
				result, method, rule, normalizer;

			// Abort any pending Ajax request from a previous call to this method.
			this.abortRequest( element );

			// Prioritize the local normalizer defined for this element over the global one
			// if the former exists, otherwise user the global one in case it exists.
			if ( typeof rules.normalizer === "function" ) {
				normalizer = rules.normalizer;
			} else if (	typeof this.settings.normalizer === "function" ) {
				normalizer = this.settings.normalizer;
			}

			// If normalizer is defined, then call it to retreive the changed value instead
			// of using the real one.
			// Note that `this` in the normalizer is `element`.
			if ( normalizer ) {
				val = normalizer.call( element, val );

				// Delete the normalizer from rules to avoid treating it as a pre-defined method.
				delete rules.normalizer;
			}

			for ( method in rules ) {
				rule = { method: method, parameters: rules[ method ] };
				try {
					result = $.validator.methods[ method ].call( this, val, element, rule.parameters );

					// If a method indicates that the field is optional and therefore valid,
					// don't mark it as valid when there are no other rules
					if ( result === "dependency-mismatch" && rulesCount === 1 ) {
						dependencyMismatch = true;
						continue;
					}
					dependencyMismatch = false;

					if ( result === "pending" ) {
						this.toHide = this.toHide.not( this.errorsFor( element ) );
						return;
					}

					if ( !result ) {
						this.formatAndAdd( element, rule );
						return false;
					}
				} catch ( e ) {
					if ( this.settings.debug && window.console ) {
						console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
					}
					if ( e instanceof TypeError ) {
						e.message += ".  Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
					}

					throw e;
				}
			}
			if ( dependencyMismatch ) {
				return;
			}
			if ( this.objectLength( rules ) ) {
				this.successList.push( element );
			}
			return true;
		},

		// Return the custom message for the given element and validation method
		// specified in the element's HTML5 data attribute
		// return the generic message if present and no method specific message is present
		customDataMessage: function( element, method ) {
			return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
				method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
		},

		// Return the custom message for the given element name and validation method
		customMessage: function( name, method ) {
			var m = this.settings.messages[ name ];
			return m && ( m.constructor === String ? m : m[ method ] );
		},

		// Return the first defined argument, allowing empty strings
		findDefined: function() {
			for ( var i = 0; i < arguments.length; i++ ) {
				if ( arguments[ i ] !== undefined ) {
					return arguments[ i ];
				}
			}
			return undefined;
		},

		// The second parameter 'rule' used to be a string, and extended to an object literal
		// of the following form:
		// rule = {
		//     method: "method name",
		//     parameters: "the given method parameters"
		// }
		//
		// The old behavior still supported, kept to maintain backward compatibility with
		// old code, and will be removed in the next major release.
		defaultMessage: function( element, rule ) {
			if ( typeof rule === "string" ) {
				rule = { method: rule };
			}

			var message = this.findDefined(
					this.customMessage( element.name, rule.method ),
					this.customDataMessage( element, rule.method ),

					// 'title' is never undefined, so handle empty string as undefined
					!this.settings.ignoreTitle && element.title || undefined,
					$.validator.messages[ rule.method ],
					"<strong>Warning: No message defined for " + element.name + "</strong>"
				),
				theregex = /\$?\{(\d+)\}/g;
			if ( typeof message === "function" ) {
				message = message.call( this, rule.parameters, element );
			} else if ( theregex.test( message ) ) {
				message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
			}

			return message;
		},

		formatAndAdd: function( element, rule ) {
			var message = this.defaultMessage( element, rule );

			this.errorList.push( {
				message: message,
				element: element,
				method: rule.method
			} );

			this.errorMap[ element.name ] = message;
			this.submitted[ element.name ] = message;
		},

		addWrapper: function( toToggle ) {
			if ( this.settings.wrapper ) {
				toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
			}
			return toToggle;
		},

		defaultShowErrors: function() {
			var i, elements, error;
			for ( i = 0; this.errorList[ i ]; i++ ) {
				error = this.errorList[ i ];
				if ( this.settings.highlight ) {
					this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
				}
				this.showLabel( error.element, error.message );
			}
			if ( this.errorList.length ) {
				this.toShow = this.toShow.add( this.containers );
			}
			if ( this.settings.success ) {
				for ( i = 0; this.successList[ i ]; i++ ) {
					this.showLabel( this.successList[ i ] );
				}
			}
			if ( this.settings.unhighlight ) {
				for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
					this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
				}
			}
			this.toHide = this.toHide.not( this.toShow );
			this.hideErrors();
			this.addWrapper( this.toShow ).show();
		},

		validElements: function() {
			return this.currentElements.not( this.invalidElements() );
		},

		invalidElements: function() {
			return $( this.errorList ).map( function() {
				return this.element;
			} );
		},

		showLabel: function( element, message ) {
			var place, group, errorID, v,
				error = this.errorsFor( element ),
				elementID = this.idOrName( element ),
				describedBy = $( element ).attr( "aria-describedby" );

			if ( error.length ) {

				// Refresh error/success class
				error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );

				// Replace message on existing label
				if ( this.settings && this.settings.escapeHtml ) {
					error.text( message || "" );
				} else {
					error.html( message || "" );
				}
			} else {

				// Create error element
				error = $( "<" + this.settings.errorElement + ">" )
					.attr( "id", elementID + "-error" )
					.addClass( this.settings.errorClass );

				if ( this.settings && this.settings.escapeHtml ) {
					error.text( message || "" );
				} else {
					error.html( message || "" );
				}

				// Maintain reference to the element to be placed into the DOM
				place = error;
				if ( this.settings.wrapper ) {

					// Make sure the element is visible, even in IE
					// actually showing the wrapped element is handled elsewhere
					place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
				}
				if ( this.labelContainer.length ) {
					this.labelContainer.append( place );
				} else if ( this.settings.errorPlacement ) {
					this.settings.errorPlacement.call( this, place, $( element ) );
				} else {
					place.insertAfter( element );
				}

				// Link error back to the element
				if ( error.is( "label" ) ) {

					// If the error is a label, then associate using 'for'
					error.attr( "for", elementID );

					// If the element is not a child of an associated label, then it's necessary
					// to explicitly apply aria-describedby
				} else if ( error.parents( "label[for='" + this.escapeCssMeta( elementID ) + "']" ).length === 0 ) {
					errorID = error.attr( "id" );

					// Respect existing non-error aria-describedby
					if ( !describedBy ) {
						describedBy = errorID;
					} else if ( !describedBy.match( new RegExp( "\\b" + this.escapeCssMeta( errorID ) + "\\b" ) ) ) {

						// Add to end of list if not already present
						describedBy += " " + errorID;
					}
					$( element ).attr( "aria-describedby", describedBy );

					// If this element is grouped, then assign to all elements in the same group
					group = this.groups[ element.name ];
					if ( group ) {
						v = this;
						$.each( v.groups, function( name, testgroup ) {
							if ( testgroup === group ) {
								$( "[name='" + v.escapeCssMeta( name ) + "']", v.currentForm )
									.attr( "aria-describedby", error.attr( "id" ) );
							}
						} );
					}
				}
			}
			if ( !message && this.settings.success ) {
				error.text( "" );
				if ( typeof this.settings.success === "string" ) {
					error.addClass( this.settings.success );
				} else {
					this.settings.success( error, element );
				}
			}
			this.toShow = this.toShow.add( error );
		},

		errorsFor: function( element ) {
			var name = this.escapeCssMeta( this.idOrName( element ) ),
				describer = $( element ).attr( "aria-describedby" ),
				selector = "label[for='" + name + "'], label[for='" + name + "'] *";

			// 'aria-describedby' should directly reference the error element
			if ( describer ) {
				selector = selector + ", #" + this.escapeCssMeta( describer )
					.replace( /\s+/g, ", #" );
			}

			return this
				.errors()
				.filter( selector );
		},

		// See https://api.jquery.com/category/selectors/, for CSS
		// meta-characters that should be escaped in order to be used with JQuery
		// as a literal part of a name/id or any selector.
		escapeCssMeta: function( string ) {
			if ( string === undefined ) {
				return "";
			}

			return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" );
		},

		idOrName: function( element ) {
			return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
		},

		validationTargetFor: function( element ) {

			// If radio/checkbox, validate first element in group instead
			if ( this.checkable( element ) ) {
				element = this.findByName( element.name );
			}

			// Always apply ignore filter
			return $( element ).not( this.settings.ignore )[ 0 ];
		},

		checkable: function( element ) {
			return ( /radio|checkbox/i ).test( element.type );
		},

		findByName: function( name ) {
			return $( this.currentForm ).find( "[name='" + this.escapeCssMeta( name ) + "']" );
		},

		getLength: function( value, element ) {
			switch ( element.nodeName.toLowerCase() ) {
			case "select":
				return $( "option:selected", element ).length;
			case "input":
				if ( this.checkable( element ) ) {
					return this.findByName( element.name ).filter( ":checked" ).length;
				}
			}
			return value.length;
		},

		depend: function( param, element ) {
			return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;
		},

		dependTypes: {
			"boolean": function( param ) {
				return param;
			},
			"string": function( param, element ) {
				return !!$( param, element.form ).length;
			},
			"function": function( param, element ) {
				return param( element );
			}
		},

		optional: function( element ) {
			var val = this.elementValue( element );
			return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
		},

		elementAjaxPort: function( element ) {
			return "validate" + element.name;
		},

		startRequest: function( element ) {
			if ( !this.pending[ element.name ] ) {
				this.pendingRequest++;
				$( element ).addClass( this.settings.pendingClass );
				this.pending[ element.name ] = true;
			}
		},

		stopRequest: function( element, valid ) {
			this.pendingRequest--;

			// Sometimes synchronization fails, make sure pendingRequest is never < 0
			if ( this.pendingRequest < 0 ) {
				this.pendingRequest = 0;
			}
			delete this.pending[ element.name ];
			$( element ).removeClass( this.settings.pendingClass );
			if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) {
				$( this.currentForm ).trigger( "submit" );

				// Remove the hidden input that was used as a replacement for the
				// missing submit button. The hidden input is added by `handle()`
				// to ensure that the value of the used submit button is passed on
				// for scripted submits triggered by this method
				if ( this.submitButton ) {
					$( "input:hidden[name='" + this.submitButton.name + "']", this.currentForm ).remove();
				}

				this.formSubmitted = false;
			} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {
				$( this.currentForm ).triggerHandler( "invalid-form", [ this ] );
				this.formSubmitted = false;
			}
		},

		abortRequest: function( element ) {
			var port;

			if ( this.pending[ element.name ] ) {
				port = this.elementAjaxPort( element );
				$.ajaxAbort( port );

				this.pendingRequest--;

				// Sometimes synchronization fails, make sure pendingRequest is never < 0
				if ( this.pendingRequest < 0 ) {
					this.pendingRequest = 0;
				}

				delete this.pending[ element.name ];
				$( element ).removeClass( this.settings.pendingClass );
			}
		},

		previousValue: function( element, method ) {
			method = typeof method === "string" && method || "remote";

			return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
				old: null,
				valid: true,
				message: this.defaultMessage( element, { method: method } )
			} );
		},

		// Cleans up all forms and elements, removes validator-specific events
		destroy: function() {
			this.resetForm();

			$( this.currentForm )
				.off( ".validate" )
				.removeData( "validator" )
				.find( ".validate-equalTo-blur" )
					.off( ".validate-equalTo" )
					.removeClass( "validate-equalTo-blur" )
				.find( ".validate-lessThan-blur" )
					.off( ".validate-lessThan" )
					.removeClass( "validate-lessThan-blur" )
				.find( ".validate-lessThanEqual-blur" )
					.off( ".validate-lessThanEqual" )
					.removeClass( "validate-lessThanEqual-blur" )
				.find( ".validate-greaterThanEqual-blur" )
					.off( ".validate-greaterThanEqual" )
					.removeClass( "validate-greaterThanEqual-blur" )
				.find( ".validate-greaterThan-blur" )
					.off( ".validate-greaterThan" )
					.removeClass( "validate-greaterThan-blur" );
		}

	},

	classRuleSettings: {
		required: { required: true },
		email: { email: true },
		url: { url: true },
		date: { date: true },
		dateISO: { dateISO: true },
		number: { number: true },
		digits: { digits: true },
		creditcard: { creditcard: true }
	},

	addClassRules: function( className, rules ) {
		if ( className.constructor === String ) {
			this.classRuleSettings[ className ] = rules;
		} else {
			$.extend( this.classRuleSettings, className );
		}
	},

	classRules: function( element ) {
		var rules = {},
			classes = $( element ).attr( "class" );

		if ( classes ) {
			$.each( classes.split( " " ), function() {
				if ( this in $.validator.classRuleSettings ) {
					$.extend( rules, $.validator.classRuleSettings[ this ] );
				}
			} );
		}
		return rules;
	},

	normalizeAttributeRule: function( rules, type, method, value ) {

		// Convert the value to a number for number inputs, and for text for backwards compability
		// allows type="date" and others to be compared as strings
		if ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
			value = Number( value );

			// Support Opera Mini, which returns NaN for undefined minlength
			if ( isNaN( value ) ) {
				value = undefined;
			}
		}

		if ( value || value === 0 ) {
			rules[ method ] = value;
		} else if ( type === method && type !== "range" ) {

			// Exception: the jquery validate 'range' method
			// does not test for the html5 'range' type
			rules[ type === "date" ? "dateISO" : method ] = true;
		}
	},

	attributeRules: function( element ) {
		var rules = {},
			$element = $( element ),
			type = element.getAttribute( "type" ),
			method, value;

		for ( method in $.validator.methods ) {

			// Support for <input required> in both html5 and older browsers
			if ( method === "required" ) {
				value = element.getAttribute( method );

				// Some browsers return an empty string for the required attribute
				// and non-HTML5 browsers might have required="" markup
				if ( value === "" ) {
					value = true;
				}

				// Force non-HTML5 browsers to return bool
				value = !!value;
			} else {
				value = $element.attr( method );
			}

			this.normalizeAttributeRule( rules, type, method, value );
		}

		// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
		if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
			delete rules.maxlength;
		}

		return rules;
	},

	dataRules: function( element ) {
		var rules = {},
			$element = $( element ),
			type = element.getAttribute( "type" ),
			method, value;

		for ( method in $.validator.methods ) {
			value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );

			// Cast empty attributes like `data-rule-required` to `true`
			if ( value === "" ) {
				value = true;
			}

			this.normalizeAttributeRule( rules, type, method, value );
		}
		return rules;
	},

	staticRules: function( element ) {
		var rules = {},
			validator = $.data( element.form, "validator" );

		if ( validator.settings.rules ) {
			rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
		}
		return rules;
	},

	normalizeRules: function( rules, element ) {

		// Handle dependency check
		$.each( rules, function( prop, val ) {

			// Ignore rule when param is explicitly false, eg. required:false
			if ( val === false ) {
				delete rules[ prop ];
				return;
			}
			if ( val.param || val.depends ) {
				var keepRule = true;
				switch ( typeof val.depends ) {
				case "string":
					keepRule = !!$( val.depends, element.form ).length;
					break;
				case "function":
					keepRule = val.depends.call( element, element );
					break;
				}
				if ( keepRule ) {
					rules[ prop ] = val.param !== undefined ? val.param : true;
				} else {
					$.data( element.form, "validator" ).resetElements( $( element ) );
					delete rules[ prop ];
				}
			}
		} );

		// Evaluate parameters
		$.each( rules, function( rule, parameter ) {
			rules[ rule ] = typeof parameter === "function" && rule !== "normalizer" ? parameter( element ) : parameter;
		} );

		// Clean number parameters
		$.each( [ "minlength", "maxlength" ], function() {
			if ( rules[ this ] ) {
				rules[ this ] = Number( rules[ this ] );
			}
		} );
		$.each( [ "rangelength", "range" ], function() {
			var parts;
			if ( rules[ this ] ) {
				if ( Array.isArray( rules[ this ] ) ) {
					rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];
				} else if ( typeof rules[ this ] === "string" ) {
					parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ );
					rules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];
				}
			}
		} );

		if ( $.validator.autoCreateRanges ) {

			// Auto-create ranges
			if ( rules.min != null && rules.max != null ) {
				rules.range = [ rules.min, rules.max ];
				delete rules.min;
				delete rules.max;
			}
			if ( rules.minlength != null && rules.maxlength != null ) {
				rules.rangelength = [ rules.minlength, rules.maxlength ];
				delete rules.minlength;
				delete rules.maxlength;
			}
		}

		return rules;
	},

	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
	normalizeRule: function( data ) {
		if ( typeof data === "string" ) {
			var transformed = {};
			$.each( data.split( /\s/ ), function() {
				transformed[ this ] = true;
			} );
			data = transformed;
		}
		return data;
	},

	// https://jqueryvalidation.org/jQuery.validator.addMethod/
	addMethod: function( name, method, message ) {
		$.validator.methods[ name ] = method;
		$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
		if ( method.length < 3 ) {
			$.validator.addClassRules( name, $.validator.normalizeRule( name ) );
		}
	},

	// https://jqueryvalidation.org/jQuery.validator.methods/
	methods: {

		// https://jqueryvalidation.org/required-method/
		required: function( value, element, param ) {

			// Check if dependency is met
			if ( !this.depend( param, element ) ) {
				return "dependency-mismatch";
			}
			if ( element.nodeName.toLowerCase() === "select" ) {

				// Could be an array for select-multiple or a string, both are fine this way
				var val = $( element ).val();
				return val && val.length > 0;
			}
			if ( this.checkable( element ) ) {
				return this.getLength( value, element ) > 0;
			}
			return value !== undefined && value !== null && value.length > 0;
		},

		// https://jqueryvalidation.org/email-method/
		email: function( value, element ) {

			// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
			// Retrieved 2014-01-14
			// If you have a problem with this implementation, report a bug against the above spec
			// Or use custom methods to implement your own email validation
			return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
		},

		// https://jqueryvalidation.org/url-method/
		url: function( value, element ) {

			// Copyright (c) 2010-2013 Diego Perini, MIT licensed
			// https://gist.github.com/dperini/729294
			// see also https://mathiasbynens.be/demo/url-regex
			// modified to allow protocol-relative URLs
			return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
		},

		// https://jqueryvalidation.org/date-method/
		date: ( function() {
			var called = false;

			return function( value, element ) {
				if ( !called ) {
					called = true;
					if ( this.settings.debug && window.console ) {
						console.warn(
							"The `date` method is deprecated and will be removed in version '2.0.0'.\n" +
							"Please don't use it, since it relies on the Date constructor, which\n" +
							"behaves very differently across browsers and locales. Use `dateISO`\n" +
							"instead or one of the locale specific methods in `localizations/`\n" +
							"and `additional-methods.js`."
						);
					}
				}

				return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
			};
		}() ),

		// https://jqueryvalidation.org/dateISO-method/
		dateISO: function( value, element ) {
			return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
		},

		// https://jqueryvalidation.org/number-method/
		number: function( value, element ) {
			return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
		},

		// https://jqueryvalidation.org/digits-method/
		digits: function( value, element ) {
			return this.optional( element ) || /^\d+$/.test( value );
		},

		// https://jqueryvalidation.org/minlength-method/
		minlength: function( value, element, param ) {
			var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
			return this.optional( element ) || length >= param;
		},

		// https://jqueryvalidation.org/maxlength-method/
		maxlength: function( value, element, param ) {
			var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
			return this.optional( element ) || length <= param;
		},

		// https://jqueryvalidation.org/rangelength-method/
		rangelength: function( value, element, param ) {
			var length = Array.isArray( value ) ? value.length : this.getLength( value, element );
			return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
		},

		// https://jqueryvalidation.org/min-method/
		min: function( value, element, param ) {
			return this.optional( element ) || value >= param;
		},

		// https://jqueryvalidation.org/max-method/
		max: function( value, element, param ) {
			return this.optional( element ) || value <= param;
		},

		// https://jqueryvalidation.org/range-method/
		range: function( value, element, param ) {
			return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
		},

		// https://jqueryvalidation.org/step-method/
		step: function( value, element, param ) {
			var type = $( element ).attr( "type" ),
				errorMessage = "Step attribute on input type " + type + " is not supported.",
				supportedTypes = [ "text", "number", "range" ],
				re = new RegExp( "\\b" + type + "\\b" ),
				notSupported = type && !re.test( supportedTypes.join() ),
				decimalPlaces = function( num ) {
					var match = ( "" + num ).match( /(?:\.(\d+))?$/ );
					if ( !match ) {
						return 0;
					}

					// Number of digits right of decimal point.
					return match[ 1 ] ? match[ 1 ].length : 0;
				},
				toInt = function( num ) {
					return Math.round( num * Math.pow( 10, decimals ) );
				},
				valid = true,
				decimals;

			// Works only for text, number and range input types
			// TODO find a way to support input types date, datetime, datetime-local, month, time and week
			if ( notSupported ) {
				throw new Error( errorMessage );
			}

			decimals = decimalPlaces( param );

			// Value can't have too many decimals
			if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {
				valid = false;
			}

			return this.optional( element ) || valid;
		},

		// https://jqueryvalidation.org/equalTo-method/
		equalTo: function( value, element, param ) {

			// Bind to the blur event of the target in order to revalidate whenever the target field is updated
			var target = $( param );
			if ( this.settings.onfocusout && target.not( ".validate-equalTo-blur" ).length ) {
				target.addClass( "validate-equalTo-blur" ).on( "blur.validate-equalTo", function() {
					$( element ).valid();
				} );
			}
			return value === target.val();
		},

		// https://jqueryvalidation.org/remote-method/
		remote: function( value, element, param, method ) {
			if ( this.optional( element ) ) {
				return "dependency-mismatch";
			}

			method = typeof method === "string" && method || "remote";

			var previous = this.previousValue( element, method ),
				validator, data, optionDataString;

			if ( !this.settings.messages[ element.name ] ) {
				this.settings.messages[ element.name ] = {};
			}
			previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
			this.settings.messages[ element.name ][ method ] = previous.message;

			param = typeof param === "string" && { url: param } || param;
			optionDataString = $.param( $.extend( { data: value }, param.data ) );
			if ( previous.old === optionDataString ) {
				return previous.valid;
			}

			previous.old = optionDataString;
			validator = this;
			this.startRequest( element );
			data = {};
			data[ element.name ] = value;
			$.ajax( $.extend( true, {
				mode: "abort",
				port: this.elementAjaxPort( element ),
				dataType: "json",
				data: data,
				context: validator.currentForm,
				success: function( response ) {
					var valid = response === true || response === "true",
						errors, message, submitted;

					validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
					if ( valid ) {
						submitted = validator.formSubmitted;
						validator.toHide = validator.errorsFor( element );
						validator.formSubmitted = submitted;
						validator.successList.push( element );
						validator.invalid[ element.name ] = false;
						validator.showErrors();
					} else {
						errors = {};
						message = response || validator.defaultMessage( element, { method: method, parameters: value } );
						errors[ element.name ] = previous.message = message;
						validator.invalid[ element.name ] = true;
						validator.showErrors( errors );
					}
					previous.valid = valid;
					validator.stopRequest( element, valid );
				}
			}, param ) );
			return "pending";
		}
	}

} );

// Ajax mode: abort
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
//        $.ajaxAbort( port );
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()

var pendingRequests = {},
	ajax;

// Use a prefilter if available (1.5+)
if ( $.ajaxPrefilter ) {
	$.ajaxPrefilter( function( settings, _, xhr ) {
		var port = settings.port;
		if ( settings.mode === "abort" ) {
			$.ajaxAbort( port );
			pendingRequests[ port ] = xhr;
		}
	} );
} else {

	// Proxy ajax
	ajax = $.ajax;
	$.ajax = function( settings ) {
		var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
			port = ( "port" in settings ? settings : $.ajaxSettings ).port;
		if ( mode === "abort" ) {
			$.ajaxAbort( port );
			pendingRequests[ port ] = ajax.apply( this, arguments );
			return pendingRequests[ port ];
		}
		return ajax.apply( this, arguments );
	};
}

// Abort the previous request without sending a new one
$.ajaxAbort = function( port ) {
	if ( pendingRequests[ port ] ) {
		pendingRequests[ port ].abort();
		delete pendingRequests[ port ];
	}
};
return $;
}));
/*!
 * @copyright Copyright &copy; Kartik Visweswaran, Krajee.com, 2014 - 2020
 * @version 1.3.6
 *
 * Date formatter utility library that allows formatting date/time variables or Date objects using PHP DateTime format.
 * This library is a standalone javascript library and does not depend on other libraries or plugins like jQuery. The
 * library also adds support for Universal Module Definition (UMD).
 * 
 * @see http://php.net/manual/en/function.date.php
 *
 * For more JQuery plugins visit http://plugins.krajee.com
 * For more Yii related demos visit http://demos.krajee.com
 */
(function (root, factory) {
    // noinspection JSUnresolvedVariable
    if (typeof define === 'function' && define.amd) { // AMD
        // noinspection JSUnresolvedFunction
        define([], factory);
    } else {
        // noinspection JSUnresolvedVariable
        if (typeof module === 'object' && module.exports) { // Node
            // noinspection JSUnresolvedVariable
            module.exports = factory();
        } else { // Browser globals
            root.DateFormatter = factory();
        }
    }
}(typeof self !== 'undefined' ? self : this, function () {
    var DateFormatter, $h;
    /**
     * Global helper object
     */
    $h = {
        DAY: 1000 * 60 * 60 * 24,
        HOUR: 3600,
        defaults: {
            dateSettings: {
                days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
                daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
                months: [
                    'January', 'February', 'March', 'April', 'May', 'June', 'July',
                    'August', 'September', 'October', 'November', 'December'
                ],
                monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
                meridiem: ['AM', 'PM'],
                ordinal: function (number) {
                    var n = number % 10, suffixes = {1: 'st', 2: 'nd', 3: 'rd'};
                    return Math.floor(number % 100 / 10) === 1 || !suffixes[n] ? 'th' : suffixes[n];
                }
            },
            separators: /[ \-+\/.:@]/g,
            validParts: /[dDjlNSwzWFmMntLoYyaABgGhHisueTIOPZcrU]/g,
            intParts: /[djwNzmnyYhHgGis]/g,
            tzParts: /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
            tzClip: /[^-+\dA-Z]/g
        },
        getInt: function (str, radix) {
            return parseInt(str, (radix ? radix : 10));
        },
        compare: function (str1, str2) {
            return typeof (str1) === 'string' && typeof (str2) === 'string' && str1.toLowerCase() === str2.toLowerCase();
        },
        lpad: function (value, length, chr) {
            var val = value.toString();
            chr = chr || '0';
            return val.length < length ? $h.lpad(chr + val, length) : val;
        },
        merge: function (out) {
            var i, obj;
            out = out || {};
            for (i = 1; i < arguments.length; i++) {
                obj = arguments[i];
                if (!obj) {
                    continue;
                }
                for (var key in obj) {
                    if (obj.hasOwnProperty(key)) {
                        if (typeof obj[key] === 'object') {
                            $h.merge(out[key], obj[key]);
                        } else {
                            out[key] = obj[key];
                        }
                    }
                }
            }
            return out;
        },
        getIndex: function (val, arr) {
            for (var i = 0; i < arr.length; i++) {
                if (arr[i].toLowerCase() === val.toLowerCase()) {
                    return i;
                }
            }
            return -1;
        }
    };

    /**
     * Date Formatter Library Constructor
     * @param options
     * @constructor
     */
    DateFormatter = function (options) {
        var self = this, config = $h.merge($h.defaults, options);
        self.dateSettings = config.dateSettings;
        self.separators = config.separators;
        self.validParts = config.validParts;
        self.intParts = config.intParts;
        self.tzParts = config.tzParts;
        self.tzClip = config.tzClip;
    };

    /**
     * DateFormatter Library Prototype
     */
    DateFormatter.prototype = {
        constructor: DateFormatter,
        getMonth: function (val) {
            var self = this, i;
            i = $h.getIndex(val, self.dateSettings.monthsShort) + 1;
            if (i === 0) {
                i = $h.getIndex(val, self.dateSettings.months) + 1;
            }
            return i;
        },
        parseDate: function (vDate, vFormat) {
            var self = this, vFormatParts, vDateParts, i, vDateFlag = false, vTimeFlag = false, vDatePart, iDatePart,
                vSettings = self.dateSettings, vMonth, vMeriIndex, vMeriOffset, len, mer,
                out = {date: null, year: null, month: null, day: null, hour: 0, min: 0, sec: 0};
            if (!vDate) {
                return null;
            }
            if (vDate instanceof Date) {
                return vDate;
            }
            if (vFormat === 'U') {
                i = $h.getInt(vDate);
                return i ? new Date(i * 1000) : vDate;
            }
            switch (typeof vDate) {
                case 'number':
                    return new Date(vDate);
                case 'string':
                    break;
                default:
                    return null;
            }
            vFormatParts = vFormat.match(self.validParts);
            if (!vFormatParts || vFormatParts.length === 0) {
                throw new Error('Invalid date format definition.');
            }
            for (i = vFormatParts.length - 1; i >= 0; i--) {
                if (vFormatParts[i] === 'S') {
                    vFormatParts.splice(i, 1);
                }
            }
            vDateParts = vDate.replace(self.separators, '\0').split('\0');
            for (i = 0; i < vDateParts.length; i++) {
                vDatePart = vDateParts[i];
                iDatePart = $h.getInt(vDatePart);
                switch (vFormatParts[i]) {
                    case 'y':
                    case 'Y':
                        if (iDatePart) {
                            len = vDatePart.length;
                            out.year = len === 2 ? $h.getInt((iDatePart < 70 ? '20' : '19') + vDatePart) : iDatePart;
                        } else {
                            return null;
                        }
                        vDateFlag = true;
                        break;
                    case 'm':
                    case 'n':
                    case 'M':
                    case 'F':
                        if (isNaN(iDatePart)) {
                            vMonth = self.getMonth(vDatePart);
                            if (vMonth > 0) {
                                out.month = vMonth;
                            } else {
                                return null;
                            }
                        } else {
                            if (iDatePart >= 1 && iDatePart <= 12) {
                                out.month = iDatePart;
                            } else {
                                return null;
                            }
                        }
                        vDateFlag = true;
                        break;
                    case 'd':
                    case 'j':
                        if (iDatePart >= 1 && iDatePart <= 31) {
                            out.day = iDatePart;
                        } else {
                            return null;
                        }
                        vDateFlag = true;
                        break;
                    case 'g':
                    case 'h':
                        vMeriIndex = (vFormatParts.indexOf('a') > -1) ? vFormatParts.indexOf('a') :
                            ((vFormatParts.indexOf('A') > -1) ? vFormatParts.indexOf('A') : -1);
                        mer = vDateParts[vMeriIndex];
                        if (vMeriIndex !== -1) {
                            vMeriOffset = $h.compare(mer, vSettings.meridiem[0]) ? 0 :
                                ($h.compare(mer, vSettings.meridiem[1]) ? 12 : -1);
                            if (iDatePart >= 1 && iDatePart <= 12 && vMeriOffset !== -1) {
                                out.hour = iDatePart % 12 === 0 ? vMeriOffset : iDatePart + vMeriOffset;
                            } else {
                                if (iDatePart >= 0 && iDatePart <= 23) {
                                    out.hour = iDatePart;
                                }
                            }
                        } else {
                            if (iDatePart >= 0 && iDatePart <= 23) {
                                out.hour = iDatePart;
                            } else {
                                return null;
                            }
                        }
                        vTimeFlag = true;
                        break;
                    case 'G':
                    case 'H':
                        if (iDatePart >= 0 && iDatePart <= 23) {
                            out.hour = iDatePart;
                        } else {
                            return null;
                        }
                        vTimeFlag = true;
                        break;
                    case 'i':
                        if (iDatePart >= 0 && iDatePart <= 59) {
                            out.min = iDatePart;
                        } else {
                            return null;
                        }
                        vTimeFlag = true;
                        break;
                    case 's':
                        if (iDatePart >= 0 && iDatePart <= 59) {
                            out.sec = iDatePart;
                        } else {
                            return null;
                        }
                        vTimeFlag = true;
                        break;
                }
            }
            if (vDateFlag === true) {
                var varY = out.year || 0, varM = out.month ? out.month - 1 : 0, varD = out.day || 1;
                out.date = new Date(varY, varM, varD, out.hour, out.min, out.sec, 0);
            } else {
                if (vTimeFlag !== true) {
                    return null;
                }
                out.date = new Date(0, 0, 0, out.hour, out.min, out.sec, 0);
            }
            return out.date;
        },
        guessDate: function (vDateStr, vFormat) {
            if (typeof vDateStr !== 'string') {
                return vDateStr;
            }
            var self = this, vParts = vDateStr.replace(self.separators, '\0').split('\0'), vPattern = /^[djmn]/g, len,
                vFormatParts = vFormat.match(self.validParts), vDate = new Date(), vDigit = 0, vYear, i, n, iPart, iSec;

            if (!vPattern.test(vFormatParts[0])) {
                return vDateStr;
            }

            for (i = 0; i < vParts.length; i++) {
                vDigit = 2;
                iPart = vParts[i];
                iSec = $h.getInt(iPart.substr(0, 2));
                if (isNaN(iSec)) {
                    return null;
                }
                switch (i) {
                    case 0:
                        if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {
                            vDate.setMonth(iSec - 1);
                        } else {
                            vDate.setDate(iSec);
                        }
                        break;
                    case 1:
                        if (vFormatParts[0] === 'm' || vFormatParts[0] === 'n') {
                            vDate.setDate(iSec);
                        } else {
                            vDate.setMonth(iSec - 1);
                        }
                        break;
                    case 2:
                        vYear = vDate.getFullYear();
                        len = iPart.length;
                        vDigit = len < 4 ? len : 4;
                        vYear = $h.getInt(len < 4 ? vYear.toString().substr(0, 4 - len) + iPart : iPart.substr(0, 4));
                        if (!vYear) {
                            return null;
                        }
                        vDate.setFullYear(vYear);
                        break;
                    case 3:
                        vDate.setHours(iSec);
                        break;
                    case 4:
                        vDate.setMinutes(iSec);
                        break;
                    case 5:
                        vDate.setSeconds(iSec);
                        break;
                }
                n = iPart.substr(vDigit);
                if (n.length > 0) {
                    vParts.splice(i + 1, 0, n);
                }
            }
            return vDate;
        },
        parseFormat: function (vChar, vDate) {
            var self = this, vSettings = self.dateSettings, fmt, backslash = /\\?(.?)/gi, doFormat = function (t, s) {
                return fmt[t] ? fmt[t]() : s;
            };
            fmt = {
                /////////
                // DAY //
                /////////
                /**
                 * Day of month with leading 0: `01..31`
                 * @return {string}
                 */
                d: function () {
                    return $h.lpad(fmt.j(), 2);
                },
                /**
                 * Shorthand day name: `Mon...Sun`
                 * @return {string}
                 */
                D: function () {
                    return vSettings.daysShort[fmt.w()];
                },
                /**
                 * Day of month: `1..31`
                 * @return {number}
                 */
                j: function () {
                    return vDate.getDate();
                },
                /**
                 * Full day name: `Monday...Sunday`
                 * @return {string}
                 */
                l: function () {
                    return vSettings.days[fmt.w()];
                },
                /**
                 * ISO-8601 day of week: `1[Mon]..7[Sun]`
                 * @return {number}
                 */
                N: function () {
                    return fmt.w() || 7;
                },
                /**
                 * Day of week: `0[Sun]..6[Sat]`
                 * @return {number}
                 */
                w: function () {
                    return vDate.getDay();
                },
                /**
                 * Day of year: `0..365`
                 * @return {number}
                 */
                z: function () {
                    var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j()), b = new Date(fmt.Y(), 0, 1);
                    return Math.round((a - b) / $h.DAY);
                },

                //////////
                // WEEK //
                //////////
                /**
                 * ISO-8601 week number
                 * @return {number}
                 */
                W: function () {
                    var a = new Date(fmt.Y(), fmt.n() - 1, fmt.j() - fmt.N() + 3), b = new Date(a.getFullYear(), 0, 4);
                    return $h.lpad(1 + Math.round((a - b) / $h.DAY / 7), 2);
                },

                ///////////
                // MONTH //
                ///////////
                /**
                 * Full month name: `January...December`
                 * @return {string}
                 */
                F: function () {
                    return vSettings.months[vDate.getMonth()];
                },
                /**
                 * Month w/leading 0: `01..12`
                 * @return {string}
                 */
                m: function () {
                    return $h.lpad(fmt.n(), 2);
                },
                /**
                 * Shorthand month name; `Jan...Dec`
                 * @return {string}
                 */
                M: function () {
                    return vSettings.monthsShort[vDate.getMonth()];
                },
                /**
                 * Month: `1...12`
                 * @return {number}
                 */
                n: function () {
                    return vDate.getMonth() + 1;
                },
                /**
                 * Days in month: `28...31`
                 * @return {number}
                 */
                t: function () {
                    return (new Date(fmt.Y(), fmt.n(), 0)).getDate();
                },

                //////////
                // YEAR //
                //////////
                /**
                 * Is leap year? `0 or 1`
                 * @return {number}
                 */
                L: function () {
                    var Y = fmt.Y();
                    return (Y % 4 === 0 && Y % 100 !== 0 || Y % 400 === 0) ? 1 : 0;
                },
                /**
                 * ISO-8601 year
                 * @return {number}
                 */
                o: function () {
                    var n = fmt.n(), W = fmt.W(), Y = fmt.Y();
                    return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
                },
                /**
                 * Full year: `e.g. 1980...2010`
                 * @return {number}
                 */
                Y: function () {
                    return vDate.getFullYear();
                },
                /**
                 * Last two digits of year: `00...99`
                 * @return {string}
                 */
                y: function () {
                    return fmt.Y().toString().slice(-2);
                },

                //////////
                // TIME //
                //////////
                /**
                 * Meridian lower: `am or pm`
                 * @return {string}
                 */
                a: function () {
                    return fmt.A().toLowerCase();
                },
                /**
                 * Meridian upper: `AM or PM`
                 * @return {string}
                 */
                A: function () {
                    var n = fmt.G() < 12 ? 0 : 1;
                    return vSettings.meridiem[n];
                },
                /**
                 * Swatch Internet time: `000..999`
                 * @return {string}
                 */
                B: function () {
                    var H = vDate.getUTCHours() * $h.HOUR, i = vDate.getUTCMinutes() * 60, s = vDate.getUTCSeconds();
                    return $h.lpad(Math.floor((H + i + s + $h.HOUR) / 86.4) % 1000, 3);
                },
                /**
                 * 12-Hours: `1..12`
                 * @return {number}
                 */
                g: function () {
                    return fmt.G() % 12 || 12;
                },
                /**
                 * 24-Hours: `0..23`
                 * @return {number}
                 */
                G: function () {
                    return vDate.getHours();
                },
                /**
                 * 12-Hours with leading 0: `01..12`
                 * @return {string}
                 */
                h: function () {
                    return $h.lpad(fmt.g(), 2);
                },
                /**
                 * 24-Hours w/leading 0: `00..23`
                 * @return {string}
                 */
                H: function () {
                    return $h.lpad(fmt.G(), 2);
                },
                /**
                 * Minutes w/leading 0: `00..59`
                 * @return {string}
                 */
                i: function () {
                    return $h.lpad(vDate.getMinutes(), 2);
                },
                /**
                 * Seconds w/leading 0: `00..59`
                 * @return {string}
                 */
                s: function () {
                    return $h.lpad(vDate.getSeconds(), 2);
                },
                /**
                 * Microseconds: `000000-999000`
                 * @return {string}
                 */
                u: function () {
                    return $h.lpad(vDate.getMilliseconds() * 1000, 6);
                },

                //////////////
                // TIMEZONE //
                //////////////
                /**
                 * Timezone identifier: `e.g. Atlantic/Azores, ...`
                 * @return {string}
                 */
                e: function () {
                    var str = /\((.*)\)/.exec(String(vDate))[1];
                    return str || 'Coordinated Universal Time';
                },
                /**
                 * DST observed? `0 or 1`
                 * @return {number}
                 */
                I: function () {
                    var a = new Date(fmt.Y(), 0), c = Date.UTC(fmt.Y(), 0),
                        b = new Date(fmt.Y(), 6), d = Date.UTC(fmt.Y(), 6);
                    return ((a - c) !== (b - d)) ? 1 : 0;
                },
                /**
                 * Difference to GMT in hour format: `e.g. +0200`
                 * @return {string}
                 */
                O: function () {
                    var tzo = vDate.getTimezoneOffset(), a = Math.abs(tzo);
                    return (tzo > 0 ? '-' : '+') + $h.lpad(Math.floor(a / 60) * 100 + a % 60, 4);
                },
                /**
                 * Difference to GMT with colon: `e.g. +02:00`
                 * @return {string}
                 */
                P: function () {
                    var O = fmt.O();
                    return (O.substr(0, 3) + ':' + O.substr(3, 2));
                },
                /**
                 * Timezone abbreviation: `e.g. EST, MDT, ...`
                 * @return {string}
                 */
                T: function () {
                    var str = (String(vDate).match(self.tzParts) || ['']).pop().replace(self.tzClip, '');
                    return str || 'UTC';
                },
                /**
                 * Timezone offset in seconds: `-43200...50400`
                 * @return {number}
                 */
                Z: function () {
                    return -vDate.getTimezoneOffset() * 60;
                },

                ////////////////////
                // FULL DATE TIME //
                ////////////////////
                /**
                 * ISO-8601 date
                 * @return {string}
                 */
                c: function () {
                    return 'Y-m-d\\TH:i:sP'.replace(backslash, doFormat);
                },
                /**
                 * RFC 2822 date
                 * @return {string}
                 */
                r: function () {
                    return 'D, d M Y H:i:s O'.replace(backslash, doFormat);
                },
                /**
                 * Seconds since UNIX epoch
                 * @return {number}
                 */
                U: function () {
                    return vDate.getTime() / 1000 || 0;
                }
            };
            return doFormat(vChar, vChar);
        },
        formatDate: function (vDate, vFormat) {
            var self = this, i, n, len, str, vChar, vDateStr = '', BACKSLASH = '\\';
            if (typeof vDate === 'string') {
                vDate = self.parseDate(vDate, vFormat);
                if (!vDate) {
                    return null;
                }
            }
            if (vDate instanceof Date) {
                len = vFormat.length;
                for (i = 0; i < len; i++) {
                    vChar = vFormat.charAt(i);
                    if (vChar === 'S' || vChar === BACKSLASH) {
                        continue;
                    }
                    if (i > 0 && vFormat.charAt(i - 1) === BACKSLASH) {
                        vDateStr += vChar;
                        continue;
                    }
                    str = self.parseFormat(vChar, vDate);
                    if (i !== (len - 1) && self.intParts.test(vChar) && vFormat.charAt(i + 1) === 'S') {
                        n = $h.getInt(str) || 0;
                        str += self.dateSettings.ordinal(n);
                    }
                    vDateStr += str;
                }
                return vDateStr;
            }
            return '';
        }
    };
    return DateFormatter;
}));
/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

var laravelValidation;
laravelValidation = {

    implicitRules: ['Required','Confirmed'],

    /**
     * Initialize laravel validations.
     */
    init: function () {

        // jquery-validation requires the field under validation to be present. We're adding a dummy hidden
        // field so that any errors are not visible.
        var constructor = $.fn.validate;
        $.fn.validate = function( options ) {
            var name = 'proengsoft_jsvalidation'; // must match the name defined in JsValidatorFactory.newFormRequestValidator
            var $elm = $(this).find('input[name="' + name + '"]');
            if ($elm.length === 0) {
                $('<input>').attr({type: 'hidden', name: name}).appendTo(this);
            }

            return constructor.apply(this, [options]);
        };

        // Disable class rules and attribute rules
        $.validator.classRuleSettings = {};
        $.validator.attributeRules = function () {};

        $.validator.dataRules = this.arrayRules;
        $.validator.prototype.arrayRulesCache = {};

        // Register validations methods
        this.setupValidations();
    },

    arrayRules: function(element) {

        var rules = {},
            validator = $.data( element.form, "validator"),
            cache = validator.arrayRulesCache;

        // Is not an Array
        if (element.name.indexOf('[') === -1) {
            return rules;
        }

        if (! (element.name in cache)) {
            cache[element.name] = {};
        }

        $.each(validator.settings.rules, function(name, tmpRules) {
            if (name in cache[element.name]) {
                rules = laravelValidation.helpers.mergeRules(rules, cache[element.name][name]);
            } else {
                cache[element.name][name] = {};

                var nameRegExp = laravelValidation.helpers.regexFromWildcard(name);
                if (element.name.match(nameRegExp)) {
                    var newRules = $.validator.normalizeRule(tmpRules) || {};
                    cache[element.name][name] = newRules;

                    rules = laravelValidation.helpers.mergeRules(rules, newRules);
                }
            }
        });

        return rules;
    },

    setupValidations: function () {

        /**
         * Get CSRF token.
         *
         * @param params
         * @returns {string}
         */
        var getCsrfToken = function (params) {
            return params[0][1][1];
        };

        /**
         * Whether to validate all attributes.
         *
         * @param params
         * @returns {boolean}
         */
        var isValidateAll = function (params) {
            return params[0][1][2];
        };

        /**
         * Determine whether the rule is implicit.
         *
         * @param params
         * @returns {boolean}
         */
        var isImplicit = function (params) {
            var implicit = false;
            $.each(params, function (i, parameters) {
                implicit = implicit || parameters[3];
            });

            return implicit;
        };

        /**
         * Get form method from a validator instance.
         *
         * @param validator
         * @returns {string}
         */
        var formMethod = function (validator) {
            var formMethod = $(validator.currentForm).attr('method');
            if ($(validator.currentForm).find('input[name="_method"]').length) {
                formMethod = $(validator.currentForm).find('input[name="_method"]').val();
            }

            return formMethod;
        };

        /**
         * Get AJAX parameters for remote requests.
         *
         * @param validator
         * @param element
         * @param params
         * @param data
         * @returns {object}
         */
        var ajaxOpts = function (validator, element, params, data) {
            return {
                mode: 'abort',
                port: 'validate' + element.name,
                dataType: 'json',
                data: data,
                context: validator.currentForm,
                url: $(validator.currentForm).attr('action'),
                type: formMethod(validator),
                beforeSend: function (xhr) {
                    var token = getCsrfToken(params);
                    if (formMethod(validator) !== 'get' && token) {
                        return xhr.setRequestHeader('X-XSRF-TOKEN', token);
                    }
                },
            };
        };

        /**
         * Validate a set of local JS based rules against an element.
         *
         * @param validator
         * @param values
         * @param element
         * @param rules
         * @returns {boolean}
         */
        var validateLocalRules = function (validator, values, element, rules) {
            var validated = true,
                previous = validator.previousValue(element);

            $.each(rules, function (i, param) {
                var implicit = param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1;
                var rule = param[0];
                var message = param[2];

                if (! implicit && validator.optional(element)) {
                    validated = "dependency-mismatch";
                    return false;
                }

                if (laravelValidation.methods[rule] !== undefined) {
                    $.each(values, function(index, value) {
                        validated = laravelValidation.methods[rule].call(validator, value, element, param[1], function(valid) {
                            validator.settings.messages[element.name].laravelValidationRemote = previous.originalMessage;
                            if (valid) {
                                var submitted = validator.formSubmitted;
                                validator.prepareElement(element);
                                validator.formSubmitted = submitted;
                                validator.successList.push(element);
                                delete validator.invalid[element.name];
                                validator.showErrors();
                            } else {
                                var errors = {};
                                errors[ element.name ]
                                    = previous.message
                                    = typeof message === "function" ? message( value ) : message;
                                validator.invalid[element.name] = true;
                                validator.showErrors(errors);
                            }
                            validator.showErrors(validator.errorMap);
                            previous.valid = valid;
                        });

                        // Break loop.
                        if (validated === false) {
                            return false;
                        }
                    });
                } else {
                    validated = false;
                }

                if (validated !== true) {
                    if (!validator.settings.messages[element.name] ) {
                        validator.settings.messages[element.name] = {};
                    }

                    validator.settings.messages[element.name].laravelValidation= message;

                    return false;
                }

            });

            return validated;
        };

        /**
         * Create JQueryValidation check to validate Laravel rules.
         */

        $.validator.addMethod("laravelValidation", function (value, element, params) {
            var rules = [],
                arrayRules = [];
            $.each(params, function (i, param) {
                // put Implicit rules in front
                var isArrayRule = param[4].indexOf('[') !== -1;
                if (param[3] || laravelValidation.implicitRules.indexOf(param[0]) !== -1) {
                    isArrayRule ? arrayRules.unshift(param) : rules.unshift(param);
                } else {
                    isArrayRule ? arrayRules.push(param) : rules.push(param);
                }
            });

            // Validate normal rules.
            var localRulesResult = validateLocalRules(this, [value], element, rules);

            // Validate items of the array using array rules.
            var arrayValue = ! Array.isArray(value) ? [value] : value;
            var arrayRulesResult = validateLocalRules(this, arrayValue, element, arrayRules);

            return localRulesResult && arrayRulesResult;
        }, '');


        /**
         * Create JQueryValidation check to validate Remote Laravel rules.
         */
        $.validator.addMethod("laravelValidationRemote", function (value, element, params) {

            if (! isImplicit(params) && this.optional( element )) {
                return "dependency-mismatch";
            }

            var previous = this.previousValue( element ),
                validator, data;

            if (! this.settings.messages[ element.name ]) {
                this.settings.messages[ element.name ] = {};
            }
            previous.originalMessage = this.settings.messages[ element.name ].laravelValidationRemote;
            this.settings.messages[ element.name ].laravelValidationRemote = previous.message;

            if (laravelValidation.helpers.arrayEquals(previous.old, value) || previous.old === value) {
                return previous.valid;
            }

            previous.old = value;
            validator = this;
            this.startRequest( element );

            data = $(validator.currentForm).serializeArray();
            data.push({'name': '_jsvalidation', 'value': element.name});
            data.push({'name': '_jsvalidation_validate_all', 'value': isValidateAll(params)});

            $.ajax( ajaxOpts(validator, element, params, data) )
                .always(function( response, textStatus ) {
                    var errors, message, submitted, valid;

                    if (textStatus === 'error') {
                        valid = false;
                        response = laravelValidation.helpers.parseErrorResponse(response);
                    } else if (textStatus === 'success') {
                        valid = response === true || response === "true";
                    } else {
                        return;
                    }

                    validator.settings.messages[ element.name ].laravelValidationRemote = previous.originalMessage;

                    if ( valid ) {
                        submitted = validator.formSubmitted;
                        validator.prepareElement( element );
                        validator.formSubmitted = submitted;
                        validator.successList.push( element );
                        delete validator.invalid[ element.name ];
                        validator.showErrors();
                    } else {
                        errors = {};
                        message = response || validator.defaultMessage( element, "remote" );
                        errors[ element.name ]
                            = previous.message
                            = typeof message === "function" ? message( value ) : message[0];
                        validator.invalid[ element.name ] = true;
                        validator.showErrors( errors );
                    }
                    validator.showErrors(validator.errorMap);
                    previous.valid = valid;
                    validator.stopRequest( element, valid );
                }
            );
            return "pending";
        }, '');

        /**
         * Create JQueryValidation check to form requests.
         */
        $.validator.addMethod("laravelValidationFormRequest", function (value, element, params) {

            var validator = this,
                previous = validator.previousValue(element);

            var data = $(validator.currentForm).serializeArray();
            data.push({name: '__proengsoft_form_request', value: 1}); // must match FormRequest.JS_VALIDATION_FIELD

            // Skip AJAX if the value remains the same as a prior request.
            if (JSON.stringify(previous.old) === JSON.stringify(data)) {
                if (! previous.valid) {
                    validator.showErrors(previous.errors || {});
                }

                return previous.valid;
            }

            previous.old = data;
            this.startRequest( element );

            $.ajax(ajaxOpts(validator, element, params, data))
                .always(function( response, textStatus ) {
                    var errors = {},
                        valid = textStatus === 'success' && (response === true || response === 'true');

                    if (valid) {
                        validator.resetInternals();
                        validator.toHide = validator.errorsFor( element );
                    } else {
                        $.each( response, function( fieldName, errorMessages ) {
                            var errorElement = laravelValidation.helpers.findByName(validator, fieldName)[0];
                            if (errorElement) {
                                errors[errorElement.name] = laravelValidation.helpers.encode(errorMessages[0] || '');
                            }
                        });

                        // Failed to find the error fields so mark the form as valid otherwise user
                        // will be left in limbo with no visible error messages.
                        if ($.isEmptyObject(errors)) {
                            valid = true;
                        }
                    }

                    previous.valid = valid;
                    previous.errors = errors;
                    validator.showErrors(errors);
                    validator.stopRequest(element, valid);
                });

            return 'pending';
        }, '');
    }
};

$(function() {
    laravelValidation.init();
});

/******/ (function() { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ "./node_modules/locutus/php/array/array_diff.js":
/*!******************************************************!*\
  !*** ./node_modules/locutus/php/array/array_diff.js ***!
  \******************************************************/
/***/ (function(module) {



module.exports = function array_diff(arr1) {
  // eslint-disable-line camelcase
  //  discuss at: https://locutus.io/php/array_diff/
  // original by: Kevin van Zonneveld (https://kvz.io)
  // improved by: Sanjoy Roy
  //  revised by: Brett Zamir (https://brett-zamir.me)
  //   example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld'])
  //   returns 1: {0:'Kevin'}

  var retArr = {};
  var argl = arguments.length;
  var k1 = '';
  var i = 1;
  var k = '';
  var arr = {};

  arr1keys: for (k1 in arr1) {
    // eslint-disable-line no-labels
    for (i = 1; i < argl; i++) {
      arr = arguments[i];
      for (k in arr) {
        if (arr[k] === arr1[k1]) {
          // If it reaches here, it was found in at least one array, so try next value
          continue arr1keys; // eslint-disable-line no-labels
        }
      }
      retArr[k1] = arr1[k1];
    }
  }

  return retArr;
};
//# sourceMappingURL=array_diff.js.map

/***/ }),

/***/ "./node_modules/locutus/php/datetime/strtotime.js":
/*!********************************************************!*\
  !*** ./node_modules/locutus/php/datetime/strtotime.js ***!
  \********************************************************/
/***/ (function(module) {



var reSpace = '[ \\t]+';
var reSpaceOpt = '[ \\t]*';
var reMeridian = '(?:([ap])\\.?m\\.?([\\t ]|$))';
var reHour24 = '(2[0-4]|[01]?[0-9])';
var reHour24lz = '([01][0-9]|2[0-4])';
var reHour12 = '(0?[1-9]|1[0-2])';
var reMinute = '([0-5]?[0-9])';
var reMinutelz = '([0-5][0-9])';
var reSecond = '(60|[0-5]?[0-9])';
var reSecondlz = '(60|[0-5][0-9])';
var reFrac = '(?:\\.([0-9]+))';

var reDayfull = 'sunday|monday|tuesday|wednesday|thursday|friday|saturday';
var reDayabbr = 'sun|mon|tue|wed|thu|fri|sat';
var reDaytext = reDayfull + '|' + reDayabbr + '|weekdays?';

var reReltextnumber = 'first|second|third|fourth|fifth|sixth|seventh|eighth?|ninth|tenth|eleventh|twelfth';
var reReltexttext = 'next|last|previous|this';
var reReltextunit = '(?:second|sec|minute|min|hour|day|fortnight|forthnight|month|year)s?|weeks|' + reDaytext;

var reYear = '([0-9]{1,4})';
var reYear2 = '([0-9]{2})';
var reYear4 = '([0-9]{4})';
var reYear4withSign = '([+-]?[0-9]{4})';
var reMonth = '(1[0-2]|0?[0-9])';
var reMonthlz = '(0[0-9]|1[0-2])';
var reDay = '(?:(3[01]|[0-2]?[0-9])(?:st|nd|rd|th)?)';
var reDaylz = '(0[0-9]|[1-2][0-9]|3[01])';

var reMonthFull = 'january|february|march|april|may|june|july|august|september|october|november|december';
var reMonthAbbr = 'jan|feb|mar|apr|may|jun|jul|aug|sept?|oct|nov|dec';
var reMonthroman = 'i[vx]|vi{0,3}|xi{0,2}|i{1,3}';
var reMonthText = '(' + reMonthFull + '|' + reMonthAbbr + '|' + reMonthroman + ')';

var reTzCorrection = '((?:GMT)?([+-])' + reHour24 + ':?' + reMinute + '?)';
var reTzAbbr = '\\(?([a-zA-Z]{1,6})\\)?';
var reDayOfYear = '(00[1-9]|0[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6])';
var reWeekOfYear = '(0[1-9]|[1-4][0-9]|5[0-3])';

var reDateNoYear = reMonthText + '[ .\\t-]*' + reDay + '[,.stndrh\\t ]*';

function processMeridian(hour, meridian) {
  meridian = meridian && meridian.toLowerCase();

  switch (meridian) {
    case 'a':
      hour += hour === 12 ? -12 : 0;
      break;
    case 'p':
      hour += hour !== 12 ? 12 : 0;
      break;
  }

  return hour;
}

function processYear(yearStr) {
  var year = +yearStr;

  if (yearStr.length < 4 && year < 100) {
    year += year < 70 ? 2000 : 1900;
  }

  return year;
}

function lookupMonth(monthStr) {
  return {
    jan: 0,
    january: 0,
    i: 0,
    feb: 1,
    february: 1,
    ii: 1,
    mar: 2,
    march: 2,
    iii: 2,
    apr: 3,
    april: 3,
    iv: 3,
    may: 4,
    v: 4,
    jun: 5,
    june: 5,
    vi: 5,
    jul: 6,
    july: 6,
    vii: 6,
    aug: 7,
    august: 7,
    viii: 7,
    sep: 8,
    sept: 8,
    september: 8,
    ix: 8,
    oct: 9,
    october: 9,
    x: 9,
    nov: 10,
    november: 10,
    xi: 10,
    dec: 11,
    december: 11,
    xii: 11
  }[monthStr.toLowerCase()];
}

function lookupWeekday(dayStr) {
  var desiredSundayNumber = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;

  var dayNumbers = {
    mon: 1,
    monday: 1,
    tue: 2,
    tuesday: 2,
    wed: 3,
    wednesday: 3,
    thu: 4,
    thursday: 4,
    fri: 5,
    friday: 5,
    sat: 6,
    saturday: 6,
    sun: 0,
    sunday: 0
  };

  return dayNumbers[dayStr.toLowerCase()] || desiredSundayNumber;
}

function lookupRelative(relText) {
  var relativeNumbers = {
    last: -1,
    previous: -1,
    this: 0,
    first: 1,
    next: 1,
    second: 2,
    third: 3,
    fourth: 4,
    fifth: 5,
    sixth: 6,
    seventh: 7,
    eight: 8,
    eighth: 8,
    ninth: 9,
    tenth: 10,
    eleventh: 11,
    twelfth: 12
  };

  var relativeBehavior = {
    this: 1
  };

  var relTextLower = relText.toLowerCase();

  return {
    amount: relativeNumbers[relTextLower],
    behavior: relativeBehavior[relTextLower] || 0
  };
}

function processTzCorrection(tzOffset, oldValue) {
  var reTzCorrectionLoose = /(?:GMT)?([+-])(\d+)(:?)(\d{0,2})/i;
  tzOffset = tzOffset && tzOffset.match(reTzCorrectionLoose);

  if (!tzOffset) {
    return oldValue;
  }

  var sign = tzOffset[1] === '-' ? -1 : 1;
  var hours = +tzOffset[2];
  var minutes = +tzOffset[4];

  if (!tzOffset[4] && !tzOffset[3]) {
    minutes = Math.floor(hours % 100);
    hours = Math.floor(hours / 100);
  }

  // timezone offset in seconds
  return sign * (hours * 60 + minutes) * 60;
}

// tz abbrevation : tz offset in seconds
var tzAbbrOffsets = {
  acdt: 37800,
  acst: 34200,
  addt: -7200,
  adt: -10800,
  aedt: 39600,
  aest: 36000,
  ahdt: -32400,
  ahst: -36000,
  akdt: -28800,
  akst: -32400,
  amt: -13840,
  apt: -10800,
  ast: -14400,
  awdt: 32400,
  awst: 28800,
  awt: -10800,
  bdst: 7200,
  bdt: -36000,
  bmt: -14309,
  bst: 3600,
  cast: 34200,
  cat: 7200,
  cddt: -14400,
  cdt: -18000,
  cemt: 10800,
  cest: 7200,
  cet: 3600,
  cmt: -15408,
  cpt: -18000,
  cst: -21600,
  cwt: -18000,
  chst: 36000,
  dmt: -1521,
  eat: 10800,
  eddt: -10800,
  edt: -14400,
  eest: 10800,
  eet: 7200,
  emt: -26248,
  ept: -14400,
  est: -18000,
  ewt: -14400,
  ffmt: -14660,
  fmt: -4056,
  gdt: 39600,
  gmt: 0,
  gst: 36000,
  hdt: -34200,
  hkst: 32400,
  hkt: 28800,
  hmt: -19776,
  hpt: -34200,
  hst: -36000,
  hwt: -34200,
  iddt: 14400,
  idt: 10800,
  imt: 25025,
  ist: 7200,
  jdt: 36000,
  jmt: 8440,
  jst: 32400,
  kdt: 36000,
  kmt: 5736,
  kst: 30600,
  lst: 9394,
  mddt: -18000,
  mdst: 16279,
  mdt: -21600,
  mest: 7200,
  met: 3600,
  mmt: 9017,
  mpt: -21600,
  msd: 14400,
  msk: 10800,
  mst: -25200,
  mwt: -21600,
  nddt: -5400,
  ndt: -9052,
  npt: -9000,
  nst: -12600,
  nwt: -9000,
  nzdt: 46800,
  nzmt: 41400,
  nzst: 43200,
  pddt: -21600,
  pdt: -25200,
  pkst: 21600,
  pkt: 18000,
  plmt: 25590,
  pmt: -13236,
  ppmt: -17340,
  ppt: -25200,
  pst: -28800,
  pwt: -25200,
  qmt: -18840,
  rmt: 5794,
  sast: 7200,
  sdmt: -16800,
  sjmt: -20173,
  smt: -13884,
  sst: -39600,
  tbmt: 10751,
  tmt: 12344,
  uct: 0,
  utc: 0,
  wast: 7200,
  wat: 3600,
  wemt: 7200,
  west: 3600,
  wet: 0,
  wib: 25200,
  wita: 28800,
  wit: 32400,
  wmt: 5040,
  yddt: -25200,
  ydt: -28800,
  ypt: -28800,
  yst: -32400,
  ywt: -28800,
  a: 3600,
  b: 7200,
  c: 10800,
  d: 14400,
  e: 18000,
  f: 21600,
  g: 25200,
  h: 28800,
  i: 32400,
  k: 36000,
  l: 39600,
  m: 43200,
  n: -3600,
  o: -7200,
  p: -10800,
  q: -14400,
  r: -18000,
  s: -21600,
  t: -25200,
  u: -28800,
  v: -32400,
  w: -36000,
  x: -39600,
  y: -43200,
  z: 0
};

var formats = {
  yesterday: {
    regex: /^yesterday/i,
    name: 'yesterday',
    callback: function callback() {
      this.rd -= 1;
      return this.resetTime();
    }
  },

  now: {
    regex: /^now/i,
    name: 'now'
    // do nothing
  },

  noon: {
    regex: /^noon/i,
    name: 'noon',
    callback: function callback() {
      return this.resetTime() && this.time(12, 0, 0, 0);
    }
  },

  midnightOrToday: {
    regex: /^(midnight|today)/i,
    name: 'midnight | today',
    callback: function callback() {
      return this.resetTime();
    }
  },

  tomorrow: {
    regex: /^tomorrow/i,
    name: 'tomorrow',
    callback: function callback() {
      this.rd += 1;
      return this.resetTime();
    }
  },

  timestamp: {
    regex: /^@(-?\d+)/i,
    name: 'timestamp',
    callback: function callback(match, timestamp) {
      this.rs += +timestamp;
      this.y = 1970;
      this.m = 0;
      this.d = 1;
      this.dates = 0;

      return this.resetTime() && this.zone(0);
    }
  },

  firstOrLastDay: {
    regex: /^(first|last) day of/i,
    name: 'firstdayof | lastdayof',
    callback: function callback(match, day) {
      if (day.toLowerCase() === 'first') {
        this.firstOrLastDayOfMonth = 1;
      } else {
        this.firstOrLastDayOfMonth = -1;
      }
    }
  },

  backOrFrontOf: {
    regex: RegExp('^(back|front) of ' + reHour24 + reSpaceOpt + reMeridian + '?', 'i'),
    name: 'backof | frontof',
    callback: function callback(match, side, hours, meridian) {
      var back = side.toLowerCase() === 'back';
      var hour = +hours;
      var minute = 15;

      if (!back) {
        hour -= 1;
        minute = 45;
      }

      hour = processMeridian(hour, meridian);

      return this.resetTime() && this.time(hour, minute, 0, 0);
    }
  },

  weekdayOf: {
    regex: RegExp('^(' + reReltextnumber + '|' + reReltexttext + ')' + reSpace + '(' + reDayfull + '|' + reDayabbr + ')' + reSpace + 'of', 'i'),
    name: 'weekdayof'
    // todo
  },

  mssqltime: {
    regex: RegExp('^' + reHour12 + ':' + reMinutelz + ':' + reSecondlz + '[:.]([0-9]+)' + reMeridian, 'i'),
    name: 'mssqltime',
    callback: function callback(match, hour, minute, second, frac, meridian) {
      return this.time(processMeridian(+hour, meridian), +minute, +second, +frac.substr(0, 3));
    }
  },

  timeLong12: {
    regex: RegExp('^' + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),
    name: 'timelong12',
    callback: function callback(match, hour, minute, second, meridian) {
      return this.time(processMeridian(+hour, meridian), +minute, +second, 0);
    }
  },

  timeShort12: {
    regex: RegExp('^' + reHour12 + '[:.]' + reMinutelz + reSpaceOpt + reMeridian, 'i'),
    name: 'timeshort12',
    callback: function callback(match, hour, minute, meridian) {
      return this.time(processMeridian(+hour, meridian), +minute, 0, 0);
    }
  },

  timeTiny12: {
    regex: RegExp('^' + reHour12 + reSpaceOpt + reMeridian, 'i'),
    name: 'timetiny12',
    callback: function callback(match, hour, meridian) {
      return this.time(processMeridian(+hour, meridian), 0, 0, 0);
    }
  },

  soap: {
    regex: RegExp('^' + reYear4 + '-' + reMonthlz + '-' + reDaylz + 'T' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz + reFrac + reTzCorrection + '?', 'i'),
    name: 'soap',
    callback: function callback(match, year, month, day, hour, minute, second, frac, tzCorrection) {
      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, +frac.substr(0, 3)) && this.zone(processTzCorrection(tzCorrection));
    }
  },

  wddx: {
    regex: RegExp('^' + reYear4 + '-' + reMonth + '-' + reDay + 'T' + reHour24 + ':' + reMinute + ':' + reSecond),
    name: 'wddx',
    callback: function callback(match, year, month, day, hour, minute, second) {
      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);
    }
  },

  exif: {
    regex: RegExp('^' + reYear4 + ':' + reMonthlz + ':' + reDaylz + ' ' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz, 'i'),
    name: 'exif',
    callback: function callback(match, year, month, day, hour, minute, second) {
      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);
    }
  },

  xmlRpc: {
    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz + 'T' + reHour24 + ':' + reMinutelz + ':' + reSecondlz),
    name: 'xmlrpc',
    callback: function callback(match, year, month, day, hour, minute, second) {
      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);
    }
  },

  xmlRpcNoColon: {
    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz + '[Tt]' + reHour24 + reMinutelz + reSecondlz),
    name: 'xmlrpcnocolon',
    callback: function callback(match, year, month, day, hour, minute, second) {
      return this.ymd(+year, month - 1, +day) && this.time(+hour, +minute, +second, 0);
    }
  },

  clf: {
    regex: RegExp('^' + reDay + '/(' + reMonthAbbr + ')/' + reYear4 + ':' + reHour24lz + ':' + reMinutelz + ':' + reSecondlz + reSpace + reTzCorrection, 'i'),
    name: 'clf',
    callback: function callback(match, day, month, year, hour, minute, second, tzCorrection) {
      return this.ymd(+year, lookupMonth(month), +day) && this.time(+hour, +minute, +second, 0) && this.zone(processTzCorrection(tzCorrection));
    }
  },

  iso8601long: {
    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond + reFrac, 'i'),
    name: 'iso8601long',
    callback: function callback(match, hour, minute, second, frac) {
      return this.time(+hour, +minute, +second, +frac.substr(0, 3));
    }
  },

  dateTextual: {
    regex: RegExp('^' + reMonthText + '[ .\\t-]*' + reDay + '[,.stndrh\\t ]+' + reYear, 'i'),
    name: 'datetextual',
    callback: function callback(match, month, day, year) {
      return this.ymd(processYear(year), lookupMonth(month), +day);
    }
  },

  pointedDate4: {
    regex: RegExp('^' + reDay + '[.\\t-]' + reMonth + '[.-]' + reYear4),
    name: 'pointeddate4',
    callback: function callback(match, day, month, year) {
      return this.ymd(+year, month - 1, +day);
    }
  },

  pointedDate2: {
    regex: RegExp('^' + reDay + '[.\\t]' + reMonth + '\\.' + reYear2),
    name: 'pointeddate2',
    callback: function callback(match, day, month, year) {
      return this.ymd(processYear(year), month - 1, +day);
    }
  },

  timeLong24: {
    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond),
    name: 'timelong24',
    callback: function callback(match, hour, minute, second) {
      return this.time(+hour, +minute, +second, 0);
    }
  },

  dateNoColon: {
    regex: RegExp('^' + reYear4 + reMonthlz + reDaylz),
    name: 'datenocolon',
    callback: function callback(match, year, month, day) {
      return this.ymd(+year, month - 1, +day);
    }
  },

  pgydotd: {
    regex: RegExp('^' + reYear4 + '\\.?' + reDayOfYear),
    name: 'pgydotd',
    callback: function callback(match, year, day) {
      return this.ymd(+year, 0, +day);
    }
  },

  timeShort24: {
    regex: RegExp('^t?' + reHour24 + '[:.]' + reMinute, 'i'),
    name: 'timeshort24',
    callback: function callback(match, hour, minute) {
      return this.time(+hour, +minute, 0, 0);
    }
  },

  iso8601noColon: {
    regex: RegExp('^t?' + reHour24lz + reMinutelz + reSecondlz, 'i'),
    name: 'iso8601nocolon',
    callback: function callback(match, hour, minute, second) {
      return this.time(+hour, +minute, +second, 0);
    }
  },

  iso8601dateSlash: {
    // eventhough the trailing slash is optional in PHP
    // here it's mandatory and inputs without the slash
    // are handled by dateslash
    regex: RegExp('^' + reYear4 + '/' + reMonthlz + '/' + reDaylz + '/'),
    name: 'iso8601dateslash',
    callback: function callback(match, year, month, day) {
      return this.ymd(+year, month - 1, +day);
    }
  },

  dateSlash: {
    regex: RegExp('^' + reYear4 + '/' + reMonth + '/' + reDay),
    name: 'dateslash',
    callback: function callback(match, year, month, day) {
      return this.ymd(+year, month - 1, +day);
    }
  },

  american: {
    regex: RegExp('^' + reMonth + '/' + reDay + '/' + reYear),
    name: 'american',
    callback: function callback(match, month, day, year) {
      return this.ymd(processYear(year), month - 1, +day);
    }
  },

  americanShort: {
    regex: RegExp('^' + reMonth + '/' + reDay),
    name: 'americanshort',
    callback: function callback(match, month, day) {
      return this.ymd(this.y, month - 1, +day);
    }
  },

  gnuDateShortOrIso8601date2: {
    // iso8601date2 is complete subset of gnudateshort
    regex: RegExp('^' + reYear + '-' + reMonth + '-' + reDay),
    name: 'gnudateshort | iso8601date2',
    callback: function callback(match, year, month, day) {
      return this.ymd(processYear(year), month - 1, +day);
    }
  },

  iso8601date4: {
    regex: RegExp('^' + reYear4withSign + '-' + reMonthlz + '-' + reDaylz),
    name: 'iso8601date4',
    callback: function callback(match, year, month, day) {
      return this.ymd(+year, month - 1, +day);
    }
  },

  gnuNoColon: {
    regex: RegExp('^t?' + reHour24lz + reMinutelz, 'i'),
    name: 'gnunocolon',
    callback: function callback(match, hour, minute) {
      // this rule is a special case
      // if time was already set once by any preceding rule, it sets the captured value as year
      switch (this.times) {
        case 0:
          return this.time(+hour, +minute, 0, this.f);
        case 1:
          this.y = hour * 100 + +minute;
          this.times++;

          return true;
        default:
          return false;
      }
    }
  },

  gnuDateShorter: {
    regex: RegExp('^' + reYear4 + '-' + reMonth),
    name: 'gnudateshorter',
    callback: function callback(match, year, month) {
      return this.ymd(+year, month - 1, 1);
    }
  },

  pgTextReverse: {
    // note: allowed years are from 32-9999
    // years below 32 should be treated as days in datefull
    regex: RegExp('^' + '(\\d{3,4}|[4-9]\\d|3[2-9])-(' + reMonthAbbr + ')-' + reDaylz, 'i'),
    name: 'pgtextreverse',
    callback: function callback(match, year, month, day) {
      return this.ymd(processYear(year), lookupMonth(month), +day);
    }
  },

  dateFull: {
    regex: RegExp('^' + reDay + '[ \\t.-]*' + reMonthText + '[ \\t.-]*' + reYear, 'i'),
    name: 'datefull',
    callback: function callback(match, day, month, year) {
      return this.ymd(processYear(year), lookupMonth(month), +day);
    }
  },

  dateNoDay: {
    regex: RegExp('^' + reMonthText + '[ .\\t-]*' + reYear4, 'i'),
    name: 'datenoday',
    callback: function callback(match, month, year) {
      return this.ymd(+year, lookupMonth(month), 1);
    }
  },

  dateNoDayRev: {
    regex: RegExp('^' + reYear4 + '[ .\\t-]*' + reMonthText, 'i'),
    name: 'datenodayrev',
    callback: function callback(match, year, month) {
      return this.ymd(+year, lookupMonth(month), 1);
    }
  },

  pgTextShort: {
    regex: RegExp('^(' + reMonthAbbr + ')-' + reDaylz + '-' + reYear, 'i'),
    name: 'pgtextshort',
    callback: function callback(match, month, day, year) {
      return this.ymd(processYear(year), lookupMonth(month), +day);
    }
  },

  dateNoYear: {
    regex: RegExp('^' + reDateNoYear, 'i'),
    name: 'datenoyear',
    callback: function callback(match, month, day) {
      return this.ymd(this.y, lookupMonth(month), +day);
    }
  },

  dateNoYearRev: {
    regex: RegExp('^' + reDay + '[ .\\t-]*' + reMonthText, 'i'),
    name: 'datenoyearrev',
    callback: function callback(match, day, month) {
      return this.ymd(this.y, lookupMonth(month), +day);
    }
  },

  isoWeekDay: {
    regex: RegExp('^' + reYear4 + '-?W' + reWeekOfYear + '(?:-?([0-7]))?'),
    name: 'isoweekday | isoweek',
    callback: function callback(match, year, week, day) {
      day = day ? +day : 1;

      if (!this.ymd(+year, 0, 1)) {
        return false;
      }

      // get day of week for Jan 1st
      var dayOfWeek = new Date(this.y, this.m, this.d).getDay();

      // and use the day to figure out the offset for day 1 of week 1
      dayOfWeek = 0 - (dayOfWeek > 4 ? dayOfWeek - 7 : dayOfWeek);

      this.rd += dayOfWeek + (week - 1) * 7 + day;
    }
  },

  relativeText: {
    regex: RegExp('^(' + reReltextnumber + '|' + reReltexttext + ')' + reSpace + '(' + reReltextunit + ')', 'i'),
    name: 'relativetext',
    callback: function callback(match, relValue, relUnit) {
      // todo: implement handling of 'this time-unit'
      // eslint-disable-next-line no-unused-vars
      var _lookupRelative = lookupRelative(relValue),
          amount = _lookupRelative.amount,
          behavior = _lookupRelative.behavior;

      switch (relUnit.toLowerCase()) {
        case 'sec':
        case 'secs':
        case 'second':
        case 'seconds':
          this.rs += amount;
          break;
        case 'min':
        case 'mins':
        case 'minute':
        case 'minutes':
          this.ri += amount;
          break;
        case 'hour':
        case 'hours':
          this.rh += amount;
          break;
        case 'day':
        case 'days':
          this.rd += amount;
          break;
        case 'fortnight':
        case 'fortnights':
        case 'forthnight':
        case 'forthnights':
          this.rd += amount * 14;
          break;
        case 'week':
        case 'weeks':
          this.rd += amount * 7;
          break;
        case 'month':
        case 'months':
          this.rm += amount;
          break;
        case 'year':
        case 'years':
          this.ry += amount;
          break;
        case 'mon':case 'monday':
        case 'tue':case 'tuesday':
        case 'wed':case 'wednesday':
        case 'thu':case 'thursday':
        case 'fri':case 'friday':
        case 'sat':case 'saturday':
        case 'sun':case 'sunday':
          this.resetTime();
          this.weekday = lookupWeekday(relUnit, 7);
          this.weekdayBehavior = 1;
          this.rd += (amount > 0 ? amount - 1 : amount) * 7;
          break;
        case 'weekday':
        case 'weekdays':
          // todo
          break;
      }
    }
  },

  relative: {
    regex: RegExp('^([+-]*)[ \\t]*(\\d+)' + reSpaceOpt + '(' + reReltextunit + '|week)', 'i'),
    name: 'relative',
    callback: function callback(match, signs, relValue, relUnit) {
      var minuses = signs.replace(/[^-]/g, '').length;

      var amount = +relValue * Math.pow(-1, minuses);

      switch (relUnit.toLowerCase()) {
        case 'sec':
        case 'secs':
        case 'second':
        case 'seconds':
          this.rs += amount;
          break;
        case 'min':
        case 'mins':
        case 'minute':
        case 'minutes':
          this.ri += amount;
          break;
        case 'hour':
        case 'hours':
          this.rh += amount;
          break;
        case 'day':
        case 'days':
          this.rd += amount;
          break;
        case 'fortnight':
        case 'fortnights':
        case 'forthnight':
        case 'forthnights':
          this.rd += amount * 14;
          break;
        case 'week':
        case 'weeks':
          this.rd += amount * 7;
          break;
        case 'month':
        case 'months':
          this.rm += amount;
          break;
        case 'year':
        case 'years':
          this.ry += amount;
          break;
        case 'mon':case 'monday':
        case 'tue':case 'tuesday':
        case 'wed':case 'wednesday':
        case 'thu':case 'thursday':
        case 'fri':case 'friday':
        case 'sat':case 'saturday':
        case 'sun':case 'sunday':
          this.resetTime();
          this.weekday = lookupWeekday(relUnit, 7);
          this.weekdayBehavior = 1;
          this.rd += (amount > 0 ? amount - 1 : amount) * 7;
          break;
        case 'weekday':
        case 'weekdays':
          // todo
          break;
      }
    }
  },

  dayText: {
    regex: RegExp('^(' + reDaytext + ')', 'i'),
    name: 'daytext',
    callback: function callback(match, dayText) {
      this.resetTime();
      this.weekday = lookupWeekday(dayText, 0);

      if (this.weekdayBehavior !== 2) {
        this.weekdayBehavior = 1;
      }
    }
  },

  relativeTextWeek: {
    regex: RegExp('^(' + reReltexttext + ')' + reSpace + 'week', 'i'),
    name: 'relativetextweek',
    callback: function callback(match, relText) {
      this.weekdayBehavior = 2;

      switch (relText.toLowerCase()) {
        case 'this':
          this.rd += 0;
          break;
        case 'next':
          this.rd += 7;
          break;
        case 'last':
        case 'previous':
          this.rd -= 7;
          break;
      }

      if (isNaN(this.weekday)) {
        this.weekday = 1;
      }
    }
  },

  monthFullOrMonthAbbr: {
    regex: RegExp('^(' + reMonthFull + '|' + reMonthAbbr + ')', 'i'),
    name: 'monthfull | monthabbr',
    callback: function callback(match, month) {
      return this.ymd(this.y, lookupMonth(month), this.d);
    }
  },

  tzCorrection: {
    regex: RegExp('^' + reTzCorrection, 'i'),
    name: 'tzcorrection',
    callback: function callback(tzCorrection) {
      return this.zone(processTzCorrection(tzCorrection));
    }
  },

  tzAbbr: {
    regex: RegExp('^' + reTzAbbr),
    name: 'tzabbr',
    callback: function callback(match, abbr) {
      var offset = tzAbbrOffsets[abbr.toLowerCase()];

      if (isNaN(offset)) {
        return false;
      }

      return this.zone(offset);
    }
  },

  ago: {
    regex: /^ago/i,
    name: 'ago',
    callback: function callback() {
      this.ry = -this.ry;
      this.rm = -this.rm;
      this.rd = -this.rd;
      this.rh = -this.rh;
      this.ri = -this.ri;
      this.rs = -this.rs;
      this.rf = -this.rf;
    }
  },

  year4: {
    regex: RegExp('^' + reYear4),
    name: 'year4',
    callback: function callback(match, year) {
      this.y = +year;
      return true;
    }
  },

  whitespace: {
    regex: /^[ .,\t]+/,
    name: 'whitespace'
    // do nothing
  },

  dateShortWithTimeLong: {
    regex: RegExp('^' + reDateNoYear + 't?' + reHour24 + '[:.]' + reMinute + '[:.]' + reSecond, 'i'),
    name: 'dateshortwithtimelong',
    callback: function callback(match, month, day, hour, minute, second) {
      return this.ymd(this.y, lookupMonth(month), +day) && this.time(+hour, +minute, +second, 0);
    }
  },

  dateShortWithTimeLong12: {
    regex: RegExp('^' + reDateNoYear + reHour12 + '[:.]' + reMinute + '[:.]' + reSecondlz + reSpaceOpt + reMeridian, 'i'),
    name: 'dateshortwithtimelong12',
    callback: function callback(match, month, day, hour, minute, second, meridian) {
      return this.ymd(this.y, lookupMonth(month), +day) && this.time(processMeridian(+hour, meridian), +minute, +second, 0);
    }
  },

  dateShortWithTimeShort: {
    regex: RegExp('^' + reDateNoYear + 't?' + reHour24 + '[:.]' + reMinute, 'i'),
    name: 'dateshortwithtimeshort',
    callback: function callback(match, month, day, hour, minute) {
      return this.ymd(this.y, lookupMonth(month), +day) && this.time(+hour, +minute, 0, 0);
    }
  },

  dateShortWithTimeShort12: {
    regex: RegExp('^' + reDateNoYear + reHour12 + '[:.]' + reMinutelz + reSpaceOpt + reMeridian, 'i'),
    name: 'dateshortwithtimeshort12',
    callback: function callback(match, month, day, hour, minute, meridian) {
      return this.ymd(this.y, lookupMonth(month), +day) && this.time(processMeridian(+hour, meridian), +minute, 0, 0);
    }
  }
};

var resultProto = {
  // date
  y: NaN,
  m: NaN,
  d: NaN,
  // time
  h: NaN,
  i: NaN,
  s: NaN,
  f: NaN,

  // relative shifts
  ry: 0,
  rm: 0,
  rd: 0,
  rh: 0,
  ri: 0,
  rs: 0,
  rf: 0,

  // weekday related shifts
  weekday: NaN,
  weekdayBehavior: 0,

  // first or last day of month
  // 0 none, 1 first, -1 last
  firstOrLastDayOfMonth: 0,

  // timezone correction in minutes
  z: NaN,

  // counters
  dates: 0,
  times: 0,
  zones: 0,

  // helper functions
  ymd: function ymd(y, m, d) {
    if (this.dates > 0) {
      return false;
    }

    this.dates++;
    this.y = y;
    this.m = m;
    this.d = d;
    return true;
  },
  time: function time(h, i, s, f) {
    if (this.times > 0) {
      return false;
    }

    this.times++;
    this.h = h;
    this.i = i;
    this.s = s;
    this.f = f;

    return true;
  },
  resetTime: function resetTime() {
    this.h = 0;
    this.i = 0;
    this.s = 0;
    this.f = 0;
    this.times = 0;

    return true;
  },
  zone: function zone(minutes) {
    if (this.zones <= 1) {
      this.zones++;
      this.z = minutes;
      return true;
    }

    return false;
  },
  toDate: function toDate(relativeTo) {
    if (this.dates && !this.times) {
      this.h = this.i = this.s = this.f = 0;
    }

    // fill holes
    if (isNaN(this.y)) {
      this.y = relativeTo.getFullYear();
    }

    if (isNaN(this.m)) {
      this.m = relativeTo.getMonth();
    }

    if (isNaN(this.d)) {
      this.d = relativeTo.getDate();
    }

    if (isNaN(this.h)) {
      this.h = relativeTo.getHours();
    }

    if (isNaN(this.i)) {
      this.i = relativeTo.getMinutes();
    }

    if (isNaN(this.s)) {
      this.s = relativeTo.getSeconds();
    }

    if (isNaN(this.f)) {
      this.f = relativeTo.getMilliseconds();
    }

    // adjust special early
    switch (this.firstOrLastDayOfMonth) {
      case 1:
        this.d = 1;
        break;
      case -1:
        this.d = 0;
        this.m += 1;
        break;
    }

    if (!isNaN(this.weekday)) {
      var date = new Date(relativeTo.getTime());
      date.setFullYear(this.y, this.m, this.d);
      date.setHours(this.h, this.i, this.s, this.f);

      var dow = date.getDay();

      if (this.weekdayBehavior === 2) {
        // To make "this week" work, where the current day of week is a "sunday"
        if (dow === 0 && this.weekday !== 0) {
          this.weekday = -6;
        }

        // To make "sunday this week" work, where the current day of week is not a "sunday"
        if (this.weekday === 0 && dow !== 0) {
          this.weekday = 7;
        }

        this.d -= dow;
        this.d += this.weekday;
      } else {
        var diff = this.weekday - dow;

        // some PHP magic
        if (this.rd < 0 && diff < 0 || this.rd >= 0 && diff <= -this.weekdayBehavior) {
          diff += 7;
        }

        if (this.weekday >= 0) {
          this.d += diff;
        } else {
          this.d -= 7 - (Math.abs(this.weekday) - dow);
        }

        this.weekday = NaN;
      }
    }

    // adjust relative
    this.y += this.ry;
    this.m += this.rm;
    this.d += this.rd;

    this.h += this.rh;
    this.i += this.ri;
    this.s += this.rs;
    this.f += this.rf;

    this.ry = this.rm = this.rd = 0;
    this.rh = this.ri = this.rs = this.rf = 0;

    var result = new Date(relativeTo.getTime());
    // since Date constructor treats years <= 99 as 1900+
    // it can't be used, thus this weird way
    result.setFullYear(this.y, this.m, this.d);
    result.setHours(this.h, this.i, this.s, this.f);

    // note: this is done twice in PHP
    // early when processing special relatives
    // and late
    // todo: check if the logic can be reduced
    // to just one time action
    switch (this.firstOrLastDayOfMonth) {
      case 1:
        result.setDate(1);
        break;
      case -1:
        result.setMonth(result.getMonth() + 1, 0);
        break;
    }

    // adjust timezone
    if (!isNaN(this.z) && result.getTimezoneOffset() !== this.z) {
      result.setUTCFullYear(result.getFullYear(), result.getMonth(), result.getDate());

      result.setUTCHours(result.getHours(), result.getMinutes(), result.getSeconds() - this.z, result.getMilliseconds());
    }

    return result;
  }
};

module.exports = function strtotime(str, now) {
  //       discuss at: https://locutus.io/php/strtotime/
  //      original by: Caio Ariede (https://caioariede.com)
  //      improved by: Kevin van Zonneveld (https://kvz.io)
  //      improved by: Caio Ariede (https://caioariede.com)
  //      improved by: A. Matías Quezada (https://amatiasq.com)
  //      improved by: preuter
  //      improved by: Brett Zamir (https://brett-zamir.me)
  //      improved by: Mirko Faber
  //         input by: David
  //      bugfixed by: Wagner B. Soares
  //      bugfixed by: Artur Tchernychev
  //      bugfixed by: Stephan Bösch-Plepelits (https://github.com/plepe)
  // reimplemented by: Rafał Kukawski
  //           note 1: Examples all have a fixed timestamp to prevent
  //           note 1: tests to fail because of variable time(zones)
  //        example 1: strtotime('+1 day', 1129633200)
  //        returns 1: 1129719600
  //        example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200)
  //        returns 2: 1130425202
  //        example 3: strtotime('last month', 1129633200)
  //        returns 3: 1127041200
  //        example 4: strtotime('2009-05-04 08:30:00+00')
  //        returns 4: 1241425800
  //        example 5: strtotime('2009-05-04 08:30:00+02:00')
  //        returns 5: 1241418600
  //        example 6: strtotime('2009-05-04 08:30:00 YWT')
  //        returns 6: 1241454600

  if (now == null) {
    now = Math.floor(Date.now() / 1000);
  }

  // the rule order is important
  // if multiple rules match, the longest match wins
  // if multiple rules match the same string, the first match wins
  var rules = [formats.yesterday, formats.now, formats.noon, formats.midnightOrToday, formats.tomorrow, formats.timestamp, formats.firstOrLastDay, formats.backOrFrontOf,
  // formats.weekdayOf, // not yet implemented
  formats.timeTiny12, formats.timeShort12, formats.timeLong12, formats.mssqltime, formats.timeShort24, formats.timeLong24, formats.iso8601long, formats.gnuNoColon, formats.iso8601noColon, formats.americanShort, formats.american, formats.iso8601date4, formats.iso8601dateSlash, formats.dateSlash, formats.gnuDateShortOrIso8601date2, formats.gnuDateShorter, formats.dateFull, formats.pointedDate4, formats.pointedDate2, formats.dateNoDay, formats.dateNoDayRev, formats.dateTextual, formats.dateNoYear, formats.dateNoYearRev, formats.dateNoColon, formats.xmlRpc, formats.xmlRpcNoColon, formats.soap, formats.wddx, formats.exif, formats.pgydotd, formats.isoWeekDay, formats.pgTextShort, formats.pgTextReverse, formats.clf, formats.year4, formats.ago, formats.dayText, formats.relativeTextWeek, formats.relativeText, formats.monthFullOrMonthAbbr, formats.tzCorrection, formats.tzAbbr, formats.dateShortWithTimeShort12, formats.dateShortWithTimeLong12, formats.dateShortWithTimeShort, formats.dateShortWithTimeLong, formats.relative, formats.whitespace];

  var result = Object.create(resultProto);

  while (str.length) {
    var longestMatch = null;
    var finalRule = null;

    for (var i = 0, l = rules.length; i < l; i++) {
      var format = rules[i];

      var match = str.match(format.regex);

      if (match) {
        if (!longestMatch || match[0].length > longestMatch[0].length) {
          longestMatch = match;
          finalRule = format;
        }
      }
    }

    if (!finalRule || finalRule.callback && finalRule.callback.apply(result, longestMatch) === false) {
      return false;
    }

    str = str.substr(longestMatch[0].length);
    finalRule = null;
    longestMatch = null;
  }

  return Math.floor(result.toDate(new Date(now * 1000)) / 1000);
};
//# sourceMappingURL=strtotime.js.map

/***/ }),

/***/ "./node_modules/locutus/php/info/ini_get.js":
/*!**************************************************!*\
  !*** ./node_modules/locutus/php/info/ini_get.js ***!
  \**************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {



module.exports = function ini_get(varname) {
  // eslint-disable-line camelcase
  //  discuss at: https://locutus.io/php/ini_get/
  // original by: Brett Zamir (https://brett-zamir.me)
  //      note 1: The ini values must be set by ini_set or manually within an ini file
  //   example 1: ini_set('date.timezone', 'Asia/Hong_Kong')
  //   example 1: ini_get('date.timezone')
  //   returns 1: 'Asia/Hong_Kong'

  var $global = typeof window !== 'undefined' ? window : __webpack_require__.g;
  $global.$locutus = $global.$locutus || {};
  var $locutus = $global.$locutus;
  $locutus.php = $locutus.php || {};
  $locutus.php.ini = $locutus.php.ini || {};

  if ($locutus.php.ini[varname] && $locutus.php.ini[varname].local_value !== undefined) {
    if ($locutus.php.ini[varname].local_value === null) {
      return '';
    }
    return $locutus.php.ini[varname].local_value;
  }

  return '';
};
//# sourceMappingURL=ini_get.js.map

/***/ }),

/***/ "./node_modules/locutus/php/strings/strlen.js":
/*!****************************************************!*\
  !*** ./node_modules/locutus/php/strings/strlen.js ***!
  \****************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {



module.exports = function strlen(string) {
  //  discuss at: https://locutus.io/php/strlen/
  // original by: Kevin van Zonneveld (https://kvz.io)
  // improved by: Sakimori
  // improved by: Kevin van Zonneveld (https://kvz.io)
  //    input by: Kirk Strobeck
  // bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
  //  revised by: Brett Zamir (https://brett-zamir.me)
  //      note 1: May look like overkill, but in order to be truly faithful to handling all Unicode
  //      note 1: characters and to this function in PHP which does not count the number of bytes
  //      note 1: but counts the number of characters, something like this is really necessary.
  //   example 1: strlen('Kevin van Zonneveld')
  //   returns 1: 19
  //   example 2: ini_set('unicode.semantics', 'on')
  //   example 2: strlen('A\ud87e\udc04Z')
  //   returns 2: 3

  var str = string + '';

  var iniVal = ( true ? __webpack_require__(/*! ../info/ini_get */ "./node_modules/locutus/php/info/ini_get.js")('unicode.semantics') : 0) || 'off';
  if (iniVal === 'off') {
    return str.length;
  }

  var i = 0;
  var lgth = 0;

  var getWholeChar = function getWholeChar(str, i) {
    var code = str.charCodeAt(i);
    var next = '';
    var prev = '';
    if (code >= 0xD800 && code <= 0xDBFF) {
      // High surrogate (could change last hex to 0xDB7F to
      // treat high private surrogates as single characters)
      if (str.length <= i + 1) {
        throw new Error('High surrogate without following low surrogate');
      }
      next = str.charCodeAt(i + 1);
      if (next < 0xDC00 || next > 0xDFFF) {
        throw new Error('High surrogate without following low surrogate');
      }
      return str.charAt(i) + str.charAt(i + 1);
    } else if (code >= 0xDC00 && code <= 0xDFFF) {
      // Low surrogate
      if (i === 0) {
        throw new Error('Low surrogate without preceding high surrogate');
      }
      prev = str.charCodeAt(i - 1);
      if (prev < 0xD800 || prev > 0xDBFF) {
        // (could change last hex to 0xDB7F to treat high private surrogates
        // as single characters)
        throw new Error('Low surrogate without preceding high surrogate');
      }
      // We can pass over low surrogates now as the second
      // component in a pair which we have already processed
      return false;
    }
    return str.charAt(i);
  };

  for (i = 0, lgth = 0; i < str.length; i++) {
    if (getWholeChar(str, i) === false) {
      continue;
    }
    // Adapt this line at the top of any loop, passing in the whole string and
    // the current iteration and returning a variable to represent the individual character;
    // purpose is to treat the first part of a surrogate pair as the whole character and then
    // ignore the second part
    lgth++;
  }

  return lgth;
};
//# sourceMappingURL=strlen.js.map

/***/ }),

/***/ "./node_modules/locutus/php/var/is_numeric.js":
/*!****************************************************!*\
  !*** ./node_modules/locutus/php/var/is_numeric.js ***!
  \****************************************************/
/***/ (function(module) {



module.exports = function is_numeric(mixedVar) {
  // eslint-disable-line camelcase
  //  discuss at: https://locutus.io/php/is_numeric/
  // original by: Kevin van Zonneveld (https://kvz.io)
  // improved by: David
  // improved by: taith
  // bugfixed by: Tim de Koning
  // bugfixed by: WebDevHobo (https://webdevhobo.blogspot.com/)
  // bugfixed by: Brett Zamir (https://brett-zamir.me)
  // bugfixed by: Denis Chenu (https://shnoulle.net)
  //   example 1: is_numeric(186.31)
  //   returns 1: true
  //   example 2: is_numeric('Kevin van Zonneveld')
  //   returns 2: false
  //   example 3: is_numeric(' +186.31e2')
  //   returns 3: true
  //   example 4: is_numeric('')
  //   returns 4: false
  //   example 5: is_numeric([])
  //   returns 5: false
  //   example 6: is_numeric('1 ')
  //   returns 6: false

  var whitespace = [' ', '\n', '\r', '\t', '\f', '\x0b', '\xa0', '\u2000', '\u2001', '\u2002', '\u2003', '\u2004', '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', '\u200A', '\u200B', '\u2028', '\u2029', '\u3000'].join('');

  // @todo: Break this up using many single conditions with early returns
  return (typeof mixedVar === 'number' || typeof mixedVar === 'string' && whitespace.indexOf(mixedVar.slice(-1)) === -1) && mixedVar !== '' && !isNaN(mixedVar);
};
//# sourceMappingURL=is_numeric.js.map

/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/compat get default export */
/******/ 	!function() {
/******/ 		// getDefaultExport function for compatibility with non-harmony modules
/******/ 		__webpack_require__.n = function(module) {
/******/ 			var getter = module && module.__esModule ?
/******/ 				function() { return module['default']; } :
/******/ 				function() { return module; };
/******/ 			__webpack_require__.d(getter, { a: getter });
/******/ 			return getter;
/******/ 		};
/******/ 	}();
/******/ 	
/******/ 	/* webpack/runtime/define property getters */
/******/ 	!function() {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = function(exports, definition) {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	}();
/******/ 	
/******/ 	/* webpack/runtime/global */
/******/ 	!function() {
/******/ 		__webpack_require__.g = (function() {
/******/ 			if (typeof globalThis === 'object') return globalThis;
/******/ 			try {
/******/ 				return this || new Function('return this')();
/******/ 			} catch (e) {
/******/ 				if (typeof window === 'object') return window;
/******/ 			}
/******/ 		})();
/******/ 	}();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	!function() {
/******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ 	}();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	!function() {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = function(exports) {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	}();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
!function() {
/*!****************************************!*\
  !*** ./resources/assets/js/helpers.js ***!
  \****************************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! locutus/php/strings/strlen */ "./node_modules/locutus/php/strings/strlen.js");
/* harmony import */ var locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! locutus/php/array/array_diff */ "./node_modules/locutus/php/array/array_diff.js");
/* harmony import */ var locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! locutus/php/datetime/strtotime */ "./node_modules/locutus/php/datetime/strtotime.js");
/* harmony import */ var locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! locutus/php/var/is_numeric */ "./node_modules/locutus/php/var/is_numeric.js");
/* harmony import */ var locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3__);
/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Helper functions used by validators
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */





$.extend(true, laravelValidation, {
  helpers: {
    /**
     * Numeric rules
     */
    numericRules: ['Integer', 'Numeric'],
    /**
     * Gets the file information from file input.
     *
     * @param fieldObj
     * @param index
     * @returns {{file: *, extension: string, size: number}}
     */
    fileinfo: function (fieldObj, index) {
      var FileName = fieldObj.value;
      index = typeof index !== 'undefined' ? index : 0;
      if (fieldObj.files !== null) {
        if (typeof fieldObj.files[index] !== 'undefined') {
          return {
            file: FileName,
            extension: FileName.substr(FileName.lastIndexOf('.') + 1),
            size: fieldObj.files[index].size / 1024,
            type: fieldObj.files[index].type
          };
        }
      }
      return false;
    },
    /**
     * Gets the selectors for th specified field names.
     *
     * @param names
     * @returns {string}
     */
    selector: function (names) {
      var selector = [];
      if (!this.isArray(names)) {
        names = [names];
      }
      for (var i = 0; i < names.length; i++) {
        selector.push("[name='" + names[i] + "']");
      }
      return selector.join();
    },
    /**
     * Check if element has numeric rules.
     *
     * @param element
     * @returns {boolean}
     */
    hasNumericRules: function (element) {
      return this.hasRules(element, this.numericRules);
    },
    /**
     * Check if element has passed rules.
     *
     * @param element
     * @param rules
     * @returns {boolean}
     */
    hasRules: function (element, rules) {
      var found = false;
      if (typeof rules === 'string') {
        rules = [rules];
      }
      var validator = $.data(element.form, "validator");
      var listRules = [];
      var cache = validator.arrayRulesCache;
      if (element.name in cache) {
        $.each(cache[element.name], function (index, arrayRule) {
          listRules.push(arrayRule);
        });
      }
      if (element.name in validator.settings.rules) {
        listRules.push(validator.settings.rules[element.name]);
      }
      $.each(listRules, function (index, objRules) {
        if ('laravelValidation' in objRules) {
          var _rules = objRules.laravelValidation;
          for (var i = 0; i < _rules.length; i++) {
            if ($.inArray(_rules[i][0], rules) !== -1) {
              found = true;
              return false;
            }
          }
        }
      });
      return found;
    },
    /**
     * Return the string length using PHP function.
     * http://php.net/manual/en/function.strlen.php
     * http://phpjs.org/functions/strlen/
     *
     * @param string
     */
    strlen: function (string) {
      return locutus_php_strings_strlen__WEBPACK_IMPORTED_MODULE_0___default()(string);
    },
    /**
     * Get the size of the object depending of his type.
     *
     * @param obj
     * @param element
     * @param value
     * @returns int
     */
    getSize: function getSize(obj, element, value) {
      if (this.hasNumericRules(element) && this.is_numeric(value)) {
        return parseFloat(value);
      } else if (this.isArray(value)) {
        return parseFloat(value.length);
      } else if (element.type === 'file') {
        return parseFloat(Math.floor(this.fileinfo(element).size));
      }
      return parseFloat(this.strlen(value));
    },
    /**
     * Return specified rule from element.
     *
     * @param rule
     * @param element
     * @returns object
     */
    getLaravelValidation: function (rule, element) {
      var found = undefined;
      $.each($.validator.staticRules(element), function (key, rules) {
        if (key === "laravelValidation") {
          $.each(rules, function (i, value) {
            if (value[0] === rule) {
              found = value;
            }
          });
        }
      });
      return found;
    },
    /**
     * Return he timestamp of value passed using format or default format in element.
     *
     * @param value
     * @param format
     * @returns {boolean|int}
     */
    parseTime: function (value, format) {
      var timeValue = false;
      var fmt = new DateFormatter();
      if (typeof value === 'number' && typeof format === 'undefined') {
        return value;
      }
      if (typeof format === 'object') {
        var dateRule = this.getLaravelValidation('DateFormat', format);
        if (dateRule !== undefined) {
          format = dateRule[1][0];
        } else {
          format = null;
        }
      }
      if (format == null) {
        timeValue = this.strtotime(value);
      } else {
        timeValue = fmt.parseDate(value, format);
        if (timeValue instanceof Date && fmt.formatDate(timeValue, format) === value) {
          timeValue = Math.round(timeValue.getTime() / 1000);
        } else {
          timeValue = false;
        }
      }
      return timeValue;
    },
    /**
     * Compare a given date against another using an operator.
     *
     * @param validator
     * @param value
     * @param element
     * @param params
     * @param operator
     * @return {boolean}
     */
    compareDates: function (validator, value, element, params, operator) {
      var timeCompare = this.parseTime(params);
      if (!timeCompare) {
        var target = this.dependentElement(validator, element, params);
        if (target === undefined) {
          return false;
        }
        timeCompare = this.parseTime(validator.elementValue(target), target);
      }
      var timeValue = this.parseTime(value, element);
      if (timeValue === false) {
        return false;
      }
      switch (operator) {
        case '<':
          return timeValue < timeCompare;
        case '<=':
          return timeValue <= timeCompare;
        case '==':
        case '===':
          return timeValue === timeCompare;
        case '>':
          return timeValue > timeCompare;
        case '>=':
          return timeValue >= timeCompare;
        default:
          throw new Error('Unsupported operator.');
      }
    },
    /**
     * This method allows you to intelligently guess the date by closely matching the specific format.
     *
     * @param value
     * @param format
     * @returns {Date}
     */
    guessDate: function (value, format) {
      var fmt = new DateFormatter();
      return fmt.guessDate(value, format);
    },
    /**
     * Returns Unix timestamp based on PHP function strototime.
     * http://php.net/manual/es/function.strtotime.php
     * http://phpjs.org/functions/strtotime/
     *
     * @param text
     * @param now
     * @returns {*}
     */
    strtotime: function (text, now) {
      return locutus_php_datetime_strtotime__WEBPACK_IMPORTED_MODULE_2___default()(text, now);
    },
    /**
     * Returns if value is numeric.
     * http://php.net/manual/es/var.is_numeric.php
     * http://phpjs.org/functions/is_numeric/
     *
     * @param mixed_var
     * @returns {*}
     */
    is_numeric: function (mixed_var) {
      return locutus_php_var_is_numeric__WEBPACK_IMPORTED_MODULE_3___default()(mixed_var);
    },
    /**
     * Check whether the argument is of type Array.
     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray#Polyfill
     *
     * @param arg
     * @returns {boolean}
     */
    isArray: function (arg) {
      return Object.prototype.toString.call(arg) === '[object Array]';
    },
    /**
     * Returns Array diff based on PHP function array_diff.
     * http://php.net/manual/es/function.array_diff.php
     * http://phpjs.org/functions/array_diff/
     *
     * @param arr1
     * @param arr2
     * @returns {*}
     */
    arrayDiff: function (arr1, arr2) {
      return locutus_php_array_array_diff__WEBPACK_IMPORTED_MODULE_1___default()(arr1, arr2);
    },
    /**
     * Check whether two arrays are equal to one another.
     *
     * @param arr1
     * @param arr2
     * @returns {*}
     */
    arrayEquals: function (arr1, arr2) {
      if (!this.isArray(arr1) || !this.isArray(arr2)) {
        return false;
      }
      if (arr1.length !== arr2.length) {
        return false;
      }
      return $.isEmptyObject(this.arrayDiff(arr1, arr2));
    },
    /**
     * Makes element dependant from other.
     *
     * @param validator
     * @param element
     * @param name
     * @returns {*}
     */
    dependentElement: function (validator, element, name) {
      var el = validator.findByName(name);
      if (el[0] !== undefined && validator.settings.onfocusout) {
        var event = 'blur';
        if (el[0].tagName === 'SELECT' || el[0].tagName === 'OPTION' || el[0].type === 'checkbox' || el[0].type === 'radio') {
          event = 'click';
        }
        var ruleName = '.validate-laravelValidation';
        el.off(ruleName).off(event + ruleName + '-' + element.name).on(event + ruleName + '-' + element.name, function () {
          $(element).valid();
        });
      }
      return el[0];
    },
    /**
     * Parses error Ajax response and gets the message.
     *
     * @param response
     * @returns {string[]}
     */
    parseErrorResponse: function (response) {
      var newResponse = ['Whoops, looks like something went wrong.'];
      if ('responseText' in response) {
        var errorMsg = response.responseText.match(/<h1\s*>(.*)<\/h1\s*>/i);
        if (this.isArray(errorMsg)) {
          newResponse = [errorMsg[1]];
        }
      }
      return newResponse;
    },
    /**
     * Escape string to use as Regular Expression.
     *
     * @param str
     * @returns string
     */
    escapeRegExp: function (str) {
      return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    },
    /**
     * Generate RegExp from wildcard attributes.
     *
     * @param name
     * @returns {RegExp}
     */
    regexFromWildcard: function (name) {
      var nameParts = name.split('[*]');
      if (nameParts.length === 1) nameParts.push('');
      return new RegExp('^' + nameParts.map(function (x) {
        return laravelValidation.helpers.escapeRegExp(x);
      }).join('\\[[^\\]]*\\]') + '$');
    },
    /**
     * Merge additional laravel validation rules into the current rule set.
     *
     * @param {object} rules
     * @param {object} newRules
     * @returns {object}
     */
    mergeRules: function (rules, newRules) {
      var rulesList = {
        'laravelValidation': newRules.laravelValidation || [],
        'laravelValidationRemote': newRules.laravelValidationRemote || []
      };
      for (var key in rulesList) {
        if (rulesList[key].length === 0) {
          continue;
        }
        if (typeof rules[key] === "undefined") {
          rules[key] = [];
        }
        rules[key] = rules[key].concat(rulesList[key]);
      }
      return rules;
    },
    /**
     * HTML entity encode a string.
     *
     * @param string
     * @returns {string}
     */
    encode: function (string) {
      return $('<div/>').text(string).html();
    },
    /**
     * Lookup name in an array.
     *
     * @param validator
     * @param {string} name Name in dot notation format.
     * @returns {*}
     */
    findByArrayName: function (validator, name) {
      var sqName = name.replace(/\.([^\.]+)/g, '[$1]'),
        lookups = [
        // Convert dot to square brackets. e.g. foo.bar.0 becomes foo[bar][0]
        sqName,
        // Append [] to the name e.g. foo becomes foo[] or foo.bar.0 becomes foo[bar][0][]
        sqName + '[]',
        // Remove key from last array e.g. foo[bar][0] becomes foo[bar][]
        sqName.replace(/(.*)\[(.*)\]$/g, '$1[]')];
      for (var i = 0; i < lookups.length; i++) {
        var elem = validator.findByName(lookups[i]);
        if (elem.length > 0) {
          return elem;
        }
      }
      return $(null);
    },
    /**
     * Attempt to find an element in the DOM matching the given name.
     * Example names include:
     *    - domain.0 which matches domain[]
     *    - customfield.3 which matches customfield[3]
     *
     * @param validator
     * @param {string} name
     * @returns {*}
     */
    findByName: function (validator, name) {
      // Exact match.
      var elem = validator.findByName(name);
      if (elem.length > 0) {
        return elem;
      }

      // Find name in data, using dot notation.
      var delim = '.',
        parts = name.split(delim);
      for (var i = parts.length; i > 0; i--) {
        var reconstructed = [];
        for (var c = 0; c < i; c++) {
          reconstructed.push(parts[c]);
        }
        elem = this.findByArrayName(validator, reconstructed.join(delim));
        if (elem.length > 0) {
          return elem;
        }
      }
      return $(null);
    },
    /**
     * If it's an array element, get all values.
     *
     * @param validator
     * @param element
     * @returns {*|string}
     */
    allElementValues: function (validator, element) {
      if (element.name.indexOf('[]') !== -1) {
        return validator.findByName(element.name).map(function (i, e) {
          return validator.elementValue(e);
        }).get();
      }
      return validator.elementValue(element);
    }
  }
});
}();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUNsQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixJQUFJO0FBQ3pCLHNCQUFzQixFQUFFO0FBQ3hCLHNCQUFzQixFQUFFO0FBQ3hCLG1DQUFtQyxFQUFFO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJO0FBQ2hEOztBQUVBO0FBQ0EsOEJBQThCLElBQUk7QUFDbEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3REFBd0QsSUFBSTtBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLElBQUk7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0lBQ1E2SCxnQkFBZ0IsRUFBRSxTQUFBQSxDQUFVaEcsU0FBUyxFQUFFSixPQUFPLEVBQUU7TUFDNUMsSUFBSUEsT0FBTyxDQUFDVSxJQUFJLENBQUMyRixPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDbkMsT0FBT2pHLFNBQVMsQ0FBQzBELFVBQVUsQ0FBQzlELE9BQU8sQ0FBQ1UsSUFBSSxDQUFDLENBQUN5RSxHQUFHLENBQUMsVUFBVXhGLENBQUMsRUFBRTJHLENBQUMsRUFBRTtVQUMxRCxPQUFPbEcsU0FBUyxDQUFDeUMsWUFBWSxDQUFDeUQsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDQyxHQUFHLENBQUMsQ0FBQztNQUNaO01BRUEsT0FBT25HLFNBQVMsQ0FBQ3lDLFlBQVksQ0FBQzdDLE9BQU8sQ0FBQztJQUMxQztFQUNKO0FBQ0osQ0FBQyxDQUFDLEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9jdXR1cy9waHAvYXJyYXkvYXJyYXlfZGlmZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9jdXR1cy9waHAvZGF0ZXRpbWUvc3RydG90aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2N1dHVzL3BocC9pbmZvL2luaV9nZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvY3V0dXMvcGhwL3N0cmluZ3Mvc3RybGVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2N1dHVzL3BocC92YXIvaXNfbnVtZXJpYy5qcyIsIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhcnJheV9kaWZmKGFycjEpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvYXJyYXlfZGlmZi9cbiAgLy8gb3JpZ2luYWwgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHBzOi8va3Z6LmlvKVxuICAvLyBpbXByb3ZlZCBieTogU2Fuam95IFJveVxuICAvLyAgcmV2aXNlZCBieTogQnJldHQgWmFtaXIgKGh0dHBzOi8vYnJldHQtemFtaXIubWUpXG4gIC8vICAgZXhhbXBsZSAxOiBhcnJheV9kaWZmKFsnS2V2aW4nLCAndmFuJywgJ1pvbm5ldmVsZCddLCBbJ3ZhbicsICdab25uZXZlbGQnXSlcbiAgLy8gICByZXR1cm5zIDE6IHswOidLZXZpbid9XG5cbiAgdmFyIHJldEFyciA9IHt9O1xuICB2YXIgYXJnbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBrMSA9ICcnO1xuICB2YXIgaSA9IDE7XG4gIHZhciBrID0gJyc7XG4gIHZhciBhcnIgPSB7fTtcblxuICBhcnIxa2V5czogZm9yIChrMSBpbiBhcnIxKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sYWJlbHNcbiAgICBmb3IgKGkgPSAxOyBpIDwgYXJnbDsgaSsrKSB7XG4gICAgICBhcnIgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKGsgaW4gYXJyKSB7XG4gICAgICAgIGlmIChhcnJba10gPT09IGFycjFbazFdKSB7XG4gICAgICAgICAgLy8gSWYgaXQgcmVhY2hlcyBoZXJlLCBpdCB3YXMgZm91bmQgaW4gYXQgbGVhc3Qgb25lIGFycmF5LCBzbyB0cnkgbmV4dCB2YWx1ZVxuICAgICAgICAgIGNvbnRpbnVlIGFycjFrZXlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxhYmVsc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXRBcnJbazFdID0gYXJyMVtrMV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldEFycjtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnJheV9kaWZmLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlU3BhY2UgPSAnWyBcXFxcdF0rJztcbnZhciByZVNwYWNlT3B0ID0gJ1sgXFxcXHRdKic7XG52YXIgcmVNZXJpZGlhbiA9ICcoPzooW2FwXSlcXFxcLj9tXFxcXC4/KFtcXFxcdCBdfCQpKSc7XG52YXIgcmVIb3VyMjQgPSAnKDJbMC00XXxbMDFdP1swLTldKSc7XG52YXIgcmVIb3VyMjRseiA9ICcoWzAxXVswLTldfDJbMC00XSknO1xudmFyIHJlSG91cjEyID0gJygwP1sxLTldfDFbMC0yXSknO1xudmFyIHJlTWludXRlID0gJyhbMC01XT9bMC05XSknO1xudmFyIHJlTWludXRlbHogPSAnKFswLTVdWzAtOV0pJztcbnZhciByZVNlY29uZCA9ICcoNjB8WzAtNV0/WzAtOV0pJztcbnZhciByZVNlY29uZGx6ID0gJyg2MHxbMC01XVswLTldKSc7XG52YXIgcmVGcmFjID0gJyg/OlxcXFwuKFswLTldKykpJztcblxudmFyIHJlRGF5ZnVsbCA9ICdzdW5kYXl8bW9uZGF5fHR1ZXNkYXl8d2VkbmVzZGF5fHRodXJzZGF5fGZyaWRheXxzYXR1cmRheSc7XG52YXIgcmVEYXlhYmJyID0gJ3N1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCc7XG52YXIgcmVEYXl0ZXh0ID0gcmVEYXlmdWxsICsgJ3wnICsgcmVEYXlhYmJyICsgJ3x3ZWVrZGF5cz8nO1xuXG52YXIgcmVSZWx0ZXh0bnVtYmVyID0gJ2ZpcnN0fHNlY29uZHx0aGlyZHxmb3VydGh8ZmlmdGh8c2l4dGh8c2V2ZW50aHxlaWdodGg/fG5pbnRofHRlbnRofGVsZXZlbnRofHR3ZWxmdGgnO1xudmFyIHJlUmVsdGV4dHRleHQgPSAnbmV4dHxsYXN0fHByZXZpb3VzfHRoaXMnO1xudmFyIHJlUmVsdGV4dHVuaXQgPSAnKD86c2Vjb25kfHNlY3xtaW51dGV8bWlufGhvdXJ8ZGF5fGZvcnRuaWdodHxmb3J0aG5pZ2h0fG1vbnRofHllYXIpcz98d2Vla3N8JyArIHJlRGF5dGV4dDtcblxudmFyIHJlWWVhciA9ICcoWzAtOV17MSw0fSknO1xudmFyIHJlWWVhcjIgPSAnKFswLTldezJ9KSc7XG52YXIgcmVZZWFyNCA9ICcoWzAtOV17NH0pJztcbnZhciByZVllYXI0d2l0aFNpZ24gPSAnKFsrLV0/WzAtOV17NH0pJztcbnZhciByZU1vbnRoID0gJygxWzAtMl18MD9bMC05XSknO1xudmFyIHJlTW9udGhseiA9ICcoMFswLTldfDFbMC0yXSknO1xudmFyIHJlRGF5ID0gJyg/OigzWzAxXXxbMC0yXT9bMC05XSkoPzpzdHxuZHxyZHx0aCk/KSc7XG52YXIgcmVEYXlseiA9ICcoMFswLTldfFsxLTJdWzAtOV18M1swMV0pJztcblxudmFyIHJlTW9udGhGdWxsID0gJ2phbnVhcnl8ZmVicnVhcnl8bWFyY2h8YXByaWx8bWF5fGp1bmV8anVseXxhdWd1c3R8c2VwdGVtYmVyfG9jdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXInO1xudmFyIHJlTW9udGhBYmJyID0gJ2phbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwdD98b2N0fG5vdnxkZWMnO1xudmFyIHJlTW9udGhyb21hbiA9ICdpW3Z4XXx2aXswLDN9fHhpezAsMn18aXsxLDN9JztcbnZhciByZU1vbnRoVGV4dCA9ICcoJyArIHJlTW9udGhGdWxsICsgJ3wnICsgcmVNb250aEFiYnIgKyAnfCcgKyByZU1vbnRocm9tYW4gKyAnKSc7XG5cbnZhciByZVR6Q29ycmVjdGlvbiA9ICcoKD86R01UKT8oWystXSknICsgcmVIb3VyMjQgKyAnOj8nICsgcmVNaW51dGUgKyAnPyknO1xudmFyIHJlVHpBYmJyID0gJ1xcXFwoPyhbYS16QS1aXXsxLDZ9KVxcXFwpPyc7XG52YXIgcmVEYXlPZlllYXIgPSAnKDAwWzEtOV18MFsxLTldWzAtOV18WzEyXVswLTldWzAtOV18M1swLTVdWzAtOV18MzZbMC02XSknO1xudmFyIHJlV2Vla09mWWVhciA9ICcoMFsxLTldfFsxLTRdWzAtOV18NVswLTNdKSc7XG5cbnZhciByZURhdGVOb1llYXIgPSByZU1vbnRoVGV4dCArICdbIC5cXFxcdC1dKicgKyByZURheSArICdbLC5zdG5kcmhcXFxcdCBdKic7XG5cbmZ1bmN0aW9uIHByb2Nlc3NNZXJpZGlhbihob3VyLCBtZXJpZGlhbikge1xuICBtZXJpZGlhbiA9IG1lcmlkaWFuICYmIG1lcmlkaWFuLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoIChtZXJpZGlhbikge1xuICAgIGNhc2UgJ2EnOlxuICAgICAgaG91ciArPSBob3VyID09PSAxMiA/IC0xMiA6IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwJzpcbiAgICAgIGhvdXIgKz0gaG91ciAhPT0gMTIgPyAxMiA6IDA7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBob3VyO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzWWVhcih5ZWFyU3RyKSB7XG4gIHZhciB5ZWFyID0gK3llYXJTdHI7XG5cbiAgaWYgKHllYXJTdHIubGVuZ3RoIDwgNCAmJiB5ZWFyIDwgMTAwKSB7XG4gICAgeWVhciArPSB5ZWFyIDwgNzAgPyAyMDAwIDogMTkwMDtcbiAgfVxuXG4gIHJldHVybiB5ZWFyO1xufVxuXG5mdW5jdGlvbiBsb29rdXBNb250aChtb250aFN0cikge1xuICByZXR1cm4ge1xuICAgIGphbjogMCxcbiAgICBqYW51YXJ5OiAwLFxuICAgIGk6IDAsXG4gICAgZmViOiAxLFxuICAgIGZlYnJ1YXJ5OiAxLFxuICAgIGlpOiAxLFxuICAgIG1hcjogMixcbiAgICBtYXJjaDogMixcbiAgICBpaWk6IDIsXG4gICAgYXByOiAzLFxuICAgIGFwcmlsOiAzLFxuICAgIGl2OiAzLFxuICAgIG1heTogNCxcbiAgICB2OiA0LFxuICAgIGp1bjogNSxcbiAgICBqdW5lOiA1LFxuICAgIHZpOiA1LFxuICAgIGp1bDogNixcbiAgICBqdWx5OiA2LFxuICAgIHZpaTogNixcbiAgICBhdWc6IDcsXG4gICAgYXVndXN0OiA3LFxuICAgIHZpaWk6IDcsXG4gICAgc2VwOiA4LFxuICAgIHNlcHQ6IDgsXG4gICAgc2VwdGVtYmVyOiA4LFxuICAgIGl4OiA4LFxuICAgIG9jdDogOSxcbiAgICBvY3RvYmVyOiA5LFxuICAgIHg6IDksXG4gICAgbm92OiAxMCxcbiAgICBub3ZlbWJlcjogMTAsXG4gICAgeGk6IDEwLFxuICAgIGRlYzogMTEsXG4gICAgZGVjZW1iZXI6IDExLFxuICAgIHhpaTogMTFcbiAgfVttb250aFN0ci50b0xvd2VyQ2FzZSgpXTtcbn1cblxuZnVuY3Rpb24gbG9va3VwV2Vla2RheShkYXlTdHIpIHtcbiAgdmFyIGRlc2lyZWRTdW5kYXlOdW1iZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDA7XG5cbiAgdmFyIGRheU51bWJlcnMgPSB7XG4gICAgbW9uOiAxLFxuICAgIG1vbmRheTogMSxcbiAgICB0dWU6IDIsXG4gICAgdHVlc2RheTogMixcbiAgICB3ZWQ6IDMsXG4gICAgd2VkbmVzZGF5OiAzLFxuICAgIHRodTogNCxcbiAgICB0aHVyc2RheTogNCxcbiAgICBmcmk6IDUsXG4gICAgZnJpZGF5OiA1LFxuICAgIHNhdDogNixcbiAgICBzYXR1cmRheTogNixcbiAgICBzdW46IDAsXG4gICAgc3VuZGF5OiAwXG4gIH07XG5cbiAgcmV0dXJuIGRheU51bWJlcnNbZGF5U3RyLnRvTG93ZXJDYXNlKCldIHx8IGRlc2lyZWRTdW5kYXlOdW1iZXI7XG59XG5cbmZ1bmN0aW9uIGxvb2t1cFJlbGF0aXZlKHJlbFRleHQpIHtcbiAgdmFyIHJlbGF0aXZlTnVtYmVycyA9IHtcbiAgICBsYXN0OiAtMSxcbiAgICBwcmV2aW91czogLTEsXG4gICAgdGhpczogMCxcbiAgICBmaXJzdDogMSxcbiAgICBuZXh0OiAxLFxuICAgIHNlY29uZDogMixcbiAgICB0aGlyZDogMyxcbiAgICBmb3VydGg6IDQsXG4gICAgZmlmdGg6IDUsXG4gICAgc2l4dGg6IDYsXG4gICAgc2V2ZW50aDogNyxcbiAgICBlaWdodDogOCxcbiAgICBlaWdodGg6IDgsXG4gICAgbmludGg6IDksXG4gICAgdGVudGg6IDEwLFxuICAgIGVsZXZlbnRoOiAxMSxcbiAgICB0d2VsZnRoOiAxMlxuICB9O1xuXG4gIHZhciByZWxhdGl2ZUJlaGF2aW9yID0ge1xuICAgIHRoaXM6IDFcbiAgfTtcblxuICB2YXIgcmVsVGV4dExvd2VyID0gcmVsVGV4dC50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiB7XG4gICAgYW1vdW50OiByZWxhdGl2ZU51bWJlcnNbcmVsVGV4dExvd2VyXSxcbiAgICBiZWhhdmlvcjogcmVsYXRpdmVCZWhhdmlvcltyZWxUZXh0TG93ZXJdIHx8IDBcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1R6Q29ycmVjdGlvbih0ek9mZnNldCwgb2xkVmFsdWUpIHtcbiAgdmFyIHJlVHpDb3JyZWN0aW9uTG9vc2UgPSAvKD86R01UKT8oWystXSkoXFxkKykoOj8pKFxcZHswLDJ9KS9pO1xuICB0ek9mZnNldCA9IHR6T2Zmc2V0ICYmIHR6T2Zmc2V0Lm1hdGNoKHJlVHpDb3JyZWN0aW9uTG9vc2UpO1xuXG4gIGlmICghdHpPZmZzZXQpIHtcbiAgICByZXR1cm4gb2xkVmFsdWU7XG4gIH1cblxuICB2YXIgc2lnbiA9IHR6T2Zmc2V0WzFdID09PSAnLScgPyAtMSA6IDE7XG4gIHZhciBob3VycyA9ICt0ek9mZnNldFsyXTtcbiAgdmFyIG1pbnV0ZXMgPSArdHpPZmZzZXRbNF07XG5cbiAgaWYgKCF0ek9mZnNldFs0XSAmJiAhdHpPZmZzZXRbM10pIHtcbiAgICBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAlIDEwMCk7XG4gICAgaG91cnMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMTAwKTtcbiAgfVxuXG4gIC8vIHRpbWV6b25lIG9mZnNldCBpbiBzZWNvbmRzXG4gIHJldHVybiBzaWduICogKGhvdXJzICogNjAgKyBtaW51dGVzKSAqIDYwO1xufVxuXG4vLyB0eiBhYmJyZXZhdGlvbiA6IHR6IG9mZnNldCBpbiBzZWNvbmRzXG52YXIgdHpBYmJyT2Zmc2V0cyA9IHtcbiAgYWNkdDogMzc4MDAsXG4gIGFjc3Q6IDM0MjAwLFxuICBhZGR0OiAtNzIwMCxcbiAgYWR0OiAtMTA4MDAsXG4gIGFlZHQ6IDM5NjAwLFxuICBhZXN0OiAzNjAwMCxcbiAgYWhkdDogLTMyNDAwLFxuICBhaHN0OiAtMzYwMDAsXG4gIGFrZHQ6IC0yODgwMCxcbiAgYWtzdDogLTMyNDAwLFxuICBhbXQ6IC0xMzg0MCxcbiAgYXB0OiAtMTA4MDAsXG4gIGFzdDogLTE0NDAwLFxuICBhd2R0OiAzMjQwMCxcbiAgYXdzdDogMjg4MDAsXG4gIGF3dDogLTEwODAwLFxuICBiZHN0OiA3MjAwLFxuICBiZHQ6IC0zNjAwMCxcbiAgYm10OiAtMTQzMDksXG4gIGJzdDogMzYwMCxcbiAgY2FzdDogMzQyMDAsXG4gIGNhdDogNzIwMCxcbiAgY2RkdDogLTE0NDAwLFxuICBjZHQ6IC0xODAwMCxcbiAgY2VtdDogMTA4MDAsXG4gIGNlc3Q6IDcyMDAsXG4gIGNldDogMzYwMCxcbiAgY210OiAtMTU0MDgsXG4gIGNwdDogLTE4MDAwLFxuICBjc3Q6IC0yMTYwMCxcbiAgY3d0OiAtMTgwMDAsXG4gIGNoc3Q6IDM2MDAwLFxuICBkbXQ6IC0xNTIxLFxuICBlYXQ6IDEwODAwLFxuICBlZGR0OiAtMTA4MDAsXG4gIGVkdDogLTE0NDAwLFxuICBlZXN0OiAxMDgwMCxcbiAgZWV0OiA3MjAwLFxuICBlbXQ6IC0yNjI0OCxcbiAgZXB0OiAtMTQ0MDAsXG4gIGVzdDogLTE4MDAwLFxuICBld3Q6IC0xNDQwMCxcbiAgZmZtdDogLTE0NjYwLFxuICBmbXQ6IC00MDU2LFxuICBnZHQ6IDM5NjAwLFxuICBnbXQ6IDAsXG4gIGdzdDogMzYwMDAsXG4gIGhkdDogLTM0MjAwLFxuICBoa3N0OiAzMjQwMCxcbiAgaGt0OiAyODgwMCxcbiAgaG10OiAtMTk3NzYsXG4gIGhwdDogLTM0MjAwLFxuICBoc3Q6IC0zNjAwMCxcbiAgaHd0OiAtMzQyMDAsXG4gIGlkZHQ6IDE0NDAwLFxuICBpZHQ6IDEwODAwLFxuICBpbXQ6IDI1MDI1LFxuICBpc3Q6IDcyMDAsXG4gIGpkdDogMzYwMDAsXG4gIGptdDogODQ0MCxcbiAganN0OiAzMjQwMCxcbiAga2R0OiAzNjAwMCxcbiAga210OiA1NzM2LFxuICBrc3Q6IDMwNjAwLFxuICBsc3Q6IDkzOTQsXG4gIG1kZHQ6IC0xODAwMCxcbiAgbWRzdDogMTYyNzksXG4gIG1kdDogLTIxNjAwLFxuICBtZXN0OiA3MjAwLFxuICBtZXQ6IDM2MDAsXG4gIG1tdDogOTAxNyxcbiAgbXB0OiAtMjE2MDAsXG4gIG1zZDogMTQ0MDAsXG4gIG1zazogMTA4MDAsXG4gIG1zdDogLTI1MjAwLFxuICBtd3Q6IC0yMTYwMCxcbiAgbmRkdDogLTU0MDAsXG4gIG5kdDogLTkwNTIsXG4gIG5wdDogLTkwMDAsXG4gIG5zdDogLTEyNjAwLFxuICBud3Q6IC05MDAwLFxuICBuemR0OiA0NjgwMCxcbiAgbnptdDogNDE0MDAsXG4gIG56c3Q6IDQzMjAwLFxuICBwZGR0OiAtMjE2MDAsXG4gIHBkdDogLTI1MjAwLFxuICBwa3N0OiAyMTYwMCxcbiAgcGt0OiAxODAwMCxcbiAgcGxtdDogMjU1OTAsXG4gIHBtdDogLTEzMjM2LFxuICBwcG10OiAtMTczNDAsXG4gIHBwdDogLTI1MjAwLFxuICBwc3Q6IC0yODgwMCxcbiAgcHd0OiAtMjUyMDAsXG4gIHFtdDogLTE4ODQwLFxuICBybXQ6IDU3OTQsXG4gIHNhc3Q6IDcyMDAsXG4gIHNkbXQ6IC0xNjgwMCxcbiAgc2ptdDogLTIwMTczLFxuICBzbXQ6IC0xMzg4NCxcbiAgc3N0OiAtMzk2MDAsXG4gIHRibXQ6IDEwNzUxLFxuICB0bXQ6IDEyMzQ0LFxuICB1Y3Q6IDAsXG4gIHV0YzogMCxcbiAgd2FzdDogNzIwMCxcbiAgd2F0OiAzNjAwLFxuICB3ZW10OiA3MjAwLFxuICB3ZXN0OiAzNjAwLFxuICB3ZXQ6IDAsXG4gIHdpYjogMjUyMDAsXG4gIHdpdGE6IDI4ODAwLFxuICB3aXQ6IDMyNDAwLFxuICB3bXQ6IDUwNDAsXG4gIHlkZHQ6IC0yNTIwMCxcbiAgeWR0OiAtMjg4MDAsXG4gIHlwdDogLTI4ODAwLFxuICB5c3Q6IC0zMjQwMCxcbiAgeXd0OiAtMjg4MDAsXG4gIGE6IDM2MDAsXG4gIGI6IDcyMDAsXG4gIGM6IDEwODAwLFxuICBkOiAxNDQwMCxcbiAgZTogMTgwMDAsXG4gIGY6IDIxNjAwLFxuICBnOiAyNTIwMCxcbiAgaDogMjg4MDAsXG4gIGk6IDMyNDAwLFxuICBrOiAzNjAwMCxcbiAgbDogMzk2MDAsXG4gIG06IDQzMjAwLFxuICBuOiAtMzYwMCxcbiAgbzogLTcyMDAsXG4gIHA6IC0xMDgwMCxcbiAgcTogLTE0NDAwLFxuICByOiAtMTgwMDAsXG4gIHM6IC0yMTYwMCxcbiAgdDogLTI1MjAwLFxuICB1OiAtMjg4MDAsXG4gIHY6IC0zMjQwMCxcbiAgdzogLTM2MDAwLFxuICB4OiAtMzk2MDAsXG4gIHk6IC00MzIwMCxcbiAgejogMFxufTtcblxudmFyIGZvcm1hdHMgPSB7XG4gIHllc3RlcmRheToge1xuICAgIHJlZ2V4OiAvXnllc3RlcmRheS9pLFxuICAgIG5hbWU6ICd5ZXN0ZXJkYXknLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucmQgLT0gMTtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpO1xuICAgIH1cbiAgfSxcblxuICBub3c6IHtcbiAgICByZWdleDogL15ub3cvaSxcbiAgICBuYW1lOiAnbm93J1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfSxcblxuICBub29uOiB7XG4gICAgcmVnZXg6IC9ebm9vbi9pLFxuICAgIG5hbWU6ICdub29uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKSAmJiB0aGlzLnRpbWUoMTIsIDAsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICBtaWRuaWdodE9yVG9kYXk6IHtcbiAgICByZWdleDogL14obWlkbmlnaHR8dG9kYXkpL2ksXG4gICAgbmFtZTogJ21pZG5pZ2h0IHwgdG9kYXknLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpO1xuICAgIH1cbiAgfSxcblxuICB0b21vcnJvdzoge1xuICAgIHJlZ2V4OiAvXnRvbW9ycm93L2ksXG4gICAgbmFtZTogJ3RvbW9ycm93JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB0aGlzLnJkICs9IDE7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZXN0YW1wOiB7XG4gICAgcmVnZXg6IC9eQCgtP1xcZCspL2ksXG4gICAgbmFtZTogJ3RpbWVzdGFtcCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB0aW1lc3RhbXApIHtcbiAgICAgIHRoaXMucnMgKz0gK3RpbWVzdGFtcDtcbiAgICAgIHRoaXMueSA9IDE5NzA7XG4gICAgICB0aGlzLm0gPSAwO1xuICAgICAgdGhpcy5kID0gMTtcbiAgICAgIHRoaXMuZGF0ZXMgPSAwO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZXNldFRpbWUoKSAmJiB0aGlzLnpvbmUoMCk7XG4gICAgfVxuICB9LFxuXG4gIGZpcnN0T3JMYXN0RGF5OiB7XG4gICAgcmVnZXg6IC9eKGZpcnN0fGxhc3QpIGRheSBvZi9pLFxuICAgIG5hbWU6ICdmaXJzdGRheW9mIHwgbGFzdGRheW9mJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGRheSkge1xuICAgICAgaWYgKGRheS50b0xvd2VyQ2FzZSgpID09PSAnZmlyc3QnKSB7XG4gICAgICAgIHRoaXMuZmlyc3RPckxhc3REYXlPZk1vbnRoID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlyc3RPckxhc3REYXlPZk1vbnRoID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGJhY2tPckZyb250T2Y6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKGJhY2t8ZnJvbnQpIG9mICcgKyByZUhvdXIyNCArIHJlU3BhY2VPcHQgKyByZU1lcmlkaWFuICsgJz8nLCAnaScpLFxuICAgIG5hbWU6ICdiYWNrb2YgfCBmcm9udG9mJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHNpZGUsIGhvdXJzLCBtZXJpZGlhbikge1xuICAgICAgdmFyIGJhY2sgPSBzaWRlLnRvTG93ZXJDYXNlKCkgPT09ICdiYWNrJztcbiAgICAgIHZhciBob3VyID0gK2hvdXJzO1xuICAgICAgdmFyIG1pbnV0ZSA9IDE1O1xuXG4gICAgICBpZiAoIWJhY2spIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgPSA0NTtcbiAgICAgIH1cblxuICAgICAgaG91ciA9IHByb2Nlc3NNZXJpZGlhbihob3VyLCBtZXJpZGlhbik7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc2V0VGltZSgpICYmIHRoaXMudGltZShob3VyLCBtaW51dGUsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICB3ZWVrZGF5T2Y6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHRudW1iZXIgKyAnfCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICcoJyArIHJlRGF5ZnVsbCArICd8JyArIHJlRGF5YWJiciArICcpJyArIHJlU3BhY2UgKyAnb2YnLCAnaScpLFxuICAgIG5hbWU6ICd3ZWVrZGF5b2YnXG4gICAgLy8gdG9kb1xuICB9LFxuXG4gIG1zc3FsdGltZToge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnOicgKyByZU1pbnV0ZWx6ICsgJzonICsgcmVTZWNvbmRseiArICdbOi5dKFswLTldKyknICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAnbXNzcWx0aW1lJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjLCBtZXJpZGlhbikge1xuICAgICAgcmV0dXJuIHRoaXMudGltZShwcm9jZXNzTWVyaWRpYW4oK2hvdXIsIG1lcmlkaWFuKSwgK21pbnV0ZSwgK3NlY29uZCwgK2ZyYWMuc3Vic3RyKDAsIDMpKTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZUxvbmcxMjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kbHogKyByZVNwYWNlT3B0ICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAndGltZWxvbmcxMicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICB0aW1lU2hvcnQxMjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVIb3VyMTIgKyAnWzouXScgKyByZU1pbnV0ZWx6ICsgcmVTcGFjZU9wdCArIHJlTWVyaWRpYW4sICdpJyksXG4gICAgbmFtZTogJ3RpbWVzaG9ydDEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1pbnV0ZSwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsIDAsIDApO1xuICAgIH1cbiAgfSxcblxuICB0aW1lVGlueTEyOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZUhvdXIxMiArIHJlU3BhY2VPcHQgKyByZU1lcmlkaWFuLCAnaScpLFxuICAgIG5hbWU6ICd0aW1ldGlueTEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGhvdXIsIG1lcmlkaWFuKSB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lKHByb2Nlc3NNZXJpZGlhbigraG91ciwgbWVyaWRpYW4pLCAwLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgc29hcDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICctJyArIHJlTW9udGhseiArICctJyArIHJlRGF5bHogKyAnVCcgKyByZUhvdXIyNGx6ICsgJzonICsgcmVNaW51dGVseiArICc6JyArIHJlU2Vjb25kbHogKyByZUZyYWMgKyByZVR6Q29ycmVjdGlvbiArICc/JywgJ2knKSxcbiAgICBuYW1lOiAnc29hcCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgZnJhYywgdHpDb3JyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCArZnJhYy5zdWJzdHIoMCwgMykpICYmIHRoaXMuem9uZShwcm9jZXNzVHpDb3JyZWN0aW9uKHR6Q29ycmVjdGlvbikpO1xuICAgIH1cbiAgfSxcblxuICB3ZGR4OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgJy0nICsgcmVNb250aCArICctJyArIHJlRGF5ICsgJ1QnICsgcmVIb3VyMjQgKyAnOicgKyByZU1pbnV0ZSArICc6JyArIHJlU2Vjb25kKSxcbiAgICBuYW1lOiAnd2RkeCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBtb250aCAtIDEsICtkYXkpICYmIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGV4aWY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnOicgKyByZU1vbnRobHogKyAnOicgKyByZURheWx6ICsgJyAnICsgcmVIb3VyMjRseiArICc6JyArIHJlTWludXRlbHogKyAnOicgKyByZVNlY29uZGx6LCAnaScpLFxuICAgIG5hbWU6ICdleGlmJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgeG1sUnBjOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiArICdUJyArIHJlSG91cjI0ICsgJzonICsgcmVNaW51dGVseiArICc6JyArIHJlU2Vjb25kbHopLFxuICAgIG5hbWU6ICd4bWxycGMnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KSAmJiB0aGlzLnRpbWUoK2hvdXIsICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICB4bWxScGNOb0NvbG9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiArICdbVHRdJyArIHJlSG91cjI0ICsgcmVNaW51dGVseiArIHJlU2Vjb25kbHopLFxuICAgIG5hbWU6ICd4bWxycGNub2NvbG9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgY2xmOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURheSArICcvKCcgKyByZU1vbnRoQWJiciArICcpLycgKyByZVllYXI0ICsgJzonICsgcmVIb3VyMjRseiArICc6JyArIHJlTWludXRlbHogKyAnOicgKyByZVNlY29uZGx6ICsgcmVTcGFjZSArIHJlVHpDb3JyZWN0aW9uLCAnaScpLFxuICAgIG5hbWU6ICdjbGYnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhciwgaG91ciwgbWludXRlLCBzZWNvbmQsIHR6Q29ycmVjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksICtkYXkpICYmIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCkgJiYgdGhpcy56b25lKHByb2Nlc3NUekNvcnJlY3Rpb24odHpDb3JyZWN0aW9uKSk7XG4gICAgfVxuICB9LFxuXG4gIGlzbzg2MDFsb25nOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXnQ/JyArIHJlSG91cjI0ICsgJ1s6Ll0nICsgcmVNaW51dGUgKyAnWzouXScgKyByZVNlY29uZCArIHJlRnJhYywgJ2knKSxcbiAgICBuYW1lOiAnaXNvODYwMWxvbmcnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWMpIHtcbiAgICAgIHJldHVybiB0aGlzLnRpbWUoK2hvdXIsICttaW51dGUsICtzZWNvbmQsICtmcmFjLnN1YnN0cigwLCAzKSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVUZXh0dWFsOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZU1vbnRoVGV4dCArICdbIC5cXFxcdC1dKicgKyByZURheSArICdbLC5zdG5kcmhcXFxcdCBdKycgKyByZVllYXIsICdpJyksXG4gICAgbmFtZTogJ2RhdGV0ZXh0dWFsJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIHllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgcG9pbnRlZERhdGU0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURheSArICdbLlxcXFx0LV0nICsgcmVNb250aCArICdbLi1dJyArIHJlWWVhcjQpLFxuICAgIG5hbWU6ICdwb2ludGVkZGF0ZTQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBtb250aCAtIDEsICtkYXkpO1xuICAgIH1cbiAgfSxcblxuICBwb2ludGVkRGF0ZTI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1suXFxcXHRdJyArIHJlTW9udGggKyAnXFxcXC4nICsgcmVZZWFyMiksXG4gICAgbmFtZTogJ3BvaW50ZWRkYXRlMicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBkYXksIG1vbnRoLCB5ZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQocHJvY2Vzc1llYXIoeWVhciksIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIHRpbWVMb25nMjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kKSxcbiAgICBuYW1lOiAndGltZWxvbmcyNCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVOb0NvbG9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0ICsgcmVNb250aGx6ICsgcmVEYXlseiksXG4gICAgbmFtZTogJ2RhdGVub2NvbG9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgcGd5ZG90ZDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICdcXFxcLj8nICsgcmVEYXlPZlllYXIpLFxuICAgIG5hbWU6ICdwZ3lkb3RkJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCAwLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgdGltZVNob3J0MjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSwgJ2knKSxcbiAgICBuYW1lOiAndGltZXNob3J0MjQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgaG91ciwgbWludXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy50aW1lKCtob3VyLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgaXNvODYwMW5vQ29sb246IHtcbiAgICByZWdleDogUmVnRXhwKCdedD8nICsgcmVIb3VyMjRseiArIHJlTWludXRlbHogKyByZVNlY29uZGx6LCAnaScpLFxuICAgIG5hbWU6ICdpc284NjAxbm9jb2xvbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUsIHNlY29uZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgK3NlY29uZCwgMCk7XG4gICAgfVxuICB9LFxuXG4gIGlzbzg2MDFkYXRlU2xhc2g6IHtcbiAgICAvLyBldmVudGhvdWdoIHRoZSB0cmFpbGluZyBzbGFzaCBpcyBvcHRpb25hbCBpbiBQSFBcbiAgICAvLyBoZXJlIGl0J3MgbWFuZGF0b3J5IGFuZCBpbnB1dHMgd2l0aG91dCB0aGUgc2xhc2hcbiAgICAvLyBhcmUgaGFuZGxlZCBieSBkYXRlc2xhc2hcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLycgKyByZU1vbnRobHogKyAnLycgKyByZURheWx6ICsgJy8nKSxcbiAgICBuYW1lOiAnaXNvODYwMWRhdGVzbGFzaCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVTbGFzaDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyNCArICcvJyArIHJlTW9udGggKyAnLycgKyByZURheSksXG4gICAgbmFtZTogJ2RhdGVzbGFzaCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCwgZGF5KSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQoK3llYXIsIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGFtZXJpY2FuOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZU1vbnRoICsgJy8nICsgcmVEYXkgKyAnLycgKyByZVllYXIpLFxuICAgIG5hbWU6ICdhbWVyaWNhbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgZGF5LCB5ZWFyKSB7XG4gICAgICByZXR1cm4gdGhpcy55bWQocHJvY2Vzc1llYXIoeWVhciksIG1vbnRoIC0gMSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGFtZXJpY2FuU2hvcnQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlTW9udGggKyAnLycgKyByZURheSksXG4gICAgbmFtZTogJ2FtZXJpY2Fuc2hvcnQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgsIGRheSkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHRoaXMueSwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZ251RGF0ZVNob3J0T3JJc284NjAxZGF0ZTI6IHtcbiAgICAvLyBpc284NjAxZGF0ZTIgaXMgY29tcGxldGUgc3Vic2V0IG9mIGdudWRhdGVzaG9ydFxuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVZZWFyICsgJy0nICsgcmVNb250aCArICctJyArIHJlRGF5KSxcbiAgICBuYW1lOiAnZ251ZGF0ZXNob3J0IHwgaXNvODYwMWRhdGUyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgaXNvODYwMWRhdGU0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVllYXI0d2l0aFNpZ24gKyAnLScgKyByZU1vbnRobHogKyAnLScgKyByZURheWx6KSxcbiAgICBuYW1lOiAnaXNvODYwMWRhdGU0JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZ251Tm9Db2xvbjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ150PycgKyByZUhvdXIyNGx6ICsgcmVNaW51dGVseiwgJ2knKSxcbiAgICBuYW1lOiAnZ251bm9jb2xvbicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBob3VyLCBtaW51dGUpIHtcbiAgICAgIC8vIHRoaXMgcnVsZSBpcyBhIHNwZWNpYWwgY2FzZVxuICAgICAgLy8gaWYgdGltZSB3YXMgYWxyZWFkeSBzZXQgb25jZSBieSBhbnkgcHJlY2VkaW5nIHJ1bGUsIGl0IHNldHMgdGhlIGNhcHR1cmVkIHZhbHVlIGFzIHllYXJcbiAgICAgIHN3aXRjaCAodGhpcy50aW1lcykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZSgraG91ciwgK21pbnV0ZSwgMCwgdGhpcy5mKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMueSA9IGhvdXIgKiAxMDAgKyArbWludXRlO1xuICAgICAgICAgIHRoaXMudGltZXMrKztcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ251RGF0ZVNob3J0ZXI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLScgKyByZU1vbnRoKSxcbiAgICBuYW1lOiAnZ251ZGF0ZXNob3J0ZXInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgeWVhciwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCgreWVhciwgbW9udGggLSAxLCAxKTtcbiAgICB9XG4gIH0sXG5cbiAgcGdUZXh0UmV2ZXJzZToge1xuICAgIC8vIG5vdGU6IGFsbG93ZWQgeWVhcnMgYXJlIGZyb20gMzItOTk5OVxuICAgIC8vIHllYXJzIGJlbG93IDMyIHNob3VsZCBiZSB0cmVhdGVkIGFzIGRheXMgaW4gZGF0ZWZ1bGxcbiAgICByZWdleDogUmVnRXhwKCdeJyArICcoXFxcXGR7Myw0fXxbNC05XVxcXFxkfDNbMi05XSktKCcgKyByZU1vbnRoQWJiciArICcpLScgKyByZURheWx6LCAnaScpLFxuICAgIG5hbWU6ICdwZ3RleHRyZXZlcnNlJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZUZ1bGw6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1sgXFxcXHQuLV0qJyArIHJlTW9udGhUZXh0ICsgJ1sgXFxcXHQuLV0qJyArIHJlWWVhciwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZWZ1bGwnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5LCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHByb2Nlc3NZZWFyKHllYXIpLCBsb29rdXBNb250aChtb250aCksICtkYXkpO1xuICAgIH1cbiAgfSxcblxuICBkYXRlTm9EYXk6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlTW9udGhUZXh0ICsgJ1sgLlxcXFx0LV0qJyArIHJlWWVhcjQsICdpJyksXG4gICAgbmFtZTogJ2RhdGVub2RheScsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgeWVhcikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksIDEpO1xuICAgIH1cbiAgfSxcblxuICBkYXRlTm9EYXlSZXY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnWyAuXFxcXHQtXSonICsgcmVNb250aFRleHQsICdpJyksXG4gICAgbmFtZTogJ2RhdGVub2RheXJldicsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKCt5ZWFyLCBsb29rdXBNb250aChtb250aCksIDEpO1xuICAgIH1cbiAgfSxcblxuICBwZ1RleHRTaG9ydDoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14oJyArIHJlTW9udGhBYmJyICsgJyktJyArIHJlRGF5bHogKyAnLScgKyByZVllYXIsICdpJyksXG4gICAgbmFtZTogJ3BndGV4dHNob3J0JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIHllYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZChwcm9jZXNzWWVhcih5ZWFyKSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZU5vWWVhcjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVEYXRlTm9ZZWFyLCAnaScpLFxuICAgIG5hbWU6ICdkYXRlbm95ZWFyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGRhdGVOb1llYXJSZXY6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF5ICsgJ1sgLlxcXFx0LV0qJyArIHJlTW9udGhUZXh0LCAnaScpLFxuICAgIG5hbWU6ICdkYXRlbm95ZWFycmV2JyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIGRheSwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSk7XG4gICAgfVxuICB9LFxuXG4gIGlzb1dlZWtEYXk6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQgKyAnLT9XJyArIHJlV2Vla09mWWVhciArICcoPzotPyhbMC03XSkpPycpLFxuICAgIG5hbWU6ICdpc293ZWVrZGF5IHwgaXNvd2VlaycsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyLCB3ZWVrLCBkYXkpIHtcbiAgICAgIGRheSA9IGRheSA/ICtkYXkgOiAxO1xuXG4gICAgICBpZiAoIXRoaXMueW1kKCt5ZWFyLCAwLCAxKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIGdldCBkYXkgb2Ygd2VlayBmb3IgSmFuIDFzdFxuICAgICAgdmFyIGRheU9mV2VlayA9IG5ldyBEYXRlKHRoaXMueSwgdGhpcy5tLCB0aGlzLmQpLmdldERheSgpO1xuXG4gICAgICAvLyBhbmQgdXNlIHRoZSBkYXkgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IGZvciBkYXkgMSBvZiB3ZWVrIDFcbiAgICAgIGRheU9mV2VlayA9IDAgLSAoZGF5T2ZXZWVrID4gNCA/IGRheU9mV2VlayAtIDcgOiBkYXlPZldlZWspO1xuXG4gICAgICB0aGlzLnJkICs9IGRheU9mV2VlayArICh3ZWVrIC0gMSkgKiA3ICsgZGF5O1xuICAgIH1cbiAgfSxcblxuICByZWxhdGl2ZVRleHQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHRudW1iZXIgKyAnfCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICcoJyArIHJlUmVsdGV4dHVuaXQgKyAnKScsICdpJyksXG4gICAgbmFtZTogJ3JlbGF0aXZldGV4dCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCByZWxWYWx1ZSwgcmVsVW5pdCkge1xuICAgICAgLy8gdG9kbzogaW1wbGVtZW50IGhhbmRsaW5nIG9mICd0aGlzIHRpbWUtdW5pdCdcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgdmFyIF9sb29rdXBSZWxhdGl2ZSA9IGxvb2t1cFJlbGF0aXZlKHJlbFZhbHVlKSxcbiAgICAgICAgICBhbW91bnQgPSBfbG9va3VwUmVsYXRpdmUuYW1vdW50LFxuICAgICAgICAgIGJlaGF2aW9yID0gX2xvb2t1cFJlbGF0aXZlLmJlaGF2aW9yO1xuXG4gICAgICBzd2l0Y2ggKHJlbFVuaXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgdGhpcy5ycyArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICB0aGlzLnJpICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLnJoICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodCc6XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodHMnOlxuICAgICAgICBjYXNlICdmb3J0aG5pZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9ydGhuaWdodHMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gYW1vdW50ICogMTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQgKiA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgICAgdGhpcy5ybSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgdGhpcy5yeSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbic6Y2FzZSAnbW9uZGF5JzpcbiAgICAgICAgY2FzZSAndHVlJzpjYXNlICd0dWVzZGF5JzpcbiAgICAgICAgY2FzZSAnd2VkJzpjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICBjYXNlICd0aHUnOmNhc2UgJ3RodXJzZGF5JzpcbiAgICAgICAgY2FzZSAnZnJpJzpjYXNlICdmcmlkYXknOlxuICAgICAgICBjYXNlICdzYXQnOmNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgY2FzZSAnc3VuJzpjYXNlICdzdW5kYXknOlxuICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gbG9va3VwV2Vla2RheShyZWxVbml0LCA3KTtcbiAgICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICAgICAgdGhpcy5yZCArPSAoYW1vdW50ID4gMCA/IGFtb3VudCAtIDEgOiBhbW91bnQpICogNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ3dlZWtkYXlzJzpcbiAgICAgICAgICAvLyB0b2RvXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbGF0aXZlOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXihbKy1dKilbIFxcXFx0XSooXFxcXGQrKScgKyByZVNwYWNlT3B0ICsgJygnICsgcmVSZWx0ZXh0dW5pdCArICd8d2VlayknLCAnaScpLFxuICAgIG5hbWU6ICdyZWxhdGl2ZScsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBzaWducywgcmVsVmFsdWUsIHJlbFVuaXQpIHtcbiAgICAgIHZhciBtaW51c2VzID0gc2lnbnMucmVwbGFjZSgvW14tXS9nLCAnJykubGVuZ3RoO1xuXG4gICAgICB2YXIgYW1vdW50ID0gK3JlbFZhbHVlICogTWF0aC5wb3coLTEsIG1pbnVzZXMpO1xuXG4gICAgICBzd2l0Y2ggKHJlbFVuaXQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdzZWMnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgdGhpcy5ycyArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ21pbnMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICB0aGlzLnJpICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgICB0aGlzLnJoICs9IGFtb3VudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodCc6XG4gICAgICAgIGNhc2UgJ2ZvcnRuaWdodHMnOlxuICAgICAgICBjYXNlICdmb3J0aG5pZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9ydGhuaWdodHMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gYW1vdW50ICogMTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgICAgdGhpcy5yZCArPSBhbW91bnQgKiA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNhc2UgJ21vbnRocyc6XG4gICAgICAgICAgdGhpcy5ybSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgICAgdGhpcy5yeSArPSBhbW91bnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vbic6Y2FzZSAnbW9uZGF5JzpcbiAgICAgICAgY2FzZSAndHVlJzpjYXNlICd0dWVzZGF5JzpcbiAgICAgICAgY2FzZSAnd2VkJzpjYXNlICd3ZWRuZXNkYXknOlxuICAgICAgICBjYXNlICd0aHUnOmNhc2UgJ3RodXJzZGF5JzpcbiAgICAgICAgY2FzZSAnZnJpJzpjYXNlICdmcmlkYXknOlxuICAgICAgICBjYXNlICdzYXQnOmNhc2UgJ3NhdHVyZGF5JzpcbiAgICAgICAgY2FzZSAnc3VuJzpjYXNlICdzdW5kYXknOlxuICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gbG9va3VwV2Vla2RheShyZWxVbml0LCA3KTtcbiAgICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICAgICAgdGhpcy5yZCArPSAoYW1vdW50ID4gMCA/IGFtb3VudCAtIDEgOiBhbW91bnQpICogNztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ3dlZWtkYXlzJzpcbiAgICAgICAgICAvLyB0b2RvXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGRheVRleHQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZURheXRleHQgKyAnKScsICdpJyksXG4gICAgbmFtZTogJ2RheXRleHQnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgZGF5VGV4dCkge1xuICAgICAgdGhpcy5yZXNldFRpbWUoKTtcbiAgICAgIHRoaXMud2Vla2RheSA9IGxvb2t1cFdlZWtkYXkoZGF5VGV4dCwgMCk7XG5cbiAgICAgIGlmICh0aGlzLndlZWtkYXlCZWhhdmlvciAhPT0gMikge1xuICAgICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlbGF0aXZlVGV4dFdlZWs6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZVJlbHRleHR0ZXh0ICsgJyknICsgcmVTcGFjZSArICd3ZWVrJywgJ2knKSxcbiAgICBuYW1lOiAncmVsYXRpdmV0ZXh0d2VlaycsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCByZWxUZXh0KSB7XG4gICAgICB0aGlzLndlZWtkYXlCZWhhdmlvciA9IDI7XG5cbiAgICAgIHN3aXRjaCAocmVsVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ3RoaXMnOlxuICAgICAgICAgIHRoaXMucmQgKz0gMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgdGhpcy5yZCArPSA3O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsYXN0JzpcbiAgICAgICAgY2FzZSAncHJldmlvdXMnOlxuICAgICAgICAgIHRoaXMucmQgLT0gNztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTmFOKHRoaXMud2Vla2RheSkpIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5ID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbW9udGhGdWxsT3JNb250aEFiYnI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeKCcgKyByZU1vbnRoRnVsbCArICd8JyArIHJlTW9udGhBYmJyICsgJyknLCAnaScpLFxuICAgIG5hbWU6ICdtb250aGZ1bGwgfCBtb250aGFiYnInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgdGhpcy5kKTtcbiAgICB9XG4gIH0sXG5cbiAgdHpDb3JyZWN0aW9uOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZVR6Q29ycmVjdGlvbiwgJ2knKSxcbiAgICBuYW1lOiAndHpjb3JyZWN0aW9uJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sodHpDb3JyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lKHByb2Nlc3NUekNvcnJlY3Rpb24odHpDb3JyZWN0aW9uKSk7XG4gICAgfVxuICB9LFxuXG4gIHR6QWJicjoge1xuICAgIHJlZ2V4OiBSZWdFeHAoJ14nICsgcmVUekFiYnIpLFxuICAgIG5hbWU6ICd0emFiYnInLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgYWJicikge1xuICAgICAgdmFyIG9mZnNldCA9IHR6QWJick9mZnNldHNbYWJici50b0xvd2VyQ2FzZSgpXTtcblxuICAgICAgaWYgKGlzTmFOKG9mZnNldCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy56b25lKG9mZnNldCk7XG4gICAgfVxuICB9LFxuXG4gIGFnbzoge1xuICAgIHJlZ2V4OiAvXmFnby9pLFxuICAgIG5hbWU6ICdhZ28nLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjaygpIHtcbiAgICAgIHRoaXMucnkgPSAtdGhpcy5yeTtcbiAgICAgIHRoaXMucm0gPSAtdGhpcy5ybTtcbiAgICAgIHRoaXMucmQgPSAtdGhpcy5yZDtcbiAgICAgIHRoaXMucmggPSAtdGhpcy5yaDtcbiAgICAgIHRoaXMucmkgPSAtdGhpcy5yaTtcbiAgICAgIHRoaXMucnMgPSAtdGhpcy5ycztcbiAgICAgIHRoaXMucmYgPSAtdGhpcy5yZjtcbiAgICB9XG4gIH0sXG5cbiAgeWVhcjQ6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlWWVhcjQpLFxuICAgIG5hbWU6ICd5ZWFyNCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCB5ZWFyKSB7XG4gICAgICB0aGlzLnkgPSAreWVhcjtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICB3aGl0ZXNwYWNlOiB7XG4gICAgcmVnZXg6IC9eWyAuLFxcdF0rLyxcbiAgICBuYW1lOiAnd2hpdGVzcGFjZSdcbiAgICAvLyBkbyBub3RoaW5nXG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVMb25nOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyAndD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSArICdbOi5dJyArIHJlU2Vjb25kLCAnaScpLFxuICAgIG5hbWU6ICdkYXRlc2hvcnR3aXRodGltZWxvbmcnLFxuICAgIGNhbGxiYWNrOiBmdW5jdGlvbiBjYWxsYmFjayhtYXRjaCwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCArc2Vjb25kLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVMb25nMTI6IHtcbiAgICByZWdleDogUmVnRXhwKCdeJyArIHJlRGF0ZU5vWWVhciArIHJlSG91cjEyICsgJ1s6Ll0nICsgcmVNaW51dGUgKyAnWzouXScgKyByZVNlY29uZGx6ICsgcmVTcGFjZU9wdCArIHJlTWVyaWRpYW4sICdpJyksXG4gICAgbmFtZTogJ2RhdGVzaG9ydHdpdGh0aW1lbG9uZzEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtZXJpZGlhbikge1xuICAgICAgcmV0dXJuIHRoaXMueW1kKHRoaXMueSwgbG9va3VwTW9udGgobW9udGgpLCArZGF5KSAmJiB0aGlzLnRpbWUocHJvY2Vzc01lcmlkaWFuKCtob3VyLCBtZXJpZGlhbiksICttaW51dGUsICtzZWNvbmQsIDApO1xuICAgIH1cbiAgfSxcblxuICBkYXRlU2hvcnRXaXRoVGltZVNob3J0OiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyAndD8nICsgcmVIb3VyMjQgKyAnWzouXScgKyByZU1pbnV0ZSwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZXNob3J0d2l0aHRpbWVzaG9ydCcsXG4gICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKG1hdGNoLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKCtob3VyLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH0sXG5cbiAgZGF0ZVNob3J0V2l0aFRpbWVTaG9ydDEyOiB7XG4gICAgcmVnZXg6IFJlZ0V4cCgnXicgKyByZURhdGVOb1llYXIgKyByZUhvdXIxMiArICdbOi5dJyArIHJlTWludXRlbHogKyByZVNwYWNlT3B0ICsgcmVNZXJpZGlhbiwgJ2knKSxcbiAgICBuYW1lOiAnZGF0ZXNob3J0d2l0aHRpbWVzaG9ydDEyJyxcbiAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2sobWF0Y2gsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgbWVyaWRpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnltZCh0aGlzLnksIGxvb2t1cE1vbnRoKG1vbnRoKSwgK2RheSkgJiYgdGhpcy50aW1lKHByb2Nlc3NNZXJpZGlhbigraG91ciwgbWVyaWRpYW4pLCArbWludXRlLCAwLCAwKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciByZXN1bHRQcm90byA9IHtcbiAgLy8gZGF0ZVxuICB5OiBOYU4sXG4gIG06IE5hTixcbiAgZDogTmFOLFxuICAvLyB0aW1lXG4gIGg6IE5hTixcbiAgaTogTmFOLFxuICBzOiBOYU4sXG4gIGY6IE5hTixcblxuICAvLyByZWxhdGl2ZSBzaGlmdHNcbiAgcnk6IDAsXG4gIHJtOiAwLFxuICByZDogMCxcbiAgcmg6IDAsXG4gIHJpOiAwLFxuICByczogMCxcbiAgcmY6IDAsXG5cbiAgLy8gd2Vla2RheSByZWxhdGVkIHNoaWZ0c1xuICB3ZWVrZGF5OiBOYU4sXG4gIHdlZWtkYXlCZWhhdmlvcjogMCxcblxuICAvLyBmaXJzdCBvciBsYXN0IGRheSBvZiBtb250aFxuICAvLyAwIG5vbmUsIDEgZmlyc3QsIC0xIGxhc3RcbiAgZmlyc3RPckxhc3REYXlPZk1vbnRoOiAwLFxuXG4gIC8vIHRpbWV6b25lIGNvcnJlY3Rpb24gaW4gbWludXRlc1xuICB6OiBOYU4sXG5cbiAgLy8gY291bnRlcnNcbiAgZGF0ZXM6IDAsXG4gIHRpbWVzOiAwLFxuICB6b25lczogMCxcblxuICAvLyBoZWxwZXIgZnVuY3Rpb25zXG4gIHltZDogZnVuY3Rpb24geW1kKHksIG0sIGQpIHtcbiAgICBpZiAodGhpcy5kYXRlcyA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGVzKys7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLm0gPSBtO1xuICAgIHRoaXMuZCA9IGQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHRpbWU6IGZ1bmN0aW9uIHRpbWUoaCwgaSwgcywgZikge1xuICAgIGlmICh0aGlzLnRpbWVzID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMudGltZXMrKztcbiAgICB0aGlzLmggPSBoO1xuICAgIHRoaXMuaSA9IGk7XG4gICAgdGhpcy5zID0gcztcbiAgICB0aGlzLmYgPSBmO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHJlc2V0VGltZTogZnVuY3Rpb24gcmVzZXRUaW1lKCkge1xuICAgIHRoaXMuaCA9IDA7XG4gICAgdGhpcy5pID0gMDtcbiAgICB0aGlzLnMgPSAwO1xuICAgIHRoaXMuZiA9IDA7XG4gICAgdGhpcy50aW1lcyA9IDA7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgem9uZTogZnVuY3Rpb24gem9uZShtaW51dGVzKSB7XG4gICAgaWYgKHRoaXMuem9uZXMgPD0gMSkge1xuICAgICAgdGhpcy56b25lcysrO1xuICAgICAgdGhpcy56ID0gbWludXRlcztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgdG9EYXRlOiBmdW5jdGlvbiB0b0RhdGUocmVsYXRpdmVUbykge1xuICAgIGlmICh0aGlzLmRhdGVzICYmICF0aGlzLnRpbWVzKSB7XG4gICAgICB0aGlzLmggPSB0aGlzLmkgPSB0aGlzLnMgPSB0aGlzLmYgPSAwO1xuICAgIH1cblxuICAgIC8vIGZpbGwgaG9sZXNcbiAgICBpZiAoaXNOYU4odGhpcy55KSkge1xuICAgICAgdGhpcy55ID0gcmVsYXRpdmVUby5nZXRGdWxsWWVhcigpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLm0pKSB7XG4gICAgICB0aGlzLm0gPSByZWxhdGl2ZVRvLmdldE1vbnRoKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHRoaXMuZCkpIHtcbiAgICAgIHRoaXMuZCA9IHJlbGF0aXZlVG8uZ2V0RGF0ZSgpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLmgpKSB7XG4gICAgICB0aGlzLmggPSByZWxhdGl2ZVRvLmdldEhvdXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKHRoaXMuaSkpIHtcbiAgICAgIHRoaXMuaSA9IHJlbGF0aXZlVG8uZ2V0TWludXRlcygpO1xuICAgIH1cblxuICAgIGlmIChpc05hTih0aGlzLnMpKSB7XG4gICAgICB0aGlzLnMgPSByZWxhdGl2ZVRvLmdldFNlY29uZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odGhpcy5mKSkge1xuICAgICAgdGhpcy5mID0gcmVsYXRpdmVUby5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICB9XG5cbiAgICAvLyBhZGp1c3Qgc3BlY2lhbCBlYXJseVxuICAgIHN3aXRjaCAodGhpcy5maXJzdE9yTGFzdERheU9mTW9udGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5kID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICB0aGlzLmQgPSAwO1xuICAgICAgICB0aGlzLm0gKz0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTih0aGlzLndlZWtkYXkpKSB7XG4gICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHJlbGF0aXZlVG8uZ2V0VGltZSgpKTtcbiAgICAgIGRhdGUuc2V0RnVsbFllYXIodGhpcy55LCB0aGlzLm0sIHRoaXMuZCk7XG4gICAgICBkYXRlLnNldEhvdXJzKHRoaXMuaCwgdGhpcy5pLCB0aGlzLnMsIHRoaXMuZik7XG5cbiAgICAgIHZhciBkb3cgPSBkYXRlLmdldERheSgpO1xuXG4gICAgICBpZiAodGhpcy53ZWVrZGF5QmVoYXZpb3IgPT09IDIpIHtcbiAgICAgICAgLy8gVG8gbWFrZSBcInRoaXMgd2Vla1wiIHdvcmssIHdoZXJlIHRoZSBjdXJyZW50IGRheSBvZiB3ZWVrIGlzIGEgXCJzdW5kYXlcIlxuICAgICAgICBpZiAoZG93ID09PSAwICYmIHRoaXMud2Vla2RheSAhPT0gMCkge1xuICAgICAgICAgIHRoaXMud2Vla2RheSA9IC02O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gbWFrZSBcInN1bmRheSB0aGlzIHdlZWtcIiB3b3JrLCB3aGVyZSB0aGUgY3VycmVudCBkYXkgb2Ygd2VlayBpcyBub3QgYSBcInN1bmRheVwiXG4gICAgICAgIGlmICh0aGlzLndlZWtkYXkgPT09IDAgJiYgZG93ICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy53ZWVrZGF5ID0gNztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZCAtPSBkb3c7XG4gICAgICAgIHRoaXMuZCArPSB0aGlzLndlZWtkYXk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZGlmZiA9IHRoaXMud2Vla2RheSAtIGRvdztcblxuICAgICAgICAvLyBzb21lIFBIUCBtYWdpY1xuICAgICAgICBpZiAodGhpcy5yZCA8IDAgJiYgZGlmZiA8IDAgfHwgdGhpcy5yZCA+PSAwICYmIGRpZmYgPD0gLXRoaXMud2Vla2RheUJlaGF2aW9yKSB7XG4gICAgICAgICAgZGlmZiArPSA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud2Vla2RheSA+PSAwKSB7XG4gICAgICAgICAgdGhpcy5kICs9IGRpZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kIC09IDcgLSAoTWF0aC5hYnModGhpcy53ZWVrZGF5KSAtIGRvdyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndlZWtkYXkgPSBOYU47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRqdXN0IHJlbGF0aXZlXG4gICAgdGhpcy55ICs9IHRoaXMucnk7XG4gICAgdGhpcy5tICs9IHRoaXMucm07XG4gICAgdGhpcy5kICs9IHRoaXMucmQ7XG5cbiAgICB0aGlzLmggKz0gdGhpcy5yaDtcbiAgICB0aGlzLmkgKz0gdGhpcy5yaTtcbiAgICB0aGlzLnMgKz0gdGhpcy5ycztcbiAgICB0aGlzLmYgKz0gdGhpcy5yZjtcblxuICAgIHRoaXMucnkgPSB0aGlzLnJtID0gdGhpcy5yZCA9IDA7XG4gICAgdGhpcy5yaCA9IHRoaXMucmkgPSB0aGlzLnJzID0gdGhpcy5yZiA9IDA7XG5cbiAgICB2YXIgcmVzdWx0ID0gbmV3IERhdGUocmVsYXRpdmVUby5nZXRUaW1lKCkpO1xuICAgIC8vIHNpbmNlIERhdGUgY29uc3RydWN0b3IgdHJlYXRzIHllYXJzIDw9IDk5IGFzIDE5MDArXG4gICAgLy8gaXQgY2FuJ3QgYmUgdXNlZCwgdGh1cyB0aGlzIHdlaXJkIHdheVxuICAgIHJlc3VsdC5zZXRGdWxsWWVhcih0aGlzLnksIHRoaXMubSwgdGhpcy5kKTtcbiAgICByZXN1bHQuc2V0SG91cnModGhpcy5oLCB0aGlzLmksIHRoaXMucywgdGhpcy5mKTtcblxuICAgIC8vIG5vdGU6IHRoaXMgaXMgZG9uZSB0d2ljZSBpbiBQSFBcbiAgICAvLyBlYXJseSB3aGVuIHByb2Nlc3Npbmcgc3BlY2lhbCByZWxhdGl2ZXNcbiAgICAvLyBhbmQgbGF0ZVxuICAgIC8vIHRvZG86IGNoZWNrIGlmIHRoZSBsb2dpYyBjYW4gYmUgcmVkdWNlZFxuICAgIC8vIHRvIGp1c3Qgb25lIHRpbWUgYWN0aW9uXG4gICAgc3dpdGNoICh0aGlzLmZpcnN0T3JMYXN0RGF5T2ZNb250aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXN1bHQuc2V0RGF0ZSgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIC0xOlxuICAgICAgICByZXN1bHQuc2V0TW9udGgocmVzdWx0LmdldE1vbnRoKCkgKyAxLCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gYWRqdXN0IHRpbWV6b25lXG4gICAgaWYgKCFpc05hTih0aGlzLnopICYmIHJlc3VsdC5nZXRUaW1lem9uZU9mZnNldCgpICE9PSB0aGlzLnopIHtcbiAgICAgIHJlc3VsdC5zZXRVVENGdWxsWWVhcihyZXN1bHQuZ2V0RnVsbFllYXIoKSwgcmVzdWx0LmdldE1vbnRoKCksIHJlc3VsdC5nZXREYXRlKCkpO1xuXG4gICAgICByZXN1bHQuc2V0VVRDSG91cnMocmVzdWx0LmdldEhvdXJzKCksIHJlc3VsdC5nZXRNaW51dGVzKCksIHJlc3VsdC5nZXRTZWNvbmRzKCkgLSB0aGlzLnosIHJlc3VsdC5nZXRNaWxsaXNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzdHJ0b3RpbWUoc3RyLCBub3cpIHtcbiAgLy8gICAgICAgZGlzY3VzcyBhdDogaHR0cHM6Ly9sb2N1dHVzLmlvL3BocC9zdHJ0b3RpbWUvXG4gIC8vICAgICAgb3JpZ2luYWwgYnk6IENhaW8gQXJpZWRlIChodHRwczovL2NhaW9hcmllZGUuY29tKVxuICAvLyAgICAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gICAgICBpbXByb3ZlZCBieTogQ2FpbyBBcmllZGUgKGh0dHBzOi8vY2Fpb2FyaWVkZS5jb20pXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IEEuIE1hdMOtYXMgUXVlemFkYSAoaHR0cHM6Ly9hbWF0aWFzcS5jb20pXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IHByZXV0ZXJcbiAgLy8gICAgICBpbXByb3ZlZCBieTogQnJldHQgWmFtaXIgKGh0dHBzOi8vYnJldHQtemFtaXIubWUpXG4gIC8vICAgICAgaW1wcm92ZWQgYnk6IE1pcmtvIEZhYmVyXG4gIC8vICAgICAgICAgaW5wdXQgYnk6IERhdmlkXG4gIC8vICAgICAgYnVnZml4ZWQgYnk6IFdhZ25lciBCLiBTb2FyZXNcbiAgLy8gICAgICBidWdmaXhlZCBieTogQXJ0dXIgVGNoZXJueWNoZXZcbiAgLy8gICAgICBidWdmaXhlZCBieTogU3RlcGhhbiBCw7ZzY2gtUGxlcGVsaXRzIChodHRwczovL2dpdGh1Yi5jb20vcGxlcGUpXG4gIC8vIHJlaW1wbGVtZW50ZWQgYnk6IFJhZmHFgiBLdWthd3NraVxuICAvLyAgICAgICAgICAgbm90ZSAxOiBFeGFtcGxlcyBhbGwgaGF2ZSBhIGZpeGVkIHRpbWVzdGFtcCB0byBwcmV2ZW50XG4gIC8vICAgICAgICAgICBub3RlIDE6IHRlc3RzIHRvIGZhaWwgYmVjYXVzZSBvZiB2YXJpYWJsZSB0aW1lKHpvbmVzKVxuICAvLyAgICAgICAgZXhhbXBsZSAxOiBzdHJ0b3RpbWUoJysxIGRheScsIDExMjk2MzMyMDApXG4gIC8vICAgICAgICByZXR1cm5zIDE6IDExMjk3MTk2MDBcbiAgLy8gICAgICAgIGV4YW1wbGUgMjogc3RydG90aW1lKCcrMSB3ZWVrIDIgZGF5cyA0IGhvdXJzIDIgc2Vjb25kcycsIDExMjk2MzMyMDApXG4gIC8vICAgICAgICByZXR1cm5zIDI6IDExMzA0MjUyMDJcbiAgLy8gICAgICAgIGV4YW1wbGUgMzogc3RydG90aW1lKCdsYXN0IG1vbnRoJywgMTEyOTYzMzIwMClcbiAgLy8gICAgICAgIHJldHVybnMgMzogMTEyNzA0MTIwMFxuICAvLyAgICAgICAgZXhhbXBsZSA0OiBzdHJ0b3RpbWUoJzIwMDktMDUtMDQgMDg6MzA6MDArMDAnKVxuICAvLyAgICAgICAgcmV0dXJucyA0OiAxMjQxNDI1ODAwXG4gIC8vICAgICAgICBleGFtcGxlIDU6IHN0cnRvdGltZSgnMjAwOS0wNS0wNCAwODozMDowMCswMjowMCcpXG4gIC8vICAgICAgICByZXR1cm5zIDU6IDEyNDE0MTg2MDBcbiAgLy8gICAgICAgIGV4YW1wbGUgNjogc3RydG90aW1lKCcyMDA5LTA1LTA0IDA4OjMwOjAwIFlXVCcpXG4gIC8vICAgICAgICByZXR1cm5zIDY6IDEyNDE0NTQ2MDBcblxuICBpZiAobm93ID09IG51bGwpIHtcbiAgICBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgfVxuXG4gIC8vIHRoZSBydWxlIG9yZGVyIGlzIGltcG9ydGFudFxuICAvLyBpZiBtdWx0aXBsZSBydWxlcyBtYXRjaCwgdGhlIGxvbmdlc3QgbWF0Y2ggd2luc1xuICAvLyBpZiBtdWx0aXBsZSBydWxlcyBtYXRjaCB0aGUgc2FtZSBzdHJpbmcsIHRoZSBmaXJzdCBtYXRjaCB3aW5zXG4gIHZhciBydWxlcyA9IFtmb3JtYXRzLnllc3RlcmRheSwgZm9ybWF0cy5ub3csIGZvcm1hdHMubm9vbiwgZm9ybWF0cy5taWRuaWdodE9yVG9kYXksIGZvcm1hdHMudG9tb3Jyb3csIGZvcm1hdHMudGltZXN0YW1wLCBmb3JtYXRzLmZpcnN0T3JMYXN0RGF5LCBmb3JtYXRzLmJhY2tPckZyb250T2YsXG4gIC8vIGZvcm1hdHMud2Vla2RheU9mLCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG4gIGZvcm1hdHMudGltZVRpbnkxMiwgZm9ybWF0cy50aW1lU2hvcnQxMiwgZm9ybWF0cy50aW1lTG9uZzEyLCBmb3JtYXRzLm1zc3FsdGltZSwgZm9ybWF0cy50aW1lU2hvcnQyNCwgZm9ybWF0cy50aW1lTG9uZzI0LCBmb3JtYXRzLmlzbzg2MDFsb25nLCBmb3JtYXRzLmdudU5vQ29sb24sIGZvcm1hdHMuaXNvODYwMW5vQ29sb24sIGZvcm1hdHMuYW1lcmljYW5TaG9ydCwgZm9ybWF0cy5hbWVyaWNhbiwgZm9ybWF0cy5pc284NjAxZGF0ZTQsIGZvcm1hdHMuaXNvODYwMWRhdGVTbGFzaCwgZm9ybWF0cy5kYXRlU2xhc2gsIGZvcm1hdHMuZ251RGF0ZVNob3J0T3JJc284NjAxZGF0ZTIsIGZvcm1hdHMuZ251RGF0ZVNob3J0ZXIsIGZvcm1hdHMuZGF0ZUZ1bGwsIGZvcm1hdHMucG9pbnRlZERhdGU0LCBmb3JtYXRzLnBvaW50ZWREYXRlMiwgZm9ybWF0cy5kYXRlTm9EYXksIGZvcm1hdHMuZGF0ZU5vRGF5UmV2LCBmb3JtYXRzLmRhdGVUZXh0dWFsLCBmb3JtYXRzLmRhdGVOb1llYXIsIGZvcm1hdHMuZGF0ZU5vWWVhclJldiwgZm9ybWF0cy5kYXRlTm9Db2xvbiwgZm9ybWF0cy54bWxScGMsIGZvcm1hdHMueG1sUnBjTm9Db2xvbiwgZm9ybWF0cy5zb2FwLCBmb3JtYXRzLndkZHgsIGZvcm1hdHMuZXhpZiwgZm9ybWF0cy5wZ3lkb3RkLCBmb3JtYXRzLmlzb1dlZWtEYXksIGZvcm1hdHMucGdUZXh0U2hvcnQsIGZvcm1hdHMucGdUZXh0UmV2ZXJzZSwgZm9ybWF0cy5jbGYsIGZvcm1hdHMueWVhcjQsIGZvcm1hdHMuYWdvLCBmb3JtYXRzLmRheVRleHQsIGZvcm1hdHMucmVsYXRpdmVUZXh0V2VlaywgZm9ybWF0cy5yZWxhdGl2ZVRleHQsIGZvcm1hdHMubW9udGhGdWxsT3JNb250aEFiYnIsIGZvcm1hdHMudHpDb3JyZWN0aW9uLCBmb3JtYXRzLnR6QWJiciwgZm9ybWF0cy5kYXRlU2hvcnRXaXRoVGltZVNob3J0MTIsIGZvcm1hdHMuZGF0ZVNob3J0V2l0aFRpbWVMb25nMTIsIGZvcm1hdHMuZGF0ZVNob3J0V2l0aFRpbWVTaG9ydCwgZm9ybWF0cy5kYXRlU2hvcnRXaXRoVGltZUxvbmcsIGZvcm1hdHMucmVsYXRpdmUsIGZvcm1hdHMud2hpdGVzcGFjZV07XG5cbiAgdmFyIHJlc3VsdCA9IE9iamVjdC5jcmVhdGUocmVzdWx0UHJvdG8pO1xuXG4gIHdoaWxlIChzdHIubGVuZ3RoKSB7XG4gICAgdmFyIGxvbmdlc3RNYXRjaCA9IG51bGw7XG4gICAgdmFyIGZpbmFsUnVsZSA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHJ1bGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGZvcm1hdCA9IHJ1bGVzW2ldO1xuXG4gICAgICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2goZm9ybWF0LnJlZ2V4KTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGlmICghbG9uZ2VzdE1hdGNoIHx8IG1hdGNoWzBdLmxlbmd0aCA+IGxvbmdlc3RNYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgICBsb25nZXN0TWF0Y2ggPSBtYXRjaDtcbiAgICAgICAgICBmaW5hbFJ1bGUgPSBmb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZpbmFsUnVsZSB8fCBmaW5hbFJ1bGUuY2FsbGJhY2sgJiYgZmluYWxSdWxlLmNhbGxiYWNrLmFwcGx5KHJlc3VsdCwgbG9uZ2VzdE1hdGNoKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzdHIgPSBzdHIuc3Vic3RyKGxvbmdlc3RNYXRjaFswXS5sZW5ndGgpO1xuICAgIGZpbmFsUnVsZSA9IG51bGw7XG4gICAgbG9uZ2VzdE1hdGNoID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKHJlc3VsdC50b0RhdGUobmV3IERhdGUobm93ICogMTAwMCkpIC8gMTAwMCk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RydG90aW1lLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmlfZ2V0KHZhcm5hbWUpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvaW5pX2dldC9cbiAgLy8gb3JpZ2luYWwgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyAgICAgIG5vdGUgMTogVGhlIGluaSB2YWx1ZXMgbXVzdCBiZSBzZXQgYnkgaW5pX3NldCBvciBtYW51YWxseSB3aXRoaW4gYW4gaW5pIGZpbGVcbiAgLy8gICBleGFtcGxlIDE6IGluaV9zZXQoJ2RhdGUudGltZXpvbmUnLCAnQXNpYS9Ib25nX0tvbmcnKVxuICAvLyAgIGV4YW1wbGUgMTogaW5pX2dldCgnZGF0ZS50aW1lem9uZScpXG4gIC8vICAgcmV0dXJucyAxOiAnQXNpYS9Ib25nX0tvbmcnXG5cbiAgdmFyICRnbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcbiAgJGdsb2JhbC4kbG9jdXR1cyA9ICRnbG9iYWwuJGxvY3V0dXMgfHwge307XG4gIHZhciAkbG9jdXR1cyA9ICRnbG9iYWwuJGxvY3V0dXM7XG4gICRsb2N1dHVzLnBocCA9ICRsb2N1dHVzLnBocCB8fCB7fTtcbiAgJGxvY3V0dXMucGhwLmluaSA9ICRsb2N1dHVzLnBocC5pbmkgfHwge307XG5cbiAgaWYgKCRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0gJiYgJGxvY3V0dXMucGhwLmluaVt2YXJuYW1lXS5sb2NhbF92YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0ubG9jYWxfdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuICRsb2N1dHVzLnBocC5pbmlbdmFybmFtZV0ubG9jYWxfdmFsdWU7XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5pX2dldC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc3RybGVuKHN0cmluZykge1xuICAvLyAgZGlzY3VzcyBhdDogaHR0cHM6Ly9sb2N1dHVzLmlvL3BocC9zdHJsZW4vXG4gIC8vIG9yaWdpbmFsIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gaW1wcm92ZWQgYnk6IFNha2ltb3JpXG4gIC8vIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwczovL2t2ei5pbylcbiAgLy8gICAgaW5wdXQgYnk6IEtpcmsgU3Ryb2JlY2tcbiAgLy8gYnVnZml4ZWQgYnk6IE9ubm8gTWFyc21hbiAoaHR0cHM6Ly90d2l0dGVyLmNvbS9vbm5vbWFyc21hbilcbiAgLy8gIHJldmlzZWQgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyAgICAgIG5vdGUgMTogTWF5IGxvb2sgbGlrZSBvdmVya2lsbCwgYnV0IGluIG9yZGVyIHRvIGJlIHRydWx5IGZhaXRoZnVsIHRvIGhhbmRsaW5nIGFsbCBVbmljb2RlXG4gIC8vICAgICAgbm90ZSAxOiBjaGFyYWN0ZXJzIGFuZCB0byB0aGlzIGZ1bmN0aW9uIGluIFBIUCB3aGljaCBkb2VzIG5vdCBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4gIC8vICAgICAgbm90ZSAxOiBidXQgY291bnRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgc29tZXRoaW5nIGxpa2UgdGhpcyBpcyByZWFsbHkgbmVjZXNzYXJ5LlxuICAvLyAgIGV4YW1wbGUgMTogc3RybGVuKCdLZXZpbiB2YW4gWm9ubmV2ZWxkJylcbiAgLy8gICByZXR1cm5zIDE6IDE5XG4gIC8vICAgZXhhbXBsZSAyOiBpbmlfc2V0KCd1bmljb2RlLnNlbWFudGljcycsICdvbicpXG4gIC8vICAgZXhhbXBsZSAyOiBzdHJsZW4oJ0FcXHVkODdlXFx1ZGMwNFonKVxuICAvLyAgIHJldHVybnMgMjogM1xuXG4gIHZhciBzdHIgPSBzdHJpbmcgKyAnJztcblxuICB2YXIgaW5pVmFsID0gKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUoJy4uL2luZm8vaW5pX2dldCcpKCd1bmljb2RlLnNlbWFudGljcycpIDogdW5kZWZpbmVkKSB8fCAnb2ZmJztcbiAgaWYgKGluaVZhbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gc3RyLmxlbmd0aDtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIGxndGggPSAwO1xuXG4gIHZhciBnZXRXaG9sZUNoYXIgPSBmdW5jdGlvbiBnZXRXaG9sZUNoYXIoc3RyLCBpKSB7XG4gICAgdmFyIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICB2YXIgbmV4dCA9ICcnO1xuICAgIHZhciBwcmV2ID0gJyc7XG4gICAgaWYgKGNvZGUgPj0gMHhEODAwICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAvLyBIaWdoIHN1cnJvZ2F0ZSAoY291bGQgY2hhbmdlIGxhc3QgaGV4IHRvIDB4REI3RiB0b1xuICAgICAgLy8gdHJlYXQgaGlnaCBwcml2YXRlIHN1cnJvZ2F0ZXMgYXMgc2luZ2xlIGNoYXJhY3RlcnMpXG4gICAgICBpZiAoc3RyLmxlbmd0aCA8PSBpICsgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hpZ2ggc3Vycm9nYXRlIHdpdGhvdXQgZm9sbG93aW5nIGxvdyBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIG5leHQgPSBzdHIuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICBpZiAobmV4dCA8IDB4REMwMCB8fCBuZXh0ID4gMHhERkZGKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSGlnaCBzdXJyb2dhdGUgd2l0aG91dCBmb2xsb3dpbmcgbG93IHN1cnJvZ2F0ZScpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoaSkgKyBzdHIuY2hhckF0KGkgKyAxKTtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPj0gMHhEQzAwICYmIGNvZGUgPD0gMHhERkZGKSB7XG4gICAgICAvLyBMb3cgc3Vycm9nYXRlXG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvdyBzdXJyb2dhdGUgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIHByZXYgPSBzdHIuY2hhckNvZGVBdChpIC0gMSk7XG4gICAgICBpZiAocHJldiA8IDB4RDgwMCB8fCBwcmV2ID4gMHhEQkZGKSB7XG4gICAgICAgIC8vIChjb3VsZCBjaGFuZ2UgbGFzdCBoZXggdG8gMHhEQjdGIHRvIHRyZWF0IGhpZ2ggcHJpdmF0ZSBzdXJyb2dhdGVzXG4gICAgICAgIC8vIGFzIHNpbmdsZSBjaGFyYWN0ZXJzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvdyBzdXJyb2dhdGUgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGUnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIGNhbiBwYXNzIG92ZXIgbG93IHN1cnJvZ2F0ZXMgbm93IGFzIHRoZSBzZWNvbmRcbiAgICAgIC8vIGNvbXBvbmVudCBpbiBhIHBhaXIgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLmNoYXJBdChpKTtcbiAgfTtcblxuICBmb3IgKGkgPSAwLCBsZ3RoID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChnZXRXaG9sZUNoYXIoc3RyLCBpKSA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBZGFwdCB0aGlzIGxpbmUgYXQgdGhlIHRvcCBvZiBhbnkgbG9vcCwgcGFzc2luZyBpbiB0aGUgd2hvbGUgc3RyaW5nIGFuZFxuICAgIC8vIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhbmQgcmV0dXJuaW5nIGEgdmFyaWFibGUgdG8gcmVwcmVzZW50IHRoZSBpbmRpdmlkdWFsIGNoYXJhY3RlcjtcbiAgICAvLyBwdXJwb3NlIGlzIHRvIHRyZWF0IHRoZSBmaXJzdCBwYXJ0IG9mIGEgc3Vycm9nYXRlIHBhaXIgYXMgdGhlIHdob2xlIGNoYXJhY3RlciBhbmQgdGhlblxuICAgIC8vIGlnbm9yZSB0aGUgc2Vjb25kIHBhcnRcbiAgICBsZ3RoKys7XG4gIH1cblxuICByZXR1cm4gbGd0aDtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJsZW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzX251bWVyaWMobWl4ZWRWYXIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjYW1lbGNhc2VcbiAgLy8gIGRpc2N1c3MgYXQ6IGh0dHBzOi8vbG9jdXR1cy5pby9waHAvaXNfbnVtZXJpYy9cbiAgLy8gb3JpZ2luYWwgYnk6IEtldmluIHZhbiBab25uZXZlbGQgKGh0dHBzOi8va3Z6LmlvKVxuICAvLyBpbXByb3ZlZCBieTogRGF2aWRcbiAgLy8gaW1wcm92ZWQgYnk6IHRhaXRoXG4gIC8vIGJ1Z2ZpeGVkIGJ5OiBUaW0gZGUgS29uaW5nXG4gIC8vIGJ1Z2ZpeGVkIGJ5OiBXZWJEZXZIb2JvIChodHRwczovL3dlYmRldmhvYm8uYmxvZ3Nwb3QuY29tLylcbiAgLy8gYnVnZml4ZWQgYnk6IEJyZXR0IFphbWlyIChodHRwczovL2JyZXR0LXphbWlyLm1lKVxuICAvLyBidWdmaXhlZCBieTogRGVuaXMgQ2hlbnUgKGh0dHBzOi8vc2hub3VsbGUubmV0KVxuICAvLyAgIGV4YW1wbGUgMTogaXNfbnVtZXJpYygxODYuMzEpXG4gIC8vICAgcmV0dXJucyAxOiB0cnVlXG4gIC8vICAgZXhhbXBsZSAyOiBpc19udW1lcmljKCdLZXZpbiB2YW4gWm9ubmV2ZWxkJylcbiAgLy8gICByZXR1cm5zIDI6IGZhbHNlXG4gIC8vICAgZXhhbXBsZSAzOiBpc19udW1lcmljKCcgKzE4Ni4zMWUyJylcbiAgLy8gICByZXR1cm5zIDM6IHRydWVcbiAgLy8gICBleGFtcGxlIDQ6IGlzX251bWVyaWMoJycpXG4gIC8vICAgcmV0dXJucyA0OiBmYWxzZVxuICAvLyAgIGV4YW1wbGUgNTogaXNfbnVtZXJpYyhbXSlcbiAgLy8gICByZXR1cm5zIDU6IGZhbHNlXG4gIC8vICAgZXhhbXBsZSA2OiBpc19udW1lcmljKCcxICcpXG4gIC8vICAgcmV0dXJucyA2OiBmYWxzZVxuXG4gIHZhciB3aGl0ZXNwYWNlID0gWycgJywgJ1xcbicsICdcXHInLCAnXFx0JywgJ1xcZicsICdcXHgwYicsICdcXHhhMCcsICdcXHUyMDAwJywgJ1xcdTIwMDEnLCAnXFx1MjAwMicsICdcXHUyMDAzJywgJ1xcdTIwMDQnLCAnXFx1MjAwNScsICdcXHUyMDA2JywgJ1xcdTIwMDcnLCAnXFx1MjAwOCcsICdcXHUyMDA5JywgJ1xcdTIwMEEnLCAnXFx1MjAwQicsICdcXHUyMDI4JywgJ1xcdTIwMjknLCAnXFx1MzAwMCddLmpvaW4oJycpO1xuXG4gIC8vIEB0b2RvOiBCcmVhayB0aGlzIHVwIHVzaW5nIG1hbnkgc2luZ2xlIGNvbmRpdGlvbnMgd2l0aCBlYXJseSByZXR1cm5zXG4gIHJldHVybiAodHlwZW9mIG1peGVkVmFyID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbWl4ZWRWYXIgPT09ICdzdHJpbmcnICYmIHdoaXRlc3BhY2UuaW5kZXhPZihtaXhlZFZhci5zbGljZSgtMSkpID09PSAtMSkgJiYgbWl4ZWRWYXIgIT09ICcnICYmICFpc05hTihtaXhlZFZhcik7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNfbnVtZXJpYy5qcy5tYXAiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcblx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZTsgfTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIGRlZmluaXRpb24pIHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKiFcbiAqIExhcmF2ZWwgSmF2YXNjcmlwdCBWYWxpZGF0aW9uXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3Byb2VuZ3NvZnQvbGFyYXZlbC1qc3ZhbGlkYXRpb25cbiAqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgYnkgdmFsaWRhdG9yc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNyBQcm9lbmdzb2Z0XG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgc3RybGVuIGZyb20gJ2xvY3V0dXMvcGhwL3N0cmluZ3Mvc3RybGVuJztcbmltcG9ydCBhcnJheV9kaWZmIGZyb20gJ2xvY3V0dXMvcGhwL2FycmF5L2FycmF5X2RpZmYnO1xuaW1wb3J0IHN0cnRvdGltZSBmcm9tICdsb2N1dHVzL3BocC9kYXRldGltZS9zdHJ0b3RpbWUnO1xuaW1wb3J0IGlzX251bWVyaWMgZnJvbSAnbG9jdXR1cy9waHAvdmFyL2lzX251bWVyaWMnO1xuXG4kLmV4dGVuZCh0cnVlLCBsYXJhdmVsVmFsaWRhdGlvbiwge1xuXG4gICAgaGVscGVyczoge1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1lcmljIHJ1bGVzXG4gICAgICAgICAqL1xuICAgICAgICBudW1lcmljUnVsZXM6IFsnSW50ZWdlcicsICdOdW1lcmljJ10sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBmaWxlIGlucHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZmllbGRPYmpcbiAgICAgICAgICogQHBhcmFtIGluZGV4XG4gICAgICAgICAqIEByZXR1cm5zIHt7ZmlsZTogKiwgZXh0ZW5zaW9uOiBzdHJpbmcsIHNpemU6IG51bWJlcn19XG4gICAgICAgICAqL1xuICAgICAgICBmaWxlaW5mbzogZnVuY3Rpb24gKGZpZWxkT2JqLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIEZpbGVOYW1lID0gZmllbGRPYmoudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcgPyBpbmRleCA6IDA7XG4gICAgICAgICAgICBpZiAoIGZpZWxkT2JqLmZpbGVzICE9PSBudWxsICkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmouZmlsZXNbaW5kZXhdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogRmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb246IEZpbGVOYW1lLnN1YnN0cihGaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmaWVsZE9iai5maWxlc1tpbmRleF0uc2l6ZSAvIDEwMjQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZE9iai5maWxlc1tpbmRleF0udHlwZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBzZWxlY3RvcnMgZm9yIHRoIHNwZWNpZmllZCBmaWVsZCBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG5hbWVzXG4gICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBzZWxlY3RvcjogZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgIGlmICghIHRoaXMuaXNBcnJheShuYW1lcykpICB7XG4gICAgICAgICAgICAgICAgbmFtZXMgPSBbbmFtZXNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yLnB1c2goXCJbbmFtZT0nXCIgKyBuYW1lc1tpXSArIFwiJ11cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3Iuam9pbigpO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIG51bWVyaWMgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgaGFzTnVtZXJpY1J1bGVzOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzUnVsZXMoZWxlbWVudCwgdGhpcy5udW1lcmljUnVsZXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayBpZiBlbGVtZW50IGhhcyBwYXNzZWQgcnVsZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBydWxlc1xuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGhhc1J1bGVzOiBmdW5jdGlvbiAoZWxlbWVudCwgcnVsZXMpIHtcblxuICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZhbGlkYXRvciA9ICQuZGF0YShlbGVtZW50LmZvcm0sIFwidmFsaWRhdG9yXCIpO1xuICAgICAgICAgICAgdmFyIGxpc3RSdWxlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGNhY2hlID0gdmFsaWRhdG9yLmFycmF5UnVsZXNDYWNoZTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5hbWUgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkLmVhY2goY2FjaGVbZWxlbWVudC5uYW1lXSwgZnVuY3Rpb24gKGluZGV4LCBhcnJheVJ1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdFJ1bGVzLnB1c2goYXJyYXlSdWxlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5hbWUgaW4gdmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgbGlzdFJ1bGVzLnB1c2godmFsaWRhdG9yLnNldHRpbmdzLnJ1bGVzW2VsZW1lbnQubmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJC5lYWNoKGxpc3RSdWxlcywgZnVuY3Rpb24oaW5kZXgsb2JqUnVsZXMpe1xuICAgICAgICAgICAgICAgIGlmICgnbGFyYXZlbFZhbGlkYXRpb24nIGluIG9ialJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfcnVsZXM9b2JqUnVsZXMubGFyYXZlbFZhbGlkYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3J1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC5pbkFycmF5KF9ydWxlc1tpXVswXSxydWxlcykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiB0aGUgc3RyaW5nIGxlbmd0aCB1c2luZyBQSFAgZnVuY3Rpb24uXG4gICAgICAgICAqIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5zdHJsZW4ucGhwXG4gICAgICAgICAqIGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL3N0cmxlbi9cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHN0cmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgc3RybGVuOiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RybGVuKHN0cmluZyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGRlcGVuZGluZyBvZiBoaXMgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9ialxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHJldHVybnMgaW50XG4gICAgICAgICAqL1xuICAgICAgICBnZXRTaXplOiBmdW5jdGlvbiBnZXRTaXplKG9iaiwgZWxlbWVudCwgdmFsdWUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzTnVtZXJpY1J1bGVzKGVsZW1lbnQpICYmIHRoaXMuaXNfbnVtZXJpYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KE1hdGguZmxvb3IodGhpcy5maWxlaW5mbyhlbGVtZW50KS5zaXplKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuc3RybGVuKHZhbHVlKSk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJuIHNwZWNpZmllZCBydWxlIGZyb20gZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIGVsZW1lbnRcbiAgICAgICAgICogQHJldHVybnMgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBnZXRMYXJhdmVsVmFsaWRhdGlvbjogZnVuY3Rpb24ocnVsZSwgZWxlbWVudCkge1xuXG4gICAgICAgICAgICB2YXIgZm91bmQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAkLmVhY2goJC52YWxpZGF0b3Iuc3RhdGljUnVsZXMoZWxlbWVudCksIGZ1bmN0aW9uKGtleSwgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5PT09XCJsYXJhdmVsVmFsaWRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICQuZWFjaChydWxlcywgZnVuY3Rpb24gKGksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF09PT1ydWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQ9dmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybiBoZSB0aW1lc3RhbXAgb2YgdmFsdWUgcGFzc2VkIHVzaW5nIGZvcm1hdCBvciBkZWZhdWx0IGZvcm1hdCBpbiBlbGVtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbnxpbnR9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJzZVRpbWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0KSB7XG5cbiAgICAgICAgICAgIHZhciB0aW1lVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBmbXQgPSBuZXcgRGF0ZUZvcm1hdHRlcigpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBmb3JtYXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGVSdWxlID0gdGhpcy5nZXRMYXJhdmVsVmFsaWRhdGlvbignRGF0ZUZvcm1hdCcsIGZvcm1hdCk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVSdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZGF0ZVJ1bGVbMV1bMF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRpbWVWYWx1ZSA9IHRoaXMuc3RydG90aW1lKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZVZhbHVlID0gZm10LnBhcnNlRGF0ZSh2YWx1ZSwgZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBpZiAodGltZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiBmbXQuZm9ybWF0RGF0ZSh0aW1lVmFsdWUsIGZvcm1hdCkgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVWYWx1ZSA9IE1hdGgucm91bmQoKHRpbWVWYWx1ZS5nZXRUaW1lKCkgLyAxMDAwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZVZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wYXJlIGEgZ2l2ZW4gZGF0ZSBhZ2FpbnN0IGFub3RoZXIgdXNpbmcgYW4gb3BlcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0b3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlXG4gICAgICAgICAqIEBwYXJhbSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgICAgICogQHBhcmFtIG9wZXJhdG9yXG4gICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICBjb21wYXJlRGF0ZXM6IGZ1bmN0aW9uICh2YWxpZGF0b3IsIHZhbHVlLCBlbGVtZW50LCBwYXJhbXMsIG9wZXJhdG9yKSB7XG5cbiAgICAgICAgICAgIHZhciB0aW1lQ29tcGFyZSA9IHRoaXMucGFyc2VUaW1lKHBhcmFtcyk7XG5cbiAgICAgICAgICAgIGlmICghdGltZUNvbXBhcmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcy5kZXBlbmRlbnRFbGVtZW50KHZhbGlkYXRvciwgZWxlbWVudCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aW1lQ29tcGFyZSA9IHRoaXMucGFyc2VUaW1lKHZhbGlkYXRvci5lbGVtZW50VmFsdWUodGFyZ2V0KSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRpbWVWYWx1ZSA9IHRoaXMucGFyc2VUaW1lKHZhbHVlLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0aW1lVmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVmFsdWUgPCB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVWYWx1ZSA8PSB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlID09PSB0aW1lQ29tcGFyZTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZVZhbHVlID4gdGltZUNvbXBhcmU7XG5cbiAgICAgICAgICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lVmFsdWUgPj0gdGltZUNvbXBhcmU7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdG9yLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGludGVsbGlnZW50bHkgZ3Vlc3MgdGhlIGRhdGUgYnkgY2xvc2VseSBtYXRjaGluZyB0aGUgc3BlY2lmaWMgZm9ybWF0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgICAgICogQHBhcmFtIGZvcm1hdFxuICAgICAgICAgKiBAcmV0dXJucyB7RGF0ZX1cbiAgICAgICAgICovXG4gICAgICAgIGd1ZXNzRGF0ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgICAgIHZhciBmbXQgPSBuZXcgRGF0ZUZvcm1hdHRlcigpO1xuICAgICAgICAgICAgcmV0dXJuIGZtdC5ndWVzc0RhdGUodmFsdWUsIGZvcm1hdClcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBVbml4IHRpbWVzdGFtcCBiYXNlZCBvbiBQSFAgZnVuY3Rpb24gc3Ryb3RvdGltZS5cbiAgICAgICAgICogaHR0cDovL3BocC5uZXQvbWFudWFsL2VzL2Z1bmN0aW9uLnN0cnRvdGltZS5waHBcbiAgICAgICAgICogaHR0cDovL3BocGpzLm9yZy9mdW5jdGlvbnMvc3RydG90aW1lL1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdGV4dFxuICAgICAgICAgKiBAcGFyYW0gbm93XG4gICAgICAgICAqIEByZXR1cm5zIHsqfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RydG90aW1lOiBmdW5jdGlvbiAodGV4dCwgbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RydG90aW1lKHRleHQsIG5vdylcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBpZiB2YWx1ZSBpcyBudW1lcmljLlxuICAgICAgICAgKiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZXMvdmFyLmlzX251bWVyaWMucGhwXG4gICAgICAgICAqIGh0dHA6Ly9waHBqcy5vcmcvZnVuY3Rpb25zL2lzX251bWVyaWMvXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBtaXhlZF92YXJcbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBpc19udW1lcmljOiBmdW5jdGlvbiAobWl4ZWRfdmFyKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfbnVtZXJpYyhtaXhlZF92YXIpXG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIG9mIHR5cGUgQXJyYXkuXG4gICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2lzQXJyYXkjUG9seWZpbGxcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGFyZ1xuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIGlzQXJyYXk6IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEFycmF5IGRpZmYgYmFzZWQgb24gUEhQIGZ1bmN0aW9uIGFycmF5X2RpZmYuXG4gICAgICAgICAqIGh0dHA6Ly9waHAubmV0L21hbnVhbC9lcy9mdW5jdGlvbi5hcnJheV9kaWZmLnBocFxuICAgICAgICAgKiBodHRwOi8vcGhwanMub3JnL2Z1bmN0aW9ucy9hcnJheV9kaWZmL1xuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gYXJyMVxuICAgICAgICAgKiBAcGFyYW0gYXJyMlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGFycmF5RGlmZjogZnVuY3Rpb24gKGFycjEsIGFycjIpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheV9kaWZmKGFycjEsIGFycjIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHR3byBhcnJheXMgYXJlIGVxdWFsIHRvIG9uZSBhbm90aGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gYXJyMVxuICAgICAgICAgKiBAcGFyYW0gYXJyMlxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGFycmF5RXF1YWxzOiBmdW5jdGlvbiAoYXJyMSwgYXJyMikge1xuICAgICAgICAgICAgaWYgKCEgdGhpcy5pc0FycmF5KGFycjEpIHx8ICEgdGhpcy5pc0FycmF5KGFycjIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gJC5pc0VtcHR5T2JqZWN0KHRoaXMuYXJyYXlEaWZmKGFycjEsIGFycjIpKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFrZXMgZWxlbWVudCBkZXBlbmRhbnQgZnJvbSBvdGhlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcGVuZGVudEVsZW1lbnQ6IGZ1bmN0aW9uKHZhbGlkYXRvciwgZWxlbWVudCwgbmFtZSkge1xuXG4gICAgICAgICAgICB2YXIgZWw9dmFsaWRhdG9yLmZpbmRCeU5hbWUobmFtZSk7XG5cbiAgICAgICAgICAgIGlmICggZWxbMF0hPT11bmRlZmluZWQgICYmIHZhbGlkYXRvci5zZXR0aW5ncy5vbmZvY3Vzb3V0ICkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9ICdibHVyJztcbiAgICAgICAgICAgICAgICBpZiAoZWxbMF0udGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHxcbiAgICAgICAgICAgICAgICAgICAgZWxbMF0udGFnTmFtZSA9PT0gJ09QVElPTicgfHxcbiAgICAgICAgICAgICAgICAgICAgZWxbMF0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fFxuICAgICAgICAgICAgICAgICAgICBlbFswXS50eXBlID09PSAncmFkaW8nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gJ2NsaWNrJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcnVsZU5hbWUgPSAnLnZhbGlkYXRlLWxhcmF2ZWxWYWxpZGF0aW9uJztcbiAgICAgICAgICAgICAgICBlbC5vZmYoIHJ1bGVOYW1lIClcbiAgICAgICAgICAgICAgICAgICAgLm9mZihldmVudCArIHJ1bGVOYW1lICsgJy0nICsgZWxlbWVudC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAub24oIGV2ZW50ICsgcnVsZU5hbWUgKyAnLScgKyBlbGVtZW50Lm5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCggZWxlbWVudCApLnZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxbMF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlcyBlcnJvciBBamF4IHJlc3BvbnNlIGFuZCBnZXRzIHRoZSBtZXNzYWdlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2VFcnJvclJlc3BvbnNlOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHZhciBuZXdSZXNwb25zZSA9IFsnV2hvb3BzLCBsb29rcyBsaWtlIHNvbWV0aGluZyB3ZW50IHdyb25nLiddO1xuICAgICAgICAgICAgaWYgKCdyZXNwb25zZVRleHQnIGluIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0Lm1hdGNoKC88aDFcXHMqPiguKik8XFwvaDFcXHMqPi9pKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FycmF5KGVycm9yTXNnKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdSZXNwb25zZSA9IFtlcnJvck1zZ1sxXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld1Jlc3BvbnNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFc2NhcGUgc3RyaW5nIHRvIHVzZSBhcyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzdHJcbiAgICAgICAgICogQHJldHVybnMgc3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBlc2NhcGVSZWdFeHA6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1xcLVxcW1xcXVxcL1xce1xcfVxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXF5cXCRcXHxdL2csIFwiXFxcXCQmXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZW5lcmF0ZSBSZWdFeHAgZnJvbSB3aWxkY2FyZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gbmFtZVxuICAgICAgICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgICAgICAgKi9cbiAgICAgICAgcmVnZXhGcm9tV2lsZGNhcmQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB2YXIgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnWypdJyk7XG4gICAgICAgICAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA9PT0gMSkgbmFtZVBhcnRzLnB1c2goJycpO1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXicgKyBuYW1lUGFydHMubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFyYXZlbFZhbGlkYXRpb24uaGVscGVycy5lc2NhcGVSZWdFeHAoeClcbiAgICAgICAgICAgIH0pLmpvaW4oJ1xcXFxbW15cXFxcXV0qXFxcXF0nKSArICckJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1lcmdlIGFkZGl0aW9uYWwgbGFyYXZlbCB2YWxpZGF0aW9uIHJ1bGVzIGludG8gdGhlIGN1cnJlbnQgcnVsZSBzZXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBydWxlc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UnVsZXNcbiAgICAgICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgICAgICovXG4gICAgICAgIG1lcmdlUnVsZXM6IGZ1bmN0aW9uIChydWxlcywgbmV3UnVsZXMpIHtcbiAgICAgICAgICAgIHZhciBydWxlc0xpc3QgPSB7XG4gICAgICAgICAgICAgICAgJ2xhcmF2ZWxWYWxpZGF0aW9uJzogbmV3UnVsZXMubGFyYXZlbFZhbGlkYXRpb24gfHwgW10sXG4gICAgICAgICAgICAgICAgJ2xhcmF2ZWxWYWxpZGF0aW9uUmVtb3RlJzogbmV3UnVsZXMubGFyYXZlbFZhbGlkYXRpb25SZW1vdGUgfHwgW11cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBydWxlc0xpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZXNMaXN0W2tleV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZXNba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBydWxlc1trZXldID0gW107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcnVsZXNba2V5XSA9IHJ1bGVzW2tleV0uY29uY2F0KHJ1bGVzTGlzdFtrZXldKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIVE1MIGVudGl0eSBlbmNvZGUgYSBzdHJpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzdHJpbmdcbiAgICAgICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIGVuY29kZTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuICQoJzxkaXYvPicpLnRleHQoc3RyaW5nKS5odG1sKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb2t1cCBuYW1lIGluIGFuIGFycmF5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsaWRhdG9yXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgaW4gZG90IG5vdGF0aW9uIGZvcm1hdC5cbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBmaW5kQnlBcnJheU5hbWU6IGZ1bmN0aW9uICh2YWxpZGF0b3IsIG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBzcU5hbWUgPSBuYW1lLnJlcGxhY2UoL1xcLihbXlxcLl0rKS9nLCAnWyQxXScpLFxuICAgICAgICAgICAgICAgIGxvb2t1cHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZG90IHRvIHNxdWFyZSBicmFja2V0cy4gZS5nLiBmb28uYmFyLjAgYmVjb21lcyBmb29bYmFyXVswXVxuICAgICAgICAgICAgICAgICAgICBzcU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBbXSB0byB0aGUgbmFtZSBlLmcuIGZvbyBiZWNvbWVzIGZvb1tdIG9yIGZvby5iYXIuMCBiZWNvbWVzIGZvb1tiYXJdWzBdW11cbiAgICAgICAgICAgICAgICAgICAgc3FOYW1lICsgJ1tdJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGtleSBmcm9tIGxhc3QgYXJyYXkgZS5nLiBmb29bYmFyXVswXSBiZWNvbWVzIGZvb1tiYXJdW11cbiAgICAgICAgICAgICAgICAgICAgc3FOYW1lLnJlcGxhY2UoLyguKilcXFsoLiopXFxdJC9nLCAnJDFbXScpXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb29rdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB2YWxpZGF0b3IuZmluZEJ5TmFtZShsb29rdXBzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICQobnVsbCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEF0dGVtcHQgdG8gZmluZCBhbiBlbGVtZW50IGluIHRoZSBET00gbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUuXG4gICAgICAgICAqIEV4YW1wbGUgbmFtZXMgaW5jbHVkZTpcbiAgICAgICAgICogICAgLSBkb21haW4uMCB3aGljaCBtYXRjaGVzIGRvbWFpbltdXG4gICAgICAgICAqICAgIC0gY3VzdG9tZmllbGQuMyB3aGljaCBtYXRjaGVzIGN1c3RvbWZpZWxkWzNdXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0b3JcbiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgICAgICogQHJldHVybnMgeyp9XG4gICAgICAgICAqL1xuICAgICAgICBmaW5kQnlOYW1lOiBmdW5jdGlvbiAodmFsaWRhdG9yLCBuYW1lKSB7XG4gICAgICAgICAgICAvLyBFeGFjdCBtYXRjaC5cbiAgICAgICAgICAgIHZhciBlbGVtID0gdmFsaWRhdG9yLmZpbmRCeU5hbWUobmFtZSk7XG4gICAgICAgICAgICBpZiAoZWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbmQgbmFtZSBpbiBkYXRhLCB1c2luZyBkb3Qgbm90YXRpb24uXG4gICAgICAgICAgICB2YXIgZGVsaW0gPSAnLicsXG4gICAgICAgICAgICAgICAgcGFydHMgID0gbmFtZS5zcGxpdChkZWxpbSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlY29uc3RydWN0ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGk7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkLnB1c2gocGFydHNbY10pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVsZW0gPSB0aGlzLmZpbmRCeUFycmF5TmFtZSh2YWxpZGF0b3IsIHJlY29uc3RydWN0ZWQuam9pbihkZWxpbSkpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJChudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgaXQncyBhbiBhcnJheSBlbGVtZW50LCBnZXQgYWxsIHZhbHVlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudFxuICAgICAgICAgKiBAcmV0dXJucyB7KnxzdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICBhbGxFbGVtZW50VmFsdWVzOiBmdW5jdGlvbiAodmFsaWRhdG9yLCBlbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5uYW1lLmluZGV4T2YoJ1tdJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5maW5kQnlOYW1lKGVsZW1lbnQubmFtZSkubWFwKGZ1bmN0aW9uIChpLCBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3IuZWxlbWVudFZhbHVlKGUpO1xuICAgICAgICAgICAgICAgIH0pLmdldCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLmVsZW1lbnRWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn0pO1xuIl0sIm5hbWVzIjpbInN0cmxlbiIsImFycmF5X2RpZmYiLCJzdHJ0b3RpbWUiLCJpc19udW1lcmljIiwiJCIsImV4dGVuZCIsImxhcmF2ZWxWYWxpZGF0aW9uIiwiaGVscGVycyIsIm51bWVyaWNSdWxlcyIsImZpbGVpbmZvIiwiZmllbGRPYmoiLCJpbmRleCIsIkZpbGVOYW1lIiwidmFsdWUiLCJmaWxlcyIsImZpbGUiLCJleHRlbnNpb24iLCJzdWJzdHIiLCJsYXN0SW5kZXhPZiIsInNpemUiLCJ0eXBlIiwic2VsZWN0b3IiLCJuYW1lcyIsImlzQXJyYXkiLCJpIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJoYXNOdW1lcmljUnVsZXMiLCJlbGVtZW50IiwiaGFzUnVsZXMiLCJydWxlcyIsImZvdW5kIiwidmFsaWRhdG9yIiwiZGF0YSIsImZvcm0iLCJsaXN0UnVsZXMiLCJjYWNoZSIsImFycmF5UnVsZXNDYWNoZSIsIm5hbWUiLCJlYWNoIiwiYXJyYXlSdWxlIiwic2V0dGluZ3MiLCJvYmpSdWxlcyIsIl9ydWxlcyIsImluQXJyYXkiLCJzdHJpbmciLCJnZXRTaXplIiwib2JqIiwicGFyc2VGbG9hdCIsIk1hdGgiLCJmbG9vciIsImdldExhcmF2ZWxWYWxpZGF0aW9uIiwicnVsZSIsInVuZGVmaW5lZCIsInN0YXRpY1J1bGVzIiwia2V5IiwicGFyc2VUaW1lIiwiZm9ybWF0IiwidGltZVZhbHVlIiwiZm10IiwiRGF0ZUZvcm1hdHRlciIsImRhdGVSdWxlIiwicGFyc2VEYXRlIiwiRGF0ZSIsImZvcm1hdERhdGUiLCJyb3VuZCIsImdldFRpbWUiLCJjb21wYXJlRGF0ZXMiLCJwYXJhbXMiLCJvcGVyYXRvciIsInRpbWVDb21wYXJlIiwidGFyZ2V0IiwiZGVwZW5kZW50RWxlbWVudCIsImVsZW1lbnRWYWx1ZSIsIkVycm9yIiwiZ3Vlc3NEYXRlIiwidGV4dCIsIm5vdyIsIm1peGVkX3ZhciIsImFyZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiY2FsbCIsImFycmF5RGlmZiIsImFycjEiLCJhcnIyIiwiYXJyYXlFcXVhbHMiLCJpc0VtcHR5T2JqZWN0IiwiZWwiLCJmaW5kQnlOYW1lIiwib25mb2N1c291dCIsImV2ZW50IiwidGFnTmFtZSIsInJ1bGVOYW1lIiwib2ZmIiwib24iLCJ2YWxpZCIsInBhcnNlRXJyb3JSZXNwb25zZSIsInJlc3BvbnNlIiwibmV3UmVzcG9uc2UiLCJlcnJvck1zZyIsInJlc3BvbnNlVGV4dCIsIm1hdGNoIiwiZXNjYXBlUmVnRXhwIiwic3RyIiwicmVwbGFjZSIsInJlZ2V4RnJvbVdpbGRjYXJkIiwibmFtZVBhcnRzIiwic3BsaXQiLCJSZWdFeHAiLCJtYXAiLCJ4IiwibWVyZ2VSdWxlcyIsIm5ld1J1bGVzIiwicnVsZXNMaXN0IiwibGFyYXZlbFZhbGlkYXRpb25SZW1vdGUiLCJjb25jYXQiLCJlbmNvZGUiLCJodG1sIiwiZmluZEJ5QXJyYXlOYW1lIiwic3FOYW1lIiwibG9va3VwcyIsImVsZW0iLCJkZWxpbSIsInBhcnRzIiwicmVjb25zdHJ1Y3RlZCIsImMiLCJhbGxFbGVtZW50VmFsdWVzIiwiaW5kZXhPZiIsImUiLCJnZXQiXSwic291cmNlUm9vdCI6IiJ9
/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Timezone Helper functions used by validators
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

$.extend(true, laravelValidation, {

    helpers: {

        /**
         * Check if the specified timezone is valid.
         *
         * @param value
         * @returns {boolean}
         */
        isTimezone: function (value) {

            var timezones={
                "africa": [
                    "abidjan",
                    "accra",
                    "addis_ababa",
                    "algiers",
                    "asmara",
                    "bamako",
                    "bangui",
                    "banjul",
                    "bissau",
                    "blantyre",
                    "brazzaville",
                    "bujumbura",
                    "cairo",
                    "casablanca",
                    "ceuta",
                    "conakry",
                    "dakar",
                    "dar_es_salaam",
                    "djibouti",
                    "douala",
                    "el_aaiun",
                    "freetown",
                    "gaborone",
                    "harare",
                    "johannesburg",
                    "juba",
                    "kampala",
                    "khartoum",
                    "kigali",
                    "kinshasa",
                    "lagos",
                    "libreville",
                    "lome",
                    "luanda",
                    "lubumbashi",
                    "lusaka",
                    "malabo",
                    "maputo",
                    "maseru",
                    "mbabane",
                    "mogadishu",
                    "monrovia",
                    "nairobi",
                    "ndjamena",
                    "niamey",
                    "nouakchott",
                    "ouagadougou",
                    "porto-novo",
                    "sao_tome",
                    "tripoli",
                    "tunis",
                    "windhoek"
                ],
                "america": [
                    "adak",
                    "anchorage",
                    "anguilla",
                    "antigua",
                    "araguaina",
                    "argentina\/buenos_aires",
                    "argentina\/catamarca",
                    "argentina\/cordoba",
                    "argentina\/jujuy",
                    "argentina\/la_rioja",
                    "argentina\/mendoza",
                    "argentina\/rio_gallegos",
                    "argentina\/salta",
                    "argentina\/san_juan",
                    "argentina\/san_luis",
                    "argentina\/tucuman",
                    "argentina\/ushuaia",
                    "aruba",
                    "asuncion",
                    "atikokan",
                    "bahia",
                    "bahia_banderas",
                    "barbados",
                    "belem",
                    "belize",
                    "blanc-sablon",
                    "boa_vista",
                    "bogota",
                    "boise",
                    "cambridge_bay",
                    "campo_grande",
                    "cancun",
                    "caracas",
                    "cayenne",
                    "cayman",
                    "chicago",
                    "chihuahua",
                    "costa_rica",
                    "creston",
                    "cuiaba",
                    "curacao",
                    "danmarkshavn",
                    "dawson",
                    "dawson_creek",
                    "denver",
                    "detroit",
                    "dominica",
                    "edmonton",
                    "eirunepe",
                    "el_salvador",
                    "fortaleza",
                    "glace_bay",
                    "godthab",
                    "goose_bay",
                    "grand_turk",
                    "grenada",
                    "guadeloupe",
                    "guatemala",
                    "guayaquil",
                    "guyana",
                    "halifax",
                    "havana",
                    "hermosillo",
                    "indiana\/indianapolis",
                    "indiana\/knox",
                    "indiana\/marengo",
                    "indiana\/petersburg",
                    "indiana\/tell_city",
                    "indiana\/vevay",
                    "indiana\/vincennes",
                    "indiana\/winamac",
                    "inuvik",
                    "iqaluit",
                    "jamaica",
                    "juneau",
                    "kentucky\/louisville",
                    "kentucky\/monticello",
                    "kralendijk",
                    "la_paz",
                    "lima",
                    "los_angeles",
                    "lower_princes",
                    "maceio",
                    "managua",
                    "manaus",
                    "marigot",
                    "martinique",
                    "matamoros",
                    "mazatlan",
                    "menominee",
                    "merida",
                    "metlakatla",
                    "mexico_city",
                    "miquelon",
                    "moncton",
                    "monterrey",
                    "montevideo",
                    "montreal",
                    "montserrat",
                    "nassau",
                    "new_york",
                    "nipigon",
                    "nome",
                    "noronha",
                    "north_dakota\/beulah",
                    "north_dakota\/center",
                    "north_dakota\/new_salem",
                    "ojinaga",
                    "panama",
                    "pangnirtung",
                    "paramaribo",
                    "phoenix",
                    "port-au-prince",
                    "port_of_spain",
                    "porto_velho",
                    "puerto_rico",
                    "rainy_river",
                    "rankin_inlet",
                    "recife",
                    "regina",
                    "resolute",
                    "rio_branco",
                    "santa_isabel",
                    "santarem",
                    "santiago",
                    "santo_domingo",
                    "sao_paulo",
                    "scoresbysund",
                    "shiprock",
                    "sitka",
                    "st_barthelemy",
                    "st_johns",
                    "st_kitts",
                    "st_lucia",
                    "st_thomas",
                    "st_vincent",
                    "swift_current",
                    "tegucigalpa",
                    "thule",
                    "thunder_bay",
                    "tijuana",
                    "toronto",
                    "tortola",
                    "vancouver",
                    "whitehorse",
                    "winnipeg",
                    "yakutat",
                    "yellowknife"
                ],
                "antarctica": [
                    "casey",
                    "davis",
                    "dumontdurville",
                    "macquarie",
                    "mawson",
                    "mcmurdo",
                    "palmer",
                    "rothera",
                    "south_pole",
                    "syowa",
                    "vostok"
                ],
                "arctic": [
                    "longyearbyen"
                ],
                "asia": [
                    "aden",
                    "almaty",
                    "amman",
                    "anadyr",
                    "aqtau",
                    "aqtobe",
                    "ashgabat",
                    "baghdad",
                    "bahrain",
                    "baku",
                    "bangkok",
                    "beirut",
                    "bishkek",
                    "brunei",
                    "choibalsan",
                    "chongqing",
                    "colombo",
                    "damascus",
                    "dhaka",
                    "dili",
                    "dubai",
                    "dushanbe",
                    "gaza",
                    "harbin",
                    "hebron",
                    "ho_chi_minh",
                    "hong_kong",
                    "hovd",
                    "irkutsk",
                    "jakarta",
                    "jayapura",
                    "jerusalem",
                    "kabul",
                    "kamchatka",
                    "karachi",
                    "kashgar",
                    "kathmandu",
                    "khandyga",
                    "kolkata",
                    "krasnoyarsk",
                    "kuala_lumpur",
                    "kuching",
                    "kuwait",
                    "macau",
                    "magadan",
                    "makassar",
                    "manila",
                    "muscat",
                    "nicosia",
                    "novokuznetsk",
                    "novosibirsk",
                    "omsk",
                    "oral",
                    "phnom_penh",
                    "pontianak",
                    "pyongyang",
                    "qatar",
                    "qyzylorda",
                    "rangoon",
                    "riyadh",
                    "sakhalin",
                    "samarkand",
                    "seoul",
                    "shanghai",
                    "singapore",
                    "taipei",
                    "tashkent",
                    "tbilisi",
                    "tehran",
                    "thimphu",
                    "tokyo",
                    "ulaanbaatar",
                    "urumqi",
                    "ust-nera",
                    "vientiane",
                    "vladivostok",
                    "yakutsk",
                    "yekaterinburg",
                    "yerevan"
                ],
                "atlantic": [
                    "azores",
                    "bermuda",
                    "canary",
                    "cape_verde",
                    "faroe",
                    "madeira",
                    "reykjavik",
                    "south_georgia",
                    "st_helena",
                    "stanley"
                ],
                "australia": [
                    "adelaide",
                    "brisbane",
                    "broken_hill",
                    "currie",
                    "darwin",
                    "eucla",
                    "hobart",
                    "lindeman",
                    "lord_howe",
                    "melbourne",
                    "perth",
                    "sydney"
                ],
                "europe": [
                    "amsterdam",
                    "andorra",
                    "athens",
                    "belgrade",
                    "berlin",
                    "bratislava",
                    "brussels",
                    "bucharest",
                    "budapest",
                    "busingen",
                    "chisinau",
                    "copenhagen",
                    "dublin",
                    "gibraltar",
                    "guernsey",
                    "helsinki",
                    "isle_of_man",
                    "istanbul",
                    "jersey",
                    "kaliningrad",
                    "kiev",
                    "lisbon",
                    "ljubljana",
                    "london",
                    "luxembourg",
                    "madrid",
                    "malta",
                    "mariehamn",
                    "minsk",
                    "monaco",
                    "moscow",
                    "oslo",
                    "paris",
                    "podgorica",
                    "prague",
                    "riga",
                    "rome",
                    "samara",
                    "san_marino",
                    "sarajevo",
                    "simferopol",
                    "skopje",
                    "sofia",
                    "stockholm",
                    "tallinn",
                    "tirane",
                    "uzhgorod",
                    "vaduz",
                    "vatican",
                    "vienna",
                    "vilnius",
                    "volgograd",
                    "warsaw",
                    "zagreb",
                    "zaporozhye",
                    "zurich"
                ],
                "indian": [
                    "antananarivo",
                    "chagos",
                    "christmas",
                    "cocos",
                    "comoro",
                    "kerguelen",
                    "mahe",
                    "maldives",
                    "mauritius",
                    "mayotte",
                    "reunion"
                ],
                "pacific": [
                    "apia",
                    "auckland",
                    "chatham",
                    "chuuk",
                    "easter",
                    "efate",
                    "enderbury",
                    "fakaofo",
                    "fiji",
                    "funafuti",
                    "galapagos",
                    "gambier",
                    "guadalcanal",
                    "guam",
                    "honolulu",
                    "johnston",
                    "kiritimati",
                    "kosrae",
                    "kwajalein",
                    "majuro",
                    "marquesas",
                    "midway",
                    "nauru",
                    "niue",
                    "norfolk",
                    "noumea",
                    "pago_pago",
                    "palau",
                    "pitcairn",
                    "pohnpei",
                    "port_moresby",
                    "rarotonga",
                    "saipan",
                    "tahiti",
                    "tarawa",
                    "tongatapu",
                    "wake",
                    "wallis"
                ],
                "utc": [
                    ""
                ]
            };

            var tzparts= value.split('/',2);
            var continent=tzparts[0].toLowerCase();
            var city='';
            if (tzparts[1]) {
                city=tzparts[1].toLowerCase();
            }

            return (continent in timezones && ( timezones[continent].length===0 || timezones[continent].indexOf(city)!==-1))
        }
    }
});

/*!
 * Laravel Javascript Validation
 *
 * https://github.com/proengsoft/laravel-jsvalidation
 *
 * Methods that implement Laravel Validations
 *
 * Copyright (c) 2017 Proengsoft
 * Released under the MIT license
 */

$.extend(true, laravelValidation, {

    methods:{

        helpers: laravelValidation.helpers,

        jsRemoteTimer:0,

        /**
         * "Validate" optional attributes.
         * Always returns true, just lets us put sometimes in rules.
         *
         * @return {boolean}
         */
        Sometimes: function() {
            return true;
        },

        /**
         * Bail This is the default behaivour os JSValidation.
         * Always returns true, just lets us put sometimes in rules.
         *
         * @return {boolean}
         */
        Bail: function() {
            return true;
        },

        /**
         * "Indicate" validation should pass if value is null.
         * Always returns true, just lets us put "nullable" in rules.
         *
         * @return {boolean}
         */
        Nullable: function() {
            return true;
        },

        /**
         * Validate the given attribute is filled if it is present.
         */
        Filled: function(value, element) {
            return $.validator.methods.required.call(this, value, element, true);
        },


        /**
         * Validate that a required attribute exists.
         */
        Required: function(value, element) {
            return  $.validator.methods.required.call(this, value, element);
        },

        /**
         * Validate that an attribute exists when any other attribute exists.
         *
         * @return {boolean}
         */
        RequiredWith: function(value, element, params) {
            var validator=this,
                required=false;
            var currentObject=this;

            $.each(params,function(i,param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required=required || (
                    target!==undefined &&
                    $.validator.methods.required.call(
                        validator,
                        currentObject.elementValue(target),
                        target,true
                    ));
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when all other attribute exists.
         *
         * @return {boolean}
         */
        RequiredWithAll: function(value, element, params) {
            var validator=this,
                required=true;
            var currentObject=this;

            $.each(params,function(i,param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required = required && (
                      target!==undefined &&
                      $.validator.methods.required.call(
                          validator,
                          currentObject.elementValue(target),
                          target,true
                      ));
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when any other attribute does not exists.
         *
         * @return {boolean}
         */
        RequiredWithout: function(value, element, params) {
            var validator=this,
                required=false;
            var currentObject=this;

            $.each(params,function(i,param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required = required ||
                    target===undefined||
                    !$.validator.methods.required.call(
                        validator,
                        currentObject.elementValue(target),
                        target,true
                    );
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when all other attribute does not exists.
         *
         * @return {boolean}
         */
        RequiredWithoutAll: function(value, element, params) {
            var validator=this,
                required=true,
                currentObject=this;

            $.each(params,function(i, param) {
                var target=laravelValidation.helpers.dependentElement(
                    currentObject, element, param
                );
                required = required && (
                    target===undefined ||
                    !$.validator.methods.required.call(
                        validator,
                        currentObject.elementValue(target),
                        target,true
                    ));
            });

            if (required) {
                return  $.validator.methods.required.call(this, value, element, true);
            }
            return true;
        },

        /**
         * Validate that an attribute exists when another attribute has a given value.
         *
         * @return {boolean}
         */
        RequiredIf: function(value, element, params) {

            var target=laravelValidation.helpers.dependentElement(
                this, element, params[0]
            );

            if (target!==undefined) {
                var val=String(this.elementValue(target));
                if (typeof val !== 'undefined') {
                    var data = params.slice(1);
                    if ($.inArray(val, data) !== -1) {
                        return $.validator.methods.required.call(
                            this, value, element, true
                        );
                    }
                }
            }

            return true;
        },

        /**
         * Validate that an attribute exists when another
         * attribute does not have a given value.
         *
         * @return {boolean}
         */
        RequiredUnless: function(value, element, params) {

            var target=laravelValidation.helpers.dependentElement(
                this, element, params[0]
            );

            if (target!==undefined) {
                var val=String(this.elementValue(target));
                if (typeof val !== 'undefined') {
                    var data = params.slice(1);
                    if ($.inArray(val, data) !== -1) {
                        return true;
                    }
                }
            }

            return $.validator.methods.required.call(
                this, value, element, true
            );

        },

        /**
         * Validate that an attribute has a matching confirmation.
         *
         * @return {boolean}
         */
        Confirmed: function(value, element, params) {
            return laravelValidation.methods.Same.call(this,value, element, params);
        },

        /**
         * Validate that two attributes match.
         *
         * @return {boolean}
         */
        Same: function(value, element, params) {

            var target=laravelValidation.helpers.dependentElement(
                this, element, params[0]
            );

            if (target!==undefined) {
                return String(value) === String(this.elementValue(target));
            }
            return false;
        },

        /**
         * Validate that the values of an attribute is in another attribute.
         *
         * @param value
         * @param element
         * @param params
         * @returns {boolean}
         * @constructor
         */
        InArray: function (value, element, params) {
            if (typeof params[0] === 'undefined') {
                return false;
            }
            var elements = this.elements();
            var found = false;
            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);

            for ( var i = 0; i < elements.length ; i++ ) {
                var targetName = elements[i].name;
                if (targetName.match(nameRegExp)) {
                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);
                    found = found || equals;
                }
            }

            return found;
        },

        /**
         * Validate an attribute is unique among other values.
         *
         * @param value
         * @param element
         * @param params
         * @returns {boolean}
         */
        Distinct: function (value, element, params) {
            if (typeof params[0] === 'undefined') {
                return false;
            }

            var elements = this.elements();
            var found = false;
            var nameRegExp = laravelValidation.helpers.regexFromWildcard(params[0]);

            for ( var i = 0; i < elements.length ; i++ ) {
                var targetName = elements[i].name;
                if (targetName !== element.name && targetName.match(nameRegExp)) {
                    var equals = laravelValidation.methods.Same.call(this,value, element, [targetName]);
                    found = found || equals;
                }
            }

            return !found;
        },


        /**
         * Validate that an attribute is different from another attribute.
         *
         * @return {boolean}
         */
        Different: function(value, element, params) {
            return ! laravelValidation.methods.Same.call(this,value, element, params);
        },

        /**
         * Validate that an attribute was "accepted".
         * This validation rule implies the attribute is "required".
         *
         * @return {boolean}
         */
        Accepted: function(value) {
            var regex = new RegExp("^(?:(yes|on|1|true))$",'i');
            return regex.test(value);
        },

        /**
         * Validate that an attribute is an array.
         *
         * @param value
         * @param element
         */
        Array: function(value, element) {
            if (element.name.indexOf('[') !== -1 && element.name.indexOf(']') !== -1) {
                return true;
            }

            return laravelValidation.helpers.isArray(value);
        },

        /**
         * Validate that an attribute is a boolean.
         *
         * @return {boolean}
         */
        Boolean: function(value) {
            var regex= new RegExp("^(?:(true|false|1|0))$",'i');
            return  regex.test(value);
        },

        /**
         * Validate that an attribute is an integer.
         *
         * @return {boolean}
         */
        Integer: function(value) {
            var regex= new RegExp("^(?:-?\\d+)$",'i');
            return  regex.test(value);
        },

        /**
         * Validate that an attribute is numeric.
         */
        Numeric: function(value, element) {
            return $.validator.methods.number.call(this, value, element, true);
        },

        /**
         * Validate that an attribute is a string.
         *
         * @return {boolean}
         */
        String: function(value) {
            return typeof value === 'string';
        },

        /**
         * The field under validation must be numeric and must have an exact length of value.
         */
        Digits: function(value, element, params) {
            return (
                $.validator.methods.number.call(this, value, element, true) &&
                value.length === parseInt(params, 10)
            );
        },

        /**
         * The field under validation must have a length between the given min and max.
         */
        DigitsBetween: function(value, element, params) {
            return ($.validator.methods.number.call(this, value, element, true)
                && value.length>=parseFloat(params[0]) && value.length<=parseFloat(params[1]));
        },

        /**
         * Validate the size of an attribute.
         *
         * @return {boolean}
         */
        Size: function(value, element, params) {
            return laravelValidation.helpers.getSize(this, element,value) === parseFloat(params[0]);
        },

        /**
         * Validate the size of an attribute is between a set of values.
         *
         * @return {boolean}
         */
        Between: function(value, element, params) {
            return ( laravelValidation.helpers.getSize(this, element,value) >= parseFloat(params[0]) &&
                laravelValidation.helpers.getSize(this,element,value) <= parseFloat(params[1]));
        },

        /**
         * Validate the size of an attribute is greater than a minimum value.
         *
         * @return {boolean}
         */
        Min: function(value, element, params) {
            value = laravelValidation.helpers.allElementValues(this, element);

            return laravelValidation.helpers.getSize(this, element, value) >= parseFloat(params[0]);
        },

        /**
         * Validate the size of an attribute is less than a maximum value.
         *
         * @return {boolean}
         */
        Max: function(value, element, params) {
            value = laravelValidation.helpers.allElementValues(this, element);

            return laravelValidation.helpers.getSize(this, element, value) <= parseFloat(params[0]);
        },

        /**
         * Validate an attribute is contained within a list of values.
         *
         * @return {boolean}
         */
        In: function(value, element, params) {
            if (laravelValidation.helpers.isArray(value)
                && laravelValidation.helpers.hasRules(element, "Array")
            ) {
                var diff = laravelValidation.helpers.arrayDiff(value, params);

                return Object.keys(diff).length === 0;
            }

            return params.indexOf(value.toString()) !== -1;
        },

        /**
         * Validate an attribute is not contained within a list of values.
         *
         * @return {boolean}
         */
        NotIn: function(value, element, params) {
            return params.indexOf(value.toString()) === -1;
        },

        /**
         * Validate that an attribute is a valid IP.
         *
         * @return {boolean}
         */
        Ip: function(value) {
            return /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value) ||
                /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);
        },

        /**
         * Validate that an attribute is a valid e-mail address.
         */
        Email: function(value, element) {
            return $.validator.methods.email.call(this, value, element, true);
        },

        /**
         * Validate that an attribute is a valid URL.
         */
        Url: function(value, element) {
            return $.validator.methods.url.call(this, value, element, true);
        },

        /**
         * The field under validation must be a successfully uploaded file.
         *
         * @return {boolean}
         */
        File: function(value, element) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            if ('files' in element ) {
                return (element.files.length > 0);
            }
            return false;
        },

        /**
         * Validate the MIME type of a file upload attribute is in a set of MIME types.
         *
         * @return {boolean}
         */
        Mimes: function(value, element, params) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            var lowerParams = $.map(params, function(item) {
                return item.toLowerCase();
            });

            var fileinfo = laravelValidation.helpers.fileinfo(element);
            return (fileinfo !== false && lowerParams.indexOf(fileinfo.extension.toLowerCase())!==-1);
        },

        /**
         * The file under validation must match one of the given MIME types.
         *
         * @return {boolean}
         */
        Mimetypes: function(value, element, params) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            var lowerParams = $.map(params, function(item) {
                return item.toLowerCase();
            });

            var fileinfo = laravelValidation.helpers.fileinfo(element);

            if (fileinfo === false) {
                return false;
            }
            return (lowerParams.indexOf(fileinfo.type.toLowerCase())!==-1);
        },

        /**
         * Validate the MIME type of a file upload attribute is in a set of MIME types.
         */
        Image: function(value, element) {
            return laravelValidation.methods.Mimes.call(this, value, element, [
                'jpg', 'png', 'gif', 'bmp', 'svg', 'jpeg'
            ]);
        },

        /**
         * Validate dimensions of Image.
         *
         * @return {boolean|string}
         */
        Dimensions: function(value, element, params, callback) {
            if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
                return true;
            }
            if (element.files === null || typeof element.files[0] === 'undefined') {
                return false;
            }

            var fr = new FileReader;
            fr.onload = function () {
                var img = new Image();
                img.onload = function () {
                    var height = parseFloat(img.naturalHeight);
                    var width = parseFloat(img.naturalWidth);
                    var ratio = width / height;
                    var notValid = ((params['width']) && parseFloat(params['width'] !== width)) ||
                        ((params['min_width']) && parseFloat(params['min_width']) > width) ||
                        ((params['max_width']) && parseFloat(params['max_width']) < width) ||
                        ((params['height']) && parseFloat(params['height']) !== height) ||
                        ((params['min_height']) && parseFloat(params['min_height']) > height) ||
                        ((params['max_height']) && parseFloat(params['max_height']) < height) ||
                        ((params['ratio']) && ratio !== parseFloat(eval(params['ratio']))
                        );
                    callback(! notValid);
                };
                img.onerror = function() {
                    callback(false);
                };
                img.src = fr.result;
            };
            fr.readAsDataURL(element.files[0]);

            return 'pending';
        },

        /**
         * Validate that an attribute contains only alphabetic characters.
         *
         * @return {boolean}
         */
        Alpha: function(value) {
            if (typeof  value !== 'string') {
                return false;
            }

            var regex = new RegExp("^(?:^[a-z\u00E0-\u00FC]+$)$",'i');
            return  regex.test(value);

        },

        /**
         * Validate that an attribute contains only alpha-numeric characters.
         *
         * @return {boolean}
         */
        AlphaNum: function(value) {
            if (typeof  value !== 'string') {
                return false;
            }
            var regex = new RegExp("^(?:^[a-z0-9\u00E0-\u00FC]+$)$",'i');
            return regex.test(value);
        },

        /**
         * Validate that an attribute contains only alphabetic characters.
         *
         * @return {boolean}
         */
        AlphaDash: function(value) {
            if (typeof  value !== 'string') {
                return false;
            }
            var regex = new RegExp("^(?:^[a-z0-9\u00E0-\u00FC_-]+$)$",'i');
            return regex.test(value);
        },

        /**
         * Validate that an attribute passes a regular expression check.
         *
         * @return {boolean}
         */
        Regex: function(value, element, params) {
            var invalidModifiers=['x','s','u','X','U','A'];
            // Converting php regular expression
            var phpReg= new RegExp('^(?:\/)(.*\\\/?[^\/]*|[^\/]*)(?:\/)([gmixXsuUAJ]*)?$');
            var matches=params[0].match(phpReg);
            if (matches === null) {
                return false;
            }
            // checking modifiers
            var php_modifiers=[];
            if (matches[2]!==undefined) {
                php_modifiers=matches[2].split('');
                for (var i=0; i<php_modifiers.length<i ;i++) {
                    if (invalidModifiers.indexOf(php_modifiers[i])!==-1) {
                        return true;
                    }
                }
            }
            var regex = new RegExp("^(?:"+matches[1]+")$",php_modifiers.join());
            return   regex.test(value);
        },

        /**
         * Validate that an attribute is a valid date.
         *
         * @return {boolean}
         */
        Date: function(value) {
            return (laravelValidation.helpers.strtotime(value)!==false);
        },

        /**
         * Validate that an attribute matches a date format.
         *
         * @return {boolean}
         */
        DateFormat: function(value, element, params) {
            return laravelValidation.helpers.parseTime(value,params[0])!==false;
        },

        /**
         * Validate the date is before a given date.
         *
         * @return {boolean}
         */
        Before: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<');
        },

        /**
         * Validate the date is equal or before a given date.
         *
         * @return {boolean}
         */
        BeforeOrEqual: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '<=');
        },

        /**
         * Validate the date is after a given date.
         *
         * @return {boolean}
         */
        After: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>');
        },

        /**
         * Validate the date is equal or after a given date.
         *
         * @return {boolean}
         */
        AfterOrEqual: function(value, element, params) {
            return laravelValidation.helpers.compareDates(this, value, element, params[0], '>=');
        },


        /**
         * Validate that an attribute is a valid date.
         */
        Timezone: function(value) {
            return  laravelValidation.helpers.isTimezone(value);
        },


        /**
         * Validate the attribute is a valid JSON string.
         *
         * @param  value
         * @return bool
         */
        Json: function(value) {
            var result = true;
            try {
                JSON.parse(value);
            } catch (e) {
                result = false;
            }
            return result;
        },

        /**
         * Noop (always returns true).
         *
         * @param value
         * @returns {boolean}
         */
        ProengsoftNoop: function (value) {
            return true;
        },
    }
});

//# sourceMappingURL=jsvalidation.js.map
laravel-jsvalidation/README.md000064400000011642152434177750012161 0ustar00## Laravel Javascript Validation

![Latest Version](https://img.shields.io/github/release/proengsoft/laravel-jsvalidation.svg?style=flat-square)
![tests](https://github.com/proengsoft/laravel-jsvalidation/actions/workflows/php-tests.yml/badge.svg)
![Code Coverage](https://app.codecov.io/gh/proengsoft/laravel-jsvalidation)
![Total Downloads](https://img.shields.io/packagist/dt/proengsoft/laravel-jsvalidation.svg?style=flat-square)
![License](https://img.shields.io/badge/license-MIT-brightgreen?style=flat-square)

**Laravel Javascript Validation** package allows to reuse your Laravel [Validation Rules][], [Messages][], [FormRequest][] and [Validators][] to validate forms automatically in client side without need to write any Javascript code or use HTML Builder Class. 

You can validate forms automatically referencing it to your defined validations. The messages are loaded from your  validations and translated according your Localization preferences.

#### Supported versions

Laravel 9.x - 10.x

#### Feature overview

- Automatic creation of Javascript validation based on your [Validation Rules][] or [FormRequest][], no Javascript coding required.
- Supports other validation packages. 
- AJAX validation for [ActiveURL][], [Unique][] and [Exists][] Rules, [Custom Validation Rules][] and other validation packages
- Unobtrusive integration, you can use without Laravel Form Builder
- The package uses [Jquery Validation Plugin][]  bundled in provided script.
- Uses Laravel Localization to translate messages.

#### Supported Rules

**Almost all [Validation Rules][] provided by Laravel and other packages are supported**.

Almost are validated in client-side using Javascript, but in some cases, the validation should to be done in server-side via AJAX:
 - [ActiveURL][]
 - [Unique][]
 - [Exists][]
 - [Custom Validation Rules][]
 - Validations provided by other packages

##### Unsupported Rules

Some Laravel validations are not implemented yet.
    
- [Present][] 
- [DateFormat][] rule don't support timezone format

#### Getting started

The easiest way to create Javascript validations is using [Laravel Form Request Validation][].

##### Installation

Follow the [Installation Guide][] to install the package. **The default config should work out-of-box**

##### Validating Form Request

Call [JsValidator Facade][] in your view to validate any [FormRequest](https://laravel.com/docs/master/validation)
 
```html
<form>
    <!-- ... My form stuff ... -->
</form>

<!-- Javascript Requirements -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>

<!-- Laravel Javascript Validation -->
<script type="text/javascript" src="{{ asset('vendor/jsvalidation/js/jsvalidation.js')}}"></script>

{!! JsValidator::formRequest('App\Http\Requests\MyFormRequest') !!}
```

Take a look to [Basic Usage](https://github.com/proengsoft/laravel-jsvalidation/wiki/Basic-Usage) or [Examples](https://github.com/proengsoft/laravel-jsvalidation/wiki/Validating-Examples) to get more information.

#### Documentation

**To get more info refer to [Project Wiki](https://github.com/proengsoft/laravel-jsvalidation/wiki/Home)**

#### Changelog

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

#### Contributing

Please see [CONTRIBUTING][] for details.

#### Credits

[Laravel Javascript Validation contributors list](../../contributors)

#### License

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

[ActiveURL]: https://laravel.com/docs/5.4/validation#rule-active-url
[CONTRIBUTING]: https://github.com/proengsoft/laravel-jsvalidation/wiki/Contributing
[Custom Validations]: https://laravel.com/docs/5.4/validation#custom-validation-rules
[Custom Validation Rules]: https://laravel.com/docs/5.4/validation#custom-validation-rules
[DateFormat]: https://laravel.com/docs/5.4/validation#rule-date-format
[Exists]: https://laravel.com/docs/5.4/validation#rule-exists
[FormRequest]: https://laravel.com/docs/5.4/validation#form-request-validation
[Installation Guide]: https://github.com/proengsoft/laravel-jsvalidation/wiki/Installation
[JsValidator Facade]: https://github.com/proengsoft/laravel-jsvalidation/wiki/Facade
[JQueryValidation]: https://jqueryvalidation.org/
[JQuery Validation Plugin]: https://jqueryvalidation.org/
[Laravel Form Request Validation]: http://laravel.com/docs/5.4/validation#form-request-validation
[Laravel Localization]: https://laravel.com/docs/5.4/localization
[Messages]: https://laravel.com/docs/5.4/validation#error-messages-and-views
[Present]: https://laravel.com/docs/5.4/validation#rule-present
[Unique]: https://laravel.com/docs/5.4/validation#rule-unique
[Validation]: https://laravel.com/docs/5.4/validation 
[Validation Rules]: https://laravel.com/docs/5.4/validation#available-validation-rules
[Validators]: https://laravel.com/docs/5.4/validation#form-request-validation
laravel-jsvalidation/config/jsvalidation.php000064400000002773152434177750015354 0ustar00<?php

return [

    /*
     * Default view used to render Javascript validation code
     *
     * Supported: 'jsvalidation::bootstrap', 'jsvalidation::bootstrap4', 'jsvalidation::bootstrap5', 'jsvalidation::uikit'
     */
    'view' => 'jsvalidation::bootstrap',

    /*
     * Default JQuery selector find the form to be validated.
     * By default, the validations are applied to all forms.
     */
    'form_selector' => 'form',

    /*
     * If you change the focus on detect some error then active
     * this parameter to move the focus to the first error found.
     */
    'focus_on_error' => false,

    /*
     * Duration time for the animation when We are moving the focus
     * to the first error, http://api.jquery.com/animate/ for more information.
     */
    'duration_animate' => 1000,

    /*
     * Enable or disable Ajax validations of Database and custom rules.
     * By default Unique, ActiveURL, Exists and custom validations are validated via AJAX
     */
    'disable_remote_validation' => false,

    /*
     * Field name used in the remote validation Ajax request
     * You can change this value to avoid conflicts wth your field names
     */
    'remote_validation_field' => '_jsvalidation',

    /*
     * Whether to escape all validation messages with htmlentities.
     */
    'escape' => true,

    /*
     * Set a default value for the validate ignore property.
     *
     * See https://jqueryvalidation.org/validate/#ignore
     */
    'ignore' => ":hidden, [contenteditable='true']",
];