UNPKG

@terminus/ngx-tools

Version:

[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github

178 lines 20 kB
import { __decorate, __param } from "tslib"; /** * Sourced from MIT Licensed Library * https://github.com/7leads/ngx-cookie-service */ import { DOCUMENT, isPlatformBrowser, } from '@angular/common'; import { Inject, Injectable, InjectionToken, PLATFORM_ID, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; const MS_IN_SECONDS = 1000; const SECONDS_IN_MINUTE = 60; const MINUTES_IN_HOUR = 60; const HOURS_IN_DAY = 24; const MS_IN_DAY = MS_IN_SECONDS * SECONDS_IN_MINUTE * MINUTES_IN_HOUR * HOURS_IN_DAY; /** * A service to manage browser cookies */ let TsCookieService = class TsCookieService { constructor( // HACK: This `any` is required. See comment inside constructor. // eslint-disable-next-line @typescript-eslint/no-explicit-any _document, platformId) { this._document = _document; this.platformId = platformId; // HACK: The angular compiler doesn't understand the type `Document` when determining the metadata for injectable parameters. // So we are using `any` for the injection signature (making Angular happy), but coercing to a TypeScript type within the class. // See https://github.com/angular/angular/issues/20351 this.document = _document; // The PLATFORM_ID allows us to check if we're in a browser this.documentIsAccessible = isPlatformBrowser(platformId); } /** * Set a cookie * * @param name - Cookie name * @param value - Cookie value * @param expires - Number of days until the cookies expires or an actual `Date` * @param path - Cookie path * @param domain - Cookie domain * @param secure - Secure flag * @param sameSite - OWASP samesite token `Lax` or `Strict` */ set(name, value, expires, path, domain, secure, sameSite) { if (!this.documentIsAccessible) { return; } let cookieString = `${encodeURIComponent(name)}=${encodeURIComponent(value)};`; if (expires) { if (typeof expires === 'number') { const dateExpires = new Date(new Date().getTime() + (expires * MS_IN_DAY)); cookieString += `expires=${dateExpires.toUTCString()};`; } else { cookieString += `expires=${expires.toUTCString()};`; } } if (path) { cookieString += `path=${path};`; } if (domain) { cookieString += `domain=${domain};`; } if (secure) { cookieString += 'secure;'; } if (sameSite) { cookieString += `sameSite=${sameSite};`; } this.document.cookie = cookieString; } /** * Verify if a cookie exists * * @param name - Cookie name * @returns boolean */ check(name) { if (!this.documentIsAccessible) { return false; } const regExp = this.getCookieRegExp(encodeURIComponent(name)); return regExp.test(this.document.cookie); } /** * @param name - Cookie name * @returns any */ get(name) { if (this.documentIsAccessible && this.check(name)) { const regExp = this.getCookieRegExp(encodeURIComponent(name)); const result = regExp.exec(this.document.cookie); return result ? decodeURIComponent(result[1]) /* istanbul ignore next - Unreachable */ : ''; } return ''; } /** * Get all cookies * * @returns Object containing all cookies */ // eslint-disable-next-line @typescript-eslint/no-explicit-any getAll() { if (!this.documentIsAccessible) { return {}; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const cookies = {}; const document = this.document; // istanbul ignore else if (document.cookie && document.cookie !== '') { const split = document.cookie.split(';').filter(v => v !== ''); // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let i = 0; i < split.length; i += 1) { const currentCookie = split[i].split('='); currentCookie[0] = currentCookie[0].replace(/^ /, ''); cookies[decodeURIComponent(currentCookie[0])] = decodeURIComponent(currentCookie[1]); } } return cookies; } /** * Delete a cookie * * NOTE: This clears the value and sets the cookie as expired. The browser will delete the expired cookie the next time a request * is made to the domain. * * @param name - Cookie name * @param path - Cookie path * @param domain - Cookie domain */ delete(name, path, domain) { if (!this.documentIsAccessible) { return; } this.set(name, '', new Date('Thu, 01 Jan 1970 00:00:01 GMT'), path, domain); } /** * Delete all cookies * * @param path - Cookie path * @param domain - Cookie domain */ deleteAll(path, domain) { if (!this.documentIsAccessible) { return; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const cookies = this.getAll(); for (const cookieName in cookies) { // istanbul ignore else if (cookies.hasOwnProperty(cookieName)) { this.delete(cookieName, path, domain); } } } /** * Get a regular expression based on a cookie name * * @param name - Cookie name * @returns RegExp */ getCookieRegExp(name) { const escapedName = name.replace(/([\[\]\{\}\(\)\|\=\;\+\?\,\.\*\^\$])/ig, '\\$1'); return new RegExp(`(?:^${escapedName}|;\\s*${escapedName})=(.*?)(?:;|$)`, 'g'); } }; TsCookieService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: InjectionToken, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; TsCookieService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TsCookieService_Factory() { return new TsCookieService(i0.ɵɵinject(i1.DOCUMENT), i0.ɵɵinject(i0.PLATFORM_ID)); }, token: TsCookieService, providedIn: "root" }); TsCookieService = __decorate([ Injectable({ providedIn: 'root' }), __param(0, Inject(DOCUMENT)), __param(1, Inject(PLATFORM_ID)) ], TsCookieService); export { TsCookieService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRlcm1pbnVzL25neC10b29scy9icm93c2VyLyIsInNvdXJjZXMiOlsiY29va2llcy9jb29raWVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFDTCxRQUFRLEVBQ1IsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxFQUNkLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQzs7O0FBRXZCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0IsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sU0FBUyxHQUFHLGFBQWEsR0FBRyxpQkFBaUIsR0FBRyxlQUFlLEdBQUcsWUFBWSxDQUFDO0FBR3JGOztHQUVHO0FBRUgsSUFBYSxlQUFlLEdBQTVCLE1BQWEsZUFBZTtJQUkxQjtJQUNFLGdFQUFnRTtJQUNoRSw4REFBOEQ7SUFDcEMsU0FBYyxFQUNYLFVBQWtDO1FBRHJDLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDWCxlQUFVLEdBQVYsVUFBVSxDQUF3QjtRQUUvRCw2SEFBNkg7UUFDN0gsZ0lBQWdJO1FBQ2hJLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQXFCLENBQUM7UUFDdEMsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLEdBQUcsQ0FDUixJQUFZLEVBQ1osS0FBYSxFQUNiLE9BQXVCLEVBQ3ZCLElBQWEsRUFDYixNQUFlLEVBQ2YsTUFBZ0IsRUFDaEIsUUFBMkI7UUFFM0IsSUFB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Ozs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLElBQVk7UUFDbEMsTUFBTSxXQUFXLEdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3Q0FBd0MsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRixPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sV0FBVyxTQUFTLFdBQVcsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakYsQ0FBQztDQUVGLENBQUE7OzRDQS9LSSxNQUFNLFNBQUMsUUFBUTtZQUN5QixjQUFjLHVCQUF0RCxNQUFNLFNBQUMsV0FBVzs7O0FBUlYsZUFBZTtJQUQzQixVQUFVLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFROUIsV0FBQSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEIsV0FBQSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7R0FSWCxlQUFlLENBc0wzQjtTQXRMWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb3VyY2VkIGZyb20gTUlUIExpY2Vuc2VkIExpYnJhcnlcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS83bGVhZHMvbmd4LWNvb2tpZS1zZXJ2aWNlXG4gKi9cbmltcG9ydCB7XG4gIERPQ1VNRU5ULFxuICBpc1BsYXRmb3JtQnJvd3Nlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIFBMQVRGT1JNX0lELFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuY29uc3QgTVNfSU5fU0VDT05EUyA9IDEwMDA7XG5jb25zdCBTRUNPTkRTX0lOX01JTlVURSA9IDYwO1xuY29uc3QgTUlOVVRFU19JTl9IT1VSID0gNjA7XG5jb25zdCBIT1VSU19JTl9EQVkgPSAyNDtcbmNvbnN0IE1TX0lOX0RBWSA9IE1TX0lOX1NFQ09ORFMgKiBTRUNPTkRTX0lOX01JTlVURSAqIE1JTlVURVNfSU5fSE9VUiAqIEhPVVJTX0lOX0RBWTtcblxuXG4vKipcbiAqIEEgc2VydmljZSB0byBtYW5hZ2UgYnJvd3NlciBjb29raWVzXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVHNDb29raWVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudElzQWNjZXNzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gSEFDSzogVGhpcyBgYW55YCBpcyByZXF1aXJlZC4gU2VlIGNvbW1lbnQgaW5zaWRlIGNvbnN0cnVjdG9yLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ6IGFueSxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IEluamVjdGlvblRva2VuPE9iamVjdD4sXG4gICkge1xuICAgIC8vIEhBQ0s6IFRoZSBhbmd1bGFyIGNvbXBpbGVyIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgdHlwZSBgRG9jdW1lbnRgIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIG1ldGFkYXRhIGZvciBpbmplY3RhYmxlIHBhcmFtZXRlcnMuXG4gICAgLy8gU28gd2UgYXJlIHVzaW5nIGBhbnlgIGZvciB0aGUgaW5qZWN0aW9uIHNpZ25hdHVyZSAobWFraW5nIEFuZ3VsYXIgaGFwcHkpLCBidXQgY29lcmNpbmcgdG8gYSBUeXBlU2NyaXB0IHR5cGUgd2l0aGluIHRoZSBjbGFzcy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjAzNTFcbiAgICB0aGlzLmRvY3VtZW50ID0gX2RvY3VtZW50IGFzIERvY3VtZW50O1xuICAgIC8vIFRoZSBQTEFURk9STV9JRCBhbGxvd3MgdXMgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBicm93c2VyXG4gICAgdGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGNvb2tpZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSAtIENvb2tpZSB2YWx1ZVxuICAgKiBAcGFyYW0gZXhwaXJlcyAtIE51bWJlciBvZiBkYXlzIHVudGlsIHRoZSBjb29raWVzIGV4cGlyZXMgb3IgYW4gYWN0dWFsIGBEYXRlYFxuICAgKiBAcGFyYW0gcGF0aCAtIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gLSBDb29raWUgZG9tYWluXG4gICAqIEBwYXJhbSBzZWN1cmUgLSBTZWN1cmUgZmxhZ1xuICAgKiBAcGFyYW0gc2FtZVNpdGUgLSBPV0FTUCBzYW1lc2l0ZSB0b2tlbiBgTGF4YCBvciBgU3RyaWN0YFxuICAgKi9cbiAgcHVibGljIHNldChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBleHBpcmVzPzogbnVtYmVyIHwgRGF0ZSxcbiAgICBwYXRoPzogc3RyaW5nLFxuICAgIGRvbWFpbj86IHN0cmluZyxcbiAgICBzZWN1cmU/OiBib29sZWFuLFxuICAgIHNhbWVTaXRlPzogJ0xheCcgfCAnU3RyaWN0JyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNvb2tpZVN0cmluZyA9IGAke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfTtgO1xuXG4gICAgaWYgKGV4cGlyZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZGF0ZUV4cGlyZXM6IERhdGUgPSBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIChleHBpcmVzICogTVNfSU5fREFZKSk7XG5cbiAgICAgICAgY29va2llU3RyaW5nICs9IGBleHBpcmVzPSR7ZGF0ZUV4cGlyZXMudG9VVENTdHJpbmcoKX07YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvb2tpZVN0cmluZyArPSBgZXhwaXJlcz0ke2V4cGlyZXMudG9VVENTdHJpbmcoKX07YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgICAgY29va2llU3RyaW5nICs9IGBwYXRoPSR7cGF0aH07YDtcbiAgICB9XG5cbiAgICBpZiAoZG9tYWluKSB7XG4gICAgICBjb29raWVTdHJpbmcgKz0gYGRvbWFpbj0ke2RvbWFpbn07YDtcbiAgICB9XG5cbiAgICBpZiAoc2VjdXJlKSB7XG4gICAgICBjb29raWVTdHJpbmcgKz0gJ3NlY3VyZTsnO1xuICAgIH1cblxuICAgIGlmIChzYW1lU2l0ZSkge1xuICAgICAgY29va2llU3RyaW5nICs9IGBzYW1lU2l0ZT0ke3NhbWVTaXRlfTtgO1xuICAgIH1cblxuICAgIHRoaXMuZG9jdW1lbnQuY29va2llID0gY29va2llU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiBhIGNvb2tpZSBleGlzdHNcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBwdWJsaWMgY2hlY2sobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnRXhwOiBSZWdFeHAgPSB0aGlzLmdldENvb2tpZVJlZ0V4cChlbmNvZGVVUklDb21wb25lbnQobmFtZSkpO1xuICAgIHJldHVybiByZWdFeHAudGVzdCh0aGlzLmRvY3VtZW50LmNvb2tpZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcmV0dXJucyBhbnlcbiAgICovXG4gIHB1YmxpYyBnZXQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kb2N1bWVudElzQWNjZXNzaWJsZSAmJiB0aGlzLmNoZWNrKG5hbWUpKSB7XG4gICAgICBjb25zdCByZWdFeHA6IFJlZ0V4cCA9IHRoaXMuZ2V0Q29va2llUmVnRXhwKGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSk7XG4gICAgICBjb25zdCByZXN1bHQ6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGwgPSByZWdFeHAuZXhlYyh0aGlzLmRvY3VtZW50LmNvb2tpZSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPyBkZWNvZGVVUklDb21wb25lbnQocmVzdWx0WzFdKSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIFVucmVhY2hhYmxlICovIDogJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGNvb2tpZXNcbiAgICpcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgYWxsIGNvb2tpZXNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50O1xuXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICBpZiAoZG9jdW1lbnQuY29va2llICYmIGRvY3VtZW50LmNvb2tpZSAhPT0gJycpIHtcbiAgICAgIGNvbnN0IHNwbGl0OiBzdHJpbmdbXSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpLmZpbHRlcih2ID0+IHYgIT09ICcnKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZm9yLW9mXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb29raWU6IHN0cmluZ1tdID0gc3BsaXRbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgY3VycmVudENvb2tpZVswXSA9IGN1cnJlbnRDb29raWVbMF0ucmVwbGFjZSgvXiAvLCAnJyk7XG4gICAgICAgIGNvb2tpZXNbZGVjb2RlVVJJQ29tcG9uZW50KGN1cnJlbnRDb29raWVbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29va2llWzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29va2llcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjb29raWVcbiAgICpcbiAgICogTk9URTogVGhpcyBjbGVhcnMgdGhlIHZhbHVlIGFuZCBzZXRzIHRoZSBjb29raWUgYXMgZXhwaXJlZC4gVGhlIGJyb3dzZXIgd2lsbCBkZWxldGUgdGhlIGV4cGlyZWQgY29va2llIHRoZSBuZXh0IHRpbWUgYSByZXF1ZXN0XG4gICAqIGlzIG1hZGUgdG8gdGhlIGRvbWFpbi5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcGFyYW0gcGF0aCAtIENvb2tpZSBwYXRoXG4gICAqIEBwYXJhbSBkb21haW4gLSBDb29raWUgZG9tYWluXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKG5hbWU6IHN0cmluZywgcGF0aD86IHN0cmluZywgZG9tYWluPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50SXNBY2Nlc3NpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0KG5hbWUsICcnLCBuZXcgRGF0ZSgnVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMSBHTVQnKSwgcGF0aCwgZG9tYWluKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIGNvb2tpZXNcbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBDb29raWUgcGF0aFxuICAgKiBAcGFyYW0gZG9tYWluIC0gQ29va2llIGRvbWFpblxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFsbChwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZG9jdW1lbnRJc0FjY2Vzc2libGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB0aGlzLmdldEFsbCgpO1xuXG4gICAgZm9yIChjb25zdCBjb29raWVOYW1lIGluIGNvb2tpZXMpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICBpZiAoY29va2llcy5oYXNPd25Qcm9wZXJ0eShjb29raWVOYW1lKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZShjb29raWVOYW1lLCBwYXRoLCBkb21haW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWd1bGFyIGV4cHJlc3Npb24gYmFzZWQgb24gYSBjb29raWUgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIFJlZ0V4cFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb29raWVSZWdFeHAobmFtZTogc3RyaW5nKTogUmVnRXhwIHtcbiAgICBjb25zdCBlc2NhcGVkTmFtZTogc3RyaW5nID0gbmFtZS5yZXBsYWNlKC8oW1xcW1xcXVxce1xcfVxcKFxcKVxcfFxcPVxcO1xcK1xcP1xcLFxcLlxcKlxcXlxcJF0pL2lnLCAnXFxcXCQxJyk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYCg/Ol4ke2VzY2FwZWROYW1lfXw7XFxcXHMqJHtlc2NhcGVkTmFtZX0pPSguKj8pKD86O3wkKWAsICdnJyk7XG4gIH1cblxufVxuIl19