@datorama/akita
Version:
State Management Tailored-Made for JS Applications
647 lines • 33.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { BehaviorSubject } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { assertStoreHasName } from './errors';
import { commit, isTransactionInProcess } from './transaction';
import { deepFreeze } from './deepFreeze';
import { configKey } from './storeConfig';
import { getAkitaConfig } from './config';
import { isPlainObject } from './isPlainObject';
import { isFunction } from './isFunction';
import { dispatchAdded, dispatchDeleted, dispatchUpdate } from './dispatchers';
import { __stores__ } from './stores';
import { resetCustomAction, setAction } from './actions';
import { isNotBrowser } from './root';
import { __DEV__, isDev } from './env';
/**
*
* Store for managing any type of data
*
* \@example
*
* export interface SessionState {
* token: string;
* userDetails: UserDetails
* }
*
* export function createInitialState(): SessionState {
* return {
* token: '',
* userDetails: null
* };
* }
*
* \@StoreConfig({ name: 'session' })
* export class SessionStore extends Store<SessionState> {
* constructor() {
* super(createInitialState());
* }
* }
* @template S
*/
var /**
*
* Store for managing any type of data
*
* \@example
*
* export interface SessionState {
* token: string;
* userDetails: UserDetails
* }
*
* export function createInitialState(): SessionState {
* return {
* token: '',
* userDetails: null
* };
* }
*
* \@StoreConfig({ name: 'session' })
* export class SessionStore extends Store<SessionState> {
* constructor() {
* super(createInitialState());
* }
* }
* @template S
*/
Store = /** @class */ (function () {
function Store(initialState, options) {
if (options === void 0) { options = {}; }
this.options = options;
this.inTransaction = false;
this.cache = {
active: new BehaviorSubject(false),
ttl: null
};
this.onInit((/** @type {?} */ (initialState)));
}
/**
* Set the loading state
*
* @example
*
* store.setLoading(true)
*
*/
/**
* Set the loading state
*
* \@example
*
* store.setLoading(true)
*
* @param {?=} loading
* @return {?}
*/
Store.prototype.setLoading = /**
* Set the loading state
*
* \@example
*
* store.setLoading(true)
*
* @param {?=} loading
* @return {?}
*/
function (loading) {
if (loading === void 0) { loading = false; }
if (loading !== ((/** @type {?} */ (this._value()))).loading) {
isDev() && setAction('Set Loading');
this._setState((/**
* @param {?} state
* @return {?}
*/
function (state) { return ((/** @type {?} */ (tslib_1.__assign({}, state, { loading: loading })))); }));
}
};
/**
*
* Set whether the data is cached
*
* @example
*
* store.setHasCache(true)
* store.setHasCache(false)
* store.setHasCache(true, { restartTTL: true })
*
*/
/**
*
* Set whether the data is cached
*
* \@example
*
* store.setHasCache(true)
* store.setHasCache(false)
* store.setHasCache(true, { restartTTL: true })
*
* @param {?} hasCache
* @param {?=} options
* @return {?}
*/
Store.prototype.setHasCache = /**
*
* Set whether the data is cached
*
* \@example
*
* store.setHasCache(true)
* store.setHasCache(false)
* store.setHasCache(true, { restartTTL: true })
*
* @param {?} hasCache
* @param {?=} options
* @return {?}
*/
function (hasCache, options) {
var _this = this;
if (options === void 0) { options = { restartTTL: false }; }
if (hasCache !== this.cache.active.value) {
this.cache.active.next(hasCache);
}
if (options.restartTTL) {
/** @type {?} */
var ttlConfig = this.cacheConfig && this.cacheConfig.ttl;
if (ttlConfig) {
if (this.cache.ttl !== null) {
clearTimeout(this.cache.ttl);
}
this.cache.ttl = (/** @type {?} */ (setTimeout((/**
* @return {?}
*/
function () { return _this.setHasCache(false); }), ttlConfig)));
}
}
};
/**
* Set the error state
*
* @example
*
* store.setError({text: 'unable to load data' })
*
*/
/**
* Set the error state
*
* \@example
*
* store.setError({text: 'unable to load data' })
*
* @template T
* @param {?} error
* @return {?}
*/
Store.prototype.setError = /**
* Set the error state
*
* \@example
*
* store.setError({text: 'unable to load data' })
*
* @template T
* @param {?} error
* @return {?}
*/
function (error) {
if (error !== ((/** @type {?} */ (this._value()))).error) {
isDev() && setAction('Set Error');
this._setState((/**
* @param {?} state
* @return {?}
*/
function (state) { return ((/** @type {?} */ (tslib_1.__assign({}, state, { error: error })))); }));
}
};
// @internal
// @internal
/**
* @template R
* @param {?} project
* @return {?}
*/
Store.prototype._select =
// @internal
/**
* @template R
* @param {?} project
* @return {?}
*/
function (project) {
return this.store.asObservable().pipe(map(project), distinctUntilChanged());
};
// @internal
// @internal
/**
* @return {?}
*/
Store.prototype._value =
// @internal
/**
* @return {?}
*/
function () {
return this.storeValue;
};
// @internal
// @internal
/**
* @return {?}
*/
Store.prototype._cache =
// @internal
/**
* @return {?}
*/
function () {
return this.cache.active;
};
Object.defineProperty(Store.prototype, "config", {
// @internal
get:
// @internal
/**
* @return {?}
*/
function () {
return this.constructor[configKey] || {};
},
enumerable: true,
configurable: true
});
Object.defineProperty(Store.prototype, "storeName", {
// @internal
get:
// @internal
/**
* @return {?}
*/
function () {
return ((/** @type {?} */ (this.config))).storeName || ((/** @type {?} */ (this.options))).storeName || this.options.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Store.prototype, "deepFreeze", {
// @internal
get:
// @internal
/**
* @return {?}
*/
function () {
return this.config.deepFreezeFn || this.options.deepFreezeFn || deepFreeze;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Store.prototype, "cacheConfig", {
// @internal
get:
// @internal
/**
* @return {?}
*/
function () {
return this.config.cache || this.options.cache;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Store.prototype, "resettable", {
// @internal
get:
// @internal
/**
* @return {?}
*/
function () {
return this.config.resettable || this.options.resettable;
},
enumerable: true,
configurable: true
});
// @internal
// @internal
/**
* @param {?} newStateFn
* @param {?=} _dispatchAction
* @return {?}
*/
Store.prototype._setState =
// @internal
/**
* @param {?} newStateFn
* @param {?=} _dispatchAction
* @return {?}
*/
function (newStateFn, _dispatchAction) {
if (_dispatchAction === void 0) { _dispatchAction = true; }
this.storeValue = __DEV__ ? this.deepFreeze(newStateFn(this._value())) : newStateFn(this._value());
if (!this.store) {
this.store = new BehaviorSubject(this.storeValue);
return;
}
if (isTransactionInProcess()) {
this.handleTransaction();
return;
}
this.dispatch(this.storeValue, _dispatchAction);
};
/**
*
* Reset the current store back to the initial value
*
* @example
*
* store.reset()
*
*/
/**
*
* Reset the current store back to the initial value
*
* \@example
*
* store.reset()
*
* @return {?}
*/
Store.prototype.reset = /**
*
* Reset the current store back to the initial value
*
* \@example
*
* store.reset()
*
* @return {?}
*/
function () {
var _this = this;
if (this.isResettable()) {
isDev() && setAction('Reset');
this._setState((/**
* @return {?}
*/
function () { return Object.assign({}, _this._initialState); }));
this.setHasCache(false);
}
else {
isDev() && console.warn("You need to enable the reset functionality");
}
};
/**
* @param {?} stateOrCallback
* @return {?}
*/
Store.prototype.update = /**
* @param {?} stateOrCallback
* @return {?}
*/
function (stateOrCallback) {
var _this = this;
isDev() && setAction('Update');
this._setState((/**
* @param {?} state
* @return {?}
*/
function (state) {
/** @type {?} */
var newState = isFunction(stateOrCallback) ? stateOrCallback(state) : stateOrCallback;
/** @type {?} */
var merged = _this.akitaPreUpdate(state, (/** @type {?} */ (tslib_1.__assign({}, state, newState))));
return isPlainObject(state) ? merged : new ((/** @type {?} */ (state))).constructor(merged);
}));
};
/**
* @param {?} newOptions
* @return {?}
*/
Store.prototype.updateStoreConfig = /**
* @param {?} newOptions
* @return {?}
*/
function (newOptions) {
this.options = tslib_1.__assign({}, this.options, newOptions);
};
// @internal
// @internal
/**
* @param {?} _
* @param {?} nextState
* @return {?}
*/
Store.prototype.akitaPreUpdate =
// @internal
/**
* @param {?} _
* @param {?} nextState
* @return {?}
*/
function (_, nextState) {
return nextState;
};
/**
* @return {?}
*/
Store.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy();
};
/**
*
* Destroy the store
*
* @example
*
* store.destroy()
*
*/
/**
*
* Destroy the store
*
* \@example
*
* store.destroy()
*
* @return {?}
*/
Store.prototype.destroy = /**
*
* Destroy the store
*
* \@example
*
* store.destroy()
*
* @return {?}
*/
function () {
if (isNotBrowser)
return;
if (!((/** @type {?} */ (window))).hmrEnabled && this === __stores__[this.storeName]) {
delete __stores__[this.storeName];
dispatchDeleted(this.storeName);
this.setHasCache(false);
this.cache.active.complete();
}
};
/**
* @private
* @param {?} initialState
* @return {?}
*/
Store.prototype.onInit = /**
* @private
* @param {?} initialState
* @return {?}
*/
function (initialState) {
__stores__[this.storeName] = this;
this._setState((/**
* @return {?}
*/
function () { return initialState; }));
dispatchAdded(this.storeName);
if (this.isResettable()) {
this._initialState = initialState;
}
isDev() && assertStoreHasName(this.storeName, this.constructor.name);
};
/**
* @private
* @param {?} state
* @param {?=} _dispatchAction
* @return {?}
*/
Store.prototype.dispatch = /**
* @private
* @param {?} state
* @param {?=} _dispatchAction
* @return {?}
*/
function (state, _dispatchAction) {
if (_dispatchAction === void 0) { _dispatchAction = true; }
this.store.next(state);
if (_dispatchAction) {
dispatchUpdate(this.storeName);
resetCustomAction();
}
};
/**
* @private
* @return {?}
*/
Store.prototype.watchTransaction = /**
* @private
* @return {?}
*/
function () {
var _this = this;
commit().subscribe((/**
* @return {?}
*/
function () {
_this.inTransaction = false;
_this.dispatch(_this._value());
}));
};
/**
* @private
* @return {?}
*/
Store.prototype.isResettable = /**
* @private
* @return {?}
*/
function () {
if (this.resettable === false) {
return false;
}
return this.resettable || getAkitaConfig().resettable;
};
/**
* @private
* @return {?}
*/
Store.prototype.handleTransaction = /**
* @private
* @return {?}
*/
function () {
if (!this.inTransaction) {
this.watchTransaction();
this.inTransaction = true;
}
};
return Store;
}());
/**
*
* Store for managing any type of data
*
* \@example
*
* export interface SessionState {
* token: string;
* userDetails: UserDetails
* }
*
* export function createInitialState(): SessionState {
* return {
* token: '',
* userDetails: null
* };
* }
*
* \@StoreConfig({ name: 'session' })
* export class SessionStore extends Store<SessionState> {
* constructor() {
* super(createInitialState());
* }
* }
* @template S
*/
export { Store };
if (false) {
/**
* @type {?}
* @private
*/
Store.prototype.store;
/**
* @type {?}
* @private
*/
Store.prototype.storeValue;
/**
* @type {?}
* @private
*/
Store.prototype.inTransaction;
/**
* @type {?}
* @private
*/
Store.prototype._initialState;
/**
* @type {?}
* @protected
*/
Store.prototype.cache;
/**
* @type {?}
* @protected
*/
Store.prototype.options;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQnZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFVRSxlQUFZLFlBQXdCLEVBQVksT0FBeUM7UUFBekMsd0JBQUEsRUFBQSxZQUF5QztRQUF6QyxZQUFPLEdBQVAsT0FBTyxD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QVUsQ0FBQztJQUN4RCxDQUFDOzs7OztJQUVPLGlDQUFpQjs7OztJQUF6QjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUNILFlBQUM7QUFBRCxDQUFDLEFBeFBELElBd1BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF2UEMsc0JBQTRDOzs7OztJQUM1QywyQkFBc0I7Ozs7O0lBQ3RCLDhCQUE4Qjs7Ozs7SUFDOUIsOEJBQXlCOzs7OztJQUN6QixzQkFHRTs7Ozs7SUFFb0Msd0JBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmVDYWNoZSwgVXBkYXRlU3RhdGVDYWxsYmFjayB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgYXNzZXJ0U3RvcmVIYXNOYW1lIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgY29tbWl0LCBpc1RyYW5zYWN0aW9uSW5Qcm9jZXNzIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi9kZWVwRnJlZXplJztcbmltcG9ydCB7IGNvbmZpZ0tleSwgU3RvcmVDb25maWdPcHRpb25zLCBVcGRhdGFibGVTdG9yZUNvbmZpZ09wdGlvbnMgfSBmcm9tICcuL3N0b3JlQ29uZmlnJztcbmltcG9ydCB7IGdldEFraXRhQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCB9IGZyb20gJy4vaXNQbGFpbk9iamVjdCc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9pc0Z1bmN0aW9uJztcbmltcG9ydCB7IGRpc3BhdGNoQWRkZWQsIGRpc3BhdGNoRGVsZXRlZCwgZGlzcGF0Y2hVcGRhdGUgfSBmcm9tICcuL2Rpc3BhdGNoZXJzJztcbmltcG9ydCB7IF9fc3RvcmVzX18gfSBmcm9tICcuL3N0b3Jlcyc7XG5pbXBvcnQgeyByZXNldEN1c3RvbUFjdGlvbiwgc2V0QWN0aW9uIH0gZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB7IGlzTm90QnJvd3NlciB9IGZyb20gJy4vcm9vdCc7XG5pbXBvcnQgeyBfX0RFVl9fLCBpc0RldiB9IGZyb20gJy4vZW52JztcblxuLyoqXG4gKlxuICogU3RvcmUgZm9yIG1hbmFnaW5nIGFueSB0eXBlIG9mIGRhdGFcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblN0YXRlIHtcbiAqICAgdG9rZW46IHN0cmluZztcbiAqICAgdXNlckRldGFpbHM6IFVzZXJEZXRhaWxzXG4gKiB9XG4gKlxuICogZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluaXRpYWxTdGF0ZSgpOiBTZXNzaW9uU3RhdGUge1xuICogIHJldHVybiB7XG4gKiAgICB0b2tlbjogJycsXG4gKiAgICB1c2VyRGV0YWlsczogbnVsbFxuICogIH07XG4gKiB9XG4gKlxuICogQFN0b3JlQ29uZmlnKHsgbmFtZTogJ3Nlc3Npb24nIH0pXG4gKiBleHBvcnQgY2xhc3MgU2Vzc2lvblN0b3JlIGV4dGVuZHMgU3RvcmU8U2Vzc2lvblN0YXRlPiB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgc3VwZXIoY3JlYXRlSW5pdGlhbFN0YXRlKCkpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yZTxTID0gYW55PiB7XG4gIHByaXZhdGUgc3RvcmU6IEJlaGF2aW9yU3ViamVjdDxSZWFkb25seTxTPj47XG4gIHByaXZhdGUgc3RvcmVWYWx1ZTogUztcbiAgcHJpdmF0ZSBpblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogUztcbiAgcHJvdGVjdGVkIGNhY2hlOiBTdG9yZUNhY2hlID0ge1xuICAgIGFjdGl2ZTogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgdHRsOiBudWxsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFN0YXRlOiBQYXJ0aWFsPFM+LCBwcm90ZWN0ZWQgb3B0aW9uczogUGFydGlhbDxTdG9yZUNvbmZpZ09wdGlvbnM+ID0ge30pIHtcbiAgICB0aGlzLm9uSW5pdChpbml0aWFsU3RhdGUgYXMgUyk7XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgbG9hZGluZyBzdGF0ZVxuICAgKlxuICAgKiAgQGV4YW1wbGVcbiAgICpcbiAgICogIHN0b3JlLnNldExvYWRpbmcodHJ1ZSlcbiAgICpcbiAgICovXG4gIHNldExvYWRpbmcobG9hZGluZyA9IGZhbHNlKSB7XG4gICAgaWYgKGxvYWRpbmcgIT09ICh0aGlzLl92YWx1ZSgpIGFzIFMgJiB7IGxvYWRpbmc6IGJvb2xlYW4gfSkubG9hZGluZykge1xuICAgICAgaXNEZXYoKSAmJiBzZXRBY3Rpb24oJ1NldCBMb2FkaW5nJyk7XG4gICAgICB0aGlzLl9zZXRTdGF0ZShzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgbG9hZGluZyB9IGFzIFMgJiB7IGxvYWRpbmc6IGJvb2xlYW4gfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTZXQgd2hldGhlciB0aGUgZGF0YSBpcyBjYWNoZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc3RvcmUuc2V0SGFzQ2FjaGUodHJ1ZSlcbiAgICogc3RvcmUuc2V0SGFzQ2FjaGUoZmFsc2UpXG4gICAqIHN0b3JlLnNldEhhc0NhY2hlKHRydWUsIHsgcmVzdGFydFRUTDogdHJ1ZSB9KVxuICAgKlxuICAgKi9cbiAgc2V0SGFzQ2FjaGUoaGFzQ2FjaGU6IGJvb2xlYW4sIG9wdGlvbnM6IHsgcmVzdGFydFRUTDogYm9vbGVhbiB9ID0geyByZXN0YXJ0VFRMOiBmYWxzZSB9KSB7XG4gICAgaWYgKGhhc0NhY2hlICE9PSB0aGlzLmNhY2hlLmFjdGl2ZS52YWx1ZSkge1xuICAgICAgdGhpcy5jYWNoZS5hY3RpdmUubmV4dChoYXNDYWNoZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVzdGFydFRUTCkge1xuICAgICAgY29uc3QgdHRsQ29uZmlnID0gdGhpcy5jYWNoZUNvbmZpZyAmJiB0aGlzLmNhY2hlQ29uZmlnLnR0bDtcbiAgICAgIGlmICh0dGxDb25maWcpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGUudHRsICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FjaGUudHRsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlLnR0bCA9IDxhbnk+c2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEhhc0NhY2hlKGZhbHNlKSwgdHRsQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIFNldCB0aGUgZXJyb3Igc3RhdGVcbiAgICpcbiAgICogIEBleGFtcGxlXG4gICAqXG4gICAqICBzdG9yZS5zZXRFcnJvcih7dGV4dDogJ3VuYWJsZSB0byBsb2FkIGRhdGEnIH0pXG4gICAqXG4gICAqL1xuICBzZXRFcnJvcjxUPihlcnJvcjogVCkge1xuICAgIGlmIChlcnJvciAhPT0gKHRoaXMuX3ZhbHVlKCkgYXMgUyAmIHsgZXJyb3I6IGFueSB9KS5lcnJvcikge1xuICAgICAgaXNEZXYoKSAmJiBzZXRBY3Rpb24oJ1NldCBFcnJvcicpO1xuICAgICAgdGhpcy5fc2V0U3RhdGUoc3RhdGUgPT4gKHsgLi4uc3RhdGUsIGVycm9yIH0gYXMgUyAmIHsgZXJyb3I6IGFueSB9KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIF9zZWxlY3Q8Uj4ocHJvamVjdDogKHN0b3JlOiBTKSA9PiBSKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIG1hcChwcm9qZWN0KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICApO1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIF92YWx1ZSgpOiBTIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZVZhbHVlO1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIF9jYWNoZSgpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmNhY2hlLmFjdGl2ZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgY29uZmlnKCk6IFN0b3JlQ29uZmlnT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3JbY29uZmlnS2V5XSB8fCB7fTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgc3RvcmVOYW1lKCkge1xuICAgIHJldHVybiAodGhpcy5jb25maWcgYXMgU3RvcmVDb25maWdPcHRpb25zICYgeyBzdG9yZU5hbWU6IHN0cmluZyB9KS5zdG9yZU5hbWUgfHwgKHRoaXMub3B0aW9ucyBhcyBTdG9yZUNvbmZpZ09wdGlvbnMgJiB7IHN0b3JlTmFtZTogc3RyaW5nIH0pLnN0b3JlTmFtZSB8fCB0aGlzLm9wdGlvbnMubmFtZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgZGVlcEZyZWV6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGVlcEZyZWV6ZUZuIHx8IHRoaXMub3B0aW9ucy5kZWVwRnJlZXplRm4gfHwgZGVlcEZyZWV6ZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgY2FjaGVDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNhY2hlIHx8IHRoaXMub3B0aW9ucy5jYWNoZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgcmVzZXR0YWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVzZXR0YWJsZSB8fCB0aGlzLm9wdGlvbnMucmVzZXR0YWJsZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBfc2V0U3RhdGUobmV3U3RhdGVGbjogKHN0YXRlOiBSZWFkb25seTxTPikgPT4gUywgX2Rpc3BhdGNoQWN0aW9uID0gdHJ1ZSkge1xuICAgIHRoaXMuc3RvcmVWYWx1ZSA9IF9fREVWX18gPyB0aGlzLmRlZXBGcmVlemUobmV3U3RhdGVGbih0aGlzLl92YWx1ZSgpKSkgOiBuZXdTdGF0ZUZuKHRoaXMuX3ZhbHVlKCkpO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlKSB7XG4gICAgICB0aGlzLnN0b3JlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLnN0b3JlVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1RyYW5zYWN0aW9uSW5Qcm9jZXNzKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlVHJhbnNhY3Rpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoKHRoaXMuc3RvcmVWYWx1ZSwgX2Rpc3BhdGNoQWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBSZXNldCB0aGUgY3VycmVudCBzdG9yZSBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHN0b3JlLnJlc2V0KClcbiAgICpcbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLmlzUmVzZXR0YWJsZSgpKSB7XG4gICAgICBpc0RldigpICYmIHNldEFjdGlvbignUmVzZXQnKTtcbiAgICAgIHRoaXMuX3NldFN0YXRlKCgpID0+IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2luaXRpYWxTdGF0ZSkpO1xuICAgICAgdGhpcy5zZXRIYXNDYWNoZShmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRGV2KCkgJiYgY29uc29sZS53YXJuKGBZb3UgbmVlZCB0byBlbmFibGUgdGhlIHJlc2V0IGZ1bmN0aW9uYWxpdHlgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXBkYXRlIHRoZSBzdG9yZSdzIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICogICByZXR1cm4gey4uLn1cbiAgICogfSlcbiAgICovXG4gIHVwZGF0ZShzdGF0ZUNhbGxiYWNrOiBVcGRhdGVTdGF0ZUNhbGxiYWNrPFM+KTtcbiAgLyoqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICB0aGlzLnN0b3JlLnVwZGF0ZSh7IHRva2VuOiB0b2tlbiB9KVxuICAgKi9cbiAgdXBkYXRlKHN0YXRlOiBQYXJ0aWFsPFM+KTtcbiAgdXBkYXRlKHN0YXRlT3JDYWxsYmFjazogUGFydGlhbDxTPiB8IFVwZGF0ZVN0YXRlQ2FsbGJhY2s8Uz4pIHtcbiAgICBpc0RldigpICYmIHNldEFjdGlvbignVXBkYXRlJyk7XG5cbiAgICB0aGlzLl9zZXRTdGF0ZShzdGF0ZSA9PiB7XG4gICAgICBjb25zdCBuZXdTdGF0ZSA9IGlzRnVuY3Rpb24oc3RhdGVPckNhbGxiYWNrKSA/IHN0YXRlT3JDYWxsYmFjayhzdGF0ZSkgOiBzdGF0ZU9yQ2FsbGJhY2s7XG4gICAgICBjb25zdCBtZXJnZWQgPSB0aGlzLmFraXRhUHJlVXBkYXRlKHN0YXRlLCB7IC4uLnN0YXRlLCAuLi5uZXdTdGF0ZSB9IGFzIFMpO1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3Qoc3RhdGUpID8gbWVyZ2VkIDogbmV3IChzdGF0ZSBhcyBhbnkpLmNvbnN0cnVjdG9yKG1lcmdlZCk7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVTdG9yZUNvbmZpZyhuZXdPcHRpb25zOiBVcGRhdGFibGVTdG9yZUNvbmZpZ09wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucywgLi4ubmV3T3B0aW9ucyB9O1xuICB9XG5cbiAgLy8gQGludGVybmFsXG4gIGFraXRhUHJlVXBkYXRlKF86IFJlYWRvbmx5PFM+LCBuZXh0U3RhdGU6IFJlYWRvbmx5PFM+KTogUyB7XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIERlc3Ryb3kgdGhlIHN0b3JlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHN0b3JlLmRlc3Ryb3koKVxuICAgKlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAoaXNOb3RCcm93c2VyKSByZXR1cm47XG4gICAgaWYgKCEod2luZG93IGFzIGFueSkuaG1yRW5hYmxlZCAmJiB0aGlzID09PSBfX3N0b3Jlc19fW3RoaXMuc3RvcmVOYW1lXSkge1xuICAgICAgZGVsZXRlIF9fc3RvcmVzX19bdGhpcy5zdG9yZU5hbWVdO1xuICAgICAgZGlzcGF0Y2hEZWxldGVkKHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgIHRoaXMuc2V0SGFzQ2FjaGUoZmFsc2UpO1xuICAgICAgdGhpcy5jYWNoZS5hY3RpdmUuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uSW5pdChpbml0aWFsU3RhdGU6IFMpIHtcbiAgICBfX3N0b3Jlc19fW3RoaXMuc3RvcmVOYW1lXSA9IHRoaXM7XG4gICAgdGhpcy5fc2V0U3RhdGUoKCkgPT4gaW5pdGlhbFN0YXRlKTtcbiAgICBkaXNwYXRjaEFkZGVkKHRoaXMuc3RvcmVOYW1lKTtcbiAgICBpZiAodGhpcy5pc1Jlc2V0dGFibGUoKSkge1xuICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIH1cbiAgICBpc0RldigpICYmIGFzc2VydFN0b3JlSGFzTmFtZSh0aGlzLnN0b3JlTmFtZSwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcGF0Y2goc3RhdGU6IFMsIF9kaXNwYXRjaEFjdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLnN0b3JlLm5leHQoc3RhdGUpO1xuICAgIGlmIChfZGlzcGF0Y2hBY3Rpb24pIHtcbiAgICAgIGRpc3BhdGNoVXBkYXRlKHRoaXMuc3RvcmVOYW1lKTtcbiAgICAgIHJlc2V0Q3VzdG9tQWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaFRyYW5zYWN0aW9uKCkge1xuICAgIGNvbW1pdCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlzcGF0Y2godGhpcy5fdmFsdWUoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzUmVzZXR0YWJsZSgpIHtcbiAgICBpZiAodGhpcy5yZXNldHRhYmxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXNldHRhYmxlIHx8IGdldEFraXRhQ29uZmlnKCkucmVzZXR0YWJsZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHJhbnNhY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmluVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRoaXMud2F0Y2hUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==