@douglas-serena/ng-inputs
Version:
angular entry library
215 lines • 29.3 kB
JavaScript
import { __awaiter } from "tslib";
import { HttpClient } from '@angular/common/http';
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, Renderer2, ViewChild, } from '@angular/core';
import { ControlContainer, NG_VALUE_ACCESSOR } from '@angular/forms';
import { NgInputConfigService } from '../../core/ng-input-config.service';
import { SelectCustomControlValueAccessor } from '../select-custom-control-value-accessor.domain';
export class NgSearchComponent extends SelectCustomControlValueAccessor {
constructor(controlContainer, elementRef, renderer, httpClient, configService, changeDetectorRef) {
super(controlContainer, elementRef, renderer, configService, changeDetectorRef);
this.controlContainer = controlContainer;
this.elementRef = elementRef;
this.renderer = renderer;
this.httpClient = httpClient;
this.configService = configService;
this.notFound = 'Sem resultado.';
this.pathLabel = 'label';
this.value = null;
this.options = [];
this.uri = null;
this.responseData = null;
this.return = null;
this.loading = false;
this.focused = false;
this.timeInput = 0;
this.timeBlur = 0;
this.blur = new EventEmitter();
this.timeFocus = 0;
this.focus = new EventEmitter();
}
onInput({ target }) {
clearTimeout(this.timeInput);
this.timeInput = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
const { value } = target;
if (value.length === 0)
return;
if (!this.focused)
this.focused = true;
if (this.uri) {
let uri = this.createUrl(this.uri);
uri = uri === null || uri === void 0 ? void 0 : uri.replace('{value}', value);
this.loading = true;
try {
const response = yield this.httpClient.get(uri).toPromise();
this.options = this.responseData
? this.getMultiLabels(response, this.responseData.split('.'))
: response;
this.format();
}
catch (error) {
if (!this.configService.environments.debug) {
console.log(error);
}
}
this.loading = false;
}
}), 300);
}
createUrl(uri) {
const variables = uri.match(/(\{[\w\_]+\})+/g);
variables === null || variables === void 0 ? void 0 : variables.forEach((variable) => {
const key = variable.replace(/([\{\}])+/g, '');
const env = this.configService.environments[key];
if (env)
uri = uri === null || uri === void 0 ? void 0 : uri.replace(variable, env);
});
return uri;
}
handleKeyDown(event) {
const { key } = event;
const keys = {
ArrowUp: () => {
event.preventDefault();
if (!this.focused) {
this.focused = true;
return;
}
const index = this.options.findIndex((option) => option.dssSelect);
if (index === -1) {
this.options[this.options.length - 1].dssSelect = true;
return;
}
this.options[index].dssSelect = false;
if (index === 0) {
this.options[this.options.length - 1].dssSelect = true;
return;
}
this.options[index - 1].dssSelect = true;
},
ArrowDown: () => {
event.preventDefault();
if (!this.focused) {
this.focused = true;
return;
}
const index = this.options.findIndex((option) => option.dssSelect);
if (index === -1) {
this.options[0].dssSelect = true;
}
this.options[index].dssSelect = false;
if (index === this.options.length - 1) {
this.options[0].dssSelect = true;
return;
}
this.options[index + 1].dssSelect = true;
},
Enter: () => {
event.preventDefault();
if (!this.focused) {
this.focused = true;
return;
}
const index = this.options.findIndex((option) => option.dssSelect);
if (index !== -1) {
this.focused = false;
this.itemSelect = index;
this.inputChange(this.options[index]);
}
},
};
try {
keys[key]();
}
catch (_a) { }
}
ngOnInit() {
var _a;
this.required = (_a = this.control.errors) === null || _a === void 0 ? void 0 : _a.required;
if (!this.required)
this.required = Object.keys(this.errors).includes('required');
this.format();
}
onBlur(event) {
clearTimeout(this.timeBlur);
this.timeBlur = setTimeout(() => {
this.focused = false;
this.blur.emit(event);
}, 300);
}
onFocus(event) {
this.onInput(event);
clearTimeout(this.timeFocus);
this.timeFocus = setTimeout(() => {
this.focused = true;
this.focus.emit(event);
}, 100);
}
ngOnChanges({ options, value, }) {
if (!!options && !!options.currentValue) {
this.format();
}
if (!!value && !!value.currentValue) {
this.inputChange(this.value);
}
}
inputChange(value) {
this.control.setValue(value instanceof Object
? this.getMultiLabels(value, this.pathLabel.split('.'))
: value);
if (typeof value === 'string') {
this.onWrite(value);
}
else {
const newValue = Object.assign({}, value);
delete newValue.dssLabel;
delete newValue.dssSelect;
setTimeout(() => {
this.onWrite(!!this.return
? this.getMultiLabels(newValue, this.return.split('.'))
: newValue);
}, 250);
}
}
format() {
this.options.map((option, index) => {
option.dssLabel = this.getMultiLabels(option, this.pathLabel.split('.'));
option.dssSelect = this.itemSelect === index;
});
}
}
NgSearchComponent.decorators = [
{ type: Component, args: [{
selector: 'dss-search',
template: "<div\r\n class=\"form-group form-control-search\"\r\n [ngClass]=\"{\r\n invalid: control.invalid && control.touched,\r\n valid: control.valid && control.touched,\r\n 'form-group-label': !!label,\r\n active: !!control?.value\r\n }\"\r\n>\r\n <div class=\"form-content\">\r\n <i\r\n class=\"form-icon-floating icon-background left\"\r\n [ngClass]=\"{ search: !loading, loading: loading }\"\r\n ></i>\r\n\r\n <input\r\n #inputRef\r\n type=\"search\"\r\n class=\"form-control browser-default\"\r\n [placeholder]=\"_placeholder\"\r\n [id]=\"name\"\r\n [formControl]=\"control\"\r\n [readonly]=\"readonly\"\r\n autocomplete=\"off\"\r\n autocapitalize=\"off\"\r\n (blur)=\"onBlur($event)\"\r\n (focus)=\"onFocus($event)\"\r\n [ngClass]=\"{\r\n readonly: readonly,\r\n 'is-invalid': !readonly && control.invalid && control.touched\r\n }\"\r\n />\r\n\r\n <!-- BORDER -->\r\n <span class=\"focus-border\">\r\n <i></i>\r\n </span>\r\n\r\n <!-- LABEL -->\r\n <label *ngIf=\"!!label\" [for]=\"name\">\r\n {{ label }}<span *ngIf=\"required\" class=\"required\">*</span>\r\n </label>\r\n\r\n <ul\r\n class=\"options-list hidden\"\r\n [class.hidden]=\"control.value?.length === 0 || loading || !focused\"\r\n >\r\n <ng-content *ngIf=\"options.length === 0\"> </ng-content>\r\n <li\r\n *ngIf=\"options.length === 0; else template_options\"\r\n class=\"not-found option-item\"\r\n >\r\n {{ notFound }}\r\n </li>\r\n\r\n <ng-template #template_options>\r\n <li\r\n *ngFor=\"let option of options; let index = index\"\r\n role=\"listitem\"\r\n class=\"option-item\"\r\n [class.hover]=\"option.dssSelect\"\r\n [class.select]=\"itemSelect === index\"\r\n (click)=\"inputChange(option); itemSelect = index\"\r\n >\r\n {{ option.dssLabel }}\r\n </li>\r\n </ng-template>\r\n </ul>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let error of getKeys(errors)\">\r\n <!-- MESSAGE ERROR -->\r\n <div *ngIf=\"getError(error)\" class=\"message error\">\r\n {{ errors[error] }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- MESSAGE HELp -->\r\n <div *ngIf=\"!!help\" class=\"message\">\r\n {{ help }}\r\n </div>\r\n</div>\r\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => NgSearchComponent),
},
]
},] }
];
NgSearchComponent.ctorParameters = () => [
{ type: ControlContainer },
{ type: ElementRef },
{ type: Renderer2 },
{ type: HttpClient },
{ type: NgInputConfigService },
{ type: ChangeDetectorRef }
];
NgSearchComponent.propDecorators = {
inputRef: [{ type: ViewChild, args: ['inputRef',] }],
notFound: [{ type: Input }],
pathLabel: [{ type: Input }],
value: [{ type: Input }],
options: [{ type: Input }],
uri: [{ type: Input }],
responseData: [{ type: Input }],
return: [{ type: Input }],
onInput: [{ type: HostListener, args: ['input', ['$event'],] }],
handleKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }],
blur: [{ type: Output }],
focus: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWlucHV0cy9zcmMvbGliL25nLXNlbGVjdC9uZy1zZWFyY2gvbmctc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFhbEcsTUFBTSxPQUFPLGlCQUNYLFNBQVEsZ0NBQWdDO0lBZ0J4QyxZQUNZLGdCQUFrQyxFQUNsQyxVQUFzQixFQUN0QixRQUFtQixFQUNyQixVQUFzQixFQUN0QixhQUFtQyxFQUMzQyxpQkFBb0M7UUFFcEMsS0FBSyxDQUNILGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsUUFBUSxFQUNSLGFBQWEsRUFDYixpQkFBaUIsQ0FDbEIsQ0FBQztRQWJRLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ3JCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBakJwQyxhQUFRLEdBQVcsZ0JBQWdCLENBQUM7UUFDcEMsY0FBUyxHQUFHLE9BQU8sQ0FBQztRQUNwQixVQUFLLEdBQVEsSUFBSSxDQUFDO1FBQ2xCLFlBQU8sR0FBVSxFQUFFLENBQUM7UUFDcEIsUUFBRyxHQUFrQixJQUFJLENBQUM7UUFDMUIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBRXRDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQW9CaEIsY0FBUyxHQUFRLENBQUMsQ0FBQztRQXlIbkIsYUFBUSxHQUFRLENBQUMsQ0FBQztRQUNSLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBU3BDLGNBQVMsR0FBUSxDQUFDLENBQUM7UUFDVCxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQXRJckMsQ0FBQztJQUlELE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBUztRQUN2QixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQVMsRUFBRTtZQUNyQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBMEIsQ0FBQztZQUU3QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUV2QyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLEdBQUcsR0FBRyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQVcsQ0FBQztnQkFFL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLElBQUk7b0JBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWTt3QkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3RCxDQUFDLENBQUMsUUFBUSxDQUFDO29CQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDZjtnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO3dCQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUNwQjtpQkFDRjtnQkFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELFNBQVMsQ0FBQyxHQUFXO1FBQ25CLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvQyxTQUFTLGFBQVQsU0FBUyx1QkFBVCxTQUFTLENBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDOUIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsSUFBSSxHQUFHO2dCQUFFLEdBQUcsR0FBRyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQVcsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUdELGFBQWEsQ0FBQyxLQUFvQjtRQUNoQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRXRCLE1BQU0sSUFBSSxHQUFHO1lBQ1gsT0FBTyxFQUFFLEdBQUcsRUFBRTtnQkFDWixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBRXZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDcEIsT0FBTztpQkFDUjtnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUVuRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN2RCxPQUFPO2lCQUNSO2dCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFFdEMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO29CQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztvQkFDdkQsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQzNDLENBQUM7WUFDRCxTQUFTLEVBQUUsR0FBRyxFQUFFO2dCQUNkLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixPQUFPO2lCQUNSO2dCQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRW5FLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ2xDO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFFdEMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUMzQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBRXZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDcEIsT0FBTztpQkFDUjtnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO29CQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDdkM7WUFDSCxDQUFDO1NBQ0YsQ0FBQztRQUNGLElBQUk7WUFDRixJQUFJLENBQUMsR0FBZ0IsQ0FBQyxFQUFFLENBQUM7U0FDMUI7UUFBQyxXQUFNLEdBQUU7SUFDWixDQUFDO0lBRUQsUUFBUTs7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLDBDQUFFLFFBQVEsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFJRCxNQUFNLENBQUMsS0FBWTtRQUNqQixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBSUQsT0FBTyxDQUFDLEtBQVk7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQ1YsT0FBTyxFQUNQLEtBQUssR0FJTjtRQUNDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUN2QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDZjtRQUNELElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtZQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsS0FBVTtRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FDbkIsS0FBSyxZQUFZLE1BQU07WUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxLQUFLLENBQ1YsQ0FBQztRQUVGLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckI7YUFBTTtZQUNMLE1BQU0sUUFBUSxxQkFBUSxLQUFLLENBQUUsQ0FBQztZQUU5QixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDekIsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBRTFCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FDVixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN2RCxDQUFDLENBQUMsUUFBUSxDQUNiLENBQUM7WUFDSixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDakMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUF4T0YsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxZQUFZO2dCQUN0QixvM0VBQXlDO2dCQUN6QyxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsS0FBSyxFQUFFLElBQUk7d0JBQ1gsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDakQ7aUJBQ0Y7YUFDRjs7O1lBZFEsZ0JBQWdCO1lBWHZCLFVBQVU7WUFPVixTQUFTO1lBWEYsVUFBVTtZQWdCVixvQkFBb0I7WUFkM0IsaUJBQWlCOzs7dUJBZ0NoQixTQUFTLFNBQUMsVUFBVTt1QkFDcEIsS0FBSzt3QkFDTCxLQUFLO29CQUNMLEtBQUs7c0JBQ0wsS0FBSztrQkFDTCxLQUFLOzJCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkF3QkwsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs0QkF3Q2hDLFlBQVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7bUJBaUZsQyxNQUFNO29CQVVOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2UsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdJbnB1dENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL25nLWlucHV0LWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VsZWN0Q3VzdG9tQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi9zZWxlY3QtY3VzdG9tLWNvbnRyb2wtdmFsdWUtYWNjZXNzb3IuZG9tYWluJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZHNzLXNlYXJjaCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdTZWFyY2hDb21wb25lbnQpLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdTZWFyY2hDb21wb25lbnRcclxuICBleHRlbmRzIFNlbGVjdEN1c3RvbUNvbnRyb2xWYWx1ZUFjY2Vzc29yXHJcbiAgaW1wbGVtZW50cyBPbkluaXRcclxue1xyXG4gIEBWaWV3Q2hpbGQoJ2lucHV0UmVmJykgaW5wdXRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcbiAgQElucHV0KCkgbm90Rm91bmQ6IHN0cmluZyA9ICdTZW0gcmVzdWx0YWRvLic7XHJcbiAgQElucHV0KCkgcGF0aExhYmVsID0gJ2xhYmVsJztcclxuICBASW5wdXQoKSB2YWx1ZTogYW55ID0gbnVsbDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHVyaTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgcmVzcG9uc2VEYXRhOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSByZXR1cm46IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgZm9jdXNlZCA9IGZhbHNlO1xyXG4gIGl0ZW1TZWxlY3Q/OiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByb3RlY3RlZCByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBOZ0lucHV0Q29uZmlnU2VydmljZSxcclxuICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIGNvbnRyb2xDb250YWluZXIsXHJcbiAgICAgIGVsZW1lbnRSZWYsXHJcbiAgICAgIHJlbmRlcmVyLFxyXG4gICAgICBjb25maWdTZXJ2aWNlLFxyXG4gICAgICBjaGFuZ2VEZXRlY3RvclJlZlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHRpbWVJbnB1dDogYW55ID0gMDtcclxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXHJcbiAgb25JbnB1dCh7IHRhcmdldCB9OiBFdmVudCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZUlucHV0KTtcclxuICAgIHRoaXMudGltZUlucHV0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgICBpZiAoIXRoaXMuZm9jdXNlZCkgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnVyaSkge1xyXG4gICAgICAgIGxldCB1cmkgPSB0aGlzLmNyZWF0ZVVybCh0aGlzLnVyaSk7XHJcbiAgICAgICAgdXJpID0gdXJpPy5yZXBsYWNlKCd7dmFsdWV9JywgdmFsdWUpIGFzIHN0cmluZztcclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQuZ2V0KHVyaSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnJlc3BvbnNlRGF0YVxyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0TXVsdGlMYWJlbHMocmVzcG9uc2UsIHRoaXMucmVzcG9uc2VEYXRhLnNwbGl0KCcuJykpXHJcbiAgICAgICAgICAgIDogcmVzcG9uc2U7XHJcbiAgICAgICAgICB0aGlzLmZvcm1hdCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnU2VydmljZS5lbnZpcm9ubWVudHMuZGVidWcpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSwgMzAwKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVVybCh1cmk6IHN0cmluZykge1xyXG4gICAgY29uc3QgdmFyaWFibGVzID0gdXJpLm1hdGNoKC8oXFx7W1xcd1xcX10rXFx9KSsvZyk7XHJcbiAgICB2YXJpYWJsZXM/LmZvckVhY2goKHZhcmlhYmxlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGtleSA9IHZhcmlhYmxlLnJlcGxhY2UoLyhbXFx7XFx9XSkrL2csICcnKTtcclxuICAgICAgY29uc3QgZW52ID0gdGhpcy5jb25maWdTZXJ2aWNlLmVudmlyb25tZW50c1trZXldO1xyXG4gICAgICBpZiAoZW52KSB1cmkgPSB1cmk/LnJlcGxhY2UodmFyaWFibGUsIGVudikgYXMgc3RyaW5nO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdXJpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3QgeyBrZXkgfSA9IGV2ZW50O1xyXG5cclxuICAgIGNvbnN0IGtleXMgPSB7XHJcbiAgICAgIEFycm93VXA6ICgpID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcHRpb25zLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uZHNzU2VsZWN0KTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zW3RoaXMub3B0aW9ucy5sZW5ndGggLSAxXS5kc3NTZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vcHRpb25zW2luZGV4XS5kc3NTZWxlY3QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnNbdGhpcy5vcHRpb25zLmxlbmd0aCAtIDFdLmRzc1NlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9wdGlvbnNbaW5kZXggLSAxXS5kc3NTZWxlY3QgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICBBcnJvd0Rvd246ICgpID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcHRpb25zLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uZHNzU2VsZWN0KTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zWzBdLmRzc1NlbGVjdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub3B0aW9uc1tpbmRleF0uZHNzU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5vcHRpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIHRoaXMub3B0aW9uc1swXS5kc3NTZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vcHRpb25zW2luZGV4ICsgMV0uZHNzU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgICAgRW50ZXI6ICgpID0+IHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcHRpb25zLmZpbmRJbmRleCgob3B0aW9uKSA9PiBvcHRpb24uZHNzU2VsZWN0KTtcclxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaXRlbVNlbGVjdCA9IGluZGV4O1xyXG4gICAgICAgICAgdGhpcy5pbnB1dENoYW5nZSh0aGlzLm9wdGlvbnNbaW5kZXhdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAga2V5c1trZXkgYXMgJ0Fycm93VXAnXSgpO1xyXG4gICAgfSBjYXRjaCB7fVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnJlcXVpcmVkID0gdGhpcy5jb250cm9sLmVycm9ycz8ucmVxdWlyZWQ7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlcXVpcmVkKVxyXG4gICAgICB0aGlzLnJlcXVpcmVkID0gT2JqZWN0LmtleXModGhpcy5lcnJvcnMpLmluY2x1ZGVzKCdyZXF1aXJlZCcpO1xyXG4gICAgdGhpcy5mb3JtYXQoKTtcclxuICB9XHJcblxyXG4gIHRpbWVCbHVyOiBhbnkgPSAwO1xyXG4gIEBPdXRwdXQoKSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIG9uQmx1cihldmVudDogRXZlbnQpIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVCbHVyKTtcclxuICAgIHRoaXMudGltZUJsdXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuYmx1ci5lbWl0KGV2ZW50KTtcclxuICAgIH0sIDMwMCk7XHJcbiAgfVxyXG5cclxuICB0aW1lRm9jdXM6IGFueSA9IDA7XHJcbiAgQE91dHB1dCgpIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIG9uRm9jdXMoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICB0aGlzLm9uSW5wdXQoZXZlbnQpO1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZUZvY3VzKTtcclxuICAgIHRoaXMudGltZUZvY3VzID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZm9jdXMuZW1pdChldmVudCk7XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoe1xyXG4gICAgb3B0aW9ucyxcclxuICAgIHZhbHVlLFxyXG4gIH06IHtcclxuICAgIG9wdGlvbnM6IFNpbXBsZUNoYW5nZTtcclxuICAgIHZhbHVlOiBTaW1wbGVDaGFuZ2U7XHJcbiAgfSkge1xyXG4gICAgaWYgKCEhb3B0aW9ucyAmJiAhIW9wdGlvbnMuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybWF0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoISF2YWx1ZSAmJiAhIXZhbHVlLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmlucHV0Q2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5wdXRDaGFuZ2UodmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKFxyXG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFxyXG4gICAgICAgID8gdGhpcy5nZXRNdWx0aUxhYmVscyh2YWx1ZSwgdGhpcy5wYXRoTGFiZWwuc3BsaXQoJy4nKSlcclxuICAgICAgICA6IHZhbHVlXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMub25Xcml0ZSh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHsgLi4udmFsdWUgfTtcclxuXHJcbiAgICAgIGRlbGV0ZSBuZXdWYWx1ZS5kc3NMYWJlbDtcclxuICAgICAgZGVsZXRlIG5ld1ZhbHVlLmRzc1NlbGVjdDtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMub25Xcml0ZShcclxuICAgICAgICAgICEhdGhpcy5yZXR1cm5cclxuICAgICAgICAgICAgPyB0aGlzLmdldE11bHRpTGFiZWxzKG5ld1ZhbHVlLCB0aGlzLnJldHVybi5zcGxpdCgnLicpKVxyXG4gICAgICAgICAgICA6IG5ld1ZhbHVlXHJcbiAgICAgICAgKTtcclxuICAgICAgfSwgMjUwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdCgpIHtcclxuICAgIHRoaXMub3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcclxuICAgICAgb3B0aW9uLmRzc0xhYmVsID0gdGhpcy5nZXRNdWx0aUxhYmVscyhvcHRpb24sIHRoaXMucGF0aExhYmVsLnNwbGl0KCcuJykpO1xyXG4gICAgICBvcHRpb24uZHNzU2VsZWN0ID0gdGhpcy5pdGVtU2VsZWN0ID09PSBpbmRleDtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=