UNPKG

ngx-mat-lib

Version:

A bunch of utilities and components to use in your Angular 7+ apps!

286 lines (285 loc) 33.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Injectable } from "@angular/core"; import { HttpResponse, HttpEventType } from "@angular/common/http"; import { XmatLib, XmatRestVerbs } from "../models/index"; import { XmatConstantsService } from "./xmat-constants.service"; import { XmatMocksListService } from "./xmat-mocks-list.service"; import { tap, switchMap } from "rxjs/operators"; import { Observable, timer } from "rxjs"; import { each } from "lodash"; var XmatMockService = /** @class */ (function () { function XmatMockService(_xmatConstants, _xmatMocksList) { var _this = this; this._xmatConstants = _xmatConstants; this._xmatMocksList = _xmatMocksList; this._defaultResponseBody = { data: void 0, message: "forbidden" }; this._fileEndings = this._xmatConstants.mocksEndings; this._mocks = {}; this._ds = this._xmatConstants.ds; this._fileNameSpace = this._xmatConstants.fileNameSpace; this._mocksBaseUrl = this._xmatConstants.mocksBaseUrl; this._paramsPlaceholder = this._xmatConstants.paramsPlaceholder; this._qm = "?"; this._queryUrlParam = this._xmatConstants.queryUrlParam; this._restBaseUrl = this._xmatConstants.restBaseUrl; // Override these from extended class this._defaultMockDelay = 2500; this._logEnabled = true; /** @type {?} */ var mocks = this._xmatMocksList.get(); each(mocks, function (mock) { _this._pushMockHandler(mock); }); } // Here the magic happens /** * @param {?} request * @param {?} next * @return {?} */ XmatMockService.prototype.intercept = /** * @param {?} request * @param {?} next * @return {?} */ function (request, next) { if (!!XmatLib.restTimes[request.url]) { /** @type {?} */ var startTime = XmatLib.restTimes[request.url]; /** @type {?} */ var finalTime = Date.now(); if (this._logEnabled) { console.info("XmatMock: interceptor fired after " + (finalTime - startTime) + " ms"); XmatLib.restTimes[request.url] = startTime; } } /** @type {?} */ var urlParts = request.url.split(this._qm); /** @type {?} */ var mockKey = request.method + urlParts[0]; // Checks for non parametric URL if (this._mockExists(mockKey)) { this._logEnabled && console.info("XmatMock: found mock with key " + mockKey); return this._mocks[mockKey](request, next, [], urlParts[1]); } /** @type {?} */ var urlParams = this._extractUrlParams(urlParts[0]); if (Array.isArray(urlParams)) { /** @type {?} */ var serviceName = urlParts[0].substr(this._restBaseUrl.length).split(this._ds).shift(); /** @type {?} */ var serviceBase = request.method + this._restBaseUrl + serviceName; /** @type {?} */ var j = urlParams.length; while (--j >= 0) { /** @type {?} */ var paramsBak = urlParams.slice(); paramsBak[j] = this._paramsPlaceholder; /** @type {?} */ var mixedKey = [serviceBase].concat(paramsBak).join(this._ds); if (this._mockExists(mixedKey)) { this._logEnabled && console.info("XmatMock: found mock with key " + mixedKey); return this._mocks[mixedKey](request, next, urlParams.slice(j), urlParts[1]); } /** @type {?} */ var k = j; while (--k >= 0) { /** @type {?} */ var paramsBakBak = paramsBak.slice(); paramsBakBak[k] = this._paramsPlaceholder; mixedKey = [serviceBase].concat(paramsBakBak).join(this._ds); if (this._mockExists(mixedKey)) { this._logEnabled && console.info("XmatMock: found mock with key " + mixedKey); return this._mocks[mixedKey](request, next, urlParams.slice(k), urlParts[1]); } } } } return next.handle(request); }; // Private methods /** * @param {?} serviceUrl * @return {?} */ XmatMockService.prototype._extractUrlParams = /** * @param {?} serviceUrl * @return {?} */ function (serviceUrl) { /** * * E.G. serviceUrl = "/rest/cd/property-store/5/id"; * cleanUrl = "property-store/5/id" * urlParamsList = [ * "property-store", * "5", * "id" * ] @type {?} */ var cleanUrl = serviceUrl.replace(this._restBaseUrl, ""); /** @type {?} */ var urlParamsList = cleanUrl.split(this._ds); urlParamsList.shift(); // If true it means there was at least one param if (urlParamsList.length > 0) { return urlParamsList; } return void 0; }; /** * @param {?} mockKey * @return {?} */ XmatMockService.prototype._mockExists = /** * @param {?} mockKey * @return {?} */ function (mockKey) { return !!this._mocks[mockKey] && typeof this._mocks[mockKey] === typeof this._xmatConstants.noop; }; /** * @param {?} serviceUrl * @param {?} methodKey * @param {?=} fileSuffix * @param {?=} status * @return {?} */ XmatMockService.prototype._generateJsonUrl = /** * @param {?} serviceUrl * @param {?} methodKey * @param {?=} fileSuffix * @param {?=} status * @return {?} */ function (serviceUrl, methodKey, fileSuffix, status) { if (fileSuffix === void 0) { fileSuffix = ""; } if (status === void 0) { status = this._fileEndings.ok; } /** @type {?} */ var serviceKey = serviceUrl.substr(this._restBaseUrl.length).split(this._ds + this._paramsPlaceholder)[0]; /** @type {?} */ var serviceFolder = serviceKey.split(this._ds)[0]; /** @type {?} */ var fileName = serviceKey.split(this._ds).join(this._fileNameSpace); return this._mocksBaseUrl + serviceFolder + this._ds + methodKey + fileName + fileSuffix + status; }; /** * @param {?} mock * @return {?} */ XmatMockService.prototype._pushMockHandler = /** * @param {?} mock * @return {?} */ function (mock) { var _this = this; /** * TODO: Possible evolution: custom callback in mock object */ !!mock.status || (mock.status = 200); !!mock.body || (mock.body = this._defaultResponseBody); /** @type {?} */ var mockKey = mock.method + mock.url; this._mocks[mockKey] = function (request, next, params, queryString) { if (params === void 0) { params = []; } if (mock.status !== 200) { return new Observable(function (observer) { /** @type {?} */ var customResponse = new HttpResponse({ status: mock.status, body: mock.body }); observer.error(customResponse); observer.complete(); }); } /** @type {?} */ var mockRequest; if (!!mock.customUrl) { if (_this._logEnabled) { console.info("XmatMock: calling " + mock.customUrl); } /** @type {?} */ var url = mock.customUrl.replace(_this._paramsPlaceholder, params.join(_this._ds)); mockRequest = request.clone({ url: url + (!!queryString ? _this._qm + queryString : ""), method: mock.customMethod ? mock.customMethod : url.indexOf(".json") >= 0 ? XmatRestVerbs.GET : request.method }); } else { /** @type {?} */ var fileNameSuffix_1 = ""; each(params, function (param) { fileNameSuffix_1 += _this._fileNameSpace + param; }); /** @type {?} */ var ending = mock.result === false ? _this._fileEndings.ko : _this._fileEndings.ok; /** @type {?} */ var methodKey = XmatRestVerbs[request.method] + "-"; /** @type {?} */ var url = _this._generateJsonUrl(mock.url, methodKey, fileNameSuffix_1, ending); /** @type {?} */ var queriedUrl = _this._generateJsonUrl(mock.url, methodKey, _this._fileNameSpace + _this._queryUrlParam, ending); mockRequest = request.clone({ url: request.urlWithParams.indexOf(_this._queryUrlParam) > 0 ? queriedUrl : url, method: XmatRestVerbs.GET }); } if (_this._logEnabled) { console.info("XmatMock: calling " + mockRequest.url); } typeof mock.timeout === typeof 0 && mock.timeout >= 0 || (mock.timeout = _this._defaultMockDelay); /** @type {?} */ var delay = timer(mock.timeout); /** @type {?} */ var start = XmatLib.restTimes[request.url] || Date.now(); return delay.pipe(switchMap(function () { return next.handle(mockRequest); }), tap(function (event) { if (event.type === HttpEventType.Response) { /** @type {?} */ var elapsed = Date.now() - start; !!_this._logEnabled && console.log("XmatMock: request for mocked " + request.urlWithParams + " took " + elapsed + " ms."); } })); }; }; XmatMockService.decorators = [ { type: Injectable } ]; /** @nocollapse */ XmatMockService.ctorParameters = function () { return [ { type: XmatConstantsService }, { type: XmatMocksListService } ]; }; return XmatMockService; }()); export { XmatMockService }; if (false) { /** @type {?} */ XmatMockService.prototype._defaultResponseBody; /** @type {?} */ XmatMockService.prototype._fileEndings; /** @type {?} */ XmatMockService.prototype._mocks; /** @type {?} */ XmatMockService.prototype._ds; /** @type {?} */ XmatMockService.prototype._fileNameSpace; /** @type {?} */ XmatMockService.prototype._mocksBaseUrl; /** @type {?} */ XmatMockService.prototype._paramsPlaceholder; /** @type {?} */ XmatMockService.prototype._qm; /** @type {?} */ XmatMockService.prototype._queryUrlParam; /** @type {?} */ XmatMockService.prototype._restBaseUrl; /** @type {?} */ XmatMockService.prototype._defaultMockDelay; /** @type {?} */ XmatMockService.prototype._logEnabled; /** @type {?} */ XmatMockService.prototype._xmatConstants; /** @type {?} */ XmatMockService.prototype._xmatMocksList; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1tb2NrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0LWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy94bWF0LW1vY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBS0gsWUFBWSxFQUNaLGFBQWEsRUFDaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBRUgsT0FBTyxFQUdQLGFBQWEsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsR0FBRyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7O0lBcUJ4Qix5QkFBc0IsY0FBb0MsRUFDcEMsY0FBb0M7UUFEMUQsaUJBT0M7UUFQcUIsbUJBQWMsR0FBZCxjQUFjLENBQXNCO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjtRQWpCMUQsNEJBQW9ELEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUMsQ0FBQztRQUN6RixvQkFBeUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFDMUQsY0FBdUMsRUFBRSxDQUFDO1FBRTFDLFdBQXlCLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ2hELHNCQUFvQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUN0RSxxQkFBMkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7UUFD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LENBQUMsUUFBUSxFQUFFOztvQkFDdkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQztvQkFDbkMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBZ0MsT0FBTyxDQUFDLGFBQWEsY0FBUyxPQUFPLFNBQU0sQ0FBQyxDQUFDO2lCQUNsSDthQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ1gsQ0FBQztLQUNMOztnQkF0S0osVUFBVTs7OztnQkFQSCxvQkFBb0I7Z0JBQ3BCLG9CQUFvQjs7MEJBbEI1Qjs7U0F5QmEsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBJbnRlcmNlcHRvcixcbiAgICBIdHRwSGFuZGxlcixcbiAgICBIdHRwUmVxdWVzdCxcbiAgICBIdHRwUmVzcG9uc2UsXG4gICAgSHR0cEV2ZW50VHlwZVxufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbi8vXG5pbXBvcnQge1xuICAgIFhtYXRHZW5lcmljT2JqZWN0LFxuICAgIFhtYXRMaWIsXG4gICAgWG1hdE1vY2ssXG4gICAgWG1hdE1vY2tzQ2FsbGJhY2tzLFxuICAgIFhtYXRSZXN0VmVyYnNcbn0gZnJvbSBcIi4uL21vZGVscy9pbmRleFwiO1xuaW1wb3J0IHtYbWF0Q29uc3RhbnRzU2VydmljZX0gZnJvbSBcIi4veG1hdC1jb25zdGFudHMuc2VydmljZVwiO1xuaW1wb3J0IHtYbWF0TW9ja3NMaXN0U2VydmljZX0gZnJvbSBcIi4veG1hdC1tb2Nrcy1saXN0LnNlcnZpY2VcIjtcbi8vXG5pbXBvcnQge3RhcCwgc3dpdGNoTWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7T2JzZXJ2YWJsZSwgdGltZXJ9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge2VhY2h9IGZyb20gXCJsb2Rhc2hcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFhtYXRNb2NrU2VydmljZSBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG5cbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRSZXNwb25zZUJvZHk6IFhtYXRHZW5lcmljT2JqZWN0ID0ge2RhdGE6IHZvaWQgMCwgbWVzc2FnZTogXCJmb3JiaWRkZW5cIn07XG4gICAgcHJvdGVjdGVkIF9maWxlRW5kaW5ncyA9IHRoaXMuX3htYXRDb25zdGFudHMubW9ja3NFbmRpbmdzO1xuICAgIHByb3RlY3RlZCBfbW9ja3M6IFhtYXRNb2Nrc0NhbGxiYWNrcyA9IHt9O1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kcyA9IHRoaXMuX3htYXRDb25zdGFudHMuZHM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9maWxlTmFtZVNwYWNlID0gdGhpcy5feG1hdENvbnN0YW50cy5maWxlTmFtZVNwYWNlO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9ja3NCYXNlVXJsOiBzdHJpbmcgPSB0aGlzLl94bWF0Q29uc3RhbnRzLm1vY2tzQmFzZVVybDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3BhcmFtc1BsYWNlaG9sZGVyID0gdGhpcy5feG1hdENvbnN0YW50cy5wYXJhbXNQbGFjZWhvbGRlcjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3FtOiBzdHJpbmcgPSBcIj9cIjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3F1ZXJ5VXJsUGFyYW0gPSB0aGlzLl94bWF0Q29uc3RhbnRzLnF1ZXJ5VXJsUGFyYW07XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZXN0QmFzZVVybDogc3RyaW5nID0gdGhpcy5feG1hdENvbnN0YW50cy5yZXN0QmFzZVVybDtcblxuICAgIC8vIE92ZXJyaWRlIHRoZXNlIGZyb20gZXh0ZW5kZWQgY2xhc3NcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRNb2NrRGVsYXk6IG51bWJlciA9IDI1MDA7XG4gICAgcHJvdGVjdGVkIF9sb2dFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfeG1hdENvbnN0YW50czogWG1hdENvbnN0YW50c1NlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF94bWF0TW9ja3NMaXN0OiBYbWF0TW9ja3NMaXN0U2VydmljZSkge1xuXG4gICAgICAgIGNvbnN0IG1vY2tzID0gdGhpcy5feG1hdE1vY2tzTGlzdC5nZXQoKTtcbiAgICAgICAgZWFjaChtb2NrcywgKG1vY2spID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3B1c2hNb2NrSGFuZGxlcihtb2NrKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGVyZSB0aGUgbWFnaWMgaGFwcGVuc1xuICAgIGludGVyY2VwdChyZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICAgICAgaWYgKCEhWG1hdExpYi5yZXN0VGltZXNbcmVxdWVzdC51cmxdKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBYbWF0TGliLnJlc3RUaW1lc1tyZXF1ZXN0LnVybF07XG4gICAgICAgICAgICBjb25zdCBmaW5hbFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oYFhtYXRNb2NrOiBpbnRlcmNlcHRvciBmaXJlZCBhZnRlciAkeyhmaW5hbFRpbWUgLSBzdGFydFRpbWUpfSBtc2ApO1xuICAgICAgICAgICAgICAgIFhtYXRMaWIucmVzdFRpbWVzW3JlcXVlc3QudXJsXSA9IHN0YXJ0VGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTZXBhcmF0ZSBxdWVyeSBzdHJpbmcgZnJvbSB0aGUgcmVzdFxuICAgICAgICBjb25zdCB1cmxQYXJ0cyA9IHJlcXVlc3QudXJsLnNwbGl0KHRoaXMuX3FtKTtcbiAgICAgICAgY29uc3QgbW9ja0tleSA9IHJlcXVlc3QubWV0aG9kICsgdXJsUGFydHNbMF07XG5cbiAgICAgICAgLy8gQ2hlY2tzIGZvciBub24gcGFyYW1ldHJpYyBVUkxcbiAgICAgICAgaWYgKHRoaXMuX21vY2tFeGlzdHMobW9ja0tleSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ0VuYWJsZWQgJiYgY29uc29sZS5pbmZvKGBYbWF0TW9jazogZm91bmQgbW9jayB3aXRoIGtleSAke21vY2tLZXl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2Nrc1ttb2NrS2V5XShyZXF1ZXN0LCBuZXh0LCBbXSwgdXJsUGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuX2V4dHJhY3RVcmxQYXJhbXModXJsUGFydHNbMF0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cmxQYXJhbXMpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHVybFBhcnRzWzBdLnN1YnN0cih0aGlzLl9yZXN0QmFzZVVybC5sZW5ndGgpLnNwbGl0KHRoaXMuX2RzKS5zaGlmdCgpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZUJhc2UgPSByZXF1ZXN0Lm1ldGhvZCArIHRoaXMuX3Jlc3RCYXNlVXJsICsgc2VydmljZU5hbWU7XG4gICAgICAgICAgICBsZXQgaiA9IHVybFBhcmFtcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoLS1qID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXNCYWsgPSB1cmxQYXJhbXMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBwYXJhbXNCYWtbal0gPSB0aGlzLl9wYXJhbXNQbGFjZWhvbGRlcjtcbiAgICAgICAgICAgICAgICBsZXQgbWl4ZWRLZXkgPSBbc2VydmljZUJhc2VdLmNvbmNhdChwYXJhbXNCYWspLmpvaW4odGhpcy5fZHMpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2NrRXhpc3RzKG1peGVkS2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dFbmFibGVkICYmIGNvbnNvbGUuaW5mbyhgWG1hdE1vY2s6IGZvdW5kIG1vY2sgd2l0aCBrZXkgJHttaXhlZEtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vY2tzW21peGVkS2V5XShyZXF1ZXN0LCBuZXh0LCB1cmxQYXJhbXMuc2xpY2UoaiksIHVybFBhcnRzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGsgPSBqO1xuICAgICAgICAgICAgICAgIHdoaWxlICgtLWsgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXNCYWtCYWsgPSBwYXJhbXNCYWsuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zQmFrQmFrW2tdID0gdGhpcy5fcGFyYW1zUGxhY2Vob2xkZXI7XG4gICAgICAgICAgICAgICAgICAgIG1peGVkS2V5ID0gW3NlcnZpY2VCYXNlXS5jb25jYXQocGFyYW1zQmFrQmFrKS5qb2luKHRoaXMuX2RzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vY2tFeGlzdHMobWl4ZWRLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dFbmFibGVkICYmIGNvbnNvbGUuaW5mbyhgWG1hdE1vY2s6IGZvdW5kIG1vY2sgd2l0aCBrZXkgJHttaXhlZEtleX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2Nrc1ttaXhlZEtleV0ocmVxdWVzdCwgbmV4dCwgdXJsUGFyYW1zLnNsaWNlKGspLCB1cmxQYXJ0c1sxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCk7XG5cbiAgICB9XG5cbiAgICAvLyBQcml2YXRlIG1ldGhvZHNcbiAgICBwcm90ZWN0ZWQgX2V4dHJhY3RVcmxQYXJhbXMoc2VydmljZVVybDogc3RyaW5nKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFLkcuIHNlcnZpY2VVcmwgPSBcIi9yZXN0L2NkL3Byb3BlcnR5LXN0b3JlLzUvaWRcIjtcbiAgICAgICAgICogY2xlYW5VcmwgPSBcInByb3BlcnR5LXN0b3JlLzUvaWRcIlxuICAgICAgICAgKiB1cmxQYXJhbXNMaXN0ID0gW1xuICAgICAgICAgKiAgICAgIFwicHJvcGVydHktc3RvcmVcIixcbiAgICAgICAgICogICAgICBcIjVcIixcbiAgICAgICAgICogICAgICBcImlkXCJcbiAgICAgICAgICogXVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgY2xlYW5VcmwgPSBzZXJ2aWNlVXJsLnJlcGxhY2UodGhpcy5fcmVzdEJhc2VVcmwsIFwiXCIpO1xuICAgICAgICBjb25zdCB1cmxQYXJhbXNMaXN0ID0gY2xlYW5Vcmwuc3BsaXQodGhpcy5fZHMpO1xuICAgICAgICB1cmxQYXJhbXNMaXN0LnNoaWZ0KCk7XG4gICAgICAgIC8vIElmIHRydWUgaXQgbWVhbnMgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSBwYXJhbVxuICAgICAgICBpZiAodXJsUGFyYW1zTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsUGFyYW1zTGlzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfbW9ja0V4aXN0cyhtb2NrS2V5KSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX21vY2tzW21vY2tLZXldICYmIHR5cGVvZiB0aGlzLl9tb2Nrc1ttb2NrS2V5XSA9PT0gdHlwZW9mIHRoaXMuX3htYXRDb25zdGFudHMubm9vcDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2dlbmVyYXRlSnNvblVybChzZXJ2aWNlVXJsOiBzdHJpbmcsIG1ldGhvZEtleTogc3RyaW5nLCBmaWxlU3VmZml4OiBzdHJpbmcgPSBcIlwiLCBzdGF0dXM6IHN0cmluZyA9IHRoaXMuX2ZpbGVFbmRpbmdzLm9rKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VLZXkgPSBzZXJ2aWNlVXJsLnN1YnN0cih0aGlzLl9yZXN0QmFzZVVybC5sZW5ndGgpLnNwbGl0KHRoaXMuX2RzICsgdGhpcy5fcGFyYW1zUGxhY2Vob2xkZXIpWzBdO1xuICAgICAgICBjb25zdCBzZXJ2aWNlRm9sZGVyID0gc2VydmljZUtleS5zcGxpdCh0aGlzLl9kcylbMF07XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gc2VydmljZUtleS5zcGxpdCh0aGlzLl9kcykuam9pbih0aGlzLl9maWxlTmFtZVNwYWNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vY2tzQmFzZVVybCArIHNlcnZpY2VGb2xkZXIgKyB0aGlzLl9kcyArIG1ldGhvZEtleSArIGZpbGVOYW1lICsgZmlsZVN1ZmZpeCArIHN0YXR1cztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3B1c2hNb2NrSGFuZGxlcihtb2NrOiBYbWF0TW9jaykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVE9ETzogUG9zc2libGUgZXZvbHV0aW9uOiBjdXN0b20gY2FsbGJhY2sgaW4gbW9jayBvYmplY3RcbiAgICAgICAgICovXG4gICAgICAgICEhbW9jay5zdGF0dXMgfHwgKG1vY2suc3RhdHVzID0gMjAwKTtcbiAgICAgICAgISFtb2NrLmJvZHkgfHwgKG1vY2suYm9keSA9IHRoaXMuX2RlZmF1bHRSZXNwb25zZUJvZHkpO1xuICAgICAgICBjb25zdCBtb2NrS2V5ID0gbW9jay5tZXRob2QgKyBtb2NrLnVybDtcbiAgICAgICAgdGhpcy5fbW9ja3NbbW9ja0tleV0gPSAocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIsIHBhcmFtczogc3RyaW5nW10gPSBbXSwgcXVlcnlTdHJpbmc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgICAgICAgICAgaWYgKG1vY2suc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21SZXNwb25zZSA9IG5ldyBIdHRwUmVzcG9uc2Uoe3N0YXR1czogbW9jay5zdGF0dXMsIGJvZHk6IG1vY2suYm9keX0pO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihjdXN0b21SZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb2NrUmVxdWVzdDtcbiAgICAgICAgICAgIGlmICghIW1vY2suY3VzdG9tVXJsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGBYbWF0TW9jazogY2FsbGluZyAke21vY2suY3VzdG9tVXJsfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiBwYXJhbXMgcGxhY2Vob2xkZXIgaXMgaW4gY3VzdG9tIFVSTCwgcGFyYW1zIGFyZSBjb25jYXQgdG8gdXJsIHdpdGggc2xhc2hlc1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG1vY2suY3VzdG9tVXJsLnJlcGxhY2UodGhpcy5fcGFyYW1zUGxhY2Vob2xkZXIsIHBhcmFtcy5qb2luKHRoaXMuX2RzKSk7XG4gICAgICAgICAgICAgICAgbW9ja1JlcXVlc3QgPSByZXF1ZXN0LmNsb25lKHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwgKyAoISFxdWVyeVN0cmluZyA/IHRoaXMuX3FtICsgcXVlcnlTdHJpbmcgOiBcIlwiKSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBtb2NrLmN1c3RvbU1ldGhvZCA/IG1vY2suY3VzdG9tTWV0aG9kIDogdXJsLmluZGV4T2YoXCIuanNvblwiKSA+PSAwID8gWG1hdFJlc3RWZXJicy5HRVQgOiByZXF1ZXN0Lm1ldGhvZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lU3VmZml4ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBlYWNoKHBhcmFtcywgKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lU3VmZml4ICs9IHRoaXMuX2ZpbGVOYW1lU3BhY2UgKyBwYXJhbTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRpbmcgPSBtb2NrLnJlc3VsdCA9PT0gZmFsc2UgPyB0aGlzLl9maWxlRW5kaW5ncy5rbyA6IHRoaXMuX2ZpbGVFbmRpbmdzLm9rO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZEtleSA9IGAke1htYXRSZXN0VmVyYnNbcmVxdWVzdC5tZXRob2RdfS1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX2dlbmVyYXRlSnNvblVybChtb2NrLnVybCwgbWV0aG9kS2V5LCBmaWxlTmFtZVN1ZmZpeCwgZW5kaW5nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBxdWVyaWVkVXJsID0gdGhpcy5fZ2VuZXJhdGVKc29uVXJsKG1vY2sudXJsLCBtZXRob2RLZXksIHRoaXMuX2ZpbGVOYW1lU3BhY2UgKyB0aGlzLl9xdWVyeVVybFBhcmFtLCBlbmRpbmcpO1xuICAgICAgICAgICAgICAgIG1vY2tSZXF1ZXN0ID0gcmVxdWVzdC5jbG9uZSh7XG4gICAgICAgICAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmxXaXRoUGFyYW1zLmluZGV4T2YodGhpcy5fcXVlcnlVcmxQYXJhbSkgPiAwID8gcXVlcmllZFVybCA6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBYbWF0UmVzdFZlcmJzLkdFVFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oYFhtYXRNb2NrOiBjYWxsaW5nICR7bW9ja1JlcXVlc3QudXJsfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZW9mIG1vY2sudGltZW91dCA9PT0gdHlwZW9mIDAgJiYgbW9jay50aW1lb3V0ID49IDAgfHwgKG1vY2sudGltZW91dCA9IHRoaXMuX2RlZmF1bHRNb2NrRGVsYXkpO1xuICAgICAgICAgICAgY29uc3QgZGVsYXkgPSB0aW1lcihtb2NrLnRpbWVvdXQpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBYbWF0TGliLnJlc3RUaW1lc1tyZXF1ZXN0LnVybF0gfHwgRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHJldHVybiBkZWxheS5waXBlKHN3aXRjaE1hcCgoKSA9PiBuZXh0LmhhbmRsZShtb2NrUmVxdWVzdCkpLFxuICAgICAgICAgICAgICAgIHRhcCgoZXZlbnQ6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gRGF0ZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgISF0aGlzLl9sb2dFbmFibGVkICYmIGNvbnNvbGUubG9nKGBYbWF0TW9jazogcmVxdWVzdCBmb3IgbW9ja2VkICR7cmVxdWVzdC51cmxXaXRoUGFyYW1zfSB0b29rICR7ZWxhcHNlZH0gbXMuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuIl19