UNPKG

@protoarch.angular/api

Version:
141 lines 21.6 kB
import { HttpClient, HttpParams } from '@angular/common/http'; import { Inject, Injectable, Optional } from '@angular/core'; import { map } from 'rxjs/operators'; import { API_ENDPOINT, API_SERIALIZER } from './api.tokens'; import { flattenParamsObject } from './web-api-http-params'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; export var ResponseTypeEnum; (function (ResponseTypeEnum) { ResponseTypeEnum["json"] = "json"; ResponseTypeEnum["text"] = "text"; ResponseTypeEnum["arraybuffer"] = "arraybuffer"; ResponseTypeEnum["blob"] = "blob"; })(ResponseTypeEnum || (ResponseTypeEnum = {})); export class Api { http; apiEndpoint; serializer; constructor(http, apiEndpoint = null, serializer) { this.http = http; this.apiEndpoint = apiEndpoint; this.serializer = serializer; } get(url, options) { const opts = this.buildOptions(options); return this.http .get(this.buildUrl(url), opts) .pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo))); } post(url, body, options) { const opts = this.buildOptions(options); return this.http .post(this.buildUrl(url), this.trySerialize(body), opts) .pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo))); } put(url, body, options) { const opts = this.buildOptions(options); return this.http .put(this.buildUrl(url), this.trySerialize(body), opts) .pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo))); } delete(url, options) { const opts = this.buildOptions(options); return this.http .delete(this.buildUrl(url), opts) .pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo))); } download(url, triggerBrowserDownload = true, options) { const opts = this.buildOptions({ observe: 'response', responseType: 'blob', ...options, }); return new Promise((resolve, reject) => { this.http.get(this.buildUrl(url), opts).subscribe({ next: blobResp => { if (!blobResp.body) { const errorTxt = `[Api] Failed to download file ${url}. Empty response`; console.error(errorTxt); reject(errorTxt); return; } if (triggerBrowserDownload) { const a = document.createElement('a'); const objectUrl = URL.createObjectURL(blobResp.body); let filename = blobResp.headers .get('content-disposition') ?.split('filename=')?.[1]; if (filename) { filename = decodeURI(filename); } a.href = objectUrl; a.download = (filename ?? url.replaceAll('/', '')).replaceAll('"', ''); a.click(); URL.revokeObjectURL(objectUrl); } resolve(blobResp.body); }, error: e => { console.error(`[Api] Failed to download file ${url}`, e); reject(e); }, }); }); } buildUrl(url) { if ((url && url.startsWith('http')) || !this.apiEndpoint) { return url; } return this.apiEndpoint.concat(url); } buildOptions(options) { const opts = { responseType: ResponseTypeEnum.json, ...options }; opts.params = this.getHttpParams(opts?.params); return opts; } getHttpParams(params = null) { if (params === null || params === undefined) { return undefined; } const serializedParams = this.trySerialize(params); return typeof serializedParams === 'object' ? flattenParamsObject(serializedParams) : new HttpParams({ fromString: serializedParams.toString() }); } trySerialize(data) { if (this.serializer) { return this.serializer.serialize(data); } return data; } tryDeserialize(data, deserializeTo) { if (!deserializeTo || !this.serializer) { return data; } if (deserializeTo instanceof Array && data instanceof Array) { const type = deserializeTo.length > 0 ? deserializeTo[0] : undefined; return data.map(d => this.serializer.deserialize(d, type)); } if (typeof deserializeTo === 'function') { return this.serializer.deserialize(data, deserializeTo); } return data; } static ɵfac = function Api_Factory(t) { return new (t || Api)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(API_ENDPOINT, 8), i0.ɵɵinject(API_SERIALIZER, 8)); }; static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: Api, factory: Api.ɵfac }); } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(Api, [{ type: Injectable }], () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [API_ENDPOINT] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [API_SERIALIZER] }] }], null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9zcmMvbGliL2FwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQTRCLFVBQVUsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkMsT0FBTyxFQUFDLFlBQVksRUFBRSxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7OztBQUUxRCxNQUFNLENBQU4sSUFBWSxnQkFLWDtBQUxELFdBQVksZ0JBQWdCO0lBQ3hCLGlDQUFhLENBQUE7SUFDYixpQ0FBYSxDQUFBO0lBQ2IsK0NBQTJCLENBQUE7SUFDM0IsaUNBQWEsQ0FBQTtBQUNqQixDQUFDLEVBTFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUszQjtBQThCRCxNQUFNLE9BQU8sR0FBRztJQUVBO0lBR0E7SUFHQTtJQVBaLFlBQ1ksSUFBZ0IsRUFHaEIsY0FBNkIsSUFBSSxFQUdqQyxVQUF1QjtRQU52QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBR2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQUdqQyxlQUFVLEdBQVYsVUFBVSxDQUFhO0lBQ2hDLENBQUM7SUFFRyxHQUFHLENBQUksR0FBVyxFQUFFLE9BQTJDO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNYLEdBQUcsQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQzthQUNoQyxJQUFJ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QUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzZEQTNJUSxHQUFHLDBDQUlBLFlBQVksa0JBR1osY0FBYztnRUFQakIsR0FBRyxXQUFILEdBQUc7O2lGQUFILEdBQUc7Y0FEZixVQUFVOztzQkFJRixRQUFROztzQkFDUixNQUFNO3VCQUFDLFlBQVk7O3NCQUVuQixRQUFROztzQkFDUixNQUFNO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge0lTZXJpYWxpemVyfSBmcm9tICcuL2FwaS5vcHRpb25zJztcclxuaW1wb3J0IHtBUElfRU5EUE9JTlQsIEFQSV9TRVJJQUxJWkVSfSBmcm9tICcuL2FwaS50b2tlbnMnO1xyXG5pbXBvcnQge2ZsYXR0ZW5QYXJhbXNPYmplY3R9IGZyb20gJy4vd2ViLWFwaS1odHRwLXBhcmFtcyc7XHJcblxyXG5leHBvcnQgZW51bSBSZXNwb25zZVR5cGVFbnVtIHtcclxuICAgIGpzb24gPSAnanNvbicsXHJcbiAgICB0ZXh0ID0gJ3RleHQnLFxyXG4gICAgYXJyYXlidWZmZXIgPSAnYXJyYXlidWZmZXInLFxyXG4gICAgYmxvYiA9ICdibG9iJyxcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQXBpT3B0aW9ucyB7XHJcbiAgICBoZWFkZXJzPzpcclxuICAgICAgICB8IEh0dHBIZWFkZXJzXHJcbiAgICAgICAgfCB7XHJcbiAgICAgICAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICAgICAgICB9O1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0O1xyXG4gICAgb2JzZXJ2ZT86IGFueSB8ICdib2R5JztcclxuICAgIHBhcmFtcz86IGFueTtcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgIHJlc3BvbnNlVHlwZT86IGFueSB8IFJlc3BvbnNlVHlwZUVudW07XHJcbiAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXNlcmlhbGl6ZU9wdGlvbnMge1xyXG4gICAgLyoqXHJcbiAgICAgKiAgQWNjZXB0czpcclxuICAgICAqICAtIGNvbnN0cnVjdG9yOiB0byBkZXNlcmlhbGl6ZSB0byBpbnN0YW5jZSBvZiBvYmplY3RcclxuICAgICAqICAtIFtjb25zdHJ1Y3Rvcl0gKGFycmF5IHdpdGggYSBzaW5nbGUgZWxlbWVudCBjb25zdHJ1Y3Rvcik6IHRvIGRlc2VyaWFsaXplIHRvIGFycmF5IG9mIGluc3RhbmNlc1xyXG4gICAgICpcclxuICAgICAqIHR5cGUgeyh7IG5ldyguLi5hcmdzKTogYW55IH0gfCBbeyBuZXcoLi4uYXJncyk6IGFueSB9XSl9XHJcbiAgICAgKlxyXG4gICAgICogbWVtYmVyb2YgSURlc2VyaWFsaXplT3B0aW9uc1xyXG4gICAgICovXHJcbiAgICBkZXNlcmlhbGl6ZVRvPzoge25ldyAoLi4uYXJnczogYW55W10pOiBhbnl9IHwgW3tuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55fV07XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFwaSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgQE9wdGlvbmFsKClcclxuICAgICAgICBASW5qZWN0KEFQSV9FTkRQT0lOVClcclxuICAgICAgICBwcml2YXRlIGFwaUVuZHBvaW50OiBzdHJpbmcgfCBudWxsID0gbnVsbCxcclxuICAgICAgICBAT3B0aW9uYWwoKVxyXG4gICAgICAgIEBJbmplY3QoQVBJX1NFUklBTElaRVIpXHJcbiAgICAgICAgcHJpdmF0ZSBzZXJpYWxpemVyOiBJU2VyaWFsaXplcixcclxuICAgICkge31cclxuXHJcbiAgICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogSUFwaU9wdGlvbnMgJiBJRGVzZXJpYWxpemVPcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuYnVpbGRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgICAgICAgLmdldDxUPih0aGlzLmJ1aWxkVXJsKHVybCksIG9wdHMpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gdGhpcy50cnlEZXNlcmlhbGl6ZTxUPihyZXN1bHQsIG9wdHM/LmRlc2VyaWFsaXplVG8pKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBvc3Q8VD4oXHJcbiAgICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgICAgYm9keTogYW55LFxyXG4gICAgICAgIG9wdGlvbnM/OiBJQXBpT3B0aW9ucyAmIElEZXNlcmlhbGl6ZU9wdGlvbnMsXHJcbiAgICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5idWlsZE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAucG9zdDxUPih0aGlzLmJ1aWxkVXJsKHVybCksIHRoaXMudHJ5U2VyaWFsaXplKGJvZHkpLCBvcHRzKVxyXG4gICAgICAgICAgICAucGlwZShtYXAocmVzdWx0ID0+IHRoaXMudHJ5RGVzZXJpYWxpemU8VD4ocmVzdWx0LCBvcHRzPy5kZXNlcmlhbGl6ZVRvKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwdXQ8VD4oXHJcbiAgICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgICAgYm9keTogYW55LFxyXG4gICAgICAgIG9wdGlvbnM/OiBJQXBpT3B0aW9ucyAmIElEZXNlcmlhbGl6ZU9wdGlvbnMsXHJcbiAgICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5idWlsZE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAucHV0PFQ+KHRoaXMuYnVpbGRVcmwodXJsKSwgdGhpcy50cnlTZXJpYWxpemUoYm9keSksIG9wdHMpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gdGhpcy50cnlEZXNlcmlhbGl6ZTxUPihyZXN1bHQsIG9wdHM/LmRlc2VyaWFsaXplVG8pKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZTxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IElBcGlPcHRpb25zICYgSURlc2VyaWFsaXplT3B0aW9ucyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmJ1aWxkT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgICAgICAgIC5kZWxldGU8VD4odGhpcy5idWlsZFVybCh1cmwpLCBvcHRzKVxyXG4gICAgICAgICAgICAucGlwZShtYXAocmVzdWx0ID0+IHRoaXMudHJ5RGVzZXJpYWxpemU8VD4ocmVzdWx0LCBvcHRzPy5kZXNlcmlhbGl6ZVRvKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkb3dubG9hZChcclxuICAgICAgICB1cmw6IHN0cmluZyxcclxuICAgICAgICB0cmlnZ2VyQnJvd3NlckRvd25sb2FkID0gdHJ1ZSxcclxuICAgICAgICBvcHRpb25zPzogSUFwaU9wdGlvbnMgJiBJRGVzZXJpYWxpemVPcHRpb25zLFxyXG4gICAgKTogUHJvbWlzZTxCbG9iPiB7XHJcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuYnVpbGRPcHRpb25zKHtcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXHJcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxCbG9iPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8SHR0cFJlc3BvbnNlPEJsb2I+Pih0aGlzLmJ1aWxkVXJsKHVybCksIG9wdHMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiBibG9iUmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9iUmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yVHh0ID0gYFtBcGldIEZhaWxlZCB0byBkb3dubG9hZCBmaWxlICR7dXJsfS4gRW1wdHkgcmVzcG9uc2VgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yVHh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yVHh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckJyb3dzZXJEb3dubG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2JSZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBibG9iUmVzcC5oZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uc3BsaXQoJ2ZpbGVuYW1lPScpPy5bMV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZGVjb2RlVVJJKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gKGZpbGVuYW1lID8/IHVybC5yZXBsYWNlQWxsKCcvJywgJycpKS5yZXBsYWNlQWxsKCdcIicsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGJsb2JSZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQXBpXSBGYWlsZWQgdG8gZG93bmxvYWQgZmlsZSAke3VybH1gLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYnVpbGRVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoKHVybCAmJiB1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB8fCAhdGhpcy5hcGlFbmRwb2ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5hcGlFbmRwb2ludC5jb25jYXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkT3B0aW9ucyhvcHRpb25zOiAoSUFwaU9wdGlvbnMgJiBJRGVzZXJpYWxpemVPcHRpb25zKSB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IG9wdHMgPSB7cmVzcG9uc2VUeXBlOiBSZXNwb25zZVR5cGVFbnVtLmpzb24sIC4uLm9wdGlvbnN9O1xyXG4gICAgICAgIG9wdHMucGFyYW1zID0gdGhpcy5nZXRIdHRwUGFyYW1zKG9wdHM/LnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIG9wdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRIdHRwUGFyYW1zKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0gfCBudWxsID0gbnVsbCk6IEh0dHBQYXJhbXMgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmIChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFBhcmFtcyA9IHRoaXMudHJ5U2VyaWFsaXplKHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBzZXJpYWxpemVkUGFyYW1zID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IGZsYXR0ZW5QYXJhbXNPYmplY3Qoc2VyaWFsaXplZFBhcmFtcylcclxuICAgICAgICAgICAgOiBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogc2VyaWFsaXplZFBhcmFtcy50b1N0cmluZygpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlTZXJpYWxpemUoZGF0YTogYW55KTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5zZXJpYWxpemVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeURlc2VyaWFsaXplPFQ+KFxyXG4gICAgICAgIGRhdGE6IGFueSxcclxuICAgICAgICBkZXNlcmlhbGl6ZVRvPzoge25ldyAoLi4uYXJnczogYW55W10pOiBUfSB8IFt7bmV3ICguLi5hcmdzOiBhbnlbXSk6IFR9XSxcclxuICAgICkge1xyXG4gICAgICAgIGlmICghZGVzZXJpYWxpemVUbyB8fCAhdGhpcy5zZXJpYWxpemVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGVzZXJpYWxpemVUbyBpbnN0YW5jZW9mIEFycmF5ICYmIGRhdGEgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gZGVzZXJpYWxpemVUby5sZW5ndGggPiAwID8gZGVzZXJpYWxpemVUb1swXSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGQgPT4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGQsIHR5cGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkZXNlcmlhbGl6ZVRvID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSwgZGVzZXJpYWxpemVUbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==