@data-client/core
Version:
Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch
177 lines (174 loc) • 24.5 kB
JavaScript
var _DevToolsManager;
import createReducer from '../state/reducer/createReducer.js';
let DEFAULT_CONFIG = {};
if (process.env.NODE_ENV !== 'production') {
var _globalThis$document;
const extraEndpointKeys = ['dataExpiryLength', 'errorExpiryLength', 'errorPolicy', 'invalidIfStale', 'pollFrequency', 'getOptimisticResponse', 'update'];
function serializeEndpoint(endpoint) {
var _toJSON, _endpoint$schema;
const serial = {
name: endpoint.name,
schema: (_toJSON = (_endpoint$schema = endpoint.schema) == null || _endpoint$schema.toJSON == null ? void 0 : _endpoint$schema.toJSON()) != null ? _toJSON : endpoint.schema,
sideEffect: endpoint.sideEffect
};
extraEndpointKeys.forEach(key => {
if (key in endpoint) serial[key] = endpoint[key];
});
return serial;
}
const HASINTL = typeof Intl !== 'undefined';
DEFAULT_CONFIG = {
name: `Data Client: ${(_globalThis$document = globalThis.document) == null ? void 0 : _globalThis$document.title}`,
autoPause: true,
features: {
pause: true,
// start/pause recording of dispatched actions
lock: true,
// lock/unlock dispatching actions and side effects
persist: false,
// persist states on page reloading
export: true,
// export history of actions in a file
import: 'custom',
// import history of actions from a file
jump: true,
// jump back and forth (time travelling)
skip: true,
// skip (cancel) actions
reorder: true,
// drag and drop actions in the history list
dispatch: false,
// dispatch custom actions or action creators
test: false // generate tests for the selected actions
},
actionSanitizer: action => {
if (!('endpoint' in action)) return action;
return {
...action,
endpoint: serializeEndpoint(action.endpoint)
};
},
serialize: {
options: undefined,
/* istanbul ignore next */
replacer: HASINTL ? (key, value) => {
if (typeof value === 'number' && typeof key === 'string' && isFinite(value) && (key === 'date' || key.endsWith('At'))) {
return Intl.DateTimeFormat('en-US', {
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
fractionalSecondDigits: 3
}).format(value);
}
return value;
} : undefined
}
};
}
/** Integrates with https://github.com/reduxjs/redux-devtools
*
* Options: https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/API/Arguments.md
*
* @see https://dataclient.io/docs/api/DevToolsManager
*/
export default class DevToolsManager {
constructor(config, skipLogging) {
var _options$name, _globalThis$document2;
this.started = false;
this.actions = [];
this.maxBufferLength = 100;
/* istanbul ignore next */
const options = {
...DEFAULT_CONFIG,
...config
};
this.devtoolsName = (_options$name = options.name) != null ? _options$name : `Data Client: ${(_globalThis$document2 = globalThis.document) == null ? void 0 : _globalThis$document2.title}`;
this.devTools = typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__.connect(options);
// we cut it in half so we should double so we don't lose
if (config != null && config.maxAge) this.maxBufferLength = config.maxAge * 2;
if (skipLogging) this.skipLogging = skipLogging;
}
handleAction(action, state) {
if (this.started) {
this.devTools.send(action, state);
} else {
// avoid this getting too big in case this is long running
// we cut in half so we aren't constantly reallocating
if (this.actions.length > this.maxBufferLength) this.actions = this.actions.slice(this.maxBufferLength / 2);
// queue actions
this.actions.push([action, state]);
}
}
/** Called when initial state is ready */
init(state) {
if (process.env.NODE_ENV !== 'production') {
var _ref, _ref$__DC_CONTROLLERS;
((_ref$__DC_CONTROLLERS = (_ref = globalThis).__DC_CONTROLLERS__) != null ? _ref$__DC_CONTROLLERS : _ref.__DC_CONTROLLERS__ = new Map()).set(this.devtoolsName, this.controller);
}
if (process.env.NODE_ENV !== 'production' && this.devTools) {
this.devTools.init(state);
this.devTools.subscribe(msg => {
switch (msg.type) {
case 'START':
this.started = true;
if (this.actions.length) {
this.actions.forEach(([action, state]) => {
this.handleAction(action, state);
});
this.actions = [];
}
break;
case 'STOP':
this.started = false;
break;
case 'DISPATCH':
if (msg.payload.type === 'RESET') {
this.controller.resetEntireStore();
}
break;
}
});
}
}
/** Ensures all subscriptions are cleaned up. */
cleanup() {
if (process.env.NODE_ENV !== 'production') {
const map = globalThis.__DC_CONTROLLERS__;
if ((map == null ? void 0 : map.get(this.devtoolsName)) === this.controller) {
map.delete(this.devtoolsName);
}
}
}
}
_DevToolsManager = DevToolsManager;
(() => {
/* istanbul ignore if */
/* istanbul ignore next */
if (process.env.NODE_ENV !== 'production') {
_DevToolsManager.prototype.middleware = function (controller) {
this.controller = controller;
if (!this.devTools) return next => action => next(action);
const reducer = createReducer(controller);
let state = controller.getState();
return next => action => {
var _this$skipLogging;
const shouldSkip = (_this$skipLogging = this.skipLogging) == null ? void 0 : _this$skipLogging.call(this, action);
const ret = next(action);
if (this.started) {
// we track state changes here since getState() will only update after a batch commit
state = reducer(state, action);
} else {
state = controller.getState();
}
ret.then(() => {
if (shouldSkip) return;
this.handleAction(action, state.optimistic.reduce(reducer, state));
});
return ret;
};
};
} else {
_DevToolsManager.prototype.middleware = () => next => action => next(action);
}
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWR1Y2VyIiwiREVGQVVMVF9DT05GSUciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJfZ2xvYmFsVGhpcyRkb2N1bWVudCIsImV4dHJhRW5kcG9pbnRLZXlzIiwic2VyaWFsaXplRW5kcG9pbnQiLCJlbmRwb2ludCIsIl90b0pTT04iLCJfZW5kcG9pbnQkc2NoZW1hIiwic2VyaWFsIiwibmFtZSIsInNjaGVtYSIsInRvSlNPTiIsInNpZGVFZmZlY3QiLCJmb3JFYWNoIiwia2V5IiwiSEFTSU5UTCIsIkludGwiLCJnbG9iYWxUaGlzIiwiZG9jdW1lbnQiLCJ0aXRsZSIsImF1dG9QYXVzZSIsImZlYXR1cmVzIiwicGF1c2UiLCJsb2NrIiwicGVyc2lzdCIsImV4cG9ydCIsImltcG9ydCIsImp1bXAiLCJza2lwIiwicmVvcmRlciIsImRpc3BhdGNoIiwidGVzdCIsImFjdGlvblNhbml0aXplciIsImFjdGlvbiIsInNlcmlhbGl6ZSIsIm9wdGlvbnMiLCJ1bmRlZmluZWQiLCJyZXBsYWNlciIsInZhbHVlIiwiaXNGaW5pdGUiLCJlbmRzV2l0aCIsIkRhdGVUaW1lRm9ybWF0IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsImZyYWN0aW9uYWxTZWNvbmREaWdpdHMiLCJmb3JtYXQiLCJEZXZUb29sc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsInNraXBMb2dnaW5nIiwiX29wdGlvbnMkbmFtZSIsIl9nbG9iYWxUaGlzJGRvY3VtZW50MiIsInN0YXJ0ZWQiLCJhY3Rpb25zIiwibWF4QnVmZmVyTGVuZ3RoIiwiZGV2dG9vbHNOYW1lIiwiZGV2VG9vbHMiLCJ3aW5kb3ciLCJfX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fIiwiY29ubmVjdCIsIm1heEFnZSIsImhhbmRsZUFjdGlvbiIsInN0YXRlIiwic2VuZCIsImxlbmd0aCIsInNsaWNlIiwicHVzaCIsImluaXQiLCJfcmVmIiwiX3JlZiRfX0RDX0NPTlRST0xMRVJTIiwiX19EQ19DT05UUk9MTEVSU19fIiwiTWFwIiwic2V0IiwiY29udHJvbGxlciIsInN1YnNjcmliZSIsIm1zZyIsInR5cGUiLCJwYXlsb2FkIiwicmVzZXRFbnRpcmVTdG9yZSIsImNsZWFudXAiLCJtYXAiLCJnZXQiLCJkZWxldGUiLCJfRGV2VG9vbHNNYW5hZ2VyIiwicHJvdG90eXBlIiwibWlkZGxld2FyZSIsIm5leHQiLCJyZWR1Y2VyIiwiZ2V0U3RhdGUiLCJfdGhpcyRza2lwTG9nZ2luZyIsInNob3VsZFNraXAiLCJjYWxsIiwicmV0IiwidGhlbiIsIm9wdGltaXN0aWMiLCJyZWR1Y2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFuYWdlci9EZXZ0b29sc01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9IGZyb20gJy4vZGV2dG9vbHNUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbnRyb2xsZXIsIEVuZHBvaW50SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgeyBNaWRkbGV3YXJlIH0gZnJvbSAnLi4vbWlkZGxld2FyZVR5cGVzLmpzJztcbmltcG9ydCBjcmVhdGVSZWR1Y2VyIGZyb20gJy4uL3N0YXRlL3JlZHVjZXIvY3JlYXRlUmVkdWNlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZXIsIFN0YXRlLCBBY3Rpb25UeXBlcyB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBEZXZUb29sc0NvbmZpZyB9O1xuXG5sZXQgREVGQVVMVF9DT05GSUcgPSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgY29uc3QgZXh0cmFFbmRwb2ludEtleXMgPSBbXG4gICAgJ2RhdGFFeHBpcnlMZW5ndGgnLFxuICAgICdlcnJvckV4cGlyeUxlbmd0aCcsXG4gICAgJ2Vycm9yUG9saWN5JyxcbiAgICAnaW52YWxpZElmU3RhbGUnLFxuICAgICdwb2xsRnJlcXVlbmN5JyxcbiAgICAnZ2V0T3B0aW1pc3RpY1Jlc3BvbnNlJyxcbiAgICAndXBkYXRlJyxcbiAgXTtcblxuICBmdW5jdGlvbiBzZXJpYWxpemVFbmRwb2ludChlbmRwb2ludDogRW5kcG9pbnRJbnRlcmZhY2UpIHtcbiAgICBjb25zdCBzZXJpYWw6IGFueSA9IHtcbiAgICAgIG5hbWU6IGVuZHBvaW50Lm5hbWUsXG4gICAgICBzY2hlbWE6IChlbmRwb2ludC5zY2hlbWEgYXMgYW55KT8udG9KU09OPy4oKSA/PyBlbmRwb2ludC5zY2hlbWEsXG4gICAgICBzaWRlRWZmZWN0OiBlbmRwb2ludC5zaWRlRWZmZWN0LFxuICAgIH07XG4gICAgZXh0cmFFbmRwb2ludEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGtleSBpbiBlbmRwb2ludClcbiAgICAgICAgc2VyaWFsW2tleV0gPSBlbmRwb2ludFtrZXkgYXMga2V5b2YgRW5kcG9pbnRJbnRlcmZhY2VdO1xuICAgIH0pO1xuICAgIHJldHVybiBzZXJpYWw7XG4gIH1cblxuICBjb25zdCBIQVNJTlRMID0gdHlwZW9mIEludGwgIT09ICd1bmRlZmluZWQnO1xuICBERUZBVUxUX0NPTkZJRyA9IHtcbiAgICBuYW1lOiBgRGF0YSBDbGllbnQ6ICR7Z2xvYmFsVGhpcy5kb2N1bWVudD8udGl0bGV9YCxcbiAgICBhdXRvUGF1c2U6IHRydWUsXG4gICAgZmVhdHVyZXM6IHtcbiAgICAgIHBhdXNlOiB0cnVlLCAvLyBzdGFydC9wYXVzZSByZWNvcmRpbmcgb2YgZGlzcGF0Y2hlZCBhY3Rpb25zXG4gICAgICBsb2NrOiB0cnVlLCAvLyBsb2NrL3VubG9jayBkaXNwYXRjaGluZyBhY3Rpb25zIGFuZCBzaWRlIGVmZmVjdHNcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLCAvLyBwZXJzaXN0IHN0YXRlcyBvbiBwYWdlIHJlbG9hZGluZ1xuICAgICAgZXhwb3J0OiB0cnVlLCAvLyBleHBvcnQgaGlzdG9yeSBvZiBhY3Rpb25zIGluIGEgZmlsZVxuICAgICAgaW1wb3J0OiAnY3VzdG9tJywgLy8gaW1wb3J0IGhpc3Rvcnkgb2YgYWN0aW9ucyBmcm9tIGEgZmlsZVxuICAgICAganVtcDogdHJ1ZSwgLy8ganVtcCBiYWNrIGFuZCBmb3J0aCAodGltZSB0cmF2ZWxsaW5nKVxuICAgICAgc2tpcDogdHJ1ZSwgLy8gc2tpcCAoY2FuY2VsKSBhY3Rpb25zXG4gICAgICByZW9yZGVyOiB0cnVlLCAvLyBkcmFnIGFuZCBkcm9wIGFjdGlvbnMgaW4gdGhlIGhpc3RvcnkgbGlzdFxuICAgICAgZGlzcGF0Y2g6IGZhbHNlLCAvLyBkaXNwYXRjaCBjdXN0b20gYWN0aW9ucyBvciBhY3Rpb24gY3JlYXRvcnNcbiAgICAgIHRlc3Q6IGZhbHNlLCAvLyBnZW5lcmF0ZSB0ZXN0cyBmb3IgdGhlIHNlbGVjdGVkIGFjdGlvbnNcbiAgICB9LFxuICAgIGFjdGlvblNhbml0aXplcjogKGFjdGlvbjogQWN0aW9uVHlwZXMpID0+IHtcbiAgICAgIGlmICghKCdlbmRwb2ludCcgaW4gYWN0aW9uKSkgcmV0dXJuIGFjdGlvbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgZW5kcG9pbnQ6IHNlcmlhbGl6ZUVuZHBvaW50KGFjdGlvbi5lbmRwb2ludCksXG4gICAgICB9O1xuICAgIH0sXG4gICAgc2VyaWFsaXplOiB7XG4gICAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmVwbGFjZXI6XG4gICAgICAgIEhBU0lOVEwgP1xuICAgICAgICAgIChrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICBpc0Zpbml0ZSh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgKGtleSA9PT0gJ2RhdGUnIHx8IGtleS5lbmRzV2l0aCgnQXQnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gSW50bC5EYXRlVGltZUZvcm1hdCgnZW4tVVMnLCB7XG4gICAgICAgICAgICAgICAgaG91cjogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHNlY29uZDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIGZyYWN0aW9uYWxTZWNvbmREaWdpdHM6IDMsXG4gICAgICAgICAgICAgIH0pLmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogSW50ZWdyYXRlcyB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWR1eGpzL3JlZHV4LWRldnRvb2xzXG4gKlxuICogT3B0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL3JlZHV4anMvcmVkdXgtZGV2dG9vbHMvYmxvYi9tYWluL2V4dGVuc2lvbi9kb2NzL0FQSS9Bcmd1bWVudHMubWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YWNsaWVudC5pby9kb2NzL2FwaS9EZXZUb29sc01hbmFnZXJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGV2VG9vbHNNYW5hZ2VyIGltcGxlbWVudHMgTWFuYWdlciB7XG4gIGRlY2xhcmUgbWlkZGxld2FyZTogTWlkZGxld2FyZTtcbiAgZGVjbGFyZSBwcm90ZWN0ZWQgZGV2VG9vbHM6IHVuZGVmaW5lZCB8IGFueTtcbiAgcHJvdGVjdGVkIHN0YXJ0ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGFjdGlvbnM6IFtBY3Rpb25UeXBlcywgU3RhdGU8dW5rbm93bj5dW10gPSBbXTtcbiAgZGVjbGFyZSBwcm90ZWN0ZWQgY29udHJvbGxlcjogQ29udHJvbGxlcjtcbiAgZGVjbGFyZSBza2lwTG9nZ2luZz86IChhY3Rpb246IEFjdGlvblR5cGVzKSA9PiBib29sZWFuO1xuICBkZWNsYXJlIGRldnRvb2xzTmFtZTogc3RyaW5nO1xuICBtYXhCdWZmZXJMZW5ndGggPSAxMDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnPzogRGV2VG9vbHNDb25maWcsXG4gICAgc2tpcExvZ2dpbmc/OiAoYWN0aW9uOiBBY3Rpb25UeXBlcykgPT4gYm9vbGVhbixcbiAgKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5ERUZBVUxUX0NPTkZJRywgLi4uY29uZmlnIH07XG4gICAgdGhpcy5kZXZ0b29sc05hbWUgPVxuICAgICAgb3B0aW9ucy5uYW1lID8/IGBEYXRhIENsaWVudDogJHtnbG9iYWxUaGlzLmRvY3VtZW50Py50aXRsZX1gO1xuICAgIHRoaXMuZGV2VG9vbHMgPVxuICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICh3aW5kb3cgYXMgYW55KS5fX1JFRFVYX0RFVlRPT0xTX0VYVEVOU0lPTl9fICYmXG4gICAgICAod2luZG93IGFzIGFueSkuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXy5jb25uZWN0KG9wdGlvbnMpO1xuICAgIC8vIHdlIGN1dCBpdCBpbiBoYWxmIHNvIHdlIHNob3VsZCBkb3VibGUgc28gd2UgZG9uJ3QgbG9zZVxuICAgIGlmIChjb25maWc/Lm1heEFnZSkgdGhpcy5tYXhCdWZmZXJMZW5ndGggPSBjb25maWcubWF4QWdlICogMjtcbiAgICBpZiAoc2tpcExvZ2dpbmcpIHRoaXMuc2tpcExvZ2dpbmcgPSBza2lwTG9nZ2luZztcbiAgfVxuXG4gIHN0YXRpYyB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdGhpcy5wcm90b3R5cGUubWlkZGxld2FyZSA9IGZ1bmN0aW9uIChjb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICAgIGlmICghdGhpcy5kZXZUb29scykgcmV0dXJuIG5leHQgPT4gYWN0aW9uID0+IG5leHQoYWN0aW9uKTtcbiAgICAgICAgY29uc3QgcmVkdWNlciA9IGNyZWF0ZVJlZHVjZXIoY29udHJvbGxlciBhcyBhbnkpO1xuICAgICAgICBsZXQgc3RhdGUgPSBjb250cm9sbGVyLmdldFN0YXRlKCk7XG4gICAgICAgIHJldHVybiBuZXh0ID0+IGFjdGlvbiA9PiB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU2tpcCA9IHRoaXMuc2tpcExvZ2dpbmc/LihhY3Rpb24pO1xuICAgICAgICAgIGNvbnN0IHJldCA9IG5leHQoYWN0aW9uKTtcbiAgICAgICAgICBpZiAodGhpcy5zdGFydGVkKSB7XG4gICAgICAgICAgICAvLyB3ZSB0cmFjayBzdGF0ZSBjaGFuZ2VzIGhlcmUgc2luY2UgZ2V0U3RhdGUoKSB3aWxsIG9ubHkgdXBkYXRlIGFmdGVyIGEgYmF0Y2ggY29tbWl0XG4gICAgICAgICAgICBzdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXQudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU2tpcCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24oYWN0aW9uLCBzdGF0ZS5vcHRpbWlzdGljLnJlZHVjZShyZWR1Y2VyLCBzdGF0ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3RvdHlwZS5taWRkbGV3YXJlID0gKCkgPT4gbmV4dCA9PiBhY3Rpb24gPT4gbmV4dChhY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUFjdGlvbihhY3Rpb246IGFueSwgc3RhdGU6IGFueSkge1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIHRoaXMuZGV2VG9vbHMuc2VuZChhY3Rpb24sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXZvaWQgdGhpcyBnZXR0aW5nIHRvbyBiaWcgaW4gY2FzZSB0aGlzIGlzIGxvbmcgcnVubmluZ1xuICAgICAgLy8gd2UgY3V0IGluIGhhbGYgc28gd2UgYXJlbid0IGNvbnN0YW50bHkgcmVhbGxvY2F0aW5nXG4gICAgICBpZiAodGhpcy5hY3Rpb25zLmxlbmd0aCA+IHRoaXMubWF4QnVmZmVyTGVuZ3RoKVxuICAgICAgICB0aGlzLmFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuc2xpY2UodGhpcy5tYXhCdWZmZXJMZW5ndGggLyAyKTtcbiAgICAgIC8vIHF1ZXVlIGFjdGlvbnNcbiAgICAgIHRoaXMuYWN0aW9ucy5wdXNoKFthY3Rpb24sIHN0YXRlXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCB3aGVuIGluaXRpYWwgc3RhdGUgaXMgcmVhZHkgKi9cbiAgaW5pdChzdGF0ZTogU3RhdGU8YW55Pikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAoKGdsb2JhbFRoaXMgYXMgYW55KS5fX0RDX0NPTlRST0xMRVJTX18gPz89IG5ldyBNYXAoKSkuc2V0KFxuICAgICAgICB0aGlzLmRldnRvb2xzTmFtZSxcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdGhpcy5kZXZUb29scykge1xuICAgICAgdGhpcy5kZXZUb29scy5pbml0KHN0YXRlKTtcbiAgICAgIHRoaXMuZGV2VG9vbHMuc3Vic2NyaWJlKChtc2c6IGFueSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnU1RBUlQnOlxuICAgICAgICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zLmZvckVhY2goKFthY3Rpb24sIHN0YXRlXSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uKGFjdGlvbiwgc3RhdGUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdTVE9QJzpcbiAgICAgICAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnRElTUEFUQ0gnOlxuICAgICAgICAgICAgaWYgKG1zZy5wYXlsb2FkLnR5cGUgPT09ICdSRVNFVCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnJlc2V0RW50aXJlU3RvcmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogRW5zdXJlcyBhbGwgc3Vic2NyaXB0aW9ucyBhcmUgY2xlYW5lZCB1cC4gKi9cbiAgY2xlYW51cCgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc3QgbWFwOiBNYXA8c3RyaW5nLCBDb250cm9sbGVyPiB8IHVuZGVmaW5lZCA9IChnbG9iYWxUaGlzIGFzIGFueSlcbiAgICAgICAgLl9fRENfQ09OVFJPTExFUlNfXztcbiAgICAgIGlmIChtYXA/LmdldCh0aGlzLmRldnRvb2xzTmFtZSkgPT09IHRoaXMuY29udHJvbGxlcikge1xuICAgICAgICBtYXAuZGVsZXRlKHRoaXMuZGV2dG9vbHNOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUdBLE9BQU9BLGFBQWEsTUFBTSxtQ0FBbUM7QUFLN0QsSUFBSUMsY0FBYyxHQUFHLENBQUMsQ0FBQztBQUV2QixJQUFJQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsUUFBUSxLQUFLLFlBQVksRUFBRTtFQUFBLElBQUFDLG9CQUFBO0VBQ3pDLE1BQU1DLGlCQUFpQixHQUFHLENBQ3hCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFFBQVEsQ0FDVDtFQUVELFNBQVNDLGlCQUFpQkEsQ0FBQ0MsUUFBMkIsRUFBRTtJQUFBLElBQUFDLE9BQUEsRUFBQUMsZ0JBQUE7SUFDdEQsTUFBTUMsTUFBVyxHQUFHO01BQ2xCQyxJQUFJLEVBQUVKLFFBQVEsQ0FBQ0ksSUFBSTtNQUNuQkMsTUFBTSxHQUFBSixPQUFBLElBQUFDLGdCQUFBLEdBQUdGLFFBQVEsQ0FBQ0ssTUFBTSxhQUFoQkgsZ0JBQUEsQ0FBMEJJLE1BQU0sb0JBQWhDSixnQkFBQSxDQUEwQkksTUFBTSxDQUFHLENBQUMsWUFBQUwsT0FBQSxHQUFJRCxRQUFRLENBQUNLLE1BQU07TUFDL0RFLFVBQVUsRUFBRVAsUUFBUSxDQUFDTztJQUN2QixDQUFDO0lBQ0RULGlCQUFpQixDQUFDVSxPQUFPLENBQUNDLEdBQUcsSUFBSTtNQUMvQixJQUFJQSxHQUFHLElBQUlULFFBQVEsRUFDakJHLE1BQU0sQ0FBQ00sR0FBRyxDQUFDLEdBQUdULFFBQVEsQ0FBQ1MsR0FBRyxDQUE0QjtJQUMxRCxDQUFDLENBQUM7SUFDRixPQUFPTixNQUFNO0VBQ2Y7RUFFQSxNQUFNTyxPQUFPLEdBQUcsT0FBT0MsSUFBSSxLQUFLLFdBQVc7RUFDM0NsQixjQUFjLEdBQUc7SUFDZlcsSUFBSSxF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