UNPKG

acr-assist-simulator-module

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.

380 lines 63.4 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes} checked by tsc
 */
import { Component, Input } from '@angular/core';
import { DurationDataElement } from '../../../core/elements/models/duration-data-element.model';
import { FormBuilder, Validators } from '@angular/forms';
import { SimulatorEngineService } from '../../../core/services/simulator-engine.service';
import { SimulatorCommunicationService } from '../../shared/services/simulator-communication.service';
var AssistDurationElementComponent = /** @class */ (function () {
    function AssistDurationElementComponent(formBuilder, simulatorEngineService, simulatorCommunicationService) {
        var _this = this;
        this.formBuilder = formBuilder;
        this.simulatorEngineService = simulatorEngineService;
        this.supportedUnits = {
            millisecond: {
                'label': 'Millisecond',
                'max': 999,
                'min': 0,
                'value': 0,
                'step': 1
            },
            second: {
                'label': 'Second',
                'max': 59,
                'min': 0,
                'value': 0,
                'step': 1
            },
            minute: {
                'label': 'Minutes',
                'max': 59,
                'min': 0,
                'value': 0,
                'step': 1
            },
            hour: {
                'label': 'Hours',
                'max': 23,
                'min': 0,
                'value': 0,
                'step': 1
            },
            day: {
                'label': 'Days',
                'max': 7,
                'min': 0,
                'value': 0,
                'step': 1
            },
            week: {
                'label': 'Week',
                'max': 51,
                'min': 0,
                'value': 0,
                'step': 1
            }
        };
        this.daysvalue = 0;
        this.hoursvalue = 0;
        this.minutesvalue = 0;
        this.DurationVal = 'PT0S';
        this.durationOptions = {
            showNegative: false,
            showPreview: false,
            showYears: false,
            showMonths: false,
            showWeeks: false,
            min: 0
        };
        this.showdayminValidation = false;
        this.showdaymaxValidation = false;
        this.showminutemaxValidation = false;
        this.showminuteminValidation = false;
        this.showhourminValidation = false;
        this.showhourmaxValidation = false;
        this.subscription = simulatorCommunicationService.simulatorSource$.subscribe(function (mission) {
            _this.SetRangeValuesForDurationPicker();
            _this.UpdateFormValidator();
        });
    }
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        this.SetRangeValuesForDurationPicker();
        this.createDurationElementForm();
        this.onChanges();
    };
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.ResetValidationVisibility = /**
     * @return {?}
     */
    function () {
        this.showdayminValidation = false;
        this.showdaymaxValidation = false;
        this.showminutemaxValidation = false;
        this.showminuteminValidation = false;
        this.showhourminValidation = false;
        this.showhourmaxValidation = false;
    };
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.onChanges = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.durationElementForm.statusChanges
            .subscribe(function (val) {
            _this.ResetValidationVisibility();
            if (_this.durationElementForm.controls['durationdayselement'].invalid
                && _this.durationElementForm.controls['durationdayselement'].errors["max"]) {
                _this.showdaymaxValidation = true;
            }
            else if (_this.durationElementForm.controls['durationdayselement'].invalid
                && _this.durationElementForm.controls['durationdayselement'].errors["min"]) {
                _this.showdayminValidation = true;
            }
            else if (_this.durationElementForm.controls['durationminuteselement'].invalid
                && _this.durationElementForm.controls['durationminuteselement'].errors["min"]) {
                _this.showminuteminValidation = true;
            }
            else if (_this.durationElementForm.controls['durationminuteselement'].invalid
                && _this.durationElementForm.controls['durationminuteselement'].errors["max"]) {
                _this.showminutemaxValidation = true;
            }
            else if (_this.durationElementForm.controls['durationhourselement'].invalid
                && _this.durationElementForm.controls['durationhourselement'].errors["min"]) {
                _this.showhourminValidation = true;
            }
            else if (_this.durationElementForm.controls['durationhourselement'].invalid
                && _this.durationElementForm.controls['durationhourselement'].errors["max"]) {
                _this.showhourmaxValidation = true;
            }
        });
    };
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.SetRangeValuesForDurationPicker = /**
     * @return {?}
     */
    function () {
        var /** @type {?} */ $element = this.durationDataElement;
        this.supportedUnits['day'].min = $element.MinimumDay !== undefined && $element.MinimumDay != null ?
            $element.MinimumDay : 0;
        this.supportedUnits['hour'].min = $element.MinimumHours !== undefined && $element.MinimumHours != null ?
            $element.MinimumHours : 0;
        this.supportedUnits['minute'].min = $element.MinimumMinutes !== undefined && $element.MinimumMinutes != null ?
            $element.MinimumMinutes : 0;
        this.supportedUnits['day'].max = $element.MaximumDay !== undefined && $element.MaximumDay != null ?
            $element.MaximumDay : 9007199254740991;
        this.supportedUnits['hour'].max = $element.MaximumHours !== undefined && $element.MaximumHours != null ?
            $element.MaximumHours : 9007199254740991;
        this.supportedUnits['minute'].max = $element.MaxmimumMinutes !== undefined && $element.MaxmimumMinutes != null ?
            $element.MaxmimumMinutes : 9007199254740991;
    };
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.createDurationElementForm = /**
     * @return {?}
     */
    function () {
        this.durationElementForm = this.formBuilder.group({
            durationdayselement: ['', Validators.compose([Validators.required,
                    Validators.min(+this.supportedUnits['day'].min), Validators.max(+this.supportedUnits['day'].max)])],
            durationminuteselement: ['', Validators.compose([Validators.required,
                    Validators.min(+this.supportedUnits['minute'].min), Validators.max(+this.supportedUnits['minute'].max)])],
            durationhourselement: ['', Validators.compose([Validators.required,
                    Validators.min(+this.supportedUnits['hour'].min), Validators.max(+this.supportedUnits['hour'].max)])]
        });
    };
    /**
     * @param {?} event
     * @return {?}
     */
    AssistDurationElementComponent.prototype.onlyInteger = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        return (event.charCode === 8 || event.charCode === 0) ? null : event.charCode >= 48 && event.charCode <= 57;
    };
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.UpdateFormValidator = /**
     * @return {?}
     */
    function () {
        this.durationElementForm.controls['durationdayselement'].setValidators([Validators.compose([Validators.required,
                Validators.min(+this.supportedUnits['day'].min), Validators.max(+this.supportedUnits['day'].max)])]);
        this.durationElementForm.controls['durationdayselement'].updateValueAndValidity();
        this.durationElementForm.controls['durationminuteselement'].setValidators([Validators.compose([Validators.required,
                Validators.min(+this.supportedUnits['minute'].min), Validators.max(+this.supportedUnits['minute'].max)])]);
        this.durationElementForm.controls['durationminuteselement'].updateValueAndValidity();
        this.durationElementForm.controls['durationhourselement'].setValidators([Validators.compose([Validators.required,
                Validators.min(+this.supportedUnits['hour'].min), Validators.max(+this.supportedUnits['hour'].max)])]);
        this.durationElementForm.controls['durationhourselement'].updateValueAndValidity();
    };
    /**
     * @param {?} property
     * @return {?}
     */
    AssistDurationElementComponent.prototype.increaseValue = /**
     * @param {?} property
     * @return {?}
     */
    function (property) {
        var /** @type {?} */ currentValue = 0;
        switch (property) {
            case 'days':
                currentValue = this.daysvalue === undefined || this.daysvalue == null ? 0 : this.daysvalue;
                if (currentValue < this.supportedUnits['day'].max) {
                    currentValue = currentValue + this.supportedUnits['day'].step;
                }
                this.daysvalue = currentValue;
                break;
            case 'hour':
                currentValue = this.hoursvalue === undefined || this.hoursvalue == null ? 0 : this.hoursvalue;
                if (currentValue < this.supportedUnits['hour'].max) {
                    currentValue = currentValue + this.supportedUnits['hour'].step;
                }
                this.hoursvalue = currentValue;
                break;
            case 'minute':
                currentValue = this.minutesvalue === undefined || this.minutesvalue == null ? 0 : this.minutesvalue;
                if (currentValue < this.supportedUnits['minute'].max) {
                    currentValue = currentValue + this.supportedUnits['minute'].step;
                }
                this.minutesvalue = currentValue;
                break;
        }
    };
    /**
     * @param {?} property
     * @return {?}
     */
    AssistDurationElementComponent.prototype.decreaseValue = /**
     * @param {?} property
     * @return {?}
     */
    function (property) {
        var /** @type {?} */ currentValue = 0;
        switch (property) {
            case 'days':
                currentValue = this.daysvalue;
                if (currentValue > this.supportedUnits['day'].min) {
                    currentValue = currentValue - this.supportedUnits['day'].step;
                }
                this.daysvalue = currentValue;
                break;
            case 'hour':
                currentValue = this.hoursvalue;
                if (currentValue > this.supportedUnits['hour'].min) {
                    currentValue = currentValue - this.supportedUnits['hour'].step;
                }
                this.hoursvalue = currentValue;
                break;
            case 'minute':
                currentValue = this.minutesvalue;
                if (currentValue > this.supportedUnits['minute'].min) {
                    currentValue = currentValue - this.supportedUnits['minute'].step;
                }
                this.minutesvalue = currentValue;
                break;
        }
    };
    /**
     * @param {?} event
     * @param {?} property
     * @return {?}
     */
    AssistDurationElementComponent.prototype.checkValue = /**
     * @param {?} event
     * @param {?} property
     * @return {?}
     */
    function (event, property) {
        var /** @type {?} */ currentValue = 0;
        switch (property) {
            case 'days':
                currentValue = this.daysvalue;
                if (currentValue === undefined || currentValue == null) {
                    currentValue = 0;
                }
                this.daysvalue = currentValue;
                break;
            case 'hour':
                currentValue = this.hoursvalue;
                if (currentValue === undefined || currentValue == null) {
                    currentValue = 0;
                }
                this.hoursvalue = currentValue;
                break;
            case 'minute':
                currentValue = this.minutesvalue;
                if (currentValue === undefined || currentValue == null) {
                    currentValue = 0;
                }
                this.minutesvalue = currentValue;
                break;
        }
    };
    // tslint:disable-next-line:use-life-cycle-interface
    /**
     * @return {?}
     */
    AssistDurationElementComponent.prototype.ngOnDestroy = /**
     * @return {?}
     */
    function () {
        // prevent memory leak when component destroyed
        this.subscription.unsubscribe();
    };
    AssistDurationElementComponent.decorators = [
        { type: Component, args: [{
                    selector: 'acr-assist-duration-element',
                    template: "<form [formGroup]=\"durationElementForm\" novalidate>\n  <div class=\"form-group\">\n    <div class=\"col-sm-5 text-right\">\n      <label class=\"control-label break-word\">\n        <!-- {{dateTimeDataElement | json}} -->\n        {{durationDataElement.label}}\n        <span *ngIf=\"durationDataElement.unit != undefined && durationDataElement.unit != ''\">\n          ({{durationDataElement.unit}})</span>\n      </label>\n      <ng-container *ngIf=\"durationDataElement.hint !== '' && durationDataElement.hint !== undefined\">\n        <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{durationDataElement.hint}}\"></i>\n      </ng-container>\n      <!-- <ng-container *ngIf=\"durationDataElement.diagrams != undefined \">\n        <acr-hint-diagram [dataElement]=\"durationDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n      </ng-container> -->\n\n      <!-- <ng-container *ngIf=\"this.durationDataElement.isRequired\">      \n        <span *ngIf=\"DurationVal == 'PT0S' || DurationVal == null\" class=\"required-field\" title=\"Duration field should be non zero\">\n          *\n        </span>\n      </ng-container> -->\n      <ng-container *ngIf=\"this.durationDataElement.isRequired\n      && (!showdayminValidation && !showdaymaxValidation && !showminuteminValidation\n           && !showminutemaxValidation && !showhourminValidation && !showhourmaxValidation)\">\n        <span *ngIf=\"durationElementForm.controls['durationdayselement'].invalid\n         || durationElementForm.controls['durationminuteselement'].invalid\n         || durationElementForm.controls['durationhourselement'].invalid\">\n          <span *ngIf=\"durationElementForm.controls['durationdayselement'].errors != null && durationElementForm.controls['durationdayselement'].errors.required \n          || durationElementForm.controls['durationminuteselement'].errors != null && durationElementForm.controls['durationminuteselement'].errors.required \n          ||  durationElementForm.controls['durationhourselement'].errors != null && durationElementForm.controls['durationhourselement'].errors.required \"\n            class=\"required-field\" title=\"Required Field\">\n            *\n          </span>\n        </span>\n      </ng-container>      \n\n      <span *ngIf=\"showdayminValidation\"\n        class=\"required-field\" title=\" Minimum value for day is {{supportedUnits['day'].min}}\">\n        *\n      </span>\n      \n      <span *ngIf=\"showdaymaxValidation\"\n        class=\"required-field\" title=\" Maximum value for day is {{supportedUnits['day'].max}}\">\n        *\n      </span>\n\n      <span *ngIf=\"showminuteminValidation\"\n        class=\"required-field\" title=\" Minimum value for minute is {{supportedUnits['minute'].min}}\">\n        *\n      </span>\n      <span *ngIf=\"showminutemaxValidation\"\n        class=\"required-field\" title=\" Maximum value for minute is {{supportedUnits['minute'].max}}\">\n        *\n      </span>\n\n      <span *ngIf=\"showhourminValidation\"\n        class=\"required-field\" title=\" Minimum value for hour is {{supportedUnits['hour'].min}}\">\n        *\n      </span>\n      <span *ngIf=\"showhourmaxValidation\"\n        class=\"required-field\" title=\" Maximum value for hour is {{supportedUnits['hour'].max}}\">\n        *\n      </span>\n    </div>\n\n    <div class=\"col-sm-7\" style=\"display:inline-flex\">\n      <!-- <div [ngClass]=\"durationDataElement.isEditable == false ? 'disabled-picker' : ''\">\n        <ngx-duration-picker min=\"0\" formControlName=\"durationElement\" [options]=\"durationOptions\" [(value)]=\"DurationVal\"></ngx-duration-picker>\n      </div> -->\n\n\n      <!-- <div class=\"form-group\"> -->\n      <div [ngClass]=\"durationDataElement.isEditable == false ? 'disabled-picker' : ''\">\n        <table>\n          <tbody>\n            <!-- <tr class=\"text-center\">\n              <td>\n                <button type=\"button\" (click)=\"increaseValue('days')\" class=\"btn btn-link btn-decrementer\">\n                  +\n                </button>\n              </td>\n            </tr> -->\n            <tr class=\"text-center\">\n              <td class=\"input-group input-group-sm\">\n                <input tabindex=\"1\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n                  formControlName=\"durationdayselement\" [(ngModel)]=\"daysvalue\" class=\"form-control text-center txt-duration\"\n                  (blur)=\"checkValue($event, 'days')\" type=\"number\" min=\"{{supportedUnits['day'].min}}\" max=\"{{supportedUnits['day'].max}}\"\n                  (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n                <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['day'].label}}</span>\n              </td>\n            </tr>\n            <!-- <tr class=\"text-center\">\n              <td>\n                <button type=\"button\" (click)=\"decreaseValue('days')\" class=\"btn btn-link btn-decrementer\">\n                  -\n                </button>\n              </td>\n            </tr> -->\n          </tbody>\n        </table>\n      </div>\n\n      <table style=\"margin-left:10px;\">\n        <tbody>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"increaseValue('hour')\" class=\"btn btn-link btn-incrementer\">\n                +\n              </button>\n            </td>\n          </tr> -->\n          <tr class=\"text-center\">\n            <td class=\"input-group input-group-sm\">\n              <input tabindex=\"2\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n                formControlName=\"durationhourselement\" [(ngModel)]=\"hoursvalue\" class=\"form-control text-center txt-duration\"\n                (blur)=\"checkValue($event,'hour')\" type=\"number\" min=\"{{supportedUnits['hour'].min}}\" max=\"{{supportedUnits['hour'].max}}\"\n                (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n              <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['hour'].label}}</span>\n            </td>\n          </tr>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"decreaseValue('hour')\" class=\"btn btn-link btn-decrementer\">\n                -\n              </button>\n            </td>\n          </tr> -->\n        </tbody>\n      </table>\n\n      <table style=\"margin-left:10px;\">\n        <tbody>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"increaseValue('minute')\" class=\"btn btn-link btn-decrementer\">\n                +\n              </button>\n            </td>\n          </tr> -->\n          <tr class=\"text-center\">\n            <td class=\"input-group input-group-sm\">\n              <input tabindex=\"3\" [(ngModel)]=\"minutesvalue\" formControlName=\"durationminuteselement\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n                class=\"form-control text-center txt-duration\" (blur)=\"checkValue($event, 'minute')\" type=\"number\" min=\"{{supportedUnits['minute'].min}}\"\n                max=\"{{supportedUnits['minute'].max}}\" (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n              <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['minute'].label}}</span>\n            </td>\n          </tr>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"decreaseValue('minute')\" class=\"btn btn-link btn-decrementer\">\n                -\n              </button>\n            </td>\n          </tr> -->\n        </tbody>\n      </table>\n\n      <!-- </div> -->\n\n\n    </div>\n  </div>\n</form>",
                    styles: [".required-field{color:red}.disabled-picker{cursor:not-allowed}.disabled-picker:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{text-align:center}.btn-decrementer,.btn-incrementer{text-decoration:none;outline:0}.txt-duration{width:42px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:0!important;outline-offset:-2px}"]
                },] },
    ];
    /** @nocollapse */
    AssistDurationElementComponent.ctorParameters = function () { return [
        { type: FormBuilder },
        { type: SimulatorEngineService },
        { type: SimulatorCommunicationService }
    ]; };
    AssistDurationElementComponent.propDecorators = {
        durationDataElement: [{ type: Input }]
    };
    return AssistDurationElementComponent;
}());
export { AssistDurationElementComponent };
function AssistDurationElementComponent_tsickle_Closure_declarations() {
    /** @type {?} */
    AssistDurationElementComponent.prototype.durationDataElement;
    /** @type {?} */
    AssistDurationElementComponent.prototype.durationElementForm;
    /** @type {?} */
    AssistDurationElementComponent.prototype.subscription;
    /** @type {?} */
    AssistDurationElementComponent.prototype.supportedUnits;
    /** @type {?} */
    AssistDurationElementComponent.prototype.daysvalue;
    /** @type {?} */
    AssistDurationElementComponent.prototype.hoursvalue;
    /** @type {?} */
    AssistDurationElementComponent.prototype.minutesvalue;
    /** @type {?} */
    AssistDurationElementComponent.prototype.DurationVal;
    /** @type {?} */
    AssistDurationElementComponent.prototype.durationOptions;
    /** @type {?} */
    AssistDurationElementComponent.prototype.showdayminValidation;
    /** @type {?} */
    AssistDurationElementComponent.prototype.showdaymaxValidation;
    /** @type {?} */
    AssistDurationElementComponent.prototype.showminutemaxValidation;
    /** @type {?} */
    AssistDurationElementComponent.prototype.showminuteminValidation;
    /** @type {?} */
    AssistDurationElementComponent.prototype.showhourminValidation;
    /** @type {?} */
    AssistDurationElementComponent.prototype.showhourmaxValidation;
    /** @type {?} */
    AssistDurationElementComponent.prototype.formBuilder;
    /** @type {?} */
    AssistDurationElementComponent.prototype.simulatorEngineService;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLyIsInNvdXJjZXMiOlsic3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNoRyxPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRXpGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOztJQWdPcEcsd0NBQW9CLFdBQXdCLEVBQVUsc0JBQThDLEVBQ2xHLDZCQUE0RDtRQUQ5RCxpQkFPQztRQVBtQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7OEJBakQ5RTtZQUNwQixXQUFXLEVBQUU7Z0JBQ1gsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLEtBQUssRUFBRSxHQUFHO2dCQUNWLEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxDQUFDO2FBQ1Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sT0FBTyxFQUFFLFFBQVE7Z0JBQ2pCLEtBQUssRUFBRSxFQUFFO2dCQUNULEtBQUssRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxDQUFDO2FBQ1Y7WUFDRCxNQUFNLEVBQUU7Z0JB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aW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IER1cmF0aW9uRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9kdXJhdGlvbi1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc2ltdWxhdG9yLWNvbW11bmljYXRpb24uc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJkdXJhdGlvbkVsZW1lbnRGb3JtXCIgbm92YWxpZGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHRleHQtcmlnaHRcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBicmVhay13b3JkXCI+XHJcbiAgICAgICAgPCEtLSB7e2RhdGVUaW1lRGF0YUVsZW1lbnQgfCBqc29ufX0gLS0+XHJcbiAgICAgICAge3tkdXJhdGlvbkRhdGFFbGVtZW50LmxhYmVsfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImR1cmF0aW9uRGF0YUVsZW1lbnQudW5pdCAhPSB1bmRlZmluZWQgJiYgZHVyYXRpb25EYXRhRWxlbWVudC51bml0ICE9ICcnXCI+XHJcbiAgICAgICAgICAoe3tkdXJhdGlvbkRhdGFFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkdXJhdGlvbkRhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGR1cmF0aW9uRGF0YUVsZW1lbnQuaGludCAhPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnkgd2hpdGVzcGFjZVwiIHRpdGxlPVwie3tkdXJhdGlvbkRhdGFFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImR1cmF0aW9uRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJkdXJhdGlvbkRhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1oaW50LWRpYWdyYW0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoaXMuZHVyYXRpb25EYXRhRWxlbWVudC5pc1JlcXVpcmVkXCI+ICAgICAgXHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJEdXJhdGlvblZhbCA9PSAnUFQwUycgfHwgRHVyYXRpb25WYWwgPT0gbnVsbFwiIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIkR1cmF0aW9uIGZpZWxkIHNob3VsZCBiZSBub24gemVyb1wiPlxyXG4gICAgICAgICAgKlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5kdXJhdGlvbkRhdGFFbGVtZW50LmlzUmVxdWlyZWRcclxuICAgICAgJiYgKCFzaG93ZGF5bWluVmFsaWRhdGlvbiAmJiAhc2hvd2RheW1heFZhbGlkYXRpb24gJiYgIXNob3dtaW51dGVtaW5WYWxpZGF0aW9uXHJcbiAgICAgICAgICAgJiYgIXNob3dtaW51dGVtYXhWYWxpZGF0aW9uICYmICFzaG93aG91cm1pblZhbGlkYXRpb24gJiYgIXNob3dob3VybWF4VmFsaWRhdGlvbilcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgIHx8IGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgIHx8IGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uaW52YWxpZFwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzICE9IG51bGwgJiYgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmVycm9ycy5yZXF1aXJlZCBcclxuICAgICAgICAgIHx8IGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5lcnJvcnMgIT0gbnVsbCAmJiBkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10uZXJyb3JzLnJlcXVpcmVkIFxyXG4gICAgICAgICAgfHwgIGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uZXJyb3JzICE9IG51bGwgJiYgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5lcnJvcnMucmVxdWlyZWQgXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiUmVxdWlyZWQgRmllbGRcIj5cclxuICAgICAgICAgICAgKlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+ICAgICAgXHJcblxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dkYXltaW5WYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBmb3IgZGF5IGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbn19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIFxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dkYXltYXhWYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWF4aW11bSB2YWx1ZSBmb3IgZGF5IGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heH19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dtaW51dGVtaW5WYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBmb3IgbWludXRlIGlzIHt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbn19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd21pbnV0ZW1heFZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNYXhpbXVtIHZhbHVlIGZvciBtaW51dGUgaXMge3tzdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWF4fX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2hvdXJtaW5WYWxpZGF0aW9uXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBmb3IgaG91ciBpcyB7e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubWlufX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93aG91cm1heFZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNYXhpbXVtIHZhbHVlIGZvciBob3VyIGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXh9fVwiPlxyXG4gICAgICAgICpcclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCIgc3R5bGU9XCJkaXNwbGF5OmlubGluZS1mbGV4XCI+XHJcbiAgICAgIDwhLS0gPGRpdiBbbmdDbGFzc109XCJkdXJhdGlvbkRhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtcGlja2VyJyA6ICcnXCI+XHJcbiAgICAgICAgPG5neC1kdXJhdGlvbi1waWNrZXIgbWluPVwiMFwiIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9uRWxlbWVudFwiIFtvcHRpb25zXT1cImR1cmF0aW9uT3B0aW9uc1wiIFsodmFsdWUpXT1cIkR1cmF0aW9uVmFsXCI+PC9uZ3gtZHVyYXRpb24tcGlja2VyPlxyXG4gICAgICA8L2Rpdj4gLS0+XHJcblxyXG5cclxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPiAtLT5cclxuICAgICAgPGRpdiBbbmdDbGFzc109XCJkdXJhdGlvbkRhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtcGlja2VyJyA6ICcnXCI+XHJcbiAgICAgICAgPHRhYmxlPlxyXG4gICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImluY3JlYXNlVmFsdWUoJ2RheXMnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICArXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbVwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHRhYmluZGV4PVwiMVwiIFthdHRyLmRpc2FibGVkXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25kYXlzZWxlbWVudFwiIFsobmdNb2RlbCldPVwiZGF5c3ZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgdHh0LWR1cmF0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwiY2hlY2tWYWx1ZSgkZXZlbnQsICdkYXlzJylcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwie3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubWlufX1cIiBtYXg9XCJ7e3N1cHBvcnRlZFVuaXRzWydkYXknXS5tYXh9fVwiXHJcbiAgICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcigkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPnt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPCEtLSA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWNyZWFzZVZhbHVlKCdkYXlzJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGVjcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgLVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj4gLS0+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPHRhYmxlIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtcIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW5jcmVhc2VWYWx1ZSgnaG91cicpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWluY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICArXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IHRhYmluZGV4PVwiMlwiIFthdHRyLmRpc2FibGVkXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9uaG91cnNlbGVtZW50XCIgWyhuZ01vZGVsKV09XCJob3Vyc3ZhbHVlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgdHh0LWR1cmF0aW9uXCJcclxuICAgICAgICAgICAgICAgIChibHVyKT1cImNoZWNrVmFsdWUoJGV2ZW50LCdob3VyJylcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwie3tzdXBwb3J0ZWRVbml0c1snaG91ciddLm1pbn19XCIgbWF4PVwie3tzdXBwb3J0ZWRVbml0c1snaG91ciddLm1heH19XCJcclxuICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcigkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIiBzdHlsZT1cInBhZGRpbmc6IDVweDtcIj57e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVjcmVhc2VWYWx1ZSgnaG91cicpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRlY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAtXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPHRhYmxlIHN0eWxlPVwibWFyZ2luLWxlZnQ6MTBweDtcIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW5jcmVhc2VWYWx1ZSgnbWludXRlJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGVjcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCIzXCIgWyhuZ01vZGVsKV09XCJtaW51dGVzdmFsdWVcIiBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvbm1pbnV0ZXNlbGVtZW50XCIgW2F0dHIuZGlzYWJsZWRdPVwiZHVyYXRpb25EYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1jZW50ZXIgdHh0LWR1cmF0aW9uXCIgKGJsdXIpPVwiY2hlY2tWYWx1ZSgkZXZlbnQsICdtaW51dGUnKVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5taW59fVwiXHJcbiAgICAgICAgICAgICAgICBtYXg9XCJ7e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXh9fVwiIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcigkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIiBzdHlsZT1cInBhZGRpbmc6IDVweDtcIj57e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWNyZWFzZVZhbHVlKCdtaW51dGUnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgLVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj4gLS0+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuXHJcbiAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPmAsXHJcbiAgc3R5bGVzOiBbYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LmRpc2FibGVkLXBpY2tlcntjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkLXBpY2tlcjpiZWZvcmV7Y29udGVudDpcIlwiO3otaW5kZXg6MTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjgpfWlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixpbnB1dFt0eXBlPW51bWJlcl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7bWFyZ2luOjB9aW5wdXRbdHlwZT1udW1iZXJde3RleHQtYWxpZ246Y2VudGVyfS5idG4tZGVjcmVtZW50ZXIsLmJ0bi1pbmNyZW1lbnRlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtvdXRsaW5lOjB9LnR4dC1kdXJhdGlvbnt3aWR0aDo0MnB4fS5idG4uYWN0aXZlLmZvY3VzLC5idG4uYWN0aXZlOmZvY3VzLC5idG4uZm9jdXMsLmJ0bjphY3RpdmUuZm9jdXMsLmJ0bjphY3RpdmU6Zm9jdXMsLmJ0bjpmb2N1c3tvdXRsaW5lOjAhaW1wb3J0YW50O291dGxpbmUtb2Zmc2V0Oi0ycHh9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFzc2lzdER1cmF0aW9uRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgZHVyYXRpb25EYXRhRWxlbWVudDogRHVyYXRpb25EYXRhRWxlbWVudDtcclxuICBkdXJhdGlvbkVsZW1lbnRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHN1cHBvcnRlZFVuaXRzOiBhbnkgPSB7XHJcbiAgICBtaWxsaXNlY29uZDoge1xyXG4gICAgICAnbGFiZWwnOiAnTWlsbGlzZWNvbmQnLFxyXG4gICAgICAnbWF4JzogOTk5LFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9LFxyXG4gICAgc2Vjb25kOiB7XHJcbiAgICAgICdsYWJlbCc6ICdTZWNvbmQnLFxyXG4gICAgICAnbWF4JzogNTksXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICBtaW51dGU6IHtcclxuICAgICAgJ2xhYmVsJzogJ01pbnV0ZXMnLFxyXG4gICAgICAnbWF4JzogNTksXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICBob3VyOiB7XHJcbiAgICAgICdsYWJlbCc6ICdIb3VycycsXHJcbiAgICAgICdtYXgnOiAyMyxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfSxcclxuICAgIGRheToge1xyXG4gICAgICAnbGFiZWwnOiAnRGF5cycsXHJcbiAgICAgICdtYXgnOiA3LFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9LFxyXG4gICAgd2Vlazoge1xyXG4gICAgICAnbGFiZWwnOiAnV2VlaycsXHJcbiAgICAgICdtYXgnOiA1MSxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGRheXN2YWx1ZSA9IDA7XHJcbiAgaG91cnN2YWx1ZSA9IDA7XHJcbiAgbWludXRlc3ZhbHVlID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSxcclxuICAgIHNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlOiBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBzaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZS5zaW11bGF0b3JTb3VyY2UkLnN1YnNjcmliZShcclxuICAgICAgbWlzc2lvbiA9PiB7XHJcbiAgICAgICAgdGhpcy5TZXRSYW5nZVZhbHVlc0ZvckR1cmF0aW9uUGlja2VyKCk7XHJcbiAgICAgICAgdGhpcy5VcGRhdGVGb3JtVmFsaWRhdG9yKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBEdXJhdGlvblZhbCA9ICdQVDBTJztcclxuICBkdXJhdGlvbk9wdGlvbnMgPSB7XHJcbiAgICBzaG93TmVnYXRpdmU6IGZhbHNlLFxyXG4gICAgc2hvd1ByZXZpZXc6IGZhbHNlLFxyXG4gICAgc2hvd1llYXJzOiBmYWxzZSxcclxuICAgIHNob3dNb250aHM6IGZhbHNlLFxyXG4gICAgc2hvd1dlZWtzOiBmYWxzZSxcclxuICAgIG1pbjogMFxyXG4gIH07XHJcblxyXG4gIHNob3dkYXltaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd2RheW1heFZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93bWludXRlbWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gIHNob3dtaW51dGVtaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd2hvdXJtaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd2hvdXJtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5TZXRSYW5nZVZhbHVlc0ZvckR1cmF0aW9uUGlja2VyKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUR1cmF0aW9uRWxlbWVudEZvcm0oKTtcclxuICAgIHRoaXMub25DaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBSZXNldFZhbGlkYXRpb25WaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93ZGF5bWluVmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93ZGF5bWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93bWludXRlbWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93bWludXRlbWluVmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93aG91cm1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd2hvdXJtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uc3RhdHVzQ2hhbmdlc1xyXG4gICAgICAuc3Vic2NyaWJlKHZhbCA9PiB7XHJcbiAgICAgICAgdGhpcy5SZXNldFZhbGlkYXRpb25WaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmVycm9ycy5tYXgpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd2RheW1heFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzLm1pbikge1xyXG4gICAgICAgICAgdGhpcy5zaG93ZGF5bWluVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5lcnJvcnMubWluKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dtaW51dGVtaW5WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmVycm9ycy5tYXgpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd21pbnV0ZW1heFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5lcnJvcnMubWluKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dob3VybWluVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmVycm9ycy5tYXgpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd2hvdXJtYXhWYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBTZXRSYW5nZVZhbHVlc0ZvckR1cmF0aW9uUGlja2VyKCkge1xyXG4gICAgY29uc3QgJGVsZW1lbnQgPSB0aGlzLmR1cmF0aW9uRGF0YUVsZW1lbnQ7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5taW4gPSAkZWxlbWVudC5NaW5pbXVtRGF5ICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWluaW11bURheSAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWluaW11bURheSA6IDA7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluID0gJGVsZW1lbnQuTWluaW11bUhvdXJzICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWluaW11bUhvdXJzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NaW5pbXVtSG91cnMgOiAwO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluID0gJGVsZW1lbnQuTWluaW11bU1pbnV0ZXMgIT09IHVuZGVmaW5lZCAmJiAkZWxlbWVudC5NaW5pbXVtTWludXRlcyAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWluaW11bU1pbnV0ZXMgOiAwO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWF4ID0gJGVsZW1lbnQuTWF4aW11bURheSAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1heGltdW1EYXkgIT0gbnVsbCA/XHJcbiAgICAgICRlbGVtZW50Lk1heGltdW1EYXkgOiA5MDA3MTk5MjU0NzQwOTkxO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snaG91ciddLm1heCA9ICRlbGVtZW50Lk1heGltdW1Ib3VycyAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1heGltdW1Ib3VycyAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWF4aW11bUhvdXJzIDogOTAwNzE5OTI1NDc0MDk5MTtcclxuICAgIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCA9ICRlbGVtZW50Lk1heG1pbXVtTWludXRlcyAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1heG1pbXVtTWludXRlcyAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWF4bWltdW1NaW51dGVzIDogOTAwNzE5OTI1NDc0MDk5MTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRHVyYXRpb25FbGVtZW50Rm9ybSgpIHtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBkdXJhdGlvbmRheXNlbGVtZW50OiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5tYXgpXSldLFxyXG4gICAgICBkdXJhdGlvbm1pbnV0ZXNlbGVtZW50OiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXgpXSldLFxyXG4gICAgICBkdXJhdGlvbmhvdXJzZWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWluKCt0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXgpXSldXHJcbiAgICAgIC8vIGR1cmF0aW9uZGF5c2VsZW1lbnQ6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbmx5SW50ZWdlcihldmVudCkge1xyXG4gICAgcmV0dXJuIChldmVudC5jaGFyQ29kZSA9PT0gOCB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBudWxsIDogZXZlbnQuY2hhckNvZGUgPj0gNDggJiYgZXZlbnQuY2hhckNvZGUgPD0gNTc7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVGb3JtVmFsaWRhdG9yKCkge1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5tYXgpXSldKTtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCldKV0pO1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snaG91ciddLm1pbiksIFZhbGlkYXRvcnMubWF4KCt0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4KV0pXSk7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluY3JlYXNlVmFsdWUocHJvcGVydHkpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmRheXN2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZGF5c3ZhbHVlID09IG51bGwgPyAwIDogdGhpcy5kYXlzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlICsgdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5ob3Vyc3ZhbHVlID09PSB1bmRlZmluZWQgfHwgdGhpcy5ob3Vyc3ZhbHVlID09IG51bGwgPyAwIDogdGhpcy5ob3Vyc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4KSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgKyB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaG91cnN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5taW51dGVzdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm1pbnV0ZXN2YWx1ZSA9PSBudWxsID8gMCA6IHRoaXMubWludXRlc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCB0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXgpIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLnN0ZXA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1pbnV0ZXN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWNyZWFzZVZhbHVlKHByb3BlcnR5KTogdm9pZCB7XHJcbiAgICBsZXQgY3VycmVudFZhbHVlID0gMDtcclxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcclxuICAgICAgY2FzZSAnZGF5cyc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5kYXlzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbikge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlIC0gdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5ob3Vyc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPiB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgLSB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaG91cnN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5taW51dGVzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbikge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlIC0gdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWludXRlc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hlY2tWYWx1ZShldmVudDogYW55LCBwcm9wZXJ0eSkge1xyXG4gICAgbGV0IGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMuZGF5c3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50VmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF5c3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaG91cic6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5ob3Vyc3ZhbHVlO1xyXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50VmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaG91cnN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5taW51dGVzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5taW51dGVzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dXNlLWxpZmUtY3ljbGUtaW50ZXJmYWNlXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBwcmV2ZW50IG1lbW9yeSBsZWFrIHdoZW4gY29tcG9uZW50IGRlc3Ryb3llZFxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuIl19