UNPKG

@neocomplexx/ngx-neo-modal

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

415 lines 31.8 kB
/** * @fileoverview added by tsickle * Generated from: lib/ngx-neo-modal.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { NgxNeoModalComponent, AlertButton } from './ngx-neo-modal.component'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; export class NgxNeoModalService { /** * @param {?} modalService */ constructor(modalService) { this.modalService = modalService; this.originalAlert = window.alert; window.alert = (/** * @param {?} msg * @return {?} */ (msg) => tslib_1.__awaiter(this, void 0, void 0, function* () { yield this.alert(msg); })); } /** * @private * @param {?} config * @return {?} */ openModal(config) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const modalRef = this.modalService.open(NgxNeoModalComponent, { backdrop: 'static', keyboard: false, centered: true, windowClass: 'neoWindow' }); modalRef.componentInstance.config = (this.mergeDeep(modalRef.componentInstance.config, config)); modalRef.componentInstance.changeRef.markForCheck(); return yield modalRef.result; }); } /** * Show message. Can be use as window.alert * @param {?} msg * @param {?=} autofocus * @return {?} */ alert(msg, autofocus = false) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const config = { title: { visibility: false }, message: msg, button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; yield this.openModal(config); }); } /** * * Show succsessfull message * @param {?} msg * @param {?=} autofocus * @return {?} */ success(msg, autofocus = true) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const config = { title: { text: '¡Buen trabajo!' }, message: msg, type: 'success', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return this.openModal(config); }); } /** * * Warning message * @param {?} msg * @param {?=} autofocus * @return {?} */ warning(msg, autofocus = false) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const config = { title: { text: '¡Cuidado!' }, message: msg, type: 'warning', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return this.openModal(config); }); } /** * * Error message * @param {?} msg * @param {?=} autofocus * @return {?} */ error(msg, autofocus = true) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const config = { title: { text: '¡Error!' }, message: msg, type: 'error', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return this.openModal(config); }); } /** * * Information message * @param {?} msg * @param {?=} autofocus * @return {?} */ info(msg, autofocus = true) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const config = { title: { text: '¡Información importante!' }, message: msg, type: 'info', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return this.openModal(config); }); } /** * * Show decission modal with question and two options for accept or reject. * @param {?} questionMsg * @param {?=} successMsg * @param {?=} cancelMsg * @param {?=} autofocus * @return {?} */ // tslint:disable-next-line:max-line-length decision(questionMsg, successMsg, cancelMsg, autofocus = AlertButton.Cancel) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const buttonAcceptFocus = autofocus === AlertButton.Accept; /** @type {?} */ const buttonCancelFocus = autofocus === AlertButton.Cancel; /** @type {?} */ const config = { title: { text: '¿Está seguro?' }, message: questionMsg, type: 'question', button: { cancel: { autofocus: buttonCancelFocus }, accept: { autofocus: buttonAcceptFocus } } }; return this.openModal(config) .then((/** * @param {?} value * @return {?} */ (value) => { if (value.ButtonResponse === AlertButton.Accept) { if (successMsg && successMsg !== '') { this.success(successMsg); } } else { if (cancelMsg) { this.info(cancelMsg); } } return Promise.resolve(value); })); }); } /** * * Input text message * @param {?} title * @param {?} placeholder * @param {?=} successMsg * @param {?=} autofocus * @param {?=} buttonAutofocus * @return {?} */ // tslint:disable-next-line:max-line-length input(title, placeholder, successMsg, autofocus = true, buttonAutofocus = AlertButton.Accept) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const buttonAcceptFocus = buttonAutofocus === AlertButton.Accept; /** @type {?} */ const buttonCancelFocus = buttonAutofocus === AlertButton.Cancel; /** @type {?} */ const config = { title: { text: title }, message: '', input: { placeholder, visibility: true, autofocus: autofocus }, button: { accepct: { autofocus: buttonAcceptFocus }, cancel: { autofocus: buttonCancelFocus } } }; return this.openModal(config) .then((/** * @param {?} value * @return {?} */ (value) => { if (value.ButtonResponse === AlertButton.Accept) { if (successMsg) { this.success(successMsg); } } return Promise.resolve(value); })); }); } // tslint:disable:no-bitwise /** * @param {?} title * @param {?} message * @param {?} buttonFocus * @return {?} */ yesNoCancel(title, message, buttonFocus) { return tslib_1.__awaiter(this, void 0, void 0, function* () { return this.custom(title, message, (AlertButton.Yes | AlertButton.No | AlertButton.Cancel), buttonFocus); }); } /** * @private * @param {?} title * @param {?} message * @param {?} buttons * @param {?} buttonFocus * @return {?} */ custom(title, message, buttons, buttonFocus) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const buttonAccept = (buttons & AlertButton.Accept) > 0; /** @type {?} */ const buttonYes = (buttons & AlertButton.Yes) > 0; /** @type {?} */ const buttonCancel = (buttons & AlertButton.Cancel) > 0; /** @type {?} */ const buttonNo = (buttons & AlertButton.No) > 0; /** @type {?} */ const buttonRetry = (buttons & AlertButton.Retry) > 0; /** @type {?} */ const buttonAcceptFocus = buttonFocus === AlertButton.Accept; /** @type {?} */ const buttonYesFocus = buttonFocus === AlertButton.Yes; /** @type {?} */ const buttonCancelFocus = buttonFocus === AlertButton.Cancel; /** @type {?} */ const buttonNoFocus = buttonFocus === AlertButton.No; /** @type {?} */ const buttonRetryFocus = buttonFocus === AlertButton.Retry; /** @type {?} */ const config = { title: { text: title }, message, button: { yes: { visibility: buttonYes, autofocus: buttonYesFocus }, no: { visibility: buttonNo, autofocus: buttonNoFocus }, retry: { visibility: buttonRetry, autofocus: buttonRetryFocus }, cancel: { visibility: buttonCancel, autofocus: buttonCancelFocus }, accept: { visibility: buttonAccept, autofocus: buttonAcceptFocus } } }; return this.openModal(config); }); } /** * @private * @param {?} item * @return {?} */ isObject(item) { return (item && typeof item === 'object' && !Array.isArray(item)); } // this will lead to infinite recursion on circular references /** * @private * @param {?} target * @param {...?} sources * @return {?} */ mergeDeep(target, ...sources) { if (!sources.length) { return target; } /** @type {?} */ const source = sources.shift(); if (this.isObject(target) && this.isObject(source)) { for (const key in source) { if (this.isObject(source[key])) { if (!target[key]) { Object.assign(target, { [key]: {} }); } this.mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } } } return this.mergeDeep(target, ...sources); } } NgxNeoModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NgxNeoModalService.ctorParameters = () => [ { type: NgbModal } ]; if (false) { /** @type {?} */ NgxNeoModalService.prototype.template; /** @type {?} */ NgxNeoModalService.prototype.originalAlert; /** * @type {?} * @private */ NgxNeoModalService.prototype.modalService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW5lby1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tbW9kYWwvIiwic291cmNlcyI6WyJsaWIvbmd4LW5lby1tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFlLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd0RCxNQUFNLE9BQU8sa0JBQWtCOzs7O0lBSzdCLFlBQW9CLFlBQXNCO1FBQXRCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3hDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLENBQUMsS0FBSzs7OztRQUFHLENBQU8sR0FBRyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQSxDQUFBLENBQUM7SUFDSixDQUFDOzs7Ozs7SUFFYSxTQUFTLENBQUMsTUFBVzs7O2tCQUMzQixRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzVELFFBQVEsRUFBRSxRQUFRO2dCQUNsQixRQUFRLEVBQUUsS0FBSztnQkFDZixRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQUUsV0FBVzthQUN6QixDQUFDO1lBRUYsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENB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QUFROzs7O0lBSWYsc0NBQWM7O0lBRWQsMkNBQTBCOzs7OztJQUVkLDBDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neE5lb01vZGFsQ29tcG9uZW50LCBBbGVydFJlc3VsdCwgQWxlcnRCdXR0b24gfSBmcm9tICcuL25neC1uZW8tbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd4TmVvTW9kYWxTZXJ2aWNlIHtcbiAgdGVtcGxhdGU6IGFueTtcblxuICBwdWJsaWMgb3JpZ2luYWxBbGVydDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCkge1xuICAgIHRoaXMub3JpZ2luYWxBbGVydCA9IHdpbmRvdy5hbGVydDtcbiAgICB3aW5kb3cuYWxlcnQgPSBhc3luYyAobXNnKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFsZXJ0KG1zZyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb3Blbk1vZGFsKGNvbmZpZzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTmd4TmVvTW9kYWxDb21wb25lbnQsIHtcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgd2luZG93Q2xhc3M6ICduZW9XaW5kb3cnXG4gICAgfSk7XG5cbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maWcgPSAodGhpcy5tZXJnZURlZXAobW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlnLCBjb25maWcpKTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jaGFuZ2VSZWYubWFya0ZvckNoZWNrKCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbW9kYWxSZWYucmVzdWx0O1xuICB9XG5cblxuICAvKipcbiAgKiBTaG93IG1lc3NhZ2UuIENhbiBiZSB1c2UgYXMgd2luZG93LmFsZXJ0XG4gICovXG4gIHB1YmxpYyBhc3luYyBhbGVydChtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLm9wZW5Nb2RhbChjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFNob3cgc3VjY3Nlc3NmdWxsICBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VjY2Vzcyhtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gdHJ1ZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwqFCdWVuIHRyYWJham8hJ1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IG1zZyxcbiAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgIGJ1dHRvbjoge1xuICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBhY2NlcHQ6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGF1dG9mb2N1cyxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgKlxuICAqIFdhcm5pbmcgbWVzc2FnZVxuICAqL1xuICBwdWJsaWMgYXN5bmMgd2FybmluZyhtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gZmFsc2UpOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdGV4dDogJ8KhQ3VpZGFkbyEnXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgdHlwZTogJ3dhcm5pbmcnLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gKlxuICogRXJyb3IgbWVzc2FnZVxuICovXG4gIHB1YmxpYyBhc3luYyBlcnJvcihtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gdHJ1ZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwqFFcnJvciEnXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIGJ1dHRvbjoge1xuICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBhY2NlcHQ6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGF1dG9mb2N1cyxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogSW5mb3JtYXRpb24gbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluZm8obXNnOiBzdHJpbmcsIGF1dG9mb2N1cyA9IHRydWUpOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdGV4dDogJ8KhSW5mb3JtYWNpw7NuIGltcG9ydGFudGUhJ1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IG1zZyxcbiAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgIGJ1dHRvbjoge1xuICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBhY2NlcHQ6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGF1dG9mb2N1cyxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogU2hvdyBkZWNpc3Npb24gbW9kYWwgd2l0aCBxdWVzdGlvbiBhbmQgdHdvIG9wdGlvbnMgZm9yIGFjY2VwdCBvciByZWplY3QuXG4gICAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIHB1YmxpYyBhc3luYyBkZWNpc2lvbihxdWVzdGlvbk1zZzogc3RyaW5nLCBzdWNjZXNzTXNnPzogc3RyaW5nLCBjYW5jZWxNc2c/OiBzdHJpbmcsIGF1dG9mb2N1cyA9IEFsZXJ0QnV0dG9uLkNhbmNlbCk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBidXR0b25BY2NlcHRGb2N1cyA9IGF1dG9mb2N1cyA9PT0gQWxlcnRCdXR0b24uQWNjZXB0O1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzID0gYXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5DYW5jZWw7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwr9Fc3TDoSBzZWd1cm8/J1xuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IHF1ZXN0aW9uTXNnLFxuICAgICAgdHlwZTogJ3F1ZXN0aW9uJyxcbiAgICAgIGJ1dHRvbjoge1xuICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkNhbmNlbEZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQWNjZXB0Rm9jdXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKVxuICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5CdXR0b25SZXNwb25zZSA9PT0gQWxlcnRCdXR0b24uQWNjZXB0KSB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3NNc2cgJiYgc3VjY2Vzc01zZyAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuc3VjY2VzcyhzdWNjZXNzTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNhbmNlbE1zZykge1xuICAgICAgICAgICAgdGhpcy5pbmZvKGNhbmNlbE1zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBJbnB1dCB0ZXh0IG1lc3NhZ2VcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgcHVibGljIGFzeW5jIGlucHV0KHRpdGxlOiBzdHJpbmcsIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHN1Y2Nlc3NNc2c/OiBzdHJpbmcsIGF1dG9mb2N1cyA9IHRydWUsIGJ1dHRvbkF1dG9mb2N1czogQWxlcnRCdXR0b24gPSBBbGVydEJ1dHRvbi5BY2NlcHQpOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgYnV0dG9uQWNjZXB0Rm9jdXMgPSBidXR0b25BdXRvZm9jdXMgPT09IEFsZXJ0QnV0dG9uLkFjY2VwdDtcbiAgICBjb25zdCBidXR0b25DYW5jZWxGb2N1cyA9IGJ1dHRvbkF1dG9mb2N1cyA9PT0gQWxlcnRCdXR0b24uQ2FuY2VsO1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdGV4dDogdGl0bGVcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiAnJyxcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgICB2aXNpYmlsaXR5OiB0cnVlLFxuICAgICAgICBhdXRvZm9jdXM6IGF1dG9mb2N1c1xuICAgICAgfSxcbiAgICAgIGJ1dHRvbjoge1xuICAgICAgICBhY2NlcGN0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25BY2NlcHRGb2N1c1xuICAgICAgICB9LFxuICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkNhbmNlbEZvY3VzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZylcbiAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUuQnV0dG9uUmVzcG9uc2UgPT09IEFsZXJ0QnV0dG9uLkFjY2VwdCkge1xuICAgICAgICAgIGlmIChzdWNjZXNzTXNnKSB7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3Moc3VjY2Vzc01zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xuICAgICAgfSk7XG5cblxuXG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG4gIHB1YmxpYyBhc3luYyB5ZXNOb0NhbmNlbCh0aXRsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGJ1dHRvbkZvY3VzOiBBbGVydEJ1dHRvbik6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcblxuICAgIHJldHVybiB0aGlzLmN1c3RvbSh0aXRsZSwgbWVzc2FnZSwgKEFsZXJ0QnV0dG9uLlllcyB8IEFsZXJ0QnV0dG9uLk5vIHwgQWxlcnRCdXR0b24uQ2FuY2VsKSwgYnV0dG9uRm9jdXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjdXN0b20odGl0bGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBidXR0b25zOiBBbGVydEJ1dHRvbiwgYnV0dG9uRm9jdXM6IEFsZXJ0QnV0dG9uKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGJ1dHRvbkFjY2VwdDogYm9vbGVhbiA9IChidXR0b25zICYgQWxlcnRCdXR0b24uQWNjZXB0KSA+IDA7XG4gICAgY29uc3QgYnV0dG9uWWVzOiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5ZZXMpID4gMDtcbiAgICBjb25zdCBidXR0b25DYW5jZWw6IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLkNhbmNlbCkgPiAwO1xuICAgIGNvbnN0IGJ1dHRvbk5vOiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5ObykgPiAwO1xuICAgIGNvbnN0IGJ1dHRvblJldHJ5OiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5SZXRyeSkgPiAwO1xuXG4gICAgY29uc3QgYnV0dG9uQWNjZXB0Rm9jdXM6IGJvb2xlYW4gPSBidXR0b25Gb2N1cyA9PT0gQWxlcnRCdXR0b24uQWNjZXB0O1xuICAgIGNvbnN0IGJ1dHRvblllc0ZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLlllcztcbiAgICBjb25zdCBidXR0b25DYW5jZWxGb2N1czogYm9vbGVhbiA9IGJ1dHRvbkZvY3VzID09PSBBbGVydEJ1dHRvbi5DYW5jZWw7XG4gICAgY29uc3QgYnV0dG9uTm9Gb2N1czogYm9vbGVhbiA9IGJ1dHRvbkZvY3VzID09PSBBbGVydEJ1dHRvbi5ObztcbiAgICBjb25zdCBidXR0b25SZXRyeUZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLlJldHJ5O1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdGV4dDogdGl0bGVcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIHllczoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGJ1dHRvblllcyxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvblllc0ZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIG5vOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uTm8sXG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25Ob0ZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIHJldHJ5OiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uUmV0cnksXG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25SZXRyeUZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGJ1dHRvbkNhbmNlbCxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkNhbmNlbEZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGJ1dHRvbkFjY2VwdCxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkFjY2VwdEZvY3VzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG5cbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG5cblxuICBwcml2YXRlIGlzT2JqZWN0KGl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pKTtcbiAgfVxuXG4gIC8vIHRoaXMgd2lsbCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbiBvbiBjaXJjdWxhciByZWZlcmVuY2VzXG4gIHByaXZhdGUgbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk6IGFueSB7XG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkgeyByZXR1cm4gdGFyZ2V0OyB9XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuXG4gICAgaWYgKHRoaXMuaXNPYmplY3QodGFyZ2V0KSAmJiB0aGlzLmlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAodGhpcy5pc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTsgfVxuICAgICAgICAgIHRoaXMubWVyZ2VEZWVwKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XG4gIH1cblxuXG59XG4iXX0=