ngx-mat-lib
Version:
A bunch of utilities and components to use in your Angular 7+ apps!
222 lines (221 loc) • 24.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Injectable } from "@angular/core";
import { HttpClient, HttpParams } from "@angular/common/http";
import { XmatConstantsService } from "./xmat-constants.service";
import { XmatResponseTypes, XmatRestVerbs } from "../models/index";
import { Observable, forkJoin } from "rxjs";
import { map } from "rxjs/operators";
import { forEach } from "lodash";
/**
* XMAT REST BY TONY SAMPERI
* extend this file by adding a public "serviceUrls" variable
* and optionally servicesConfigs
*
* CRUD-HTTP MAPPING
* POST Create Crea una nuova risorsa
* GET Read Ottiene una risorsa esistente
* PUT Update Aggiorna una risorsa o ne modifica lo stato
* DELETE Delete Elimina una risorsa
*/
export class XmatRestService {
/**
* @param {?} _http
* @param {?} _xmatConstants
*/
constructor(_http, _xmatConstants) {
this._http = _http;
this._xmatConstants = _xmatConstants;
// Sample data
this.servicesUrls = {};
this.servicesConfigs = {};
this._restBaseUrl = this._xmatConstants.restBaseUrl;
this._ds = this._xmatConstants.ds;
}
/**
* @param {?} file
* @param {?=} verb
* @param {?=} body
* @param {?=} onError
* @return {?}
*/
downloadBlobFromUrl(file, verb = XmatRestVerbs.GET, body, onError) {
/** @type {?} */
let call;
if (verb === XmatRestVerbs.GET) {
call = this.getBlobFromUrl(file, verb);
}
if (verb === XmatRestVerbs.PATCH) {
call = this.getBlobFromUrl(file, verb, body);
}
call.subscribe((results) => {
// IE DOESN'T SUPPORT TRIGGERING SO WE START DOWNLOADING WITH THIS PORKAROUND
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(results, file.fileName);
}
else {
/** @type {?} */
const unsafeUrl = URL.createObjectURL(results);
/** @type {?} */
const linkEl = document.createElement("a");
linkEl.setAttribute("href", unsafeUrl);
linkEl.setAttribute("download", file.fileName);
document.body.appendChild(linkEl);
linkEl.click();
document.body.removeChild(linkEl);
}
}, (err) => {
typeof onError === typeof isNaN && onError(err);
});
}
/**
* @param {?} file
* @param {?=} verb
* @param {?=} body
* @return {?}
*/
getBlobFromUrl(file, verb = XmatRestVerbs.GET, body) {
if (!file || !file.url) {
console.error("XmatRest: invalid XmatFile provided!", file);
return void 0;
}
// Use a default fileName if not set
if (!file.fileName || !file.fileName.length) {
/** @type {?} */
const ext = file.url.substr(file.url.lastIndexOf("."));
file.fileName = `xmat-document${ext}`;
}
if (verb === XmatRestVerbs.GET) {
return this._http.get(file.url, {
responseType: XmatResponseTypes.blob
});
}
if (verb === XmatRestVerbs.PATCH) {
return this._http.patch(file.url, body, {
responseType: XmatResponseTypes.blob
});
}
throw new Error(`XmatRest: invalid verb provided for 'getBlobFromUrl'. Expected GET|PATCH, got ${verb}`);
}
/**
* @param {?} configs
* @return {?}
*/
$all(configs) {
/** @type {?} */
const queue = [];
forEach(configs, (c) => {
queue.push(this.$http(c));
});
return forkJoin(queue);
}
/**
* @template T, U
* @param {?} configs
* @return {?}
*/
$allMap(configs) {
/** @type {?} */
const queue = [];
/** @type {?} */
const queueKeys = [];
forEach(configs, (c, key) => {
queue.push(this.$http(c));
queueKeys.push(key);
});
return forkJoin(queue)
.pipe(map((raw) => {
/** @type {?} */
const mapped = {};
forEach(raw, (value, index) => {
mapped[queueKeys[index]] = value;
});
return mapped;
}));
}
/**
* @template T
* @param {?=} config
* @return {?}
*/
$http(config = this._generateHttpConfig()) {
if (!config.method) {
config.method = XmatRestVerbs.GET;
}
if (!config.url) {
console.error("Error: [$http:badconfig]", config);
return new Observable();
}
switch (config.method) {
case XmatRestVerbs.GET:
/** @type {?} */
let params = config.params || new HttpParams();
/**
* Transform data in query params
*/
if (!!config.data) {
// Accepting 0, null, void 0 as empty params
if (this._xmatConstants.isStrictlyObject(config.data)) {
forEach(Object.keys(config.data), (key) => {
params = params.append(key, config.data[key]);
});
}
else {
console.warn("Error: [XmatRest:badparams]");
}
}
return this._http.get(config.url, { params: params });
case XmatRestVerbs.PATCH:
return this._http.patch(config.url, config.data, { params: config.params });
case XmatRestVerbs.POST:
return this._http.post(config.url, config.data, { params: config.params });
case XmatRestVerbs.DELETE:
return this._http.delete(config.url, { params: config.params });
case XmatRestVerbs.PUT:
return this._http.put(config.url, config.data, { params: config.params });
default:
console.error("Error: [XmatRest:badmethod]", arguments);
return new Observable();
}
}
/**
* @param {?=} method
* @param {?=} url
* @param {?=} queryable
* @return {?}
*/
_generateHttpConfig(method = XmatRestVerbs.GET, url = "", queryable = false) {
url = this._xmatConstants.removeTrailingSlash(url);
return /** @type {?} */ ({
method: method,
url: url,
data: void 0,
queryable: queryable
});
}
}
XmatRestService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
XmatRestService.ctorParameters = () => [
{ type: HttpClient },
{ type: XmatConstantsService }
];
if (false) {
/** @type {?} */
XmatRestService.prototype.servicesUrls;
/** @type {?} */
XmatRestService.prototype.servicesConfigs;
/** @type {?} */
XmatRestService.prototype._restBaseUrl;
/** @type {?} */
XmatRestService.prototype._ds;
/** @type {?} */
XmatRestService.prototype._http;
/** @type {?} */
XmatRestService.prototype._xmatConstants;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1yZXN0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0LWxpYi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy94bWF0LXJlc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFHSCxpQkFBaUIsRUFDakIsYUFBYSxFQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBR3pCLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7QUFlakMsTUFBTSxPQUFPLGVBQWU7Ozs7O0lBNkJ4QixZQUFzQixLQUFpQixFQUN6QixjQUFvQztRQUQ1QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ3pCLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjs7UUEzQmxELG9CQUF3QixFQUt2QixDQUFDO1FBRUYsdUJBQTJCLEVBYzFCLENBQUM7UUFFRixvQkFBeUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDekQsV0FBZ0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7S0FLdEM7Ozs7Ozs7O0lBSUQsbUJBQW1CLENBQ2YsSUFBYyxFQUNkLE9BQWdELGFBQWEsQ0FBQyxHQUFHLEVBQ2pFLElBQWlCLEVBQ2pCLE9BQTRCOztRQUU1QixJQUFJLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxHQUFHLElB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QUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLEtBQUssYUFBYSxDQUFDLEdBQUc7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGO2dCQUNJLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3hELE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztTQUMvQjtLQUNKOzs7Ozs7O0lBRVMsbUJBQW1CLENBQUMsU0FBd0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFjLEVBQUUsRUFBRSxZQUFxQixLQUFLO1FBQ2pILEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELHlCQUFPO1lBQ0gsTUFBTSxFQUFFLE1BQU07WUFDZCxHQUFHLEVBQUUsR0FBRztZQUNSLElBQUksRUFBRSxLQUFLLENBQUM7WUFDWixTQUFTLEVBQUUsU0FBUztTQUNMLEVBQUM7S0FDdkI7OztZQTdLSixVQUFVOzs7O1lBM0JGLFVBQVU7WUFFVixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbi8vXG5pbXBvcnQgeyBYbWF0Q29uc3RhbnRzU2VydmljZSB9IGZyb20gXCIuL3htYXQtY29uc3RhbnRzLnNlcnZpY2VcIjtcbmltcG9ydCB7XG4gICAgWG1hdEZpbGUsXG4gICAgWG1hdEh0dHBDb25maWcsXG4gICAgWG1hdFJlc3BvbnNlVHlwZXMsXG4gICAgWG1hdFJlc3RWZXJic1xufSBmcm9tIFwiLi4vbW9kZWxzL2luZGV4XCI7XG5pbXBvcnQgeyBYbWF0R2VuZXJpY09iamVjdCB9IGZyb20gXCIuLi9tb2RlbHMvaW5kZXhcIjtcbi8vXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGZvckVhY2ggfSBmcm9tIFwibG9kYXNoXCI7XG5cbi8qKlxuICogWE1BVCBSRVNUIEJZIFRPTlkgU0FNUEVSSVxuICogZXh0ZW5kIHRoaXMgZmlsZSBieSBhZGRpbmcgYSBwdWJsaWMgXCJzZXJ2aWNlVXJsc1wiIHZhcmlhYmxlXG4gKiBhbmQgb3B0aW9uYWxseSBzZXJ2aWNlc0NvbmZpZ3NcbiAqXG4gKiBDUlVELUhUVFAgTUFQUElOR1xuICogUE9TVCAgICAgICAgQ3JlYXRlICAgICAgICBDcmVhIHVuYSBudW92YSByaXNvcnNhXG4gKiBHRVQgICAgICAgIFJlYWQgICAgICAgIE90dGllbmUgdW5hIHJpc29yc2EgZXNpc3RlbnRlXG4gKiBQVVQgICAgICAgIFVwZGF0ZSAgICBBZ2dpb3JuYSB1bmEgcmlzb3JzYSBvIG5lIG1vZGlmaWNhIGxvIHN0YXRvXG4gKiBERUxFVEUgICAgRGVsZXRlICAgIEVsaW1pbmEgdW5hIHJpc29yc2FcbiAqL1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgWG1hdFJlc3RTZXJ2aWNlIHtcblxuICAgIC8vIFNhbXBsZSBkYXRhXG4gICAgcmVhZG9ubHkgc2VydmljZXNVcmxzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogIG15U2VydmljZUE6IFwibXktc2VydmljZS1hXCJcbiAgICAgICAgICogIG15U2VydmljZUE6IFwibXktc2VydmljZS1iXCJcbiAgICAgICAgICovXG4gICAgfTtcblxuICAgIHJlYWRvbmx5IHNlcnZpY2VzQ29uZmlncyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG15U2VydmljZUE6IHtcbiAgICAgICAgICogICAgIGdldDogKCk6IFhtYXRIdHRwQ29uZmlnID0+IHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVIdHRwQ29uZmlnKFhtYXRSZXN0VmVyYnMuR0VULCB0aGlzLnNlcnZpY2VzVXJscy5teVNlcnZpY2VBLCB0cnVlKTtcbiAgICAgICAgICogICAgIH0sXG4gICAgICAgICAqICAgICBwb3N0OiAoKTogWG1hdEh0dHBDb25maWcgPT4ge1xuICAgICAgICAgKiAgICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZUh0dHBDb25maWcoWG1hdFJlc3RWZXJicy5QT1NULCB0aGlzLnNlcnZpY2VzVXJscy5teVNlcnZpY2VBKTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICogfSxcbiAgICAgICAgICogbXlTZXJ2aWNlQjogKCk6IFhtYXRIdHRwQ29uZmlnID0+IHtcbiAgICAgICAgICogICAgIHJldHVybiB0aGlzLl9nZW5lcmF0ZUh0dHBDb25maWcoWG1hdFJlc3RWZXJicy5HRVQsIHRoaXMuc2VydmljZXNVcmxzLm15U2VydmljZUEsIHRydWUpO1xuICAgICAgICAgKiB9XG4gICAgICAgICAqL1xuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RCYXNlVXJsID0gdGhpcy5feG1hdENvbnN0YW50cy5yZXN0QmFzZVVybDtcbiAgICBwcm90ZWN0ZWQgX2RzID0gdGhpcy5feG1hdENvbnN0YW50cy5kcztcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgcHJvdGVjdGVkIF94bWF0Q29uc3RhbnRzOiBYbWF0Q29uc3RhbnRzU2VydmljZSkge1xuXG4gICAgfVxuXG4gICAgZG93bmxvYWRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYj86IFhtYXRSZXN0VmVyYnMuR0VULCBvbkVycm9yPzogKGVycjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBkb3dubG9hZEJsb2JGcm9tVXJsKGZpbGU6IFhtYXRGaWxlLCB2ZXJiOiBYbWF0UmVzdFZlcmJzLlBBVENILCBib2R5OiBhbnksIG9uRXJyb3I/OiAoZXJyOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIGRvd25sb2FkQmxvYkZyb21VcmwoXG4gICAgICAgIGZpbGU6IFhtYXRGaWxlLFxuICAgICAgICB2ZXJiOiBYbWF0UmVzdFZlcmJzLkdFVCB8IFhtYXRSZXN0VmVyYnMuUEFUQ0ggPSBYbWF0UmVzdFZlcmJzLkdFVCxcbiAgICAgICAgYm9keT86IGFueSB8IHZvaWQsXG4gICAgICAgIG9uRXJyb3I/OiAoZXJyOiBhbnkpID0+IHZvaWRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgbGV0IGNhbGw7XG4gICAgICAgIGlmICh2ZXJiID09PSBYbWF0UmVzdFZlcmJzLkdFVCkge1xuICAgICAgICAgICAgY2FsbCA9IHRoaXMuZ2V0QmxvYkZyb21VcmwoZmlsZSwgdmVyYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZlcmIgPT09IFhtYXRSZXN0VmVyYnMuUEFUQ0gpIHtcbiAgICAgICAgICAgIGNhbGwgPSB0aGlzLmdldEJsb2JGcm9tVXJsKGZpbGUsIHZlcmIsIGJvZHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbC5zdWJzY3JpYmUoKHJlc3VsdHM6IEJsb2IpID0+IHtcbiAgICAgICAgICAgIC8vIElFIERPRVNOJ1QgU1VQUE9SVCBUUklHR0VSSU5HIFNPIFdFIFNUQVJUIERPV05MT0FESU5HIFdJVEggVEhJUyBQT1JLQVJPVU5EXG4gICAgICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKHJlc3VsdHMsIGZpbGUuZmlsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5zYWZlVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICAgICAgICAgICAgbGlua0VsLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdW5zYWZlVXJsKTtcbiAgICAgICAgICAgICAgICBsaW5rRWwuc2V0QXR0cmlidXRlKFwiZG93bmxvYWRcIiwgZmlsZS5maWxlTmFtZSk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmtFbCk7XG4gICAgICAgICAgICAgICAgbGlua0VsLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHR5cGVvZiBvbkVycm9yID09PSB0eXBlb2YgaXNOYU4gJiYgb25FcnJvcihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYj86IFhtYXRSZXN0VmVyYnMuR0VUKTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgICBnZXRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYjogWG1hdFJlc3RWZXJicy5QQVRDSCwgYm9keTogYW55KTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgICBnZXRCbG9iRnJvbVVybChmaWxlOiBYbWF0RmlsZSwgdmVyYjogWG1hdFJlc3RWZXJicy5HRVQgfCBYbWF0UmVzdFZlcmJzLlBBVENIID0gWG1hdFJlc3RWZXJicy5HRVQsIGJvZHk/OiBhbnkpOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICAgICAgaWYgKCFmaWxlIHx8ICFmaWxlLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlhtYXRSZXN0OiBpbnZhbGlkIFhtYXRGaWxlIHByb3ZpZGVkIVwiLCBmaWxlKTtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIGEgZGVmYXVsdCBmaWxlTmFtZSBpZiBub3Qgc2V0XG4gICAgICAgIGlmICghZmlsZS5maWxlTmFtZSB8fCAhZmlsZS5maWxlTmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IGZpbGUudXJsLnN1YnN0cihmaWxlLnVybC5sYXN0SW5kZXhPZihcIi5cIikpO1xuICAgICAgICAgICAgZmlsZS5maWxlTmFtZSA9IGB4bWF0LWRvY3VtZW50JHtleHR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZXJiID09PSBYbWF0UmVzdFZlcmJzLkdFVCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0KGZpbGUudXJsLCB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBYbWF0UmVzcG9uc2VUeXBlcy5ibG9iXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmVyYiA9PT0gWG1hdFJlc3RWZXJicy5QQVRDSCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAucGF0Y2goZmlsZS51cmwsIGJvZHksIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IFhtYXRSZXNwb25zZVR5cGVzLmJsb2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBYbWF0UmVzdDogaW52YWxpZCB2ZXJiIHByb3ZpZGVkIGZvciAnZ2V0QmxvYkZyb21VcmwnLiBFeHBlY3RlZCBHRVR8UEFUQ0gsIGdvdCAke3ZlcmJ9YCk7XG4gICAgfVxuXG4gICAgJGFsbChjb25maWdzOiBYbWF0SHR0cENvbmZpZ1tdKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgICAgICBjb25zdCBxdWV1ZTogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgZm9yRWFjaChjb25maWdzLCAoYzogWG1hdEh0dHBDb25maWcpID0+IHtcbiAgICAgICAgICAgIHF1ZXVlLnB1c2godGhpcy4kaHR0cChjKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihxdWV1ZSk7XG4gICAgfVxuXG4gICAgJGFsbE1hcDxUIGV4dGVuZHMgWG1hdEdlbmVyaWNPYmplY3Q8WG1hdEh0dHBDb25maWc+LCBVID0gYW55Pihjb25maWdzOiBUKTogT2JzZXJ2YWJsZTxYbWF0R2VuZXJpY09iamVjdDxVPj4ge1xuICAgICAgICBjb25zdCBxdWV1ZTogT2JzZXJ2YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgY29uc3QgcXVldWVLZXlzOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+ID0gW107XG4gICAgICAgIGZvckVhY2goY29uZmlncywgKGM6IFhtYXRIdHRwQ29uZmlnLCBrZXk6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLiRodHRwKGMpKTtcbiAgICAgICAgICAgIHF1ZXVlS2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4ocXVldWUpXG4gICAgICAgICAgICAucGlwZShtYXAoKHJhdzogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3JFYWNoKHJhdywgKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBtYXBwZWRbcXVldWVLZXlzW2luZGV4XV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgJGh0dHA8VD4oY29uZmlnOiBYbWF0SHR0cENvbmZpZyA9IHRoaXMuX2dlbmVyYXRlSHR0cENvbmZpZygpKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGlmICghY29uZmlnLm1ldGhvZCkge1xuICAgICAgICAgICAgY29uZmlnLm1ldGhvZCA9IFhtYXRSZXN0VmVyYnMuR0VUO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29uZmlnLnVybCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yOiBbJGh0dHA6YmFkY29uZmlnXVwiLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChjb25maWcubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlIFhtYXRSZXN0VmVyYnMuR0VUOlxuICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSBjb25maWcucGFyYW1zIHx8IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogVHJhbnNmb3JtIGRhdGEgaW4gcXVlcnkgcGFyYW1zXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKCEhY29uZmlnLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjZXB0aW5nIDAsIG51bGwsIHZvaWQgMCBhcyBlbXB0eSBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3htYXRDb25zdGFudHMuaXNTdHJpY3RseU9iamVjdChjb25maWcuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2goT2JqZWN0LmtleXMoY29uZmlnLmRhdGEpLCAoa2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKGtleSwgY29uZmlnLmRhdGFba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkVycm9yOiBbWG1hdFJlc3Q6YmFkcGFyYW1zXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8VD4oY29uZmlnLnVybCwgeyBwYXJhbXM6IHBhcmFtcyB9KTtcbiAgICAgICAgICAgIGNhc2UgWG1hdFJlc3RWZXJicy5QQVRDSDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wYXRjaDxUPihjb25maWcudXJsLCBjb25maWcuZGF0YSwgeyBwYXJhbXM6IGNvbmZpZy5wYXJhbXMgfSk7XG4gICAgICAgICAgICBjYXNlIFhtYXRSZXN0VmVyYnMuUE9TVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0PFQ+KGNvbmZpZy51cmwsIGNvbmZpZy5kYXRhLCB7IHBhcmFtczogY29uZmlnLnBhcmFtcyB9KTtcbiAgICAgICAgICAgIGNhc2UgWG1hdFJlc3RWZXJicy5ERUxFVEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZGVsZXRlPFQ+KGNvbmZpZy51cmwsIHsgcGFyYW1zOiBjb25maWcucGFyYW1zIH0pO1xuICAgICAgICAgICAgY2FzZSBYbWF0UmVzdFZlcmJzLlBVVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wdXQ8VD4oY29uZmlnLnVybCwgY29uZmlnLmRhdGEsIHsgcGFyYW1zOiBjb25maWcucGFyYW1zIH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3I6IFtYbWF0UmVzdDpiYWRtZXRob2RdXCIsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2dlbmVyYXRlSHR0cENvbmZpZyhtZXRob2Q6IFhtYXRSZXN0VmVyYnMgPSBYbWF0UmVzdFZlcmJzLkdFVCwgdXJsOiBzdHJpbmcgPSBcIlwiLCBxdWVyeWFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IFhtYXRIdHRwQ29uZmlnIHtcbiAgICAgICAgdXJsID0gdGhpcy5feG1hdENvbnN0YW50cy5yZW1vdmVUcmFpbGluZ1NsYXNoKHVybCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgZGF0YTogdm9pZCAwLFxuICAgICAgICAgICAgcXVlcnlhYmxlOiBxdWVyeWFibGVcbiAgICAgICAgfSBhcyBYbWF0SHR0cENvbmZpZztcbiAgICB9XG59XG5cblxuIl19