@stratio/egeo
Version:
396 lines • 32.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-modal/st-modal.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectionStrategy, Component, ComponentFactoryResolver, EventEmitter, HostBinding, Input, Output, ViewChild, ViewContainerRef } from '@angular/core';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { StModalConfig, StModalResponse } from './st-modal.model';
import { StWindowRefService } from '../utils/window-service';
var StModalComponent = /** @class */ (function () {
function StModalComponent(cfr, windowRef) {
this.cfr = cfr;
this.windowRef = windowRef;
this.disabledAnimation = true;
this.click = new EventEmitter();
this.endAnimation = new EventEmitter();
this.defaultMaxWidth = 600;
this.defaultMinWidth = 400;
this.visibility = 'visible';
this._subscriptions = [];
}
Object.defineProperty(StModalComponent.prototype, "hasIcon", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.iconStatus;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "isFullscreen", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.fullscreen;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "title", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.modalTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "buttons", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.buttons || [];
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "isMessageModal", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.message && this.modalConfig.message.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "isComplexMessageModal", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.html && this.modalConfig.html.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "html", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.html;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "message", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.message;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "messageTitle", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.messageTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "modalStyles", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var maxWidth = this.modalConfig.maxWidth || this.defaultMaxWidth;
/** @type {?} */
var minWidth = this.modalConfig.minWidth || this.defaultMinWidth;
/** @type {?} */
var width = this.getModalActualWidth(maxWidth, minWidth);
return { 'max-width': maxWidth + "px", 'min-width': minWidth + "px", 'width': width + "px" };
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "emptyModal", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig && this.modalConfig.empty;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StModalComponent.prototype, "showCloseBtn", {
get: /**
* @return {?}
*/
function () {
return this.modalConfig.showCloseBtn;
},
enumerable: true,
configurable: true
});
/**
* @param {?} event
* @return {?}
*/
StModalComponent.prototype.animationDone = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.toState === 'hidden') {
this.endAnimation.emit(true);
}
};
/**
* @param {?} event
* @return {?}
*/
StModalComponent.prototype.onClickButtons = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.visibility = 'hidden';
this._subscriptions.push(this.endAnimation.subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (data) {
_this.click.emit(event);
}
})));
};
/**
* @return {?}
*/
StModalComponent.prototype.onClose = /**
* @return {?}
*/
function () {
var _this = this;
this.visibility = 'hidden';
this._subscriptions.push(this.endAnimation.subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (data) {
_this.click.emit({
response: StModalResponse.CLOSE,
close: true
});
}
})));
};
/** DYNAMIC MODAL BODY COMPONENT LOAD */
/**
* DYNAMIC MODAL BODY COMPONENT LOAD
* @return {?}
*/
StModalComponent.prototype.ngAfterViewInit = /**
* DYNAMIC MODAL BODY COMPONENT LOAD
* @return {?}
*/
function () {
this.target = this.emptyModal ? this.targetEmpty : this.targetContent;
if (this.component && !(this.modalConfig.html || this.modalConfig.message)) {
this.loadBody();
}
this.windowRef.nativeWindow.document.body.classList.add('st-modal-overlay');
};
/**
* @return {?}
*/
StModalComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.componentRef) {
this.componentRef.destroy();
}
this.windowRef.nativeWindow.document.body.classList.remove('st-modal-overlay');
if (this._subscriptions.length > 0) {
this._subscriptions.forEach((/**
* @param {?} subscription
* @return {?}
*/
function (subscription) {
if (subscription) {
subscription.unsubscribe();
}
}));
}
};
/**
* @private
* @param {?} maxWidth
* @param {?=} minWidth
* @return {?}
*/
StModalComponent.prototype.getModalActualWidth = /**
* @private
* @param {?} maxWidth
* @param {?=} minWidth
* @return {?}
*/
function (maxWidth, minWidth) {
/** @type {?} */
var screenWidth = this.windowRef.nativeWindow.screen.width;
return screenWidth > maxWidth ? maxWidth : (screenWidth < minWidth ? minWidth : screenWidth);
};
/**
* @private
* @return {?}
*/
StModalComponent.prototype.loadBody = /**
* @private
* @return {?}
*/
function () {
if (!this.componentRef) {
this.target.clear();
/** @type {?} */
var compFactory = this.cfr.resolveComponentFactory(this.component);
this.componentRef = this.target.createComponent(compFactory);
this.bindModalInputs();
}
};
/**
* @private
* @return {?}
*/
StModalComponent.prototype.bindModalInputs = /**
* @private
* @return {?}
*/
function () {
var _this = this;
Object.keys(this.modalConfig.inputs).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.componentRef.instance[key] = ((/** @type {?} */ (_this.modalConfig.inputs)))[key];
}));
Object.keys(this.modalConfig.outputs).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.componentRef.instance[key].subscribe(((/** @type {?} */ (_this.modalConfig.outputs)))[key]);
}));
this.componentRef.changeDetectorRef.detectChanges();
};
StModalComponent.decorators = [
{ type: Component, args: [{
selector: 'st-modal',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<div class=\"st-modal-container\" [@state]=\"visibility\" (@state.done)=\"animationDone($event)\" [@.disabled]=\"disabledAnimation\">\n <section *ngIf=\"emptyModal\" class=\"st-modal\" [ngClass]=\"{'st-modal-fullscreen': isFullscreen}\" [ngStyle]=\"modalStyles\" [hidden]=\"emptyModal\">\n <div #stModalBodyEmpty></div>\n </section>\n <section *ngIf=\"!emptyModal\" class=\"st-modal\" [ngClass]=\"{'st-modal-fullscreen': isFullscreen}\" [ngStyle]=\"modalStyles\" [hidden]=\"!emptyModal\">\n <div class=\"st-modal-header\">\n <div class=\"container\">\n <span class=\"status-icon\" [ngClass]=\"hasIcon\" *ngIf=\"hasIcon\"></span>\n <p class=\"title\">{{title}}</p> <span class=\"close-button\" *ngIf=\"showCloseBtn\" (click)=\"onClose()\"></span>\n\n <st-modal-buttons *ngIf=\"isFullscreen\" [buttonConfig]=\"buttons\" [fullscreen]=\"isFullscreen\" (click)=\"onClickButtons($event)\"></st-modal-buttons>\n </div>\n </div>\n <div class=\"st-modal-body\">\n <div class=\"container\">\n\n <div *ngIf=\"isMessageModal\" class=\"message\">\n <h1 id=\"st-modal-message-plain-title\" class=\"st-modal-message-plain-title\">{{messageTitle}}</h1>\n <p id=\"st-modal-message-plain-message\" class=\"st-modal-message-plain-message\">{{message}}</p>\n </div>\n <div *ngIf=\"isComplexMessageModal\" [innerHTML]=\"html\" id=\"st-modal-message-html\"></div>\n <div #stModalBody id=\"st-modal-message-component\"></div>\n\n </div>\n </div>\n <footer class=\"st-modal-footer\" *ngIf=\"buttons && buttons.length > 0\">\n <div class=\"container\">\n <st-modal-buttons *ngIf=\"!isFullscreen\" [buttonConfig]=\"buttons\" (click)=\"onClickButtons($event)\"></st-modal-buttons>\n </div>\n </footer>\n </section>\n</div>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
animations: [
trigger('state', [
state('void, hidden', style({ opacity: 0 })),
state('visible', style({ opacity: 1 })),
transition('* => visible', [
style({ opacity: 0 }),
animate(300)
]),
transition('* => hidden', [
style({ opacity: 1 }),
animate(300)
])
])
],
styles: ["@charset \"UTF-8\";.st-modal-container{display:flex;height:100vh;left:0;position:fixed;top:0;width:100%}.st-modal-container .st-modal{-ms-grid-row-align:center;align-self:center;display:flex;flex-direction:column;margin:auto}.st-modal-container .st-modal.st-modal-fullscreen{min-height:100vh;max-height:100vh;min-width:100%;max-width:100%}.st-modal-container .st-modal .st-modal-header{display:flex;flex-direction:row;height:70px;width:100%}.st-modal-container .st-modal .st-modal-header .container{display:flex;margin-right:auto;margin-left:auto;width:100%;align-items:center;flex-wrap:nowrap}.st-modal-container .st-modal .st-modal-header .container .status-icon{padding-right:1.05rem}.st-modal-container .st-modal .st-modal-header .container .status-icon.delete:before{content:var(--egeo-st-modal__delete-icon--content, \"\uE043\")}.st-modal-container .st-modal .st-modal-header .container .status-icon.alert:before{content:var(--egeo-st-modal__warning-icon--content, \"\uE613\")}.st-modal-container .st-modal .st-modal-header .container .close-button{font-size:var(--egeo-st-modal__close-icon--font-size,inherit);color:var(--egeo-st-modal__close-icon--color,inherit)}.st-modal-container .st-modal .st-modal-header .container .close-button:before{content:var(--egeo-st-modal__close-icon--content, \"\uE117\")}.st-modal-container .st-modal st-modal-buttons{display:flex;justify-content:flex-end;margin-left:auto}.st-modal-container .st-modal .container{min-width:auto}"]
}] }
];
/** @nocollapse */
StModalComponent.ctorParameters = function () { return [
{ type: ComponentFactoryResolver },
{ type: StWindowRefService }
]; };
StModalComponent.propDecorators = {
modalConfig: [{ type: Input }],
component: [{ type: Input }],
disabledAnimation: [{ type: HostBinding, args: ['@.disabled',] }, { type: Input }],
click: [{ type: Output }],
endAnimation: [{ type: Output }],
targetContent: [{ type: ViewChild, args: ['stModalBody', { read: ViewContainerRef, static: false },] }],
targetEmpty: [{ type: ViewChild, args: ['stModalBodyEmpty', { read: ViewContainerRef, static: false },] }]
};
return StModalComponent;
}());
export { StModalComponent };
if (false) {
/** @type {?} */
StModalComponent.prototype.modalConfig;
/** @type {?} */
StModalComponent.prototype.component;
/** @type {?} */
StModalComponent.prototype.disabledAnimation;
/** @type {?} */
StModalComponent.prototype.click;
/** @type {?} */
StModalComponent.prototype.endAnimation;
/** @type {?} */
StModalComponent.prototype.targetContent;
/** @type {?} */
StModalComponent.prototype.targetEmpty;
/** @type {?} */
StModalComponent.prototype.defaultMaxWidth;
/** @type {?} */
StModalComponent.prototype.defaultMinWidth;
/** @type {?} */
StModalComponent.prototype.target;
/** @type {?} */
StModalComponent.prototype.visibility;
/**
* @type {?}
* @private
*/
StModalComponent.prototype.componentRef;
/**
* @type {?}
* @private
*/
StModalComponent.prototype._subscriptions;
/**
* @type {?}
* @private
*/
StModalComponent.prototype.cfr;
/**
* @type {?}
* @private
*/
StModalComponent.prototype.windowRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC1tb2RhbC9zdC1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLHVCQUF1QixFQUN2QixTQUFTLEVBQ1Qsd0JBQXdCLEVBRXhCLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBa0IsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHakcsT0FBTyxFQUF3QyxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0Q7SUF1Q0csMEJBQ1csR0FBNkIsRUFDN0IsU0FBNkI7UUFEN0IsUUFBRyxHQUFILEdBQUcsQ0FBMEI7UUFDN0IsY0FBUyxHQUFULFNBQVMsQ0FBb0I7UUFqQi9CLHNCQUFpQixHQUFZLElBQUksQ0FBQztRQUNqQyxVQUFLLEdBQXdDLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQ3ZGLGlCQUFZLEdBQTJCLElBQUksWUFBWSxFQUFXLENBQUM7UUFJcEUsb0JBQWUsR0FBVyxHQUFHLENBQUM7UUFDOUIsb0JBQWUsR0FBVyxHQUFHLENBQUM7UUFHdkMsZUFBVSxHQUFXLFNBQVMsQ0FBQztRQUd2QixtQkFBYyxHQUF3QixFQUFFLENBQUM7SUFLN0MsQ0FBQztJQUVMLHNCQUFJLHFDQUFPOzs7O1FBQVg7WUFDRyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ3RDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksMENBQVk7Ozs7UUFBaEI7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QVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs4QkFDbEUsU0FBUyxTQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7O0lBNEkzRSx1QkFBQztDQUFBLEFBeEtELElBd0tDO1NBcEpZLGdCQUFnQjs7O0lBQzFCLHVDQUFvQzs7SUFDcEMscUNBQXdCOztJQUN4Qiw2Q0FDMkM7O0lBQzNDLGlDQUFpRzs7SUFDakcsd0NBQTZFOztJQUM3RSx5Q0FBcUc7O0lBQ3JHLHVDQUF3Rzs7SUFFeEcsMkNBQXVDOztJQUN2QywyQ0FBdUM7O0lBRXZDLGtDQUF5Qjs7SUFDekIsc0NBQStCOzs7OztJQUUvQix3Q0FBd0M7Ozs7O0lBQ3hDLDBDQUFpRDs7Ozs7SUFHOUMsK0JBQXFDOzs7OztJQUNyQyxxQ0FBcUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7XG4gICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgIENvbXBvbmVudCxcbiAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgIENvbXBvbmVudFJlZixcbiAgIEV2ZW50RW1pdHRlcixcbiAgIEhvc3RCaW5kaW5nLFxuICAgSW5wdXQsXG4gICBPbkRlc3Ryb3ksXG4gICBBZnRlclZpZXdJbml0LFxuICAgT3V0cHV0LFxuICAgVmlld0NoaWxkLFxuICAgVmlld0NvbnRhaW5lclJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25FdmVudCwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3RNb2RhbEJ1dHRvbiwgU3RNb2RhbEJ1dHRvblJlc3BvbnNlLCBTdE1vZGFsQ29uZmlnLCBTdE1vZGFsUmVzcG9uc2UgfSBmcm9tICcuL3N0LW1vZGFsLm1vZGVsJztcbmltcG9ydCB7IFN0V2luZG93UmVmU2VydmljZSB9IGZyb20gJy4uL3V0aWxzL3dpbmRvdy1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LW1vZGFsJyxcbiAgIHRlbXBsYXRlVXJsOiAnLi9zdC1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnLi9zdC1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICBhbmltYXRpb25zOiBbXG4gICAgICB0cmlnZ2VyKCdzdGF0ZScsIFtcbiAgICAgICAgIHN0YXRlKCd2b2lkLCBoaWRkZW4nLCBzdHlsZSh7b3BhY2l0eTogMH0pKSxcbiAgICAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoe29wYWNpdHk6IDF9KSksXG4gICAgICAgICB0cmFuc2l0aW9uKCcqID0+IHZpc2libGUnLCBbXG4gICAgICAgICAgICBzdHlsZSh7b3BhY2l0eTogMH0pLFxuICAgICAgICAgICAgYW5pbWF0ZSgzMDAgKVxuICAgICAgICAgICAgXSksXG4gICAgICAgICB0cmFuc2l0aW9uKCcqID0+IGhpZGRlbicsIFtcbiAgICAgICAgICAgIHN0eWxlKHtvcGFjaXR5OiAxfSksXG4gICAgICAgICAgICBhbmltYXRlKDMwMCApXG4gICAgICAgICAgICBdKVxuICAgICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTdE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgIEBJbnB1dCgpIG1vZGFsQ29uZmlnOiBTdE1vZGFsQ29uZmlnO1xuICAgQElucHV0KCkgY29tcG9uZW50OiBhbnk7XG4gICBASG9zdEJpbmRpbmcoJ0AuZGlzYWJsZWQnKVxuICAgQElucHV0KCkgZGlzYWJsZWRBbmltYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICAgQE91dHB1dCgpIGNsaWNrOiBFdmVudEVtaXR0ZXI8U3RNb2RhbEJ1dHRvblJlc3BvbnNlPiA9IG5ldyBFdmVudEVtaXR0ZXI8U3RNb2RhbEJ1dHRvblJlc3BvbnNlPigpO1xuICAgQE91dHB1dCgpIGVuZEFuaW1hdGlvbjogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ICA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgIEBWaWV3Q2hpbGQoJ3N0TW9kYWxCb2R5JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlIH0pIHRhcmdldENvbnRlbnQ6IFZpZXdDb250YWluZXJSZWY7XG4gICBAVmlld0NoaWxkKCdzdE1vZGFsQm9keUVtcHR5JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlIH0pIHRhcmdldEVtcHR5OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICByZWFkb25seSBkZWZhdWx0TWF4V2lkdGg6IG51bWJlciA9IDYwMDtcbiAgIHJlYWRvbmx5IGRlZmF1bHRNaW5XaWR0aDogbnVtYmVyID0gNDAwO1xuXG4gICB0YXJnZXQ6IFZpZXdDb250YWluZXJSZWY7XG4gICB2aXNpYmlsaXR5OiBzdHJpbmcgPSAndmlzaWJsZSc7XG5cbiAgIHByaXZhdGUgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PjtcbiAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcblxuICAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIGNmcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgcHJpdmF0ZSB3aW5kb3dSZWY6IFN0V2luZG93UmVmU2VydmljZVxuICAgKSB7IH1cblxuICAgZ2V0IGhhc0ljb24oKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGFsQ29uZmlnLmljb25TdGF0dXM7XG4gICB9XG5cbiAgIGdldCBpc0Z1bGxzY3JlZW4oKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RhbENvbmZpZy5mdWxsc2NyZWVuO1xuICAgfVxuXG4gICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGFsQ29uZmlnLm1vZGFsVGl0bGU7XG4gICB9XG5cbiAgIGdldCBidXR0b25zKCk6IFN0TW9kYWxCdXR0b25bXSB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RhbENvbmZpZy5idXR0b25zIHx8IFtdO1xuICAgfVxuXG4gICBnZXQgaXNNZXNzYWdlTW9kYWwoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RhbENvbmZpZy5tZXNzYWdlICYmIHRoaXMubW9kYWxDb25maWcubWVzc2FnZS5sZW5ndGggPiAwO1xuICAgfVxuXG4gICBnZXQgaXNDb21wbGV4TWVzc2FnZU1vZGFsKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubW9kYWxDb25maWcuaHRtbCAmJiB0aGlzLm1vZGFsQ29uZmlnLmh0bWwubGVuZ3RoID4gMDtcbiAgIH1cblxuICAgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGFsQ29uZmlnLmh0bWw7XG4gICB9XG5cbiAgIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RhbENvbmZpZy5tZXNzYWdlO1xuICAgfVxuXG4gICBnZXQgbWVzc2FnZVRpdGxlKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RhbENvbmZpZy5tZXNzYWdlVGl0bGU7XG4gICB9XG5cbiAgIGdldCBtb2RhbFN0eWxlcygpOiBPYmplY3Qge1xuICAgICAgY29uc3QgbWF4V2lkdGggPSB0aGlzLm1vZGFsQ29uZmlnLm1heFdpZHRoIHx8IHRoaXMuZGVmYXVsdE1heFdpZHRoO1xuICAgICAgY29uc3QgbWluV2lkdGggPSB0aGlzLm1vZGFsQ29uZmlnLm1pbldpZHRoIHx8IHRoaXMuZGVmYXVsdE1pbldpZHRoO1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldE1vZGFsQWN0dWFsV2lkdGgobWF4V2lkdGgsIG1pbldpZHRoKTtcbiAgICAgIHJldHVybiB7ICdtYXgtd2lkdGgnOiBgJHttYXhXaWR0aH1weGAsICdtaW4td2lkdGgnOiBgJHttaW5XaWR0aH1weGAsICd3aWR0aCc6IGAke3dpZHRofXB4YCB9O1xuICAgfVxuXG4gICBnZXQgZW1wdHlNb2RhbCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGFsQ29uZmlnICYmIHRoaXMubW9kYWxDb25maWcuZW1wdHk7XG4gICB9XG5cbiAgIGdldCBzaG93Q2xvc2VCdG4oKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5tb2RhbENvbmZpZy5zaG93Q2xvc2VCdG47XG4gICB9XG5cbiAgIGFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgIHRoaXMuZW5kQW5pbWF0aW9uLmVtaXQodHJ1ZSk7XG4gICAgICB9XG4gICB9XG5cbiAgIG9uQ2xpY2tCdXR0b25zKGV2ZW50OiBhbnkpOiB2b2lkICB7XG4gICAgICB0aGlzLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmVuZEFuaW1hdGlvbi5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNsaWNrLmVtaXQoZXZlbnQpO1xuICAgICAgICAgfVxuICAgICAgfSkpO1xuICAgfVxuXG4gICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgdGhpcy52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnB1c2godGhpcy5lbmRBbmltYXRpb24uc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jbGljay5lbWl0KHtcbiAgICAgICAgICAgICAgIHJlc3BvbnNlOiBTdE1vZGFsUmVzcG9uc2UuQ0xPU0UsXG4gICAgICAgICAgICAgICBjbG9zZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICB9XG4gICAgICB9KSk7XG4gICB9XG5cbiAgIC8qKiBEWU5BTUlDIE1PREFMIEJPRFkgQ09NUE9ORU5UIExPQUQgKi9cbiAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5lbXB0eU1vZGFsID8gdGhpcy50YXJnZXRFbXB0eSA6IHRoaXMudGFyZ2V0Q29udGVudDtcbiAgICAgIGlmICh0aGlzLmNvbXBvbmVudCAmJiAhKHRoaXMubW9kYWxDb25maWcuaHRtbCB8fCB0aGlzLm1vZGFsQ29uZmlnLm1lc3NhZ2UpKSB7XG4gICAgICAgICB0aGlzLmxvYWRCb2R5KCk7XG4gICAgICB9XG4gICAgICB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdzdC1tb2RhbC1vdmVybGF5Jyk7XG4gICB9XG5cbiAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdzdC1tb2RhbC1vdmVybGF5Jyk7XG4gICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBnZXRNb2RhbEFjdHVhbFdpZHRoKG1heFdpZHRoOiBudW1iZXIsIG1pbldpZHRoPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIGNvbnN0IHNjcmVlbldpZHRoOiBudW1iZXIgPSB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuc2NyZWVuLndpZHRoO1xuICAgICAgcmV0dXJuIHNjcmVlbldpZHRoID4gbWF4V2lkdGggPyBtYXhXaWR0aCA6IChzY3JlZW5XaWR0aCA8IG1pbldpZHRoID8gbWluV2lkdGggOiBzY3JlZW5XaWR0aCk7XG4gICB9XG5cbiAgIHByaXZhdGUgbG9hZEJvZHkoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICAgICB0aGlzLnRhcmdldC5jbGVhcigpO1xuICAgICAgICAgY29uc3QgY29tcEZhY3RvcnkgPSB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0aGlzLmNvbXBvbmVudCk7XG4gICAgICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMudGFyZ2V0LmNyZWF0ZUNvbXBvbmVudChjb21wRmFjdG9yeSk7XG4gICAgICAgICB0aGlzLmJpbmRNb2RhbElucHV0cygpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGJpbmRNb2RhbElucHV0cygpOiB2b2lkIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMubW9kYWxDb25maWcuaW5wdXRzKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2Vba2V5XSA9ICh0aGlzLm1vZGFsQ29uZmlnLmlucHV0cyBhcyBhbnkpW2tleV07XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMubW9kYWxDb25maWcub3V0cHV0cykuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0uc3Vic2NyaWJlKCh0aGlzLm1vZGFsQ29uZmlnLm91dHB1dHMgYXMgYW55KVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxufVxuIl19