UNPKG

@data-client/core

Version:

Async State Management without the Management. REST, GraphQL, SSE, Websockets, Fetch

177 lines (174 loc) 24.5 kB
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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