UNPKG

@redux-multipurpose/core

Version:

## Installation Redux Multipurpose core is available as a package on NPM:

223 lines 34.8 kB
import { Observable, BehaviorSubject } from 'rxjs'; import { map, distinctUntilChanged, switchMap } from 'rxjs/operators'; import { configureStore, createSelector, getDefaultMiddleware, combineReducers } from '@reduxjs/toolkit'; import { createEpicMiddleware } from 'redux-observable-es6-compat'; import createSagaMiddleware from 'redux-saga'; import { persistStore, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER } from 'redux-persist'; import { createResponsiveStateReducer, responsiveStateReducer, responsiveStoreEnhancer, calculateResponsiveState } from 'redux-responsive'; import { createLogger } from 'redux-logger'; const genericSelector = (paths) => { return createSelector([state => { let nestedState = state; for (let path of paths) if (nestedState[path] != null && nestedState[path] != undefined) nestedState = nestedState[path]; else { nestedState = null; break; } return nestedState; }], items => items); }; const ɵ0 = genericSelector; const initializeWithDefaultMiddleware = (options) => { return options ? [...getDefaultMiddleware(options)] : [...getDefaultMiddleware()]; }; const ɵ1 = initializeWithDefaultMiddleware; //Store instance var reduxStore; var staticReducers = {}; var dynamicReducers = {}; var epics$; export const initializeStore = (options) => { if (reduxStore) throw Error("A redux store is initialized yet. Cannot initialize another one"); const { reducers, devTools, middlewares, enhancers, preloadedState, defaultMiddlewareOptions, sagas, epics, enablePersistence, enableResponsiveness, router, logLevel } = options; let enhancer = enhancers; let middleware = []; let sagaMiddleware; let epicMiddleware; let middlewareOptions = defaultMiddlewareOptions; if (enablePersistence) { if (!middlewareOptions) middlewareOptions = {}; if (!middlewareOptions.serializableCheck || typeof middlewareOptions === 'boolean') middlewareOptions.serializableCheck = {}; if (typeof middlewareOptions.serializableCheck === 'object') { if (!middlewareOptions.serializableCheck.ignoredActions) middlewareOptions.serializableCheck.ignoredActions = []; if (middlewareOptions.serializableCheck.ignoredActions.indexOf(FLUSH) < 0) middlewareOptions.serializableCheck.ignoredActions.push(FLUSH); if (middlewareOptions.serializableCheck.ignoredActions.indexOf(REHYDRATE) < 0) middlewareOptions.serializableCheck.ignoredActions.push(REHYDRATE); if (middlewareOptions.serializableCheck.ignoredActions.indexOf(PAUSE) < 0) middlewareOptions.serializableCheck.ignoredActions.push(PAUSE); if (middlewareOptions.serializableCheck.ignoredActions.indexOf(PERSIST) < 0) middlewareOptions.serializableCheck.ignoredActions.push(PERSIST); if (middlewareOptions.serializableCheck.ignoredActions.indexOf(PURGE) < 0) middlewareOptions.serializableCheck.ignoredActions.push(PURGE); if (middlewareOptions.serializableCheck.ignoredActions.indexOf(REGISTER) < 0) middlewareOptions.serializableCheck.ignoredActions.push(REGISTER); } } if (enableResponsiveness) { if (!middlewareOptions) middlewareOptions = {}; if (!middlewareOptions.serializableCheck || typeof middlewareOptions === 'boolean') middlewareOptions.serializableCheck = {}; if (typeof middlewareOptions.serializableCheck === 'object') { if (!middlewareOptions.serializableCheck.ignoredActions) middlewareOptions.serializableCheck.ignoredActions = []; if (middlewareOptions.serializableCheck.ignoredActions.indexOf("redux-responsive/CALCULATE_RESPONSIVE_STATE") < 0) middlewareOptions.serializableCheck.ignoredActions.push("redux-responsive/CALCULATE_RESPONSIVE_STATE"); } } middleware = initializeWithDefaultMiddleware(middlewareOptions); if (middleware) middleware = [...middleware, ...middlewares]; if (epics) { epicMiddleware = createEpicMiddleware(); middleware = [...middleware, epicMiddleware]; } if (sagas) { sagaMiddleware = createSagaMiddleware(); middleware = [...middleware, sagaMiddleware]; } if (logLevel) { const loggerMiddleware = createLogger({ level: logLevel }); middleware = [...middleware, loggerMiddleware]; } if (enableResponsiveness) { let browserReducer; if (typeof enableResponsiveness === 'object' && enableResponsiveness.breakpoints) browserReducer = createResponsiveStateReducer(enableResponsiveness.breakpoints, enableResponsiveness.options); else browserReducer = responsiveStateReducer; if (!reducers['browser']) reducers['browser'] = browserReducer; else throw ("A browser reducer already exists. Cannot enable redux-responsive module"); if (!enhancer) enhancer = [responsiveStoreEnhancer]; else enhancer = [...enhancer, responsiveStoreEnhancer]; } staticReducers = reducers; const newStore = configureStore({ reducer: combineReducers(reducers), devTools, preloadedState, middleware, enhancers: enhancer }); epics$ = new BehaviorSubject(epics); const hotReloadingEpics = (action$, state$, dependencies) => epics$.pipe(switchMap((epic) => epic(action$, state$, dependencies))); //Executing epics if (epicMiddleware) epicMiddleware.run(hotReloadingEpics); //Executing sagas if (sagaMiddleware) sagaMiddleware.run(sagas); if (enablePersistence) persistStore(newStore); //Finally save store instance reduxStore = newStore; if (router) { store.addReducer(router.key, router.reducer); router.service.init(); } if (enableResponsiveness) window.addEventListener('resize', () => store.dispatch(calculateResponsiveState(window))); }; const ɵ2 = () => { return new Observable(function (observer) { observer.next(reduxStore.getState()); const unsubscribe = reduxStore.subscribe(function () { observer.next(reduxStore.getState()); }); return unsubscribe; }); }, ɵ3 = () => { return reduxStore.getState(); }, ɵ4 = (selector) => { return new Observable(subscriber => { const state$ = store.getState$(); const unsubscribe = state$.pipe(map(state => selector(state)), distinctUntilChanged()).subscribe(data => subscriber.next(data)); return unsubscribe; }); }, ɵ5 = (selector) => { return selector(reduxStore.getState()); }, ɵ6 = (action) => { reduxStore.dispatch(action); }, ɵ7 = (key, reducer) => { if (!key || dynamicReducers[key]) throw (`A reducer with key '${key}' is already injected. Injection aborted`); dynamicReducers[key] = reducer; reduxStore.replaceReducer(combineReducers(Object.assign(Object.assign({}, staticReducers), dynamicReducers))); }, ɵ8 = (key) => { if (!key || !dynamicReducers[key]) throw (`No reducer with key '${key}' found. Remove aborted`); delete dynamicReducers[key]; reduxStore.replaceReducer(combineReducers(Object.assign(Object.assign({}, staticReducers), dynamicReducers))); }, ɵ9 = (newRootEpic) => { epics$.next(newRootEpic); }; export const store = { getState$: ɵ2, getState: ɵ3, select: ɵ4, selectSync: ɵ5, dispatch: ɵ6, addReducer: ɵ7, removeReducer: ɵ8, replaceEpics: ɵ9 }; export const select = (selector) => { if (selector) return (target, key) => { Object.defineProperty(target, key, { get: () => selector instanceof Array ? store.select(genericSelector(selector)) : store.select(selector), enumerable: true, configurable: true, }); }; }; export const get = (selector) => { if (selector) return (target, key) => { Object.defineProperty(target, key, { get: () => selector instanceof Array ? store.selectSync(genericSelector(selector)) : store.selectSync(selector), enumerable: true, configurable: true, }); }; }; export const dispatch = () => { return (target, key, descriptor) => { let originalMethod; const wrapped = (...args) => { const result = originalMethod.apply(this, args); if (result !== undefined && store) store.dispatch(result); return result; }; descriptor = descriptor || Object.getOwnPropertyDescriptor(target, key); if (descriptor === undefined) { const dispatchDescriptor = { get: () => wrapped, set: setMethod => (originalMethod = setMethod), }; Object.defineProperty(target, key, dispatchDescriptor); return dispatchDescriptor; } else { originalMethod = descriptor.value; descriptor.value = wrapped; return descriptor; } }; }; export { ɵ0, ɵ1, ɵ2, ɵ3, ɵ4, ɵ5, ɵ6, ɵ7, ɵ8, ɵ9 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZWR1eC1tdWx0aXB1cnBvc2UvY29yZS9zcmMvbGliL3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUFvQixjQUFjLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzNILE9BQU8sRUFBRSxvQkFBb0IsRUFBUSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sb0JBQW9CLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFDSCxZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxRQUFRLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0ksT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUk1QyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3hDLE9BQU8sY0FBYyxDQUNqQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ0wsSUFBSSxXQUFXLEdBQVEsS0FBSyxDQUFDO1lBRTdCLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSztnQkFDbEIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTO29CQUMzRCxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxD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QVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2FBQ2pELENBQUM7WUFDRixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUV2RCxPQUFPLGtCQUFrQixDQUFDO1NBQzdCO2FBRUQ7WUFDSSxjQUFjLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNsQyxVQUFVLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUMzQixPQUFPLFVBQVUsQ0FBQztTQUNyQjtJQUNMLENBQUMsQ0FBQTtBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RvciwgQWN0aW9uLCBjb25maWd1cmVTdG9yZSwgY3JlYXRlU2VsZWN0b3IsIGdldERlZmF1bHRNaWRkbGV3YXJlLCBjb21iaW5lUmVkdWNlcnMgfSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcbmltcG9ydCB7IFN0b3JlLCBSZWR1Y2VyLCBBbnlBY3Rpb24gfSBmcm9tICdyZWR1eCc7XG5pbXBvcnQgeyBGbHV4U3RhbmRhcmRBY3Rpb24gfSBmcm9tICdmbHV4LXN0YW5kYXJkLWFjdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVFcGljTWlkZGxld2FyZSwgRXBpYyB9IGZyb20gJ3JlZHV4LW9ic2VydmFibGUtZXM2LWNvbXBhdCc7XG5pbXBvcnQgY3JlYXRlU2FnYU1pZGRsZXdhcmUgZnJvbSAncmVkdXgtc2FnYSc7XG5pbXBvcnQge1xuICAgIHBlcnNpc3RTdG9yZSxcbiAgICBGTFVTSCxcbiAgICBSRUhZRFJBVEUsXG4gICAgUEFVU0UsXG4gICAgUEVSU0lTVCxcbiAgICBQVVJHRSxcbiAgICBSRUdJU1RFUlxufSBmcm9tICdyZWR1eC1wZXJzaXN0JztcbmltcG9ydCB7IGNyZWF0ZVJlc3BvbnNpdmVTdGF0ZVJlZHVjZXIsIHJlc3BvbnNpdmVTdGF0ZVJlZHVjZXIsIHJlc3BvbnNpdmVTdG9yZUVuaGFuY2VyLCBjYWxjdWxhdGVSZXNwb25zaXZlU3RhdGUgfSBmcm9tICdyZWR1eC1yZXNwb25zaXZlJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ3JlZHV4LWxvZ2dlcic7XG5cbmltcG9ydCB7IE11bHRpcHVycG9zZVN0b3JlT3B0aW9ucyB9IGZyb20gJy4vZW50aXRpZXMvc3RvcmUtb3B0aW9ucyc7XG5cbmNvbnN0IGdlbmVyaWNTZWxlY3RvciA9IChwYXRoczogc3RyaW5nW10pID0+IHtcbiAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IoXG4gICAgICAgIFtzdGF0ZSA9PiB7XG4gICAgICAgICAgICBsZXQgbmVzdGVkU3RhdGU6IGFueSA9IHN0YXRlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBwYXRoIG9mIHBhdGhzKVxuICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRTdGF0ZVtwYXRoXSAhPSBudWxsICYmIG5lc3RlZFN0YXRlW3BhdGhdICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkU3RhdGUgPSBuZXN0ZWRTdGF0ZVtwYXRoXTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5lc3RlZFN0YXRlO1xuICAgICAgICB9XSxcbiAgICAgICAgaXRlbXMgPT4gaXRlbXNcbiAgICApO1xufTtcblxuY29uc3QgaW5pdGlhbGl6ZVdpdGhEZWZhdWx0TWlkZGxld2FyZSA9IChvcHRpb25zPykgPT4ge1xuICAgIHJldHVybiBvcHRpb25zP1xuICAgICAgICBbLi4uZ2V0RGVmYXVsdE1pZGRsZXdhcmUob3B0aW9ucyldIDpcbiAgICAgICAgWy4uLmdldERlZmF1bHRNaWRkbGV3YXJlKCldO1xufTtcblxuLy9TdG9yZSBpbnN0YW5jZVxudmFyIHJlZHV4U3RvcmU6IFN0b3JlO1xuXG52YXIgc3RhdGljUmVkdWNlcnMgPSB7fTtcbnZhciBkeW5hbWljUmVkdWNlcnMgPSB7fTtcblxudmFyIGVwaWNzJDtcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVTdG9yZSA9IChvcHRpb25zOiBNdWx0aXB1cnBvc2VTdG9yZU9wdGlvbnMpID0+IHtcbiAgICBpZiAocmVkdXhTdG9yZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJBIHJlZHV4IHN0b3JlIGlzIGluaXRpYWxpemVkIHlldC4gQ2Fubm90IGluaXRpYWxpemUgYW5vdGhlciBvbmVcIik7XG5cbiAgICBjb25zdCB7XG4gICAgICAgIHJlZHVjZXJzLFxuICAgICAgICBkZXZUb29scyxcbiAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgIGVuaGFuY2VycyxcbiAgICAgICAgcHJlbG9hZGVkU3RhdGUsXG4gICAgICAgIGRlZmF1bHRNaWRkbGV3YXJlT3B0aW9ucyxcbiAgICAgICAgc2FnYXMsXG4gICAgICAgIGVwaWNzLFxuICAgICAgICBlbmFibGVQZXJzaXN0ZW5jZSxcbiAgICAgICAgZW5hYmxlUmVzcG9uc2l2ZW5lc3MsXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgbG9nTGV2ZWxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGxldCBlbmhhbmNlciA9IGVuaGFuY2VycztcbiAgICBsZXQgbWlkZGxld2FyZSA9IFtdO1xuICAgIGxldCBzYWdhTWlkZGxld2FyZTtcbiAgICBsZXQgZXBpY01pZGRsZXdhcmU7XG5cbiAgICBsZXQgbWlkZGxld2FyZU9wdGlvbnMgPSBkZWZhdWx0TWlkZGxld2FyZU9wdGlvbnM7XG4gICAgaWYgKGVuYWJsZVBlcnNpc3RlbmNlKVxuICAgIHtcbiAgICAgICAgaWYgKCFtaWRkbGV3YXJlT3B0aW9ucylcbiAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zID0ge307XG4gICAgICAgIGlmICghbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2sgfHwgdHlwZW9mIG1pZGRsZXdhcmVPcHRpb25zID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjayA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrID09PSAnb2JqZWN0JylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucylcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucyA9IFtdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMuaW5kZXhPZihGTFVTSCkgPCAwKVxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLnB1c2goRkxVU0gpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLmluZGV4T2YoUkVIWURSQVRFKSA8IDApXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMucHVzaChSRUhZRFJBVEUpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLmluZGV4T2YoUEFVU0UpIDwgMClcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5wdXNoKFBBVVNFKTtcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5pbmRleE9mKFBFUlNJU1QpIDwgMClcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5wdXNoKFBFUlNJU1QpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zLmluZGV4T2YoUFVSR0UpIDwgMClcbiAgICAgICAgICAgICAgICBtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5wdXNoKFBVUkdFKTtcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5pbmRleE9mKFJFR0lTVEVSKSA8IDApXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMucHVzaChSRUdJU1RFUik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW5hYmxlUmVzcG9uc2l2ZW5lc3MpXG4gICAge1xuICAgICAgICBpZiAoIW1pZGRsZXdhcmVPcHRpb25zKVxuICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMgPSB7fTtcbiAgICAgICAgaWYgKCFtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjayB8fCB0eXBlb2YgbWlkZGxld2FyZU9wdGlvbnMgPT09ICdib29sZWFuJylcbiAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2sgPT09ICdvYmplY3QnKVxuICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIW1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zKVxuICAgICAgICAgICAgICAgIG1pZGRsZXdhcmVPcHRpb25zLnNlcmlhbGl6YWJsZUNoZWNrLmlnbm9yZWRBY3Rpb25zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlT3B0aW9ucy5zZXJpYWxpemFibGVDaGVjay5pZ25vcmVkQWN0aW9ucy5pbmRleE9mKFwicmVkdXgtcmVzcG9uc2l2ZS9DQUxDVUxBVEVfUkVTUE9OU0lWRV9TVEFURVwiKSA8IDApXG4gICAgICAgICAgICAgICAgbWlkZGxld2FyZU9wdGlvbnMuc2VyaWFsaXphYmxlQ2hlY2suaWdub3JlZEFjdGlvbnMucHVzaChcInJlZHV4LXJlc3BvbnNpdmUvQ0FMQ1VMQVRFX1JFU1BPTlNJVkVfU1RBVEVcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtaWRkbGV3YXJlID0gaW5pdGlhbGl6ZVdpdGhEZWZhdWx0TWlkZGxld2FyZShtaWRkbGV3YXJlT3B0aW9ucyk7XG5cbiAgICBpZiAobWlkZGxld2FyZSlcbiAgICAgICAgbWlkZGxld2FyZSA9IFsuLi5taWRkbGV3YXJlLCAuLi5taWRkbGV3YXJlc107XG5cbiAgICBpZiAoZXBpY3MpXG4gICAge1xuICAgICAgICBlcGljTWlkZGxld2FyZSA9IGNyZWF0ZUVwaWNNaWRkbGV3YXJlPEZsdXhTdGFuZGFyZEFjdGlvbjxhbnksIGFueT4sIEZsdXhTdGFuZGFyZEFjdGlvbjxhbnksIGFueT4sIGFueT4oKTtcbiAgICAgICAgbWlkZGxld2FyZSA9IFsuLi5taWRkbGV3YXJlLCBlcGljTWlkZGxld2FyZV07XG4gICAgfVxuXG4gICAgaWYgKHNhZ2FzKVxuICAgIHtcbiAgICAgICAgc2FnYU1pZGRsZXdhcmUgPSBjcmVhdGVTYWdhTWlkZGxld2FyZSgpO1xuICAgICAgICBtaWRkbGV3YXJlID0gWy4uLm1pZGRsZXdhcmUsIHNhZ2FNaWRkbGV3YXJlXTtcbiAgICB9XG5cbiAgICBpZiAobG9nTGV2ZWwpXG4gICAge1xuICAgICAgICBjb25zdCBsb2dnZXJNaWRkbGV3YXJlID0gY3JlYXRlTG9nZ2VyKHsgbGV2ZWw6IGxvZ0xldmVsIH0pO1xuICAgICAgICBtaWRkbGV3YXJlID0gWy4uLm1pZGRsZXdhcmUsIGxvZ2dlck1pZGRsZXdhcmUgXTtcbiAgICB9XG5cbiAgICBpZiAoZW5hYmxlUmVzcG9uc2l2ZW5lc3MpXG4gICAge1xuICAgICAgICBsZXQgYnJvd3NlclJlZHVjZXI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVSZXNwb25zaXZlbmVzcyA9PT0gJ29iamVjdCcgJiYgZW5hYmxlUmVzcG9uc2l2ZW5lc3MuYnJlYWtwb2ludHMpXG4gICAgICAgICAgICBicm93c2VyUmVkdWNlciA9IGNyZWF0ZVJlc3BvbnNpdmVTdGF0ZVJlZHVjZXIoZW5hYmxlUmVzcG9uc2l2ZW5lc3MuYnJlYWtwb2ludHMsIGVuYWJsZVJlc3BvbnNpdmVuZXNzLm9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicm93c2VyUmVkdWNlciA9IHJlc3BvbnNpdmVTdGF0ZVJlZHVjZXI7XG4gICAgICAgICAgICBcbiAgICAgICAgaWYgKCFyZWR1Y2Vyc1snYnJvd3NlciddKVxuICAgICAgICAgICAgcmVkdWNlcnNbJ2Jyb3dzZXInXSA9IGJyb3dzZXJSZWR1Y2VyO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyhcIkEgYnJvd3NlciByZWR1Y2VyIGFscmVhZHkgZXhpc3RzLiBDYW5ub3QgZW5hYmxlIHJlZHV4LXJlc3BvbnNpdmUgbW9kdWxlXCIpO1xuXG4gICAgICAgIGlmICghZW5oYW5jZXIpXG4gICAgICAgICAgICBlbmhhbmNlciA9IFsgcmVzcG9uc2l2ZVN0b3JlRW5oYW5jZXIgXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZW5oYW5jZXIgPSBbIC4uLmVuaGFuY2VyLCByZXNwb25zaXZlU3RvcmVFbmhhbmNlciBdO1xuICAgIH1cblxuICAgIHN0YXRpY1JlZHVjZXJzID0gcmVkdWNlcnM7XG5cbiAgICBjb25zdCBuZXdTdG9yZSA9IGNvbmZpZ3VyZVN0b3JlKHtcbiAgICAgICAgcmVkdWNlcjogY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSxcbiAgICAgICAgZGV2VG9vbHMsXG4gICAgICAgIHByZWxvYWRlZFN0YXRlLFxuICAgICAgICBtaWRkbGV3YXJlLFxuICAgICAgICBlbmhhbmNlcnM6IGVuaGFuY2VyXG4gICAgfSk7XG5cbiAgICBlcGljcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGVwaWNzKTtcbiAgICBjb25zdCBob3RSZWxvYWRpbmdFcGljcyA9IChhY3Rpb24kLCBzdGF0ZSQsIGRlcGVuZGVuY2llcykgPT5cbiAgICAgICAgZXBpY3MkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGVwaWM6IEVwaWMpID0+IGVwaWMoYWN0aW9uJCwgc3RhdGUkLCBkZXBlbmRlbmNpZXMpKVxuICAgICAgICApO1xuXG4gICAgLy9FeGVjdXRpbmcgZXBpY3NcbiAgICBpZiAoZXBpY01pZGRsZXdhcmUpXG4gICAgICAgIGVwaWNNaWRkbGV3YXJlLnJ1bihob3RSZWxvYWRpbmdFcGljcyk7XG5cbiAgICAvL0V4ZWN1dGluZyBzYWdhc1xuICAgIGlmIChzYWdhTWlkZGxld2FyZSlcbiAgICAgICAgc2FnYU1pZGRsZXdhcmUucnVuKHNhZ2FzKTtcblxuICAgIGlmIChlbmFibGVQZXJzaXN0ZW5jZSlcbiAgICAgICAgcGVyc2lzdFN0b3JlKG5ld1N0b3JlKTtcblxuICAgIC8vRmluYWxseSBzYXZlIHN0b3JlIGluc3RhbmNlXG4gICAgcmVkdXhTdG9yZSA9IG5ld1N0b3JlO1xuXG4gICAgaWYgKHJvdXRlcilcbiAgICB7XG4gICAgICAgIHN0b3JlLmFkZFJlZHVjZXIocm91dGVyLmtleSwgcm91dGVyLnJlZHVjZXIpO1xuICAgICAgICByb3V0ZXIuc2VydmljZS5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKGVuYWJsZVJlc3BvbnNpdmVuZXNzKVxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gc3RvcmUuZGlzcGF0Y2goY2FsY3VsYXRlUmVzcG9uc2l2ZVN0YXRlKHdpbmRvdykpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzdG9yZSA9IHtcbiAgICBnZXRTdGF0ZSQ6ICgpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlZHV4U3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gcmVkdXhTdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVkdXhTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0U3RhdGU6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZHV4U3RvcmUuZ2V0U3RhdGUoKTtcbiAgICB9LFxuICAgIHNlbGVjdDogPFIsIFQ+KHNlbGVjdG9yOiBTZWxlY3RvcjxSLCBUPik6IE9ic2VydmFibGU8VD4gPT57XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxUPihzdWJzY3JpYmVyID0+IHsgIFxuICAgICAgICAgICAgY29uc3Qgc3RhdGUkID0gc3RvcmUuZ2V0U3RhdGUkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHN0YXRlID0+IHNlbGVjdG9yKHN0YXRlKSksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoZGF0YSA9PiBzdWJzY3JpYmVyLm5leHQoZGF0YSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgICAgIH0pXG4gICAgfSxcbiAgICBzZWxlY3RTeW5jOiA8UiwgVD4oc2VsZWN0b3I6IFNlbGVjdG9yPFIsIFQ+KSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RvcihyZWR1eFN0b3JlLmdldFN0YXRlKCkpO1xuICAgIH0sXG4gICAgZGlzcGF0Y2g6IChhY3Rpb246IEFjdGlvbiB8IGFueSkgPT4ge1xuICAgICAgICByZWR1eFN0b3JlLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgfSxcbiAgICBhZGRSZWR1Y2VyOiA8UyA9IGFueSwgQSBleHRlbmRzIEFjdGlvbiA9IEFueUFjdGlvbj4oa2V5OiBzdHJpbmcsIHJlZHVjZXI6IFJlZHVjZXI8UywgQT4pID0+IHtcbiAgICAgICAgaWYgKCFrZXkgfHwgZHluYW1pY1JlZHVjZXJzW2tleV0pXG4gICAgICAgICAgICB0aHJvdyAoYEEgcmVkdWNlciB3aXRoIGtleSAnJHtrZXl9JyBpcyBhbHJlYWR5IGluamVjdGVkLiBJbmplY3Rpb24gYWJvcnRlZGApO1xuICAgICAgICBcbiAgICAgICAgZHluYW1pY1JlZHVjZXJzW2tleV0gPSByZWR1Y2VyO1xuICAgICAgICByZWR1eFN0b3JlLnJlcGxhY2VSZWR1Y2VyKGNvbWJpbmVSZWR1Y2Vycyh7IC4uLnN0YXRpY1JlZHVjZXJzLCAuLi5keW5hbWljUmVkdWNlcnMgfSkpO1xuICAgIH0sXG4gICAgcmVtb3ZlUmVkdWNlcjogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICgha2V5IHx8ICFkeW5hbWljUmVkdWNlcnNba2V5XSlcbiAgICAgICAgICAgIHRocm93IChgTm8gcmVkdWNlciB3aXRoIGtleSAnJHtrZXl9JyBmb3VuZC4gUmVtb3ZlIGFib3J0ZWRgKTtcblxuICAgICAgICBkZWxldGUgZHluYW1pY1JlZHVjZXJzW2tleV07XG4gICAgICAgIHJlZHV4U3RvcmUucmVwbGFjZVJlZHVjZXIoY29tYmluZVJlZHVjZXJzKHsgLi4uc3RhdGljUmVkdWNlcnMsIC4uLmR5bmFtaWNSZWR1Y2VycyB9KSk7XG4gICAgfSxcbiAgICByZXBsYWNlRXBpY3M6IChuZXdSb290RXBpYykgPT4ge1xuICAgICAgICBlcGljcyQubmV4dChuZXdSb290RXBpYyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdCA9IChzZWxlY3RvcikgPT4ge1xuICAgIGlmIChzZWxlY3RvcilcbiAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleSkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBzZWxlY3RvciBpbnN0YW5jZW9mIEFycmF5ID8gc3RvcmUuc2VsZWN0KGdlbmVyaWNTZWxlY3RvcihzZWxlY3RvcikpIDogc3RvcmUuc2VsZWN0KHNlbGVjdG9yKSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0ID0gKHNlbGVjdG9yKSA9PiB7XG4gICAgaWYgKHNlbGVjdG9yKVxuICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5KSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHNlbGVjdG9yIGluc3RhbmNlb2YgQXJyYXkgPyBzdG9yZS5zZWxlY3RTeW5jKGdlbmVyaWNTZWxlY3RvcihzZWxlY3RvcikpIDogc3RvcmUuc2VsZWN0U3luYyhzZWxlY3RvciksXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3BhdGNoID0gKCkgPT4ge1xuICAgIHJldHVybiAodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3I/KSA9PiB7XG4gICAgICAgIGxldCBvcmlnaW5hbE1ldGhvZDtcbiAgICAgICAgY29uc3Qgd3JhcHBlZCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHN0b3JlKVxuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKHJlc3VsdCk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3IgfHwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hEZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGdldDogKCkgPT4gd3JhcHBlZCxcbiAgICAgICAgICAgICAgICBzZXQ6IHNldE1ldGhvZCA9PiAob3JpZ2luYWxNZXRob2QgPSBzZXRNZXRob2QpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGlzcGF0Y2hEZXNjcmlwdG9yKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoRGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSB3cmFwcGVkO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICB9XG59OyJdfQ==