lct-components
Version:
LCT basic components
180 lines • 28.8 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { ModalManualInputAlertComponent } from '../modal/modal-manual-input-alert/modal-manual-input-alert';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class ButtonComponent {
constructor(renderer, resolver, viewContainerRef) {
this.renderer = renderer;
this.resolver = resolver;
this.viewContainerRef = viewContainerRef;
this.title = 'Insert Title';
this.buttonType = 'primary';
this.disabled = 'false';
this.shape = 'normal';
this.icon = '';
this.width = '';
this.height = '';
this.bold = 'false';
this.iconWidth = 30;
this.iconHeight = 30;
this.counter = -1;
this.isMobile = false;
this.id = ''; // ID en Button Opcional
this.userId = '';
this.alertIconPath = ''; // Ruta del ícono de alerta para el modal
this.alertManualInput = new EventEmitter();
this.disabledValue = false;
this.boldValue = false;
this.componentRef2 = undefined;
}
// Propiedad calculada para generar el id dinámico
get buttonId() {
return this.id ? `btn-${this.id}` : null;
}
ngAfterViewInit() {
var _a, _b;
this.renderButtonType();
if (this.width) {
this.renderer.setStyle((_a = this.button) === null || _a === void 0 ? void 0 : _a.nativeElement, 'width', this.width);
}
if (this.height) {
this.renderer.setStyle((_b = this.button) === null || _b === void 0 ? void 0 : _b.nativeElement, 'height', this.height);
}
}
ngOnInit() {
if (this.disabled === true || this.disabled == 'true' || this.disabled === '') {
this.disabledValue = true;
}
else {
this.disabledValue = false;
}
if (this.bold === true || this.bold == 'true') {
this.boldValue = true;
}
else {
this.boldValue = false;
}
}
ngOnChanges(changes) {
var _a, _b, _c;
if (changes['buttonType'] && !changes['buttonType'].firstChange) {
this.buttonType = (_a = changes.buttonType) === null || _a === void 0 ? void 0 : _a.currentValue;
this.renderer.removeClass((_b = this.button) === null || _b === void 0 ? void 0 : _b.nativeElement, (_c = changes.buttonType) === null || _c === void 0 ? void 0 : _c.previousValue);
this.renderButtonType();
}
else 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;
}
}
}
renderButtonType() {
var _a;
this.renderer.addClass((_a = this.button) === null || _a === void 0 ? void 0 : _a.nativeElement, this.buttonType);
}
openModalInputAlert() {
if (!this.userId || this.userId === '') {
console.log("No es posible configurar modal manual input alert sin parámetro userId");
}
const sessionData = localStorage.getItem('alert-manual-input') || '[]';
const usersAlertData = sessionData ? JSON.parse(sessionData) : [];
const currentUser = usersAlertData.find(user => user.userId === this.userId);
// Si el usuario existe y su timestamp es menor a 4 horas, no mostrar el modal
if (currentUser && currentUser.timestamp > new Date().getTime() - 1000 * 60 * 60 * 4) {
this.alertManualInput.emit('keyboard');
return;
}
// Si ya pasaron al menos 4 horas o es un usuario nuevo, ejecutar el modal y actualizar/agregar el timestamp
const currentTimestamp = new Date().getTime();
if (currentUser) {
// Actualizar el timestamp del usuario existente
currentUser.timestamp = currentTimestamp;
}
else {
// Agregar el nuevo usuario al array
usersAlertData.push({
userId: this.userId || '',
timestamp: currentTimestamp,
});
}
localStorage.setItem('alert-manual-input', JSON.stringify(usersAlertData));
const componentFactory = this.resolver.resolveComponentFactory(ModalManualInputAlertComponent);
this.componentRef2 = this.viewContainerRef.createComponent(componentFactory);
this.componentRef2.instance.widthModalConfig = this.isMobile ? "100%" : '600px';
this.componentRef2.instance.heightModalConfig = this.isMobile ? "100%" : '320px';
this.componentRef2.instance.alertIconPath = "src/svg/ico-tit-alerta.svg";
if (this.alertIconPath) {
this.componentRef2.instance.alertIconPath = this.alertIconPath;
}
this.componentRef2.instance.closeModalStore.subscribe(resp => {
if (resp.finish) {
this.alertManualInput.emit(resp.type);
this.closeModal();
}
});
}
onButtonClick() {
var _a, _b;
// Verificar si el EventEmitter tiene suscriptores (observers)
// Esto indica si hay un listener en el template padre: (buttonClickAlert)="..."
const hasSubscribers = ((_b = (_a = this.alertManualInput) === null || _a === void 0 ? void 0 : _a.observers) === null || _b === void 0 ? void 0 : _b.length) > 0;
if (this.buttonType === 'enabled' && hasSubscribers) {
this.openModalInputAlert();
}
}
closeModal() {
if (this.componentRef2) {
this.componentRef2.destroy();
this.componentRef2 = undefined;
}
}
}
ButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ButtonComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
ButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ButtonComponent, selector: "lct-button", inputs: { title: "title", buttonType: "buttonType", disabled: "disabled", shape: "shape", icon: "icon", width: "width", height: "height", bold: "bold", iconWidth: "iconWidth", iconHeight: "iconHeight", counter: "counter", isMobile: "isMobile", id: "id", userId: "userId", alertIconPath: "alertIconPath" }, outputs: { alertManualInput: "alertManualInput" }, viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"{'containerBtnRound': shape==='round'}\">\n <button [attr.id]=\"buttonId\" \n [disabled]=\"disabledValue\" #button \n (click)=\"onButtonClick()\"\n [ngClass]=\"{'button-round': shape==='round'}\" [ngStyle]=\"{'padding': title && shape==='normal' ? '0px 14px': ''}\" >\n <img\n *ngIf=\"icon\" [ngClass]=\"{'counterAndIconImg': counter >= 0 && icon}\"\n [width]=\"iconWidth\"\n [height]=\"iconHeight\"\n [ngStyle]=\"{'margin-right': title ? '8px': ''}\" [src]=\"icon\" alt=\"icon\">\n <span *ngIf=\"title\"\n [ngClass]=\"{'counterOn': counter >= 0 && !icon, 'counterAndIconTxt': counter >= 0 && icon}\"\n >{{shape==='normal' ? title : ''}}</span>\n <span *ngIf=\"counter >= 0\" class=\"btnCounter\">{{counter}}</span>\n </button>\n <span *ngIf=\"shape==='round'\"\n [class.fw-bold]=\"boldValue\"\n class=\"titleBtnRound\"\n >{{title}}</span>\n</div>\n", styles: [".containerBtnRound{display:flex;flex-direction:column;justify-content:center;align-items:center}button{width:100%;height:40px;border-radius:8px;border:1px solid #C2C2C2;background-color:#c8ccd4;font-size:14px;letter-spacing:0;line-height:18px;font-family:\"Barlow\",serif;cursor:pointer}button:disabled{cursor:not-allowed;background-color:#c8ccd4;color:#fff;font-weight:unset}button:not([disabled]):active img{filter:hue-rotate(10deg) saturate(.5) brightness(390%) saturate(4)}.button-round{height:44px;width:44px;border-radius:22px;padding:0!important}.button-round img{margin:0!important;width:28px;height:28px}.titleBtnRound{color:#3c4149;font-size:13px;font-style:normal;font-weight:400;line-height:14px;margin-top:6px}.primary{background-color:#2649b6;color:#fff;font-weight:bold}.primary:not([disabled]):active{background:#2A5AED}@media (hover: hover){.primary:not([disabled]):hover{background:#2A5AED}}.secondary{box-sizing:border-box;border:1px solid #2649B6;background-color:#fff;color:#2649b6}.secondary:disabled{border:0}.secondary:not([disabled]):active{background:#2A5AED;color:#fff}@media (hover: hover){.secondary:not([disabled]):hover{border:1px solid #2A5AED;color:#2a5aed}.secondary:active{color:#fff!important}}.counterOn{position:relative;float:left;left:12px}.btnCounter{background-color:#fff;color:#2649b6;position:relative;right:12px;float:right;padding:.1rem .4rem;border:1px solid #2649B6;border-radius:2px}.counterAndIconTxt{position:relative;vertical-align:middle}.counterAndIconImg{vertical-align:middle;position:relative;float:left;left:12px}.tertiary{box-sizing:border-box;background-color:#6a80b1;color:#fff}.tertiary:disabled{border:0}.tertiary:not([disabled]):hover{border:1px solid #2649B6}.tertiary:not([disabled]):active{background:#809AD2}.quaternary{box-sizing:border-box;border:1px solid #2649B6;background-color:#223359;color:#fff}.quaternary:disabled{border:0}.quaternary:not([disabled]):active{background-color:#2a5aed;color:#fff}@media (hover: hover){.quaternary:not([disabled]):hover{background-color:#fff;border:1px solid #223359;color:#223359}}.quintary{box-sizing:border-box;border:1px solid #a2a2a2;background-color:#fff;color:#000;font-weight:bold}.quintary:disabled{border:0}.quintary:not([disabled]):active{background:#a2a2a2;color:#fff}@media (hover: hover){.quintary:not([disabled]):hover{border:1px solid #a2a2a2;color:#000}.quintary:active{color:#fff!important}}.sextary{box-sizing:border-box;border:1px solid #F1F2F4;background-color:#f1f2f4;color:#151618;font-weight:bold}.sextary:disabled{border:0}.sextary:not([disabled]):active{background:#a2a2a2;color:#fff}@media (hover: hover){.sextary:not([disabled]):hover{border:1px solid #a2a2a2;color:#000}.sextary:active{color:#fff!important}}.enabled{background-color:#747474;box-sizing:border-box;color:#fff}.enabled:disabled{border:0}.enabled:not([disabled]):hover{border:1px solid #747474}.enabled:not([disabled]):enabled{background-color:#747474}.error{background-color:#c60e4c;color:#fff}.success{background-color:#8cba37;color:#fff}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ButtonComponent, decorators: [{
type: Component,
args: [{
selector: 'lct-button',
templateUrl: './button.component.html',
styleUrls: ['./button.component.scss']
}]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }]; }, propDecorators: { title: [{
type: Input
}], buttonType: [{
type: Input
}], disabled: [{
type: Input
}], shape: [{
type: Input
}], icon: [{
type: Input
}], width: [{
type: Input
}], height: [{
type: Input
}], bold: [{
type: Input
}], iconWidth: [{
type: Input
}], iconHeight: [{
type: Input
}], counter: [{
type: Input
}], isMobile: [{
type: Input
}], id: [{
type: Input
}], userId: [{
type: Input
}], alertIconPath: [{
type: Input
}], alertManualInput: [{
type: Output
}], button: [{
type: ViewChild,
args: ['button']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xjdC1jb21wb25lbnRzL3NyYy9saWIvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL2J1dHRvbi9idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFJVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNERBQTRELENBQUM7OztBQVE1RyxNQUFNLE9BQU8sZUFBZTtJQTJCMUIsWUFBb0IsUUFBbUIsRUFDN0IsUUFBa0MsRUFDbEMsZ0JBQWtDO1FBRnhCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDN0IsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQTVCbkMsVUFBSyxHQUFHLGNBQWMsQ0FBQTtRQUN0QixlQUFVLEdBQW1ILFNBQVMsQ0FBQTtRQUN0SSxhQUFRLEdBQWdELE9BQU8sQ0FBQztRQUNoRSxVQUFLLEdBQXVCLFFBQVEsQ0FBQztRQUNyQyxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixTQUFJLEdBQStCLE9BQU8sQ0FBQztRQUMzQyxjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ3ZCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsWUFBTyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsT0FBRSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUMxQyxXQUFNLEdBQVksRUFB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QztRQUVwRSxJQUFHLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLGNBQWMsRUFBQztZQUNqRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7U0FDaEM7SUFDSCxDQUFDOzs0R0FySVUsZUFBZTtnR0FBZixlQUFlLDhnQkN4QjVCLGs2QkFvQkE7MkZESWEsZUFBZTtrQkFMM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsV0FBVyxFQUFFLHlCQUF5QjtvQkFDdEMsU0FBUyxFQUFFLENBQUMseUJBQXlCLENBQUM7aUJBQ3ZDO3NLQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDYyxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsTWFudWFsSW5wdXRBbGVydENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLW1hbnVhbC1pbnB1dC1hbGVydC9tb2RhbC1tYW51YWwtaW5wdXQtYWxlcnQnO1xuaW1wb3J0IHsgTWFudWFsSW5wdXRBbGVydFR5cGUgfSBmcm9tICcuLi9tb2RhbC9tb2RhbC1tYW51YWwtaW5wdXQtYWxlcnQvbW9kYWwtbWFudWFsLWlucHV0LWFsZXJ0LnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGN0LWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9idXR0b24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRpdGxlID0gJ0luc2VydCBUaXRsZSdcbiAgQElucHV0KCkgYnV0dG9uVHlwZTogJ3ByaW1hcnknIHwgJ2VuYWJsZWQnIHwgJ3NlY29uZGFyeScgfCAndGVydGlhcnknIHwgJ3F1YXRlcm5hcnknIHwgJ3F1aW50YXJ5JyB8ICdzZXh0YXJ5JyB8ICdlcnJvcicgfCAnc3VjY2VzcycgPSAncHJpbWFyeSdcbiAgQElucHV0KCkgZGlzYWJsZWQ6ICd0cnVlJyB8ICdmYWxzZScgfCAnZGlzYWJsZWQnfCBib29sZWFuIHwgJycgPSAnZmFsc2UnO1xuICBASW5wdXQoKSBzaGFwZTogJ25vcm1hbCcgfCAncm91bmQnID0gJ25vcm1hbCc7XG4gIEBJbnB1dCgpIGljb24gPSAnJztcbiAgQElucHV0KCkgd2lkdGggPSAnJztcbiAgQElucHV0KCkgaGVpZ2h0ID0gJyc7XG4gIEBJbnB1dCgpIGJvbGQ6ICd0cnVlJyB8ICdmYWxzZScgfCBib29sZWFuID0gJ2ZhbHNlJztcbiAgQElucHV0KCkgaWNvbldpZHRoOiBudW1iZXIgPSAzMDtcbiAgQElucHV0KCkgaWNvbkhlaWdodDogbnVtYmVyID0gMzA7XG4gIEBJbnB1dCgpIGNvdW50ZXI6IG51bWJlciA9IC0xO1xuICBASW5wdXQoKSBpc01vYmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpZD86IHN0cmluZyA9ICcnOyAvLyBJRCBlbiBCdXR0b24gT3BjaW9uYWxcbiAgQElucHV0KCkgdXNlcklkPzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGFsZXJ0SWNvblBhdGg/OiBzdHJpbmcgPSAnJzsgLy8gUnV0YSBkZWwgw61jb25vIGRlIGFsZXJ0YSBwYXJhIGVsIG1vZGFsXG4gIEBPdXRwdXQoKSBhbGVydE1hbnVhbElucHV0OiBFdmVudEVtaXR0ZXI8TWFudWFsSW5wdXRBbGVydFR5cGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxNYW51YWxJbnB1dEFsZXJ0VHlwZT4oKTtcbiAgQFZpZXdDaGlsZCgnYnV0dG9uJykgYnV0dG9uOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICBkaXNhYmxlZFZhbHVlID0gZmFsc2U7XG4gIGJvbGRWYWx1ZSA9IGZhbHNlO1xuICBjb21wb25lbnRSZWYyOiBDb21wb25lbnRSZWY8TW9kYWxNYW51YWxJbnB1dEFsZXJ0Q29tcG9uZW50PiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvLyBQcm9waWVkYWQgY2FsY3VsYWRhIHBhcmEgZ2VuZXJhciBlbCBpZCBkaW7DoW1pY29cbiAgZ2V0IGJ1dHRvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmlkID8gYGJ0bi0ke3RoaXMuaWR9YCA6IG51bGw7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikgeyB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgdGhpcy5yZW5kZXJCdXR0b25UeXBlKCk7XG4gICAgaWYgKHRoaXMud2lkdGgpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5idXR0b24/Lm5hdGl2ZUVsZW1lbnQsICd3aWR0aCcsIHRoaXMud2lkdGgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmJ1dHRvbj8ubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZD09PSB0cnVlIHx8IHRoaXMuZGlzYWJsZWQgPT0gJ3RydWUnIHx8IHRoaXMuZGlzYWJsZWQgPT09ICcnKXtcbiAgICAgIHRoaXMuZGlzYWJsZWRWYWx1ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZWRWYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5ib2xkPT09IHRydWUgfHwgdGhpcy5ib2xkID09ICd0cnVlJyl7XG4gICAgICB0aGlzLmJvbGRWYWx1ZSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYm9sZFZhbHVlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydidXR0b25UeXBlJ10gJiYgIWNoYW5nZXNbJ2J1dHRvblR5cGUnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5idXR0b25UeXBlID0gY2hhbmdlcy5idXR0b25UeXBlPy5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuYnV0dG9uPy5uYXRpdmVFbGVtZW50LCBjaGFuZ2VzLmJ1dHRvblR5cGU/LnByZXZpb3VzVmFsdWUpO1xuICAgICAgdGhpcy5yZW5kZXJCdXR0b25UeXBlKCk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddICYmICFjaGFuZ2VzWydkaXNhYmxlZCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBpZiAoY2hhbmdlc1snZGlzYWJsZWQnXS5jdXJyZW50VmFsdWUgPT09IHRydWUgfHwgY2hhbmdlc1snZGlzYWJsZWQnXS5jdXJyZW50VmFsdWUgPT0gJ3RydWUnIHx8IGNoYW5nZXNbJ2Rpc2FibGVkJ10uY3VycmVudFZhbHVlID09PSAnJyl7XG4gICAgICAgIHRoaXMuZGlzYWJsZWRWYWx1ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2FibGVkVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXJCdXR0b25UeXBlKCkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5idXR0b24/Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuYnV0dG9uVHlwZSk7XG4gIH1cblxuICBvcGVuTW9kYWxJbnB1dEFsZXJ0KCkge1xuICAgIGlmKCF0aGlzLnVzZXJJZCB8fCB0aGlzLnVzZXJJZCA9PT0gJycpe1xuICAgICAgY29uc29sZS5sb2coXCJObyBlcyBwb3NpYmxlIGNvbmZpZ3VyYXIgbW9kYWwgbWFudWFsIGlucHV0IGFsZXJ0IHNpbiBwYXLDoW1ldHJvIHVzZXJJZFwiKTtcbiAgICB9XG4gICAgY29uc3Qgc2Vzc2lvbkRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYWxlcnQtbWFudWFsLWlucHV0JykgfHwgJ1tdJztcbiAgICBjb25zdCB1c2Vyc0FsZXJ0RGF0YTogQXJyYXk8eyB1c2VySWQ6IHN0cmluZywgdGltZXN0YW1wOiBudW1iZXIgfT4gPSBzZXNzaW9uRGF0YSA/IEpTT04ucGFyc2Uoc2Vzc2lvbkRhdGEpIDogW107XG4gICAgY29uc3QgY3VycmVudFVzZXIgPSB1c2Vyc0FsZXJ0RGF0YS5maW5kKHVzZXIgPT4gdXNlci51c2VySWQgPT09IHRoaXMudXNlcklkKTtcbiAgICBcbiAgICAvLyBTaSBlbCB1c3VhcmlvIGV4aXN0ZSB5IHN1IHRpbWVzdGFtcCBlcyBtZW5vciBhIDQgaG9yYXMsIG5vIG1vc3RyYXIgZWwgbW9kYWxcbiAgICBpZihjdXJyZW50VXNlciAmJiBjdXJyZW50VXNlci50aW1lc3RhbXAgPiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIDEwMDAgKiA2MCAqIDYwICogNCl7XG4gICAgICB0aGlzLmFsZXJ0TWFudWFsSW5wdXQuZW1pdCgna2V5Ym9hcmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU2kgeWEgcGFzYXJvbiBhbCBtZW5vcyA0IGhvcmFzIG8gZXMgdW4gdXN1YXJpbyBudWV2bywgZWplY3V0YXIgZWwgbW9kYWwgeSBhY3R1YWxpemFyL2FncmVnYXIgZWwgdGltZXN0YW1wXG4gICAgY29uc3QgY3VycmVudFRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIFxuICAgIGlmKGN1cnJlbnRVc2VyKSB7XG4gICAgICAvLyBBY3R1YWxpemFyIGVsIHRpbWVzdGFtcCBkZWwgdXN1YXJpbyBleGlzdGVudGVcbiAgICAgIGN1cnJlbnRVc2VyLnRpbWVzdGFtcCA9IGN1cnJlbnRUaW1lc3RhbXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFncmVnYXIgZWwgbnVldm8gdXN1YXJpbyBhbCBhcnJheVxuICAgICAgdXNlcnNBbGVydERhdGEucHVzaCh7XG4gICAgICAgIHVzZXJJZDogdGhpcy51c2VySWQgfHwgJycsXG4gICAgICAgIHRpbWVzdGFtcDogY3VycmVudFRpbWVzdGFtcCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWxlcnQtbWFudWFsLWlucHV0JywgSlNPTi5zdHJpbmdpZnkodXNlcnNBbGVydERhdGEpKTtcblxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE1vZGFsTWFudWFsSW5wdXRBbGVydENvbXBvbmVudCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWYyID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZjIuaW5zdGFuY2Uud2lkdGhNb2RhbENvbmZpZyA9IHRoaXMuaXNNb2JpbGUgPyBcIjEwMCVcIiA6ICc2MDBweCc7XG4gICAgdGhpcy5jb21wb25lbnRSZWYyLmluc3RhbmNlLmhlaWdodE1vZGFsQ29uZmlnID0gdGhpcy5pc01vYmlsZSA/IFwiMTAwJVwiIDogJzMyMHB4JztcbiAgICB0aGlzLmNvbXBvbmVudFJlZjIuaW5zdGFuY2UuYWxlcnRJY29uUGF0aCA9IFwic3JjL3N2Zy9pY28tdGl0LWFsZXJ0YS5zdmdcIjtcbiAgICBpZiAodGhpcy5hbGVydEljb25QYXRoKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZjIuaW5zdGFuY2UuYWxlcnRJY29uUGF0aCA9IHRoaXMuYWxlcnRJY29uUGF0aDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5jb21wb25lbnRSZWYyLmluc3RhbmNlLmNsb3NlTW9kYWxTdG9yZS5zdWJzY3JpYmUocmVzcCA9PiB7XG4gICAgICBpZihyZXNwLmZpbmlzaCl7XG4gICAgICAgIHRoaXMuYWxlcnRNYW51YWxJbnB1dC5lbWl0KHJlc3AudHlwZSk7XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKCk6IHZvaWQge1xuICAgIC8vIFZlcmlmaWNhciBzaSBlbCBFdmVudEVtaXR0ZXIgdGllbmUgc3VzY3JpcHRvcmVzIChvYnNlcnZlcnMpXG4gICAgLy8gRXN0byBpbmRpY2Egc2kgaGF5IHVuIGxpc3RlbmVyIGVuIGVsIHRlbXBsYXRlIHBhZHJlOiAoYnV0dG9uQ2xpY2tBbGVydCk9XCIuLi5cIlxuICAgIGNvbnN0IGhhc1N1YnNjcmliZXJzID0gdGhpcy5hbGVydE1hbnVhbElucHV0Py5vYnNlcnZlcnM/Lmxlbmd0aCA+IDA7XG4gICAgXG4gICAgaWYodGhpcy5idXR0b25UeXBlID09PSAnZW5hYmxlZCcgJiYgaGFzU3Vic2NyaWJlcnMpe1xuICAgICAgdGhpcy5vcGVuTW9kYWxJbnB1dEFsZXJ0KCk7XG4gICAgfVxuICB9XG4gIGNsb3NlTW9kYWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmMikge1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmMiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJ7J2NvbnRhaW5lckJ0blJvdW5kJzogc2hhcGU9PT0ncm91bmQnfVwiPlxuICA8YnV0dG9uIFthdHRyLmlkXT1cImJ1dHRvbklkXCIgXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFZhbHVlXCIgI2J1dHRvbiBcbiAgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soKVwiXG4gIFtuZ0NsYXNzXT1cInsnYnV0dG9uLXJvdW5kJzogc2hhcGU9PT0ncm91bmQnfVwiIFtuZ1N0eWxlXT1cInsncGFkZGluZyc6IHRpdGxlICYmIHNoYXBlPT09J25vcm1hbCcgPyAnMHB4IDE0cHgnOiAnJ31cIiA+XG4gICAgPGltZ1xuICAgICAgKm5nSWY9XCJpY29uXCIgW25nQ2xhc3NdPVwieydjb3VudGVyQW5kSWNvbkltZyc6IGNvdW50ZXIgPj0gMCAmJiBpY29ufVwiXG4gICAgICBbd2lkdGhdPVwiaWNvbldpZHRoXCJcbiAgICAgIFtoZWlnaHRdPVwiaWNvbkhlaWdodFwiXG4gICAgICBbbmdTdHlsZV09XCJ7J21hcmdpbi1yaWdodCc6IHRpdGxlID8gJzhweCc6ICcnfVwiIFtzcmNdPVwiaWNvblwiIGFsdD1cImljb25cIj5cbiAgICA8c3BhbiAqbmdJZj1cInRpdGxlXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2NvdW50ZXJPbic6IGNvdW50ZXIgPj0gMCAmJiAhaWNvbiwgJ2NvdW50ZXJBbmRJY29uVHh0JzogY291bnRlciA+PSAwICYmIGljb259XCJcbiAgICA+e3tzaGFwZT09PSdub3JtYWwnID8gdGl0bGUgOiAnJ319PC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiY291bnRlciA+PSAwXCIgY2xhc3M9XCJidG5Db3VudGVyXCI+e3tjb3VudGVyfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8c3BhbiAqbmdJZj1cInNoYXBlPT09J3JvdW5kJ1wiXG4gICAgICAgIFtjbGFzcy5mdy1ib2xkXT1cImJvbGRWYWx1ZVwiXG4gICAgICAgIGNsYXNzPVwidGl0bGVCdG5Sb3VuZFwiXG4gID57e3RpdGxlfX08L3NwYW4+XG48L2Rpdj5cbiJdfQ==