lamb-web-lib
Version:
LambWebLib. Es un proyecto angular de tipo Librería. que contiene una Suit de componentes reutilizables para el proyecto [Lamb Financial](https://lamb.upeu.edu.pe).
415 lines • 44.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Lamb Team. All Rights Reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*/
import { Component, Input, QueryList, Directive, ContentChild, ContentChildren, TemplateRef, Output, EventEmitter, } from '@angular/core';
import { LambStepConfig, ConfigNames } from './step-config';
import { slideOfRight } from './animations/slide-of-right.animation';
var LambStepTitleDirective = /** @class */ (function () {
function LambStepTitleDirective(templateRef) {
this.templateRef = templateRef;
}
LambStepTitleDirective.decorators = [
{ type: Directive, args: [{
selector: 'ng-template[lambStepTitle]',
},] },
];
LambStepTitleDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return LambStepTitleDirective;
}());
export { LambStepTitleDirective };
if (false) {
/** @type {?} */
LambStepTitleDirective.prototype.templateRef;
}
var LambStepContentDirective = /** @class */ (function () {
function LambStepContentDirective(templateRef) {
this.templateRef = templateRef;
}
LambStepContentDirective.decorators = [
{ type: Directive, args: [{
selector: 'ng-template[lambStepContent]',
},] },
];
LambStepContentDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return LambStepContentDirective;
}());
export { LambStepContentDirective };
if (false) {
/** @type {?} */
LambStepContentDirective.prototype.templateRef;
}
/** @type {?} */
var nextId = 0;
var LambStepDirective = /** @class */ (function () {
function LambStepDirective() {
this.id = "lamb-step-" + nextId++;
this.disabled = false;
// @Input() disabled = true;
this.isValidStep = true;
}
Object.defineProperty(LambStepDirective.prototype, "validStep", {
// public isValidStep: boolean = false;
set:
// public isValidStep: boolean = false;
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.isValidStep = (value === 'true' || value === true) ? true : false;
},
enumerable: true,
configurable: true
});
LambStepDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: 'lamb-step',
},] },
];
LambStepDirective.propDecorators = {
id: [{ type: Input }],
title: [{ type: Input }],
icon: [{ type: Input }],
data: [{ type: Input }],
disabled: [{ type: Input }],
validStep: [{ type: Input }],
contentTemplate: [{ type: ContentChild, args: [LambStepContentDirective,] }],
titleTemplate: [{ type: ContentChild, args: [LambStepTitleDirective,] }]
};
return LambStepDirective;
}());
export { LambStepDirective };
if (false) {
/** @type {?} */
LambStepDirective.prototype.id;
/** @type {?} */
LambStepDirective.prototype.title;
/** @type {?} */
LambStepDirective.prototype.icon;
/**
* Guarda Cualquier dato. Creado por el Equipo Lamb.
* @type {?}
*/
LambStepDirective.prototype.data;
/** @type {?} */
LambStepDirective.prototype.disabled;
/** @type {?} */
LambStepDirective.prototype.isValidStep;
/** @type {?} */
LambStepDirective.prototype.contentTemplate;
/** @type {?} */
LambStepDirective.prototype.titleTemplate;
}
/**
* @record
*/
export function LambStepChangeEvent() { }
if (false) {
/**
* Id de la pestaña actualmente activa.
* @type {?}
*/
LambStepChangeEvent.prototype.activeId;
/**
* Id de la pestaña recién seleccionada.
* @type {?}
*/
LambStepChangeEvent.prototype.nextId;
/**
* data guardada en la pestaña actualmente activa.
* @type {?}
*/
LambStepChangeEvent.prototype.activeData;
/**
* Función que evitará el cambio de pertaña si se llama.
* @type {?}
*/
LambStepChangeEvent.prototype.preventDefault;
}
var LambStepGroupComponent = /** @class */ (function () {
function LambStepGroupComponent(config) {
this.config = config;
this.hideContent = false;
/**
* Cuando cambia de step se destruira el contenido anterior o solo se oculatará?
*/
// @Input() destroyOnHide: boolean = true;
this.destroyOnHide = false;
/**
* Emite cuando hay cambios de steps.
*/
this.stepChange = new EventEmitter();
// tslint:disable-next-line:no-output-on-prefix
this.onComplete = new EventEmitter();
this.type = this.config.type;
this.justify = this.config.justify;
this.orientation = this.config.orientation;
this.iConfigNames = this.config.configNames;
}
Object.defineProperty(LambStepGroupComponent.prototype, "configNames", {
set: /**
* @param {?} confign
* @return {?}
*/
function (confign) {
this.iConfigNames.buttonBack = confign.buttonBack || this.iConfigNames.buttonBack;
this.iConfigNames.buttonNext = confign.buttonNext || this.iConfigNames.buttonNext;
this.iConfigNames.buttonFinish = confign.buttonFinish || this.iConfigNames.buttonFinish;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LambStepGroupComponent.prototype, "justify", {
set: /**
* @param {?} className
* @return {?}
*/
function (className) {
if (className === 'fill' || className === 'justified') {
this.justifyClass = "nav-" + className;
}
else {
this.justifyClass = "justify-content-" + className;
}
},
enumerable: true,
configurable: true
});
/**
* @param {?} stepId
* @return {?}
*/
LambStepGroupComponent.prototype.onSelect = /**
* @param {?} stepId
* @return {?}
*/
function (stepId) {
/** @type {?} */
var selectedStep = this.getStepById(stepId);
/** @type {?} */
var selectedActive = this.getStepById(this.activeId);
// console.log('selectedStep');
// console.log(selectedStep);
if (selectedStep && !selectedStep.disabled && this.activeId !== selectedStep.id) {
/** @type {?} */
var defaultPrevented_1 = false;
this.stepChange.emit({
activeId: this.activeId,
activeData: selectedActive.data || null,
nextId: selectedStep.id,
preventDefault: function () { defaultPrevented_1 = true; },
});
if (!defaultPrevented_1) {
this.activeId = selectedStep.id;
}
}
};
/**
* @return {?}
*/
LambStepGroupComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
LambStepGroupComponent.prototype.ngAfterContentChecked = /**
* @return {?}
*/
function () {
/** @type {?} */
var activeStep = this.getStepById(this.activeId);
this.activeId = activeStep ? activeStep.id : (this.steps.length ? this.steps.first.id : null);
};
/**
* @param {?} id
* @return {?}
*/
LambStepGroupComponent.prototype.getStepById = /**
* @param {?} id
* @return {?}
*/
function (id) {
/** @type {?} */
var stepsWithId = this.steps.filter(function (step) { return step.id === id; });
return stepsWithId.length ? stepsWithId[0] : null;
};
/**
* @return {?}
*/
LambStepGroupComponent.prototype.back = /**
* @return {?}
*/
function () {
/** @type {?} */
var back = this.getStepIdSplice(-1);
this.onSelect(back);
};
/**
* @return {?}
*/
LambStepGroupComponent.prototype.next = /**
* @return {?}
*/
function () {
/** @type {?} */
var next = this.getStepIdSplice(+1);
this.onSelect(next);
};
/**
* @return {?}
*/
LambStepGroupComponent.prototype.complete = /**
* @return {?}
*/
function () {
this.onComplete.emit();
};
/**
* @param {?} condicion
* @return {?}
*/
LambStepGroupComponent.prototype.getStepIdSplice = /**
* @param {?} condicion
* @return {?}
*/
function (condicion) {
/** @type {?} */
var actual = this.activeId;
/** @type {?} */
var splice = actual.slice(0, actual.length - 1);
/** @type {?} */
var index = parseInt(actual.slice((actual.length - 1), actual.length), 10);
/** @type {?} */
var next = "" + splice + (index + (condicion));
return next;
};
Object.defineProperty(LambStepGroupComponent.prototype, "hidePrevious", {
get: /**
* @return {?}
*/
function () {
return this.activeId !== 'lamb-step-0';
},
enumerable: true,
configurable: true
});
Object.defineProperty(LambStepGroupComponent.prototype, "hideNext", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var allLength = (this.steps.length - 1);
return this.activeId !== 'lamb-step-' + allLength;
},
enumerable: true,
configurable: true
});
/**
* @param {?} stepId
* @return {?}
*/
LambStepGroupComponent.prototype.hideLineRight = /**
* @param {?} stepId
* @return {?}
*/
function (stepId) {
/** @type {?} */
var step = parseInt(stepId.slice(stepId.length - 1, stepId.length), 10);
return (this.steps.length !== (step + 1));
};
/**
* @return {?}
*/
LambStepGroupComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
nextId = 0;
};
LambStepGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'lamb-step-group',
template: "<!-- <ul class=\"nav justify-content-center\" id=\"myStep\" role=\"steplist\"> -->\n<ul [class]=\"'nav lamb-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )\" id=\"myStep\"\n role=\"steplist\">\n\n <!-- <ng-template ngFor let-step [ngForOf]=\"steps\" *ngFor=\"let step of steps\"> -->\n <ng-template ngFor let-step [ngForOf]=\"steps\">\n <li class=\"nav-item\">\n <a [id]=\"step.id\" class=\"nav-link\" [class.active]=\"step.id === activeId\" [class.disabled]=\"step.disabled || !step.isValidStep\"\n (click)=\"!!onSelect(step.id)\" role=\"step\" [attr.stepindex]=\"(step.disabled || !step.isValidStep ? '-1': undefined)\"\n [attr.aria-controls]=\"(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)\" [attr.aria-expanded]=\"step.id === activeId\"\n [attr.aria-disabled]=\"step.disabled || !step.isValidStep\">\n <!-- data-toggle=\"step\"\n aria-selected=\"true\" -->\n <ng-template [ngIf]=\"step.icon\">\n <span class=\"lamb-round-tabs\" [title]=\"step.title\">\n <i class=\"{{ step.icon }} lamb-icon\"></i>\n </span>\n </ng-template>\n <br>\n <span class=\"lamb-round-text\">\n {{ step.title }}\n </span>\n <ng-template [ngTemplateOutlet]=\"step.titleTemplate?.templateRef\"></ng-template>\n </a>\n </li>\n <li class=\"nav-line\" *ngIf=\"hideLineRight(step.id)\">\n <div class=\"lamb-liner\"></div>\n </li>\n </ng-template>\n\n <!-- <ng-content select=\"lamb-step-head\"></ng-content> -->\n</ul>\n<div class=\"tab-content lamb-content\" id=\"myStepContent\">\n <!-- <ng-content select=\"lamb-step-body\"></ng-content> -->\n <ng-template ngFor let-step [ngForOf]=\"steps\">\n <!-- class=\"step-pane fade {{ step.id === activeId ? 'active': null }}\" -->\n <!-- \n <div [@slideOfRight]=\"((step.id === activeId) && (status === 'next')) ? 'next': 'back'\" class=\"tab-pane {{ step.id === activeId ? 'active': 'active' }}\"\n *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\" [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\"\n [attr.aria-expanded]=\"step.id === activeId\"> -->\n\n <div class=\"tab-pane {{ step.id === activeId ? 'active': null }}\" *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\"\n [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\" [attr.aria-expanded]=\"step.id === activeId\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <ng-template [ngTemplateOutlet]=\"step.contentTemplate?.templateRef\"></ng-template>\n </div>\n </div>\n <div class=\"row lamb-button-manage\">\n <div class=\"offset-md-4 col-md-4\">\n <div class=\"row\">\n <div class=\"col-md-6\" *ngIf=\"hidePrevious\">\n <div class=\"form-group text-center space-20\">\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-default\" (click)=\"back()\">\n <span style=\"margin-right:10px;\" class=\"fa fa-arrow-left\"></span>\n {{ iConfigNames.buttonBack }}\n </button>\n </div>\n </div>\n <div class=\"col-md-6\" *ngIf=\"hideNext\">\n <div class=\"form-group text-center space-20\">\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"next()\">\n {{ iConfigNames.buttonNext }}\n <span style=\"margin-left:10px;\" class=\"fa fa-arrow-right\"></span>\n </button>\n </div>\n </div>\n <div class=\"col-md-6\" *ngIf=\"hidePrevious && !hideNext\">\n <div class=\"form-group text-center space-20\">\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"complete()\">\n {{ iConfigNames.buttonFinish }}\n <span style=\"margin-left:10px;\" class=\"fa fa-check\"></span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</div>",
styles: [".lamb-liner{height:2px;position:relative;width:5rem;margin:0 auto;left:0;right:0;top:1.8rem;z-index:1}.tab-content{padding-top:2rem}.nav-link{padding:0 0 5px}.nav-link .lamb-round-text{text-transform:uppercase;font-size:.7rem}@media (max-width:550px){.lamb-liner{width:1rem}.nav-link .lamb-round-text{display:none}}.nav-link.active span.lamb-round-tabs{background:#ffa92d}.lamb-nav-tabs{border-bottom:transparent;position:relative;margin:0 auto;box-sizing:border-box;text-align:center;padding:0 1.5rem}.lamb-nav-tabs li.nav-line{padding-left:0;padding-right:0}.lamb-nav-tabs li a{text-decoration:none}.lamb-button-manage{margin-top:1.5rem}span.lamb-round-tabs{width:40px;height:40px;line-height:40px;display:inline-block;border-radius:100px;z-index:2;left:-1;text-align:center;font-size:1.3rem;position:relative;margin-top:.6rem;margin-bottom:0}"],
// animations: [Animations.slideInOut, Animations.slideOfRight],
animations: [slideOfRight],
},] },
];
LambStepGroupComponent.ctorParameters = function () { return [
{ type: LambStepConfig }
]; };
LambStepGroupComponent.propDecorators = {
steps: [{ type: ContentChildren, args: [LambStepDirective,] }],
activeId: [{ type: Input }],
configNames: [{ type: Input }],
destroyOnHide: [{ type: Input }],
stepChange: [{ type: Output }],
onComplete: [{ type: Output }],
justify: [{ type: Input }],
orientation: [{ type: Input }],
type: [{ type: Input }]
};
return LambStepGroupComponent;
}());
export { LambStepGroupComponent };
if (false) {
/** @type {?} */
LambStepGroupComponent.prototype.justifyClass;
/** @type {?} */
LambStepGroupComponent.prototype.hideContent;
/** @type {?} */
LambStepGroupComponent.prototype.steps;
/**
* Id del step que saldrá activado por defecto.
* @type {?}
*/
LambStepGroupComponent.prototype.activeId;
/**
* Personalizar el nombre 'Anterior | siguiente y Finalizar'
* Formato de variable : objecto
* Ej. configNames: object = {buttonBack: 'Regresar', buttonNext: 'Grabar', buttonFinish: 'Fin'}
* @type {?}
*/
LambStepGroupComponent.prototype.iConfigNames;
/**
* Cuando cambia de step se destruira el contenido anterior o solo se oculatará?
* @type {?}
*/
LambStepGroupComponent.prototype.destroyOnHide;
/**
* Emite cuando hay cambios de steps.
* @type {?}
*/
LambStepGroupComponent.prototype.stepChange;
/** @type {?} */
LambStepGroupComponent.prototype.onComplete;
/** @type {?} */
LambStepGroupComponent.prototype.orientation;
/** @type {?} */
LambStepGroupComponent.prototype.type;
/** @type {?} */
LambStepGroupComponent.prototype.config;
}
/** @type {?} */
export var LAMB_STEPS_COMPONENTS = [
LambStepGroupComponent,
LambStepDirective,
LambStepTitleDirective,
LambStepContentDirective,
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbGFtYi13ZWItbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU9BLE9BQU8sRUFDSCxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFDM0IsU0FBUyxFQUFFLFlBQVksRUFDdkIsZUFBZSxFQUFFLFdBQVcsRUFDNUIsTUFBTSxFQUFFLFlBQVksR0FDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXJFO0lBSUksZ0NBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7O2dCQUp4RCxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLDRCQUE0QjtpQkFDekM7OztnQkFSb0IsV0FBVzs7SUFXaEMsNkJBQUM7Q0FBQSxBQUxELElBS0M7U0FGWSxzQkFBc0I7OztJQUNuQiw2Q0FBb0M7O0FBR3BEO0lBSUksa0NBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7O2dCQUp4RCxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLDhCQUE4QjtpQkFDM0M7OztnQkFmb0IsV0FBVzs7SUFrQmhDLCtCQUFDO0NBQUEsQUFMRCxJQUtDO1NBRlksd0JBQXdCOzs7SUFDckIsK0NBQW9DOzs7SUFHaEQsTUFBTSxHQUFHLENBQUM7QUFFZDtJQUFBO1FBTWEsT0FBRSxHQUFHLGVBQWEsTUFBTSxFQUFJLENBQUM7UUFXN0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQiw0QkFBNEI7UUFFckIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7SUFVOUIsQ0FBQztJQVBHLHNCQUNJLHdDQUFTO1FBSGIsdUNBQXVDOzs7Ozs7O1FBRXZDLFVBQ2MsS0FBdUI7WUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMzRSxDQUFDOzs7T0FBQTs7Z0JBMUJKLFNBQVMsU0FBQzs7b0JBRVAsUUFBUSxFQUFFLFdBQVc7aUJBQ3hCOzs7cUJBR0ksS0FBSzt3QkFFTCxLQUFLO3VCQUVMLEtBQUs7dUJBS0wsS0FBSzsyQkFFTCxLQUFLOzRCQU1MLEtBQUs7a0NBS0wsWUFBWSxTQUFDLHdCQUF3QjtnQ0FDckMsWUFBWSxTQUFDLHNCQUFzQjs7SUFDeEMsd0JBQUM7Q0FBQSxBQTlCRCxJQThCQztTQTFCWSxpQkFBaUI7OztJQUUxQiwrQkFBc0M7O0lBRXRDLGtDQUF1Qjs7SUFFdkIsaUNBQXNCOzs7OztJQUt0QixpQ0FBbUI7O0lBRW5CLHFDQUEwQjs7SUFHMUIsd0NBQTBCOztJQVExQiw0Q0FBa0Y7O0lBQ2xGLDBDQUE0RTs7Ozs7QUFHaEYseUNBcUJDOzs7Ozs7SUFqQkcsdUNBQWlCOzs7OztJQUtqQixxQ0FBZTs7Ozs7SUFLZix5Q0FBZ0I7Ozs7O0lBS2hCLDZDQUEyQjs7QUFJL0I7SUE0SkksZ0NBQW9CLE1BQXNCO1FBQXRCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBbEVuQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQXFCM0I7O1dBRUc7UUFDSCwwQ0FBMEM7UUFDakMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFL0I7O1dBRUc7UUFDTyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFFL0QsK0NBQStDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBa0MzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ2hELENBQUM7SUF6REQsc0JBQ0ksK0NBQVc7Ozs7O1FBRGYsVUFDZ0IsT0FBb0I7WUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUNsRixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ2xGLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFDNUYsQ0FBQzs7O09BQUE7SUFnQkQsc0JBQ0ksMkNBQU87Ozs7O1FBRFgsVUFDWSxTQUE0RDtZQUNwRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLFNBQVMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQU8sU0FBVyxDQUFDO1lBQzNDLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDSixJQUFJLENBQUMsWUFBWSxHQUFHLHFCQUFtQixTQUFXLENBQUM7WUFDdkQsQ0FBQztRQUNMLENBQUM7OztPQUFBOzs7OztJQUVELHlDQUFROzs7O0lBQVIsVUFBUyxNQUFjOztZQUViLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQzs7WUFDdkMsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN0RCwrQkFBK0I7UUFDL0IsNkJBQTZCO1FBRTdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7Z0JBQzFFLGtCQUFnQixHQUFHLEtBQUs7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2hCO2dCQUNJLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsVUFBVSxFQUFFLGNBQWMsQ0FBQyxJQUFJLElBQUksSUFBSTtnQkFDdkMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFO2dCQUN2QixjQUFjLEVBQUUsY0FBUSxrQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3JELENBQ0osQ0FBQztZQUNGLEVBQUUsQ0FBQyxDQUFDLENBQUMsa0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDcEMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDOzs7O0lBT0QseUNBQVE7OztJQUFSO0lBQ0EsQ0FBQzs7OztJQU9ELHNEQUFxQjs7O0lBQXJCOztZQUNVLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEcsQ0FBQzs7Ozs7SUFFTyw0Q0FBVzs7OztJQUFuQixVQUFvQixFQUFVOztZQUNwQixXQUFXLEdBQXdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQWQsQ0FBYyxDQUFDO1FBQ2xGLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RCxDQUFDOzs7O0lBRU0scUNBQUk7OztJQUFYOztZQUNVLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQzs7OztJQUNNLHFDQUFJOzs7SUFBWDs7WUFDVSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFFTSx5Q0FBUTs7O0lBQWY7UUFDSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBRU8sZ0RBQWU7Ozs7SUFBdkIsVUFBd0IsU0FBaUI7O1lBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUTs7WUFDdEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztZQUMzQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7O1lBQ3RFLElBQUksR0FBRyxLQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFHO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHNCQUFJLGdEQUFZOzs7O1FBQWhCO1lBQ0ksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDO1FBQzNDLENBQUM7OztPQUFBO0lBQ0Qsc0JBQUksNENBQVE7Ozs7UUFBWjs7Z0JBQ1UsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDdEQsQ0FBQzs7O09BQUE7Ozs7O0lBRU0sOENBQWE7Ozs7SUFBcEIsVUFBcUIsTUFBTTs7WUFDakIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7O0lBRU0sNENBQVc7OztJQUFsQjtRQUNJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDOztnQkF4TkosU0FBUyxTQUFDO29CQUNQLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRSw2MEpBZ0ZQO29CQUNILE1BQU0sRUFBRSxDQUFDLCswQkFBKzBCLENBQUM7O29CQUV6MUIsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUM3Qjs7O2dCQWhLUSxjQUFjOzs7d0JBc0tsQixlQUFlLFNBQUMsaUJBQWlCOzJCQUtqQyxLQUFLOzhCQU9MLEtBQUs7Z0NBV0wsS0FBSzs2QkFLTCxNQUFNOzZCQUdOLE1BQU07MEJBRU4sS0FBSzs4QkF5Q0wsS0FBSzt1QkFFTCxLQUFLOztJQWlEViw2QkFBQztDQUFBLEFBek5ELElBeU5DO1NBaklZLHNCQUFzQjs7O0lBQy9CLDhDQUFxQjs7SUFDckIsNkNBQTJCOztJQUUzQix1Q0FBd0U7Ozs7O0lBS3hFLDBDQUEwQjs7Ozs7OztJQU0xQiw4Q0FBaUM7Ozs7O0lBWWpDLCtDQUErQjs7Ozs7SUFLL0IsNENBQStEOztJQUcvRCw0Q0FBK0M7O0lBMkMvQyw2Q0FBZ0Q7O0lBRWhELHNDQUFrQzs7SUFadEIsd0NBQThCOzs7QUErRDlDLE1BQU0sS0FBTyxxQkFBcUIsR0FBRztJQUNqQyxzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHNCQUFzQjtJQUN0Qix3QkFBd0I7Q0FDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBMYW1iIFRlYW0uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgSW5wdXQsIFF1ZXJ5TGlzdCxcclxuICAgIERpcmVjdGl2ZSwgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLCBUZW1wbGF0ZVJlZiwgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcclxuICAgIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTGFtYlN0ZXBDb25maWcsIENvbmZpZ05hbWVzIH0gZnJvbSAnLi9zdGVwLWNvbmZpZyc7XHJcbmltcG9ydCB7IHNsaWRlT2ZSaWdodCB9IGZyb20gJy4vYW5pbWF0aW9ucy9zbGlkZS1vZi1yaWdodC5hbmltYXRpb24nO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2xhbWJTdGVwVGl0bGVdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExhbWJTdGVwVGl0bGVEaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7IH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2xhbWJTdGVwQ29udGVudF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGFtYlN0ZXBDb250ZW50RGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbmxldCBuZXh0SWQgPSAwO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ2xhbWItc3RlcCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMYW1iU3RlcERpcmVjdGl2ZSB7XHJcblxyXG4gICAgQElucHV0KCkgaWQgPSBgbGFtYi1zdGVwLSR7bmV4dElkKyt9YDtcclxuXHJcbiAgICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGljb246IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYSBDdWFscXVpZXIgZGF0by4gQ3JlYWRvIHBvciBlbCBFcXVpcG8gTGFtYi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgZGF0YTogYW55O1xyXG5cclxuICAgIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAvLyBASW5wdXQoKSBkaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIGlzVmFsaWRTdGVwID0gdHJ1ZTtcclxuICAgIC8vIHB1YmxpYyBpc1ZhbGlkU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgdmFsaWRTdGVwKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkU3RlcCA9ICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSB0cnVlKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBAQ29udGVudENoaWxkKExhbWJTdGVwQ29udGVudERpcmVjdGl2ZSkgY29udGVudFRlbXBsYXRlOiBMYW1iU3RlcENvbnRlbnREaXJlY3RpdmU7XHJcbiAgICBAQ29udGVudENoaWxkKExhbWJTdGVwVGl0bGVEaXJlY3RpdmUpIHRpdGxlVGVtcGxhdGU6IExhbWJTdGVwVGl0bGVEaXJlY3RpdmU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGFtYlN0ZXBDaGFuZ2VFdmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIElkIGRlIGxhIHBlc3Rhw7FhIGFjdHVhbG1lbnRlIGFjdGl2YS5cclxuICAgICAqL1xyXG4gICAgYWN0aXZlSWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIGRlIGxhIHBlc3Rhw7FhIHJlY2nDqW4gc2VsZWNjaW9uYWRhLlxyXG4gICAgICovXHJcbiAgICBuZXh0SWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIGRhdGEgZ3VhcmRhZGEgZW4gbGEgcGVzdGHDsWEgYWN0dWFsbWVudGUgYWN0aXZhLlxyXG4gICAgICovXHJcbiAgICBhY3RpdmVEYXRhOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jacOzbiBxdWUgZXZpdGFyw6EgZWwgY2FtYmlvIGRlIHBlcnRhw7FhIHNpIHNlIGxsYW1hLlxyXG4gICAgICovXHJcbiAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdm9pZDtcclxuXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsYW1iLXN0ZXAtZ3JvdXAnLFxyXG4gICAgdGVtcGxhdGU6IGA8IS0tIDx1bCBjbGFzcz1cIm5hdiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgaWQ9XCJteVN0ZXBcIiByb2xlPVwic3RlcGxpc3RcIj4gLS0+XHJcbjx1bCBbY2xhc3NdPVwiJ25hdiBsYW1iLW5hdi10YWJzIG5hdi0nICsgdHlwZSArIChvcmllbnRhdGlvbiA9PSAnaG9yaXpvbnRhbCc/ICcgJyArIGp1c3RpZnlDbGFzcyA6ICcgZmxleC1jb2x1bW4nIClcIiBpZD1cIm15U3RlcFwiXHJcbiAgICByb2xlPVwic3RlcGxpc3RcIj5cclxuXHJcbiAgICA8IS0tIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtc3RlcCBbbmdGb3JPZl09XCJzdGVwc1wiICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzXCI+IC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1zdGVwIFtuZ0Zvck9mXT1cInN0ZXBzXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGEgW2lkXT1cInN0ZXAuaWRcIiBjbGFzcz1cIm5hdi1saW5rXCIgW2NsYXNzLmFjdGl2ZV09XCJzdGVwLmlkID09PSBhY3RpdmVJZFwiIFtjbGFzcy5kaXNhYmxlZF09XCJzdGVwLmRpc2FibGVkIHx8ICFzdGVwLmlzVmFsaWRTdGVwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhIW9uU2VsZWN0KHN0ZXAuaWQpXCIgcm9sZT1cInN0ZXBcIiBbYXR0ci5zdGVwaW5kZXhdPVwiKHN0ZXAuZGlzYWJsZWQgfHwgIXN0ZXAuaXNWYWxpZFN0ZXAgPyAnLTEnOiB1bmRlZmluZWQpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiKCFkZXN0cm95T25IaWRlIHx8IHN0ZXAuaWQgPT09IGFjdGl2ZUlkID8gc3RlcC5pZCArICctcGFuZWwnOiBudWxsKVwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic3RlcC5pZCA9PT0gYWN0aXZlSWRcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJzdGVwLmRpc2FibGVkIHx8ICFzdGVwLmlzVmFsaWRTdGVwXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGRhdGEtdG9nZ2xlPVwic3RlcFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInN0ZXAuaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFtYi1yb3VuZC10YWJzXCIgW3RpdGxlXT1cInN0ZXAudGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7eyBzdGVwLmljb24gfX0gbGFtYi1pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8YnI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhbWItcm91bmQtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHN0ZXAudGl0bGUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJzdGVwLnRpdGxlVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWxpbmVcIiAqbmdJZj1cImhpZGVMaW5lUmlnaHQoc3RlcC5pZClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhbWItbGluZXJcIj48L2Rpdj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8IS0tIDxuZy1jb250ZW50IHNlbGVjdD1cImxhbWItc3RlcC1oZWFkXCI+PC9uZy1jb250ZW50PiAtLT5cclxuPC91bD5cclxuPGRpdiBjbGFzcz1cInRhYi1jb250ZW50IGxhbWItY29udGVudFwiIGlkPVwibXlTdGVwQ29udGVudFwiPlxyXG4gICAgPCEtLSA8bmctY29udGVudCBzZWxlY3Q9XCJsYW1iLXN0ZXAtYm9keVwiPjwvbmctY29udGVudD4gLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LXN0ZXAgW25nRm9yT2ZdPVwic3RlcHNcIj5cclxuICAgICAgICA8IS0tIGNsYXNzPVwic3RlcC1wYW5lIGZhZGUge3sgc3RlcC5pZCA9PT0gYWN0aXZlSWQgPyAnYWN0aXZlJzogbnVsbCB9fVwiIC0tPlxyXG4gICAgICAgIDwhLS0gXHJcbiAgICAgICAgPGRpdiBbQHNsaWRlT2ZSaWdodF09XCIoKHN0ZXAuaWQgPT09IGFjdGl2ZUlkKSAmJiAoc3RhdHVzID09PSAnbmV4dCcpKSA/ICduZXh0JzogJ2JhY2snXCIgY2xhc3M9XCJ0YWItcGFuZSB7eyBzdGVwLmlkID09PSBhY3RpdmVJZCA/ICdhY3RpdmUnOiAnYWN0aXZlJyB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIWRlc3Ryb3lPbkhpZGUgfHwgc3RlcC5pZCA9PT0gYWN0aXZlSWRcIiByb2xlPVwic3RlcHBhbmVsXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInN0ZXAuaWRcIiBpZD1cInt7IHN0ZXAuaWQgfX0tcGFuZWxcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInN0ZXAuaWQgPT09IGFjdGl2ZUlkXCI+IC0tPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUge3sgc3RlcC5pZCA9PT0gYWN0aXZlSWQgPyAnYWN0aXZlJzogbnVsbCB9fVwiICpuZ0lmPVwiIWRlc3Ryb3lPbkhpZGUgfHwgc3RlcC5pZCA9PT0gYWN0aXZlSWRcIiByb2xlPVwic3RlcHBhbmVsXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInN0ZXAuaWRcIiBpZD1cInt7IHN0ZXAuaWQgfX0tcGFuZWxcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInN0ZXAuaWQgPT09IGFjdGl2ZUlkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RlcC5jb250ZW50VGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsYW1iLWJ1dHRvbi1tYW5hZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvZmZzZXQtbWQtNCBjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nSWY9XCJoaWRlUHJldmlvdXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHRleHQtY2VudGVyIHNwYWNlLTIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWJsb2NrIGJ0bi1vdXRsaW5lLXJvdW5kZWQgYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjEwcHg7XCIgY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpQ29uZmlnTmFtZXMuYnV0dG9uQmFjayB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiAqbmdJZj1cImhpZGVOZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB0ZXh0LWNlbnRlciBzcGFjZS0yMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1ibG9jayBidG4tb3V0bGluZS1yb3VuZGVkIGJ0bi1pbmZvXCIgW2Rpc2FibGVkXT1cIiFzdGVwLmlzVmFsaWRTdGVwXCIgKGNsaWNrKT1cIm5leHQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpQ29uZmlnTmFtZXMuYnV0dG9uTmV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCIgY2xhc3M9XCJmYSBmYS1hcnJvdy1yaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nSWY9XCJoaWRlUHJldmlvdXMgJiYgIWhpZGVOZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB0ZXh0LWNlbnRlciBzcGFjZS0yMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1ibG9jayBidG4tb3V0bGluZS1yb3VuZGVkIGJ0bi1pbmZvXCIgW2Rpc2FibGVkXT1cIiFzdGVwLmlzVmFsaWRTdGVwXCIgKGNsaWNrKT1cImNvbXBsZXRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCIgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PmAsXHJcbiAgICBzdHlsZXM6IFtgLmxhbWItbGluZXJ7aGVpZ2h0OjJweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDo1cmVtO21hcmdpbjowIGF1dG87bGVmdDowO3JpZ2h0OjA7dG9wOjEuOHJlbTt6LWluZGV4OjF9LnRhYi1jb250ZW50e3BhZGRpbmctdG9wOjJyZW19Lm5hdi1saW5re3BhZGRpbmc6MCAwIDVweH0ubmF2LWxpbmsgLmxhbWItcm91bmQtdGV4dHt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC1zaXplOi43cmVtfUBtZWRpYSAobWF4LXdpZHRoOjU1MHB4KXsubGFtYi1saW5lcnt3aWR0aDoxcmVtfS5uYXYtbGluayAubGFtYi1yb3VuZC10ZXh0e2Rpc3BsYXk6bm9uZX19Lm5hdi1saW5rLmFjdGl2ZSBzcGFuLmxhbWItcm91bmQtdGFic3tiYWNrZ3JvdW5kOiNmZmE5MmR9LmxhbWItbmF2LXRhYnN7Ym9yZGVyLWJvdHRvbTp0cmFuc3BhcmVudDtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MCBhdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjAgMS41cmVtfS5sYW1iLW5hdi10YWJzIGxpLm5hdi1saW5le3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0ubGFtYi1uYXYtdGFicyBsaSBhe3RleHQtZGVjb3JhdGlvbjpub25lfS5sYW1iLWJ1dHRvbi1tYW5hZ2V7bWFyZ2luLXRvcDoxLjVyZW19c3Bhbi5sYW1iLXJvdW5kLXRhYnN7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtsaW5lLWhlaWdodDo0MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6MTAwcHg7ei1pbmRleDoyO2xlZnQ6LTE7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEuM3JlbTtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tdG9wOi42cmVtO21hcmdpbi1ib3R0b206MH1gXSxcclxuICAgIC8vIGFuaW1hdGlvbnM6IFtBbmltYXRpb25zLnNsaWRlSW5PdXQsIEFuaW1hdGlvbnMuc2xpZGVPZlJpZ2h0XSxcclxuICAgIGFuaW1hdGlvbnM6IFtzbGlkZU9mUmlnaHRdLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIExhbWJTdGVwR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgICBqdXN0aWZ5Q2xhc3M6IHN0cmluZztcclxuICAgIHB1YmxpYyBoaWRlQ29udGVudCA9IGZhbHNlO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTGFtYlN0ZXBEaXJlY3RpdmUpIHN0ZXBzOiBRdWVyeUxpc3Q8TGFtYlN0ZXBEaXJlY3RpdmU+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgZGVsIHN0ZXAgcXVlIHNhbGRyw6EgYWN0aXZhZG8gcG9yIGRlZmVjdG8uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGFjdGl2ZUlkOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFBlcnNvbmFsaXphciBlbCBub21icmUgJ0FudGVyaW9yIHwgc2lndWllbnRlIHkgRmluYWxpemFyJ1xyXG4gICAgICogRm9ybWF0byBkZSB2YXJpYWJsZSA6IG9iamVjdG9cclxuICAgICAqIEVqLiBjb25maWdOYW1lczogb2JqZWN0ID0ge2J1dHRvbkJhY2s6ICdSZWdyZXNhcicsIGJ1dHRvbk5leHQ6ICdHcmFiYXInLCBidXR0b25GaW5pc2g6ICdGaW4nfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaUNvbmZpZ05hbWVzOiBDb25maWdOYW1lcztcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgY29uZmlnTmFtZXMoY29uZmlnbjogQ29uZmlnTmFtZXMpIHtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25CYWNrID0gY29uZmlnbi5idXR0b25CYWNrIHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkJhY2s7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uTmV4dCA9IGNvbmZpZ24uYnV0dG9uTmV4dCB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25OZXh0O1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaCA9IGNvbmZpZ24uYnV0dG9uRmluaXNoIHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1YW5kbyBjYW1iaWEgZGUgc3RlcCBzZSBkZXN0cnVpcmEgZWwgY29udGVuaWRvIGFudGVyaW9yIG8gc29sbyBzZSBvY3VsYXRhcsOhP1xyXG4gICAgICovXHJcbiAgICAvLyBASW5wdXQoKSBkZXN0cm95T25IaWRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGRlc3Ryb3lPbkhpZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRlIGN1YW5kbyBoYXkgY2FtYmlvcyBkZSBzdGVwcy5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExhbWJTdGVwQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBqdXN0aWZ5KGNsYXNzTmFtZTogJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCAnZmlsbCcgfCAnanVzdGlmaWVkJykge1xyXG4gICAgICAgIGlmIChjbGFzc05hbWUgPT09ICdmaWxsJyB8fCBjbGFzc05hbWUgPT09ICdqdXN0aWZpZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuanVzdGlmeUNsYXNzID0gYG5hdi0ke2NsYXNzTmFtZX1gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuanVzdGlmeUNsYXNzID0gYGp1c3RpZnktY29udGVudC0ke2NsYXNzTmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdChzdGVwSWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFN0ZXAgPSB0aGlzLmdldFN0ZXBCeUlkKHN0ZXBJZCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRBY3RpdmUgPSB0aGlzLmdldFN0ZXBCeUlkKHRoaXMuYWN0aXZlSWQpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZFN0ZXAnKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhzZWxlY3RlZFN0ZXApO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRTdGVwICYmICFzZWxlY3RlZFN0ZXAuZGlzYWJsZWQgJiYgdGhpcy5hY3RpdmVJZCAhPT0gc2VsZWN0ZWRTdGVwLmlkKSB7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlkOiB0aGlzLmFjdGl2ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZURhdGE6IHNlbGVjdGVkQWN0aXZlLmRhdGEgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0SWQ6IHNlbGVjdGVkU3RlcC5pZCxcclxuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4geyBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICghZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJZCA9IHNlbGVjdGVkU3RlcC5pZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBMYW1iU3RlcENvbmZpZykge1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5qdXN0aWZ5ID0gdGhpcy5jb25maWcuanVzdGlmeTtcclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5jb25maWcub3JpZW50YXRpb247XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMgPSB0aGlzLmNvbmZpZy5jb25maWdOYW1lcztcclxuICAgIH1cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KCkgdHlwZTogJ3N0ZXBzcycgfCAncGlsbHMnO1xyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVTdGVwID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUlkID0gYWN0aXZlU3RlcCA/IGFjdGl2ZVN0ZXAuaWQgOiAodGhpcy5zdGVwcy5sZW5ndGggPyB0aGlzLnN0ZXBzLmZpcnN0LmlkIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwQnlJZChpZDogc3RyaW5nKTogTGFtYlN0ZXBEaXJlY3RpdmUge1xyXG4gICAgICAgIGNvbnN0IHN0ZXBzV2l0aElkOiBMYW1iU3RlcERpcmVjdGl2ZVtdID0gdGhpcy5zdGVwcy5maWx0ZXIoc3RlcCA9PiBzdGVwLmlkID09PSBpZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0ZXBzV2l0aElkLmxlbmd0aCA/IHN0ZXBzV2l0aElkWzBdIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmFjaygpIHtcclxuICAgICAgICBjb25zdCBiYWNrID0gdGhpcy5nZXRTdGVwSWRTcGxpY2UoLTEpO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QoYmFjayk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbmV4dCgpIHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5nZXRTdGVwSWRTcGxpY2UoKzEpO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QobmV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwSWRTcGxpY2UoY29uZGljaW9uOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBhY3R1YWwgPSB0aGlzLmFjdGl2ZUlkO1xyXG4gICAgICAgIGNvbnN0IHNwbGljZSA9IGFjdHVhbC5zbGljZSgwLCBhY3R1YWwubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChhY3R1YWwuc2xpY2UoKGFjdHVhbC5sZW5ndGggLSAxKSwgYWN0dWFsLmxlbmd0aCksIDEwKTtcclxuICAgICAgICBjb25zdCBuZXh0ID0gYCR7c3BsaWNlfSR7KGluZGV4ICsgKGNvbmRpY2lvbikpfWA7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGhpZGVQcmV2aW91cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ2xhbWItc3RlcC0wJztcclxuICAgIH1cclxuICAgIGdldCBoaWRlTmV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBhbGxMZW5ndGggPSAodGhpcy5zdGVwcy5sZW5ndGggLSAxKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ2xhbWItc3RlcC0nICsgYWxsTGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlTGluZVJpZ2h0KHN0ZXBJZCkge1xyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSBwYXJzZUludChzdGVwSWQuc2xpY2Uoc3RlcElkLmxlbmd0aCAtIDEsIHN0ZXBJZC5sZW5ndGgpLCAxMCk7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0ZXBzLmxlbmd0aCAhPT0gKHN0ZXAgKyAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIG5leHRJZCA9IDA7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBMQU1CX1NURVBTX0NPTVBPTkVOVFMgPSBbXHJcbiAgICBMYW1iU3RlcEdyb3VwQ29tcG9uZW50LFxyXG4gICAgTGFtYlN0ZXBEaXJlY3RpdmUsXHJcbiAgICBMYW1iU3RlcFRpdGxlRGlyZWN0aXZlLFxyXG4gICAgTGFtYlN0ZXBDb250ZW50RGlyZWN0aXZlLFxyXG5dO1xyXG5cclxuIl19