lct-components
Version:
LCT basic components
195 lines • 47.2 kB
JavaScript
import { Component, EventEmitter, Input, Output, } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "../input-text/input-text.component";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
import * as i5 from "../pipes/label.title.pipe";
import * as i6 from "../pipes/label.pipe";
export class SelectMultipleNestedComponent {
constructor(sanitizer) {
this.sanitizer = sanitizer;
this.list = [];
this.listFiltered = [];
this.title = 'Insert title';
this.disabled = 'false';
this.showIcon = true;
this.placeholder = 'Insert placeholder';
this.placeholderFilter = 'Buscar';
this.quantityToFilter = 6;
this.heightOptions = '200px';
this.id = ''; // ID en Button Opcional
this.shareCheckedList = new EventEmitter();
this.shareIndividualCheckedList = new EventEmitter();
this.setAutofocusEvent = new EventEmitter();
this.disabledValue = false;
this.filter = '';
this.currentSelected = null;
this.showDropDown = false;
this.searchValue = '';
this.iconFinder = this.sanitizer.bypassSecurityTrustResourceUrl(`data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMCAyMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEyLjE1MDMgMTIuNDE2M0MxMi4yOTUgMTIuMjcxNyAxMi41MTk1IDEyLjI1NTYgMTIuNjgxOSAxMi4zNjgxTDEyLjczOTYgMTIuNDE2M0wxNi40MDYxIDE2LjA4MjhDMTYuNTY4OCAxNi4yNDU1IDE2LjU2ODggMTYuNTA5MyAxNi40MDYxIDE2LjY3MkMxNi4yNjE0IDE2LjgxNjcgMTYuMDM2OSAxNi44MzI4IDE1Ljg3NDUgMTYuNzIwM0wxNS44MTY4IDE2LjY3MkwxMi4xNTAzIDEzLjAwNTZDMTEuOTg3NiAxMi44NDI4IDExLjk4NzYgMTIuNTc5IDEyLjE1MDMgMTIuNDE2M1oiIGZpbGw9IiMyNjQ5QjYiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi4zOTcxIDUuNTkxOTFDMTAuNDQ0NSAzLjYzOTI5IDcuMjc4NjggMy42MzkyOSA1LjMyNjA2IDUuNTkxOTFDMy4zNzM0NCA3LjU0NDUzIDMuMzczNDQgMTAuNzEwNCA1LjMyNjA2IDEyLjY2M0M3LjI3ODY4IDE0LjYxNTYgMTAuNDQ0NSAxNC42MTU2IDEyLjM5NzEgMTIuNjYzQzE0LjM0OTggMTAuNzEwNCAxNC4zNDk4IDcuNTQ0NTMgMTIuMzk3MSA1LjU5MTkxWk01LjkxNTMyIDEyLjA3MzdDNC4yODgxMyAxMC40NDY1IDQuMjg4MTMgNy44MDgzNSA1LjkxNTMyIDYuMTgxMTZDNy41NDI1IDQuNTUzOTggMTAuMTgwNyA0LjU1Mzk4IDExLjgwNzkgNi4xODExNkMxMy40MzUxIDcuODA4MzUgMTMuNDM1MSAxMC40NDY1IDExLjgwNzkgMTIuMDczN0MxMC4xODA3IDEzLjcwMDkgNy41NDI1IDEzLjcwMDkgNS45MTUzMiAxMi4wNzM3WiIgZmlsbD0iIzI2NDlCNiIvPgo8L3N2Zz4K`);
}
// Propiedad calculada para generar el id dinámico
get selectId() {
return this.id ? `select-${this.id}` : null;
}
ngOnInit() {
this.listFiltered = [...this.list];
// console.log(this.listFiltered);
this.disabledValue =
this.disabled === true || this.disabled == 'true' || this.disabled === '';
}
ngOnChanges(changes) {
if (changes['disabled'] && !changes['disabled'].firstChange) {
if (changes['disabled'].currentValue === true ||
changes['disabled'].currentValue == 'true' ||
changes['disabled'].currentValue === '') {
this.disabledValue = true;
}
else {
this.disabledValue = false;
}
}
if (changes['list']) {
if (Array.isArray(changes['list'].currentValue)) {
this.list = changes['list'].currentValue;
this.applyFilter();
}
}
}
getListChecked() {
return this.listFiltered.reduce((accumulator, category) => {
const checkedOptions = category.listOptions.filter((option) => option.checked);
return accumulator.concat(checkedOptions);
}, []);
}
getTotalCategoryCount() {
let totalCount = 0;
for (const _category in this.list) {
totalCount += 1;
}
return totalCount;
}
getCategories() {
return Object.keys(this.list);
}
toggleCategory(category) {
category.open = !category.open;
}
shareChecked() {
this.shareCheckedList.emit(this.getListChecked());
}
shareIndividualStatus() {
if (this.currentSelected) {
this.shareIndividualCheckedList.emit(this.currentSelected);
}
}
toggleAllOptions(category) {
//category.checkedAll = !category.checkedAll;
category.listOptions.forEach((option) => {
if (!option.disabled) {
option.checked = category.checkedAll || false;
}
});
this.shareChecked();
}
toggleOption(category, option) {
if (category) {
category.checkedAll = category.listOptions
.filter((option) => !option.disabled)
.every((option) => option.checked);
this.currentSelected = option;
this.shareIndividualStatus();
this.shareChecked();
}
}
discardOption(category, option) {
this.showDropDown = !this.showDropDown;
if (category) {
option.checked = false;
category.checkedAll = category.listOptions.every((option) => option.checked);
this.currentSelected = option;
this.shareIndividualStatus();
this.shareChecked();
}
}
// Método para filtrar los datos basados en el nombre de las opciones
filterData(value) {
if (!value) {
return this.list; // Retorna la lista completa si no hay valor de búsqueda
}
// Filtra cada categoría y sus opciones
const normalizar = (str) => str
.normalize('NFD') // Descompone los caracteres con tilde
.replace(/[\u0300-\u036f]/g, '') // Elimina los signos diacríticos
.toLowerCase();
return this.list
.map((category) => {
const filteredOptions = category.listOptions.filter((opt) => normalizar(opt.name).includes(normalizar(value)));
return Object.assign(Object.assign({}, category), { listOptions: filteredOptions });
})
.filter((category) => category.listOptions.length > 0);
}
applyFilter() {
this.listFiltered = this.filterData(this.searchValue); // Actualiza la lista filtrada
}
findOptionCategory(option) {
for (let category of this.list) {
if (category.listOptions.includes(option)) {
return category;
}
}
return null; // Retornar null si no se encuentra la categoría
}
clickFilterComponent() {
var _a;
this.showDropDown = !this.showDropDown;
//Desactivar autofocus externo cuando se muestra el buscador
if (this.list.length >= this.quantityToFilter) {
(_a = this.setAutofocusEvent) === null || _a === void 0 ? void 0 : _a.emit(this.showDropDown);
}
}
leaveComponent() {
var _a;
this.showDropDown = false;
//Desactivar autofocus externo cuando se muestra el buscador
if (this.list.length >= this.quantityToFilter) {
(_a = this.setAutofocusEvent) === null || _a === void 0 ? void 0 : _a.emit(this.showDropDown);
}
}
}
SelectMultipleNestedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SelectMultipleNestedComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
SelectMultipleNestedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SelectMultipleNestedComponent, selector: "lct-select-multiple-nested", inputs: { list: "list", title: "title", disabled: "disabled", showIcon: "showIcon", placeholder: "placeholder", placeholderFilter: "placeholderFilter", quantityToFilter: "quantityToFilter", heightOptions: "heightOptions", id: "id" }, outputs: { shareCheckedList: "shareCheckedList", shareIndividualCheckedList: "shareIndividualCheckedList", setAutofocusEvent: "setAutofocusEvent" }, usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"title\">{{title}}</div>\n <div class=\"containerSelectMultiple\" (mouseleave)=\"leaveComponent()\">\n <button [attr.id]=\"selectId\" class=\"drop-toggle\" [disabled]=\"disabledValue\" (click)=\"clickFilterComponent()\">\n <span *ngIf=\"getListChecked().length<=0\">{{placeholder}}</span>\n <span *ngIf=\"getListChecked().length>0\">\n <div class=\"selected\">\n <span [ngClass]=\"{'text-disabled':getListChecked()[0].disabled || false}\">{{getListChecked()[0].name | labelTitlePipe}}</span>\n <div class=\"icon\" (click)=\"discardOption(findOptionCategory(getListChecked()[0]), getListChecked()[0])\" [ngClass]=\"{'icon-disabled':getListChecked()[0].disabled || false}\">\n <svg [ngClass]=\"{'text-disabled':getListChecked()[0].disabled || false}\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 4 24 24\"\n fill=\"none\"\n style=\"color: #2649B6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.2253 4.81108C5.83477 4.42056 5.20161 4.42056 4.81108 4.81108C4.42056 5.20161 4.42056 5.83477 4.81108 6.2253L10.5858 12L4.81114 17.7747C4.42062 18.1652 4.42062 18.7984 4.81114 19.1889C5.20167 19.5794 5.83483 19.5794 6.22535 19.1889L12 13.4142L17.7747 19.1889C18.1652 19.5794 18.7984 19.5794 19.1889 19.1889C19.5794 18.7984 19.5794 18.1652 19.1889 17.7747L13.4142 12L19.189 6.2253C19.5795 5.83477 19.5795 5.20161 19.189 4.81108C18.7985 4.42056 18.1653 4.42056 17.7748 4.81108L12 10.5858L6.2253 4.81108Z\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n </div>\n <span class=\"moreSelected\" *ngIf=\"getListChecked().length > 1 \">(+ {{getListChecked().length - 1}} m\u00E1s)</span>\n <!--{{getListChecked().join(', ')}}-->\n </span>\n <img *ngIf=\"showIcon\"\n class=\"select-box__icon\"\n [ngStyle]=\"{'transform': showDropDown ? 'translateY(-50%) rotate(180deg)' : 'translateY(-50%) rotate(0deg)' }\"\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gU3ZnIFZlY3RvciBJY29ucyA6IGh0dHA6Ly93d3cub25saW5ld2ViZm9udHMuY29tL2ljb24gLS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAwIDEwMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPG1ldGFkYXRhPiBTdmcgVmVjdG9yIEljb25zIDogaHR0cDovL3d3dy5vbmxpbmV3ZWJmb250cy5jb20vaWNvbiA8L21ldGFkYXRhPg0KPGc+PHBhdGggZD0iTTUwMCw3NzUuNEwxMCwyODcuMmw2NC40LTYyLjZMNTAwLDY1MC4ybDQyNS42LTQyNS42bDY0LjQsNjIuNkw1MDAsNzc1LjR6Ii8+PC9nPg0KPC9zdmc+\" alt=\"Arrow Icon\"\n aria-hidden=\"true\"/>\n </button>\n <div class=\"drop-show\" *ngIf=\"showDropDown && list.length>0\">\n <div *ngIf=\"getTotalCategoryCount()>=quantityToFilter\" class=\"main\">\n <lct-input-text [placeholder]=\"placeholderFilter\" title=\"\"\n [(ngModel)]=\"searchValue\"\n (ngModelChange)=\"applyFilter()\"\n [icon]=\"iconFinder\"\n [showIcon]=\"true\"\n ></lct-input-text>\n </div>\n <div [ngStyle]=\"{'height': getTotalCategoryCount()>=quantityToFilter ? heightOptions : 'auto','overflow-y':getTotalCategoryCount()>=quantityToFilter ? 'auto':''}\">\n <div *ngFor=\"let category of listFiltered\">\n <div style=\"display: inline-flex;\">\n <svg [ngStyle]=\"{'transform': category.open ? 'translateY(25%) rotate(180deg)' : 'translateY(25%) rotate(0deg)' }\"\n (click)=\"toggleCategory(category)\" class=\"select-box__category\"\n width=\"17\" height=\"18\" viewBox=\"0 0 17 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M13.459 7.58398L8.50065 11.834L3.54232 7.58398\" stroke=\"#2649B6\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n </svg>\n <!-- <img *ngIf=\"showIcon\"\n class=\"select-box__category\"\n [ngStyle]=\"{'transform': category.open ? 'translateY(32%) rotate(180deg)' : 'translateY(32%) rotate(0deg)' }\"\n src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gU3ZnIFZlY3RvciBJY29ucyA6IGh0dHA6Ly93d3cub25saW5ld2ViZm9udHMuY29tL2ljb24gLS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMTAwMCAxMDAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAwIDEwMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPG1ldGFkYXRhPiBTdmcgVmVjdG9yIEljb25zIDogaHR0cDovL3d3dy5vbmxpbmV3ZWJmb250cy5jb20vaWNvbiA8L21ldGFkYXRhPg0KPGc+PHBhdGggZD0iTTUwMCw3NzUuNEwxMCwyODcuMmw2NC40LTYyLjZMNTAwLDY1MC4ybDQyNS42LTQyNS42bDY0LjQsNjIuNkw1MDAsNzc1LjR6Ii8+PC9nPg0KPC9zdmc+\" alt=\"Arrow Icon\"\n aria-hidden=\"true\" height=\"17px\" width=\"17px\" (click)=\"toggleCategory(category)\"/> -->\n <label class=\"main\">\n <span class=\"text-capitalize\" style=\"margin-left: 21px;\">{{ category.name.toLowerCase() | labelPipe }} </span>\n <span *ngIf=\"category.quantity\">({{category.quantity}})</span>\n <input type=\"checkbox\" [(ngModel)]=\"category.checkedAll\"\n (change)=\"toggleAllOptions(category)\" [disabled]=\"category.disabled || false || searchValue.length > 0\">\n <span class=\"mark\" [ngClass]=\"{'mark-disabled': category.disabled || false || searchValue.length > 0}\"></span>\n </label>\n </div>\n\n <ul *ngIf=\"category.open\">\n <label class=\"main\" *ngFor=\"let option of category.listOptions\">\n <span class=\"text-capitalize\" style=\"margin-left: 21px;\" [ngClass]=\"{ 'text-disabled': option.disabled }\">{{ option.name.toLowerCase() | labelPipe }} </span>\n <span *ngIf=\"option.quantity\">({{option.quantity}})</span>\n <input type=\"checkbox\" [(ngModel)]=\"option.checked\"\n (change)=\"toggleOption(category, option)\" [disabled]=\"option.disabled || false\"/>\n <span class=\"mark\" [ngClass]=\"{'mark-disabled': option.disabled || false}\"></span>\n </label>\n </ul>\n\n </div>\n\n </div>\n </div>\n <div class=\"drop-empty\" *ngIf=\"showDropDown && list.length===0\">\n Sin informaci\u00F3n\n </div>\n </div>\n</div>\n", styles: ["*{font-family:\"Barlow\",\"Open Sans\",\"Helvetica Neue\",\"Segoe UI\",\"Calibri\",\"Arial\",sans-serif}.title{color:#3c4149;font-size:12px;letter-spacing:0;line-height:15px;margin-left:2px;margin-bottom:5px}.containerSelectMultiple{width:100%;position:relative}.drop-toggle{background-color:#e0e5ee;cursor:pointer;box-sizing:border-box;height:41px;width:100%;border:0;border-radius:5px;text-align:left;font-size:14px;padding-left:12px;color:#3c4149;overflow:hidden}.select-box__icon{position:absolute;right:15px;width:20px;top:50%;transform:translateY(-50%) rotate(0);opacity:.3;transition:.2s ease}.select-box__category{width:17px;transform:translateY(25%) rotate(0);color:#2649b6;transition:.2s ease;margin-left:10px;cursor:pointer}button:disabled{background-color:#f5f7fa;cursor:not-allowed;color:#c8ccd4}.drop-toggle i{float:right}.drop-show{box-sizing:border-box;width:100%;border:1px solid #E0E5EE;border-radius:5px;background-color:#fff;position:absolute;z-index:2;box-shadow:0 6px 10px #00000026;margin-left:1px}.drop-empty{width:100%;border:1px solid #E0E5EE;border-radius:5px;background-color:#fff;position:absolute;z-index:2;box-shadow:0 6px 10px #00000026;padding:12px;cursor:no-drop}.mark-disabled{background-color:#c8ccd4!important}.text-disabled{color:#c8ccd4!important}.icon-disabled{pointer-events:none}.selected{display:inline-block;position:relative;margin-right:5px;box-sizing:border-box;height:26px;border:1px solid #C2C2C2;border-radius:3px;background-color:#f5f7fa;font-size:13px;letter-spacing:0;line-height:16px;padding:5px}.selected span{vertical-align:top}.selected .icon{display:inline;margin-left:2px}.moreSelected{position:absolute;margin-top:8px;color:#3c4149;font-size:12px;letter-spacing:0;line-height:15px}ul .main{display:block;position:relative;margin-left:17px;margin-right:17px;margin-bottom:5px;cursor:pointer;color:#3c4149;font-size:13px;letter-spacing:0;line-height:27px}.main{display:block;position:relative;margin-left:10px;margin-right:17px;margin-bottom:5px;cursor:pointer;color:#3c4149;font-size:13px;letter-spacing:0;line-height:27px}.text{margin-left:27px}input[type=checkbox]{visibility:hidden}.mark{position:absolute;top:5px;left:0;box-sizing:border-box;height:17px;width:17px;border:1px solid #D6D6D6;border-radius:2px;background-color:#f4f4f4}.main:hover input~.mark{background-color:#c2c2c2}.main input:active~.mark{background-color:#546c84}.main input:checked~.mark{background-color:#2649b6}.mark:after{content:\"\";position:absolute;display:none}.main input:checked~.mark:after{display:block}.main .mark:after{left:5px;bottom:5px;width:3px;height:6px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}\n"], components: [{ type: i2.InputTextComponent, selector: "lct-input-text", inputs: ["disabled", "icon", "iconPosition", "pdaAutoEnter", "placeholder", "showIcon", "title", "type", "error", "id", "transparent"], outputs: ["enterEmitted", "iconClick", "inputClick"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }], pipes: { "labelTitlePipe": i5.LabelTitlePipe, "labelPipe": i6.LabelPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SelectMultipleNestedComponent, decorators: [{
type: Component,
args: [{
selector: 'lct-select-multiple-nested',
templateUrl: './select-multiple-nested.component.html',
styleUrls: ['./select-multiple-nested.component.css'],
}]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { list: [{
type: Input
}], title: [{
type: Input
}], disabled: [{
type: Input
}], showIcon: [{
type: Input
}], placeholder: [{
type: Input
}], placeholderFilter: [{
type: Input
}], quantityToFilter: [{
type: Input
}], heightOptions: [{
type: Input
}], id: [{
type: Input
}], shareCheckedList: [{
type: Output
}], shareIndividualCheckedList: [{
type: Output
}], setAutofocusEvent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LW11bHRpcGxlLW5lc3RlZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC1tdWx0aXBsZS1uZXN0ZWQvc2VsZWN0LW11bHRpcGxlLW5lc3RlZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC1tdWx0aXBsZS1uZXN0ZWQvc2VsZWN0LW11bHRpcGxlLW5lc3RlZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQTBCdkIsTUFBTSxPQUFPLDZCQUE2QjtJQTRCeEMsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTNCbEMsU0FBSSxHQUFnQyxFQUFFLENBQUM7UUFDaEQsaUJBQVksR0FBZ0MsRUFBRSxDQUFDO1FBQ3RDLFVBQUssR0FBRyxjQUFjLENBQUM7UUFDdkIsYUFBUSxHQUFpRCxPQUFPLENBQUM7UUFDakUsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixnQkFBVyxHQUFHLG9CQUFvQixDQUFDO1FBQ25DLHNCQUFpQixHQUFHLFFBQVEsQ0FBQztRQUM3QixxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0Isa0JBQWEsR0FBVyxPQUFPLENBQUM7UUFDaEMsT0FBRSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUV6QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RDLCtCQUEwQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEQsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUMxRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztR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LFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFFSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcblxuZXhwb3J0IGludGVyZmFjZSBJTENUU2VsZWN0TXVsdGlwbGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNoZWNrZWQ6IGJvb2xlYW47XG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBkaXNhYmxlZD86IGJvb2xlYW4gfCBzdHJpbmc7XG4gIHNlY29uZGFyeVZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBxdWFudGl0eT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGlzdFNlbGVjdE11bHRpcGxlTmVzdGVkIHtcbiAgbmFtZTogc3RyaW5nO1xuICBjaGVja2VkQWxsPzogYm9vbGVhbjtcbiAgbGlzdE9wdGlvbnM6IElMQ1RTZWxlY3RNdWx0aXBsZVtdO1xuICBkaXNhYmxlZD86IGJvb2xlYW4gfCBzdHJpbmc7XG4gIG9wZW4/OiBib29sZWFuO1xuICBxdWFudGl0eT86IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGN0LXNlbGVjdC1tdWx0aXBsZS1uZXN0ZWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LW11bHRpcGxlLW5lc3RlZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC1tdWx0aXBsZS1uZXN0ZWQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RNdWx0aXBsZU5lc3RlZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgbGlzdDogSUxpc3RTZWxlY3RNdWx0aXBsZU5lc3RlZFtdID0gW107XG4gIGxpc3RGaWx0ZXJlZDogSUxpc3RTZWxlY3RNdWx0aXBsZU5lc3RlZFtdID0gW107XG4gIEBJbnB1dCgpIHRpdGxlID0gJ0luc2VydCB0aXRsZSc7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiAndHJ1ZScgfCAnZmFsc2UnIHwgJ2Rpc2FibGVkJyB8IGJvb2xlYW4gfCAnJyA9ICdmYWxzZSc7XG4gIEBJbnB1dCgpIHNob3dJY29uID0gdHJ1ZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnSW5zZXJ0IHBsYWNlaG9sZGVyJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXJGaWx0ZXIgPSAnQnVzY2FyJztcbiAgQElucHV0KCkgcXVhbnRpdHlUb0ZpbHRlcjogbnVtYmVyID0gNjtcbiAgQElucHV0KCkgaGVpZ2h0T3B0aW9uczogc3RyaW5nID0gJzIwMHB4JztcbiAgQElucHV0KCkgaWQ/OiBzdHJpbmcgPSAnJzsgLy8gSUQgZW4gQnV0dG9uIE9wY2lvbmFsXG5cbiAgQE91dHB1dCgpIHNoYXJlQ2hlY2tlZExpc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzaGFyZUluZGl2aWR1YWxDaGVja2VkTGlzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHNldEF1dG9mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBkaXNhYmxlZFZhbHVlID0gZmFsc2U7XG5cbiAgaWNvbkZpbmRlcjtcbiAgZmlsdGVyOiBzdHJpbmcgPSAnJztcblxuICBjdXJyZW50U2VsZWN0ZWQ6IElMQ1RTZWxlY3RNdWx0aXBsZSB8IG51bGwgPSBudWxsO1xuICBzaG93RHJvcERvd24gPSBmYWxzZTtcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuXG4gIC8vIFByb3BpZWRhZCBjYWxjdWxhZGEgcGFyYSBnZW5lcmFyIGVsIGlkIGRpbsOhbWljb1xuICBnZXQgc2VsZWN0SWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaWQgPyBgc2VsZWN0LSR7dGhpcy5pZH1gIDogbnVsbDtcbiAgfVxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XG4gICAgdGhpcy5pY29uRmluZGVyID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFxuICAgICAgYGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjNhV1IwYUQwaU1qQWlJR2hsYVdkb2REMGlNakVpSUhacFpYZENiM2c5SWpBZ01DQXlNQ0F5TVNJZ1ptbHNiRDBpYm05dVpTSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklqNEtQSEJoZEdnZ1pEMGlUVEV5TGpFMU1ETWdNVEl1TkRFMk0wTXhNaTR5T1RVZ01USXVNamN4TnlBeE1pNDFNVGsxSURFeUxqSTFOVFlnTVRJdU5qZ3hPU0F4TWk0ek5qZ3hUREV5TGpjek9UWWdNVEl1TkRFMk0wd3hOaTQwTURZeElERTJMakE0TWpoRE1UWXVOVFk0T0NBeE5pNHlORFUxSURFMkxqVTJPRGdnTVRZdU5UQTVNeUF4Tmk0ME1EWXhJREUyTGpZM01rTXhOaTR5TmpFMElERTJMamd4TmpjZ01UWXVNRE0yT1NBeE5pNDRNekk0SURFMUxqZzNORFVnTVRZdU56SXdNMHd4TlM0NE1UWTRJREUyTGpZM01rd3hNaTR4TlRBeklERXpMakF3TlRaRE1URXVPVGczTmlBeE1pNDROREk0SURFeExqazROellnTVRJdU5UYzVJREV5TGpFMU1ETWdNVEl1TkRFMk0xb2lJR1pwYkd3OUlpTXlOalE1UWpZaUx6NEtQSEJoZEdnZ1ptbHNiQzF5ZFd4bFBTSmxkbVZ1YjJSa0lpQmpiR2x3TFhKMWJHVTlJbVYyWlc1dlpHUWlJR1E5SWsweE1pNHpPVGN4SURVdU5Ua3hPVEZETVRBdU5EUTBOU0F6TGpZek9USTVJRGN1TWpjNE5qZ2dNeTQyTXpreU9TQTFMak15TmpBMklEVXVOVGt4T1RGRE15NHpOek0wTkNBM0xqVTBORFV6SURNdU16Y3pORFFnTVRBdU56RXdOQ0ExTGpNeU5qQTJJREV5TGpZMk0wTTNMakkzT0RZNElERTBMall4TlRZZ01UQXVORFEwTlNBeE5DNDJNVFUySURFeUxqTTVOekVnTVRJdU5qWXpRekUwTGpNME9UZ2dNVEF1TnpFd05DQXhOQzR6TkRrNElEY3VOVFEwTlRNZ01USXVNemszTVNBMUxqVTVNVGt4V2swMUxqa3hOVE15SURFeUxqQTNNemRETkM0eU9EZ3hNeUF4TUM0ME5EWTFJRFF1TWpnNE1UTWdOeTQ0TURnek5TQTFMamt4TlRNeUlEWXVNVGd4TVRaRE55NDFOREkxSURRdU5UVXpPVGdnTVRBdU1UZ3dOeUEwTGpVMU16azRJREV4TGpnd056a2dOaTR4T0RFeE5rTXhNeTQwTXpVeElEY3VPREE0TXpVZ01UTXVORE0xTVNBeE1DNDBORFkxSURFeExqZ3dOemtnTVRJdU1EY3pOME14TUM0eE9EQTNJREV6TGpjd01Ea2dOeTQxTkRJMUlERXpMamN3TURrZ05TNDVNVFV6TWlBeE1pNHdOek0zV2lJZ1ptbHNiRDBpSXpJMk5EbENOaUl2UGdvOEwzTjJaejRLYFxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxpc3RGaWx0ZXJlZCA9IFsuLi50aGlzLmxpc3RdO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMubGlzdEZpbHRlcmVkKTtcbiAgICB0aGlzLmRpc2FibGVkVmFsdWUgPVxuICAgICAgdGhpcy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fCB0aGlzLmRpc2FibGVkID09ICd0cnVlJyB8fCB0aGlzLmRpc2FibGVkID09PSAnJztcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snZGlzYWJsZWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzWydkaXNhYmxlZCddLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSB8fFxuICAgICAgICBjaGFuZ2VzWydkaXNhYmxlZCddLmN1cnJlbnRWYWx1ZSA9PSAndHJ1ZScgfHxcbiAgICAgICAgY2hhbmdlc1snZGlzYWJsZWQnXS5jdXJyZW50VmFsdWUgPT09ICcnXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZFZhbHVlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWRWYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snbGlzdCddKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFuZ2VzWydsaXN0J10uY3VycmVudFZhbHVlKSkge1xuICAgICAgICB0aGlzLmxpc3QgPSBjaGFuZ2VzWydsaXN0J10uY3VycmVudFZhbHVlO1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TGlzdENoZWNrZWQoKTogSUxDVFNlbGVjdE11bHRpcGxlW10ge1xuICAgIHJldHVybiB0aGlzLmxpc3RGaWx0ZXJlZC5yZWR1Y2UoXG4gICAgICAoYWNjdW11bGF0b3I6IElMQ1RTZWxlY3RNdWx0aXBsZVtdLCBjYXRlZ29yeSkgPT4ge1xuICAgICAgICBjb25zdCBjaGVja2VkT3B0aW9ucyA9IGNhdGVnb3J5Lmxpc3RPcHRpb25zLmZpbHRlcihcbiAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uY2hlY2tlZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IuY29uY2F0KGNoZWNrZWRPcHRpb25zKTtcbiAgICAgIH0sXG4gICAgICBbXVxuICAgICk7XG4gIH1cblxuICBnZXRUb3RhbENhdGVnb3J5Q291bnQoKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWxDb3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IF9jYXRlZ29yeSBpbiB0aGlzLmxpc3QpIHtcbiAgICAgIHRvdGFsQ291bnQgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG90YWxDb3VudDtcbiAgfVxuXG4gIGdldENhdGVnb3JpZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmxpc3QpO1xuICB9XG5cbiAgdG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnk6IElMaXN0U2VsZWN0TXVsdGlwbGVOZXN0ZWQpOiB2b2lkIHtcbiAgICBjYXRlZ29yeS5vcGVuID0gIWNhdGVnb3J5Lm9wZW47XG4gIH1cblxuICBzaGFyZUNoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaGFyZUNoZWNrZWRMaXN0LmVtaXQodGhpcy5nZXRMaXN0Q2hlY2tlZCgpKTtcbiAgfVxuXG4gIHNoYXJlSW5kaXZpZHVhbFN0YXR1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2hhcmVJbmRpdmlkdWFsQ2hlY2tlZExpc3QuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlQWxsT3B0aW9ucyhjYXRlZ29yeTogSUxpc3RTZWxlY3RNdWx0aXBsZU5lc3RlZCk6IHZvaWQge1xuICAgIC8vY2F0ZWdvcnkuY2hlY2tlZEFsbCA9ICFjYXRlZ29yeS5jaGVja2VkQWxsO1xuICAgIGNhdGVnb3J5Lmxpc3RPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCFvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgICAgb3B0aW9uLmNoZWNrZWQgPSBjYXRlZ29yeS5jaGVja2VkQWxsIHx8IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc2hhcmVDaGVja2VkKCk7XG4gIH1cblxuICB0b2dnbGVPcHRpb24oXG4gICAgY2F0ZWdvcnk6IElMaXN0U2VsZWN0TXVsdGlwbGVOZXN0ZWQgfCBudWxsLFxuICAgIG9wdGlvbjogSUxDVFNlbGVjdE11bHRpcGxlXG4gICk6IHZvaWQge1xuICAgIGlmIChjYXRlZ29yeSkge1xuICAgICAgY2F0ZWdvcnkuY2hlY2tlZEFsbCA9IGNhdGVnb3J5Lmxpc3RPcHRpb25zXG4gICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5kaXNhYmxlZClcbiAgICAgICAgLmV2ZXJ5KChvcHRpb24pID0+IG9wdGlvbi5jaGVja2VkKTtcbiAgICAgIHRoaXMuY3VycmVudFNlbGVjdGVkID0gb3B0aW9uO1xuICAgICAgdGhpcy5zaGFyZUluZGl2aWR1YWxTdGF0dXMoKTtcbiAgICAgIHRoaXMuc2hhcmVDaGVja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgZGlzY2FyZE9wdGlvbihcbiAgICBjYXRlZ29yeTogSUxpc3RTZWxlY3RNdWx0aXBsZU5lc3RlZCB8IG51bGwsXG4gICAgb3B0aW9uOiBJTENUU2VsZWN0TXVsdGlwbGVcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RHJvcERvd24gPSAhdGhpcy5zaG93RHJvcERvd247XG4gICAgaWYgKGNhdGVnb3J5KSB7XG4gICAgICBvcHRpb24uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgY2F0ZWdvcnkuY2hlY2tlZEFsbCA9IGNhdGVnb3J5Lmxpc3RPcHRpb25zLmV2ZXJ5KFxuICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uY2hlY2tlZFxuICAgICAgKTtcbiAgICAgIHRoaXMuY3VycmVudFNlbGVjdGVkID0gb3B0aW9uO1xuICAgICAgdGhpcy5zaGFyZUluZGl2aWR1YWxTdGF0dXMoKTtcbiAgICAgIHRoaXMuc2hhcmVDaGVja2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTcOpdG9kbyBwYXJhIGZpbHRyYXIgbG9zIGRhdG9zIGJhc2Fkb3MgZW4gZWwgbm9tYnJlIGRlIGxhcyBvcGNpb25lc1xuICBmaWx0ZXJEYXRhKHZhbHVlOiBzdHJpbmcpOiBJTGlzdFNlbGVjdE11bHRpcGxlTmVzdGVkW10ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpc3Q7IC8vIFJldG9ybmEgbGEgbGlzdGEgY29tcGxldGEgc2kgbm8gaGF5IHZhbG9yIGRlIGLDunNxdWVkYVxuICAgIH1cblxuICAgIC8vIEZpbHRyYSBjYWRhIGNhdGVnb3LDrWEgeSBzdXMgb3BjaW9uZXNcbiAgICBjb25zdCBub3JtYWxpemFyID0gKHN0cjogc3RyaW5nKSA9PlxuICAgICAgc3RyXG4gICAgICAgIC5ub3JtYWxpemUoJ05GRCcpIC8vIERlc2NvbXBvbmUgbG9zIGNhcmFjdGVyZXMgY29uIHRpbGRlXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJykgLy8gRWxpbWluYSBsb3Mgc2lnbm9zIGRpYWNyw610aWNvc1xuICAgICAgICAudG9Mb3dlckNhc2UoKTtcblxuICAgIHJldHVybiB0aGlzLmxpc3RcbiAgICAgIC5tYXAoKGNhdGVnb3J5KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkT3B0aW9ucyA9IGNhdGVnb3J5Lmxpc3RPcHRpb25zLmZpbHRlcigob3B0KSA9PlxuICAgICAgICAgIG5vcm1hbGl6YXIob3B0Lm5hbWUpLmluY2x1ZGVzKG5vcm1hbGl6YXIodmFsdWUpKVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2F0ZWdvcnksXG4gICAgICAgICAgbGlzdE9wdGlvbnM6IGZpbHRlcmVkT3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkubGlzdE9wdGlvbnMubGVuZ3RoID4gMCk7XG4gIH1cblxuICBhcHBseUZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RGaWx0ZXJlZCA9IHRoaXMuZmlsdGVyRGF0YSh0aGlzLnNlYXJjaFZhbHVlKTsgLy8gQWN0dWFsaXphIGxhIGxpc3RhIGZpbHRyYWRhXG4gIH1cblxuICBmaW5kT3B0aW9uQ2F0ZWdvcnkoXG4gICAgb3B0aW9uOiBJTENUU2VsZWN0TXVsdGlwbGVcbiAgKTogSUxpc3RTZWxlY3RNdWx0aXBsZU5lc3RlZCB8IG51bGwge1xuICAgIGZvciAobGV0IGNhdGVnb3J5IG9mIHRoaXMubGlzdCkge1xuICAgICAgaWYgKGNhdGVnb3J5Lmxpc3RPcHRpb25zLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGNhdGVnb3J5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDsgLy8gUmV0b3JuYXIgbnVsbCBzaSBubyBzZSBlbmN1ZW50cmEgbGEgY2F0ZWdvcsOtYVxuICB9XG5cbiAgY2xpY2tGaWx0ZXJDb21wb25lbnQoKSB7XG4gICAgdGhpcy5zaG93RHJvcERvd24gPSAhdGhpcy5zaG93RHJvcERvd247XG4gICAgLy9EZXNhY3RpdmFyIGF1dG9mb2N1cyBleHRlcm5vIGN1YW5kbyBzZSBtdWVzdHJhIGVsIGJ1c2NhZG9yXG4gICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5xdWFudGl0eVRvRmlsdGVyKSB7XG4gICAgICB0aGlzLnNldEF1dG9mb2N1c0V2ZW50Py5lbWl0KHRoaXMuc2hvd0Ryb3BEb3duKTtcbiAgICB9XG4gIH1cbiAgbGVhdmVDb21wb25lbnQoKSB7XG4gICAgdGhpcy5zaG93RHJvcERvd24gPSBmYWxzZTtcbiAgICAvL0Rlc2FjdGl2YXIgYXV0b2ZvY3VzIGV4dGVybm8gY3VhbmRvIHNlIG11ZXN0cmEgZWwgYnVzY2Fkb3JcbiAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA+PSB0aGlzLnF1YW50aXR5VG9GaWx0ZXIpIHtcbiAgICAgIHRoaXMuc2V0QXV0b2ZvY3VzRXZlbnQ/LmVtaXQodGhpcy5zaG93RHJvcERvd24pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdj5cbiAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3t0aXRsZX19PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJTZWxlY3RNdWx0aXBsZVwiIChtb3VzZWxlYXZlKT1cImxlYXZlQ29tcG9uZW50KClcIj5cbiAgICA8YnV0dG9uIFthdHRyLmlkXT1cInNlbGVjdElkXCIgY2xhc3M9XCJkcm9wLXRvZ2dsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFZhbHVlXCIgKGNsaWNrKT1cImNsaWNrRmlsdGVyQ29tcG9uZW50KClcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0TGlzdENoZWNrZWQoKS5sZW5ndGg8PTBcIj57e3BsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cImdldExpc3RDaGVja2VkKCkubGVuZ3RoPjBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyd0ZXh0LWRpc2FibGVkJzpnZXRMaXN0Q2hlY2tlZCgpWzBdLmRpc2FibGVkIHx8IGZhbHNlfVwiPnt7Z2V0TGlzdENoZWNrZWQoKVswXS5uYW1lIHwgbGFiZWxUaXRsZVBpcGV9fTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiIChjbGljayk9XCJkaXNjYXJkT3B0aW9uKGZpbmRPcHRpb25DYXRlZ29yeShnZXRMaXN0Q2hlY2tlZCgpWzBdKSwgZ2V0TGlzdENoZWNrZWQoKVswXSlcIiBbbmdDbGFzc109XCJ7J2ljb24tZGlzYWJsZWQnOmdldExpc3RDaGVja2VkKClbMF0uZGlzYWJsZWQgfHwgZmFsc2V9XCI+XG4gICAgICAgICAgICA8c3ZnIFtuZ0NsYXNzXT1cInsndGV4dC1kaXNhYmxlZCc6Z2V0TGlzdENoZWNrZWQoKVswXS5kaXNhYmxlZCB8fCBmYWxzZX1cIlxuICAgICAgICAgICAgICB3aWR0aD1cIjIwXCJcbiAgICAgICAgICAgICAgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCA0IDI0IDI0XCJcbiAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICBzdHlsZT1cImNvbG9yOiAjMjY0OUI2XCJcbiAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk02LjIyNTMgNC44MTEwOEM1LjgzNDc3IDQuNDIwNTYgNS4yMDE2MSA0LjQyMDU2IDQuODExMDggNC44MTEwOEM0LjQyMDU2IDUuMjAxNjEgNC40MjA1NiA1LjgzNDc3IDQuODExMDggNi4yMjUzTDEwLjU4NTggMTJMNC44MTExNCAxNy43NzQ3QzQuNDIwNjIgMTguMTY1MiA0LjQyMDYyIDE4Ljc5ODQgNC44MTExNCAxOS4xODg5QzUuMjAxNjcgMTkuNTc5NCA1LjgzNDgzIDE5LjU3OTQgNi4yMjUzNSAxOS4xODg5TDEyIDEzLjQxNDJMMTcuNzc0NyAxOS4xODg5QzE4LjE2NTIgMTkuNTc5NCAxOC43OTg0IDE5LjU3OTQgMTkuMTg4OSAxOS4xODg5QzE5LjU3OTQgMTguNzk4NCAxOS41Nzk0IDE4LjE2NTIgMTkuMTg4OSAxNy43NzQ3TDEzLjQxNDIgMTJMMTkuMTg5IDYuMjI1M0MxOS41Nzk1IDUuODM0NzcgMTkuNTc5NSA1LjIwMTYxIDE5LjE4OSA0LjgxMTA4QzE4Ljc5ODUgNC40MjA1NiAxOC4xNjUzIDQuNDIwNTYgMTcuNzc0OCA0LjgxMTA4TDEyIDEwLjU4NThMNi4yMjUzIDQuODExMDhaXCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtb3JlU2VsZWN0ZWRcIiAqbmdJZj1cImdldExpc3RDaGVja2VkKCkubGVuZ3RoID4gMSBcIj4oKyB7e2dldExpc3RDaGVja2VkKCkubGVuZ3RoIC0gMX19IG3DoXMpPC9zcGFuPlxuICAgICAgICA8IS0te3tnZXRMaXN0Q2hlY2tlZCgpLmpvaW4oJywgJyl9fS0tPlxuICAgICAgPC9zcGFuPlxuICAgICAgPGltZyAqbmdJZj1cInNob3dJY29uXCJcbiAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtYm94X19pY29uXCJcbiAgICAgICAgICAgW25nU3R5bGVdPVwieyd0cmFuc2Zvcm0nOiBzaG93RHJvcERvd24gPyAndHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoMTgwZGVnKScgOiAndHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoMGRlZyknIH1cIlxuICAgICAgICAgICBzcmM9XCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1UzWm5JRlpsWTNSdmNpQkpZMjl1Y3lBNklHaDBkSEE2THk5M2QzY3ViMjVzYVc1bGQyVmlabTl1ZEhNdVkyOXRMMmxqYjI0Z0xTMCtEUW84SVVSUFExUlpVRVVnYzNabklGQlZRa3hKUXlBaUxTOHZWek5ETHk5RVZFUWdVMVpISURFdU1TOHZSVTRpSUNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5SGNtRndhR2xqY3k5VFZrY3ZNUzR4TDBSVVJDOXpkbWN4TVM1a2RHUWlQZzBLUEhOMlp5QjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElpQjJhV1YzUW05NFBTSXdJREFnTVRBd01DQXhNREF3SWlCbGJtRmliR1V0WW1GamEyZHliM1Z1WkQwaWJtVjNJREFnTUNBeE1EQXdJREV3TURBaUlIaHRiRHB6Y0dGalpUMGljSEpsYzJWeWRtVWlQZzBLUEcxbGRHRmtZWFJoUGlCVGRtY2dWbVZqZEc5eUlFbGpiMjV6SURvZ2FIUjBjRG92TDNkM2R5NXZibXhwYm1WM1pXSm1iMjUwY3k1amIyMHZhV052YmlBOEwyMWxkR0ZrWVhSaFBnMEtQR2MrUEhCaGRHZ2daRDBpVFRVd01DdzNOelV1TkV3eE1Dd3lPRGN1TW13Mk5DNDBMVFl5TGpaTU5UQXdMRFkxTUM0eWJEUXlOUzQyTFRReU5TNDJiRFkwTGpRc05qSXVOa3cxTURBc056YzFMalI2SWk4K1BDOW5QZzBLUEM5emRtYytcIiBhbHQ9XCJBcnJvdyBJY29uXCJcbiAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIvPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wLXNob3dcIiAqbmdJZj1cInNob3dEcm9wRG93biAmJiBsaXN0Lmxlbmd0aD4wXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZ2V0VG90YWxDYXRlZ29yeUNvdW50KCk+PXF1YW50aXR5VG9GaWx0ZXJcIiBjbGFzcz1cIm1haW5cIj5cbiAgICAgICAgPGxjdC1pbnB1dC10ZXh0IFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlckZpbHRlclwiIHRpdGxlPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiYXBwbHlGaWx0ZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpY29uRmluZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcbiAgICAgICAgPjwvbGN0LWlucHV0LXRleHQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW25nU3R5bGVdPVwieydoZWlnaHQnOiBnZXRUb3RhbENhdGVnb3J5Q291bnQoKT49cXVhbnRpdHlUb0ZpbHRlciA/IGhlaWdodE9wdGlvbnMgOiAnYXV0bycsJ292ZXJmbG93LXknOmdldFRvdGFsQ2F0ZWdvcnlDb3VudCgpPj1xdWFudGl0eVRvRmlsdGVyID8gJ2F1dG8nOicnfVwiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBsaXN0RmlsdGVyZWRcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7XCI+XG4gICAgICAgICAgICA8c3ZnIFtuZ1N0eWxlXT1cInsndHJhbnNmb3JtJzogY2F0ZWdvcnkub3BlbiA/ICd0cmFuc2xhdGVZKDI1JSkgcm90YXRlKDE4MGRlZyknIDogJ3RyYW5zbGF0ZVkoMjUlKSByb3RhdGUoMGRlZyknIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeShjYXRlZ29yeSlcIiBjbGFzcz1cInNlbGVjdC1ib3hfX2NhdGVnb3J5XCJcbiAgICAgICAgICAgICAgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAxNyAxOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjQ1OSA3LjU4Mzk4TDguNTAwNjUgMTEuODM0TDMuNTQyMzIgNy41ODM5OFwiIHN0cm9rZT1cIiMyNjQ5QjZcIiBzdHJva2Utd2lkdGg9XCIxLjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8IS0tIDxpbWcgKm5nSWY9XCJzaG93SWNvblwiXG4gICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtYm94X19jYXRlZ29yeVwiXG4gICAgICAgICAgICAgW25nU3R5bGVdPVwieyd0cmFuc2Zvcm0nOiBjYXRlZ29yeS5vcGVuID8gJ3RyYW5zbGF0ZVkoMzIlKSByb3RhdGUoMTgwZGVnKScgOiAndHJhbnNsYXRlWSgzMiUpIHJvdGF0ZSgwZGVnKScgfVwiXG4gICAgICAgICAgICAgc3JjPVwiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdVM1puSUZabFkzUnZjaUJKWTI5dWN5QTZJR2gwZEhBNkx5OTNkM2N1YjI1c2FXNWxkMlZpWm05dWRITXVZMjl0TDJsamIyNGdMUzArRFFvOElVUlBRMVJaVUVVZ2MzWm5JRkJWUWt4SlF5QWlMUzh2VnpOREx5OUVWRVFnVTFaSElERXVNUzh2UlU0aUlDSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OUhjbUZ3YUdsamN5OVRWa2N2TVM0eEwwUlVSQzl6ZG1jeE1TNWtkR1FpUGcwS1BITjJaeUIyWlhKemFXOXVQU0l4TGpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpSUhnOUlqQndlQ0lnZVQwaU1IQjRJaUIyYVdWM1FtOTRQU0l3SURBZ01UQXdNQ0F4TURBd0lpQmxibUZpYkdVdFltRmphMmR5YjNWdVpEMGlibVYzSURBZ01DQXhNREF3SURFd01EQWlJSGh0YkRwemNHRmpaVDBpY0hKbGMyVnlkbVVpUGcwS1BHMWxkR0ZrWVhSaFBpQlRkbWNnVm1WamRHOXlJRWxqYjI1eklEb2dhSFIwY0RvdkwzZDNkeTV2Ym14cGJtVjNaV0ptYjI1MGN5NWpiMjB2YVdOdmJpQThMMjFsZEdGa1lYUmhQZzBLUEdjK1BIQmhkR2dnWkQwaVRUVXdNQ3czTnpVdU5Fd3hNQ3d5T0RjdU1tdzJOQzQwTFRZeUxqWk1OVEF3TERZMU1DNHliRFF5TlM0MkxUUXlOUzQyYkRZMExqUXNOakl1Tmt3MU1EQXNOemMxTGpSNklpOCtQQzluUGcwS1BDOXpkbWMrXCIgYWx0PVwiQXJyb3cgSWNvblwiXG4gICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgaGVpZ2h0PVwiMTdweFwiIHdpZHRoPVwiMTdweFwiIChjbGljayk9XCJ0b2dnbGVDYXRlZ29yeShjYXRlZ29yeSlcIi8+IC0tPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWFpblwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtY2FwaXRhbGl6ZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIxcHg7XCI+e3sgY2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpIHwgbGFiZWxQaXBlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYXRlZ29yeS5xdWFudGl0eVwiPih7e2NhdGVnb3J5LnF1YW50aXR5fX0pPC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJjYXRlZ29yeS5jaGVja2VkQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlQWxsT3B0aW9ucyhjYXRlZ29yeSlcIiBbZGlzYWJsZWRdPVwiY2F0ZWdvcnkuZGlzYWJsZWQgfHwgZmFsc2UgfHwgc2VhcmNoVmFsdWUubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hcmtcIiBbbmdDbGFzc109XCJ7J21hcmstZGlzYWJsZWQnOiBjYXRlZ29yeS5kaXNhYmxlZCB8fCBmYWxzZSB8fCBzZWFyY2hWYWx1ZS5sZW5ndGggPiAwfVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8dWwgKm5nSWY9XCJjYXRlZ29yeS5vcGVuXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYWluXCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjYXRlZ29yeS5saXN0T3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtY2FwaXRhbGl6ZVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDIxcHg7XCIgW25nQ2xhc3NdPVwieyAndGV4dC1kaXNhYmxlZCc6IG9wdGlvbi5kaXNhYmxlZCB9XCI+e3sgb3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSB8IGxhYmVsUGlwZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwib3B0aW9uLnF1YW50aXR5XCI+KHt7b3B0aW9uLnF1YW50aXR5fX0pPC9zcGFuPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJvcHRpb24uY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVPcHRpb24oY2F0ZWdvcnksIG9wdGlvbilcIiBbZGlzYWJsZWRdPVwib3B0aW9uLmRpc2FibGVkIHx8IGZhbHNlXCIvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hcmtcIiBbbmdDbGFzc109XCJ7J21hcmstZGlzYWJsZWQnOiBvcHRpb24uZGlzYWJsZWQgfHwgZmFsc2V9XCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3VsPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcC1lbXB0eVwiICpuZ0lmPVwic2hvd0Ryb3BEb3duICYmIGxpc3QubGVuZ3RoPT09MFwiPlxuICAgICAgU2luIGluZm9ybWFjacOzblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19