@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
172 lines • 19.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { isCodeError } from '@iotize/common/error';
import { TapError } from '@iotize/tap';
import { BehaviorSubject } from 'rxjs';
import { distinctUntilChanged, filter, first, map } from 'rxjs/operators';
import { debug } from '../logger';
import { TapInfoConfigService } from './tap-info-config.service';
import { createCacheKey, toTapInfoKeyObject } from './utility';
import * as i0 from "@angular/core";
import * as i1 from "./tap-info-config.service";
const TAG = 'TapInfoCacheService';
/**
* Will be renamed as TapConfigSyncService
*/
export class TapInfoCacheService {
tapInfoConfigService;
/**
* Observables of infos
*/
_infoChange = {};
constructor(tapInfoConfigService) {
this.tapInfoConfigService = tapInfoConfigService;
}
/**
* Subscribe to value change. Will be notified each time value for the given key changes
* @param key
* @returns
*/
valueChange(key) {
return this.infoChange(key).pipe(filter((v) => !v.error && v.value !== undefined), map((v) => {
return v.value;
}), distinctUntilChanged());
}
/**
* If value has already been loaded, it will be returned otherwise it will wait for a value to be resolved
* @param info
* @returns
*/
value(info) {
return this.valueChange(info).pipe(first()).toPromise(); // TODO fix type
}
infoChange(key) {
return this._createInfoObservableIfRequired(toTapInfoKeyObject(key));
}
clearKeys(keys) {
keys.forEach((key) => {
this.clearKey(key);
});
}
getInfoSnapshot(key) {
return this._infoChange[createCacheKey(toTapInfoKeyObject(key))]?.value;
}
clearKey(key) {
const objectKey = toTapInfoKeyObject(key);
if (this.isInfoLoaded(objectKey)) {
const cacheKey = createCacheKey(objectKey);
debug(TAG, `clear key "${cacheKey}"`);
// delete this._info[cacheKey];
this._infoChange[cacheKey]?.next({
loadDate: undefined,
});
}
}
reset() {
Object.keys(this._infoChange).forEach((key) => {
this.clearKey(key);
});
// this._info = {};
}
/**
* Return true if value has been loaded, even if it has errors
*/
isInfoLoaded(key) {
const cacheKey = createCacheKey(toTapInfoKeyObject(key));
return this._infoChange[cacheKey]?.value.loadDate !== undefined;
}
/**
* Returns true if value has been loaded.
*/
isValueLoaded(key) {
const valueHolder = this.getInfoSnapshot(key);
if (!valueHolder) {
return;
}
return (valueHolder.value !== undefined ||
(valueHolder.error &&
isCodeError(TapError.Code.ResponseStatusError, valueHolder.error)));
}
setKeyError(key, error) {
return this.setKeyInfo(key, {
error: error,
loadDate: new Date(),
});
}
setKeyValue(key, value) {
return this.setKeyInfo(key, {
value,
loadDate: new Date(),
});
}
setKeyFromResponse(key, r) {
try {
this.setKeyValue(key, r.body());
}
catch (err) {
this.setKeyError(key, err);
}
}
setKeyInfo(key, value) {
key = toTapInfoKeyObject(key);
const cacheKey = createCacheKey(key);
debug(TAG, `setKeyValue "${cacheKey}": `, value);
if (value.error) {
this.notifyKeyError(key, value.error);
}
else {
this.notifyNewValue(key, value.value);
}
return value;
}
/**
* Notify new key value
*/
notifyNewValue(key, value) {
const obs = this._createInfoObservableIfRequired(key);
obs.next({
value: value,
loadDate: new Date(),
});
}
/**
* Notify new key error
* @param key: TapInfo
* @param err: Error
* @param params?: any[]
*/
notifyKeyError(key, err) {
debug(TAG, key, 'error with', err);
const obs = this._createInfoObservableIfRequired(key);
obs.next({
error: err,
loadDate: new Date(),
});
}
/**
* @deprecated use {@link isInfoLoaded()} instead
* @param key
* @returns
*/
isKeyInCache(key) {
return this.isInfoLoaded(key);
}
_createInfoObservableIfRequired(key) {
const cacheKey = createCacheKey(key);
if (!this._infoChange[cacheKey]) {
debug(TAG, `create new observable cache key "${cacheKey}"`);
this._infoChange[cacheKey] = new BehaviorSubject({
loadDate: undefined,
});
}
return this._infoChange[cacheKey];
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoCacheService, deps: [{ token: i1.TapInfoConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoCacheService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapInfoCacheService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: () => [{ type: i1.TapInfoConfigService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWluZm8tY2FjaGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9zcmMvbGliL3RhcC1pbmZvL3RhcC1pbmZvLWNhY2hlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBdUMsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBc0MsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU9sQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFFL0QsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUM7QUFJbEM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sbUJBQW1CO0lBT1Y7SUFOcEI7O09BRUc7SUFDSyxXQUFXLEdBQ2pCLEVBQUUsQ0FBQztJQUVMLFlBQW9CLG9CQUEwQztRQUExQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO0lBQUcsQ0FBQztJQUVsRTs7OztPQUlHO0lBQ0gsV0FBVyxDQUFJLEdBQTZCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxL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dWxhci9jb3JlJztcbmltcG9ydCB7IGlzQ29kZUVycm9yIH0gZnJvbSAnQGlvdGl6ZS9jb21tb24vZXJyb3InO1xuaW1wb3J0IHsgVGFwRXJyb3IsIFRhcFJlc3BvbnNlLCBUYXBSZXNwb25zZVN0YXR1c0Vycm9yIH0gZnJvbSAnQGlvdGl6ZS90YXAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgR2V0UmVzcG9uc2VUeXBlLFxuICBUYXBJbmZvSG9sZGVyLFxuICBUYXBJbmZvS2V5LFxuICBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcsXG59IGZyb20gJy4vZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsgVGFwSW5mb0NvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3RhcC1pbmZvLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZUNhY2hlS2V5LCB0b1RhcEluZm9LZXlPYmplY3QgfSBmcm9tICcuL3V0aWxpdHknO1xuXG5jb25zdCBUQUcgPSAnVGFwSW5mb0NhY2hlU2VydmljZSc7XG5cbnR5cGUgVGFwSW5mb0NhY2hlS2V5ID0gc3RyaW5nO1xuXG4vKipcbiAqIFdpbGwgYmUgcmVuYW1lZCBhcyBUYXBDb25maWdTeW5jU2VydmljZVxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGFwSW5mb0NhY2hlU2VydmljZSB7XG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlcyBvZiBpbmZvc1xuICAgKi9cbiAgcHJpdmF0ZSBfaW5mb0NoYW5nZTogUmVjb3JkPFRhcEluZm9DYWNoZUtleSwgQmVoYXZpb3JTdWJqZWN0PFRhcEluZm9Ib2xkZXI+PiA9XG4gICAge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0YXBJbmZvQ29uZmlnU2VydmljZTogVGFwSW5mb0NvbmZpZ1NlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2UuIFdpbGwgYmUgbm90aWZpZWQgZWFjaCB0aW1lIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGNoYW5nZXNcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgdmFsdWVDaGFuZ2U8VD4oa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5pbmZvQ2hhbmdlPFQ+KGtleSkucGlwZShcbiAgICAgIGZpbHRlcigodikgPT4gIXYuZXJyb3IgJiYgdi52YWx1ZSAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIG1hcCgodikgPT4ge1xuICAgICAgICByZXR1cm4gdi52YWx1ZSBhcyBUO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCwgaXQgd2lsbCBiZSByZXR1cm5lZCBvdGhlcndpc2UgaXQgd2lsbCB3YWl0IGZvciBhIHZhbHVlIHRvIGJlIHJlc29sdmVkXG4gICAqIEBwYXJhbSBpbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICB2YWx1ZTxUID0gR2V0UmVzcG9uc2VUeXBlPFRhcEluZm9LZXlPYmplY3RPclN0cmluZz4+KFxuICAgIGluZm86IFRhcEluZm9LZXlPYmplY3RPclN0cmluZ1xuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZUNoYW5nZTxUPihpbmZvKS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIGFzIFByb21pc2U8VD47IC8vIFRPRE8gZml4IHR5cGVcbiAgfVxuXG4gIGluZm9DaGFuZ2U8VD4oa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcpOiBPYnNlcnZhYmxlPFRhcEluZm9Ib2xkZXI8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlSW5mb09ic2VydmFibGVJZlJlcXVpcmVkKHRvVGFwSW5mb0tleU9iamVjdChrZXkpKTtcbiAgfVxuXG4gIGNsZWFyS2V5cyhrZXlzOiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdbXSkge1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICB0aGlzLmNsZWFyS2V5KGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRJbmZvU25hcHNob3Q8VD4oXG4gICAga2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmdcbiAgKTogVGFwSW5mb0hvbGRlcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2luZm9DaGFuZ2VbY3JlYXRlQ2FjaGVLZXkodG9UYXBJbmZvS2V5T2JqZWN0KGtleSkpXT8udmFsdWU7XG4gIH1cblxuICBjbGVhcktleShrZXk6IFRhcEluZm9LZXlPYmplY3RPclN0cmluZykge1xuICAgIGNvbnN0IG9iamVjdEtleSA9IHRvVGFwSW5mb0tleU9iamVjdChrZXkpO1xuICAgIGlmICh0aGlzLmlzSW5mb0xvYWRlZChvYmplY3RLZXkpKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGNyZWF0ZUNhY2hlS2V5KG9iamVjdEtleSk7XG4gICAgICBkZWJ1ZyhUQUcsIGBjbGVhciBrZXkgXCIke2NhY2hlS2V5fVwiYCk7XG4gICAgICAvLyBkZWxldGUgdGhpcy5faW5mb1tjYWNoZUtleV07XG4gICAgICB0aGlzLl9pbmZvQ2hhbmdlW2NhY2hlS2V5XT8ubmV4dCh7XG4gICAgICAgIGxvYWREYXRlOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXNldCgpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLl9pbmZvQ2hhbmdlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJLZXkoa2V5IGFzIGFueSk7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5faW5mbyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHZhbHVlIGhhcyBiZWVuIGxvYWRlZCwgZXZlbiBpZiBpdCBoYXMgZXJyb3JzXG4gICAqL1xuICBpc0luZm9Mb2FkZWQoa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGNyZWF0ZUNhY2hlS2V5KHRvVGFwSW5mb0tleU9iamVjdChrZXkpKTtcbiAgICByZXR1cm4gdGhpcy5faW5mb0NoYW5nZVtjYWNoZUtleV0/LnZhbHVlLmxvYWREYXRlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGhhcyBiZWVuIGxvYWRlZC5cbiAgICovXG4gIGlzVmFsdWVMb2FkZWQoa2V5OiBUYXBJbmZvS2V5KSB7XG4gICAgY29uc3QgdmFsdWVIb2xkZXIgPSB0aGlzLmdldEluZm9TbmFwc2hvdChrZXkpO1xuICAgIGlmICghdmFsdWVIb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlSG9sZGVyLnZhbHVlICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICh2YWx1ZUhvbGRlci5lcnJvciAmJlxuICAgICAgICBpc0NvZGVFcnJvcjxUYXBSZXNwb25zZVN0YXR1c0Vycm9yPihcbiAgICAgICAgICBUYXBFcnJvci5Db2RlLlJlc3BvbnNlU3RhdHVzRXJyb3IsXG4gICAgICAgICAgdmFsdWVIb2xkZXIuZXJyb3JcbiAgICAgICAgKSlcbiAgICApO1xuICB9XG5cbiAgc2V0S2V5RXJyb3Ioa2V5OiBUYXBJbmZvS2V5T2JqZWN0T3JTdHJpbmcsIGVycm9yOiBFcnJvcik6IFRhcEluZm9Ib2xkZXIge1xuICAgIHJldHVybiB0aGlzLnNldEtleUluZm8oa2V5LCB7XG4gICAgICBlcnJvcjogZXJyb3IsXG4gICAgICBsb2FkRGF0ZTogbmV3IERhdGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIHNldEtleVZhbHVlPFQ+KGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nLCB2YWx1ZTogVCk6IFRhcEluZm9Ib2xkZXIge1xuICAgIHJldHVybiB0aGlzLnNldEtleUluZm8oa2V5LCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGxvYWREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgc2V0S2V5RnJvbVJlc3BvbnNlKGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nLCByOiBUYXBSZXNwb25zZTxhbnk+KSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2V0S2V5VmFsdWUoa2V5LCByLmJvZHkoKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNldEtleUVycm9yKGtleSwgZXJyIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzZXRLZXlJbmZvKGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nLCB2YWx1ZTogVGFwSW5mb0hvbGRlcikge1xuICAgIGtleSA9IHRvVGFwSW5mb0tleU9iamVjdChrZXkpO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gY3JlYXRlQ2FjaGVLZXkoa2V5KTtcbiAgICBkZWJ1ZyhUQUcsIGBzZXRLZXlWYWx1ZSBcIiR7Y2FjaGVLZXl9XCI6IGAsIHZhbHVlKTtcbiAgICBpZiAodmFsdWUuZXJyb3IpIHtcbiAgICAgIHRoaXMubm90aWZ5S2V5RXJyb3Ioa2V5LCB2YWx1ZS5lcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZ5TmV3VmFsdWUoa2V5LCB2YWx1ZS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgbmV3IGtleSB2YWx1ZVxuICAgKi9cbiAgbm90aWZ5TmV3VmFsdWUoa2V5OiBUYXBJbmZvS2V5LCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgb2JzID0gdGhpcy5fY3JlYXRlSW5mb09ic2VydmFibGVJZlJlcXVpcmVkKGtleSk7XG4gICAgb2JzLm5leHQoe1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgbG9hZERhdGU6IG5ldyBEYXRlKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IG5ldyBrZXkgZXJyb3JcbiAgICogQHBhcmFtIGtleTogVGFwSW5mb1xuICAgKiBAcGFyYW0gZXJyOiBFcnJvclxuICAgKiBAcGFyYW0gcGFyYW1zPzogYW55W11cbiAgICovXG4gIG5vdGlmeUtleUVycm9yKGtleTogVGFwSW5mb0tleSwgZXJyOiBFcnJvcikge1xuICAgIGRlYnVnKFRBRywga2V5LCAnZXJyb3Igd2l0aCcsIGVycik7XG4gICAgY29uc3Qgb2JzID0gdGhpcy5fY3JlYXRlSW5mb09ic2VydmFibGVJZlJlcXVpcmVkKGtleSk7XG4gICAgb2JzLm5leHQoe1xuICAgICAgZXJyb3I6IGVycixcbiAgICAgIGxvYWREYXRlOiBuZXcgRGF0ZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgaXNJbmZvTG9hZGVkKCl9IGluc3RlYWRcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgaXNLZXlJbkNhY2hlKGtleTogVGFwSW5mb0tleU9iamVjdE9yU3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmZvTG9hZGVkKGtleSk7XG4gIH1cbiAgcHJpdmF0ZSBfY3JlYXRlSW5mb09ic2VydmFibGVJZlJlcXVpcmVkKFxuICAgIGtleTogVGFwSW5mb0tleVxuICApOiBTdWJqZWN0PFRhcEluZm9Ib2xkZXI+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGNyZWF0ZUNhY2hlS2V5KGtleSk7XG4gICAgaWYgKCF0aGlzLl9pbmZvQ2hhbmdlW2NhY2hlS2V5XSkge1xuICAgICAgZGVidWcoVEFHLCBgY3JlYXRlIG5ldyBvYnNlcnZhYmxlIGNhY2hlIGtleSBcIiR7Y2FjaGVLZXl9XCJgKTtcbiAgICAgIHRoaXMuX2luZm9DaGFuZ2VbY2FjaGVLZXldID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYXBJbmZvSG9sZGVyPih7XG4gICAgICAgIGxvYWREYXRlOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2luZm9DaGFuZ2VbY2FjaGVLZXldO1xuICB9XG59XG4iXX0=