@dbg-riskit/angular-view
Version:
157 lines • 19.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { CONTENT_TYPE } from '@dbg-riskit/common';
import { BehaviorSubject } from 'rxjs';
import { filter } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@dbg-riskit/common";
/**
* Class instances emitted [to observers] for each mql notification
*/
export class MediaChange {
constructor(mediaQuery = 'all') {
this.mediaQuery = mediaQuery;
}
}
/**
* MediaMonitor configures listeners to mediaQuery changes and publishes an Observable facade to
* convert mediaQuery change callbacks to subscriber notifications. These notifications will be
* performed within the ng Zone to trigger change detections and component updates.
*
* NOTE: both mediaQuery activations and de-activations are announced in notifications
*/
export class MatchMedia {
constructor(ngZone, logger) {
this.ngZone = ngZone;
this.logger = logger;
this._registry = new Map();
this._source = new BehaviorSubject(new MediaChange());
this._observable$ = this._source.asObservable();
}
/**
* For the specified mediaQuery?
*/
isActive(mediaQuery) {
if (this._registry.has(mediaQuery)) {
const mql = this._registry.get(mediaQuery);
return mql.matches;
}
return false;
}
/**
* External observers can watch for all (or a specific) mql changes.
* Typically used by the MediaQueryAdaptor; optionally available to components
* who wish to use the MediaMonitor as mediaMonitor$ observable service.
*
* NOTE: if a mediaQuery is not specified, then ALL mediaQuery activations will
* be announced.
*/
observe(mediaQuery) {
this.registerQuery(mediaQuery);
return this._observable$.pipe(filter((change) => {
return mediaQuery ? (change.mediaQuery === mediaQuery) : true;
}));
}
/**
* Based on the BreakPointRegistry provider, register internal listeners for each unique
* mediaQuery. Each listener emits specific MediaChange data to observers
*/
registerQuery(mediaQuery) {
const list = normalizeQuery(mediaQuery);
if (list.length > 0) {
prepareQueryCSS(list, this.logger);
list.forEach((query) => {
let mql = this._registry.get(query);
const onMQLEvent = () => {
this.ngZone.run(() => {
const change = new MediaChange(query);
this._source.next(change);
});
};
if (!mql) {
mql = this._buildMQL(query);
mql.addEventListener('change', onMQLEvent);
this._registry.set(query, mql);
}
if (mql.matches) {
onMQLEvent(); // Announce activate range for initial subscribers
}
});
}
}
/**
* Call window.matchMedia() to build a MediaQueryList; which
* supports 0..n listeners for activation/deactivation
*/
_buildMQL(query) {
const canListen = !!window.matchMedia('all').addEventListener;
return canListen ? window.matchMedia(query) : {
matches: query === 'all' || query === '',
media: query,
addListener: () => undefined,
addEventListener: () => undefined,
removeListener: () => undefined,
removeEventListener: () => undefined,
dispatchEvent: () => false,
onchange: () => undefined
};
}
}
MatchMedia.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: MatchMedia, deps: [{ token: i0.NgZone }, { token: i1.Logger }], target: i0.ɵɵFactoryTarget.Injectable });
MatchMedia.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: MatchMedia });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: MatchMedia, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i1.Logger }]; } });
/**
* Private global registry for all dynamically-created, injected style tags
* @see prepare(query)
*/
const ALL_STYLES = {};
/**
* For Webkit engines that only trigger the MediaQueryList Listener
* when there is at least one CSS selector for the respective media query.
*
* @param mediaQueries string[] The mediaQueries used to create a faux CSS selector
*
*/
function prepareQueryCSS(mediaQueries, logger) {
const list = mediaQueries.filter((it) => !ALL_STYLES[it]);
if (list.length > 0) {
const query = list.join(', ');
try {
const style = document.createElement('style');
style.setAttribute('type', CONTENT_TYPE.TEXT_CSS);
// Older IEs
if (!style.styleSheet) {
const cssText = `/*
@angular/flex-layout - workaround for possible browser quirk with mediaQuery listeners
see http://bit.ly/2sd4HMP
*/
@media ${query} {.fx-query-test{ }}`;
style.appendChild(document.createTextNode(cssText));
}
document.getElementsByTagName('head')[0].appendChild(style);
// Store in private global registry
list.forEach((mq) => ALL_STYLES[mq] = style);
}
catch (e) {
logger.error(e);
}
}
}
/**
* Always convert to unique list of queries; for iteration in ::registerQuery()
*/
function normalizeQuery(mediaQuery) {
return (typeof mediaQuery === 'undefined') ? [] :
(typeof mediaQuery === 'string') ? [mediaQuery] : unique(mediaQuery);
}
/**
* Filter duplicate mediaQueries in the list
*/
function unique(list) {
const seen = {};
return list.filter((item) => {
return seen.hasOwnProperty(item) ? false : (seen[item] = true);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2gubWVkaWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wa2cvZGJnLXJpc2tpdC9hbmd1bGFyLXZpZXcvc3JjL2xpYi9tYXRjaC5tZWRpYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQVMsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBRXRDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFDcEIsWUFBbUMsYUFBYSxLQUFLO1FBQWxCLGVBQVUsR0FBVixVQUFVLENBQVE7SUFDckQsQ0FBQztDQUNKO0FBRUQ7Ozs7OztHQU1HO0FBRUgsTUFBTSxPQUFPLFVBQVU7SUFLbkIsWUFBc0MsTUFBYyxFQUNoQixNQUFjO1FBRFosV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQzlDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBYyxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVEsQ0FBQyxVQUFrQjtRQUM5QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sR0FBSSxDQUFDLE9BQU8s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LENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxJQUFjO0lBQzFCLE1BQU0sSUFBSSxHQUErQixFQUFFLENBQUM7SUFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDeEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q09OVEVOVF9UWVBFLCBMb2dnZXJ9IGZyb20gJ0BkYmctcmlza2l0L2NvbW1vbic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIENsYXNzIGluc3RhbmNlcyBlbWl0dGVkIFt0byBvYnNlcnZlcnNdIGZvciBlYWNoIG1xbCBub3RpZmljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIE1lZGlhQ2hhbmdlIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG1lZGlhUXVlcnkgPSAnYWxsJykge1xuICAgIH1cbn1cblxuLyoqXG4gKiBNZWRpYU1vbml0b3IgY29uZmlndXJlcyBsaXN0ZW5lcnMgdG8gbWVkaWFRdWVyeSBjaGFuZ2VzIGFuZCBwdWJsaXNoZXMgYW4gT2JzZXJ2YWJsZSBmYWNhZGUgdG9cbiAqIGNvbnZlcnQgbWVkaWFRdWVyeSBjaGFuZ2UgY2FsbGJhY2tzIHRvIHN1YnNjcmliZXIgbm90aWZpY2F0aW9ucy4gVGhlc2Ugbm90aWZpY2F0aW9ucyB3aWxsIGJlXG4gKiBwZXJmb3JtZWQgd2l0aGluIHRoZSBuZyBab25lIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbnMgYW5kIGNvbXBvbmVudCB1cGRhdGVzLlxuICpcbiAqIE5PVEU6IGJvdGggbWVkaWFRdWVyeSBhY3RpdmF0aW9ucyBhbmQgZGUtYWN0aXZhdGlvbnMgYXJlIGFubm91bmNlZCBpbiBub3RpZmljYXRpb25zXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNYXRjaE1lZGlhIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBNZWRpYVF1ZXJ5TGlzdD47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zb3VyY2U6IEJlaGF2aW9yU3ViamVjdDxNZWRpYUNoYW5nZT47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vYnNlcnZhYmxlJDogT2JzZXJ2YWJsZTxNZWRpYUNoYW5nZT47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gbmV3IE1hcDxzdHJpbmcsIE1lZGlhUXVlcnlMaXN0PigpO1xuICAgICAgICB0aGlzLl9zb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhQ2hhbmdlPihuZXcgTWVkaWFDaGFuZ2UoKSk7XG4gICAgICAgIHRoaXMuX29ic2VydmFibGUkID0gdGhpcy5fc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciB0aGUgc3BlY2lmaWVkIG1lZGlhUXVlcnk/XG4gICAgICovXG4gICAgcHVibGljIGlzQWN0aXZlKG1lZGlhUXVlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0cnkuaGFzKG1lZGlhUXVlcnkpKSB7XG4gICAgICAgICAgICBjb25zdCBtcWwgPSB0aGlzLl9yZWdpc3RyeS5nZXQobWVkaWFRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbXFsIS5tYXRjaGVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRlcm5hbCBvYnNlcnZlcnMgY2FuIHdhdGNoIGZvciBhbGwgKG9yIGEgc3BlY2lmaWMpIG1xbCBjaGFuZ2VzLlxuICAgICAqIFR5cGljYWxseSB1c2VkIGJ5IHRoZSBNZWRpYVF1ZXJ5QWRhcHRvcjsgb3B0aW9uYWxseSBhdmFpbGFibGUgdG8gY29tcG9uZW50c1xuICAgICAqIHdobyB3aXNoIHRvIHVzZSB0aGUgTWVkaWFNb25pdG9yIGFzIG1lZGlhTW9uaXRvciQgb2JzZXJ2YWJsZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogTk9URTogaWYgYSBtZWRpYVF1ZXJ5IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gQUxMIG1lZGlhUXVlcnkgYWN0aXZhdGlvbnMgd2lsbFxuICAgICAqICAgICAgIGJlIGFubm91bmNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb2JzZXJ2ZShtZWRpYVF1ZXJ5Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZWRpYUNoYW5nZT4ge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyUXVlcnkobWVkaWFRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX29ic2VydmFibGUkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGNoYW5nZTogTWVkaWFDaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVkaWFRdWVyeSA/IChjaGFuZ2UubWVkaWFRdWVyeSA9PT0gbWVkaWFRdWVyeSkgOiB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCYXNlZCBvbiB0aGUgQnJlYWtQb2ludFJlZ2lzdHJ5IHByb3ZpZGVyLCByZWdpc3RlciBpbnRlcm5hbCBsaXN0ZW5lcnMgZm9yIGVhY2ggdW5pcXVlXG4gICAgICogbWVkaWFRdWVyeS4gRWFjaCBsaXN0ZW5lciBlbWl0cyBzcGVjaWZpYyBNZWRpYUNoYW5nZSBkYXRhIHRvIG9ic2VydmVyc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVnaXN0ZXJRdWVyeShtZWRpYVF1ZXJ5Pzogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IG5vcm1hbGl6ZVF1ZXJ5KG1lZGlhUXVlcnkpO1xuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByZXBhcmVRdWVyeUNTUyhsaXN0LCB0aGlzLmxvZ2dlcik7XG5cbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCgocXVlcnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbXFsID0gdGhpcy5fcmVnaXN0cnkuZ2V0KHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBvbk1RTEV2ZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlID0gbmV3IE1lZGlhQ2hhbmdlKHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5uZXh0KGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIW1xbCkge1xuICAgICAgICAgICAgICAgICAgICBtcWwgPSB0aGlzLl9idWlsZE1RTChxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbk1RTEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0cnkuc2V0KHF1ZXJ5LCBtcWwpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtcWwubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICBvbk1RTEV2ZW50KCk7ICAvLyBBbm5vdW5jZSBhY3RpdmF0ZSByYW5nZSBmb3IgaW5pdGlhbCBzdWJzY3JpYmVyc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB3aW5kb3cubWF0Y2hNZWRpYSgpIHRvIGJ1aWxkIGEgTWVkaWFRdWVyeUxpc3Q7IHdoaWNoXG4gICAgICogc3VwcG9ydHMgMC4ubiBsaXN0ZW5lcnMgZm9yIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9idWlsZE1RTChxdWVyeTogc3RyaW5nKTogTWVkaWFRdWVyeUxpc3Qge1xuICAgICAgICBjb25zdCBjYW5MaXN0ZW4gPSAhIXdpbmRvdy5tYXRjaE1lZGlhKCdhbGwnKS5hZGRFdmVudExpc3RlbmVyO1xuICAgICAgICByZXR1cm4gY2FuTGlzdGVuID8gd2luZG93Lm1hdGNoTWVkaWEocXVlcnkpIDoge1xuICAgICAgICAgICAgbWF0Y2hlcyAgICAgICAgICAgIDogcXVlcnkgPT09ICdhbGwnIHx8IHF1ZXJ5ID09PSAnJyxcbiAgICAgICAgICAgIG1lZGlhICAgICAgICAgICAgICA6IHF1ZXJ5LFxuICAgICAgICAgICAgYWRkTGlzdGVuZXIgICAgICAgIDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lciAgIDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIgICAgIDogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCAgICAgIDogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICBvbmNoYW5nZSAgICAgICAgICAgOiAoKSA9PiB1bmRlZmluZWRcbiAgICAgICAgfSBhcyBNZWRpYVF1ZXJ5TGlzdDtcbiAgICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBnbG9iYWwgcmVnaXN0cnkgZm9yIGFsbCBkeW5hbWljYWxseS1jcmVhdGVkLCBpbmplY3RlZCBzdHlsZSB0YWdzXG4gKiBAc2VlIHByZXBhcmUocXVlcnkpXG4gKi9cbmNvbnN0IEFMTF9TVFlMRVM6IHsgW2tleTogc3RyaW5nXTogSFRNTFN0eWxlRWxlbWVudCB9ID0ge307XG5cbi8qKlxuICogRm9yIFdlYmtpdCBlbmdpbmVzIHRoYXQgb25seSB0cmlnZ2VyIHRoZSBNZWRpYVF1ZXJ5TGlzdCBMaXN0ZW5lclxuICogd2hlbiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgcmVzcGVjdGl2ZSBtZWRpYSBxdWVyeS5cbiAqXG4gKiBAcGFyYW0gbWVkaWFRdWVyaWVzIHN0cmluZ1tdIFRoZSBtZWRpYVF1ZXJpZXMgdXNlZCB0byBjcmVhdGUgYSBmYXV4IENTUyBzZWxlY3RvclxuICpcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZVF1ZXJ5Q1NTKG1lZGlhUXVlcmllczogc3RyaW5nW10sIGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgY29uc3QgbGlzdCA9IG1lZGlhUXVlcmllcy5maWx0ZXIoKGl0KSA9PiAhQUxMX1NUWUxFU1tpdF0pO1xuICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBsaXN0LmpvaW4oJywgJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cbiAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsIENPTlRFTlRfVFlQRS5URVhUX0NTUyk7XG4gICAgICAgICAgICAvLyBPbGRlciBJRXNcbiAgICAgICAgICAgIGlmICghKHN0eWxlIGFzIGFueSkuc3R5bGVTaGVldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNzc1RleHQgPSBgLypcbiAgQGFuZ3VsYXIvZmxleC1sYXlvdXQgLSB3b3JrYXJvdW5kIGZvciBwb3NzaWJsZSBicm93c2VyIHF1aXJrIHdpdGggbWVkaWFRdWVyeSBsaXN0ZW5lcnNcbiAgc2VlIGh0dHA6Ly9iaXQubHkvMnNkNEhNUFxuKi9cbkBtZWRpYSAke3F1ZXJ5fSB7LmZ4LXF1ZXJ5LXRlc3R7IH19YDtcbiAgICAgICAgICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NUZXh0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gICAgICAgICAgICAvLyBTdG9yZSBpbiBwcml2YXRlIGdsb2JhbCByZWdpc3RyeVxuICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChtcSkgPT4gQUxMX1NUWUxFU1ttcV0gPSBzdHlsZSk7XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFsd2F5cyBjb252ZXJ0IHRvIHVuaXF1ZSBsaXN0IG9mIHF1ZXJpZXM7IGZvciBpdGVyYXRpb24gaW4gOjpyZWdpc3RlclF1ZXJ5KClcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUXVlcnkobWVkaWFRdWVyeT86IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiAodHlwZW9mIG1lZGlhUXVlcnkgPT09ICd1bmRlZmluZWQnKSA/IFtdIDpcbiAgICAgICAgKHR5cGVvZiBtZWRpYVF1ZXJ5ID09PSAnc3RyaW5nJykgPyBbbWVkaWFRdWVyeV0gOiB1bmlxdWUobWVkaWFRdWVyeSk7XG59XG5cbi8qKlxuICogRmlsdGVyIGR1cGxpY2F0ZSBtZWRpYVF1ZXJpZXMgaW4gdGhlIGxpc3RcbiAqL1xuZnVuY3Rpb24gdW5pcXVlKGxpc3Q6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlZW46IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBzZWVuLmhhc093blByb3BlcnR5KGl0ZW0pID8gZmFsc2UgOiAoc2VlbltpdGVtXSA9IHRydWUpO1xuICAgIH0pO1xufVxuIl19