@datorama/akita
Version:
State Management Tailored-Made for JS Applications
345 lines • 22.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { pairwise } from 'rxjs/operators';
import { AkitaPlugin } from '../plugin';
import { logAction } from '../../actions';
import { isFunction } from '../../isFunction';
/**
* @record
*/
export function StateHistoryParams() { }
if (false) {
/** @type {?|undefined} */
StateHistoryParams.prototype.maxAge;
/** @type {?|undefined} */
StateHistoryParams.prototype.comparator;
}
/**
* @template State
*/
var /**
* @template State
*/
StateHistoryPlugin = /** @class */ (function (_super) {
tslib_1.__extends(StateHistoryPlugin, _super);
function StateHistoryPlugin(query, params, _entityId) {
if (params === void 0) { params = {}; }
var _this = _super.call(this, query, {
resetFn: (/**
* @return {?}
*/
function () { return _this.clear(); })
}) || this;
_this.query = query;
_this.params = params;
_this._entityId = _entityId;
/**
* Allow skipping an update from outside
*/
_this.skip = false;
_this.history = {
past: [],
present: null,
future: []
};
/**
* Skip the update when redo/undo
*/
_this.skipUpdate = false;
params.maxAge = !!params.maxAge ? params.maxAge : 10;
params.comparator = params.comparator || ((/**
* @return {?}
*/
function () { return true; }));
_this.activate();
return _this;
}
Object.defineProperty(StateHistoryPlugin.prototype, "hasPast", {
get: /**
* @return {?}
*/
function () {
return this.history.past.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StateHistoryPlugin.prototype, "hasFuture", {
get: /**
* @return {?}
*/
function () {
return this.history.future.length > 0;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StateHistoryPlugin.prototype.activate = /**
* @return {?}
*/
function () {
var _this = this;
this.history.present = this.getSource(this._entityId);
this.subscription = ((/** @type {?} */ (this))).selectSource(this._entityId).pipe(pairwise())
.subscribe((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var _b = tslib_1.__read(_a, 2), past = _b[0], present = _b[1];
if (_this.skip) {
_this.skip = false;
return;
}
/**
* comparator: (prev, current) => isEqual(prev, current) === false
* @type {?}
*/
var shouldUpdate = _this.params.comparator(past, present);
if (!_this.skipUpdate && shouldUpdate) {
if (_this.history.past.length === _this.params.maxAge) {
_this.history.past = _this.history.past.slice(1);
}
_this.history.past = tslib_1.__spread(_this.history.past, [past]);
_this.history.present = present;
}
}));
};
/**
* @return {?}
*/
StateHistoryPlugin.prototype.undo = /**
* @return {?}
*/
function () {
if (this.history.past.length > 0) {
var _a = this.history, past = _a.past, present = _a.present;
/** @type {?} */
var previous = past[past.length - 1];
this.history.past = past.slice(0, past.length - 1);
this.history.present = previous;
this.history.future = tslib_1.__spread([present], this.history.future);
this.update();
}
};
/**
* @return {?}
*/
StateHistoryPlugin.prototype.redo = /**
* @return {?}
*/
function () {
if (this.history.future.length > 0) {
var _a = this.history, past = _a.past, present = _a.present;
/** @type {?} */
var next = this.history.future[0];
/** @type {?} */
var newFuture = this.history.future.slice(1);
this.history.past = tslib_1.__spread(past, [present]);
this.history.present = next;
this.history.future = newFuture;
this.update('Redo');
}
};
/**
* @param {?} index
* @return {?}
*/
StateHistoryPlugin.prototype.jumpToPast = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (index < 0 || index >= this.history.past.length)
return;
var _a = this.history, past = _a.past, future = _a.future;
/**
*
* const past = [1, 2, 3, 4, 5];
*
* newPast = past.slice(0, 2) = [1, 2];
* present = past[index] = 3;
* [...past.slice(2 + 1), ...future] = [4, 5];
*
* @type {?}
*/
var newPast = past.slice(0, index);
/** @type {?} */
var newFuture = tslib_1.__spread(past.slice(index + 1), future);
/** @type {?} */
var newPresent = past[index];
this.history.past = newPast;
this.history.present = newPresent;
this.history.future = newFuture;
this.update();
};
/**
* @param {?} index
* @return {?}
*/
StateHistoryPlugin.prototype.jumpToFuture = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (index < 0 || index >= this.history.future.length)
return;
var _a = this.history, past = _a.past, future = _a.future;
/** @type {?} */
var newPast = tslib_1.__spread(past, future.slice(0, index));
/** @type {?} */
var newPresent = future[index];
/** @type {?} */
var newFuture = future.slice(index + 1);
this.history.past = newPast;
this.history.present = newPresent;
this.history.future = newFuture;
this.update('Redo');
};
/**
* Clear the history
*
* @param customUpdateFn Callback function for only clearing part of the history
*
* @example
*
* stateHistory.clear((history) => {
* return {
* past: history.past,
* present: history.present,
* future: []
* };
* });
*/
/**
* Clear the history
*
* \@example
*
* stateHistory.clear((history) => {
* return {
* past: history.past,
* present: history.present,
* future: []
* };
* });
* @param {?=} customUpdateFn Callback function for only clearing part of the history
*
* @return {?}
*/
StateHistoryPlugin.prototype.clear = /**
* Clear the history
*
* \@example
*
* stateHistory.clear((history) => {
* return {
* past: history.past,
* present: history.present,
* future: []
* };
* });
* @param {?=} customUpdateFn Callback function for only clearing part of the history
*
* @return {?}
*/
function (customUpdateFn) {
this.history = isFunction(customUpdateFn) ? customUpdateFn(this.history) : {
past: [],
present: null,
future: []
};
};
/**
* @param {?=} clearHistory
* @return {?}
*/
StateHistoryPlugin.prototype.destroy = /**
* @param {?=} clearHistory
* @return {?}
*/
function (clearHistory) {
if (clearHistory === void 0) { clearHistory = false; }
if (clearHistory) {
this.clear();
}
this.subscription.unsubscribe();
};
/**
* @return {?}
*/
StateHistoryPlugin.prototype.ignoreNext = /**
* @return {?}
*/
function () {
this.skip = true;
};
/**
* @private
* @param {?=} action
* @return {?}
*/
StateHistoryPlugin.prototype.update = /**
* @private
* @param {?=} action
* @return {?}
*/
function (action) {
if (action === void 0) { action = 'Undo'; }
this.skipUpdate = true;
logAction("@StateHistory - " + action);
this.updateStore(this.history.present, this._entityId);
this.skipUpdate = false;
};
return StateHistoryPlugin;
}(AkitaPlugin));
/**
* @template State
*/
export { StateHistoryPlugin };
if (false) {
/**
* Allow skipping an update from outside
* @type {?}
* @private
*/
StateHistoryPlugin.prototype.skip;
/**
* @type {?}
* @private
*/
StateHistoryPlugin.prototype.history;
/**
* Skip the update when redo/undo
* @type {?}
* @private
*/
StateHistoryPlugin.prototype.skipUpdate;
/**
* @type {?}
* @private
*/
StateHistoryPlugin.prototype.subscription;
/**
* @type {?}
* @protected
*/
StateHistoryPlugin.prototype.query;
/**
* @type {?}
* @private
*/
StateHistoryPlugin.prototype.params;
/**
* @type {?}
* @private
*/
StateHistoryPlugin.prototype._entityId;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVIaXN0b3J5UGx1Z2luLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2FraXRhLyIsInNvdXJjZXMiOlsic3JjL3BsdWdpbnMvc3RhdGVIaXN0b3J5L3N0YXRlSGlzdG9yeVBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFXLE1BQU0sV0FBVyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBRTlDLHdDQUdDOzs7SUFGQyxvQ0FBZ0I7O0lBQ2hCLHdDQUFrRDs7Ozs7QUFTcEQ7Ozs7SUFBcUQsOENBQWtCO0lBY3JFLDRCQUFzQixLQUFxQixFQUFVLE1BQStCLEVBQVUsU0FBZTtRQUF4RCx1QkFBQSxFQUFBLFdBQStCO1FBQXBGLFlBQ0Usa0JBQU0sS0FBSyxFQUFFO1lBQ1gsT0FBTzs7O1lBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxLQUFLLEVBQUUsRUFBWixDQUFZLENBQUE7U0FDNUIsQ0FBQyxTQUlIO1FBUHFCLFdBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUsWUFBTSxHQUFOLE1BQU0sQ0FBeUI7UUFBVSxlQUFTLEdBQVQsU0FBUyxDQUFNOzs7O1FBWnJHLFVBQUksR0FBRyxLQUFLLENBQUM7UUFFYixhQUFPLEdBQUc7WUFDaEIsSUFBSSxFQUFFLEVBQUU7WUFDUixPQUFPLEVBQUUsSUFBSTtZQUNiLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQzs7OztRQUdNLGdCQUFVLEdBQUcsS0FBSyxDQUFDO1FBT3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUk7OztRQUFDLGNBQU0sT0FBQSxJQUFJLEVBQUosQ0FBSSxFQUFDLENBQUM7UUFDdEQsS0FBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztJQUNsQixDQUFDO0lBRUQsc0JBQUksdUNBQU87Ozs7UUFBWDtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHlDQUFTOzs7O1FBQWI7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQzs7O09BQUE7Ozs7SUFFRCxxQ0FBUTs7O0lBQVI7UUFBQSxpQkFxQkM7UUFwQkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLG1CQUFBLElBQUksRUFBTyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDNUUsU0FBUzs7OztRQUFDLFVBQUMsRUFBZTtnQkFBZiwwQkFBZSxFQUFkLFlBQUksRUFBRSxlQUFPO1lBQ3hCLElBQUcsS0FBSSxDQUFDLElBQUksRUFBRTtnQkFDWixLQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDbEIsT0FBTzthQUNSOzs7OztnQkFJSyxZQUFZLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUUxRCxJQUFHLENBQUMsS0FBSSxDQUFDLFVBQVUsSUFBSSxZQUFZLEVBQUU7Z0JBQ25DLElBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO29CQUNsRCxLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hEO2dCQUNELEtBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxvQkFBTyxLQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRSxJQUFJLEVBQUMsQ0FBQztnQkFDakQsS0FBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOzs7O0lBRUQsaUNBQUk7OztJQUFKO1FBQ0UsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLElBQUEsaUJBQWdDLEVBQTlCLGNBQUksRUFBRSxvQkFBd0I7O2dCQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxxQkFBSSxPQUFPLEdBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDZjtJQUNILENBQUM7Ozs7SUFFRCxpQ0FBSTs7O0lBQUo7UUFDRSxJQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBQSxpQkFBZ0MsRUFBOUIsY0FBSSxFQUFFLG9CQUF3Qjs7Z0JBQ2hDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7O2dCQUM3QixTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksb0JBQU8sSUFBSSxHQUFFLE9BQU8sRUFBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQjtJQUNILENBQUM7Ozs7O0lBRUQsdUNBQVU7Ozs7SUFBVixVQUFXLEtBQWE7UUFDdEIsSUFBRyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUVwRCxJQUFBLGlCQUErQixFQUE3QixjQUFJLEVBQUUsa0JBQXVCOzs7Ozs7Ozs7OztZQVUvQixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDOztZQUM5QixTQUFTLG9CQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFLLE1BQU0sQ0FBQzs7WUFDakQsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7Ozs7O0lBRUQseUNBQVk7Ozs7SUFBWixVQUFhLEtBQWE7UUFDeEIsSUFBRyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV0RCxJQUFBLGlCQUErQixFQUE3QixjQUFJLEVBQUUsa0JBQXVCOztZQUUvQixPQUFPLG9CQUFPLElBQUksRUFBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzs7WUFDOUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7O1lBQzFCLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQ0gsa0NBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFBTCxVQUFNLGNBQTREO1FBQ2hFLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLEVBQUUsRUFBRTtZQUNSLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFRCxvQ0FBTzs7OztJQUFQLFVBQVEsWUFBb0I7UUFBcEIsNkJBQUEsRUFBQSxvQkFBb0I7UUFDMUIsSUFBRyxZQUFZLEVBQUU7WUFDZixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZDtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQzs7OztJQUVELHVDQUFVOzs7SUFBVjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Ozs7OztJQUVPLG1DQUFNOzs7OztJQUFkLFVBQWUsTUFBZTtRQUFmLHVCQUFBLEVBQUEsZUFBZTtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixTQUFTLENBQUMscUJBQW1CLE1BQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDSCx5QkFBQztBQUFELENBQUMsQUExSkQsQ0FBcUQsV0FBVyxHQTBKL0Q7Ozs7Ozs7Ozs7O0lBeEpDLGtDQUFxQjs7Ozs7SUFFckIscUNBSUU7Ozs7OztJQUdGLHdDQUEyQjs7Ozs7SUFDM0IsMENBQXFCOzs7OztJQUVULG1DQUErQjs7Ozs7SUFBRSxvQ0FBdUM7Ozs7O0lBQUUsdUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFpcndpc2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBa2l0YVBsdWdpbiwgUXVlcmllcyB9IGZyb20gJy4uL3BsdWdpbic7XG5pbXBvcnQgeyBsb2dBY3Rpb24gfSBmcm9tICcuLi8uLi9hY3Rpb25zJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi8uLi9pc0Z1bmN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZUhpc3RvcnlQYXJhbXMge1xuICBtYXhBZ2U/OiBudW1iZXI7XG4gIGNvbXBhcmF0b3I/OiAocHJldlN0YXRlLCBjdXJyZW50U3RhdGUpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEhpc3Rvcnk8U3RhdGU+ID0ge1xuICBwYXN0OiBTdGF0ZVtdLFxuICBwcmVzZW50OiBTdGF0ZSB8IG51bGwsXG4gIGZ1dHVyZTogU3RhdGVbXVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdGVIaXN0b3J5UGx1Z2luPFN0YXRlID0gYW55PiBleHRlbmRzIEFraXRhUGx1Z2luPFN0YXRlPiB7XG4gIC8qKiBBbGxvdyBza2lwcGluZyBhbiB1cGRhdGUgZnJvbSBvdXRzaWRlICovXG4gIHByaXZhdGUgc2tpcCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgaGlzdG9yeSA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiBudWxsLFxuICAgIGZ1dHVyZTogW11cbiAgfTtcblxuICAvKiogU2tpcCB0aGUgdXBkYXRlIHdoZW4gcmVkby91bmRvICovXG4gIHByaXZhdGUgc2tpcFVwZGF0ZSA9IGZhbHNlO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcXVlcnk6IFF1ZXJpZXM8U3RhdGU+LCBwcml2YXRlIHBhcmFtczogU3RhdGVIaXN0b3J5UGFyYW1zID0ge30sIHByaXZhdGUgX2VudGl0eUlkPzogYW55KSB7XG4gICAgc3VwZXIocXVlcnksIHtcbiAgICAgIHJlc2V0Rm46ICgpID0+IHRoaXMuY2xlYXIoKVxuICAgIH0pO1xuICAgIHBhcmFtcy5tYXhBZ2UgPSAhIXBhcmFtcy5tYXhBZ2UgPyBwYXJhbXMubWF4QWdlIDogMTA7XG4gICAgcGFyYW1zLmNvbXBhcmF0b3IgPSBwYXJhbXMuY29tcGFyYXRvciB8fCAoKCkgPT4gdHJ1ZSk7XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgZ2V0IGhhc1Bhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5wYXN0Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaGFzRnV0dXJlKCkge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZnV0dXJlLmxlbmd0aCA+IDA7XG4gIH1cblxuICBhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IHRoaXMuZ2V0U291cmNlKHRoaXMuX2VudGl0eUlkKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9ICh0aGlzIGFzIGFueSkuc2VsZWN0U291cmNlKHRoaXMuX2VudGl0eUlkKS5waXBlKHBhaXJ3aXNlKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFzdCwgcHJlc2VudF0pID0+IHtcbiAgICAgICAgaWYodGhpcy5za2lwKSB7XG4gICAgICAgICAgdGhpcy5za2lwID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgY29tcGFyYXRvcjogKHByZXYsIGN1cnJlbnQpID0+IGlzRXF1YWwocHJldiwgY3VycmVudCkgPT09IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnBhcmFtcy5jb21wYXJhdG9yKHBhc3QsIHByZXNlbnQpO1xuXG4gICAgICAgIGlmKCF0aGlzLnNraXBVcGRhdGUgJiYgc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgaWYodGhpcy5oaXN0b3J5LnBhc3QubGVuZ3RoID09PSB0aGlzLnBhcmFtcy5tYXhBZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wYXN0ID0gdGhpcy5oaXN0b3J5LnBhc3Quc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaGlzdG9yeS5wYXN0ID0gWy4uLnRoaXMuaGlzdG9yeS5wYXN0LCBwYXN0XTtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IHByZXNlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgdW5kbygpIHtcbiAgICBpZih0aGlzLmhpc3RvcnkucGFzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHBhc3QsIHByZXNlbnQgfSA9IHRoaXMuaGlzdG9yeTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5oaXN0b3J5LnBhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IHByZXZpb3VzO1xuICAgICAgdGhpcy5oaXN0b3J5LmZ1dHVyZSA9IFtwcmVzZW50LCAuLi50aGlzLmhpc3RvcnkuZnV0dXJlXTtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVkbygpIHtcbiAgICBpZih0aGlzLmhpc3RvcnkuZnV0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgcGFzdCwgcHJlc2VudCB9ID0gdGhpcy5oaXN0b3J5O1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaGlzdG9yeS5mdXR1cmVbMF07XG4gICAgICBjb25zdCBuZXdGdXR1cmUgPSB0aGlzLmhpc3RvcnkuZnV0dXJlLnNsaWNlKDEpO1xuICAgICAgdGhpcy5oaXN0b3J5LnBhc3QgPSBbLi4ucGFzdCwgcHJlc2VudF07XG4gICAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IG5leHQ7XG4gICAgICB0aGlzLmhpc3RvcnkuZnV0dXJlID0gbmV3RnV0dXJlO1xuICAgICAgdGhpcy51cGRhdGUoJ1JlZG8nKTtcbiAgICB9XG4gIH1cblxuICBqdW1wVG9QYXN0KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZihpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5oaXN0b3J5LnBhc3QubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCB7IHBhc3QsIGZ1dHVyZSB9ID0gdGhpcy5oaXN0b3J5O1xuICAgIC8qKlxuICAgICAqXG4gICAgICogY29uc3QgcGFzdCA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgICAgKlxuICAgICAqIG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIDIpID0gWzEsIDJdO1xuICAgICAqIHByZXNlbnQgPSBwYXN0W2luZGV4XSA9IDM7XG4gICAgICogWy4uLnBhc3Quc2xpY2UoMiArIDEpLCAuLi5mdXR1cmVdID0gWzQsIDVdO1xuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgIGNvbnN0IG5ld0Z1dHVyZSA9IFsuLi5wYXN0LnNsaWNlKGluZGV4ICsgMSksIC4uLmZ1dHVyZV07XG4gICAgY29uc3QgbmV3UHJlc2VudCA9IHBhc3RbaW5kZXhdO1xuICAgIHRoaXMuaGlzdG9yeS5wYXN0ID0gbmV3UGFzdDtcbiAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IG5ld1ByZXNlbnQ7XG4gICAgdGhpcy5oaXN0b3J5LmZ1dHVyZSA9IG5ld0Z1dHVyZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAganVtcFRvRnV0dXJlKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZihpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5oaXN0b3J5LmZ1dHVyZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHsgcGFzdCwgZnV0dXJlIH0gPSB0aGlzLmhpc3Rvcnk7XG5cbiAgICBjb25zdCBuZXdQYXN0ID0gWy4uLnBhc3QsIC4uLmZ1dHVyZS5zbGljZSgwLCBpbmRleCldO1xuICAgIGNvbnN0IG5ld1ByZXNlbnQgPSBmdXR1cmVbaW5kZXhdO1xuICAgIGNvbnN0IG5ld0Z1dHVyZSA9IGZ1dHVyZS5zbGljZShpbmRleCArIDEpO1xuXG4gICAgdGhpcy5oaXN0b3J5LnBhc3QgPSBuZXdQYXN0O1xuICAgIHRoaXMuaGlzdG9yeS5wcmVzZW50ID0gbmV3UHJlc2VudDtcbiAgICB0aGlzLmhpc3RvcnkuZnV0dXJlID0gbmV3RnV0dXJlO1xuICAgIHRoaXMudXBkYXRlKCdSZWRvJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGhpc3RvcnlcbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbVVwZGF0ZUZuIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBvbmx5IGNsZWFyaW5nIHBhcnQgb2YgdGhlIGhpc3RvcnlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc3RhdGVIaXN0b3J5LmNsZWFyKChoaXN0b3J5KSA9PiB7XG4gICAqICByZXR1cm4ge1xuICAgKiAgICBwYXN0OiBoaXN0b3J5LnBhc3QsXG4gICAqICAgIHByZXNlbnQ6IGhpc3RvcnkucHJlc2VudCxcbiAgICogICAgZnV0dXJlOiBbXVxuICAgKiAgfTtcbiAgICogfSk7XG4gICAqL1xuICBjbGVhcihjdXN0b21VcGRhdGVGbj86IChoaXN0b3J5OiBIaXN0b3J5PFN0YXRlPikgPT4gSGlzdG9yeTxTdGF0ZT4pIHtcbiAgICB0aGlzLmhpc3RvcnkgPSBpc0Z1bmN0aW9uKGN1c3RvbVVwZGF0ZUZuKSA/IGN1c3RvbVVwZGF0ZUZuKHRoaXMuaGlzdG9yeSkgOiB7XG4gICAgICBwYXN0OiBbXSxcbiAgICAgIHByZXNlbnQ6IG51bGwsXG4gICAgICBmdXR1cmU6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGRlc3Ryb3koY2xlYXJIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZihjbGVhckhpc3RvcnkpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGlnbm9yZU5leHQoKSB7XG4gICAgdGhpcy5za2lwID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKGFjdGlvbiA9ICdVbmRvJykge1xuICAgIHRoaXMuc2tpcFVwZGF0ZSA9IHRydWU7XG4gICAgbG9nQWN0aW9uKGBAU3RhdGVIaXN0b3J5IC0gJHthY3Rpb259YCk7XG4gICAgdGhpcy51cGRhdGVTdG9yZSh0aGlzLmhpc3RvcnkucHJlc2VudCwgdGhpcy5fZW50aXR5SWQpO1xuICAgIHRoaXMuc2tpcFVwZGF0ZSA9IGZhbHNlO1xuICB9XG59XG4iXX0=