ngx-store
Version:
Angular decorators to automagically keep variables in HTML5 LocalStorage, SessionStorage, cookies; injectable services for managing and listening to data changes and a bit more.
145 lines • 18.9 kB
JavaScript
import { Cache } from '../decorator/cache';
import { CONFIG_PREFIX, debug } from '../config/config';
import { Subject } from 'rxjs';
import { NgxStorageEvent } from './storage/storage-event';
export class WebStorageUtility {
constructor(storage, prefix = '', previousPrefix) {
this._prefix = '';
this._changes = new Subject();
this._storage = storage;
this._prefix = prefix;
// handle previousPrefix for backward-compatibility and safe config changes below
if (prefix === previousPrefix) {
return;
}
if (previousPrefix === null) {
return;
}
if (previousPrefix === undefined) {
return;
}
debug.log(this.getStorageName() + ' > Detected prefix change from ' + previousPrefix + ' to ' + prefix);
this.forEach((value, key) => {
// ignore config settings when previousPrefix = ''
if (key.startsWith(previousPrefix) && !key.startsWith(CONFIG_PREFIX)) {
const nameWithoutPrefix = this.trimPrefix(key);
this.set(nameWithoutPrefix, this._storage.getItem(key));
if (previousPrefix !== '') {
this._storage.removeItem(key);
}
}
});
}
get prefix() {
return this._prefix;
}
get changes() {
return this._changes.asObservable();
}
get keys() {
const keys = [];
this.forEach((value, key) => keys.push(key));
return keys;
}
static getSettable(value) {
return JSON.stringify(value);
}
static getGettable(value) {
if (value === 'undefined') {
return null;
}
try {
return JSON.parse(value);
}
catch (e) {
return value;
}
}
getStorage() {
return this._storage;
}
getStorageKey(key, prefix) {
prefix = (typeof prefix === 'string') ? prefix : this.prefix;
return `${prefix}${key}`;
}
getStorageName() {
return this._storage.type || ((this._storage === localStorage) ? 'localStorage' : 'sessionStorage');
}
get(key, config = {}) {
const storageKey = this.getStorageKey(key, config.prefix);
const value = this._storage.getItem(storageKey);
// TODO return undefined if no key
/*if (value === null && !(storageKey in this._storage)) {
return undefined;
}*/
return this.getGettable(value);
}
set(key, value, config = {}) {
if (value === null || value === undefined) {
this.remove(key);
return null;
}
try {
const storageKey = this.getStorageKey(key, config.prefix);
const storable = this.getSettable(value);
this.emitEvent(key, value);
this._storage.setItem(storageKey, storable, config.expires);
const cacheItem = Cache.get(key);
if (cacheItem) {
debug.log(`updating following CacheItem from ${this.constructor.name}:`, cacheItem);
cacheItem.resetProxy();
cacheItem.propagateChange(value, this);
}
}
catch (error) {
console.warn(`[ngx-store] ${this.getStorageName()}:
following error occurred while trying to save ${key} =`, value);
console.error(error);
}
return value;
}
// TODO return true if item existed and false otherwise (?)
remove(key, config = {}) {
const storageKey = this.getStorageKey(key, config.prefix);
this._storage.removeItem(storageKey);
const cacheItem = Cache.get(key);
if (cacheItem) {
cacheItem.resetProxy();
}
}
clear() {
this.emitEvent(null, null, null);
this.forEach((value, key) => {
if (key.startsWith(CONFIG_PREFIX)) {
return;
}
this.remove(key, { prefix: '' });
});
}
forEach(callbackFn) {
if (typeof this._storage.forEach === 'function') {
return this._storage.forEach((value, key) => {
callbackFn(this.getGettable(value), key);
});
}
Object.keys(this._storage).forEach((key) => {
callbackFn(this.getGettable(this._storage[key]), key);
});
}
getSettable(value) {
return WebStorageUtility.getSettable(value);
}
getGettable(value) {
return WebStorageUtility.getGettable(value);
}
trimPrefix(key) {
return key.replace(this.prefix, '');
}
emitEvent(key, newValue, oldValue) {
const event = new NgxStorageEvent(this.getStorageName(), key, this._storage);
event.oldValue = (oldValue !== undefined) ? oldValue : this.get(key);
event.newValue = newValue;
this._changes.next(event);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic3RvcmFnZS51dGlsaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN0b3JlL3NyYy9saWIvdXRpbGl0eS93ZWJzdG9yYWdlLnV0aWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJMUQsTUFBTSxPQUFPLGlCQUFpQjtJQUc1QixZQUFtQixPQUFtQixFQUFFLFNBQWlCLEVBQUUsRUFBRSxjQUF1QjtRQTRCMUUsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQU1yQixhQUFRLEdBQTZCLElBQUksT0FBTyxFQUFFLENBQUM7UUFqQzNELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXRCLGlGQUFpRjtRQUNqRixJQUFJLE1BQU0sS0FBSyxjQUFjLEVBQUU7WUFDN0IsT0FBTztTQUNSO1FBQ0QsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUNELElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxPQUFPO1NBQ1I7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxpQ0FBaUMsR0FBRyxjQUFjLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3hHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDMUIsa0RBQWtEO1lBQ2xELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FB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QUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxVQUFVLENBQUMsR0FBVztRQUMzQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRVMsU0FBUyxDQUFDLEdBQVcsRUFBRSxRQUFhLEVBQUUsUUFBYztRQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RSxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckUsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vbmd4LXN0b3JlLnR5cGVzJztcbmltcG9ydCB7IFdlYlN0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UvY29va2llcy1zdG9yYWdlJztcbmltcG9ydCB7IENhY2hlIH0gZnJvbSAnLi4vZGVjb3JhdG9yL2NhY2hlJztcbmltcG9ydCB7IENPTkZJR19QUkVGSVgsIGRlYnVnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ3hTdG9yYWdlRXZlbnQgfSBmcm9tICcuL3N0b3JhZ2Uvc3RvcmFnZS1ldmVudCc7XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VOYW1lID0gJ2xvY2FsU3RvcmFnZScgfCAnc2Vzc2lvblN0b3JhZ2UnIHwgJ2Nvb2tpZXNTdG9yYWdlJyB8ICdzaGFyZWRTdG9yYWdlJztcblxuZXhwb3J0IGNsYXNzIFdlYlN0b3JhZ2VVdGlsaXR5IHtcbiAgcHJvdGVjdGVkIF9zdG9yYWdlOiBXZWJTdG9yYWdlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzdG9yYWdlOiBXZWJTdG9yYWdlLCBwcmVmaXg6IHN0cmluZyA9ICcnLCBwcmV2aW91c1ByZWZpeD86IHN0cmluZykge1xuICAgIHRoaXMuX3N0b3JhZ2UgPSBzdG9yYWdlO1xuICAgIHRoaXMuX3ByZWZpeCA9IHByZWZpeDtcblxuICAgIC8vIGhhbmRsZSBwcmV2aW91c1ByZWZpeCBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBhbmQgc2FmZSBjb25maWcgY2hhbmdlcyBiZWxvd1xuICAgIGlmIChwcmVmaXggPT09IHByZXZpb3VzUHJlZml4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcmV2aW91c1ByZWZpeCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocHJldmlvdXNQcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Zy5sb2codGhpcy5nZXRTdG9yYWdlTmFtZSgpICsgJyA+IERldGVjdGVkIHByZWZpeCBjaGFuZ2UgZnJvbSAnICsgcHJldmlvdXNQcmVmaXggKyAnIHRvICcgKyBwcmVmaXgpO1xuICAgIHRoaXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgLy8gaWdub3JlIGNvbmZpZyBzZXR0aW5ncyB3aGVuIHByZXZpb3VzUHJlZml4ID0gJydcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmV2aW91c1ByZWZpeCkgJiYgIWtleS5zdGFydHNXaXRoKENPTkZJR19QUkVGSVgpKSB7XG4gICAgICAgIGNvbnN0IG5hbWVXaXRob3V0UHJlZml4ID0gdGhpcy50cmltUHJlZml4KGtleSk7XG4gICAgICAgIHRoaXMuc2V0KG5hbWVXaXRob3V0UHJlZml4LCB0aGlzLl9zdG9yYWdlLmdldEl0ZW0oa2V5KSk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzUHJlZml4ICE9PSAnJykge1xuICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZWZpeDogc3RyaW5nID0gJyc7XG5cbiAgcHVibGljIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZml4O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jaGFuZ2VzOiBTdWJqZWN0PE5neFN0b3JhZ2VFdmVudD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBnZXQgY2hhbmdlcygpOiBPYnNlcnZhYmxlPE5neFN0b3JhZ2VFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBrZXlzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IGtleXMucHVzaChrZXkpKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2V0dGFibGUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0R2V0dGFibGUodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yYWdlKCk6IFdlYlN0b3JhZ2Uge1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHVibGljIGdldFN0b3JhZ2VLZXkoa2V5OiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcHJlZml4ID0gKHR5cGVvZiBwcmVmaXggPT09ICdzdHJpbmcnKSA/IHByZWZpeCA6IHRoaXMucHJlZml4O1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtrZXl9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yYWdlTmFtZSgpOiBTdG9yYWdlTmFtZSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UudHlwZSB8fCAoKHRoaXMuX3N0b3JhZ2UgPT09IGxvY2FsU3RvcmFnZSkgPyAnbG9jYWxTdG9yYWdlJyA6ICdzZXNzaW9uU3RvcmFnZScpO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZywgY29uZmlnOiBEZWNvcmF0b3JDb25maWcgPSB7fSk6IGFueSB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleShrZXksIGNvbmZpZy5wcmVmaXgpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpO1xuICAgIC8vIFRPRE8gcmV0dXJuIHVuZGVmaW5lZCBpZiBubyBrZXlcbiAgICAvKmlmICh2YWx1ZSA9PT0gbnVsbCAmJiAhKHN0b3JhZ2VLZXkgaW4gdGhpcy5fc3RvcmFnZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSovXG4gICAgcmV0dXJuIHRoaXMuZ2V0R2V0dGFibGUodmFsdWUgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQ8VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBULCBjb25maWc6IERlY29yYXRvckNvbmZpZyA9IHt9KTogVCB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZShrZXkpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KGtleSwgY29uZmlnLnByZWZpeCk7XG4gICAgICBjb25zdCBzdG9yYWJsZSA9IHRoaXMuZ2V0U2V0dGFibGUodmFsdWUpO1xuICAgICAgdGhpcy5lbWl0RXZlbnQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLl9zdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgc3RvcmFibGUsIGNvbmZpZy5leHBpcmVzKTtcbiAgICAgIGNvbnN0IGNhY2hlSXRlbSA9IENhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKGNhY2hlSXRlbSkge1xuICAgICAgICBkZWJ1Zy5sb2coYHVwZGF0aW5nIGZvbGxvd2luZyBDYWNoZUl0ZW0gZnJvbSAke3RoaXMuY29uc3RydWN0b3IubmFtZX06YCwgY2FjaGVJdGVtKTtcbiAgICAgICAgY2FjaGVJdGVtLnJlc2V0UHJveHkoKTtcbiAgICAgICAgY2FjaGVJdGVtLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZSwgdGhpcyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW25neC1zdG9yZV0gJHt0aGlzLmdldFN0b3JhZ2VOYW1lKCl9OlxuICAgICAgICAgICAgIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gc2F2ZSAke2tleX0gPWAsIHZhbHVlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBUT0RPIHJldHVybiB0cnVlIGlmIGl0ZW0gZXhpc3RlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlICg/KVxuICBwdWJsaWMgcmVtb3ZlKGtleTogc3RyaW5nLCBjb25maWc6IERlY29yYXRvckNvbmZpZyA9IHt9KTogdm9pZCB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleShrZXksIGNvbmZpZy5wcmVmaXgpO1xuICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KTtcbiAgICBjb25zdCBjYWNoZUl0ZW0gPSBDYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVJdGVtKSB7XG4gICAgICBjYWNoZUl0ZW0ucmVzZXRQcm94eSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRFdmVudChudWxsIGFzIGFueSwgbnVsbCwgbnVsbCk7XG4gICAgdGhpcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoQ09ORklHX1BSRUZJWCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmUoa2V5LCB7cHJlZml4OiAnJ30pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2goY2FsbGJhY2tGbjogKHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3N0b3JhZ2UuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2UuZm9yRWFjaCgodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2FsbGJhY2tGbih0aGlzLmdldEdldHRhYmxlKHZhbHVlKSwga2V5KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyh0aGlzLl9zdG9yYWdlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNhbGxiYWNrRm4odGhpcy5nZXRHZXR0YWJsZSh0aGlzLl9zdG9yYWdlW2tleV0pLCBrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRhYmxlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBXZWJTdG9yYWdlVXRpbGl0eS5nZXRTZXR0YWJsZSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0R2V0dGFibGUodmFsdWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIFdlYlN0b3JhZ2VVdGlsaXR5LmdldEdldHRhYmxlKHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmltUHJlZml4KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga2V5LnJlcGxhY2UodGhpcy5wcmVmaXgsICcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0RXZlbnQoa2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnksIG9sZFZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgTmd4U3RvcmFnZUV2ZW50KHRoaXMuZ2V0U3RvcmFnZU5hbWUoKSwga2V5LCB0aGlzLl9zdG9yYWdlKTtcbiAgICBldmVudC5vbGRWYWx1ZSA9IChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSA/IG9sZFZhbHVlIDogdGhpcy5nZXQoa2V5KTtcbiAgICBldmVudC5uZXdWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIHRoaXMuX2NoYW5nZXMubmV4dChldmVudCk7XG4gIH1cbn1cbiJdfQ==