UNPKG

ngx-google-analytics

Version:

A simple ng-9 wrapper to load Google Analytics dependency by angular way

228 lines 22 kB
import { Injectable, Inject, isDevMode } from '@angular/core'; import { NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN } from '../tokens/ngx-google-analytics-settings-token'; import { DOCUMENT } from '@angular/common'; import { NGX_GTAG_FN } from '../tokens/ngx-gtag-token'; import * as i0 from "@angular/core"; export class GoogleAnalyticsService { constructor(settings, _document, _gtag) { this.settings = settings; this._document = _document; this._gtag = _gtag; } get document() { return this._document; } throw(err) { if ((this.settings.enableTracing || isDevMode()) && console && console.error) { console.error(err); } } /** @todo Change this to `Object.fromEntity()` in the future... */ toKeyValue(map) { return (map.size > 0) ? Array.from(map).reduce((obj, [key, value]) => Object.defineProperty(obj, key, { value, enumerable: true }), {}) : undefined; } /** * Call native GA Tag */ gtag(...args) { try { this._gtag(...args.filter(x => x !== undefined)); } catch (err) { this.throw(err); } } /** * Send an event trigger to GA. It is the same as call: * ```js * gtag('event', 'video_auto_play_start', { * 'event_label': 'My promotional video', * 'event_category': 'video_auto_play' * }); * ``` * * @param action 'video_auto_play_start' * @param category 'video_auto_play' * @param label 'My promotional video' * @param value An value to measure something * @param interaction If user interaction is performed */ event(action, category, label, value, interaction, options) { try { const opt = new Map(); if (category) { opt.set('event_category', category); } if (label) { opt.set('event_label', label); } if (value) { opt.set('value', value); } if (interaction !== undefined) { opt.set('interaction', interaction); } if (options) { Object .entries(options) .map(([key, value]) => opt.set(key, value)); } const params = this.toKeyValue(opt); if (params) { this.gtag('event', action, params); } else { this.gtag('event', action); } } catch (error) { this.throw(error); } } /** * Send an page view event. This is the same as * * ```js * gtag('config', 'GA_TRACKING_ID', { * 'page_title' : 'Homepage', * 'page_path': '/home' * }); * ``` * * The tracking ID is injected automatically by Inject Token NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN * * @param path /home * @param title Homepage * @param location '{ page_location }' * @param options '{ ... custom dimentions }' */ pageView(path, title, location, options) { try { const opt = new Map([['page_path', path]]); if (title) { opt.set('page_title', title); } if (location || this.document) { opt.set('page_location', (location || this.document.location.href)); } if (options) { Object .entries(options) .map(([key, value]) => opt.set(key, value)); } this.gtag('config', this.settings.trackingCode, this.toKeyValue(opt)); } catch (error) { this.throw(error); } } /** * Send an event to report a App Page View. It is the same as * * ```js * gtag('event', 'screen_view', { * 'app_name': 'myAppName', * 'screen_name' : 'Home' * }); * * ``` * * @param screen 'screen_name' * @param appName 'app_name' * @param appId 'app_id' * @param appVersion 'app_version' * @param installerId 'app_installer_id' */ appView(screen, appName, appId, appVersion, installerId) { try { const opt = new Map([['screen_name', screen], ['app_name', appName]]); if (appId) { opt.set('app_id', appId); } if (appVersion) { opt.set('app_version', appVersion); } if (installerId) { opt.set('app_installer_id', installerId); } this.gtag('event', 'screen_view', this.toKeyValue(opt)); } catch (error) { this.throw(error); } } /** * Defines persistent values on GoogleAnalytics * * @see https://developers.google.com/analytics/devguides/collection/gtagjs/setting-values * * ```js * gtag('set', { * 'currency': 'USD', * 'country': 'US' * }); * ``` */ set(...options) { try { this._gtag('set', ...options); } catch (err) { this.throw(err); } } /** * Send an event to GA to report an application error. It is the same as * * ```js * gtag('event', 'exception', { * 'description': 'error_description', * 'fatal': false // set to true if the error is fatal * }); * ``` * * @param description 'error_description' * @param fatal set to true if the error is fatal */ exception(description, fatal) { try { const opt = new Map(); if (description) { opt.set('description', description); } if (fatal) { opt.set('fatal', fatal); } const params = this.toKeyValue(opt); if (params) { this.gtag('event', 'exception', this.toKeyValue(opt)); } else { this.gtag('event', 'exception'); } } catch (error) { this.throw(error); } } } GoogleAnalyticsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: GoogleAnalyticsService, deps: [{ token: NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN }, { token: DOCUMENT }, { token: NGX_GTAG_FN }], target: i0.ɵɵFactoryTarget.Injectable }); GoogleAnalyticsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: GoogleAnalyticsService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: GoogleAnalyticsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN] }] }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Inject, args: [NGX_GTAG_FN] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWFuYWx5dGljcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWdvb2dsZS1hbmFseXRpY3Mvc3JjL2xpYi9zZXJ2aWNlcy9nb29nbGUtYW5hbHl0aWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBR3BHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBTXZELE1BQU0sT0FBTyxzQkFBc0I7SUFNakMsWUFDZ0UsUUFBa0MsRUFDN0QsU0FBYyxFQUNYLEtBQWE7UUFGVyxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUM3RCxjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ1gsVUFBSyxHQUFMLEtBQUssQ0FBUTtJQUNqRCxDQUFDO0lBUkwsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBUU8sS0FBSyxDQUFDLEdBQVU7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLFNBQVMsRUFBRSxDQUFDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDNUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxrRUFBa0U7SUFDMUQsVUFBVSxDQUFDLEdBQXFCO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFN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QkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFJLE1BQU07MkJBQUMsbUNBQW1DOzswQkFDMUMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4gfSBmcm9tICcuLi90b2tlbnMvbmd4LWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MtdG9rZW4nO1xuaW1wb3J0IHsgSUdvb2dsZUFuYWx5dGljc1NldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pLWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MnO1xuaW1wb3J0IHsgR2FBY3Rpb25FbnVtIH0gZnJvbSAnLi4vZW51bXMvZ2EtYWN0aW9uLmVudW0nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTkdYX0dUQUdfRk4gfSBmcm9tICcuLi90b2tlbnMvbmd4LWd0YWctdG9rZW4nO1xuaW1wb3J0IHsgR3RhZ0ZuIH0gZnJvbSAnLi4vdHlwZXMvZ3RhZy50eXBlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR29vZ2xlQW5hbHl0aWNzU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBnZXQgZG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9kb2N1bWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4pIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IElHb29nbGVBbmFseXRpY3NTZXR0aW5ncyxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudDogYW55LFxuICAgIEBJbmplY3QoTkdYX0dUQUdfRk4pIHByaXZhdGUgcmVhZG9ubHkgX2d0YWc6IEd0YWdGblxuICApIHsgfVxuXG4gIHByaXZhdGUgdGhyb3coZXJyOiBFcnJvcikge1xuICAgIGlmICgodGhpcy5zZXR0aW5ncy5lbmFibGVUcmFjaW5nIHx8IGlzRGV2TW9kZSgpKSAmJiBjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQHRvZG8gQ2hhbmdlIHRoaXMgdG8gYE9iamVjdC5mcm9tRW50aXR5KClgIGluIHRoZSBmdXR1cmUuLi4gKi9cbiAgcHJpdmF0ZSB0b0tleVZhbHVlKG1hcDogTWFwPHN0cmluZywgYW55Pik6IHsgW3BhcmFtOiBzdHJpbmddOiBhbnkgfSB8IHZvaWQge1xuICAgIHJldHVybiAobWFwLnNpemUgPiAwKVxuICAgICAgPyBBcnJheS5mcm9tKG1hcCkucmVkdWNlKFxuICAgICAgICAob2JqLCBba2V5LCB2YWx1ZV0pID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgbmF0aXZlIEdBIFRhZ1xuICAgKi9cbiAgZ3RhZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ndGFnKC4uLmFyZ3MuZmlsdGVyKHggPT4geCAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMudGhyb3coZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCB0cmlnZ2VyIHRvIEdBLiBJdCBpcyB0aGUgc2FtZSBhcyBjYWxsOlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdldmVudCcsICd2aWRlb19hdXRvX3BsYXlfc3RhcnQnLCB7XG4gICAqICAgJ2V2ZW50X2xhYmVsJzogJ015IHByb21vdGlvbmFsIHZpZGVvJyxcbiAgICogICAnZXZlbnRfY2F0ZWdvcnknOiAndmlkZW9fYXV0b19wbGF5J1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhY3Rpb24gJ3ZpZGVvX2F1dG9fcGxheV9zdGFydCdcbiAgICogQHBhcmFtIGNhdGVnb3J5ICd2aWRlb19hdXRvX3BsYXknXG4gICAqIEBwYXJhbSBsYWJlbCAnTXkgcHJvbW90aW9uYWwgdmlkZW8nXG4gICAqIEBwYXJhbSB2YWx1ZSBBbiB2YWx1ZSB0byBtZWFzdXJlIHNvbWV0aGluZ1xuICAgKiBAcGFyYW0gaW50ZXJhY3Rpb24gSWYgdXNlciBpbnRlcmFjdGlvbiBpcyBwZXJmb3JtZWRcbiAgICovXG4gIGV2ZW50KGFjdGlvbjogR2FBY3Rpb25FbnVtIHwgc3RyaW5nLCBjYXRlZ29yeT86IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyLCBpbnRlcmFjdGlvbj86IGJvb2xlYW4sIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgIGlmIChjYXRlZ29yeSkge1xuICAgICAgICBvcHQuc2V0KCdldmVudF9jYXRlZ29yeScsIGNhdGVnb3J5KTtcbiAgICAgIH1cbiAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICBvcHQuc2V0KCdldmVudF9sYWJlbCcsIGxhYmVsKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBvcHQuc2V0KCd2YWx1ZScsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnRlcmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9wdC5zZXQoJ2ludGVyYWN0aW9uJywgaW50ZXJhY3Rpb24pO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgLmVudHJpZXMob3B0aW9ucylcbiAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IG9wdC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgfSAgICAgIFxuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy50b0tleVZhbHVlKG9wdCk7XG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZ3RhZygnZXZlbnQnLCBhY3Rpb24gYXMgc3RyaW5nLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ndGFnKCdldmVudCcsIGFjdGlvbiBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMudGhyb3coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIHBhZ2UgdmlldyBldmVudC4gVGhpcyBpcyB0aGUgc2FtZSBhc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdjb25maWcnLCAnR0FfVFJBQ0tJTkdfSUQnLCB7XG4gICAqICAgJ3BhZ2VfdGl0bGUnIDogJ0hvbWVwYWdlJyxcbiAgICogICAncGFnZV9wYXRoJzogJy9ob21lJ1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFRoZSB0cmFja2luZyBJRCBpcyBpbmplY3RlZCBhdXRvbWF0aWNhbGx5IGJ5IEluamVjdCBUb2tlbiBOR1hfR09PR0xFX0FOQUxZVElDU19TRVRUSU5HU19UT0tFTlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAvaG9tZVxuICAgKiBAcGFyYW0gdGl0bGUgSG9tZXBhZ2VcbiAgICogQHBhcmFtIGxvY2F0aW9uICd7IHBhZ2VfbG9jYXRpb24gfSdcbiAgICogQHBhcmFtIG9wdGlvbnMgJ3sgLi4uIGN1c3RvbSBkaW1lbnRpb25zIH0nXG4gICAqL1xuICBwYWdlVmlldyggcGF0aDogc3RyaW5nLCB0aXRsZT86IHN0cmluZywgbG9jYXRpb24/OiBzdHJpbmcsIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oW1sncGFnZV9wYXRoJywgcGF0aF1dKTtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICBvcHQuc2V0KCdwYWdlX3RpdGxlJywgdGl0bGUpO1xuICAgICAgfVxuICAgICAgaWYgKGxvY2F0aW9uIHx8IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgICAgb3B0LnNldCgncGFnZV9sb2NhdGlvbicsIChsb2NhdGlvbiB8fCB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIE9iamVjdFxuICAgICAgICAgIC5lbnRyaWVzKG9wdGlvbnMpXG4gICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBvcHQuc2V0KGtleSwgdmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3RhZygnY29uZmlnJywgdGhpcy5zZXR0aW5ncy50cmFja2luZ0NvZGUsIHRoaXMudG9LZXlWYWx1ZShvcHQpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCB0byByZXBvcnQgYSBBcHAgUGFnZSBWaWV3LiBJdCBpcyB0aGUgc2FtZSBhc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdldmVudCcsICdzY3JlZW5fdmlldycsIHtcbiAgICogICAnYXBwX25hbWUnOiAnbXlBcHBOYW1lJyxcbiAgICogICAnc2NyZWVuX25hbWUnIDogJ0hvbWUnXG4gICAqIH0pO1xuICAgKlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHNjcmVlbiAnc2NyZWVuX25hbWUnXG4gICAqIEBwYXJhbSBhcHBOYW1lICdhcHBfbmFtZSdcbiAgICogQHBhcmFtIGFwcElkICdhcHBfaWQnXG4gICAqIEBwYXJhbSBhcHBWZXJzaW9uICdhcHBfdmVyc2lvbidcbiAgICogQHBhcmFtIGluc3RhbGxlcklkICdhcHBfaW5zdGFsbGVyX2lkJ1xuICAgKi9cbiAgYXBwVmlldyhzY3JlZW46IHN0cmluZywgYXBwTmFtZTogc3RyaW5nLCBhcHBJZD86IHN0cmluZywgYXBwVmVyc2lvbj86IHN0cmluZywgaW5zdGFsbGVySWQ/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oW1snc2NyZWVuX25hbWUnLCBzY3JlZW5dLCBbJ2FwcF9uYW1lJywgYXBwTmFtZV1dKTtcbiAgICAgIGlmIChhcHBJZCkge1xuICAgICAgICBvcHQuc2V0KCdhcHBfaWQnLCBhcHBJZCk7XG4gICAgICB9XG4gICAgICBpZiAoYXBwVmVyc2lvbikge1xuICAgICAgICBvcHQuc2V0KCdhcHBfdmVyc2lvbicsIGFwcFZlcnNpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGluc3RhbGxlcklkKSB7XG4gICAgICAgIG9wdC5zZXQoJ2FwcF9pbnN0YWxsZXJfaWQnLCBpbnN0YWxsZXJJZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmd0YWcoJ2V2ZW50JywgJ3NjcmVlbl92aWV3JywgdGhpcy50b0tleVZhbHVlKG9wdCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMudGhyb3coZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHBlcnNpc3RlbnQgdmFsdWVzIG9uIEdvb2dsZUFuYWx5dGljc1xuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2FuYWx5dGljcy9kZXZndWlkZXMvY29sbGVjdGlvbi9ndGFnanMvc2V0dGluZy12YWx1ZXNcbiAgICpcbiAgICogYGBganNcbiAgICogZ3RhZygnc2V0Jywge1xuICAgKiAgICdjdXJyZW5jeSc6ICdVU0QnLFxuICAgKiAgICdjb3VudHJ5JzogJ1VTJ1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBzZXQoLi4ub3B0aW9uczogQXJyYXk8YW55Pikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ndGFnKCdzZXQnLCAuLi5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhpcy50aHJvdyhlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGV2ZW50IHRvIEdBIHRvIHJlcG9ydCBhbiBhcHBsaWNhdGlvbiBlcnJvci4gSXQgaXMgdGhlIHNhbWUgYXNcbiAgICpcbiAgICogYGBganNcbiAgICogZ3RhZygnZXZlbnQnLCAnZXhjZXB0aW9uJywge1xuICAgKiAgICdkZXNjcmlwdGlvbic6ICdlcnJvcl9kZXNjcmlwdGlvbicsXG4gICAqICAgJ2ZhdGFsJzogZmFsc2UgICAvLyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgZmF0YWxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gJ2Vycm9yX2Rlc2NyaXB0aW9uJ1xuICAgKiBAcGFyYW0gZmF0YWwgc2V0IHRvIHRydWUgaWYgdGhlIGVycm9yIGlzIGZhdGFsXG4gICAqL1xuICBleGNlcHRpb24oZGVzY3JpcHRpb24/OiBzdHJpbmcsIGZhdGFsPzogYm9vbGVhbikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcHQgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIG9wdC5zZXQoJ2Rlc2NyaXB0aW9uJywgZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGZhdGFsKSB7XG4gICAgICAgIG9wdC5zZXQoJ2ZhdGFsJywgZmF0YWwpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy50b0tleVZhbHVlKG9wdCk7XG4gICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZ3RhZygnZXZlbnQnLCAnZXhjZXB0aW9uJywgdGhpcy50b0tleVZhbHVlKG9wdCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ndGFnKCdldmVudCcsICdleGNlcHRpb24nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==