@neocomplexx/ngx-neo-modal
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
573 lines • 38.4 kB
JavaScript
/**
* @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';
var NgxNeoModalService = /** @class */ (function () {
function NgxNeoModalService(modalService) {
var _this = this;
this.modalService = modalService;
this.originalAlert = window.alert;
window.alert = (/**
* @param {?} msg
* @return {?}
*/
function (msg) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.alert(msg)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); });
}
/**
* @private
* @param {?} config
* @return {?}
*/
NgxNeoModalService.prototype.openModal = /**
* @private
* @param {?} config
* @return {?}
*/
function (config) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var modalRef;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
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 [4 /*yield*/, modalRef.result];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
/**
* Show message. Can be use as window.alert
*/
/**
* Show message. Can be use as window.alert
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
NgxNeoModalService.prototype.alert = /**
* Show message. Can be use as window.alert
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
function (msg, autofocus) {
if (autofocus === void 0) { autofocus = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var config;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
config = {
title: {
visibility: false
},
message: msg,
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [4 /*yield*/, this.openModal(config)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
/**
*
* Show succsessfull message
*/
/**
*
* Show succsessfull message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
NgxNeoModalService.prototype.success = /**
*
* Show succsessfull message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
function (msg, autofocus) {
if (autofocus === void 0) { autofocus = true; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var config;
return tslib_1.__generator(this, function (_a) {
config = {
title: {
text: '¡Buen trabajo!'
},
message: msg,
type: 'success',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
});
});
};
/**
*
* Warning message
*/
/**
*
* Warning message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
NgxNeoModalService.prototype.warning = /**
*
* Warning message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
function (msg, autofocus) {
if (autofocus === void 0) { autofocus = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var config;
return tslib_1.__generator(this, function (_a) {
config = {
title: {
text: '¡Cuidado!'
},
message: msg,
type: 'warning',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
});
});
};
/**
*
* Error message
*/
/**
*
* Error message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
NgxNeoModalService.prototype.error = /**
*
* Error message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
function (msg, autofocus) {
if (autofocus === void 0) { autofocus = true; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var config;
return tslib_1.__generator(this, function (_a) {
config = {
title: {
text: '¡Error!'
},
message: msg,
type: 'error',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
});
});
};
/**
*
* Information message
*/
/**
*
* Information message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
NgxNeoModalService.prototype.info = /**
*
* Information message
* @param {?} msg
* @param {?=} autofocus
* @return {?}
*/
function (msg, autofocus) {
if (autofocus === void 0) { autofocus = true; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var config;
return tslib_1.__generator(this, function (_a) {
config = {
title: {
text: '¡Información importante!'
},
message: msg,
type: 'info',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
});
});
};
/**
*
* Show decission modal with question and two options for accept or reject.
*/
// tslint:disable-next-line:max-line-length
/**
*
* 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
NgxNeoModalService.prototype.decision = /**
*
* 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
function (questionMsg, successMsg, cancelMsg, autofocus) {
if (autofocus === void 0) { autofocus = AlertButton.Cancel; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var buttonAcceptFocus, buttonCancelFocus, config;
var _this = this;
return tslib_1.__generator(this, function (_a) {
buttonAcceptFocus = autofocus === AlertButton.Accept;
buttonCancelFocus = autofocus === AlertButton.Cancel;
config = {
title: {
text: '¿Está seguro?'
},
message: questionMsg,
type: 'question',
button: {
cancel: {
autofocus: buttonCancelFocus
},
accept: {
autofocus: buttonAcceptFocus
}
}
};
return [2 /*return*/, this.openModal(config)
.then((/**
* @param {?} value
* @return {?}
*/
function (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
*/
// tslint:disable-next-line:max-line-length
/**
*
* Input text message
* @param {?} title
* @param {?} placeholder
* @param {?=} successMsg
* @param {?=} autofocus
* @param {?=} buttonAutofocus
* @return {?}
*/
// tslint:disable-next-line:max-line-length
NgxNeoModalService.prototype.input = /**
*
* Input text message
* @param {?} title
* @param {?} placeholder
* @param {?=} successMsg
* @param {?=} autofocus
* @param {?=} buttonAutofocus
* @return {?}
*/
// tslint:disable-next-line:max-line-length
function (title, placeholder, successMsg, autofocus, buttonAutofocus) {
if (autofocus === void 0) { autofocus = true; }
if (buttonAutofocus === void 0) { buttonAutofocus = AlertButton.Accept; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var buttonAcceptFocus, buttonCancelFocus, config;
var _this = this;
return tslib_1.__generator(this, function (_a) {
buttonAcceptFocus = buttonAutofocus === AlertButton.Accept;
buttonCancelFocus = buttonAutofocus === AlertButton.Cancel;
config = {
title: {
text: title
},
message: '',
input: {
placeholder: placeholder,
visibility: true,
autofocus: autofocus
},
button: {
accepct: {
autofocus: buttonAcceptFocus
},
cancel: {
autofocus: buttonCancelFocus
}
}
};
return [2 /*return*/, this.openModal(config)
.then((/**
* @param {?} value
* @return {?}
*/
function (value) {
if (value.ButtonResponse === AlertButton.Accept) {
if (successMsg) {
_this.success(successMsg);
}
}
return Promise.resolve(value);
}))];
});
});
};
// tslint:disable:no-bitwise
// tslint:disable:no-bitwise
/**
* @param {?} title
* @param {?} message
* @param {?} buttonFocus
* @return {?}
*/
NgxNeoModalService.prototype.yesNoCancel =
// tslint:disable:no-bitwise
/**
* @param {?} title
* @param {?} message
* @param {?} buttonFocus
* @return {?}
*/
function (title, message, buttonFocus) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, this.custom(title, message, (AlertButton.Yes | AlertButton.No | AlertButton.Cancel), buttonFocus)];
});
});
};
/**
* @private
* @param {?} title
* @param {?} message
* @param {?} buttons
* @param {?} buttonFocus
* @return {?}
*/
NgxNeoModalService.prototype.custom = /**
* @private
* @param {?} title
* @param {?} message
* @param {?} buttons
* @param {?} buttonFocus
* @return {?}
*/
function (title, message, buttons, buttonFocus) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var buttonAccept, buttonYes, buttonCancel, buttonNo, buttonRetry, buttonAcceptFocus, buttonYesFocus, buttonCancelFocus, buttonNoFocus, buttonRetryFocus, config;
return tslib_1.__generator(this, function (_a) {
buttonAccept = (buttons & AlertButton.Accept) > 0;
buttonYes = (buttons & AlertButton.Yes) > 0;
buttonCancel = (buttons & AlertButton.Cancel) > 0;
buttonNo = (buttons & AlertButton.No) > 0;
buttonRetry = (buttons & AlertButton.Retry) > 0;
buttonAcceptFocus = buttonFocus === AlertButton.Accept;
buttonYesFocus = buttonFocus === AlertButton.Yes;
buttonCancelFocus = buttonFocus === AlertButton.Cancel;
buttonNoFocus = buttonFocus === AlertButton.No;
buttonRetryFocus = buttonFocus === AlertButton.Retry;
config = {
title: {
text: title
},
message: 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 [2 /*return*/, this.openModal(config)];
});
});
};
/**
* @private
* @param {?} item
* @return {?}
*/
NgxNeoModalService.prototype.isObject = /**
* @private
* @param {?} item
* @return {?}
*/
function (item) {
return (item && typeof item === 'object' && !Array.isArray(item));
};
// this will lead to infinite recursion on circular references
// this will lead to infinite recursion on circular references
/**
* @private
* @param {?} target
* @param {...?} sources
* @return {?}
*/
NgxNeoModalService.prototype.mergeDeep =
// this will lead to infinite recursion on circular references
/**
* @private
* @param {?} target
* @param {...?} sources
* @return {?}
*/
function (target) {
var _a, _b;
var sources = [];
for (var _i = 1; _i < arguments.length; _i++) {
sources[_i - 1] = arguments[_i];
}
if (!sources.length) {
return target;
}
/** @type {?} */
var source = sources.shift();
if (this.isObject(target) && this.isObject(source)) {
for (var key in source) {
if (this.isObject(source[key])) {
if (!target[key]) {
Object.assign(target, (_a = {}, _a[key] = {}, _a));
}
this.mergeDeep(target[key], source[key]);
}
else {
Object.assign(target, (_b = {}, _b[key] = source[key], _b));
}
}
}
return this.mergeDeep.apply(this, tslib_1.__spread([target], sources));
};
NgxNeoModalService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NgxNeoModalService.ctorParameters = function () { return [
{ type: NgbModal }
]; };
return NgxNeoModalService;
}());
export { NgxNeoModalService };
if (false) {
/** @type {?} */
NgxNeoModalService.prototype.template;
/** @type {?} */
NgxNeoModalService.prototype.originalAlert;
/**
* @type {?}
* @private
*/
NgxNeoModalService.prototype.modalService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW5lby1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tbW9kYWwvIiwic291cmNlcyI6WyJsaWIvbmd4LW5lby1tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFlLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RDtJQU1FLDRCQUFvQixZQUFzQjtRQUExQyxpQkFLQztRQUxtQixpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEMsTUFBTSxDQUFDLEtBQUs7Ozs7UUFBRyxVQUFPLEdBQUc7Ozs0QkFDdkIscUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQTs7d0JBQXJCLFNBQXFCLENBQUM7Ozs7YUFDdkIsQ0FBQSxDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBRWEsc0NBQVM7Ozs7O0lBQXZCLFVBQXdCLE1BQVc7Ozs7Ozt3QkFDM0IsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFOzRCQUM1RCxRQUFRLEVBQUUsUUFBUTs0QkFDbEIsUUFBUSxFQUFFLEtBQUs7NEJBQ2YsUUFBUSxFQUFFLElBQUk7NEJBQ2QsV0FBVyxFQUFFLFdBQVc7eUJBQ3pCLENBQUM7d0JBRUYsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUNoRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsU0FBUyxD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QUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFlBQUksR0FBQyxHQUFHLElBQUcsRUFBRSxNQUFHLENBQUM7cUJBQUU7b0JBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMxQztxQkFBTTtvQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBSSxHQUFDLEdBQUcsSUFBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQUcsQ0FBQztpQkFDL0M7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxPQUFkLElBQUksb0JBQVcsTUFBTSxHQUFLLE9BQU8sR0FBRTtJQUM1QyxDQUFDOztnQkE5U0YsVUFBVTs7OztnQkFGRixRQUFROztJQW1UakIseUJBQUM7Q0FBQSxBQWpURCxJQWlUQztTQWhUWSxrQkFBa0I7OztJQUM3QixzQ0FBYzs7SUFFZCwyQ0FBMEI7Ozs7O0lBRWQsMENBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4TmVvTW9kYWxDb21wb25lbnQsIEFsZXJ0UmVzdWx0LCBBbGVydEJ1dHRvbiB9IGZyb20gJy4vbmd4LW5lby1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hOZW9Nb2RhbFNlcnZpY2Uge1xuICB0ZW1wbGF0ZTogYW55O1xuXG4gIHB1YmxpYyBvcmlnaW5hbEFsZXJ0OiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XG4gICAgdGhpcy5vcmlnaW5hbEFsZXJ0ID0gd2luZG93LmFsZXJ0O1xuICAgIHdpbmRvdy5hbGVydCA9IGFzeW5jIChtc2cpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWxlcnQobXNnKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kYWwoY29uZmlnOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihOZ3hOZW9Nb2RhbENvbXBvbmVudCwge1xuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICB3aW5kb3dDbGFzczogJ25lb1dpbmRvdydcbiAgICB9KTtcblxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbmZpZyA9ICh0aGlzLm1lcmdlRGVlcChtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maWcsIGNvbmZpZykpO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNoYW5nZVJlZi5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHJldHVybiBhd2FpdCBtb2RhbFJlZi5yZXN1bHQ7XG4gIH1cblxuXG4gIC8qKlxuICAqIFNob3cgbWVzc2FnZS4gQ2FuIGJlIHVzZSBhcyB3aW5kb3cuYWxlcnRcbiAgKi9cbiAgcHVibGljIGFzeW5jIGFsZXJ0KG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBtc2csXG4gICAgICBidXR0b246IHtcbiAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogU2hvdyBzdWNjc2Vzc2Z1bGwgIG1lc3NhZ2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWNjZXNzKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSB0cnVlKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6ICfCoUJ1ZW4gdHJhYmFqbyEnXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAqXG4gICogV2FybmluZyBtZXNzYWdlXG4gICovXG4gIHB1YmxpYyBhc3luYyB3YXJuaW5nKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSBmYWxzZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwqFDdWlkYWRvISdcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBtc2csXG4gICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICBidXR0b246IHtcbiAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAqXG4gKiBFcnJvciBtZXNzYWdlXG4gKi9cbiAgcHVibGljIGFzeW5jIGVycm9yKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSB0cnVlKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6ICfCoUVycm9yISdcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBtc2csXG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBJbmZvcm1hdGlvbiBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5mbyhtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gdHJ1ZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwqFJbmZvcm1hY2nDs24gaW1wb3J0YW50ZSEnXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTaG93IGRlY2lzc2lvbiBtb2RhbCB3aXRoIHF1ZXN0aW9uIGFuZCB0d28gb3B0aW9ucyBmb3IgYWNjZXB0IG9yIHJlamVjdC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgcHVibGljIGFzeW5jIGRlY2lzaW9uKHF1ZXN0aW9uTXNnOiBzdHJpbmcsIHN1Y2Nlc3NNc2c/OiBzdHJpbmcsIGNhbmNlbE1zZz86IHN0cmluZywgYXV0b2ZvY3VzID0gQWxlcnRCdXR0b24uQ2FuY2VsKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGJ1dHRvbkFjY2VwdEZvY3VzID0gYXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5BY2NlcHQ7XG4gICAgY29uc3QgYnV0dG9uQ2FuY2VsRm9jdXMgPSBhdXRvZm9jdXMgPT09IEFsZXJ0QnV0dG9uLkNhbmNlbDtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6ICfCv0VzdMOhIHNlZ3Vybz8nXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogcXVlc3Rpb25Nc2csXG4gICAgICB0eXBlOiAncXVlc3Rpb24nLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25BY2NlcHRGb2N1c1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpXG4gICAgICAudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLkJ1dHRvblJlc3BvbnNlID09PSBBbGVydEJ1dHRvbi5BY2NlcHQpIHtcbiAgICAgICAgICBpZiAoc3VjY2Vzc01zZyAmJiBzdWNjZXNzTXNnICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzKHN1Y2Nlc3NNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2FuY2VsTXNnKSB7XG4gICAgICAgICAgICB0aGlzLmluZm8oY2FuY2VsTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIElucHV0IHRleHQgbWVzc2FnZVxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICBwdWJsaWMgYXN5bmMgaW5wdXQodGl0bGU6IHN0cmluZywgcGxhY2Vob2xkZXI6IHN0cmluZywgc3VjY2Vzc01zZz86IHN0cmluZywgYXV0b2ZvY3VzID0gdHJ1ZSwgYnV0dG9uQXV0b2ZvY3VzOiBBbGVydEJ1dHRvbiA9IEFsZXJ0QnV0dG9uLkFjY2VwdCk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBidXR0b25BY2NlcHRGb2N1cyA9IGJ1dHRvbkF1dG9mb2N1cyA9PT0gQWxlcnRCdXR0b24uQWNjZXB0O1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzID0gYnV0dG9uQXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5DYW5jZWw7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiB0aXRsZVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgaW5wdXQ6IHtcbiAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgIHZpc2liaWxpdHk6IHRydWUsXG4gICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzXG4gICAgICB9LFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGFjY2VwY3Q6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkFjY2VwdEZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKVxuICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5CdXR0b25SZXNwb25zZSA9PT0gQWxlcnRCdXR0b24uQWNjZXB0KSB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3NNc2cpIHtcbiAgICAgICAgICAgIHRoaXMuc3VjY2VzcyhzdWNjZXNzTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcblxuXG5cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcbiAgcHVibGljIGFzeW5jIHllc05vQ2FuY2VsKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgYnV0dG9uRm9jdXM6IEFsZXJ0QnV0dG9uKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tKHRpdGxlLCBtZXNzYWdlLCAoQWxlcnRCdXR0b24uWWVzIHwgQWxlcnRCdXR0b24uTm8gfCBBbGVydEJ1dHRvbi5DYW5jZWwpLCBidXR0b25Gb2N1cyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGN1c3RvbSh0aXRsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGJ1dHRvbnM6IEFsZXJ0QnV0dG9uLCBidXR0b25Gb2N1czogQWxlcnRCdXR0b24pOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgYnV0dG9uQWNjZXB0OiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5BY2NlcHQpID4gMDtcbiAgICBjb25zdCBidXR0b25ZZXM6IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLlllcykgPiAwO1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbDogYm9vbGVhbiA9IChidXR0b25zICYgQWxlcnRCdXR0b24uQ2FuY2VsKSA+IDA7XG4gICAgY29uc3QgYnV0dG9uTm86IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLk5vKSA+IDA7XG4gICAgY29uc3QgYnV0dG9uUmV0cnk6IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLlJldHJ5KSA+IDA7XG5cbiAgICBjb25zdCBidXR0b25BY2NlcHRGb2N1czogYm9vbGVhbiA9IGJ1dHRvbkZvY3VzID09PSBBbGVydEJ1dHRvbi5BY2NlcHQ7XG4gICAgY29uc3QgYnV0dG9uWWVzRm9jdXM6IGJvb2xlYW4gPSBidXR0b25Gb2N1cyA9PT0gQWxlcnRCdXR0b24uWWVzO1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLkNhbmNlbDtcbiAgICBjb25zdCBidXR0b25Ob0ZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLk5vO1xuICAgIGNvbnN0IGJ1dHRvblJldHJ5Rm9jdXM6IGJvb2xlYW4gPSBidXR0b25Gb2N1cyA9PT0gQWxlcnRCdXR0b24uUmV0cnk7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiB0aXRsZVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBidXR0b246IHtcbiAgICAgICAgeWVzOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uWWVzLFxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uWWVzRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgbm86IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBidXR0b25ObyxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbk5vRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgcmV0cnk6IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBidXR0b25SZXRyeSxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvblJldHJ5Rm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uQ2FuY2VsLFxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uQWNjZXB0LFxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQWNjZXB0Rm9jdXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cblxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpO1xuICB9XG5cblxuXG4gIHByaXZhdGUgaXNPYmplY3QoaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpO1xuICB9XG5cbiAgLy8gdGhpcyB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgcHJpdmF0ZSBtZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKTogYW55IHtcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7IHJldHVybiB0YXJnZXQ7IH1cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG5cbiAgICBpZiAodGhpcy5pc09iamVjdCh0YXJnZXQpICYmIHRoaXMuaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuICAgICAgICAgIGlmICghdGFyZ2V0W2tleV0pIHsgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pOyB9XG4gICAgICAgICAgdGhpcy5tZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbiAgfVxuXG5cbn1cbiJdfQ==