lct-components
Version:
LCT basic components
137 lines • 27.8 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.pipe";
export class SelectComponent {
constructor(sanitizer) {
this.sanitizer = sanitizer;
this.options = ['Insert Values as string array'];
this.sort = undefined; //Indica si el array se debe ordenar, 'asc' o 'desc'
this.title = 'Insert title';
this.disabled = 'false';
this.showIcon = true;
this.placeholder = 'Insert placeholder';
this.quantityToFilter = 7;
this.id = ''; // ID en Button Opcional
this.selectedUser = '';
this.value = new EventEmitter();
this.setAutofocusEvent = new EventEmitter();
this.filterStore = '';
this.filteredOptions = [];
this.disabledValue = false;
this.showDropDown = false;
this.selected = '';
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.disabledValue =
this.disabled === true || this.disabled == 'true' || this.disabled === '';
this.filteredOptions = this.options;
if (this.sort) {
this.sortData();
}
}
ngOnChanges(changes) {
if (changes['selectedUser']) {
this.selected = changes['selectedUser'].currentValue;
}
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['options'] && !changes['options'].firstChange) {
this.filteredOptions = this.options = changes['options'].currentValue;
if (this.sort) {
this.sortData();
}
}
}
filterData(value) {
const normalizar = (str) => str
.normalize('NFD') // Descompone los caracteres con tilde
.replace(/[\u0300-\u036f]/g, '') // Elimina los signos diacríticos
.toLowerCase();
this.filteredOptions = this.options.filter((opt) => normalizar(opt).includes(normalizar(value)));
}
clickFilterComponent() {
var _a;
this.showDropDown = !this.showDropDown;
//Desactivar autofocus externo cuando se muestra el buscador
if (this.options.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.options.length >= this.quantityToFilter) {
(_a = this.setAutofocusEvent) === null || _a === void 0 ? void 0 : _a.emit(this.showDropDown);
}
}
sortData() {
this.filteredOptions.sort((a, b) => {
if ((a === null || a === void 0 ? void 0 : a.toLowerCase()) > (b === null || b === void 0 ? void 0 : b.toLowerCase())) {
return this.sort === 'asc' ? 1 : -1;
}
if ((a === null || a === void 0 ? void 0 : a.toLowerCase()) < (b === null || b === void 0 ? void 0 : b.toLowerCase())) {
return this.sort === 'asc' ? -1 : 1;
}
return 0;
});
}
changeValue(value) {
var _a;
//Activar autofocus externo
this.selected = value;
this.showDropDown = false;
(_a = this.setAutofocusEvent) === null || _a === void 0 ? void 0 : _a.emit(false);
this.value.emit(this.selected);
}
}
SelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SelectComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SelectComponent, selector: "lct-select", inputs: { options: "options", sort: "sort", title: "title", disabled: "disabled", showIcon: "showIcon", placeholder: "placeholder", quantityToFilter: "quantityToFilter", id: "id", selectedUser: "selectedUser" }, outputs: { value: "value", 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=\"!selected\">{{placeholder}}</span>\n <span *ngIf=\"selected\">\n <div>\n <span>{{selected | labelPipe}}</span>\n </div>\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 && options.length>0\" >\n <div *ngIf=\"options.length>=quantityToFilter\" style=\"width: 95%;padding-left:5%;\">\n <lct-input-text placeholder=\"Buscar\" title=\"\"\n [(ngModel)]=\"filterStore\"\n (ngModelChange)=\"filterData($event)\"\n [icon]=\"iconFinder\"\n [showIcon]=\"true\"\n ></lct-input-text>\n </div>\n <div [ngStyle]=\"{'height': options.length>7 ? '200px' : 'auto','overflow-y':options.length>7 ? 'auto':''}\">\n <label class=\"main\" *ngFor=\"let option of filteredOptions; let i = index\" >\n <span class=\"text\" [ngStyle]=\"{'padding-top': i===0 ? '8px' : ''}\" (click)=\"changeValue(option)\">{{option | labelPipe}}</span>\n </label>\n </div>\n\n </div>\n <div class=\"drop-empty\" *ngIf=\"showDropDown && options.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}button:disabled{background-color:#f5f7fa;cursor:not-allowed;color:#c8ccd4}.drop-toggle i{float:right}.drop-show{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}.main{display:block;position:relative;margin-left:17px;margin-right:5px;margin-bottom:5px;cursor:pointer;color:#3c4149;font-size:13px;letter-spacing:0;line-height:27px}.text{width:100%;display:block}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.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"] }], pipes: { "labelPipe": i5.LabelPipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SelectComponent, decorators: [{
type: Component,
args: [{
selector: 'lct-select',
templateUrl: './select.component.html',
styleUrls: ['./select.component.css'],
}]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { options: [{
type: Input
}], sort: [{
type: Input
}], title: [{
type: Input
}], disabled: [{
type: Input
}], showIcon: [{
type: Input
}], placeholder: [{
type: Input
}], quantityToFilter: [{
type: Input
}], id: [{
type: Input
}], selectedUser: [{
type: Input
}], value: [{
type: Output
}], setAutofocusEvent: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xjdC1jb21wb25lbnRzL3NyYy9saWIvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQVl2QixNQUFNLE9BQU8sZUFBZTtJQXdCMUIsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXZCbEMsWUFBTyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUM1QyxTQUFJLEdBQStCLFNBQVMsQ0FBQyxDQUFDLG9EQUFvRDtRQUNsRyxVQUFLLEdBQUcsY0FBYyxDQUFDO1FBQ3ZCLGFBQVEsR0FBaUQsT0FBTyxDQUFDO1FBQ2pFLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDaEIsZ0JBQVcsR0FBRyxvQkFBb0IsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFDN0IsT0FBRSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUMxQyxpQkFBWSxHQUFJLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNuQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTFELGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXRCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBUW5CLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FB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R0FBZixlQUFlLGdXQ3BCNUIseTZFQXFDQTsyRkRqQmEsZUFBZTtrQkFMM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsV0FBVyxFQUFFLHlCQUF5QjtvQkFDdEMsU0FBUyxFQUFFLENBQUMsd0JBQXdCLENBQUM7aUJBQ3RDO21HQUVVLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuZXhwb3J0IGludGVyZmFjZSBJTGlzdExDVFNlbGVjdCB7XG4gIG5hbWU6IHN0cmluZztcbiAgY2hlY2tlZDogYm9vbGVhbjtcbiAgdmFsdWU/OiBzdHJpbmcgfCBudW1iZXI7XG59XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsY3Qtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgb3B0aW9ucyA9IFsnSW5zZXJ0IFZhbHVlcyBhcyBzdHJpbmcgYXJyYXknXTtcbiAgQElucHV0KCkgc29ydDogJ2FzYycgfCAnZGVzYycgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7IC8vSW5kaWNhIHNpIGVsIGFycmF5IHNlIGRlYmUgb3JkZW5hciwgJ2FzYycgbyAnZGVzYydcbiAgQElucHV0KCkgdGl0bGUgPSAnSW5zZXJ0IHRpdGxlJztcbiAgQElucHV0KCkgZGlzYWJsZWQ6ICd0cnVlJyB8ICdmYWxzZScgfCAnZGlzYWJsZWQnIHwgYm9vbGVhbiB8ICcnID0gJ2ZhbHNlJztcbiAgQElucHV0KCkgc2hvd0ljb24gPSB0cnVlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdJbnNlcnQgcGxhY2Vob2xkZXInO1xuICBASW5wdXQoKSBxdWFudGl0eVRvRmlsdGVyOiBudW1iZXIgPSA3O1xuICBASW5wdXQoKSBpZD86IHN0cmluZyA9ICcnOyAvLyBJRCBlbiBCdXR0b24gT3BjaW9uYWxcbiAgQElucHV0KCkgc2VsZWN0ZWRVc2VyPyA9ICcnO1xuICBAT3V0cHV0KCkgdmFsdWUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNldEF1dG9mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGZpbHRlclN0b3JlID0gJyc7XG4gIGZpbHRlcmVkT3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZGlzYWJsZWRWYWx1ZSA9IGZhbHNlO1xuICBzZWxlY3RlZDogc3RyaW5nO1xuICBzaG93RHJvcERvd24gPSBmYWxzZTtcbiAgaWNvbkZpbmRlcjtcblxuICAvLyBQcm9waWVkYWQgY2FsY3VsYWRhIHBhcmEgZ2VuZXJhciBlbCBpZCBkaW7DoW1pY29cbiAgZ2V0IHNlbGVjdElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmlkID8gYHNlbGVjdC0ke3RoaXMuaWR9YCA6IG51bGw7XG4gIH1cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSAnJztcbiAgICB0aGlzLmljb25GaW5kZXIgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoXG4gICAgICBgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpBaUlHaGxhV2RvZEQwaU1qRWlJSFpwWlhkQ2IzZzlJakFnTUNBeU1DQXlNU0lnWm1sc2JEMGlibTl1WlNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWo0S1BIQmhkR2dnWkQwaVRURXlMakUxTURNZ01USXVOREUyTTBNeE1pNHlPVFVnTVRJdU1qY3hOeUF4TWk0MU1UazFJREV5TGpJMU5UWWdNVEl1TmpneE9TQXhNaTR6TmpneFRERXlMamN6T1RZZ01USXVOREUyTTB3eE5pNDBNRFl4SURFMkxqQTRNamhETVRZdU5UWTRPQ0F4Tmk0eU5EVTFJREUyTGpVMk9EZ2dNVFl1TlRBNU15QXhOaTQwTURZeElERTJMalkzTWtNeE5pNHlOakUwSURFMkxqZ3hOamNnTVRZdU1ETTJPU0F4Tmk0NE16STRJREUxTGpnM05EVWdNVFl1TnpJd00wd3hOUzQ0TVRZNElERTJMalkzTWt3eE1pNHhOVEF6SURFekxqQXdOVFpETVRFdU9UZzNOaUF4TWk0NE5ESTRJREV4TGprNE56WWdNVEl1TlRjNUlERXlMakUxTURNZ01USXVOREUyTTFvaUlHWnBiR3c5SWlNeU5qUTVRallpTHo0S1BIQmhkR2dnWm1sc2JDMXlkV3hsUFNKbGRtVnViMlJrSWlCamJHbHdMWEoxYkdVOUltVjJaVzV2WkdRaUlHUTlJazB4TWk0ek9UY3hJRFV1TlRreE9URkRNVEF1TkRRME5TQXpMall6T1RJNUlEY3VNamM0TmpnZ015NDJNemt5T1NBMUxqTXlOakEySURVdU5Ua3hPVEZETXk0ek56TTBOQ0EzTGpVME5EVXpJRE11TXpjek5EUWdNVEF1TnpFd05DQTFMak15TmpBMklERXlMalkyTTBNM0xqSTNPRFk0SURFMExqWXhOVFlnTVRBdU5EUTBOU0F4TkM0Mk1UVTJJREV5TGpNNU56RWdNVEl1TmpZelF6RTBMak0wT1RnZ01UQXVOekV3TkNBeE5DNHpORGs0SURjdU5UUTBOVE1nTVRJdU16azNNU0ExTGpVNU1Ua3hXazAxTGpreE5UTXlJREV5TGpBM016ZEROQzR5T0RneE15QXhNQzQwTkRZMUlEUXVNamc0TVRNZ055NDRNRGd6TlNBMUxqa3hOVE15SURZdU1UZ3hNVFpETnk0MU5ESTFJRFF1TlRVek9UZ2dNVEF1TVRnd055QTBMalUxTXprNElERXhMamd3TnprZ05pNHhPREV4TmtNeE15NDBNelV4SURjdU9EQTRNelVnTVRNdU5ETTFNU0F4TUM0ME5EWTFJREV4TGpnd056a2dNVEl1TURjek4wTXhNQzR4T0RBM0lERXpMamN3TURrZ055NDFOREkxSURFekxqY3dNRGtnTlM0NU1UVXpNaUF4TWk0d056TTNXaUlnWm1sc2JEMGlJekkyTkRsQ05pSXZQZ284TDNOMlp6NEtgXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGlzYWJsZWRWYWx1ZSA9XG4gICAgICB0aGlzLmRpc2FibGVkID09PSB0cnVlIHx8IHRoaXMuZGlzYWJsZWQgPT0gJ3RydWUnIHx8IHRoaXMuZGlzYWJsZWQgPT09ICcnO1xuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgIHRoaXMuc29ydERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkVXNlciddKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gY2hhbmdlc1snc2VsZWN0ZWRVc2VyJ10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXSAmJiAhY2hhbmdlc1snZGlzYWJsZWQnXS5maXJzdENoYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzWydkaXNhYmxlZCddLmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSB8fFxuICAgICAgICBjaGFuZ2VzWydkaXNhYmxlZCddLmN1cnJlbnRWYWx1ZSA9PSAndHJ1ZScgfHxcbiAgICAgICAgY2hhbmdlc1snZGlzYWJsZWQnXS5jdXJyZW50VmFsdWUgPT09ICcnXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZFZhbHVlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWRWYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snb3B0aW9ucyddICYmICFjaGFuZ2VzWydvcHRpb25zJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zID0gY2hhbmdlc1snb3B0aW9ucyddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgdGhpcy5zb3J0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbHRlckRhdGEodmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IG5vcm1hbGl6YXIgPSAoc3RyOiBzdHJpbmcpID0+XG4gICAgICBzdHJcbiAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJykgLy8gRGVzY29tcG9uZSBsb3MgY2FyYWN0ZXJlcyBjb24gdGlsZGVcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKSAvLyBFbGltaW5hIGxvcyBzaWdub3MgZGlhY3LDrXRpY29zXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0KSA9PlxuICAgICAgbm9ybWFsaXphcihvcHQpLmluY2x1ZGVzKG5vcm1hbGl6YXIodmFsdWUpKVxuICAgICk7XG4gIH1cbiAgY2xpY2tGaWx0ZXJDb21wb25lbnQoKSB7XG4gICAgdGhpcy5zaG93RHJvcERvd24gPSAhdGhpcy5zaG93RHJvcERvd247XG4gICAgLy9EZXNhY3RpdmFyIGF1dG9mb2N1cyBleHRlcm5vIGN1YW5kbyBzZSBtdWVzdHJhIGVsIGJ1c2NhZG9yXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPj0gdGhpcy5xdWFudGl0eVRvRmlsdGVyKSB7XG4gICAgICB0aGlzLnNldEF1dG9mb2N1c0V2ZW50Py5lbWl0KHRoaXMuc2hvd0Ryb3BEb3duKTtcbiAgICB9XG4gIH1cbiAgbGVhdmVDb21wb25lbnQoKSB7XG4gICAgdGhpcy5zaG93RHJvcERvd24gPSBmYWxzZTtcbiAgICAvL0Rlc2FjdGl2YXIgYXV0b2ZvY3VzIGV4dGVybm8gY3VhbmRvIHNlIG11ZXN0cmEgZWwgYnVzY2Fkb3JcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+PSB0aGlzLnF1YW50aXR5VG9GaWx0ZXIpIHtcbiAgICAgIHRoaXMuc2V0QXV0b2ZvY3VzRXZlbnQ/LmVtaXQodGhpcy5zaG93RHJvcERvd24pO1xuICAgIH1cbiAgfVxuICBzb3J0RGF0YSgpIHtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucy5zb3J0KChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGE/LnRvTG93ZXJDYXNlKCkgPiBiPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnQgPT09ICdhc2MnID8gMSA6IC0xO1xuICAgICAgfVxuICAgICAgaWYgKGE/LnRvTG93ZXJDYXNlKCkgPCBiPy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnQgPT09ICdhc2MnID8gLTEgOiAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cblxuICBjaGFuZ2VWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy9BY3RpdmFyIGF1dG9mb2N1cyBleHRlcm5vXG4gICAgdGhpcy5zZWxlY3RlZCA9IHZhbHVlO1xuICAgIHRoaXMuc2hvd0Ryb3BEb3duID0gZmFsc2U7XG4gICAgdGhpcy5zZXRBdXRvZm9jdXNFdmVudD8uZW1pdChmYWxzZSk7XG4gICAgdGhpcy52YWx1ZS5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57e3RpdGxlfX08L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclNlbGVjdE11bHRpcGxlXCIgKG1vdXNlbGVhdmUpPVwibGVhdmVDb21wb25lbnQoKVwiID5cbiAgICA8YnV0dG9uIFthdHRyLmlkXT1cInNlbGVjdElkXCIgY2xhc3M9XCJkcm9wLXRvZ2dsZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFZhbHVlXCIgKGNsaWNrKT1cImNsaWNrRmlsdGVyQ29tcG9uZW50KCk7XCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFzZWxlY3RlZFwiPnt7cGxhY2Vob2xkZXJ9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkIHwgbGFiZWxQaXBlfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgICAgPGltZyAqbmdJZj1cInNob3dJY29uXCJcbiAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtYm94X19pY29uXCJcbiAgICAgICAgICAgW25nU3R5bGVdPVwieyd0cmFuc2Zvcm0nOiBzaG93RHJvcERvd24gPyAndHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoMTgwZGVnKScgOiAndHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoMGRlZyknIH1cIlxuICAgICAgICAgICBzcmM9XCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1UzWm5JRlpsWTNSdmNpQkpZMjl1Y3lBNklHaDBkSEE2THk5M2QzY3ViMjVzYVc1bGQyVmlabTl1ZEhNdVkyOXRMMmxqYjI0Z0xTMCtEUW84SVVSUFExUlpVRVVnYzNabklGQlZRa3hKUXlBaUxTOHZWek5ETHk5RVZFUWdVMVpISURFdU1TOHZSVTRpSUNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5SGNtRndhR2xqY3k5VFZrY3ZNUzR4TDBSVVJDOXpkbWN4TVM1a2RHUWlQZzBLUEhOMlp5QjJaWEp6YVc5dVBTSXhMakVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElpQjJhV1YzUW05NFBTSXdJREFnTVRBd01DQXhNREF3SWlCbGJtRmliR1V0WW1GamEyZHliM1Z1WkQwaWJtVjNJREFnTUNBeE1EQXdJREV3TURBaUlIaHRiRHB6Y0dGalpUMGljSEpsYzJWeWRtVWlQZzBLUEcxbGRHRmtZWFJoUGlCVGRtY2dWbVZqZEc5eUlFbGpiMjV6SURvZ2FIUjBjRG92TDNkM2R5NXZibXhwYm1WM1pXSm1iMjUwY3k1amIyMHZhV052YmlBOEwyMWxkR0ZrWVhSaFBnMEtQR2MrUEhCaGRHZ2daRDBpVFRVd01DdzNOelV1TkV3eE1Dd3lPRGN1TW13Mk5DNDBMVFl5TGpaTU5UQXdMRFkxTUM0eWJEUXlOUzQyTFRReU5TNDJiRFkwTGpRc05qSXVOa3cxTURBc056YzFMalI2SWk4K1BDOW5QZzBLUEM5emRtYytcIiBhbHQ9XCJBcnJvdyBJY29uXCJcbiAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCIvPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wLXNob3dcIiAqbmdJZj1cInNob3dEcm9wRG93biAmJiBvcHRpb25zLmxlbmd0aD4wXCIgPlxuICAgICAgPGRpdiAqbmdJZj1cIm9wdGlvbnMubGVuZ3RoPj1xdWFudGl0eVRvRmlsdGVyXCIgIHN0eWxlPVwid2lkdGg6IDk1JTtwYWRkaW5nLWxlZnQ6NSU7XCI+XG4gICAgICAgIDxsY3QtaW5wdXQtdGV4dCBwbGFjZWhvbGRlcj1cIkJ1c2NhclwiIHRpdGxlPVwiXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclN0b3JlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJEYXRhKCRldmVudClcIlxuICAgICAgICAgIFtpY29uXT1cImljb25GaW5kZXJcIlxuICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcbiAgICAgICAgPjwvbGN0LWlucHV0LXRleHQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW25nU3R5bGVdPVwieydoZWlnaHQnOiBvcHRpb25zLmxlbmd0aD43ID8gJzIwMHB4JyA6ICdhdXRvJywnb3ZlcmZsb3cteSc6b3B0aW9ucy5sZW5ndGg+NyA/ICdhdXRvJzonJ31cIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwibWFpblwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zOyBsZXQgaSA9IGluZGV4XCIgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy10b3AnOiBpPT09MCA/ICc4cHgnIDogJyd9XCIgKGNsaWNrKT1cImNoYW5nZVZhbHVlKG9wdGlvbilcIj57e29wdGlvbiB8IGxhYmVsUGlwZX19PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZHJvcC1lbXB0eVwiICpuZ0lmPVwic2hvd0Ryb3BEb3duICYmIG9wdGlvbnMubGVuZ3RoPT09MFwiPlxuICAgICAgU2luIGluZm9ybWFjacOzblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19