UNPKG

@angular/fire

Version:

The official Angular library for Firebase.

110 lines 19.2 kB
import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core'; import { EMPTY, Observable, of } from 'rxjs'; import { map, shareReplay, switchMap, tap } from 'rxjs/operators'; import { ɵapplyMixins, ɵlazySDKProxy, ɵcacheInstance } from '@angular/fire/compat'; import { FirebaseApp } from '@angular/fire/compat'; import { isPlatformBrowser } from '@angular/common'; import { proxyPolyfillCompat } from './base'; import * as i0 from "@angular/core"; import * as i1 from "@angular/fire/compat"; export const INSTRUMENTATION_ENABLED = new InjectionToken('angularfire2.performance.instrumentationEnabled'); export const DATA_COLLECTION_ENABLED = new InjectionToken('angularfire2.performance.dataCollectionEnabled'); export class AngularFirePerformance { constructor(app, instrumentationEnabled, dataCollectionEnabled, zone, // tslint:disable-next-line:ban-types platformId) { this.zone = zone; this.performance = of(undefined).pipe(switchMap(() => isPlatformBrowser(platformId) ? zone.runOutsideAngular(() => import('firebase/compat/performance')) : EMPTY), map(() => ɵcacheInstance(`performance`, 'AngularFirePerformance', app.name, () => { const performance = zone.runOutsideAngular(() => app.performance()); if (instrumentationEnabled === false) { performance.instrumentationEnabled = false; } if (dataCollectionEnabled === false) { performance.dataCollectionEnabled = false; } return performance; }, [instrumentationEnabled, dataCollectionEnabled])), shareReplay({ bufferSize: 1, refCount: false })); return ɵlazySDKProxy(this, this.performance, zone); } } AngularFirePerformance.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.3", ngImport: i0, type: AngularFirePerformance, deps: [{ token: i1.FirebaseApp }, { token: INSTRUMENTATION_ENABLED, optional: true }, { token: DATA_COLLECTION_ENABLED, optional: true }, { token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); AngularFirePerformance.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.3", ngImport: i0, type: AngularFirePerformance, providedIn: 'any' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.3", ngImport: i0, type: AngularFirePerformance, decorators: [{ type: Injectable, args: [{ providedIn: 'any' }] }], ctorParameters: function () { return [{ type: i1.FirebaseApp }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [INSTRUMENTATION_ENABLED] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_COLLECTION_ENABLED] }] }, { type: i0.NgZone }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; } }); const trace$ = (traceId) => { var _a; if (typeof window !== 'undefined' && ((_a = window.performance) === null || _a === void 0 ? void 0 : _a.mark)) { const entries = window.performance.getEntriesByName(traceId, 'measure') || []; const startMarkName = `_${traceId}Start[${entries.length}]`; const endMarkName = `_${traceId}End[${entries.length}]`; return new Observable(emitter => { window.performance.mark(startMarkName); emitter.next(); return { unsubscribe: () => { window.performance.mark(endMarkName); window.performance.measure(traceId, startMarkName, endMarkName); } }; }); } else { return EMPTY; } }; export const traceUntil = (name, test, options) => (source$) => new Observable(subscriber => { const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap(a => test(a) && traceSubscription.unsubscribe(), () => { }, () => options && options.orComplete && traceSubscription.unsubscribe())).subscribe(subscriber); }); export const traceWhile = (name, test, options) => (source$) => new Observable(subscriber => { let traceSubscription; return source$.pipe(tap(a => { if (test(a)) { traceSubscription = traceSubscription || trace$(name).subscribe(); } else { if (traceSubscription) { traceSubscription.unsubscribe(); } traceSubscription = undefined; } }, () => { }, () => options && options.orComplete && traceSubscription && traceSubscription.unsubscribe())).subscribe(subscriber); }); export const traceUntilComplete = (name) => (source$) => new Observable(subscriber => { const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap(() => { }, () => { }, () => traceSubscription.unsubscribe())).subscribe(subscriber); }); export const traceUntilFirst = (name) => (source$) => new Observable(subscriber => { const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap(() => traceSubscription.unsubscribe(), () => { }, () => { })).subscribe(subscriber); }); export const trace = (name) => (source$) => new Observable(subscriber => { const traceSubscription = trace$(name).subscribe(); return source$.pipe(tap(() => traceSubscription.unsubscribe(), () => { }, () => traceSubscription.unsubscribe())).subscribe(subscriber); }); ɵapplyMixins(AngularFirePerformance, [proxyPolyfillCompat]); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyZm9ybWFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcGF0L3BlcmZvcm1hbmNlL3BlcmZvcm1hbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBaUIsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7O0FBRTdDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLElBQUksY0FBYyxDQUFVLGlEQUFpRCxDQUFDLENBQUM7QUFDdEgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxjQUFjLENBQVUsZ0RBQWdELENBQUMsQ0FBQztBQVFySCxNQUFNLE9BQU8sc0JBQXNCO0lBSWpDLFlBQ0UsR0FBZ0IsRUFDNkIsc0JBQXNDLEVBQ3RDLHFCQUFxQyxFQUMxRSxJQUFZO0lBQ3BCLHFDQUFxQztJQUNoQixVQUFrQjtRQUYvQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBS3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDbkMsU0FBUyxDQUFDLEdBQUcs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QUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUNqQixHQUFHLENBQ0QsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLEVBQ3JDLEdBQUcsRUFBRTtJQUNMLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FDdEMsQ0FDRixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMsQ0FBQztBQUVILFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE5nWm9uZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvY29tcGF0L2FwcCc7XG5pbXBvcnQgeyDJtWFwcGx5TWl4aW5zLCDJtWxhenlTREtQcm94eSwgybVQcm9taXNlUHJveHksIMm1Y2FjaGVJbnN0YW5jZSB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvY29tcGF0JztcbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9jb21wYXQnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgcHJveHlQb2x5ZmlsbENvbXBhdCB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBJTlNUUlVNRU5UQVRJT05fRU5BQkxFRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignYW5ndWxhcmZpcmUyLnBlcmZvcm1hbmNlLmluc3RydW1lbnRhdGlvbkVuYWJsZWQnKTtcbmV4cG9ydCBjb25zdCBEQVRBX0NPTExFQ1RJT05fRU5BQkxFRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignYW5ndWxhcmZpcmUyLnBlcmZvcm1hbmNlLmRhdGFDb2xsZWN0aW9uRW5hYmxlZCcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFuZ3VsYXJGaXJlUGVyZm9ybWFuY2UgZXh0ZW5kcyDJtVByb21pc2VQcm94eTxmaXJlYmFzZS5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZT4ge1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdhbnknXG59KVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGaXJlUGVyZm9ybWFuY2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVyZm9ybWFuY2U6IE9ic2VydmFibGU8ZmlyZWJhc2UucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFwcDogRmlyZWJhc2VBcHAsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChJTlNUUlVNRU5UQVRJT05fRU5BQkxFRCkgaW5zdHJ1bWVudGF0aW9uRW5hYmxlZDogYm9vbGVhbiB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChEQVRBX0NPTExFQ1RJT05fRU5BQkxFRCkgZGF0YUNvbGxlY3Rpb25FbmFibGVkOiBib29sZWFuIHwgbnVsbCxcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YmFuLXR5cGVzXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogT2JqZWN0XG4gICkge1xuXG4gICAgdGhpcy5wZXJmb3JtYW5jZSA9IG9mKHVuZGVmaW5lZCkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSA/IHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gaW1wb3J0KCdmaXJlYmFzZS9jb21wYXQvcGVyZm9ybWFuY2UnKSkgOiBFTVBUWSksXG4gICAgICBtYXAoKCkgPT4gybVjYWNoZUluc3RhbmNlKGBwZXJmb3JtYW5jZWAsICdBbmd1bGFyRmlyZVBlcmZvcm1hbmNlJywgYXBwLm5hbWUsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyZm9ybWFuY2UgPSB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IGFwcC5wZXJmb3JtYW5jZSgpKTtcbiAgICAgICAgaWYgKGluc3RydW1lbnRhdGlvbkVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcGVyZm9ybWFuY2UuaW5zdHJ1bWVudGF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhQ29sbGVjdGlvbkVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcGVyZm9ybWFuY2UuZGF0YUNvbGxlY3Rpb25FbmFibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlO1xuICAgICAgfSwgW2luc3RydW1lbnRhdGlvbkVuYWJsZWQsIGRhdGFDb2xsZWN0aW9uRW5hYmxlZF0pKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IGZhbHNlIH0pXG4gICAgKTtcblxuICAgIHJldHVybiDJtWxhenlTREtQcm94eSh0aGlzLCB0aGlzLnBlcmZvcm1hbmNlLCB6b25lKTtcblxuICB9XG5cbn1cblxuY29uc3QgdHJhY2UkID0gKHRyYWNlSWQ6IHN0cmluZykgPT4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnBlcmZvcm1hbmNlPy5tYXJrKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHdpbmRvdy5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHRyYWNlSWQsICdtZWFzdXJlJykgfHwgW107XG4gICAgY29uc3Qgc3RhcnRNYXJrTmFtZSA9IGBfJHt0cmFjZUlkfVN0YXJ0WyR7ZW50cmllcy5sZW5ndGh9XWA7XG4gICAgY29uc3QgZW5kTWFya05hbWUgPSBgXyR7dHJhY2VJZH1FbmRbJHtlbnRyaWVzLmxlbmd0aH1dYDtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dm9pZD4oZW1pdHRlciA9PiB7XG4gICAgICB3aW5kb3cucGVyZm9ybWFuY2UubWFyayhzdGFydE1hcmtOYW1lKTtcbiAgICAgIGVtaXR0ZXIubmV4dCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICB3aW5kb3cucGVyZm9ybWFuY2UubWFyayhlbmRNYXJrTmFtZSk7XG4gICAgICAgICAgd2luZG93LnBlcmZvcm1hbmNlLm1lYXN1cmUodHJhY2VJZCwgc3RhcnRNYXJrTmFtZSwgZW5kTWFya05hbWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBFTVBUWTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHRyYWNlVW50aWwgPSA8VCA9IGFueT4oXG4gIG5hbWU6IHN0cmluZyxcbiAgdGVzdDogKGE6IFQpID0+IGJvb2xlYW4sXG4gIG9wdGlvbnM/OiB7IG9yQ29tcGxldGU/OiBib29sZWFuIH1cbikgPT4gKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICBjb25zdCB0cmFjZVN1YnNjcmlwdGlvbiA9IHRyYWNlJChuYW1lKS5zdWJzY3JpYmUoKTtcbiAgcmV0dXJuIHNvdXJjZSQucGlwZShcbiAgICB0YXAoXG4gICAgICBhID0+IHRlc3QoYSkgJiYgdHJhY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSxcbiAgICAgICgpID0+IHtcbiAgICAgIH0sXG4gICAgICAoKSA9PiBvcHRpb25zICYmIG9wdGlvbnMub3JDb21wbGV0ZSAmJiB0cmFjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgKVxuICApLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgdHJhY2VXaGlsZSA9IDxUID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICB0ZXN0OiAoYTogVCkgPT4gYm9vbGVhbixcbiAgb3B0aW9ucz86IHsgb3JDb21wbGV0ZT86IGJvb2xlYW4gfVxuKSA9PiAoc291cmNlJDogT2JzZXJ2YWJsZTxUPikgPT4gbmV3IE9ic2VydmFibGU8VD4oc3Vic2NyaWJlciA9PiB7XG4gIGxldCB0cmFjZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gc291cmNlJC5waXBlKFxuICAgIHRhcChcbiAgICAgIGEgPT4ge1xuICAgICAgICBpZiAodGVzdChhKSkge1xuICAgICAgICAgIHRyYWNlU3Vic2NyaXB0aW9uID0gdHJhY2VTdWJzY3JpcHRpb24gfHwgdHJhY2UkKG5hbWUpLnN1YnNjcmliZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0cmFjZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdHJhY2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cmFjZVN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgIH0sXG4gICAgICAoKSA9PiBvcHRpb25zICYmIG9wdGlvbnMub3JDb21wbGV0ZSAmJiB0cmFjZVN1YnNjcmlwdGlvbiAmJiB0cmFjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgKVxuICApLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgdHJhY2VVbnRpbENvbXBsZXRlID0gPFQgPSBhbnk+KG5hbWU6IHN0cmluZykgPT4gKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICBjb25zdCB0cmFjZVN1YnNjcmlwdGlvbiA9IHRyYWNlJChuYW1lKS5zdWJzY3JpYmUoKTtcbiAgcmV0dXJuIHNvdXJjZSQucGlwZShcbiAgICB0YXAoXG4gICAgICAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgfSxcbiAgICAgICgpID0+IHRyYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICApXG4gICkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xufSk7XG5cbmV4cG9ydCBjb25zdCB0cmFjZVVudGlsRmlyc3QgPSA8VCA9IGFueT4obmFtZTogc3RyaW5nKSA9PiAoc291cmNlJDogT2JzZXJ2YWJsZTxUPikgPT4gbmV3IE9ic2VydmFibGU8VD4oc3Vic2NyaWJlciA9PiB7XG4gIGNvbnN0IHRyYWNlU3Vic2NyaXB0aW9uID0gdHJhY2UkKG5hbWUpLnN1YnNjcmliZSgpO1xuICByZXR1cm4gc291cmNlJC5waXBlKFxuICAgIHRhcChcbiAgICAgICgpID0+IHRyYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksXG4gICAgICAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgfVxuICAgIClcbiAgKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG59KTtcblxuZXhwb3J0IGNvbnN0IHRyYWNlID0gPFQgPSBhbnk+KG5hbWU6IHN0cmluZykgPT4gKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IG5ldyBPYnNlcnZhYmxlPFQ+KHN1YnNjcmliZXIgPT4ge1xuICBjb25zdCB0cmFjZVN1YnNjcmlwdGlvbiA9IHRyYWNlJChuYW1lKS5zdWJzY3JpYmUoKTtcbiAgcmV0dXJuIHNvdXJjZSQucGlwZShcbiAgICB0YXAoXG4gICAgICAoKSA9PiB0cmFjZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLFxuICAgICAgKCkgPT4ge1xuICAgICAgfSxcbiAgICAgICgpID0+IHRyYWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICApXG4gICkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xufSk7XG5cbsm1YXBwbHlNaXhpbnMoQW5ndWxhckZpcmVQZXJmb3JtYW5jZSwgW3Byb3h5UG9seWZpbGxDb21wYXRdKTtcbiJdfQ==