UNPKG

ng-indexed-db

Version:

An IndexedDB Angular module wrapped in RXJS

213 lines 15.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { Observable, forkJoin, timer } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; import { IndexedDatabase } from '../indexed-database'; export class NgDatabaseFactory { constructor() { /** * Emits an event when all databases recive has been generated */ this.connectionsReady = new BehaviorSubject(false); /** * Indexed database connection factory */ this.factory = window.indexedDB; } /** * Sends the database metadata to create. * Once it has been completed, emits the * connectionsReady event * @param {?} databases Databases metadata * @return {?} */ createConnnections(databases) { this.createDataBases(databases) .pipe(map((/** * @param {?} response * @return {?} */ response => this.connections = response)), switchMap((/** * @param {?} response * @return {?} */ response => timer(100)))) .subscribe((/** * @return {?} */ () => this.connectionsReady.next(true))); } /** * Find a database connection by name. If there isn't * a database name takes the default database name * @param {?=} dbName Name of the database alias * @return {?} */ getDatabase(dbName) { return this.connections[dbName ? dbName : this.defaultConnectionName]; } /** * Open a database connection * @param {?} dbName name of the database * @param {?=} version version of the database * @return {?} */ open(dbName, version) { return new Observable((/** * @param {?} observer * @return {?} */ observer => { /** @type {?} */ let upgraded = false; /** @type {?} */ const DBOpenRequest = this.factory.open(dbName, version); DBOpenRequest.onupgradeneeded = (/** * @param {?} event * @return {?} */ event => { observer.next({ upgraded: true, success: true, result: DBOpenRequest.result }); observer.complete(); upgraded = true; }); DBOpenRequest.onsuccess = (/** * @param {?} event * @return {?} */ event => { if (!upgraded) { observer.next({ upgraded: false, success: true, result: DBOpenRequest.result }); observer.complete(); } }); DBOpenRequest.onerror = (/** * @param {?} event * @return {?} */ event => { observer.error(`Error to connect database ${dbName}`); observer.complete(); }); DBOpenRequest.onblocked = (/** * @param {?} event * @return {?} */ event => { console.log('blocked'); }); })); } /** * Generates an Observable collection of database connections * @param {?} databases * @return {?} */ createDataBases(databases) { /** @type {?} */ const operators = []; /** @type {?} */ let firstIteration = true; /** @type {?} */ const createConnnection = (/** * @param {?} item * @return {?} */ (item) => { if (firstIteration) { this.defaultConnectionName = item.name; firstIteration = false; } operators.push(this.createConnection(item.name, item.stores, 1)); }); databases.forEach(createConnnection); /** @type {?} */ const mappingResponse = (/** * @param {?} response * @return {?} */ response => { /** @type {?} */ let data = {}; response.forEach((/** * @param {?} item * @return {?} */ item => { data = Object.assign({}, data, item); })); return data; }); return forkJoin(operators) .pipe(map(mappingResponse)); } /** * Generates a sigle database conecction client * @private * @param {?} dbName * @param {?} tables * @param {?=} version * @return {?} */ createConnection(dbName, tables, version) { return this.open(dbName, version) .pipe(map((/** * @param {?} data * @return {?} */ data => ({ [dbName]: new IndexedDatabase(data.result, data.upgraded, tables) })))); } } NgDatabaseFactory.decorators = [ { type: Injectable } ]; if (false) { /** * Emits an event when all databases recive has been generated * @type {?} */ NgDatabaseFactory.prototype.connectionsReady; /** * Indexed database connection factory * @type {?} * @private */ NgDatabaseFactory.prototype.factory; /** * List of all connections handled by the service * @type {?} * @private */ NgDatabaseFactory.prototype.connections; /** * Default connection name * @type {?} * @private */ NgDatabaseFactory.prototype.defaultConnectionName; } /** * @record */ function OpenConnectionResponse() { } if (false) { /** @type {?} */ OpenConnectionResponse.prototype.success; /** @type {?} */ OpenConnectionResponse.prototype.upgraded; /** @type {?} */ OpenConnectionResponse.prototype.result; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWluZGV4ZWQtZGIvIiwic291cmNlcyI6WyJsaWIvY29yZS9mYWN0b3J5L2RhdGFiYXNlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBS2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd0RCxNQUFNLE9BQU8saUJBQWlCO0lBRDlCOzs7O1FBSUUscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQU0sS0FBSyxDQUFDLENBQUM7Ozs7UUFHM0MsWUFBTyxHQUFlLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFpSGpELENBQUM7Ozs7Ozs7O0lBbkdDLGtCQUFrQixDQUFDLFNBQXVCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO2FBQzlCLElBQUksQ0FDSCxHQUFHOzs7O1FBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBQyxFQUM1QyxTQUFTOzs7O1FBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FDbEM7YUFDQSxTQUFTOzs7UUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUM7SUFDckQsQ0FBQzs7Ozs7OztJQU1ELFdBQVcsQ0FBQyxNQUFlO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEUsQ0FBQzs7Ozs7OztJQU1ELElBQUksQ0FBQyxNQUFjLEVBQUUsT0FBZ0I7UUFDbkMsT0FBTyxJQUFJLFVBQVU7Ozs7UUFBQyxRQUFRLENBQUMsRUFBRTs7Z0JBQzNCLFFBQVEsR0FBRyxLQUFLOztrQkFDZCxhQUFhLEdBQXFCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFFMUUsYUFBYSxDQUFDLGVBQWU7Ozs7WUFBRyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDWixRQUFRLEVBQUUsSUFBSTtvQkFDZCxPQUFPLEVBQUUsSUFBSTtvQkFDYixNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07aUJBQzdCLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3BCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDbEIsQ0FBQyxDQUFBLENBQUM7WUFFRixhQUFhLENBQUMsU0FBUzs7OztZQUFHLEtBQUssQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUM7d0JBQ1osUUFBUSxFQUFFLEtBQUs7d0JBQ2YsT0FBTyxFQUFFLElBQUk7d0JBQ2IsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNO3FCQUM3QixDQUFDLENBQUM7b0JBQ0gsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNyQjtZQUNILENBQUMsQ0FBQSxDQUFDO1lBRUYsYUFBYSxDQUFDLE9BQU87Ozs7WUFBRyxLQUFLLENBQUMsRUFBRTtnQkFDOUIsUUFBUSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDdEQsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQSxDQUFDO1lBRUYsYUFBYSxDQUFDLFNBQVM7Ozs7WUFBRyxLQUFLLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUEsQ0FBQztRQUVKLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBS0QsZUFBZSxDQUFDLFNBQXVCOztjQUMvQixTQUFTLEdBQUcsRUFBRTs7WUFDaEIsY0FBYyxHQUFHLElBQUk7O2NBQ25CLGlCQUFpQjs7OztRQUFHLENBQUMsSUFBZ0IsRUFBRSxFQUFFO1lBQzdDLElBQUksY0FBYyxFQUFFO2dCQUNsQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDdkMsY0FBYyxHQUFHLEtBQUssQ0FBQzthQUN4QjtZQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUMsQ0FBQTtRQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7Y0FFL0IsZUFBZTs7OztRQUFHLFFBQVEsQ0FBQyxFQUFFOztnQkFDN0IsSUFBSSxHQUFHLEVBQUU7WUFDYixRQUFRLENBQUMsT0FBTzs7OztZQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN0QixJQUFJLHFCQUNDLElBQUksRUFDSixJQUFJLENBQ1IsQ0FBQztZQUNKLENBQUMsRUFBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUE7UUFDRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLENBQUM7YUFDdkIsSUFBSSxDQUNILEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FDckIsQ0FBQztJQUNOLENBQUM7Ozs7Ozs7OztJQUlPLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxNQUFpQixFQUFFLE9BQWdCO1FBQzFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO2FBQzlCLElBQUksQ0FDSCxHQUFHOzs7O1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQ25GLENBQUM7SUFDTixDQUFDOzs7WUF2SEYsVUFBVTs7Ozs7OztJQUlULDZDQUFtRDs7Ozs7O0lBR25ELG9DQUErQzs7Ozs7O0lBRy9DLHdDQUFrQzs7Ozs7O0lBR2xDLGtEQUFzQzs7Ozs7QUE2R3hDLHFDQUlDOzs7SUFIQyx5Q0FBaUI7O0lBQ2pCLDBDQUFrQjs7SUFDbEIsd0NBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvaW50ZXJuYWwvQmVoYXZpb3JTdWJqZWN0JztcblxuaW1wb3J0IHsgTmdDb25uZWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMvY29uZWNjdGlvbi50eXBlJztcbmltcG9ydCB7IE5nRGF0YUJhc2UgfSBmcm9tICcuLi90eXBlcy9kYXRhYmFzZS50eXBlJztcbmltcG9ydCB7IE5nU3RvcmUgfSBmcm9tICcuLi90eXBlcy9zdG9yZS50eXBlJztcbmltcG9ydCB7IEluZGV4ZWREYXRhYmFzZSB9IGZyb20gJy4uL2luZGV4ZWQtZGF0YWJhc2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmdEYXRhYmFzZUZhY3Rvcnkge1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGFsbCBkYXRhYmFzZXMgcmVjaXZlIGhhcyBiZWVuIGdlbmVyYXRlZCAqL1xuICBjb25uZWN0aW9uc1JlYWR5ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KGZhbHNlKTtcblxuICAvKiogSW5kZXhlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGZhY3RvcnkgKi9cbiAgcHJpdmF0ZSBmYWN0b3J5OiBJREJGYWN0b3J5ID0gd2luZG93LmluZGV4ZWREQjtcblxuICAvKiogTGlzdCBvZiBhbGwgY29ubmVjdGlvbnMgaGFuZGxlZCBieSB0aGUgc2VydmljZSAqL1xuICBwcml2YXRlIGNvbm5lY3Rpb25zOiBOZ0Nvbm5lY3Rpb247XG5cbiAgLyoqIERlZmF1bHQgY29ubmVjdGlvbiBuYW1lICovXG4gIHByaXZhdGUgZGVmYXVsdENvbm5lY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBkYXRhYmFzZSBtZXRhZGF0YSB0byBjcmVhdGUuXG4gICAqIE9uY2UgaXQgaGFzIGJlZW4gY29tcGxldGVkLCBlbWl0cyB0aGVcbiAgICogY29ubmVjdGlvbnNSZWFkeSBldmVudFxuICAgKiBAcGFyYW0gZGF0YWJhc2VzIERhdGFiYXNlcyBtZXRhZGF0YVxuICAgKi9cbiAgY3JlYXRlQ29ubm5lY3Rpb25zKGRhdGFiYXNlczogTmdEYXRhQmFzZVtdKSB7XG4gICAgdGhpcy5jcmVhdGVEYXRhQmFzZXMoZGF0YWJhc2VzKVxuICAgIC5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHRoaXMuY29ubmVjdGlvbnMgPSByZXNwb25zZSksXG4gICAgICBzd2l0Y2hNYXAocmVzcG9uc2UgPT4gdGltZXIoMTAwKSksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jb25uZWN0aW9uc1JlYWR5Lm5leHQodHJ1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiBGaW5kIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBieSBuYW1lLiBJZiB0aGVyZSBpc24ndFxuICAgKiBhIGRhdGFiYXNlIG5hbWUgdGFrZXMgdGhlIGRlZmF1bHQgZGF0YWJhc2UgbmFtZVxuICAgKiBAcGFyYW0gZGJOYW1lIE5hbWUgb2YgdGhlIGRhdGFiYXNlIGFsaWFzXG4gICAqL1xuICBnZXREYXRhYmFzZShkYk5hbWU/OiBzdHJpbmcpOiBJbmRleGVkRGF0YWJhc2Uge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zW2RiTmFtZSA/IGRiTmFtZSA6IHRoaXMuZGVmYXVsdENvbm5lY3Rpb25OYW1lXTtcbiAgfVxuICAvKipcbiAgICogT3BlbiBhIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGRiTmFtZSBuYW1lIG9mIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIG9mIHRoZSBkYXRhYmFzZVxuICAgKi9cbiAgb3BlbihkYk5hbWU6IHN0cmluZywgdmVyc2lvbj86IG51bWJlcik6IE9ic2VydmFibGU8T3BlbkNvbm5lY3Rpb25SZXNwb25zZT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgdXBncmFkZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IERCT3BlblJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QgPSB0aGlzLmZhY3Rvcnkub3BlbihkYk5hbWUsIHZlcnNpb24pO1xuXG4gICAgICBEQk9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IGV2ZW50ID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh7XG4gICAgICAgICAgdXBncmFkZWQ6IHRydWUsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICByZXN1bHQ6IERCT3BlblJlcXVlc3QucmVzdWx0XG4gICAgICAgIH0pO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB1cGdyYWRlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICBEQk9wZW5SZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF1cGdyYWRlZCkge1xuICAgICAgICAgIG9ic2VydmVyLm5leHQoe1xuICAgICAgICAgICAgdXBncmFkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogREJPcGVuUmVxdWVzdC5yZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBEQk9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGBFcnJvciB0byBjb25uZWN0IGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfTtcblxuICAgICAgREJPcGVuUmVxdWVzdC5vbmJsb2NrZWQgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdibG9ja2VkJyk7XG4gICAgICB9O1xuXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBPYnNlcnZhYmxlIGNvbGxlY3Rpb24gb2YgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIERhdGFiYXNlcyBtZXRhZGF0YVxuICAgKi9cbiAgY3JlYXRlRGF0YUJhc2VzKGRhdGFiYXNlczogTmdEYXRhQmFzZVtdKTogT2JzZXJ2YWJsZTxOZ0Nvbm5lY3Rpb24+IHtcbiAgICBjb25zdCBvcGVyYXRvcnMgPSBbXTtcbiAgICBsZXQgZmlyc3RJdGVyYXRpb24gPSB0cnVlO1xuICAgIGNvbnN0IGNyZWF0ZUNvbm5uZWN0aW9uID0gKGl0ZW06IE5nRGF0YUJhc2UpID0+IHtcbiAgICAgIGlmIChmaXJzdEl0ZXJhdGlvbikge1xuICAgICAgICB0aGlzLmRlZmF1bHRDb25uZWN0aW9uTmFtZSA9IGl0ZW0ubmFtZTtcbiAgICAgICAgZmlyc3RJdGVyYXRpb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdG9ycy5wdXNoKHRoaXMuY3JlYXRlQ29ubmVjdGlvbihpdGVtLm5hbWUsIGl0ZW0uc3RvcmVzLCAxKSk7XG4gICAgfTtcbiAgICBkYXRhYmFzZXMuZm9yRWFjaChjcmVhdGVDb25ubmVjdGlvbik7XG5cbiAgICBjb25zdCBtYXBwaW5nUmVzcG9uc2UgPSByZXNwb25zZSA9PiB7XG4gICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgcmVzcG9uc2UuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgIC4uLml0ZW1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuICAgIHJldHVybiBmb3JrSm9pbihvcGVyYXRvcnMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKG1hcHBpbmdSZXNwb25zZSlcbiAgICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHNpZ2xlIGRhdGFiYXNlIGNvbmVjY3Rpb24gY2xpZW50XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbm5lY3Rpb24oZGJOYW1lOiBzdHJpbmcsIHRhYmxlczogTmdTdG9yZVtdLCB2ZXJzaW9uPzogbnVtYmVyKTogT2JzZXJ2YWJsZTxOZ0Nvbm5lY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5vcGVuKGRiTmFtZSwgdmVyc2lvbilcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoZGF0YSA9PiAoe1tkYk5hbWVdOiBuZXcgSW5kZXhlZERhdGFiYXNlKGRhdGEucmVzdWx0LCBkYXRhLnVwZ3JhZGVkLCB0YWJsZXMpfSkpXG4gICAgICApO1xuICB9XG59XG5cbmludGVyZmFjZSBPcGVuQ29ubmVjdGlvblJlc3BvbnNlIHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgdXBncmFkZWQ6IGJvb2xlYW47XG4gIHJlc3VsdDogSURCRGF0YWJhc2U7XG59XG4iXX0=