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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QUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFJLE1BQU07MkJBQUMsbUNBQW1DOzswQkFDMUMsTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4gfSBmcm9tICcuLi90b2tlbnMvbmd4LWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MtdG9rZW4nO1xuaW1wb3J0IHsgSUdvb2dsZUFuYWx5dGljc1NldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pLWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MnO1xuaW1wb3J0IHsgR2FBY3Rpb25FbnVtIH0gZnJvbSAnLi4vZW51bXMvZ2EtYWN0aW9uLmVudW0nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTkdYX0dUQUdfRk4gfSBmcm9tICcuLi90b2tlbnMvbmd4LWd0YWctdG9rZW4nO1xuaW1wb3J0IHsgR3RhZ0ZuIH0gZnJvbSAnLi4vdHlwZXMvZ3RhZy50eXBlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR29vZ2xlQW5hbHl0aWNzU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBnZXQgZG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9kb2N1bWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4pIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IElHb29nbGVBbmFseXRpY3NTZXR0aW5ncyxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudDogYW55LFxuICAgIEBJbmplY3QoTkdYX0dUQUdfRk4pIHByaXZhdGUgcmVhZG9ubHkgX2d0YWc6IEd0YWdGblxuICApIHsgfVxuXG4gIHByaXZhdGUgdGhyb3coZXJyOiBFcnJvcikge1xuICAgIGlmICgodGhpcy5zZXR0aW5ncy5lbmFibGVUcmFjaW5nIHx8IGlzRGV2TW9kZSgpKSAmJiBjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQHRvZG8gQ2hhbmdlIHRoaXMgdG8gYE9iamVjdC5mcm9tRW50aXR5KClgIGluIHRoZSBmdXR1cmUuLi4gKi9cbiAgcHJpdmF0ZSB0b0tleVZhbHVlKG1hcDogTWFwPHN0cmluZywgYW55Pik6IHsgW3BhcmFtOiBzdHJpbmddOiBhbnkgfSB8IHZvaWQge1xuICAgIHJldHVybiAobWFwLnNpemUgPiAwKVxuICAgICAgPyBBcnJheS5mcm9tKG1hcCkucmVkdWNlKFxuICAgICAgICAob2JqLCBba2V5LCB2YWx1ZV0pID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgbmF0aXZlIEdBIFRhZ1xuICAgKi9cbiAgZ3RhZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ndGFnKC4uLmFyZ3MuZmlsdGVyKHggPT4geCAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnRocm93KGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZXZlbnQgdHJpZ2dlciB0byBHQS4gSXQgaXMgdGhlIHNhbWUgYXMgY2FsbDpcbiAgICogYGBganNcbiAgICogZ3RhZygnZXZlbnQnLCAndmlkZW9fYXV0b19wbGF5X3N0YXJ0Jywge1xuICAgKiAgICdldmVudF9sYWJlbCc6ICdNeSBwcm9tb3Rpb25hbCB2aWRlbycsXG4gICAqICAgJ2V2ZW50X2NhdGVnb3J5JzogJ3ZpZGVvX2F1dG9fcGxheSdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uICd2aWRlb19hdXRvX3BsYXlfc3RhcnQnXG4gICAqIEBwYXJhbSBjYXRlZ29yeSAndmlkZW9fYXV0b19wbGF5J1xuICAgKiBAcGFyYW0gbGFiZWwgJ015IHByb21vdGlvbmFsIHZpZGVvJ1xuICAgKiBAcGFyYW0gdmFsdWUgQW4gdmFsdWUgdG8gbWVhc3VyZSBzb21ldGhpbmdcbiAgICogQHBhcmFtIGludGVyYWN0aW9uIElmIHVzZXIgaW50ZXJhY3Rpb24gaXMgcGVyZm9ybWVkXG4gICAqL1xuICBldmVudChhY3Rpb246IEdhQWN0aW9uRW51bSB8IHN0cmluZywgY2F0ZWdvcnk/OiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nLCB2YWx1ZT86IG51bWJlciwgaW50ZXJhY3Rpb24/OiBib29sZWFuLCBvcHRpb25zPzogT2JqZWN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wdCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcbiAgICAgICAgb3B0LnNldCgnZXZlbnRfY2F0ZWdvcnknLCBjYXRlZ29yeSk7XG4gICAgICB9XG4gICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgb3B0LnNldCgnZXZlbnRfbGFiZWwnLCBsYWJlbCk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgb3B0LnNldCgndmFsdWUnLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoaW50ZXJhY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvcHQuc2V0KCdpbnRlcmFjdGlvbicsIGludGVyYWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIE9iamVjdFxuICAgICAgICAgIC5lbnRyaWVzKG9wdGlvbnMpXG4gICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBvcHQuc2V0KGtleSwgdmFsdWUpKTtcbiAgICAgIH0gICAgICBcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMudG9LZXlWYWx1ZShvcHQpO1xuICAgICAgaWYgKHBhcmFtcykge1xuICAgICAgICB0aGlzLmd0YWcoJ2V2ZW50JywgYWN0aW9uIGFzIHN0cmluZywgcGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ3RhZygnZXZlbnQnLCBhY3Rpb24gYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy50aHJvdyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gcGFnZSB2aWV3IGV2ZW50LiBUaGlzIGlzIHRoZSBzYW1lIGFzXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGd0YWcoJ2NvbmZpZycsICdHQV9UUkFDS0lOR19JRCcsIHtcbiAgICogICAncGFnZV90aXRsZScgOiAnSG9tZXBhZ2UnLFxuICAgKiAgICdwYWdlX3BhdGgnOiAnL2hvbWUnXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogVGhlIHRyYWNraW5nIElEIGlzIGluamVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgSW5qZWN0IFRva2VuIE5HWF9HT09HTEVfQU5BTFlUSUNTX1NFVFRJTkdTX1RPS0VOXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC9ob21lXG4gICAqIEBwYXJhbSB0aXRsZSBIb21lcGFnZVxuICAgKiBAcGFyYW0gbG9jYXRpb24gJ3sgcGFnZV9sb2NhdGlvbiB9J1xuICAgKiBAcGFyYW0gb3B0aW9ucyAneyAuLi4gY3VzdG9tIGRpbWVudGlvbnMgfSdcbiAgICovXG4gIHBhZ2VWaWV3KCBwYXRoOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nLCBsb2NhdGlvbj86IHN0cmluZywgb3B0aW9ucz86IE9iamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcHQgPSBuZXcgTWFwPHN0cmluZywgYW55PihbWydwYWdlX3BhdGgnLCBwYXRoXV0pO1xuICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgIG9wdC5zZXQoJ3BhZ2VfdGl0bGUnLCB0aXRsZSk7XG4gICAgICB9XG4gICAgICBpZiAobG9jYXRpb24gfHwgdGhpcy5kb2N1bWVudCkge1xuICAgICAgICBvcHQuc2V0KCdwYWdlX2xvY2F0aW9uJywgKGxvY2F0aW9uIHx8IHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgLmVudHJpZXMob3B0aW9ucylcbiAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IG9wdC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgdGhpcy5ndGFnKCdjb25maWcnLCB0aGlzLnNldHRpbmdzLnRyYWNraW5nQ29kZSwgdGhpcy50b0tleVZhbHVlKG9wdCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudCB0byByZXBvcnQgYSBBcHAgUGFnZSBWaWV3LiBJdCBpcyB0aGUgc2FtZSBhc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdldmVudCcsICdzY3JlZW5fdmlldycsIHtcbiAgICogICAnYXBwX25hbWUnOiAnbXlBcHBOYW1lJyxcbiAgICogICAnc2NyZWVuX25hbWUnIDogJ0hvbWUnXG4gICAqIH0pO1xuICAgKlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHNjcmVlbiAnc2NyZWVuX25hbWUnXG4gICAqIEBwYXJhbSBhcHBOYW1lICdhcHBfbmFtZSdcbiAgICogQHBhcmFtIGFwcElkICdhcHBfaWQnXG4gICAqIEBwYXJhbSBhcHBWZXJzaW9uICdhcHBfdmVyc2lvbidcbiAgICogQHBhcmFtIGluc3RhbGxlcklkICdhcHBfaW5zdGFsbGVyX2lkJ1xuICAgKi9cbiAgYXBwVmlldyhzY3JlZW46IHN0cmluZywgYXBwTmFtZTogc3RyaW5nLCBhcHBJZD86IHN0cmluZywgYXBwVmVyc2lvbj86IHN0cmluZywgaW5zdGFsbGVySWQ/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3B0ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oW1snc2NyZWVuX25hbWUnLCBzY3JlZW5dLCBbJ2FwcF9uYW1lJywgYXBwTmFtZV1dKTtcbiAgICAgIGlmIChhcHBJZCkge1xuICAgICAgICBvcHQuc2V0KCdhcHBfaWQnLCBhcHBJZCk7XG4gICAgICB9XG4gICAgICBpZiAoYXBwVmVyc2lvbikge1xuICAgICAgICBvcHQuc2V0KCdhcHBfdmVyc2lvbicsIGFwcFZlcnNpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGluc3RhbGxlcklkKSB7XG4gICAgICAgIG9wdC5zZXQoJ2FwcF9pbnN0YWxsZXJfaWQnLCBpbnN0YWxsZXJJZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmd0YWcoJ2V2ZW50JywgJ3NjcmVlbl92aWV3JywgdGhpcy50b0tleVZhbHVlKG9wdCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBwZXJzaXN0ZW50IHZhbHVlcyBvbiBHb29nbGVBbmFseXRpY3NcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9hbmFseXRpY3MvZGV2Z3VpZGVzL2NvbGxlY3Rpb24vZ3RhZ2pzL3NldHRpbmctdmFsdWVzXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGd0YWcoJ3NldCcsIHtcbiAgICogICAnY3VycmVuY3knOiAnVVNEJyxcbiAgICogICAnY291bnRyeSc6ICdVUydcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0KC4uLm9wdGlvbnM6IEFycmF5PGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZ3RhZygnc2V0JywgLi4ub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnRocm93KGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZXZlbnQgdG8gR0EgdG8gcmVwb3J0IGFuIGFwcGxpY2F0aW9uIGVycm9yLiBJdCBpcyB0aGUgc2FtZSBhc1xuICAgKlxuICAgKiBgYGBqc1xuICAgKiBndGFnKCdldmVudCcsICdleGNlcHRpb24nLCB7XG4gICAqICAgJ2Rlc2NyaXB0aW9uJzogJ2Vycm9yX2Rlc2NyaXB0aW9uJyxcbiAgICogICAnZmF0YWwnOiBmYWxzZSAgIC8vIHNldCB0byB0cnVlIGlmIHRoZSBlcnJvciBpcyBmYXRhbFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAnZXJyb3JfZGVzY3JpcHRpb24nXG4gICAqIEBwYXJhbSBmYXRhbCBzZXQgdG8gdHJ1ZSBpZiB0aGUgZXJyb3IgaXMgZmF0YWxcbiAgICovXG4gIGV4Y2VwdGlvbihkZXNjcmlwdGlvbj86IHN0cmluZywgZmF0YWw/OiBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wdCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgb3B0LnNldCgnZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoZmF0YWwpIHtcbiAgICAgICAgb3B0LnNldCgnZmF0YWwnLCBmYXRhbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLnRvS2V5VmFsdWUob3B0KTtcbiAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5ndGFnKCdldmVudCcsICdleGNlcHRpb24nLCB0aGlzLnRvS2V5VmFsdWUob3B0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmd0YWcoJ2V2ZW50JywgJ2V4Y2VwdGlvbicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==