UNPKG

@stratio/egeo

Version:
256 lines 22.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-modal/st-modal.service.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 { ComponentFactoryResolver, Injectable } from '@angular/core'; import { Subject } from 'rxjs'; /* local dependencies */ import { StModalComponent } from './st-modal.component'; import { StModalResponse, StModalBasicType } from './st-modal.model'; export class StModalService { /** * @param {?} _cfr */ constructor(_cfr) { this._cfr = _cfr; this._containerRef = undefined; this.dynamicModal = undefined; } /* External API */ /** * @param {?} container * @return {?} */ set container(container) { this._containerRef = container; } // - Public methods /** * @param {?} config * @param {?=} component * @param {?=} disabledAnimation * @return {?} */ show(config, component, disabledAnimation) { /** @type {?} */ let errors = this.canCreateModal(config, component); if (errors && errors.length > 0) { throw new Error(errors.join(' ')); } this.notifyButtonInteraction = new Subject(); this.createModal(this.createConfig(config), component, disabledAnimation); return this.notifyButtonInteraction.asObservable(); } /** * @param {?} type * @param {?} modalTitle * @param {?} messageTitle * @param {?} message * @param {?} okButton * @param {?=} cancelButton * @param {?=} maxWidth * @param {?=} minWidth * @param {?=} icon * @param {?=} showCloseBtn * @return {?} */ showBasicModal(type, modalTitle, messageTitle, message, okButton, cancelButton = '', maxWidth = 600, minWidth = 400, icon = '', showCloseBtn = false) { /** @type {?} */ let iconStatus; /** @type {?} */ const buttons = [{ label: okButton, classes: (type === StModalBasicType.DELETE) ? 'button-critical' : 'button-primary', responseValue: StModalResponse.YES, closeOnClick: true }]; if (type !== StModalBasicType.INFO) { buttons.unshift({ label: cancelButton, classes: (type === StModalBasicType.DELETE) ? 'button-borderless' : 'button-secondary', responseValue: StModalResponse.NO, closeOnClick: true }); } switch (type) { case StModalBasicType.DELETE: iconStatus = 'delete'; break; case StModalBasicType.WARNING: iconStatus = 'alert'; break; default: iconStatus = icon; break; } return this.show({ fullscreen: false, message, messageTitle, modalTitle, buttons, maxWidth, minWidth, showCloseBtn, iconStatus }); } /** * @return {?} */ close() { this.destroy(); } /* INTERNAL METHODS FOR WORK WITH MODALS */ /** * @private * @param {?} modalConfig * @param {?=} component * @param {?=} disabledAnimation * @return {?} */ createModal(modalConfig, component, disabledAnimation) { /** @type {?} */ let stModalFactory = this._cfr.resolveComponentFactory(StModalComponent); if (stModalFactory) { this._containerRef.clear(); this.dynamicModal = this._containerRef.createComponent(stModalFactory); this.bindVars(modalConfig, component, disabledAnimation); } } /** * @private * @return {?} */ destroy() { if (this.dynamicModal) { this.dynamicModal.destroy(); this.dynamicModal = undefined; this.notifyButtonInteraction.next(StModalResponse.CLOSE); this.notifyButtonInteraction.complete(); } } /** * @private * @param {?} modalConfig * @param {?} component * @param {?} disabledAnimation * @return {?} */ bindVars(modalConfig, component, disabledAnimation) { this.dynamicModal.instance.component = component; this.dynamicModal.instance.click.subscribe(this.notify.bind(this)); this.dynamicModal.instance.modalConfig = modalConfig; this.dynamicModal.instance.disabledAnimation = (disabledAnimation !== null) ? disabledAnimation : true; this.dynamicModal.changeDetectorRef.detectChanges(); } /** * @private * @param {?} buttonResponse * @return {?} */ notify(buttonResponse) { this.notifyButtonInteraction.next(buttonResponse.response); if (buttonResponse.close) { this.close(); } } /** * @private * @param {?} config * @param {?=} component * @return {?} */ canCreateModal(config, component) { /** @type {?} */ let errors = []; if (!this._containerRef) { errors.push(`[ERROR]: StModalService => Cant find container, are you sure you declarate in MAIN APP component in html and typescript?`); } if (this.dynamicModal !== undefined) { errors.push(`[ERROR]: StModalService => Can't create modal beacause already exists one. Are you sure that you call close method?)`); } if (!component && !config.message && !config.html) { errors.push(`[ERROR]: StModalService => Can't find message, html or component to show in modal`); } return errors; } /** * @private * @param {?} config * @return {?} */ createConfig(config) { /** @type {?} */ const defaultConfig = { fullscreen: false, inputs: {}, outputs: {}, modalTitle: 'Default title', messageTitle: 'Default subtitle', buttons: [], message: undefined, html: undefined, maxWidth: undefined, minWidth: undefined, empty: false }; /** @type {?} */ const checkedConfig = Object.assign({}, defaultConfig, config); checkedConfig.buttons = this.checkButtons(checkedConfig.buttons); return checkedConfig; } /** * @private * @param {?} buttons * @return {?} */ checkButtons(buttons) { return buttons.map((/** * @param {?} button * @return {?} */ button => Object.assign({}, { label: 'Button', closeOnClick: false }, button))); } } StModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ StModalService.ctorParameters = () => [ { type: ComponentFactoryResolver } ]; if (false) { /** * @type {?} * @private */ StModalService.prototype._containerRef; /** * @type {?} * @private */ StModalService.prototype.dynamicModal; /** * @type {?} * @private */ StModalService.prototype.notifyButtonInteraction; /** * @type {?} * @private */ StModalService.prototype._cfr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtbW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3QtbW9kYWwvc3QtbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFVQSxPQUFPLEVBRUosd0JBQXdCLEVBRXhCLFVBQVUsRUFHWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUU1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBR0osZUFBZSxFQUVmLGdCQUFnQixFQUNsQixNQUFNLGtCQUFrQixDQUFDO0FBRzFCLE1BQU0sT0FBTyxjQUFjOzs7O0lBTXhCLFlBQW9CLElBQThCO1FBQTlCLFNBQUksR0FBSixJQUFJLENBQTBCO1FBSjFDLGtCQUFhLEdBQXFCLFNBQVMsQ0FBQztRQUM1QyxpQkFBWSxHQUFtQyxTQUFTLENBQUM7SUFHWCxDQUFDOzs7Ozs7SUFHdkQsSUFBSSxTQUFTLENBQUMsU0FBMkI7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDbEMsQ0FBQzs7Ozs7Ozs7SUFHRCxJQUFJLENBQUMsTUFBcUIsRUFBRSxTQUFxQixFQUFFLGlCQUEyQjs7WUFDdkUsTUFBTSxHQUFhLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztRQUM3RCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFB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bkc7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNqQixDQUFDOzs7Ozs7SUFFTyxZQUFZLENBQUMsTUFBcUI7O2NBQ2pDLGFBQWEsR0FBa0I7WUFDbEMsVUFBVSxFQUFFLEtBQUs7WUFDakIsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsRUFBRTtZQUNYLFVBQVUsRUFBRSxlQUFlO1lBQzNCLFlBQVksRUFBRSxrQkFBa0I7WUFDaEMsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsU0FBUztZQUNmLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFFBQVEsRUFBRSxTQUFTO1lBQ25CLEtBQUssRUFBRSxLQUFLO1NBQ2Q7O2NBQ0ssYUFBYSxHQUFrQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDO1FBQzdFLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsT0FBTyxhQUFhLENBQUM7SUFDeEIsQ0FBQzs7Ozs7O0lBRU8sWUFBWSxDQUFDLE9BQXdCO1FBQzFDLE9BQU8sT0FBTyxDQUFDLEdBQUc7Ozs7UUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUMsQ0FBQztJQUNyRyxDQUFDOzs7WUEzSkgsVUFBVTs7OztZQWpCUix3QkFBd0I7Ozs7Ozs7SUFvQnhCLHVDQUFvRDs7Ozs7SUFDcEQsc0NBQWlFOzs7OztJQUNqRSxpREFBMEQ7Ozs7O0lBRTlDLDhCQUFzQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiDCqSAyMDE3IFN0cmF0aW8gQmlnIERhdGEgSW5jLiwgU3VjdXJzYWwgZW4gRXNwYcOxYS5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZO1xuICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqIFNlZSB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMC5cbiAqL1xuaW1wb3J0IHtcbiAgIENvbXBvbmVudEZhY3RvcnksXG4gICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICBDb21wb25lbnRSZWYsXG4gICBJbmplY3RhYmxlLFxuICAgVHlwZSxcbiAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlICwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuLyogbG9jYWwgZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBTdE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9zdC1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgIFN0TW9kYWxCdXR0b24sXG4gICBTdE1vZGFsQ29uZmlnLFxuICAgU3RNb2RhbFJlc3BvbnNlLFxuICAgU3RNb2RhbEJ1dHRvblJlc3BvbnNlLFxuICAgU3RNb2RhbEJhc2ljVHlwZVxufSBmcm9tICcuL3N0LW1vZGFsLm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFN0TW9kYWxTZXJ2aWNlIHtcblxuICAgcHJpdmF0ZSBfY29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmID0gdW5kZWZpbmVkO1xuICAgcHJpdmF0ZSBkeW5hbWljTW9kYWw6IENvbXBvbmVudFJlZjxTdE1vZGFsQ29tcG9uZW50PiA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgbm90aWZ5QnV0dG9uSW50ZXJhY3Rpb246IFN1YmplY3Q8U3RNb2RhbFJlc3BvbnNlPjtcblxuICAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHsgfVxuXG4gICAvKiBFeHRlcm5hbCBBUEkgKi9cbiAgIHNldCBjb250YWluZXIoY29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICB0aGlzLl9jb250YWluZXJSZWYgPSBjb250YWluZXI7XG4gICB9XG5cbiAgIC8vIC0gUHVibGljIG1ldGhvZHNcbiAgIHNob3coY29uZmlnOiBTdE1vZGFsQ29uZmlnLCBjb21wb25lbnQ/OiBUeXBlPGFueT4sIGRpc2FibGVkQW5pbWF0aW9uPzogYm9vbGVhbik6IE9ic2VydmFibGU8U3RNb2RhbFJlc3BvbnNlPiB7XG4gICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IHRoaXMuY2FuQ3JlYXRlTW9kYWwoY29uZmlnLCBjb21wb25lbnQpO1xuICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9ycy5qb2luKCcgJykpO1xuICAgICAgfVxuICAgICAgdGhpcy5ub3RpZnlCdXR0b25JbnRlcmFjdGlvbiA9IG5ldyBTdWJqZWN0PFN0TW9kYWxSZXNwb25zZT4oKTtcbiAgICAgIHRoaXMuY3JlYXRlTW9kYWwodGhpcy5jcmVhdGVDb25maWcoY29uZmlnKSwgY29tcG9uZW50LCBkaXNhYmxlZEFuaW1hdGlvbik7XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnlCdXR0b25JbnRlcmFjdGlvbi5hc09ic2VydmFibGUoKTtcbiAgIH1cblxuICAgc2hvd0Jhc2ljTW9kYWwoXG4gICAgICB0eXBlOiBTdE1vZGFsQmFzaWNUeXBlLFxuICAgICAgbW9kYWxUaXRsZTogc3RyaW5nLFxuICAgICAgbWVzc2FnZVRpdGxlOiBzdHJpbmcsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBva0J1dHRvbjogc3RyaW5nLFxuICAgICAgY2FuY2VsQnV0dG9uOiBzdHJpbmcgPSAnJyxcbiAgICAgIG1heFdpZHRoOiBudW1iZXIgPSA2MDAsXG4gICAgICBtaW5XaWR0aDogbnVtYmVyID0gNDAwLFxuICAgICAgaWNvbjogc3RyaW5nID0gJycsXG4gICAgICBzaG93Q2xvc2VCdG46IGJvb2xlYW4gPSBmYWxzZVxuICAgKTogT2JzZXJ2YWJsZTxTdE1vZGFsUmVzcG9uc2U+IHtcbiAgICAgIGxldCBpY29uU3RhdHVzOiBzdHJpbmc7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbnM6IFN0TW9kYWxCdXR0b25bXSA9IFt7XG4gICAgICAgICBsYWJlbDogb2tCdXR0b24sXG4gICAgICAgICBjbGFzc2VzOiAodHlwZSA9PT0gU3RNb2RhbEJhc2ljVHlwZS5ERUxFVEUpID8gJ2J1dHRvbi1jcml0aWNhbCcgOiAnYnV0dG9uLXByaW1hcnknLFxuICAgICAgICAgcmVzcG9uc2VWYWx1ZTogU3RNb2RhbFJlc3BvbnNlLllFUyxcbiAgICAgICAgIGNsb3NlT25DbGljazogdHJ1ZVxuICAgICAgfV07XG5cbiAgICAgIGlmICh0eXBlICE9PSBTdE1vZGFsQmFzaWNUeXBlLklORk8pIHtcbiAgICAgICAgIGJ1dHRvbnMudW5zaGlmdCh7XG4gICAgICAgICAgICBsYWJlbDogY2FuY2VsQnV0dG9uLFxuICAgICAgICAgICAgY2xhc3NlczogKHR5cGUgPT09IFN0TW9kYWxCYXNpY1R5cGUuREVMRVRFKSA/ICdidXR0b24tYm9yZGVybGVzcycgOiAnYnV0dG9uLXNlY29uZGFyeScsXG4gICAgICAgICAgICByZXNwb25zZVZhbHVlOiBTdE1vZGFsUmVzcG9uc2UuTk8sXG4gICAgICAgICAgICBjbG9zZU9uQ2xpY2s6IHRydWVcbiAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgIGNhc2UgU3RNb2RhbEJhc2ljVHlwZS5ERUxFVEU6XG4gICAgICAgICAgICBpY29uU3RhdHVzID0gJ2RlbGV0ZSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgIGNhc2UgU3RNb2RhbEJhc2ljVHlwZS5XQVJOSU5HOlxuICAgICAgICAgICAgaWNvblN0YXR1cyA9ICdhbGVydCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpY29uU3RhdHVzID0gaWNvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zaG93KHtcbiAgICAgICAgIGZ1bGxzY3JlZW46IGZhbHNlLFxuICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgIG1lc3NhZ2VUaXRsZSxcbiAgICAgICAgIG1vZGFsVGl0bGUsXG4gICAgICAgICBidXR0b25zLFxuICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICBtaW5XaWR0aCxcbiAgICAgICAgIHNob3dDbG9zZUJ0bixcbiAgICAgICAgIGljb25TdGF0dXNcbiAgICAgIH0pO1xuICAgfVxuXG4gICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgfVxuXG4gICAvKiBJTlRFUk5BTCBNRVRIT0RTIEZPUiBXT1JLIFdJVEggTU9EQUxTICovXG4gICBwcml2YXRlIGNyZWF0ZU1vZGFsKG1vZGFsQ29uZmlnOiBTdE1vZGFsQ29uZmlnLCBjb21wb25lbnQ/OiBUeXBlPGFueT4sIGRpc2FibGVkQW5pbWF0aW9uPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgbGV0IHN0TW9kYWxGYWN0b3J5OiBDb21wb25lbnRGYWN0b3J5PFN0TW9kYWxDb21wb25lbnQ+ID0gdGhpcy5fY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFN0TW9kYWxDb21wb25lbnQpO1xuICAgICAgaWYgKHN0TW9kYWxGYWN0b3J5KSB7XG4gICAgICAgICB0aGlzLl9jb250YWluZXJSZWYuY2xlYXIoKTtcbiAgICAgICAgIHRoaXMuZHluYW1pY01vZGFsID0gdGhpcy5fY29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudDxTdE1vZGFsQ29tcG9uZW50PihzdE1vZGFsRmFjdG9yeSk7XG4gICAgICAgICB0aGlzLmJpbmRWYXJzKG1vZGFsQ29uZmlnLCBjb21wb25lbnQsIGRpc2FibGVkQW5pbWF0aW9uKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuZHluYW1pY01vZGFsKSB7XG4gICAgICAgICB0aGlzLmR5bmFtaWNNb2RhbC5kZXN0cm95KCk7XG4gICAgICAgICB0aGlzLmR5bmFtaWNNb2RhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgIHRoaXMubm90aWZ5QnV0dG9uSW50ZXJhY3Rpb24ubmV4dChTdE1vZGFsUmVzcG9uc2UuQ0xPU0UpO1xuICAgICAgICAgdGhpcy5ub3RpZnlCdXR0b25JbnRlcmFjdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGJpbmRWYXJzKG1vZGFsQ29uZmlnOiBTdE1vZGFsQ29uZmlnLCBjb21wb25lbnQ6IFR5cGU8YW55PiwgZGlzYWJsZWRBbmltYXRpb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIHRoaXMuZHluYW1pY01vZGFsLmluc3RhbmNlLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcblxuICAgICAgdGhpcy5keW5hbWljTW9kYWwuaW5zdGFuY2UuY2xpY2suc3Vic2NyaWJlKHRoaXMubm90aWZ5LmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5keW5hbWljTW9kYWwuaW5zdGFuY2UubW9kYWxDb25maWcgPSBtb2RhbENvbmZpZztcbiAgICAgIHRoaXMuZHluYW1pY01vZGFsLmluc3RhbmNlLmRpc2FibGVkQW5pbWF0aW9uID0gKGRpc2FibGVkQW5pbWF0aW9uICE9PSBudWxsKSA/IGRpc2FibGVkQW5pbWF0aW9uIDogdHJ1ZTtcblxuICAgICAgdGhpcy5keW5hbWljTW9kYWwuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICBwcml2YXRlIG5vdGlmeShidXR0b25SZXNwb25zZTogU3RNb2RhbEJ1dHRvblJlc3BvbnNlKTogdm9pZCB7XG4gICAgICB0aGlzLm5vdGlmeUJ1dHRvbkludGVyYWN0aW9uLm5leHQoYnV0dG9uUmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgaWYgKGJ1dHRvblJlc3BvbnNlLmNsb3NlKSB7XG4gICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2FuQ3JlYXRlTW9kYWwoY29uZmlnOiBTdE1vZGFsQ29uZmlnLCBjb21wb25lbnQ/OiBUeXBlPGFueT4pOiBzdHJpbmdbXSB7XG4gICAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWYgKCF0aGlzLl9jb250YWluZXJSZWYpIHtcbiAgICAgICAgIGVycm9ycy5wdXNoKGBbRVJST1JdOiBTdE1vZGFsU2VydmljZSA9PiBDYW50IGZpbmQgY29udGFpbmVyLCBhcmUgeW91IHN1cmUgeW91IGRlY2xhcmF0ZSBpbiBNQUlOIEFQUCBjb21wb25lbnQgaW4gaHRtbCBhbmQgdHlwZXNjcmlwdD9gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmR5bmFtaWNNb2RhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICBlcnJvcnMucHVzaChgW0VSUk9SXTogU3RNb2RhbFNlcnZpY2UgPT4gQ2FuJ3QgY3JlYXRlIG1vZGFsIGJlYWNhdXNlIGFscmVhZHkgZXhpc3RzIG9uZS4gQXJlIHlvdSBzdXJlIHRoYXQgeW91IGNhbGwgY2xvc2UgbWV0aG9kPylgKTtcbiAgICAgIH1cbiAgICAgIGlmICghY29tcG9uZW50ICYmICFjb25maWcubWVzc2FnZSAmJiAhY29uZmlnLmh0bWwpIHtcbiAgICAgICAgIGVycm9ycy5wdXNoKGBbRVJST1JdOiBTdE1vZGFsU2VydmljZSA9PiBDYW4ndCBmaW5kIG1lc3NhZ2UsIGh0bWwgb3IgY29tcG9uZW50IHRvIHNob3cgaW4gbW9kYWxgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcnM7XG4gICB9XG5cbiAgIHByaXZhdGUgY3JlYXRlQ29uZmlnKGNvbmZpZzogU3RNb2RhbENvbmZpZyk6IFN0TW9kYWxDb25maWcge1xuICAgICAgY29uc3QgZGVmYXVsdENvbmZpZzogU3RNb2RhbENvbmZpZyA9IHtcbiAgICAgICAgIGZ1bGxzY3JlZW46IGZhbHNlLFxuICAgICAgICAgaW5wdXRzOiB7fSxcbiAgICAgICAgIG91dHB1dHM6IHt9LFxuICAgICAgICAgbW9kYWxUaXRsZTogJ0RlZmF1bHQgdGl0bGUnLFxuICAgICAgICAgbWVzc2FnZVRpdGxlOiAnRGVmYXVsdCBzdWJ0aXRsZScsXG4gICAgICAgICBidXR0b25zOiBbXSxcbiAgICAgICAgIG1lc3NhZ2U6IHVuZGVmaW5lZCxcbiAgICAgICAgIGh0bWw6IHVuZGVmaW5lZCxcbiAgICAgICAgIG1heFdpZHRoOiB1bmRlZmluZWQsXG4gICAgICAgICBtaW5XaWR0aDogdW5kZWZpbmVkLFxuICAgICAgICAgZW1wdHk6IGZhbHNlXG4gICAgICB9O1xuICAgICAgY29uc3QgY2hlY2tlZENvbmZpZzogU3RNb2RhbENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRDb25maWcsIGNvbmZpZyk7XG4gICAgICBjaGVja2VkQ29uZmlnLmJ1dHRvbnMgPSB0aGlzLmNoZWNrQnV0dG9ucyhjaGVja2VkQ29uZmlnLmJ1dHRvbnMpO1xuICAgICAgcmV0dXJuIGNoZWNrZWRDb25maWc7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tCdXR0b25zKGJ1dHRvbnM6IFN0TW9kYWxCdXR0b25bXSk6IFN0TW9kYWxCdXR0b25bXSB7XG4gICAgICByZXR1cm4gYnV0dG9ucy5tYXAoYnV0dG9uID0+IE9iamVjdC5hc3NpZ24oe30sIHsgbGFiZWw6ICdCdXR0b24nLCBjbG9zZU9uQ2xpY2s6IGZhbHNlIH0sIGJ1dHRvbikpO1xuICAgfVxufVxuIl19