@neocomplexx/ngx-neo-indexeddb
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
474 lines (464 loc) • 41.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core')) :
typeof define === 'function' && define.amd ? define('@neocomplexx/ngx-neo-indexeddb', ['exports', '@angular/core'], factory) :
(factory((global.neocomplexx = global.neocomplexx || {}, global.neocomplexx['ngx-neo-indexeddb'] = {}),global.ng.core));
}(this, (function (exports,core) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxNeoIndexedDbModule = /** @class */ (function () {
function NgxNeoIndexedDbModule() {
}
/**
* @return {?}
*/
NgxNeoIndexedDbModule.forRoot = /**
* @return {?}
*/
function () {
return {
ngModule: NgxNeoIndexedDbModule,
providers: []
};
};
NgxNeoIndexedDbModule.decorators = [
{ type: core.NgModule, args: [{
declarations: [],
imports: [],
exports: []
},] }
];
return NgxNeoIndexedDbModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var DbWrapper = /** @class */ (function () {
function DbWrapper(dbName, version) {
this.dbName = dbName;
this.dbVersion = version || 1;
this.db = null;
}
/**
* @param {?} storeName
* @return {?}
*/
DbWrapper.prototype.validateStoreName = /**
* @param {?} storeName
* @return {?}
*/
function (storeName) {
return this.db.objectStoreNames.contains(storeName);
};
/**
* @param {?} storeName
* @param {?} reject
* @return {?}
*/
DbWrapper.prototype.validateBeforeTransaction = /**
* @param {?} storeName
* @param {?} reject
* @return {?}
*/
function (storeName, reject) {
if (!this.db) {
reject('You need to use the openDatabase function to create a database before you query it!');
}
if (!this.validateStoreName(storeName)) {
reject(('objectStore does not exists: ' + storeName));
}
};
/**
* @param {?} options
* @return {?}
*/
DbWrapper.prototype.createTransaction = /**
* @param {?} options
* @return {?}
*/
function (options) {
/** @type {?} */
var trans = this.db.transaction(options.storeName, options.dbMode);
trans.onerror = options.error;
trans.oncomplete = options.complete;
trans.onabort = options.abort;
return trans;
};
return DbWrapper;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var Utils = /** @class */ (function () {
function Utils() {
this.indexedDB = window.indexedDB || (( /** @type {?} */(window))).mozIndexedDB || (( /** @type {?} */(window))).webkitIndexedDB || (( /** @type {?} */(window))).msIndexedDB;
}
return Utils;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxNeoIDB = /** @class */ (function () {
function NgxNeoIDB(dbName, version) {
this.utils = new Utils();
this.dbWrapper = new DbWrapper(dbName, version);
}
/**
* @param {?} version
* @param {?=} upgradeCallback
* @return {?}
*/
NgxNeoIDB.prototype.openDatabase = /**
* @param {?} version
* @param {?=} upgradeCallback
* @return {?}
*/
function (version, upgradeCallback) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.dbVersion = version;
/** @type {?} */
var request = _this.utils.indexedDB.open(_this.dbWrapper.dbName, version);
request.onsuccess = function (e) {
_this.dbWrapper.db = request.result;
resolve();
};
request.onerror = function (e) {
reject('IndexedDB error: ' + (( /** @type {?} */(e.target))).errorCode ?
(( /** @type {?} */(e.target))).errorCode + ' (' + (( /** @type {?} */(e.target))).error + ')' :
(( /** @type {?} */(e.target))).errorCode);
};
if (typeof upgradeCallback === 'function') {
request.onupgradeneeded = function (e) {
upgradeCallback(e, _this.dbWrapper.db);
};
}
});
};
/**
* @param {?} storeName
* @param {?} key
* @return {?}
*/
NgxNeoIDB.prototype.getByKey = /**
* @param {?} storeName
* @param {?} key
* @return {?}
*/
function (storeName, key) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: function (e) {
reject(e);
},
complete: function (e) {
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
/** @type {?} */
var request;
request = objectStore.get(key);
request.onsuccess = function (event) {
resolve((( /** @type {?} */(event.target))).result);
};
});
};
/**
* @param {?} storeName
* @param {?=} keyRange
* @param {?=} indexDetails
* @return {?}
*/
NgxNeoIDB.prototype.getAll = /**
* @param {?} storeName
* @param {?=} keyRange
* @param {?=} indexDetails
* @return {?}
*/
function (storeName, keyRange, indexDetails) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: function (e) {
reject(e);
},
complete: function (e) {
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
/** @type {?} */
var result = [];
/** @type {?} */
var request;
if (indexDetails) {
/** @type {?} */
var index = objectStore.index(indexDetails.indexName);
/** @type {?} */
var order = (indexDetails.order === 'desc') ? 'prev' : 'next';
request = index.openCursor(keyRange, ( /** @type {?} */(order)));
}
else {
request = objectStore.openCursor(keyRange);
}
request.onerror = function (e) {
reject(e);
};
request.onsuccess = function (evt) {
/** @type {?} */
var cursor = (( /** @type {?} */(evt.target))).result;
if (cursor) {
result.push(cursor.value);
cursor['continue']();
}
else {
resolve(result);
}
};
});
};
/**
* @param {?} storeName
* @param {?} value
* @param {?=} key
* @return {?}
*/
NgxNeoIDB.prototype.add = /**
* @param {?} storeName
* @param {?} value
* @param {?=} key
* @return {?}
*/
function (storeName, value, key) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: function (e) {
reject(e);
},
complete: function (e) {
resolve({ key: key, value: value });
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
/** @type {?} */
var request = objectStore.add(value, key);
request.onsuccess = function (evt) {
key = evt.target.result;
};
});
};
/**
* @param {?} storeName
* @param {?} value
* @param {?=} key
* @return {?}
*/
NgxNeoIDB.prototype.update = /**
* @param {?} storeName
* @param {?} value
* @param {?=} key
* @return {?}
*/
function (storeName, value, key) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: function (e) {
reject(e);
},
complete: function (e) {
resolve(value);
},
abort: function (e) {
reject(e);
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
objectStore.put(value, key);
});
};
/**
* @param {?} storeName
* @param {?} key
* @return {?}
*/
NgxNeoIDB.prototype.delete = /**
* @param {?} storeName
* @param {?} key
* @return {?}
*/
function (storeName, key) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: function (e) {
reject(e);
},
complete: function (e) {
resolve();
},
abort: function (e) {
reject(e);
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
objectStore['delete'](key);
});
};
/**
* @param {?} storeName
* @param {?} cursorCallback
* @param {?=} keyRange
* @return {?}
*/
NgxNeoIDB.prototype.openCursor = /**
* @param {?} storeName
* @param {?} cursorCallback
* @param {?=} keyRange
* @return {?}
*/
function (storeName, cursorCallback, keyRange) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: function (e) {
reject(e);
},
complete: function (e) {
resolve();
},
abort: function (e) {
reject(e);
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
/** @type {?} */
var request = objectStore.openCursor(keyRange);
request.onsuccess = function (evt) {
cursorCallback(evt);
resolve();
};
});
};
/**
* @param {?} storeName
* @return {?}
*/
NgxNeoIDB.prototype.clear = /**
* @param {?} storeName
* @return {?}
*/
function (storeName) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readwrite',
error: function (e) {
reject(e);
},
complete: function (e) {
resolve();
},
abort: function (e) {
reject(e);
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
objectStore.clear();
resolve();
});
};
/**
* @param {?} storeName
* @param {?} indexName
* @param {?} key
* @return {?}
*/
NgxNeoIDB.prototype.getByIndex = /**
* @param {?} storeName
* @param {?} indexName
* @param {?} key
* @return {?}
*/
function (storeName, indexName, key) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.dbWrapper.validateBeforeTransaction(storeName, reject);
/** @type {?} */
var transaction = _this.dbWrapper.createTransaction({
storeName: storeName,
dbMode: 'readonly',
error: function (e) {
reject(e);
},
abort: function (e) {
reject(e);
},
complete: function (e) {
}
});
/** @type {?} */
var objectStore = transaction.objectStore(storeName);
/** @type {?} */
var index = objectStore.index(indexName);
/** @type {?} */
var request = index.get(key);
request.onsuccess = function (event) {
resolve((( /** @type {?} */(event.target))).result);
};
});
};
return NgxNeoIDB;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
exports.NgxNeoIndexedDbModule = NgxNeoIndexedDbModule;
exports.NgxNeoIDB = NgxNeoIDB;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVvY29tcGxleHgtbmd4LW5lby1pbmRleGVkZGIudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1pbmRleGVkZGIvbGliL25neC1uZW8taW5kZXhlZC1kYi5tb2R1bGUudHMiLCJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvY2xhc3Nlcy9kYldyYXBwZXIudHMiLCJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWluZGV4ZWRkYi9saWIvY2xhc3Nlcy91dGlscy50cyIsIm5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8taW5kZXhlZGRiL2xpYi9OZ3hJREIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAYXV0aG9yIFNlYmFzdGlhbiBMYXJyaWV1XG4gKiBAZW1haWwgc2xhcnJpZXVAbmVvY29tcGxleHguY29tXG4gKiBAY3JlYXRlIGRhdGUgMjAxOC0xMS0yMiAwODoyMzozMFxuICogQG1vZGlmeSBkYXRlIDIwMTgtMTEtMjIgMDg6MjM6MzBcbiovXG5pbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtdLFxuICBpbXBvcnRzOiBbXSxcbiAgZXhwb3J0czogW11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TmVvSW5kZXhlZERiTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOZ3hOZW9JbmRleGVkRGJNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtdXG4gICAgfTtcbiAgfVxuIH1cbiIsImV4cG9ydCBjbGFzcyBEYldyYXBwZXIge1xyXG4gICAgZGJOYW1lOiBzdHJpbmc7XHJcbiAgICBkYlZlcnNpb246IG51bWJlcjtcclxuICAgIGRiOiBJREJEYXRhYmFzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkYk5hbWU6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7XHJcbiAgICAgICAgdGhpcy5kYlZlcnNpb24gPSB2ZXJzaW9uIHx8IDE7XHJcbiAgICAgICAgdGhpcy5kYiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVTdG9yZU5hbWUoc3RvcmVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHN0b3JlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWU6IHN0cmluZywgcmVqZWN0OiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmICghdGhpcy5kYikge1xyXG4gICAgICAgICAgICByZWplY3QoJ1lvdSBuZWVkIHRvIHVzZSB0aGUgb3BlbkRhdGFiYXNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhdGFiYXNlIGJlZm9yZSB5b3UgcXVlcnkgaXQhJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVN0b3JlTmFtZShzdG9yZU5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgoJ29iamVjdFN0b3JlIGRvZXMgbm90IGV4aXN0czogJyArIHN0b3JlTmFtZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVUcmFuc2FjdGlvbihcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgIHN0b3JlTmFtZTogc3RyaW5nLCBkYk1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSxcclxuICAgICAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4gYW55LFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiBhbnksXHJcbiAgICAgICAgICAgIGFib3J0PzogKGU6IEV2ZW50KSA9PiBhbnlcclxuICAgICAgICB9KTogSURCVHJhbnNhY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IHRyYW5zOiBJREJUcmFuc2FjdGlvbiA9IHRoaXMuZGIudHJhbnNhY3Rpb24ob3B0aW9ucy5zdG9yZU5hbWUsIG9wdGlvbnMuZGJNb2RlKTtcclxuICAgICAgICB0cmFucy5vbmVycm9yID0gb3B0aW9ucy5lcnJvcjtcclxuICAgICAgICB0cmFucy5vbmNvbXBsZXRlID0gb3B0aW9ucy5jb21wbGV0ZTtcclxuICAgICAgICB0cmFucy5vbmFib3J0ID0gb3B0aW9ucy5hYm9ydDtcclxuICAgICAgICByZXR1cm4gdHJhbnM7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIFV0aWxzIHtcclxuICAgIGluZGV4ZWREQjogSURCRmFjdG9yeTtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuaW5kZXhlZERCID0gd2luZG93LmluZGV4ZWREQiB8fCAoPGFueT53aW5kb3cpLm1vekluZGV4ZWREQiB8fCAoPGFueT53aW5kb3cpLndlYmtpdEluZGV4ZWREQiB8fCAoPGFueT53aW5kb3cpLm1zSW5kZXhlZERCO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IERiV3JhcHBlciB9IGZyb20gJy4vY2xhc3Nlcy9kYldyYXBwZXInO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuL2NsYXNzZXMvdXRpbHMnO1xuaW1wb3J0IHsgSW5kZXhEZXRhaWxzIH0gZnJvbSAnLi9jbGFzc2VzL2luZGV4RGV0YWlscyc7XG5cblxuZXhwb3J0IGNsYXNzIE5neE5lb0lEQiB7XG4gIHV0aWxzOiBVdGlscztcbiAgZGJXcmFwcGVyOiBEYldyYXBwZXI7XG5cbiAgY29uc3RydWN0b3IoZGJOYW1lOiBzdHJpbmcsIHZlcnNpb246IG51bWJlcikge1xuICAgIHRoaXMudXRpbHMgPSBuZXcgVXRpbHMoKTtcbiAgICB0aGlzLmRiV3JhcHBlciA9IG5ldyBEYldyYXBwZXIoZGJOYW1lLCB2ZXJzaW9uKTtcbiAgfVxuXG4gIG9wZW5EYXRhYmFzZSh2ZXJzaW9uOiBudW1iZXIsIHVwZ3JhZGVDYWxsYmFjaz86IEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIuZGJWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnV0aWxzLmluZGV4ZWREQi5vcGVuKHRoaXMuZGJXcmFwcGVyLmRiTmFtZSwgdmVyc2lvbik7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChlKSA9PiB7XG4gICAgICAgIHRoaXMuZGJXcmFwcGVyLmRiID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdCgnSW5kZXhlZERCIGVycm9yOiAnICsgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSA/XG4gICAgICAgICAgKDxhbnk+ZS50YXJnZXQpLmVycm9yQ29kZSArICcgKCcgKyAoPGFueT5lLnRhcmdldCkuZXJyb3IgKyAnKScgOlxuICAgICAgICAgICg8YW55PmUudGFyZ2V0KS5lcnJvckNvZGUpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGVvZiB1cGdyYWRlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZSkgPT4ge1xuICAgICAgICAgIHVwZ3JhZGVDYWxsYmFjayhlLCB0aGlzLmRiV3JhcHBlci5kYik7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRCeUtleShzdG9yZU5hbWU6IHN0cmluZywga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgICAgbGV0IHJlcXVlc3Q6IElEQlJlcXVlc3Q7XG5cbiAgICAgIHJlcXVlc3QgPSBvYmplY3RTdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICByZXNvbHZlKCg8YW55PmV2ZW50LnRhcmdldCkucmVzdWx0KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRBbGwoc3RvcmVOYW1lOiBzdHJpbmcsIGtleVJhbmdlPzogSURCS2V5UmFuZ2UsIGluZGV4RGV0YWlscz86IEluZGV4RGV0YWlscykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWRvbmx5JyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8YW55PiA9IFtdO1xuICAgICAgbGV0IHJlcXVlc3Q6IElEQlJlcXVlc3Q7XG4gICAgICBpZiAoaW5kZXhEZXRhaWxzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gb2JqZWN0U3RvcmUuaW5kZXgoaW5kZXhEZXRhaWxzLmluZGV4TmFtZSksXG4gICAgICAgICAgb3JkZXIgPSAoaW5kZXhEZXRhaWxzLm9yZGVyID09PSAnZGVzYycpID8gJ3ByZXYnIDogJ25leHQnO1xuICAgICAgICByZXF1ZXN0ID0gaW5kZXgub3BlbkN1cnNvcihrZXlSYW5nZSwgPElEQkN1cnNvckRpcmVjdGlvbj5vcmRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0ID0gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSk7XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gIChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnNvcjogYW55ID0gKDxJREJPcGVuREJSZXF1ZXN0PmV2dC50YXJnZXQpLnJlc3VsdDtcbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGN1cnNvci52YWx1ZSk7XG4gICAgICAgICAgY3Vyc29yWydjb250aW51ZSddKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgYWRkKHN0b3JlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBrZXk/OiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkd3JpdGUnLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5hZGQodmFsdWUsIGtleSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IChldnQ6IGFueSkgPT4ge1xuICAgICAgICBrZXkgPSBldnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGUoc3RvcmVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGtleT86IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcblxuICAgICAgb2JqZWN0U3RvcmUucHV0KHZhbHVlLCBrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlKHN0b3JlTmFtZTogc3RyaW5nLCBrZXk6IGFueSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGJXcmFwcGVyLnZhbGlkYXRlQmVmb3JlVHJhbnNhY3Rpb24oc3RvcmVOYW1lLCByZWplY3QpO1xuXG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGJXcmFwcGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc3RvcmVOYW1lOiBzdG9yZU5hbWUsXG4gICAgICAgIGRiTW9kZTogJ3JlYWR3cml0ZScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgICBvYmplY3RTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG5cbiAgICAgIG9iamVjdFN0b3JlWydkZWxldGUnXShrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgb3BlbkN1cnNvcihzdG9yZU5hbWU6IHN0cmluZywgY3Vyc29yQ2FsbGJhY2s6IChldnQ6IEV2ZW50KSA9PiB2b2lkLCBrZXlSYW5nZT86IElEQktleVJhbmdlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZG9ubHknLFxuICAgICAgICBlcnJvcjogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wbGV0ZTogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydDogKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgICAgb2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLFxuICAgICAgICByZXF1ZXN0ID0gb2JqZWN0U3RvcmUub3BlbkN1cnNvcihrZXlSYW5nZSk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgICAgY3Vyc29yQ2FsbGJhY2soZXZ0KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKHN0b3JlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kYldyYXBwZXIudmFsaWRhdGVCZWZvcmVUcmFuc2FjdGlvbihzdG9yZU5hbWUsIHJlamVjdCk7XG5cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYldyYXBwZXIuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgICAgICBzdG9yZU5hbWU6IHN0b3JlTmFtZSxcbiAgICAgICAgZGJNb2RlOiAncmVhZHdyaXRlJyxcbiAgICAgICAgZXJyb3I6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29tcGxldGU6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnQ6IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICAgIG9iamVjdFN0b3JlLmNsZWFyKCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRCeUluZGV4KHN0b3JlTmFtZTogc3RyaW5nLCBpbmRleE5hbWU6IHN0cmluZywga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRiV3JhcHBlci52YWxpZGF0ZUJlZm9yZVRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgcmVqZWN0KTtcblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiV3JhcHBlci5jcmVhdGVUcmFuc2FjdGlvbih7XG4gICAgICAgIHN0b3JlTmFtZTogc3RvcmVOYW1lLFxuICAgICAgICBkYk1vZGU6ICdyZWFkb25seScsXG4gICAgICAgIGVycm9yOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0OiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAgIG9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKSxcbiAgICAgICAgaW5kZXggPSBvYmplY3RTdG9yZS5pbmRleChpbmRleE5hbWUpLFxuICAgICAgICByZXF1ZXN0ID0gaW5kZXguZ2V0KGtleSk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHJlc29sdmUoKDxJREJPcGVuREJSZXF1ZXN0PmV2ZW50LnRhcmdldCkucmVzdWx0KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFRQTtTQVlFOzs7O1FBTk8sNkJBQU87OztZQUFkO2dCQUNFLE9BQU87b0JBQ0wsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsU0FBUyxFQUFFLEVBQUU7aUJBQ2QsQ0FBQzthQUNIOztvQkFYRkEsYUFBUSxTQUFDO3dCQUNSLFlBQVksRUFBRSxFQUFFO3dCQUNoQixPQUFPLEVBQUUsRUFBRTt3QkFDWCxPQUFPLEVBQUUsRUFBRTtxQkFDWjs7UUFRQSw0QkFBQztLQVpGOzs7Ozs7SUNSQTtRQUtJLG1CQUFZLE1BQWMsRUFBRSxPQUFlO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztTQUNsQjs7Ozs7UUFFRCxxQ0FBaUI7Ozs7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