UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

345 lines 22.3 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVIaXN0b3J5UGx1Z2luLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2FraXRhLyIsInNvdXJjZXMiOlsic3JjL3BsdWdpbnMvc3RhdGVIaXN0b3J5L3N0YXRlSGlzdG9yeVBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFXLE1BQU0sV0FBVyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7O0FBRTlDLHdDQUdDOzs7SUFGQyxvQ0FBZ0I7O0lBQ2hCLHdDQUFrRDs7Ozs7QUFTcEQ7Ozs7SUFBcUQsOENBQWtCO0lBY3JFLDRCQUFzQixLQUFxQixFQUFVLE1BQStCLEVBQVUsU0FBZTtRQUF4RCx1QkFBQSxFQUFBLFdBQStCO1FBQXBGLFlBQ0Usa0JBQU0sS0FBSyxFQUFFO1lBQ1gsT0FBTzs7O1lBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxLQUFLLEVBQUUsRUFBWixDQUFZLENBQUE7U0FDNUIsQ0FBQyxTQUlIO1FBUHFCLFdBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUsWUFBTSxHQUFOLE1BQU0sQ0FBeUI7UUFBVSxlQUFTLEdBQVQsU0FBUyxDQUFNOzs7O1FBWnJHLFVBQUksR0FBRyxLQUFLLENBQUM7UUFFYixhQUFPLEdBQUc7WUFDaEIsSUFBSSxFQUFFLEVBQUU7WUFDUixPQUFPLEVBQUUsSUFBSTtZQUNiLE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQzs7OztRQUdNLGdCQUFVLEdBQUcsS0FBSyxDQUFDO1FBT3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FB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QUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Ozs7OztJQUVPLG1DQUFNOzs7OztJQUFkLFVBQWUsTUFBZTtRQUFmLHVCQUFBLEVBQUEsZUFBZTtRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixTQUFTLENBQUMscUJBQW1CLE1BQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDSCx5QkFBQztBQUFELENBQUMsQUExSkQsQ0FBcUQsV0FBVyxHQTBKL0Q7Ozs7Ozs7Ozs7O0lBeEpDLGtDQUFxQjs7Ozs7SUFFckIscUNBSUU7Ozs7OztJQUdGLHdDQUEyQjs7Ozs7SUFDM0IsMENBQXFCOzs7OztJQUVULG1DQUErQjs7Ozs7SUFBRSxvQ0FBdUM7Ozs7O0lBQUUsdUNBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFpcndpc2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBa2l0YVBsdWdpbiwgUXVlcmllcyB9IGZyb20gJy4uL3BsdWdpbic7XG5pbXBvcnQgeyBsb2dBY3Rpb24gfSBmcm9tICcuLi8uLi9hY3Rpb25zJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi8uLi9pc0Z1bmN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZUhpc3RvcnlQYXJhbXMge1xuICBtYXhBZ2U/OiBudW1iZXI7XG4gIGNvbXBhcmF0b3I/OiAocHJldlN0YXRlLCBjdXJyZW50U3RhdGUpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEhpc3Rvcnk8U3RhdGU+ID0ge1xuICBwYXN0OiBTdGF0ZVtdLFxuICBwcmVzZW50OiBTdGF0ZSB8IG51bGwsXG4gIGZ1dHVyZTogU3RhdGVbXVxufVxuXG5leHBvcnQgY2xhc3MgU3RhdGVIaXN0b3J5UGx1Z2luPFN0YXRlID0gYW55PiBleHRlbmRzIEFraXRhUGx1Z2luPFN0YXRlPiB7XG4gIC8qKiBBbGxvdyBza2lwcGluZyBhbiB1cGRhdGUgZnJvbSBvdXRzaWRlICovXG4gIHByaXZhdGUgc2tpcCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgaGlzdG9yeSA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiBudWxsLFxuICAgIGZ1dHVyZTogW11cbiAgfTtcblxuICAvKiogU2tpcCB0aGUgdXBkYXRlIHdoZW4gcmVkby91bmRvICovXG4gIHByaXZhdGUgc2tpcFVwZGF0ZSA9IGZhbHNlO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcXVlcnk6IFF1ZXJpZXM8U3RhdGU+LCBwcml2YXRlIHBhcmFtczogU3RhdGVIaXN0b3J5UGFyYW1zID0ge30sIHByaXZhdGUgX2VudGl0eUlkPzogYW55KSB7XG4gICAgc3VwZXIocXVlcnksIHtcbiAgICAgIHJlc2V0Rm46ICgpID0+IHRoaXMuY2xlYXIoKVxuICAgIH0pO1xuICAgIHBhcmFtcy5tYXhBZ2UgPSAhIXBhcmFtcy5tYXhBZ2UgPyBwYXJhbXMubWF4QWdlIDogMTA7XG4gICAgcGFyYW1zLmNvbXBhcmF0b3IgPSBwYXJhbXMuY29tcGFyYXRvciB8fCAoKCkgPT4gdHJ1ZSk7XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgZ2V0IGhhc1Bhc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5wYXN0Lmxlbmd0aCA+IDA7XG4gIH1cblxuICBnZXQgaGFzRnV0dXJlKCkge1xuICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZnV0dXJlLmxlbmd0aCA+IDA7XG4gIH1cblxuICBhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IHRoaXMuZ2V0U291cmNlKHRoaXMuX2VudGl0eUlkKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9ICh0aGlzIGFzIGFueSkuc2VsZWN0U291cmNlKHRoaXMuX2VudGl0eUlkKS5waXBlKHBhaXJ3aXNlKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcGFzdCwgcHJlc2VudF0pID0+IHtcbiAgICAgICAgaWYodGhpcy5za2lwKSB7XG4gICAgICAgICAgdGhpcy5za2lwID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgY29tcGFyYXRvcjogKHByZXYsIGN1cnJlbnQpID0+IGlzRXF1YWwocHJldiwgY3VycmVudCkgPT09IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSB0aGlzLnBhcmFtcy5jb21wYXJhdG9yKHBhc3QsIHByZXNlbnQpO1xuXG4gICAgICAgIGlmKCF0aGlzLnNraXBVcGRhdGUgJiYgc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgaWYodGhpcy5oaXN0b3J5LnBhc3QubGVuZ3RoID09PSB0aGlzLnBhcmFtcy5tYXhBZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeS5wYXN0ID0gdGhpcy5oaXN0b3J5LnBhc3Quc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaGlzdG9yeS5wYXN0ID0gWy4uLnRoaXMuaGlzdG9yeS5wYXN0LCBwYXN0XTtcbiAgICAgICAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IHByZXNlbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgdW5kbygpIHtcbiAgICBpZih0aGlzLmhpc3RvcnkucGFzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHBhc3QsIHByZXNlbnQgfSA9IHRoaXMuaGlzdG9yeTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFzdFtwYXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5oaXN0b3J5LnBhc3QgPSBwYXN0LnNsaWNlKDAsIHBhc3QubGVuZ3RoIC0gMSk7XG4gICAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IHByZXZpb3VzO1xuICAgICAgdGhpcy5oaXN0b3J5LmZ1dHVyZSA9IFtwcmVzZW50LCAuLi50aGlzLmhpc3RvcnkuZnV0dXJlXTtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVkbygpIHtcbiAgICBpZih0aGlzLmhpc3RvcnkuZnV0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgcGFzdCwgcHJlc2VudCB9ID0gdGhpcy5oaXN0b3J5O1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaGlzdG9yeS5mdXR1cmVbMF07XG4gICAgICBjb25zdCBuZXdGdXR1cmUgPSB0aGlzLmhpc3RvcnkuZnV0dXJlLnNsaWNlKDEpO1xuICAgICAgdGhpcy5oaXN0b3J5LnBhc3QgPSBbLi4ucGFzdCwgcHJlc2VudF07XG4gICAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IG5leHQ7XG4gICAgICB0aGlzLmhpc3RvcnkuZnV0dXJlID0gbmV3RnV0dXJlO1xuICAgICAgdGhpcy51cGRhdGUoJ1JlZG8nKTtcbiAgICB9XG4gIH1cblxuICBqdW1wVG9QYXN0KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZihpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5oaXN0b3J5LnBhc3QubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCB7IHBhc3QsIGZ1dHVyZSB9ID0gdGhpcy5oaXN0b3J5O1xuICAgIC8qKlxuICAgICAqXG4gICAgICogY29uc3QgcGFzdCA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgICAgKlxuICAgICAqIG5ld1Bhc3QgPSBwYXN0LnNsaWNlKDAsIDIpID0gWzEsIDJdO1xuICAgICAqIHByZXNlbnQgPSBwYXN0W2luZGV4XSA9IDM7XG4gICAgICogWy4uLnBhc3Quc2xpY2UoMiArIDEpLCAuLi5mdXR1cmVdID0gWzQsIDVdO1xuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbmV3UGFzdCA9IHBhc3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgIGNvbnN0IG5ld0Z1dHVyZSA9IFsuLi5wYXN0LnNsaWNlKGluZGV4ICsgMSksIC4uLmZ1dHVyZV07XG4gICAgY29uc3QgbmV3UHJlc2VudCA9IHBhc3RbaW5kZXhdO1xuICAgIHRoaXMuaGlzdG9yeS5wYXN0ID0gbmV3UGFzdDtcbiAgICB0aGlzLmhpc3RvcnkucHJlc2VudCA9IG5ld1ByZXNlbnQ7XG4gICAgdGhpcy5oaXN0b3J5LmZ1dHVyZSA9IG5ld0Z1dHVyZTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAganVtcFRvRnV0dXJlKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZihpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5oaXN0b3J5LmZ1dHVyZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHsgcGFzdCwgZnV0dXJlIH0gPSB0aGlzLmhpc3Rvcnk7XG5cbiAgICBjb25zdCBuZXdQYXN0ID0gWy4uLnBhc3QsIC4uLmZ1dHVyZS5zbGljZSgwLCBpbmRleCldO1xuICAgIGNvbnN0IG5ld1ByZXNlbnQgPSBmdXR1cmVbaW5kZXhdO1xuICAgIGNvbnN0IG5ld0Z1dHVyZSA9IGZ1dHVyZS5zbGljZShpbmRleCArIDEpO1xuXG4gICAgdGhpcy5oaXN0b3J5LnBhc3QgPSBuZXdQYXN0O1xuICAgIHRoaXMuaGlzdG9yeS5wcmVzZW50ID0gbmV3UHJlc2VudDtcbiAgICB0aGlzLmhpc3RvcnkuZnV0dXJlID0gbmV3RnV0dXJlO1xuICAgIHRoaXMudXBkYXRlKCdSZWRvJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGhpc3RvcnlcbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbVVwZGF0ZUZuIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBvbmx5IGNsZWFyaW5nIHBhcnQgb2YgdGhlIGhpc3RvcnlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc3RhdGVIaXN0b3J5LmNsZWFyKChoaXN0b3J5KSA9PiB7XG4gICAqICByZXR1cm4ge1xuICAgKiAgICBwYXN0OiBoaXN0b3J5LnBhc3QsXG4gICAqICAgIHByZXNlbnQ6IGhpc3RvcnkucHJlc2VudCxcbiAgICogICAgZnV0dXJlOiBbXVxuICAgKiAgfTtcbiAgICogfSk7XG4gICAqL1xuICBjbGVhcihjdXN0b21VcGRhdGVGbj86IChoaXN0b3J5OiBIaXN0b3J5PFN0YXRlPikgPT4gSGlzdG9yeTxTdGF0ZT4pIHtcbiAgICB0aGlzLmhpc3RvcnkgPSBpc0Z1bmN0aW9uKGN1c3RvbVVwZGF0ZUZuKSA/IGN1c3RvbVVwZGF0ZUZuKHRoaXMuaGlzdG9yeSkgOiB7XG4gICAgICBwYXN0OiBbXSxcbiAgICAgIHByZXNlbnQ6IG51bGwsXG4gICAgICBmdXR1cmU6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGRlc3Ryb3koY2xlYXJIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZihjbGVhckhpc3RvcnkpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGlnbm9yZU5leHQoKSB7XG4gICAgdGhpcy5za2lwID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKGFjdGlvbiA9ICdVbmRvJykge1xuICAgIHRoaXMuc2tpcFVwZGF0ZSA9IHRydWU7XG4gICAgbG9nQWN0aW9uKGBAU3RhdGVIaXN0b3J5IC0gJHthY3Rpb259YCk7XG4gICAgdGhpcy51cGRhdGVTdG9yZSh0aGlzLmhpc3RvcnkucHJlc2VudCwgdGhpcy5fZW50aXR5SWQpO1xuICAgIHRoaXMuc2tpcFVwZGF0ZSA9IGZhbHNlO1xuICB9XG59XG4iXX0=