"use strict"; (self["webpackChunkramsey_plus_forms"] = self["webpackChunkramsey_plus_forms"] || []).push([[950],{ /***/ 868: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ MO: () => (/* binding */ registerAbortHandler), /* harmony export */ ff: () => (/* binding */ buildStore) /* harmony export */ }); /* unused harmony exports INTERNAL_abortPromise, INTERNAL_addPendingPromiseToDependency, INTERNAL_getBuildingBlocksRev2, INTERNAL_getMountedOrPendingDependents, INTERNAL_hasInitialValue, INTERNAL_initializeStoreHooksRev2, INTERNAL_isActuallyWritableAtom, INTERNAL_isAtomStateInitialized, INTERNAL_isPendingPromise, INTERNAL_isPromiseLike, INTERNAL_promiseStateMap, INTERNAL_returnAtomValue */ function hasInitialValue(atom) { return "init" in atom; } function isActuallyWritableAtom(atom) { return !!atom.write; } function isAtomStateInitialized(atomState) { return "v" in atomState || "e" in atomState; } function returnAtomValue(atomState) { if ("e" in atomState) { throw atomState.e; } if (( false ? 0 : void 0) !== "production" && !("v" in atomState)) { throw new Error("[Bug] atom state is not initialized"); } return atomState.v; } const promiseStateMap = /* @__PURE__ */ new WeakMap(); function isPendingPromise(value) { var _a; return isPromiseLike(value) && !!((_a = promiseStateMap.get(value)) == null ? void 0 : _a[0]); } function abortPromise(promise) { const promiseState = promiseStateMap.get(promise); if (promiseState == null ? void 0 : promiseState[0]) { promiseState[0] = false; promiseState[1].forEach((fn) => fn()); } } function registerAbortHandler(promise, abortHandler) { let promiseState = promiseStateMap.get(promise); if (!promiseState) { promiseState = [true, /* @__PURE__ */ new Set()]; promiseStateMap.set(promise, promiseState); const settle = () => { promiseState[0] = false; }; promise.then(settle, settle); } promiseState[1].add(abortHandler); } function isPromiseLike(p) { return typeof (p == null ? void 0 : p.then) === "function"; } function addPendingPromiseToDependency(atom, promise, dependencyAtomState) { if (!dependencyAtomState.p.has(atom)) { dependencyAtomState.p.add(atom); const cleanup = () => dependencyAtomState.p.delete(atom); promise.then(cleanup, cleanup); } } function getMountedOrPendingDependents(atom, atomState, mountedMap) { var _a; const dependents = /* @__PURE__ */ new Set(); for (const a of ((_a = mountedMap.get(atom)) == null ? void 0 : _a.t) || []) { if (mountedMap.has(a)) { dependents.add(a); } } for (const atomWithPendingPromise of atomState.p) { dependents.add(atomWithPendingPromise); } return dependents; } const createStoreHook = () => { const callbacks = /* @__PURE__ */ new Set(); const notify = () => callbacks.forEach((fn) => fn()); notify.add = (fn) => { callbacks.add(fn); return () => callbacks.delete(fn); }; return notify; }; const createStoreHookForAtoms = () => { const all = {}; const callbacks = /* @__PURE__ */ new WeakMap(); const notify = (atom) => { var _a, _b; (_a = callbacks.get(all)) == null ? void 0 : _a.forEach((fn) => fn(atom)); (_b = callbacks.get(atom)) == null ? void 0 : _b.forEach((fn) => fn()); }; notify.add = (atom, fn) => { const key = atom || all; const fns = (callbacks.has(key) ? callbacks : callbacks.set(key, /* @__PURE__ */ new Set())).get(key); fns.add(fn); return () => { fns == null ? void 0 : fns.delete(fn); if (!fns.size) { callbacks.delete(key); } }; }; return notify; }; function initializeStoreHooks(storeHooks) { storeHooks.r || (storeHooks.r = createStoreHookForAtoms()); storeHooks.c || (storeHooks.c = createStoreHookForAtoms()); storeHooks.m || (storeHooks.m = createStoreHookForAtoms()); storeHooks.u || (storeHooks.u = createStoreHookForAtoms()); storeHooks.f || (storeHooks.f = createStoreHook()); return storeHooks; } const atomRead = (_store, atom, ...params) => atom.read(...params); const atomWrite = (_store, atom, ...params) => atom.write(...params); const atomOnInit = (store, atom) => { var _a; return (_a = atom.unstable_onInit) == null ? void 0 : _a.call(atom, store); }; const atomOnMount = (_store, atom, setAtom) => { var _a; return (_a = atom.onMount) == null ? void 0 : _a.call(atom, setAtom); }; const ensureAtomState = (store, atom) => { const buildingBlocks = getInternalBuildingBlocks(store); const atomStateMap = buildingBlocks[0]; const atomOnInit2 = buildingBlocks[9]; if (( false ? 0 : void 0) !== "production" && !atom) { throw new Error("Atom is undefined or null"); } let atomState = atomStateMap.get(atom); if (!atomState) { atomState = { d: /* @__PURE__ */ new Map(), p: /* @__PURE__ */ new Set(), n: 0 }; atomStateMap.set(atom, atomState); atomOnInit2 == null ? void 0 : atomOnInit2(store, atom); } return atomState; }; const flushCallbacks = (store) => { const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const changedAtoms = buildingBlocks[3]; const mountCallbacks = buildingBlocks[4]; const unmountCallbacks = buildingBlocks[5]; const storeHooks = buildingBlocks[6]; const recomputeInvalidatedAtoms2 = buildingBlocks[13]; const errors = []; const call = (fn) => { try { fn(); } catch (e) { errors.push(e); } }; do { if (storeHooks.f) { call(storeHooks.f); } const callbacks = /* @__PURE__ */ new Set(); const add = callbacks.add.bind(callbacks); changedAtoms.forEach((atom) => { var _a; return (_a = mountedMap.get(atom)) == null ? void 0 : _a.l.forEach(add); }); changedAtoms.clear(); unmountCallbacks.forEach(add); unmountCallbacks.clear(); mountCallbacks.forEach(add); mountCallbacks.clear(); callbacks.forEach(call); if (changedAtoms.size) { recomputeInvalidatedAtoms2(store); } } while (changedAtoms.size || unmountCallbacks.size || mountCallbacks.size); if (errors.length) { throw new AggregateError(errors); } }; const recomputeInvalidatedAtoms = (store) => { const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const invalidatedAtoms = buildingBlocks[2]; const changedAtoms = buildingBlocks[3]; const ensureAtomState2 = buildingBlocks[11]; const readAtomState2 = buildingBlocks[14]; const mountDependencies2 = buildingBlocks[17]; const topSortedReversed = []; const visiting = /* @__PURE__ */ new WeakSet(); const visited = /* @__PURE__ */ new WeakSet(); const stack = Array.from(changedAtoms); while (stack.length) { const a = stack[stack.length - 1]; const aState = ensureAtomState2(store, a); if (visited.has(a)) { stack.pop(); continue; } if (visiting.has(a)) { if (invalidatedAtoms.get(a) === aState.n) { topSortedReversed.push([a, aState]); } else if (( false ? 0 : void 0) !== "production" && invalidatedAtoms.has(a)) { throw new Error("[Bug] invalidated atom exists"); } visited.add(a); stack.pop(); continue; } visiting.add(a); for (const d of getMountedOrPendingDependents(a, aState, mountedMap)) { if (!visiting.has(d)) { stack.push(d); } } } for (let i = topSortedReversed.length - 1; i >= 0; --i) { const [a, aState] = topSortedReversed[i]; let hasChangedDeps = false; for (const dep of aState.d.keys()) { if (dep !== a && changedAtoms.has(dep)) { hasChangedDeps = true; break; } } if (hasChangedDeps) { readAtomState2(store, a); mountDependencies2(store, a); } invalidatedAtoms.delete(a); } }; const readAtomState = (store, atom) => { var _a, _b; const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const invalidatedAtoms = buildingBlocks[2]; const changedAtoms = buildingBlocks[3]; const storeHooks = buildingBlocks[6]; const atomRead2 = buildingBlocks[7]; const ensureAtomState2 = buildingBlocks[11]; const flushCallbacks2 = buildingBlocks[12]; const recomputeInvalidatedAtoms2 = buildingBlocks[13]; const readAtomState2 = buildingBlocks[14]; const writeAtomState2 = buildingBlocks[16]; const mountDependencies2 = buildingBlocks[17]; const atomState = ensureAtomState2(store, atom); if (isAtomStateInitialized(atomState)) { if (mountedMap.has(atom) && invalidatedAtoms.get(atom) !== atomState.n) { return atomState; } if (Array.from(atomState.d).every( ([a, n]) => ( // Recursively, read the atom state of the dependency, and // check if the atom epoch number is unchanged readAtomState2(store, a).n === n ) )) { return atomState; } } atomState.d.clear(); let isSync = true; function mountDependenciesIfAsync() { if (mountedMap.has(atom)) { mountDependencies2(store, atom); recomputeInvalidatedAtoms2(store); flushCallbacks2(store); } } function getter(a) { var _a2; if (a === atom) { const aState2 = ensureAtomState2(store, a); if (!isAtomStateInitialized(aState2)) { if (hasInitialValue(a)) { setAtomStateValueOrPromise(store, a, a.init); } else { throw new Error("no atom init"); } } return returnAtomValue(aState2); } const aState = readAtomState2(store, a); try { return returnAtomValue(aState); } finally { atomState.d.set(a, aState.n); if (isPendingPromise(atomState.v)) { addPendingPromiseToDependency(atom, atomState.v, aState); } (_a2 = mountedMap.get(a)) == null ? void 0 : _a2.t.add(atom); if (!isSync) { mountDependenciesIfAsync(); } } } let controller; let setSelf; const options = { get signal() { if (!controller) { controller = new AbortController(); } return controller.signal; }, get setSelf() { if (( false ? 0 : void 0) !== "production" && !isActuallyWritableAtom(atom)) { console.warn("setSelf function cannot be used with read-only atom"); } if (!setSelf && isActuallyWritableAtom(atom)) { setSelf = (...args) => { if (( false ? 0 : void 0) !== "production" && isSync) { console.warn("setSelf function cannot be called in sync"); } if (!isSync) { try { return writeAtomState2(store, atom, ...args); } finally { recomputeInvalidatedAtoms2(store); flushCallbacks2(store); } } }; } return setSelf; } }; const prevEpochNumber = atomState.n; try { const valueOrPromise = atomRead2(store, atom, getter, options); setAtomStateValueOrPromise(store, atom, valueOrPromise); if (isPromiseLike(valueOrPromise)) { registerAbortHandler(valueOrPromise, () => controller == null ? void 0 : controller.abort()); valueOrPromise.then(mountDependenciesIfAsync, mountDependenciesIfAsync); } (_a = storeHooks.r) == null ? void 0 : _a.call(storeHooks, atom); return atomState; } catch (error) { delete atomState.v; atomState.e = error; ++atomState.n; return atomState; } finally { isSync = false; if (prevEpochNumber !== atomState.n && invalidatedAtoms.get(atom) === prevEpochNumber) { invalidatedAtoms.set(atom, atomState.n); changedAtoms.add(atom); (_b = storeHooks.c) == null ? void 0 : _b.call(storeHooks, atom); } } }; const invalidateDependents = (store, atom) => { const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const invalidatedAtoms = buildingBlocks[2]; const ensureAtomState2 = buildingBlocks[11]; const stack = [atom]; while (stack.length) { const a = stack.pop(); const aState = ensureAtomState2(store, a); for (const d of getMountedOrPendingDependents(a, aState, mountedMap)) { const dState = ensureAtomState2(store, d); invalidatedAtoms.set(d, dState.n); stack.push(d); } } }; const writeAtomState = (store, atom, ...args) => { const buildingBlocks = getInternalBuildingBlocks(store); const changedAtoms = buildingBlocks[3]; const storeHooks = buildingBlocks[6]; const atomWrite2 = buildingBlocks[8]; const ensureAtomState2 = buildingBlocks[11]; const flushCallbacks2 = buildingBlocks[12]; const recomputeInvalidatedAtoms2 = buildingBlocks[13]; const readAtomState2 = buildingBlocks[14]; const invalidateDependents2 = buildingBlocks[15]; const mountDependencies2 = buildingBlocks[17]; let isSync = true; const getter = (a) => returnAtomValue(readAtomState2(store, a)); const setter = (a, ...args2) => { var _a; const aState = ensureAtomState2(store, a); try { if (a === atom) { if (!hasInitialValue(a)) { throw new Error("atom not writable"); } const prevEpochNumber = aState.n; const v = args2[0]; setAtomStateValueOrPromise(store, a, v); mountDependencies2(store, a); if (prevEpochNumber !== aState.n) { changedAtoms.add(a); (_a = storeHooks.c) == null ? void 0 : _a.call(storeHooks, a); invalidateDependents2(store, a); } return void 0; } else { return writeAtomState(store, a, ...args2); } } finally { if (!isSync) { recomputeInvalidatedAtoms2(store); flushCallbacks2(store); } } }; try { return atomWrite2(store, atom, getter, setter, ...args); } finally { isSync = false; } }; const mountDependencies = (store, atom) => { var _a; const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const changedAtoms = buildingBlocks[3]; const storeHooks = buildingBlocks[6]; const ensureAtomState2 = buildingBlocks[11]; const invalidateDependents2 = buildingBlocks[15]; const mountAtom2 = buildingBlocks[18]; const unmountAtom2 = buildingBlocks[19]; const atomState = ensureAtomState2(store, atom); const mounted = mountedMap.get(atom); if (mounted && !isPendingPromise(atomState.v)) { for (const [a, n] of atomState.d) { if (!mounted.d.has(a)) { const aState = ensureAtomState2(store, a); const aMounted = mountAtom2(store, a); aMounted.t.add(atom); mounted.d.add(a); if (n !== aState.n) { changedAtoms.add(a); (_a = storeHooks.c) == null ? void 0 : _a.call(storeHooks, a); invalidateDependents2(store, a); } } } for (const a of mounted.d || []) { if (!atomState.d.has(a)) { mounted.d.delete(a); const aMounted = unmountAtom2(store, a); aMounted == null ? void 0 : aMounted.t.delete(atom); } } } }; const mountAtom = (store, atom) => { var _a; const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const mountCallbacks = buildingBlocks[4]; const storeHooks = buildingBlocks[6]; const atomOnMount2 = buildingBlocks[10]; const ensureAtomState2 = buildingBlocks[11]; const flushCallbacks2 = buildingBlocks[12]; const recomputeInvalidatedAtoms2 = buildingBlocks[13]; const readAtomState2 = buildingBlocks[14]; const writeAtomState2 = buildingBlocks[16]; const atomState = ensureAtomState2(store, atom); let mounted = mountedMap.get(atom); if (!mounted) { readAtomState2(store, atom); for (const a of atomState.d.keys()) { const aMounted = mountAtom(store, a); aMounted.t.add(atom); } mounted = { l: /* @__PURE__ */ new Set(), d: new Set(atomState.d.keys()), t: /* @__PURE__ */ new Set() }; mountedMap.set(atom, mounted); (_a = storeHooks.m) == null ? void 0 : _a.call(storeHooks, atom); if (isActuallyWritableAtom(atom)) { const processOnMount = () => { let isSync = true; const setAtom = (...args) => { try { return writeAtomState2(store, atom, ...args); } finally { if (!isSync) { recomputeInvalidatedAtoms2(store); flushCallbacks2(store); } } }; try { const onUnmount = atomOnMount2(store, atom, setAtom); if (onUnmount) { mounted.u = () => { isSync = true; try { onUnmount(); } finally { isSync = false; } }; } } finally { isSync = false; } }; mountCallbacks.add(processOnMount); } } return mounted; }; const unmountAtom = (store, atom) => { var _a; const buildingBlocks = getInternalBuildingBlocks(store); const mountedMap = buildingBlocks[1]; const unmountCallbacks = buildingBlocks[5]; const storeHooks = buildingBlocks[6]; const ensureAtomState2 = buildingBlocks[11]; const unmountAtom2 = buildingBlocks[19]; const atomState = ensureAtomState2(store, atom); let mounted = mountedMap.get(atom); if (mounted && !mounted.l.size && !Array.from(mounted.t).some((a) => { var _a2; return (_a2 = mountedMap.get(a)) == null ? void 0 : _a2.d.has(atom); })) { if (mounted.u) { unmountCallbacks.add(mounted.u); } mounted = void 0; mountedMap.delete(atom); (_a = storeHooks.u) == null ? void 0 : _a.call(storeHooks, atom); for (const a of atomState.d.keys()) { const aMounted = unmountAtom2(store, a); aMounted == null ? void 0 : aMounted.t.delete(atom); } return void 0; } return mounted; }; const setAtomStateValueOrPromise = (store, atom, valueOrPromise) => { const ensureAtomState2 = getInternalBuildingBlocks(store)[11]; const atomState = ensureAtomState2(store, atom); const hasPrevValue = "v" in atomState; const prevValue = atomState.v; if (isPromiseLike(valueOrPromise)) { for (const a of atomState.d.keys()) { addPendingPromiseToDependency( atom, valueOrPromise, ensureAtomState2(store, a) ); } } atomState.v = valueOrPromise; delete atomState.e; if (!hasPrevValue || !Object.is(prevValue, atomState.v)) { ++atomState.n; if (isPromiseLike(prevValue)) { abortPromise(prevValue); } } }; const storeGet = (store, atom) => { const readAtomState2 = getInternalBuildingBlocks(store)[14]; return returnAtomValue(readAtomState2(store, atom)); }; const storeSet = (store, atom, ...args) => { const buildingBlocks = getInternalBuildingBlocks(store); const flushCallbacks2 = buildingBlocks[12]; const recomputeInvalidatedAtoms2 = buildingBlocks[13]; const writeAtomState2 = buildingBlocks[16]; try { return writeAtomState2(store, atom, ...args); } finally { recomputeInvalidatedAtoms2(store); flushCallbacks2(store); } }; const storeSub = (store, atom, listener) => { const buildingBlocks = getInternalBuildingBlocks(store); const flushCallbacks2 = buildingBlocks[12]; const mountAtom2 = buildingBlocks[18]; const unmountAtom2 = buildingBlocks[19]; const mounted = mountAtom2(store, atom); const listeners = mounted.l; listeners.add(listener); flushCallbacks2(store); return () => { listeners.delete(listener); unmountAtom2(store, atom); flushCallbacks2(store); }; }; const buildingBlockMap = /* @__PURE__ */ new WeakMap(); const getInternalBuildingBlocks = (store) => { const buildingBlocks = buildingBlockMap.get(store); if (( false ? 0 : void 0) !== "production" && !buildingBlocks) { throw new Error( "Store must be created by buildStore to read its building blocks" ); } return buildingBlocks; }; function getBuildingBlocks(store) { const buildingBlocks = getInternalBuildingBlocks(store); const enhanceBuildingBlocks = buildingBlocks[24]; if (enhanceBuildingBlocks) { return enhanceBuildingBlocks(buildingBlocks); } return buildingBlocks; } function buildStore(...buildArgs) { const store = { get(atom) { const storeGet2 = getInternalBuildingBlocks(store)[21]; return storeGet2(store, atom); }, set(atom, ...args) { const storeSet2 = getInternalBuildingBlocks(store)[22]; return storeSet2(store, atom, ...args); }, sub(atom, listener) { const storeSub2 = getInternalBuildingBlocks(store)[23]; return storeSub2(store, atom, listener); } }; const buildingBlocks = [ // store state /* @__PURE__ */ new WeakMap(), // atomStateMap /* @__PURE__ */ new WeakMap(), // mountedMap /* @__PURE__ */ new WeakMap(), // invalidatedAtoms /* @__PURE__ */ new Set(), // changedAtoms /* @__PURE__ */ new Set(), // mountCallbacks /* @__PURE__ */ new Set(), // unmountCallbacks {}, // storeHooks // atom interceptors atomRead, atomWrite, atomOnInit, atomOnMount, // building-block functions ensureAtomState, flushCallbacks, recomputeInvalidatedAtoms, readAtomState, invalidateDependents, writeAtomState, mountDependencies, mountAtom, unmountAtom, setAtomStateValueOrPromise, storeGet, storeSet, storeSub, void 0 ].map((fn, i) => buildArgs[i] || fn); buildingBlockMap.set(store, Object.freeze(buildingBlocks)); return store; } /***/ }), /***/ 2035: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ eU: () => (/* binding */ atom), /* harmony export */ zp: () => (/* binding */ getDefaultStore) /* harmony export */ }); /* unused harmony exports INTERNAL_overrideCreateStore, createStore */ /* harmony import */ var jotai_vanilla_internals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(868); let keyCount = 0; function atom(read, write) { const key = `atom${++keyCount}`; const config = { toString() { return ( false ? 0 : void 0) !== "production" && this.debugLabel ? key + ":" + this.debugLabel : key; } }; if (typeof read === "function") { config.read = read; } else { config.init = read; config.read = defaultRead; config.write = defaultWrite; } if (write) { config.write = write; } return config; } function defaultRead(get) { return get(this); } function defaultWrite(get, set, arg) { return set( this, typeof arg === "function" ? arg(get(this)) : arg ); } let overiddenCreateStore; function INTERNAL_overrideCreateStore(fn) { overiddenCreateStore = fn(overiddenCreateStore); } function createStore() { if (overiddenCreateStore) { return overiddenCreateStore(); } return (0,jotai_vanilla_internals__WEBPACK_IMPORTED_MODULE_0__/* .INTERNAL_buildStoreRev2 */ .ff)(); } let defaultStore; function getDefaultStore() { if (!defaultStore) { defaultStore = createStore(); if (( false ? 0 : void 0) !== "production") { globalThis.__JOTAI_DEFAULT_STORE__ || (globalThis.__JOTAI_DEFAULT_STORE__ = defaultStore); if (globalThis.__JOTAI_DEFAULT_STORE__ !== defaultStore) { console.warn( "Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044" ); } } } return defaultStore; } /***/ }), /***/ 4929: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Iz: () => (/* binding */ atomFamily) /* harmony export */ }); /* unused harmony exports RESET, atomWithDefault, atomWithLazy, atomWithObservable, atomWithReducer, atomWithRefresh, atomWithReset, atomWithStorage, createJSONStorage, freezeAtom, freezeAtomCreator, loadable, selectAtom, splitAtom, unstable_withStorageValidator, unwrap */ const RESET = Symbol( ( false ? 0 : void 0) !== "production" ? "RESET" : "" ); function atomWithReset(initialValue) { const anAtom = atom( initialValue, (get, set, update) => { const nextValue = typeof update === "function" ? update(get(anAtom)) : update; set(anAtom, nextValue === RESET ? initialValue : nextValue); } ); return anAtom; } function atomWithReducer(initialValue, reducer) { return atom(initialValue, function(get, set, action) { set(this, reducer(get(this), action)); }); } function atomFamily(initializeAtom, areEqual) { let shouldRemove = null; const atoms = /* @__PURE__ */ new Map(); const listeners = /* @__PURE__ */ new Set(); const createAtom = (param) => { let item; if (areEqual === void 0) { item = atoms.get(param); } else { for (const [key, value] of atoms) { if (areEqual(key, param)) { item = value; break; } } } if (item !== void 0) { if (shouldRemove == null ? void 0 : shouldRemove(item[1], param)) { createAtom.remove(param); } else { return item[0]; } } const newAtom = initializeAtom(param); atoms.set(param, [newAtom, Date.now()]); notifyListeners("CREATE", param, newAtom); return newAtom; }; const notifyListeners = (type, param, atom) => { for (const listener of listeners) { listener({ type, param, atom }); } }; createAtom.unstable_listen = (callback) => { listeners.add(callback); return () => { listeners.delete(callback); }; }; createAtom.getParams = () => atoms.keys(); createAtom.remove = (param) => { if (areEqual === void 0) { if (!atoms.has(param)) return; const [atom] = atoms.get(param); atoms.delete(param); notifyListeners("REMOVE", param, atom); } else { for (const [key, [atom]] of atoms) { if (areEqual(key, param)) { atoms.delete(key); notifyListeners("REMOVE", key, atom); break; } } } }; createAtom.setShouldRemove = (fn) => { shouldRemove = fn; if (!shouldRemove) return; for (const [key, [atom, createdAt]] of atoms) { if (shouldRemove(createdAt, key)) { atoms.delete(key); notifyListeners("REMOVE", key, atom); } } }; return createAtom; } const getCached$2 = (c, m, k) => (m.has(k) ? m : m.set(k, c())).get(k); const cache1$3 = /* @__PURE__ */ new WeakMap(); const memo3 = (create, dep1, dep2, dep3) => { const cache2 = getCached$2(() => /* @__PURE__ */ new WeakMap(), cache1$3, dep1); const cache3 = getCached$2(() => /* @__PURE__ */ new WeakMap(), cache2, dep2); return getCached$2(create, cache3, dep3); }; function selectAtom(anAtom, selector, equalityFn = Object.is) { return memo3( () => { const EMPTY = Symbol(); const selectValue = ([value, prevSlice]) => { if (prevSlice === EMPTY) { return selector(value); } const slice = selector(value, prevSlice); return equalityFn(prevSlice, slice) ? prevSlice : slice; }; const derivedAtom = atom((get) => { const prev = get(derivedAtom); const value = get(anAtom); return selectValue([value, prev]); }); derivedAtom.init = EMPTY; return derivedAtom; }, anAtom, selector, equalityFn ); } const frozenAtoms = /* @__PURE__ */ new WeakSet(); const deepFreeze = (value) => { if (typeof value !== "object" || value === null) { return value; } Object.freeze(value); const propNames = Object.getOwnPropertyNames(value); for (const name of propNames) { deepFreeze(value[name]); } return value; }; function freezeAtom(anAtom) { if (frozenAtoms.has(anAtom)) { return anAtom; } frozenAtoms.add(anAtom); const origRead = anAtom.read; anAtom.read = function(get, options) { return deepFreeze(origRead.call(this, get, options)); }; if ("write" in anAtom) { const origWrite = anAtom.write; anAtom.write = function(get, set, ...args) { return origWrite.call( this, get, (...setArgs) => { if (setArgs[0] === anAtom) { setArgs[1] = deepFreeze(setArgs[1]); } return set(...setArgs); }, ...args ); }; } return anAtom; } function freezeAtomCreator(createAtom) { if (( false ? 0 : void 0) !== "production") { console.warn( "[DEPRECATED] freezeAtomCreator is deprecated, define it on users end" ); } return ((...args) => freezeAtom(createAtom(...args))); } const getCached$1 = (c, m, k) => (m.has(k) ? m : m.set(k, c())).get(k); const cache1$2 = /* @__PURE__ */ new WeakMap(); const memo2$1 = (create, dep1, dep2) => { const cache2 = getCached$1(() => /* @__PURE__ */ new WeakMap(), cache1$2, dep1); return getCached$1(create, cache2, dep2); }; const cacheKeyForEmptyKeyExtractor = {}; const isWritable = (atom2) => !!atom2.write; const isFunction = (x) => typeof x === "function"; function splitAtom(arrAtom, keyExtractor) { return memo2$1( () => { const mappingCache = /* @__PURE__ */ new WeakMap(); const getMapping = (arr, prev) => { let mapping = mappingCache.get(arr); if (mapping) { return mapping; } const prevMapping = prev && mappingCache.get(prev); const atomList = []; const keyList = []; arr.forEach((item, index) => { const key = keyExtractor ? keyExtractor(item) : index; keyList[index] = key; const cachedAtom = prevMapping && prevMapping.atomList[prevMapping.keyList.indexOf(key)]; if (cachedAtom) { atomList[index] = cachedAtom; return; } const read = (get) => { const prev2 = get(mappingAtom); const currArr = get(arrAtom); const mapping2 = getMapping(currArr, prev2 == null ? void 0 : prev2.arr); const index2 = mapping2.keyList.indexOf(key); if (index2 < 0 || index2 >= currArr.length) { const prevItem = arr[getMapping(arr).keyList.indexOf(key)]; if (prevItem) { return prevItem; } throw new Error("splitAtom: index out of bounds for read"); } return currArr[index2]; }; const write = (get, set, update) => { const prev2 = get(mappingAtom); const arr2 = get(arrAtom); const mapping2 = getMapping(arr2, prev2 == null ? void 0 : prev2.arr); const index2 = mapping2.keyList.indexOf(key); if (index2 < 0 || index2 >= arr2.length) { throw new Error("splitAtom: index out of bounds for write"); } const nextItem = isFunction(update) ? update(arr2[index2]) : update; if (!Object.is(arr2[index2], nextItem)) { set(arrAtom, [ ...arr2.slice(0, index2), nextItem, ...arr2.slice(index2 + 1) ]); } }; atomList[index] = isWritable(arrAtom) ? atom(read, write) : atom(read); }); if (prevMapping && prevMapping.keyList.length === keyList.length && prevMapping.keyList.every((x, i) => x === keyList[i])) { mapping = prevMapping; } else { mapping = { arr, atomList, keyList }; } mappingCache.set(arr, mapping); return mapping; }; const mappingAtom = atom((get) => { const prev = get(mappingAtom); const arr = get(arrAtom); const mapping = getMapping(arr, prev == null ? void 0 : prev.arr); return mapping; }); if (( false ? 0 : void 0) !== "production") { mappingAtom.debugPrivate = true; } mappingAtom.init = void 0; const splittedAtom = isWritable(arrAtom) ? atom( (get) => get(mappingAtom).atomList, (get, set, action) => { switch (action.type) { case "remove": { const index = get(splittedAtom).indexOf(action.atom); if (index >= 0) { const arr = get(arrAtom); set(arrAtom, [ ...arr.slice(0, index), ...arr.slice(index + 1) ]); } break; } case "insert": { const index = action.before ? get(splittedAtom).indexOf(action.before) : get(splittedAtom).length; if (index >= 0) { const arr = get(arrAtom); set(arrAtom, [ ...arr.slice(0, index), action.value, ...arr.slice(index) ]); } break; } case "move": { const index1 = get(splittedAtom).indexOf(action.atom); const index2 = action.before ? get(splittedAtom).indexOf(action.before) : get(splittedAtom).length; if (index1 >= 0 && index2 >= 0) { const arr = get(arrAtom); if (index1 < index2) { set(arrAtom, [ ...arr.slice(0, index1), ...arr.slice(index1 + 1, index2), arr[index1], ...arr.slice(index2) ]); } else { set(arrAtom, [ ...arr.slice(0, index2), arr[index1], ...arr.slice(index2, index1), ...arr.slice(index1 + 1) ]); } } break; } } } ) : atom((get) => get(mappingAtom).atomList); return splittedAtom; }, arrAtom, keyExtractor || cacheKeyForEmptyKeyExtractor ); } function atomWithDefault(getDefault) { const EMPTY = Symbol(); const overwrittenAtom = atom(EMPTY); if (( false ? 0 : void 0) !== "production") { overwrittenAtom.debugPrivate = true; } const anAtom = atom( (get, options) => { const overwritten = get(overwrittenAtom); if (overwritten !== EMPTY) { return overwritten; } return getDefault(get, options); }, (get, set, update) => { const newValue = typeof update === "function" ? update(get(anAtom)) : update; set(overwrittenAtom, newValue === RESET ? EMPTY : newValue); } ); return anAtom; } const isPromiseLike$3 = (x) => typeof (x == null ? void 0 : x.then) === "function"; function withStorageValidator(validator) { return (unknownStorage) => { const storage = { ...unknownStorage, getItem: (key, initialValue) => { const validate = (value2) => { if (!validator(value2)) { return initialValue; } return value2; }; const value = unknownStorage.getItem(key, initialValue); if (isPromiseLike$3(value)) { return value.then(validate); } return validate(value); } }; return storage; }; } function createJSONStorage(getStringStorage = () => { try { return window.localStorage; } catch (e) { if (( false ? 0 : void 0) !== "production") { if (typeof window !== "undefined") { console.warn(e); } } return void 0; } }, options) { var _a; let lastStr; let lastValue; const storage = { getItem: (key, initialValue) => { var _a2, _b; const parse = (str2) => { str2 = str2 || ""; if (lastStr !== str2) { try { lastValue = JSON.parse(str2, options == null ? void 0 : options.reviver); } catch (e) { return initialValue; } lastStr = str2; } return lastValue; }; const str = (_b = (_a2 = getStringStorage()) == null ? void 0 : _a2.getItem(key)) != null ? _b : null; if (isPromiseLike$3(str)) { return str.then(parse); } return parse(str); }, setItem: (key, newValue) => { var _a2; return (_a2 = getStringStorage()) == null ? void 0 : _a2.setItem( key, JSON.stringify(newValue, options == null ? void 0 : options.replacer) ); }, removeItem: (key) => { var _a2; return (_a2 = getStringStorage()) == null ? void 0 : _a2.removeItem(key); } }; const createHandleSubscribe = (subscriber2) => (key, callback, initialValue) => subscriber2(key, (v) => { let newValue; try { newValue = JSON.parse(v || ""); } catch (e) { newValue = initialValue; } callback(newValue); }); let subscriber; try { subscriber = (_a = getStringStorage()) == null ? void 0 : _a.subscribe; } catch (e) { } if (!subscriber && typeof window !== "undefined" && typeof window.addEventListener === "function" && window.Storage) { subscriber = (key, callback) => { if (!(getStringStorage() instanceof window.Storage)) { return () => { }; } const storageEventCallback = (e) => { if (e.storageArea === getStringStorage() && e.key === key) { callback(e.newValue); } }; window.addEventListener("storage", storageEventCallback); return () => { window.removeEventListener("storage", storageEventCallback); }; }; } if (subscriber) { storage.subscribe = createHandleSubscribe(subscriber); } return storage; } const defaultStorage = createJSONStorage(); function atomWithStorage(key, initialValue, storage = defaultStorage, options) { const getOnInit = options == null ? void 0 : options.getOnInit; const baseAtom = atom( getOnInit ? storage.getItem(key, initialValue) : initialValue ); if (( false ? 0 : void 0) !== "production") { baseAtom.debugPrivate = true; } baseAtom.onMount = (setAtom) => { setAtom(storage.getItem(key, initialValue)); let unsub; if (storage.subscribe) { unsub = storage.subscribe(key, setAtom, initialValue); } return unsub; }; const anAtom = atom( (get) => get(baseAtom), (get, set, update) => { const nextValue = typeof update === "function" ? update(get(baseAtom)) : update; if (nextValue === RESET) { set(baseAtom, initialValue); return storage.removeItem(key); } if (isPromiseLike$3(nextValue)) { return nextValue.then((resolvedValue) => { set(baseAtom, resolvedValue); return storage.setItem(key, resolvedValue); }); } set(baseAtom, nextValue); return storage.setItem(key, nextValue); } ); return anAtom; } const isPromiseLike$2 = (x) => typeof (x == null ? void 0 : x.then) === "function"; function atomWithObservable(getObservable, options) { const returnResultData = (result) => { if ("e" in result) { throw result.e; } return result.d; }; const observableResultAtom = atom((get) => { var _a; let observable = getObservable(get); const itself = (_a = observable[Symbol.observable]) == null ? void 0 : _a.call(observable); if (itself) { observable = itself; } let resolve; const makePending = () => new Promise((r) => { resolve = r; }); const initialResult = options && "initialValue" in options ? { d: typeof options.initialValue === "function" ? options.initialValue() : options.initialValue } : makePending(); let setResult; let lastResult; const listener = (result) => { lastResult = result; resolve == null ? void 0 : resolve(result); setResult == null ? void 0 : setResult(result); }; let subscription; let timer; const isNotMounted = () => !setResult; const unsubscribe = () => { if (subscription) { subscription.unsubscribe(); subscription = void 0; } }; const start = () => { if (subscription) { clearTimeout(timer); subscription.unsubscribe(); } subscription = observable.subscribe({ next: (d) => listener({ d }), error: (e) => listener({ e }), complete: () => { } }); if (isNotMounted() && (options == null ? void 0 : options.unstable_timeout)) { timer = setTimeout(unsubscribe, options.unstable_timeout); } }; start(); const resultAtom = atom(lastResult || initialResult); if (( false ? 0 : void 0) !== "production") { resultAtom.debugPrivate = true; } resultAtom.onMount = (update) => { setResult = update; if (lastResult) { update(lastResult); } if (subscription) { clearTimeout(timer); } else { start(); } return () => { setResult = void 0; if (options == null ? void 0 : options.unstable_timeout) { timer = setTimeout(unsubscribe, options.unstable_timeout); } else { unsubscribe(); } }; }; return [resultAtom, observable, makePending, start, isNotMounted]; }); if (( false ? 0 : void 0) !== "production") { observableResultAtom.debugPrivate = true; } const observableAtom = atom( (get) => { const [resultAtom] = get(observableResultAtom); const result = get(resultAtom); if (isPromiseLike$2(result)) { return result.then(returnResultData); } return returnResultData(result); }, (get, set, data) => { const [resultAtom, observable, makePending, start, isNotMounted] = get(observableResultAtom); if ("next" in observable) { if (isNotMounted()) { set(resultAtom, makePending()); start(); } observable.next(data); } else { throw new Error("observable is not subject"); } } ); return observableAtom; } const cache1$1 = /* @__PURE__ */ new WeakMap(); const memo1 = (create, dep1) => (cache1$1.has(dep1) ? cache1$1 : cache1$1.set(dep1, create())).get(dep1); const isPromiseLike$1 = (p) => typeof (p == null ? void 0 : p.then) === "function"; const LOADING = { state: "loading" }; function loadable(anAtom) { return memo1(() => { const loadableCache = /* @__PURE__ */ new WeakMap(); const refreshAtom = atom(0); if (( false ? 0 : void 0) !== "production") { refreshAtom.debugPrivate = true; } const derivedAtom = atom( (get, { setSelf }) => { get(refreshAtom); let value; try { value = get(anAtom); } catch (error) { return { state: "hasError", error }; } if (!isPromiseLike$1(value)) { return { state: "hasData", data: value }; } const promise = value; const cached1 = loadableCache.get(promise); if (cached1) { return cached1; } promise.then( (data) => { loadableCache.set(promise, { state: "hasData", data }); setSelf(); }, (error) => { loadableCache.set(promise, { state: "hasError", error }); setSelf(); } ); const cached2 = loadableCache.get(promise); if (cached2) { return cached2; } loadableCache.set(promise, LOADING); return LOADING; }, (_get, set) => { set(refreshAtom, (c) => c + 1); } ); if (( false ? 0 : void 0) !== "production") { derivedAtom.debugPrivate = true; } return atom((get) => get(derivedAtom)); }, anAtom); } const getCached = (c, m, k) => (m.has(k) ? m : m.set(k, c())).get(k); const cache1 = /* @__PURE__ */ new WeakMap(); const memo2 = (create, dep1, dep2) => { const cache2 = getCached(() => /* @__PURE__ */ new WeakMap(), cache1, dep1); return getCached(create, cache2, dep2); }; const isPromiseLike = (p) => typeof (p == null ? void 0 : p.then) === "function"; const defaultFallback = () => void 0; function unwrap(anAtom, fallback = defaultFallback) { return memo2( () => { const promiseErrorCache = /* @__PURE__ */ new WeakMap(); const promiseResultCache = /* @__PURE__ */ new WeakMap(); const refreshAtom = atom(0); if (( false ? 0 : void 0) !== "production") { refreshAtom.debugPrivate = true; } const promiseAndValueAtom = atom( (get, { setSelf }) => { get(refreshAtom); let prev; try { prev = get(promiseAndValueAtom); } catch (e) { } const promise = get(anAtom); if (!isPromiseLike(promise)) { return { v: promise }; } if (promise !== (prev == null ? void 0 : prev.p)) { promise.then( (v) => { promiseResultCache.set(promise, v); setSelf(); }, (e) => { promiseErrorCache.set(promise, e); setSelf(); } ); } if (promiseErrorCache.has(promise)) { throw promiseErrorCache.get(promise); } if (promiseResultCache.has(promise)) { return { p: promise, v: promiseResultCache.get(promise) }; } if (prev && "v" in prev) { return { p: promise, f: fallback(prev.v), v: prev.v }; } return { p: promise, f: fallback() }; }, (_get, set) => { set(refreshAtom, (c) => c + 1); } ); promiseAndValueAtom.init = void 0; if (( false ? 0 : void 0) !== "production") { promiseAndValueAtom.debugPrivate = true; } return atom( (get) => { const state = get(promiseAndValueAtom); if ("f" in state) { return state.f; } return state.v; }, (_get, set, ...args) => set(anAtom, ...args) ); }, anAtom, fallback ); } function atomWithRefresh(read, write) { const refreshAtom = atom(0); if (( false ? 0 : void 0) !== "production") { refreshAtom.debugPrivate = true; } return atom( (get, options) => { get(refreshAtom); return read(get, options); }, (get, set, ...args) => { if (args.length === 0) { set(refreshAtom, (c) => c + 1); } else if (write) { return write(get, set, ...args); } else if (( false ? 0 : void 0) !== "production") { throw new Error("refresh must be called without arguments"); } } ); } function atomWithLazy(makeInitial) { const a = atom(void 0); delete a.init; Object.defineProperty(a, "init", { get() { return makeInitial(); } }); return a; } /***/ }), /***/ 6184: /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ E: () => (/* binding */ ReactQueryDevtools2) /* harmony export */ }); /* unused harmony export ReactQueryDevtoolsPanel */ "use client"; // src/index.ts var ReactQueryDevtools2 = true ? function() { return null; } : 0; var ReactQueryDevtoolsPanel2 = true ? function() { return null; } : 0; //# sourceMappingURL=index.js.map /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFlLEdBQUcsQ0FBb0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVzdUI7Ozs7Ozs7Ozs7Ozs7O0FDL29CcHFCOztBQUVsRTtBQUNBO0FBQ0EscUJBQXFCLFdBQVc7QUFDaEM7QUFDQTtBQUNBLGNBQWMsTUFBZSxHQUFHLENBQW9CO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywwRkFBdUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsTUFBZSxHQUFHLENBQW9CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUU0RTs7Ozs7Ozs7Ozs7O0FDMUR2Qzs7QUFFckM7QUFDQSxHQUFHLE1BQWUsR0FBRyxDQUFvQjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixtQkFBbUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBZSxHQUFHLENBQW9CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsVUFBVTtBQUNWLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsV0FBVyxNQUFlLEdBQUcsQ0FBb0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFlLEdBQUcsQ0FBb0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLFNBQVMsTUFBZSxHQUFHLENBQW9CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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UztBQUNUO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU8sTUFBZSxHQUFHLENBQW9CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRLFVBQVUsTUFBZSxHQUFHLENBQW9CO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFb1M7Ozs7Ozs7Ozs7OztBQ2p2QnBTOztBQUVBO0FBQ29EO0FBQ1U7QUFDOUQsMEJBQTBCLEtBQXNDO0FBQ2hFO0FBQ0EsRUFBRSxFQUFFLENBQTJCO0FBQy9CLCtCQUErQixLQUFzQztBQUNyRTtBQUNBLEVBQUUsRUFBRSxDQUFxQztBQUl2QztBQUNGLGlDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvam90YWkvZXNtL3ZhbmlsbGEvaW50ZXJuYWxzLm1qcyIsIndlYnBhY2s6Ly9yYW1zZXktcGx1cy1mb3Jtcy8uL25vZGVfbW9kdWxlcy9qb3RhaS9lc20vdmFuaWxsYS5tanMiLCJ3ZWJwYWNrOi8vcmFtc2V5LXBsdXMtZm9ybXMvLi9ub2RlX21vZHVsZXMvam90YWkvZXNtL3ZhbmlsbGEvdXRpbHMubWpzIiwid2VicGFjazovL3JhbXNleS1wbHVzLWZvcm1zLy4vbm9kZV9tb2R1bGVzL0B0YW5zdGFjay9yZWFjdC1xdWVyeS1kZXZ0b29scy9idWlsZC9tb2Rlcm4vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGFzSW5pdGlhbFZhbHVlKGF0b20pIHtcbiAgcmV0dXJuIFwiaW5pdFwiIGluIGF0b207XG59XG5mdW5jdGlvbiBpc0FjdHVhbGx5V3JpdGFibGVBdG9tKGF0b20pIHtcbiAgcmV0dXJuICEhYXRvbS53cml0ZTtcbn1cbmZ1bmN0aW9uIGlzQXRvbVN0YXRlSW5pdGlhbGl6ZWQoYXRvbVN0YXRlKSB7XG4gIHJldHVybiBcInZcIiBpbiBhdG9tU3RhdGUgfHwgXCJlXCIgaW4gYXRvbVN0YXRlO1xufVxuZnVuY3Rpb24gcmV0dXJuQXRvbVZhbHVlKGF0b21TdGF0ZSkge1xuICBpZiAoXCJlXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgdGhyb3cgYXRvbVN0YXRlLmU7XG4gIH1cbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmICEoXCJ2XCIgaW4gYXRvbVN0YXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIltCdWddIGF0b20gc3RhdGUgaXMgbm90IGluaXRpYWxpemVkXCIpO1xuICB9XG4gIHJldHVybiBhdG9tU3RhdGUudjtcbn1cbmNvbnN0IHByb21pc2VTdGF0ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gaXNQZW5kaW5nUHJvbWlzZSh2YWx1ZSkge1xuICB2YXIgX2E7XG4gIHJldHVybiBpc1Byb21pc2VMaWtlKHZhbHVlKSAmJiAhISgoX2EgPSBwcm9taXNlU3RhdGVNYXAuZ2V0KHZhbHVlKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hWzBdKTtcbn1cbmZ1bmN0aW9uIGFib3J0UHJvbWlzZShwcm9taXNlKSB7XG4gIGNvbnN0IHByb21pc2VTdGF0ZSA9IHByb21pc2VTdGF0ZU1hcC5nZXQocHJvbWlzZSk7XG4gIGlmIChwcm9taXNlU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByb21pc2VTdGF0ZVswXSkge1xuICAgIHByb21pc2VTdGF0ZVswXSA9IGZhbHNlO1xuICAgIHByb21pc2VTdGF0ZVsxXS5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyQWJvcnRIYW5kbGVyKHByb21pc2UsIGFib3J0SGFuZGxlcikge1xuICBsZXQgcHJvbWlzZVN0YXRlID0gcHJvbWlzZVN0YXRlTWFwLmdldChwcm9taXNlKTtcbiAgaWYgKCFwcm9taXNlU3RhdGUpIHtcbiAgICBwcm9taXNlU3RhdGUgPSBbdHJ1ZSwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKV07XG4gICAgcHJvbWlzZVN0YXRlTWFwLnNldChwcm9taXNlLCBwcm9taXNlU3RhdGUpO1xuICAgIGNvbnN0IHNldHRsZSA9ICgpID0+IHtcbiAgICAgIHByb21pc2VTdGF0ZVswXSA9IGZhbHNlO1xuICAgIH07XG4gICAgcHJvbWlzZS50aGVuKHNldHRsZSwgc2V0dGxlKTtcbiAgfVxuICBwcm9taXNlU3RhdGVbMV0uYWRkKGFib3J0SGFuZGxlcik7XG59XG5mdW5jdGlvbiBpc1Byb21pc2VMaWtlKHApIHtcbiAgcmV0dXJuIHR5cGVvZiAocCA9PSBudWxsID8gdm9pZCAwIDogcC50aGVuKSA9PT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gYWRkUGVuZGluZ1Byb21pc2VUb0RlcGVuZGVuY3koYXRvbSwgcHJvbWlzZSwgZGVwZW5kZW5jeUF0b21TdGF0ZSkge1xuICBpZiAoIWRlcGVuZGVuY3lBdG9tU3RhdGUucC5oYXMoYXRvbSkpIHtcbiAgICBkZXBlbmRlbmN5QXRvbVN0YXRlLnAuYWRkKGF0b20pO1xuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiBkZXBlbmRlbmN5QXRvbVN0YXRlLnAuZGVsZXRlKGF0b20pO1xuICAgIHByb21pc2UudGhlbihjbGVhbnVwLCBjbGVhbnVwKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TW91bnRlZE9yUGVuZGluZ0RlcGVuZGVudHMoYXRvbSwgYXRvbVN0YXRlLCBtb3VudGVkTWFwKSB7XG4gIHZhciBfYTtcbiAgY29uc3QgZGVwZW5kZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgYSBvZiAoKF9hID0gbW91bnRlZE1hcC5nZXQoYXRvbSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS50KSB8fCBbXSkge1xuICAgIGlmIChtb3VudGVkTWFwLmhhcyhhKSkge1xuICAgICAgZGVwZW5kZW50cy5hZGQoYSk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgYXRvbVdpdGhQZW5kaW5nUHJvbWlzZSBvZiBhdG9tU3RhdGUucCkge1xuICAgIGRlcGVuZGVudHMuYWRkKGF0b21XaXRoUGVuZGluZ1Byb21pc2UpO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbnRzO1xufVxuY29uc3QgY3JlYXRlU3RvcmVIb29rID0gKCkgPT4ge1xuICBjb25zdCBjYWxsYmFja3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBub3RpZnkgPSAoKSA9PiBjYWxsYmFja3MuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICBub3RpZnkuYWRkID0gKGZuKSA9PiB7XG4gICAgY2FsbGJhY2tzLmFkZChmbik7XG4gICAgcmV0dXJuICgpID0+IGNhbGxiYWNrcy5kZWxldGUoZm4pO1xuICB9O1xuICByZXR1cm4gbm90aWZ5O1xufTtcbmNvbnN0IGNyZWF0ZVN0b3JlSG9va0ZvckF0b21zID0gKCkgPT4ge1xuICBjb25zdCBhbGwgPSB7fTtcbiAgY29uc3QgY2FsbGJhY2tzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IG5vdGlmeSA9IChhdG9tKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2EgPSBjYWxsYmFja3MuZ2V0KGFsbCkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5mb3JFYWNoKChmbikgPT4gZm4oYXRvbSkpO1xuICAgIChfYiA9IGNhbGxiYWNrcy5nZXQoYXRvbSkpID09IG51bGwgPyB2b2lkIDAgOiBfYi5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG4gIH07XG4gIG5vdGlmeS5hZGQgPSAoYXRvbSwgZm4pID0+IHtcbiAgICBjb25zdCBrZXkgPSBhdG9tIHx8IGFsbDtcbiAgICBjb25zdCBmbnMgPSAoY2FsbGJhY2tzLmhhcyhrZXkpID8gY2FsbGJhY2tzIDogY2FsbGJhY2tzLnNldChrZXksIC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpKS5nZXQoa2V5KTtcbiAgICBmbnMuYWRkKGZuKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZm5zID09IG51bGwgPyB2b2lkIDAgOiBmbnMuZGVsZXRlKGZuKTtcbiAgICAgIGlmICghZm5zLnNpemUpIHtcbiAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIHJldHVybiBub3RpZnk7XG59O1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0b3JlSG9va3Moc3RvcmVIb29rcykge1xuICBzdG9yZUhvb2tzLnIgfHwgKHN0b3JlSG9va3MuciA9IGNyZWF0ZVN0b3JlSG9va0ZvckF0b21zKCkpO1xuICBzdG9yZUhvb2tzLmMgfHwgKHN0b3JlSG9va3MuYyA9IGNyZWF0ZVN0b3JlSG9va0ZvckF0b21zKCkpO1xuICBzdG9yZUhvb2tzLm0gfHwgKHN0b3JlSG9va3MubSA9IGNyZWF0ZVN0b3JlSG9va0ZvckF0b21zKCkpO1xuICBzdG9yZUhvb2tzLnUgfHwgKHN0b3JlSG9va3MudSA9IGNyZWF0ZVN0b3JlSG9va0ZvckF0b21zKCkpO1xuICBzdG9yZUhvb2tzLmYgfHwgKHN0b3JlSG9va3MuZiA9IGNyZWF0ZVN0b3JlSG9vaygpKTtcbiAgcmV0dXJuIHN0b3JlSG9va3M7XG59XG5jb25zdCBhdG9tUmVhZCA9IChfc3RvcmUsIGF0b20sIC4uLnBhcmFtcykgPT4gYXRvbS5yZWFkKC4uLnBhcmFtcyk7XG5jb25zdCBhdG9tV3JpdGUgPSAoX3N0b3JlLCBhdG9tLCAuLi5wYXJhbXMpID0+IGF0b20ud3JpdGUoLi4ucGFyYW1zKTtcbmNvbnN0IGF0b21PbkluaXQgPSAoc3RvcmUsIGF0b20pID0+IHtcbiAgdmFyIF9hO1xuICByZXR1cm4gKF9hID0gYXRvbS51bnN0YWJsZV9vbkluaXQpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGF0b20sIHN0b3JlKTtcbn07XG5jb25zdCBhdG9tT25Nb3VudCA9IChfc3RvcmUsIGF0b20sIHNldEF0b20pID0+IHtcbiAgdmFyIF9hO1xuICByZXR1cm4gKF9hID0gYXRvbS5vbk1vdW50KSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChhdG9tLCBzZXRBdG9tKTtcbn07XG5jb25zdCBlbnN1cmVBdG9tU3RhdGUgPSAoc3RvcmUsIGF0b20pID0+IHtcbiAgY29uc3QgYnVpbGRpbmdCbG9ja3MgPSBnZXRJbnRlcm5hbEJ1aWxkaW5nQmxvY2tzKHN0b3JlKTtcbiAgY29uc3QgYXRvbVN0YXRlTWFwID0gYnVpbGRpbmdCbG9ja3NbMF07XG4gIGNvbnN0IGF0b21PbkluaXQyID0gYnVpbGRpbmdCbG9ja3NbOV07XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhYXRvbSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkF0b20gaXMgdW5kZWZpbmVkIG9yIG51bGxcIik7XG4gIH1cbiAgbGV0IGF0b21TdGF0ZSA9IGF0b21TdGF0ZU1hcC5nZXQoYXRvbSk7XG4gIGlmICghYXRvbVN0YXRlKSB7XG4gICAgYXRvbVN0YXRlID0geyBkOiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBwOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCBuOiAwIH07XG4gICAgYXRvbVN0YXRlTWFwLnNldChhdG9tLCBhdG9tU3RhdGUpO1xuICAgIGF0b21PbkluaXQyID09IG51bGwgPyB2b2lkIDAgOiBhdG9tT25Jbml0MihzdG9yZSwgYXRvbSk7XG4gIH1cbiAgcmV0dXJuIGF0b21TdGF0ZTtcbn07XG5jb25zdCBmbHVzaENhbGxiYWNrcyA9IChzdG9yZSkgPT4ge1xuICBjb25zdCBidWlsZGluZ0Jsb2NrcyA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpO1xuICBjb25zdCBtb3VudGVkTWFwID0gYnVpbGRpbmdCbG9ja3NbMV07XG4gIGNvbnN0IGNoYW5nZWRBdG9tcyA9IGJ1aWxkaW5nQmxvY2tzWzNdO1xuICBjb25zdCBtb3VudENhbGxiYWNrcyA9IGJ1aWxkaW5nQmxvY2tzWzRdO1xuICBjb25zdCB1bm1vdW50Q2FsbGJhY2tzID0gYnVpbGRpbmdCbG9ja3NbNV07XG4gIGNvbnN0IHN0b3JlSG9va3MgPSBidWlsZGluZ0Jsb2Nrc1s2XTtcbiAgY29uc3QgcmVjb21wdXRlSW52YWxpZGF0ZWRBdG9tczIgPSBidWlsZGluZ0Jsb2Nrc1sxM107XG4gIGNvbnN0IGVycm9ycyA9IFtdO1xuICBjb25zdCBjYWxsID0gKGZuKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JzLnB1c2goZSk7XG4gICAgfVxuICB9O1xuICBkbyB7XG4gICAgaWYgKHN0b3JlSG9va3MuZikge1xuICAgICAgY2FsbChzdG9yZUhvb2tzLmYpO1xuICAgIH1cbiAgICBjb25zdCBjYWxsYmFja3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGNvbnN0IGFkZCA9IGNhbGxiYWNrcy5hZGQuYmluZChjYWxsYmFja3MpO1xuICAgIGNoYW5nZWRBdG9tcy5mb3JFYWNoKChhdG9tKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gKF9hID0gbW91bnRlZE1hcC5nZXQoYXRvbSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5sLmZvckVhY2goYWRkKTtcbiAgICB9KTtcbiAgICBjaGFuZ2VkQXRvbXMuY2xlYXIoKTtcbiAgICB1bm1vdW50Q2FsbGJhY2tzLmZvckVhY2goYWRkKTtcbiAgICB1bm1vdW50Q2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgbW91bnRDYWxsYmFja3MuZm9yRWFjaChhZGQpO1xuICAgIG1vdW50Q2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgY2FsbGJhY2tzLmZvckVhY2goY2FsbCk7XG4gICAgaWYgKGNoYW5nZWRBdG9tcy5zaXplKSB7XG4gICAgICByZWNvbXB1dGVJbnZhbGlkYXRlZEF0b21zMihzdG9yZSk7XG4gICAgfVxuICB9IHdoaWxlIChjaGFuZ2VkQXRvbXMuc2l6ZSB8fCB1bm1vdW50Q2FsbGJhY2tzLnNpemUgfHwgbW91bnRDYWxsYmFja3Muc2l6ZSk7XG4gIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gIH1cbn07XG5jb25zdCByZWNvbXB1dGVJbnZhbGlkYXRlZEF0b21zID0gKHN0b3JlKSA9PiB7XG4gIGNvbnN0IGJ1aWxkaW5nQmxvY2tzID0gZ2V0SW50ZXJuYWxCdWlsZGluZ0Jsb2NrcyhzdG9yZSk7XG4gIGNvbnN0IG1vdW50ZWRNYXAgPSBidWlsZGluZ0Jsb2Nrc1sxXTtcbiAgY29uc3QgaW52YWxpZGF0ZWRBdG9tcyA9IGJ1aWxkaW5nQmxvY2tzWzJdO1xuICBjb25zdCBjaGFuZ2VkQXRvbXMgPSBidWlsZGluZ0Jsb2Nrc1szXTtcbiAgY29uc3QgZW5zdXJlQXRvbVN0YXRlMiA9IGJ1aWxkaW5nQmxvY2tzWzExXTtcbiAgY29uc3QgcmVhZEF0b21TdGF0ZTIgPSBidWlsZGluZ0Jsb2Nrc1sxNF07XG4gIGNvbnN0IG1vdW50RGVwZW5kZW5jaWVzMiA9IGJ1aWxkaW5nQmxvY2tzWzE3XTtcbiAgY29uc3QgdG9wU29ydGVkUmV2ZXJzZWQgPSBbXTtcbiAgY29uc3QgdmlzaXRpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgY29uc3QgdmlzaXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICBjb25zdCBzdGFjayA9IEFycmF5LmZyb20oY2hhbmdlZEF0b21zKTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgIGNvbnN0IGEgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBhU3RhdGUgPSBlbnN1cmVBdG9tU3RhdGUyKHN0b3JlLCBhKTtcbiAgICBpZiAodmlzaXRlZC5oYXMoYSkpIHtcbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh2aXNpdGluZy5oYXMoYSkpIHtcbiAgICAgIGlmIChpbnZhbGlkYXRlZEF0b21zLmdldChhKSA9PT0gYVN0YXRlLm4pIHtcbiAgICAgICAgdG9wU29ydGVkUmV2ZXJzZWQucHVzaChbYSwgYVN0YXRlXSk7XG4gICAgICB9IGVsc2UgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmIGludmFsaWRhdGVkQXRvbXMuaGFzKGEpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIltCdWddIGludmFsaWRhdGVkIGF0b20gZXhpc3RzXCIpO1xuICAgICAgfVxuICAgICAgdmlzaXRlZC5hZGQoYSk7XG4gICAgICBzdGFjay5wb3AoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2aXNpdGluZy5hZGQoYSk7XG4gICAgZm9yIChjb25zdCBkIG9mIGdldE1vdW50ZWRPclBlbmRpbmdEZXBlbmRlbnRzKGEsIGFTdGF0ZSwgbW91bnRlZE1hcCkpIHtcbiAgICAgIGlmICghdmlzaXRpbmcuaGFzKGQpKSB7XG4gICAgICAgIHN0YWNrLnB1c2goZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAobGV0IGkgPSB0b3BTb3J0ZWRSZXZlcnNlZC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIGNvbnN0IFthLCBhU3RhdGVdID0gdG9wU29ydGVkUmV2ZXJzZWRbaV07XG4gICAgbGV0IGhhc0NoYW5nZWREZXBzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgYVN0YXRlLmQua2V5cygpKSB7XG4gICAgICBpZiAoZGVwICE9PSBhICYmIGNoYW5nZWRBdG9tcy5oYXMoZGVwKSkge1xuICAgICAgICBoYXNDaGFuZ2VkRGVwcyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQ2hhbmdlZERlcHMpIHtcbiAgICAgIHJlYWRBdG9tU3RhdGUyKHN0b3JlLCBhKTtcbiAgICAgIG1vdW50RGVwZW5kZW5jaWVzMihzdG9yZSwgYSk7XG4gICAgfVxuICAgIGludmFsaWRhdGVkQXRvbXMuZGVsZXRlKGEpO1xuICB9XG59O1xuY29uc3QgcmVhZEF0b21TdGF0ZSA9IChzdG9yZSwgYXRvbSkgPT4ge1xuICB2YXIgX2EsIF9iO1xuICBjb25zdCBidWlsZGluZ0Jsb2NrcyA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpO1xuICBjb25zdCBtb3VudGVkTWFwID0gYnVpbGRpbmdCbG9ja3NbMV07XG4gIGNvbnN0IGludmFsaWRhdGVkQXRvbXMgPSBidWlsZGluZ0Jsb2Nrc1syXTtcbiAgY29uc3QgY2hhbmdlZEF0b21zID0gYnVpbGRpbmdCbG9ja3NbM107XG4gIGNvbnN0IHN0b3JlSG9va3MgPSBidWlsZGluZ0Jsb2Nrc1s2XTtcbiAgY29uc3QgYXRvbVJlYWQyID0gYnVpbGRpbmdCbG9ja3NbN107XG4gIGNvbnN0IGVuc3VyZUF0b21TdGF0ZTIgPSBidWlsZGluZ0Jsb2Nrc1sxMV07XG4gIGNvbnN0IGZsdXNoQ2FsbGJhY2tzMiA9IGJ1aWxkaW5nQmxvY2tzWzEyXTtcbiAgY29uc3QgcmVjb21wdXRlSW52YWxpZGF0ZWRBdG9tczIgPSBidWlsZGluZ0Jsb2Nrc1sxM107XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUyID0gYnVpbGRpbmdCbG9ja3NbMTRdO1xuICBjb25zdCB3cml0ZUF0b21TdGF0ZTIgPSBidWlsZGluZ0Jsb2Nrc1sxNl07XG4gIGNvbnN0IG1vdW50RGVwZW5kZW5jaWVzMiA9IGJ1aWxkaW5nQmxvY2tzWzE3XTtcbiAgY29uc3QgYXRvbVN0YXRlID0gZW5zdXJlQXRvbVN0YXRlMihzdG9yZSwgYXRvbSk7XG4gIGlmIChpc0F0b21TdGF0ZUluaXRpYWxpemVkKGF0b21TdGF0ZSkpIHtcbiAgICBpZiAobW91bnRlZE1hcC5oYXMoYXRvbSkgJiYgaW52YWxpZGF0ZWRBdG9tcy5nZXQoYXRvbSkgIT09IGF0b21TdGF0ZS5uKSB7XG4gICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuZnJvbShhdG9tU3RhdGUuZCkuZXZlcnkoXG4gICAgICAoW2EsIG5dKSA9PiAoXG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5LCByZWFkIHRoZSBhdG9tIHN0YXRlIG9mIHRoZSBkZXBlbmRlbmN5LCBhbmRcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGF0b20gZXBvY2ggbnVtYmVyIGlzIHVuY2hhbmdlZFxuICAgICAgICByZWFkQXRvbVN0YXRlMihzdG9yZSwgYSkubiA9PT0gblxuICAgICAgKVxuICAgICkpIHtcbiAgICAgIHJldHVybiBhdG9tU3RhdGU7XG4gICAgfVxuICB9XG4gIGF0b21TdGF0ZS5kLmNsZWFyKCk7XG4gIGxldCBpc1N5bmMgPSB0cnVlO1xuICBmdW5jdGlvbiBtb3VudERlcGVuZGVuY2llc0lmQXN5bmMoKSB7XG4gICAgaWYgKG1vdW50ZWRNYXAuaGFzKGF0b20pKSB7XG4gICAgICBtb3VudERlcGVuZGVuY2llczIoc3RvcmUsIGF0b20pO1xuICAgICAgcmVjb21wdXRlSW52YWxpZGF0ZWRBdG9tczIoc3RvcmUpO1xuICAgICAgZmx1c2hDYWxsYmFja3MyKHN0b3JlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0dGVyKGEpIHtcbiAgICB2YXIgX2EyO1xuICAgIGlmIChhID09PSBhdG9tKSB7XG4gICAgICBjb25zdCBhU3RhdGUyID0gZW5zdXJlQXRvbVN0YXRlMihzdG9yZSwgYSk7XG4gICAgICBpZiAoIWlzQXRvbVN0YXRlSW5pdGlhbGl6ZWQoYVN0YXRlMikpIHtcbiAgICAgICAgaWYgKGhhc0luaXRpYWxWYWx1ZShhKSkge1xuICAgICAgICAgIHNldEF0b21TdGF0ZVZhbHVlT3JQcm9taXNlKHN0b3JlLCBhLCBhLmluaXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGF0b20gaW5pdFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldHVybkF0b21WYWx1ZShhU3RhdGUyKTtcbiAgICB9XG4gICAgY29uc3QgYVN0YXRlID0gcmVhZEF0b21TdGF0ZTIoc3RvcmUsIGEpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0dXJuQXRvbVZhbHVlKGFTdGF0ZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF0b21TdGF0ZS5kLnNldChhLCBhU3RhdGUubik7XG4gICAgICBpZiAoaXNQZW5kaW5nUHJvbWlzZShhdG9tU3RhdGUudikpIHtcbiAgICAgICAgYWRkUGVuZGluZ1Byb21pc2VUb0RlcGVuZGVuY3koYXRvbSwgYXRvbVN0YXRlLnYsIGFTdGF0ZSk7XG4gICAgICB9XG4gICAgICAoX2EyID0gbW91bnRlZE1hcC5nZXQoYSkpID09IG51bGwgPyB2b2lkIDAgOiBfYTIudC5hZGQoYXRvbSk7XG4gICAgICBpZiAoIWlzU3luYykge1xuICAgICAgICBtb3VudERlcGVuZGVuY2llc0lmQXN5bmMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbGV0IGNvbnRyb2xsZXI7XG4gIGxldCBzZXRTZWxmO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGdldCBzaWduYWwoKSB7XG4gICAgICBpZiAoIWNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgICB9LFxuICAgIGdldCBzZXRTZWxmKCkge1xuICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmICFpc0FjdHVhbGx5V3JpdGFibGVBdG9tKGF0b20pKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcInNldFNlbGYgZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQgd2l0aCByZWFkLW9ubHkgYXRvbVwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghc2V0U2VsZiAmJiBpc0FjdHVhbGx5V3JpdGFibGVBdG9tKGF0b20pKSB7XG4gICAgICAgIHNldFNlbGYgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiBpc1N5bmMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNldFNlbGYgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiBzeW5jXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzU3luYykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlQXRvbVN0YXRlMihzdG9yZSwgYXRvbSwgLi4uYXJncyk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICByZWNvbXB1dGVJbnZhbGlkYXRlZEF0b21zMihzdG9yZSk7XG4gICAgICAgICAgICAgIGZsdXNoQ2FsbGJhY2tzMihzdG9yZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFNlbGY7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcmV2RXBvY2hOdW1iZXIgPSBhdG9tU3RhdGUubjtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWx1ZU9yUHJvbWlzZSA9IGF0b21SZWFkMihzdG9yZSwgYXRvbSwgZ2V0dGVyLCBvcHRpb25zKTtcbiAgICBzZXRBdG9tU3RhdGVWYWx1ZU9yUHJvbWlzZShzdG9yZSwgYXRvbSwgdmFsdWVPclByb21pc2UpO1xuICAgIGlmIChpc1Byb21pc2VMaWtlKHZhbHVlT3JQcm9taXNlKSkge1xuICAgICAgcmVnaXN0ZXJBYm9ydEhhbmRsZXIodmFsdWVPclByb21pc2UsICgpID0+IGNvbnRyb2xsZXIgPT0gbnVsbCA/IHZvaWQgMCA6IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICB2YWx1ZU9yUHJvbWlzZS50aGVuKG1vdW50RGVwZW5kZW5jaWVzSWZBc3luYywgbW91bnREZXBlbmRlbmNpZXNJZkFzeW5jKTtcbiAgICB9XG4gICAgKF9hID0gc3RvcmVIb29rcy5yKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChzdG9yZUhvb2tzLCBhdG9tKTtcbiAgICByZXR1cm4gYXRvbVN0YXRlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGRlbGV0ZSBhdG9tU3RhdGUudjtcbiAgICBhdG9tU3RhdGUuZSA9IGVycm9yO1xuICAgICsrYXRvbVN0YXRlLm47XG4gICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc1N5bmMgPSBmYWxzZTtcbiAgICBpZiAocHJldkVwb2NoTnVtYmVyICE9PSBhdG9tU3RhdGUubiAmJiBpbnZhbGlkYXRlZEF0b21zLmdldChhdG9tKSA9PT0gcHJldkVwb2NoTnVtYmVyKSB7XG4gICAgICBpbnZhbGlkYXRlZEF0b21zLnNldChhdG9tLCBhdG9tU3RhdGUubik7XG4gICAgICBjaGFuZ2VkQXRvbXMuYWRkKGF0b20pO1xuICAgICAgKF9iID0gc3RvcmVIb29rcy5jKSA9PSBudWxsID8gdm9pZCAwIDogX2IuY2FsbChzdG9yZUhvb2tzLCBhdG9tKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBpbnZhbGlkYXRlRGVwZW5kZW50cyA9IChzdG9yZSwgYXRvbSkgPT4ge1xuICBjb25zdCBidWlsZGluZ0Jsb2NrcyA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpO1xuICBjb25zdCBtb3VudGVkTWFwID0gYnVpbGRpbmdCbG9ja3NbMV07XG4gIGNvbnN0IGludmFsaWRhdGVkQXRvbXMgPSBidWlsZGluZ0Jsb2Nrc1syXTtcbiAgY29uc3QgZW5zdXJlQXRvbVN0YXRlMiA9IGJ1aWxkaW5nQmxvY2tzWzExXTtcbiAgY29uc3Qgc3RhY2sgPSBbYXRvbV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICBjb25zdCBhID0gc3RhY2sucG9wKCk7XG4gICAgY29uc3QgYVN0YXRlID0gZW5zdXJlQXRvbVN0YXRlMihzdG9yZSwgYSk7XG4gICAgZm9yIChjb25zdCBkIG9mIGdldE1vdW50ZWRPclBlbmRpbmdEZXBlbmRlbnRzKGEsIGFTdGF0ZSwgbW91bnRlZE1hcCkpIHtcbiAgICAgIGNvbnN0IGRTdGF0ZSA9IGVuc3VyZUF0b21TdGF0ZTIoc3RvcmUsIGQpO1xuICAgICAgaW52YWxpZGF0ZWRBdG9tcy5zZXQoZCwgZFN0YXRlLm4pO1xuICAgICAgc3RhY2sucHVzaChkKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB3cml0ZUF0b21TdGF0ZSA9IChzdG9yZSwgYXRvbSwgLi4uYXJncykgPT4ge1xuICBjb25zdCBidWlsZGluZ0Jsb2NrcyA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpO1xuICBjb25zdCBjaGFuZ2VkQXRvbXMgPSBidWlsZGluZ0Jsb2Nrc1szXTtcbiAgY29uc3Qgc3RvcmVIb29rcyA9IGJ1aWxkaW5nQmxvY2tzWzZdO1xuICBjb25zdCBhdG9tV3JpdGUyID0gYnVpbGRpbmdCbG9ja3NbOF07XG4gIGNvbnN0IGVuc3VyZUF0b21TdGF0ZTIgPSBidWlsZGluZ0Jsb2Nrc1sxMV07XG4gIGNvbnN0IGZsdXNoQ2FsbGJhY2tzMiA9IGJ1aWxkaW5nQmxvY2tzWzEyXTtcbiAgY29uc3QgcmVjb21wdXRlSW52YWxpZGF0ZWRBdG9tczIgPSBidWlsZGluZ0Jsb2Nrc1sxM107XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUyID0gYnVpbGRpbmdCbG9ja3NbMTRdO1xuICBjb25zdCBpbnZhbGlkYXRlRGVwZW5kZW50czIgPSBidWlsZGluZ0Jsb2Nrc1sxNV07XG4gIGNvbnN0IG1vdW50RGVwZW5kZW5jaWVzMiA9IGJ1aWxkaW5nQmxvY2tzWzE3XTtcbiAgbGV0IGlzU3luYyA9IHRydWU7XG4gIGNvbnN0IGdldHRlciA9IChhKSA9PiByZXR1cm5BdG9tVmFsdWUocmVhZEF0b21TdGF0ZTIoc3RvcmUsIGEpKTtcbiAgY29uc3Qgc2V0dGVyID0gKGEsIC4uLmFyZ3MyKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGFTdGF0ZSA9IGVuc3VyZUF0b21TdGF0ZTIoc3RvcmUsIGEpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYSA9PT0gYXRvbSkge1xuICAgICAgICBpZiAoIWhhc0luaXRpYWxWYWx1ZShhKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0b20gbm90IHdyaXRhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZFcG9jaE51bWJlciA9IGFTdGF0ZS5uO1xuICAgICAgICBjb25zdCB2ID0gYXJnczJbMF07XG4gICAgICAgIHNldEF0b21TdGF0ZVZhbHVlT3JQcm9taXNlKHN0b3JlLCBhLCB2KTtcbiAgICAgICAgbW91bnREZXBlbmRlbmNpZXMyKHN0b3JlLCBhKTtcbiAgICAgICAgaWYgKHByZXZFcG9jaE51bWJlciAhPT0gYVN0YXRlLm4pIHtcbiAgICAgICAgICBjaGFuZ2VkQXRvbXMuYWRkKGEpO1xuICAgICAgICAgIChfYSA9IHN0b3JlSG9va3MuYykgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmNhbGwoc3RvcmVIb29rcywgYSk7XG4gICAgICAgICAgaW52YWxpZGF0ZURlcGVuZGVudHMyKHN0b3JlLCBhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHdyaXRlQXRvbVN0YXRlKHN0b3JlLCBhLCAuLi5hcmdzMik7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghaXNTeW5jKSB7XG4gICAgICAgIHJlY29tcHV0ZUludmFsaWRhdGVkQXRvbXMyKHN0b3JlKTtcbiAgICAgICAgZmx1c2hDYWxsYmFja3MyKHN0b3JlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF0b21Xcml0ZTIoc3RvcmUsIGF0b20sIGdldHRlciwgc2V0dGVyLCAuLi5hcmdzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc1N5bmMgPSBmYWxzZTtcbiAgfVxufTtcbmNvbnN0IG1vdW50RGVwZW5kZW5jaWVzID0gKHN0b3JlLCBhdG9tKSA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3QgYnVpbGRpbmdCbG9ja3MgPSBnZXRJbnRlcm5hbEJ1aWxkaW5nQmxvY2tzKHN0b3JlKTtcbiAgY29uc3QgbW91bnRlZE1hcCA9IGJ1aWxkaW5nQmxvY2tzWzFdO1xuICBjb25zdCBjaGFuZ2VkQXRvbXMgPSBidWlsZGluZ0Jsb2Nrc1szXTtcbiAgY29uc3Qgc3RvcmVIb29rcyA9IGJ1aWxkaW5nQmxvY2tzWzZdO1xuICBjb25zdCBlbnN1cmVBdG9tU3RhdGUyID0gYnVpbGRpbmdCbG9ja3NbMTFdO1xuICBjb25zdCBpbnZhbGlkYXRlRGVwZW5kZW50czIgPSBidWlsZGluZ0Jsb2Nrc1sxNV07XG4gIGNvbnN0IG1vdW50QXRvbTIgPSBidWlsZGluZ0Jsb2Nrc1sxOF07XG4gIGNvbnN0IHVubW91bnRBdG9tMiA9IGJ1aWxkaW5nQmxvY2tzWzE5XTtcbiAgY29uc3QgYXRvbVN0YXRlID0gZW5zdXJlQXRvbVN0YXRlMihzdG9yZSwgYXRvbSk7XG4gIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgaWYgKG1vdW50ZWQgJiYgIWlzUGVuZGluZ1Byb21pc2UoYXRvbVN0YXRlLnYpKSB7XG4gICAgZm9yIChjb25zdCBbYSwgbl0gb2YgYXRvbVN0YXRlLmQpIHtcbiAgICAgIGlmICghbW91bnRlZC5kLmhhcyhhKSkge1xuICAgICAgICBjb25zdCBhU3RhdGUgPSBlbnN1cmVBdG9tU3RhdGUyKHN0b3JlLCBhKTtcbiAgICAgICAgY29uc3QgYU1vdW50ZWQgPSBtb3VudEF0b20yKHN0b3JlLCBhKTtcbiAgICAgICAgYU1vdW50ZWQudC5hZGQoYXRvbSk7XG4gICAgICAgIG1vdW50ZWQuZC5hZGQoYSk7XG4gICAgICAgIGlmIChuICE9PSBhU3RhdGUubikge1xuICAgICAgICAgIGNoYW5nZWRBdG9tcy5hZGQoYSk7XG4gICAgICAgICAgKF9hID0gc3RvcmVIb29rcy5jKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChzdG9yZUhvb2tzLCBhKTtcbiAgICAgICAgICBpbnZhbGlkYXRlRGVwZW5kZW50czIoc3RvcmUsIGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgYSBvZiBtb3VudGVkLmQgfHwgW10pIHtcbiAgICAgIGlmICghYXRvbVN0YXRlLmQuaGFzKGEpKSB7XG4gICAgICAgIG1vdW50ZWQuZC5kZWxldGUoYSk7XG4gICAgICAgIGNvbnN0IGFNb3VudGVkID0gdW5tb3VudEF0b20yKHN0b3JlLCBhKTtcbiAgICAgICAgYU1vdW50ZWQgPT0gbnVsbCA/IHZvaWQgMCA6IGFNb3VudGVkLnQuZGVsZXRlKGF0b20pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbmNvbnN0IG1vdW50QXRvbSA9IChzdG9yZSwgYXRvbSkgPT4ge1xuICB2YXIgX2E7XG4gIGNvbnN0IGJ1aWxkaW5nQmxvY2tzID0gZ2V0SW50ZXJuYWxCdWlsZGluZ0Jsb2NrcyhzdG9yZSk7XG4gIGNvbnN0IG1vdW50ZWRNYXAgPSBidWlsZGluZ0Jsb2Nrc1sxXTtcbiAgY29uc3QgbW91bnRDYWxsYmFja3MgPSBidWlsZGluZ0Jsb2Nrc1s0XTtcbiAgY29uc3Qgc3RvcmVIb29rcyA9IGJ1aWxkaW5nQmxvY2tzWzZdO1xuICBjb25zdCBhdG9tT25Nb3VudDIgPSBidWlsZGluZ0Jsb2Nrc1sxMF07XG4gIGNvbnN0IGVuc3VyZUF0b21TdGF0ZTIgPSBidWlsZGluZ0Jsb2Nrc1sxMV07XG4gIGNvbnN0IGZsdXNoQ2FsbGJhY2tzMiA9IGJ1aWxkaW5nQmxvY2tzWzEyXTtcbiAgY29uc3QgcmVjb21wdXRlSW52YWxpZGF0ZWRBdG9tczIgPSBidWlsZGluZ0Jsb2Nrc1sxM107XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUyID0gYnVpbGRpbmdCbG9ja3NbMTRdO1xuICBjb25zdCB3cml0ZUF0b21TdGF0ZTIgPSBidWlsZGluZ0Jsb2Nrc1sxNl07XG4gIGNvbnN0IGF0b21TdGF0ZSA9IGVuc3VyZUF0b21TdGF0ZTIoc3RvcmUsIGF0b20pO1xuICBsZXQgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICBpZiAoIW1vdW50ZWQpIHtcbiAgICByZWFkQXRvbVN0YXRlMihzdG9yZSwgYXRvbSk7XG4gICAgZm9yIChjb25zdCBhIG9mIGF0b21TdGF0ZS5kLmtleXMoKSkge1xuICAgICAgY29uc3QgYU1vdW50ZWQgPSBtb3VudEF0b20oc3RvcmUsIGEpO1xuICAgICAgYU1vdW50ZWQudC5hZGQoYXRvbSk7XG4gICAgfVxuICAgIG1vdW50ZWQgPSB7XG4gICAgICBsOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICAgICAgZDogbmV3IFNldChhdG9tU3RhdGUuZC5rZXlzKCkpLFxuICAgICAgdDogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKVxuICAgIH07XG4gICAgbW91bnRlZE1hcC5zZXQoYXRvbSwgbW91bnRlZCk7XG4gICAgKF9hID0gc3RvcmVIb29rcy5tKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChzdG9yZUhvb2tzLCBhdG9tKTtcbiAgICBpZiAoaXNBY3R1YWxseVdyaXRhYmxlQXRvbShhdG9tKSkge1xuICAgICAgY29uc3QgcHJvY2Vzc09uTW91bnQgPSAoKSA9PiB7XG4gICAgICAgIGxldCBpc1N5bmMgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZXRBdG9tID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHdyaXRlQXRvbVN0YXRlMihzdG9yZSwgYXRvbSwgLi4uYXJncyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghaXNTeW5jKSB7XG4gICAgICAgICAgICAgIHJlY29tcHV0ZUludmFsaWRhdGVkQXRvbXMyKHN0b3JlKTtcbiAgICAgICAgICAgICAgZmx1c2hDYWxsYmFja3MyKHN0b3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb25Vbm1vdW50ID0gYXRvbU9uTW91bnQyKHN0b3JlLCBhdG9tLCBzZXRBdG9tKTtcbiAgICAgICAgICBpZiAob25Vbm1vdW50KSB7XG4gICAgICAgICAgICBtb3VudGVkLnUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlzU3luYyA9IHRydWU7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb25Vbm1vdW50KCk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaXNTeW5jID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlzU3luYyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbW91bnRDYWxsYmFja3MuYWRkKHByb2Nlc3NPbk1vdW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1vdW50ZWQ7XG59O1xuY29uc3QgdW5tb3VudEF0b20gPSAoc3RvcmUsIGF0b20pID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCBidWlsZGluZ0Jsb2NrcyA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpO1xuICBjb25zdCBtb3VudGVkTWFwID0gYnVpbGRpbmdCbG9ja3NbMV07XG4gIGNvbnN0IHVubW91bnRDYWxsYmFja3MgPSBidWlsZGluZ0Jsb2Nrc1s1XTtcbiAgY29uc3Qgc3RvcmVIb29rcyA9IGJ1aWxkaW5nQmxvY2tzWzZdO1xuICBjb25zdCBlbnN1cmVBdG9tU3RhdGUyID0gYnVpbGRpbmdCbG9ja3NbMTFdO1xuICBjb25zdCB1bm1vdW50QXRvbTIgPSBidWlsZGluZ0Jsb2Nrc1sxOV07XG4gIGNvbnN0IGF0b21TdGF0ZSA9IGVuc3VyZUF0b21TdGF0ZTIoc3RvcmUsIGF0b20pO1xuICBsZXQgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICBpZiAobW91bnRlZCAmJiAhbW91bnRlZC5sLnNpemUgJiYgIUFycmF5LmZyb20obW91bnRlZC50KS5zb21lKChhKSA9PiB7XG4gICAgdmFyIF9hMjtcbiAgICByZXR1cm4gKF9hMiA9IG1vdW50ZWRNYXAuZ2V0KGEpKSA9PSBudWxsID8gdm9pZCAwIDogX2EyLmQuaGFzKGF0b20pO1xuICB9KSkge1xuICAgIGlmIChtb3VudGVkLnUpIHtcbiAgICAgIHVubW91bnRDYWxsYmFja3MuYWRkKG1vdW50ZWQudSk7XG4gICAgfVxuICAgIG1vdW50ZWQgPSB2b2lkIDA7XG4gICAgbW91bnRlZE1hcC5kZWxldGUoYXRvbSk7XG4gICAgKF9hID0gc3RvcmVIb29rcy51KSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChzdG9yZUhvb2tzLCBhdG9tKTtcbiAgICBmb3IgKGNvbnN0IGEgb2YgYXRvbVN0YXRlLmQua2V5cygpKSB7XG4gICAgICBjb25zdCBhTW91bnRlZCA9IHVubW91bnRBdG9tMihzdG9yZSwgYSk7XG4gICAgICBhTW91bnRlZCA9PSBudWxsID8gdm9pZCAwIDogYU1vdW50ZWQudC5kZWxldGUoYXRvbSk7XG4gICAgfVxuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIG1vdW50ZWQ7XG59O1xuY29uc3Qgc2V0QXRvbVN0YXRlVmFsdWVPclByb21pc2UgPSAoc3RvcmUsIGF0b20sIHZhbHVlT3JQcm9taXNlKSA9PiB7XG4gIGNvbnN0IGVuc3VyZUF0b21TdGF0ZTIgPSBnZXRJbnRlcm5hbEJ1aWxkaW5nQmxvY2tzKHN0b3JlKVsxMV07XG4gIGNvbnN0IGF0b21TdGF0ZSA9IGVuc3VyZUF0b21TdGF0ZTIoc3RvcmUsIGF0b20pO1xuICBjb25zdCBoYXNQcmV2VmFsdWUgPSBcInZcIiBpbiBhdG9tU3RhdGU7XG4gIGNvbnN0IHByZXZWYWx1ZSA9IGF0b21TdGF0ZS52O1xuICBpZiAoaXNQcm9taXNlTGlrZSh2YWx1ZU9yUHJvbWlzZSkpIHtcbiAgICBmb3IgKGNvbnN0IGEgb2YgYXRvbVN0YXRlLmQua2V5cygpKSB7XG4gICAgICBhZGRQZW5kaW5nUHJvbWlzZVRvRGVwZW5kZW5jeShcbiAgICAgICAgYXRvbSxcbiAgICAgICAgdmFsdWVPclByb21pc2UsXG4gICAgICAgIGVuc3VyZUF0b21TdGF0ZTIoc3RvcmUsIGEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBhdG9tU3RhdGUudiA9IHZhbHVlT3JQcm9taXNlO1xuICBkZWxldGUgYXRvbVN0YXRlLmU7XG4gIGlmICghaGFzUHJldlZhbHVlIHx8ICFPYmplY3QuaXMocHJldlZhbHVlLCBhdG9tU3RhdGUudikpIHtcbiAgICArK2F0b21TdGF0ZS5uO1xuICAgIGlmIChpc1Byb21pc2VMaWtlKHByZXZWYWx1ZSkpIHtcbiAgICAgIGFib3J0UHJvbWlzZShwcmV2VmFsdWUpO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IHN0b3JlR2V0ID0gKHN0b3JlLCBhdG9tKSA9PiB7XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUyID0gZ2V0SW50ZXJuYWxCdWlsZGluZ0Jsb2NrcyhzdG9yZSlbMTRdO1xuICByZXR1cm4gcmV0dXJuQXRvbVZhbHVlKHJlYWRBdG9tU3RhdGUyKHN0b3JlLCBhdG9tKSk7XG59O1xuY29uc3Qgc3RvcmVTZXQgPSAoc3RvcmUsIGF0b20sIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYnVpbGRpbmdCbG9ja3MgPSBnZXRJbnRlcm5hbEJ1aWxkaW5nQmxvY2tzKHN0b3JlKTtcbiAgY29uc3QgZmx1c2hDYWxsYmFja3MyID0gYnVpbGRpbmdCbG9ja3NbMTJdO1xuICBjb25zdCByZWNvbXB1dGVJbnZhbGlkYXRlZEF0b21zMiA9IGJ1aWxkaW5nQmxvY2tzWzEzXTtcbiAgY29uc3Qgd3JpdGVBdG9tU3RhdGUyID0gYnVpbGRpbmdCbG9ja3NbMTZdO1xuICB0cnkge1xuICAgIHJldHVybiB3cml0ZUF0b21TdGF0ZTIoc3RvcmUsIGF0b20sIC4uLmFyZ3MpO1xuICB9IGZpbmFsbHkge1xuICAgIHJlY29tcHV0ZUludmFsaWRhdGVkQXRvbXMyKHN0b3JlKTtcbiAgICBmbHVzaENhbGxiYWNrczIoc3RvcmUpO1xuICB9XG59O1xuY29uc3Qgc3RvcmVTdWIgPSAoc3RvcmUsIGF0b20sIGxpc3RlbmVyKSA9PiB7XG4gIGNvbnN0IGJ1aWxkaW5nQmxvY2tzID0gZ2V0SW50ZXJuYWxCdWlsZGluZ0Jsb2NrcyhzdG9yZSk7XG4gIGNvbnN0IGZsdXNoQ2FsbGJhY2tzMiA9IGJ1aWxkaW5nQmxvY2tzWzEyXTtcbiAgY29uc3QgbW91bnRBdG9tMiA9IGJ1aWxkaW5nQmxvY2tzWzE4XTtcbiAgY29uc3QgdW5tb3VudEF0b20yID0gYnVpbGRpbmdCbG9ja3NbMTldO1xuICBjb25zdCBtb3VudGVkID0gbW91bnRBdG9tMihzdG9yZSwgYXRvbSk7XG4gIGNvbnN0IGxpc3RlbmVycyA9IG1vdW50ZWQubDtcbiAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gIGZsdXNoQ2FsbGJhY2tzMihzdG9yZSk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgdW5tb3VudEF0b20yKHN0b3JlLCBhdG9tKTtcbiAgICBmbHVzaENhbGxiYWNrczIoc3RvcmUpO1xuICB9O1xufTtcbmNvbnN0IGJ1aWxkaW5nQmxvY2tNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3MgPSAoc3RvcmUpID0+IHtcbiAgY29uc3QgYnVpbGRpbmdCbG9ja3MgPSBidWlsZGluZ0Jsb2NrTWFwLmdldChzdG9yZSk7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIiAmJiAhYnVpbGRpbmdCbG9ja3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlN0b3JlIG11c3QgYmUgY3JlYXRlZCBieSBidWlsZFN0b3JlIHRvIHJlYWQgaXRzIGJ1aWxkaW5nIGJsb2Nrc1wiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYnVpbGRpbmdCbG9ja3M7XG59O1xuZnVuY3Rpb24gZ2V0QnVpbGRpbmdCbG9ja3Moc3RvcmUpIHtcbiAgY29uc3QgYnVpbGRpbmdCbG9ja3MgPSBnZXRJbnRlcm5hbEJ1aWxkaW5nQmxvY2tzKHN0b3JlKTtcbiAgY29uc3QgZW5oYW5jZUJ1aWxkaW5nQmxvY2tzID0gYnVpbGRpbmdCbG9ja3NbMjRdO1xuICBpZiAoZW5oYW5jZUJ1aWxkaW5nQmxvY2tzKSB7XG4gICAgcmV0dXJuIGVuaGFuY2VCdWlsZGluZ0Jsb2NrcyhidWlsZGluZ0Jsb2Nrcyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkaW5nQmxvY2tzO1xufVxuZnVuY3Rpb24gYnVpbGRTdG9yZSguLi5idWlsZEFyZ3MpIHtcbiAgY29uc3Qgc3RvcmUgPSB7XG4gICAgZ2V0KGF0b20pIHtcbiAgICAgIGNvbnN0IHN0b3JlR2V0MiA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpWzIxXTtcbiAgICAgIHJldHVybiBzdG9yZUdldDIoc3RvcmUsIGF0b20pO1xuICAgIH0sXG4gICAgc2V0KGF0b20sIC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IHN0b3JlU2V0MiA9IGdldEludGVybmFsQnVpbGRpbmdCbG9ja3Moc3RvcmUpWzIyXTtcbiAgICAgIHJldHVybiBzdG9yZVNldDIoc3RvcmUsIGF0b20sIC4uLmFyZ3MpO1xuICAgIH0sXG4gICAgc3ViKGF0b20sIGxpc3RlbmVyKSB7XG4gICAgICBjb25zdCBzdG9yZVN1YjIgPSBnZXRJbnRlcm5hbEJ1aWxkaW5nQmxvY2tzKHN0b3JlKVsyM107XG4gICAgICByZXR1cm4gc3RvcmVTdWIyKHN0b3JlLCBhdG9tLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9O1xuICBjb25zdCBidWlsZGluZ0Jsb2NrcyA9IFtcbiAgICAvLyBzdG9yZSBzdGF0ZVxuICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIC8vIGF0b21TdGF0ZU1hcFxuICAgIC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIC8vIG1vdW50ZWRNYXBcbiAgICAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKSxcbiAgICAvLyBpbnZhbGlkYXRlZEF0b21zXG4gICAgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICAvLyBjaGFuZ2VkQXRvbXNcbiAgICAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLFxuICAgIC8vIG1vdW50Q2FsbGJhY2tzXG4gICAgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSxcbiAgICAvLyB1bm1vdW50Q2FsbGJhY2tzXG4gICAge30sXG4gICAgLy8gc3RvcmVIb29rc1xuICAgIC8vIGF0b20gaW50ZXJjZXB0b3JzXG4gICAgYXRvbVJlYWQsXG4gICAgYXRvbVdyaXRlLFxuICAgIGF0b21PbkluaXQsXG4gICAgYXRvbU9uTW91bnQsXG4gICAgLy8gYnVpbGRpbmctYmxvY2sgZnVuY3Rpb25zXG4gICAgZW5zdXJlQXRvbVN0YXRlLFxuICAgIGZsdXNoQ2FsbGJhY2tzLFxuICAgIHJlY29tcHV0ZUludmFsaWRhdGVkQXRvbXMsXG4gICAgcmVhZEF0b21TdGF0ZSxcbiAgICBpbnZhbGlkYXRlRGVwZW5kZW50cyxcbiAgICB3cml0ZUF0b21TdGF0ZSxcbiAgICBtb3VudERlcGVuZGVuY2llcyxcbiAgICBtb3VudEF0b20sXG4gICAgdW5tb3VudEF0b20sXG4gICAgc2V0QXRvbVN0YXRlVmFsdWVPclByb21pc2UsXG4gICAgc3RvcmVHZXQsXG4gICAgc3RvcmVTZXQsXG4gICAgc3RvcmVTdWIsXG4gICAgdm9pZCAwXG4gIF0ubWFwKChmbiwgaSkgPT4gYnVpbGRBcmdzW2ldIHx8IGZuKTtcbiAgYnVpbGRpbmdCbG9ja01hcC5zZXQoc3RvcmUsIE9iamVjdC5mcmVlemUoYnVpbGRpbmdCbG9ja3MpKTtcbiAgcmV0dXJuIHN0b3JlO1xufVxuXG5leHBvcnQgeyBhYm9ydFByb21pc2UgYXMgSU5URVJOQUxfYWJvcnRQcm9taXNlLCBhZGRQZW5kaW5nUHJvbWlzZVRvRGVwZW5kZW5jeSBhcyBJTlRFUk5BTF9hZGRQZW5kaW5nUHJvbWlzZVRvRGVwZW5kZW5jeSwgYnVpbGRTdG9yZSBhcyBJTlRFUk5BTF9idWlsZFN0b3JlUmV2MiwgZ2V0QnVpbGRpbmdCbG9ja3MgYXMgSU5URVJOQUxfZ2V0QnVpbGRpbmdCbG9ja3NSZXYyLCBnZXRNb3VudGVkT3JQZW5kaW5nRGVwZW5kZW50cyBhcyBJTlRFUk5BTF9nZXRNb3VudGVkT3JQZW5kaW5nRGVwZW5kZW50cywgaGFzSW5pdGlhbFZhbHVlIGFzIElOVEVSTkFMX2hhc0luaXRpYWxWYWx1ZSwgaW5pdGlhbGl6ZVN0b3JlSG9va3MgYXMgSU5URVJOQUxfaW5pdGlhbGl6ZVN0b3JlSG9va3NSZXYyLCBpc0FjdHVhbGx5V3JpdGFibGVBdG9tIGFzIElOVEVSTkFMX2lzQWN0dWFsbHlXcml0YWJsZUF0b20sIGlzQXRvbVN0YXRlSW5pdGlhbGl6ZWQgYXMgSU5URVJOQUxfaXNBdG9tU3RhdGVJbml0aWFsaXplZCwgaXNQZW5kaW5nUHJvbWlzZSBhcyBJTlRFUk5BTF9pc1BlbmRpbmdQcm9taXNlLCBpc1Byb21pc2VMaWtlIGFzIElOVEVSTkFMX2lzUHJvbWlzZUxpa2UsIHByb21pc2VTdGF0ZU1hcCBhcyBJTlRFUk5BTF9wcm9taXNlU3RhdGVNYXAsIHJlZ2lzdGVyQWJvcnRIYW5kbGVyIGFzIElOVEVSTkFMX3JlZ2lzdGVyQWJvcnRIYW5kbGVyLCByZXR1cm5BdG9tVmFsdWUgYXMgSU5URVJOQUxfcmV0dXJuQXRvbVZhbHVlIH07XG4iLCJpbXBvcnQgeyBJTlRFUk5BTF9idWlsZFN0b3JlUmV2MiB9IGZyb20gJ2pvdGFpL3ZhbmlsbGEvaW50ZXJuYWxzJztcblxubGV0IGtleUNvdW50ID0gMDtcbmZ1bmN0aW9uIGF0b20ocmVhZCwgd3JpdGUpIHtcbiAgY29uc3Qga2V5ID0gYGF0b20keysra2V5Q291bnR9YDtcbiAgY29uc3QgY29uZmlnID0ge1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmIHRoaXMuZGVidWdMYWJlbCA/IGtleSArIFwiOlwiICsgdGhpcy5kZWJ1Z0xhYmVsIDoga2V5O1xuICAgIH1cbiAgfTtcbiAgaWYgKHR5cGVvZiByZWFkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25maWcucmVhZCA9IHJlYWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnLmluaXQgPSByZWFkO1xuICAgIGNvbmZpZy5yZWFkID0gZGVmYXVsdFJlYWQ7XG4gICAgY29uZmlnLndyaXRlID0gZGVmYXVsdFdyaXRlO1xuICB9XG4gIGlmICh3cml0ZSkge1xuICAgIGNvbmZpZy53cml0ZSA9IHdyaXRlO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5mdW5jdGlvbiBkZWZhdWx0UmVhZChnZXQpIHtcbiAgcmV0dXJuIGdldCh0aGlzKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRXcml0ZShnZXQsIHNldCwgYXJnKSB7XG4gIHJldHVybiBzZXQoXG4gICAgdGhpcyxcbiAgICB0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIgPyBhcmcoZ2V0KHRoaXMpKSA6IGFyZ1xuICApO1xufVxuXG5sZXQgb3ZlcmlkZGVuQ3JlYXRlU3RvcmU7XG5mdW5jdGlvbiBJTlRFUk5BTF9vdmVycmlkZUNyZWF0ZVN0b3JlKGZuKSB7XG4gIG92ZXJpZGRlbkNyZWF0ZVN0b3JlID0gZm4ob3ZlcmlkZGVuQ3JlYXRlU3RvcmUpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3RvcmUoKSB7XG4gIGlmIChvdmVyaWRkZW5DcmVhdGVTdG9yZSkge1xuICAgIHJldHVybiBvdmVyaWRkZW5DcmVhdGVTdG9yZSgpO1xuICB9XG4gIHJldHVybiBJTlRFUk5BTF9idWlsZFN0b3JlUmV2MigpO1xufVxubGV0IGRlZmF1bHRTdG9yZTtcbmZ1bmN0aW9uIGdldERlZmF1bHRTdG9yZSgpIHtcbiAgaWYgKCFkZWZhdWx0U3RvcmUpIHtcbiAgICBkZWZhdWx0U3RvcmUgPSBjcmVhdGVTdG9yZSgpO1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgZ2xvYmFsVGhpcy5fX0pPVEFJX0RFRkFVTFRfU1RPUkVfXyB8fCAoZ2xvYmFsVGhpcy5fX0pPVEFJX0RFRkFVTFRfU1RPUkVfXyA9IGRlZmF1bHRTdG9yZSk7XG4gICAgICBpZiAoZ2xvYmFsVGhpcy5fX0pPVEFJX0RFRkFVTFRfU1RPUkVfXyAhPT0gZGVmYXVsdFN0b3JlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIkRldGVjdGVkIG11bHRpcGxlIEpvdGFpIGluc3RhbmNlcy4gSXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3Igd2l0aCB0aGUgZGVmYXVsdCBzdG9yZS4gaHR0cHM6Ly9naXRodWIuY29tL3BtbmRycy9qb3RhaS9kaXNjdXNzaW9ucy8yMDQ0XCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRTdG9yZTtcbn1cblxuZXhwb3J0IHsgSU5URVJOQUxfb3ZlcnJpZGVDcmVhdGVTdG9yZSwgYXRvbSwgY3JlYXRlU3RvcmUsIGdldERlZmF1bHRTdG9yZSB9O1xuIiwiaW1wb3J0IHsgYXRvbSB9IGZyb20gJ2pvdGFpL3ZhbmlsbGEnO1xuXG5jb25zdCBSRVNFVCA9IFN5bWJvbChcbiAgKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIgPyBcIlJFU0VUXCIgOiBcIlwiXG4pO1xuXG5mdW5jdGlvbiBhdG9tV2l0aFJlc2V0KGluaXRpYWxWYWx1ZSkge1xuICBjb25zdCBhbkF0b20gPSBhdG9tKFxuICAgIGluaXRpYWxWYWx1ZSxcbiAgICAoZ2V0LCBzZXQsIHVwZGF0ZSkgPT4ge1xuICAgICAgY29uc3QgbmV4dFZhbHVlID0gdHlwZW9mIHVwZGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gdXBkYXRlKGdldChhbkF0b20pKSA6IHVwZGF0ZTtcbiAgICAgIHNldChhbkF0b20sIG5leHRWYWx1ZSA9PT0gUkVTRVQgPyBpbml0aWFsVmFsdWUgOiBuZXh0VmFsdWUpO1xuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGFuQXRvbTtcbn1cblxuZnVuY3Rpb24gYXRvbVdpdGhSZWR1Y2VyKGluaXRpYWxWYWx1ZSwgcmVkdWNlcikge1xuICByZXR1cm4gYXRvbShpbml0aWFsVmFsdWUsIGZ1bmN0aW9uKGdldCwgc2V0LCBhY3Rpb24pIHtcbiAgICBzZXQodGhpcywgcmVkdWNlcihnZXQodGhpcyksIGFjdGlvbikpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXRvbUZhbWlseShpbml0aWFsaXplQXRvbSwgYXJlRXF1YWwpIHtcbiAgbGV0IHNob3VsZFJlbW92ZSA9IG51bGw7XG4gIGNvbnN0IGF0b21zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3QgY3JlYXRlQXRvbSA9IChwYXJhbSkgPT4ge1xuICAgIGxldCBpdGVtO1xuICAgIGlmIChhcmVFcXVhbCA9PT0gdm9pZCAwKSB7XG4gICAgICBpdGVtID0gYXRvbXMuZ2V0KHBhcmFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgYXRvbXMpIHtcbiAgICAgICAgaWYgKGFyZUVxdWFsKGtleSwgcGFyYW0pKSB7XG4gICAgICAgICAgaXRlbSA9IHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtICE9PSB2b2lkIDApIHtcbiAgICAgIGlmIChzaG91bGRSZW1vdmUgPT0gbnVsbCA/IHZvaWQgMCA6IHNob3VsZFJlbW92ZShpdGVtWzFdLCBwYXJhbSkpIHtcbiAgICAgICAgY3JlYXRlQXRvbS5yZW1vdmUocGFyYW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1bMF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0F0b20gPSBpbml0aWFsaXplQXRvbShwYXJhbSk7XG4gICAgYXRvbXMuc2V0KHBhcmFtLCBbbmV3QXRvbSwgRGF0ZS5ub3coKV0pO1xuICAgIG5vdGlmeUxpc3RlbmVycyhcIkNSRUFURVwiLCBwYXJhbSwgbmV3QXRvbSk7XG4gICAgcmV0dXJuIG5ld0F0b207XG4gIH07XG4gIGNvbnN0IG5vdGlmeUxpc3RlbmVycyA9ICh0eXBlLCBwYXJhbSwgYXRvbSkgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcih7IHR5cGUsIHBhcmFtLCBhdG9tIH0pO1xuICAgIH1cbiAgfTtcbiAgY3JlYXRlQXRvbS51bnN0YWJsZV9saXN0ZW4gPSAoY2FsbGJhY2spID0+IHtcbiAgICBsaXN0ZW5lcnMuYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfTtcbiAgY3JlYXRlQXRvbS5nZXRQYXJhbXMgPSAoKSA9PiBhdG9tcy5rZXlzKCk7XG4gIGNyZWF0ZUF0b20ucmVtb3ZlID0gKHBhcmFtKSA9PiB7XG4gICAgaWYgKGFyZUVxdWFsID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghYXRvbXMuaGFzKHBhcmFtKSkgcmV0dXJuO1xuICAgICAgY29uc3QgW2F0b21dID0gYXRvbXMuZ2V0KHBhcmFtKTtcbiAgICAgIGF0b21zLmRlbGV0ZShwYXJhbSk7XG4gICAgICBub3RpZnlMaXN0ZW5lcnMoXCJSRU1PVkVcIiwgcGFyYW0sIGF0b20pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIFthdG9tXV0gb2YgYXRvbXMpIHtcbiAgICAgICAgaWYgKGFyZUVxdWFsKGtleSwgcGFyYW0pKSB7XG4gICAgICAgICAgYXRvbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFwiUkVNT1ZFXCIsIGtleSwgYXRvbSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNyZWF0ZUF0b20uc2V0U2hvdWxkUmVtb3ZlID0gKGZuKSA9PiB7XG4gICAgc2hvdWxkUmVtb3ZlID0gZm47XG4gICAgaWYgKCFzaG91bGRSZW1vdmUpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIFthdG9tLCBjcmVhdGVkQXRdXSBvZiBhdG9tcykge1xuICAgICAgaWYgKHNob3VsZFJlbW92ZShjcmVhdGVkQXQsIGtleSkpIHtcbiAgICAgICAgYXRvbXMuZGVsZXRlKGtleSk7XG4gICAgICAgIG5vdGlmeUxpc3RlbmVycyhcIlJFTU9WRVwiLCBrZXksIGF0b20pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGNyZWF0ZUF0b207XG59XG5cbmNvbnN0IGdldENhY2hlZCQyID0gKGMsIG0sIGspID0+IChtLmhhcyhrKSA/IG0gOiBtLnNldChrLCBjKCkpKS5nZXQoayk7XG5jb25zdCBjYWNoZTEkMyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbWVtbzMgPSAoY3JlYXRlLCBkZXAxLCBkZXAyLCBkZXAzKSA9PiB7XG4gIGNvbnN0IGNhY2hlMiA9IGdldENhY2hlZCQyKCgpID0+IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBjYWNoZTEkMywgZGVwMSk7XG4gIGNvbnN0IGNhY2hlMyA9IGdldENhY2hlZCQyKCgpID0+IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBjYWNoZTIsIGRlcDIpO1xuICByZXR1cm4gZ2V0Q2FjaGVkJDIoY3JlYXRlLCBjYWNoZTMsIGRlcDMpO1xufTtcbmZ1bmN0aW9uIHNlbGVjdEF0b20oYW5BdG9tLCBzZWxlY3RvciwgZXF1YWxpdHlGbiA9IE9iamVjdC5pcykge1xuICByZXR1cm4gbWVtbzMoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgRU1QVFkgPSBTeW1ib2woKTtcbiAgICAgIGNvbnN0IHNlbGVjdFZhbHVlID0gKFt2YWx1ZSwgcHJldlNsaWNlXSkgPT4ge1xuICAgICAgICBpZiAocHJldlNsaWNlID09PSBFTVBUWSkge1xuICAgICAgICAgIHJldHVybiBzZWxlY3Rvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2xpY2UgPSBzZWxlY3Rvcih2YWx1ZSwgcHJldlNsaWNlKTtcbiAgICAgICAgcmV0dXJuIGVxdWFsaXR5Rm4ocHJldlNsaWNlLCBzbGljZSkgPyBwcmV2U2xpY2UgOiBzbGljZTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZXJpdmVkQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2ID0gZ2V0KGRlcml2ZWRBdG9tKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXQoYW5BdG9tKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdFZhbHVlKFt2YWx1ZSwgcHJldl0pO1xuICAgICAgfSk7XG4gICAgICBkZXJpdmVkQXRvbS5pbml0ID0gRU1QVFk7XG4gICAgICByZXR1cm4gZGVyaXZlZEF0b207XG4gICAgfSxcbiAgICBhbkF0b20sXG4gICAgc2VsZWN0b3IsXG4gICAgZXF1YWxpdHlGblxuICApO1xufVxuXG5jb25zdCBmcm96ZW5BdG9tcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuY29uc3QgZGVlcEZyZWV6ZSA9ICh2YWx1ZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIE9iamVjdC5mcmVlemUodmFsdWUpO1xuICBjb25zdCBwcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBwcm9wTmFtZXMpIHtcbiAgICBkZWVwRnJlZXplKHZhbHVlW25hbWVdKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuZnVuY3Rpb24gZnJlZXplQXRvbShhbkF0b20pIHtcbiAgaWYgKGZyb3plbkF0b21zLmhhcyhhbkF0b20pKSB7XG4gICAgcmV0dXJuIGFuQXRvbTtcbiAgfVxuICBmcm96ZW5BdG9tcy5hZGQoYW5BdG9tKTtcbiAgY29uc3Qgb3JpZ1JlYWQgPSBhbkF0b20ucmVhZDtcbiAgYW5BdG9tLnJlYWQgPSBmdW5jdGlvbihnZXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZGVlcEZyZWV6ZShvcmlnUmVhZC5jYWxsKHRoaXMsIGdldCwgb3B0aW9ucykpO1xuICB9O1xuICBpZiAoXCJ3cml0ZVwiIGluIGFuQXRvbSkge1xuICAgIGNvbnN0IG9yaWdXcml0ZSA9IGFuQXRvbS53cml0ZTtcbiAgICBhbkF0b20ud3JpdGUgPSBmdW5jdGlvbihnZXQsIHNldCwgLi4uYXJncykge1xuICAgICAgcmV0dXJuIG9yaWdXcml0ZS5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBnZXQsXG4gICAgICAgICguLi5zZXRBcmdzKSA9PiB7XG4gICAgICAgICAgaWYgKHNldEFyZ3NbMF0gPT09IGFuQXRvbSkge1xuICAgICAgICAgICAgc2V0QXJnc1sxXSA9IGRlZXBGcmVlemUoc2V0QXJnc1sxXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzZXQoLi4uc2V0QXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gYW5BdG9tO1xufVxuZnVuY3Rpb24gZnJlZXplQXRvbUNyZWF0b3IoY3JlYXRlQXRvbSkge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIltERVBSRUNBVEVEXSBmcmVlemVBdG9tQ3JlYXRvciBpcyBkZXByZWNhdGVkLCBkZWZpbmUgaXQgb24gdXNlcnMgZW5kXCJcbiAgICApO1xuICB9XG4gIHJldHVybiAoKC4uLmFyZ3MpID0+IGZyZWV6ZUF0b20oY3JlYXRlQXRvbSguLi5hcmdzKSkpO1xufVxuXG5jb25zdCBnZXRDYWNoZWQkMSA9IChjLCBtLCBrKSA9PiAobS5oYXMoaykgPyBtIDogbS5zZXQoaywgYygpKSkuZ2V0KGspO1xuY29uc3QgY2FjaGUxJDIgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1lbW8yJDEgPSAoY3JlYXRlLCBkZXAxLCBkZXAyKSA9PiB7XG4gIGNvbnN0IGNhY2hlMiA9IGdldENhY2hlZCQxKCgpID0+IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBjYWNoZTEkMiwgZGVwMSk7XG4gIHJldHVybiBnZXRDYWNoZWQkMShjcmVhdGUsIGNhY2hlMiwgZGVwMik7XG59O1xuY29uc3QgY2FjaGVLZXlGb3JFbXB0eUtleUV4dHJhY3RvciA9IHt9O1xuY29uc3QgaXNXcml0YWJsZSA9IChhdG9tMikgPT4gISFhdG9tMi53cml0ZTtcbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbmZ1bmN0aW9uIHNwbGl0QXRvbShhcnJBdG9tLCBrZXlFeHRyYWN0b3IpIHtcbiAgcmV0dXJuIG1lbW8yJDEoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgbWFwcGluZ0NhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgICBjb25zdCBnZXRNYXBwaW5nID0gKGFyciwgcHJldikgPT4ge1xuICAgICAgICBsZXQgbWFwcGluZyA9IG1hcHBpbmdDYWNoZS5nZXQoYXJyKTtcbiAgICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwcGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2TWFwcGluZyA9IHByZXYgJiYgbWFwcGluZ0NhY2hlLmdldChwcmV2KTtcbiAgICAgICAgY29uc3QgYXRvbUxpc3QgPSBbXTtcbiAgICAgICAgY29uc3Qga2V5TGlzdCA9IFtdO1xuICAgICAgICBhcnIuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBrZXlFeHRyYWN0b3IgPyBrZXlFeHRyYWN0b3IoaXRlbSkgOiBpbmRleDtcbiAgICAgICAgICBrZXlMaXN0W2luZGV4XSA9IGtleTtcbiAgICAgICAgICBjb25zdCBjYWNoZWRBdG9tID0gcHJldk1hcHBpbmcgJiYgcHJldk1hcHBpbmcuYXRvbUxpc3RbcHJldk1hcHBpbmcua2V5TGlzdC5pbmRleE9mKGtleSldO1xuICAgICAgICAgIGlmIChjYWNoZWRBdG9tKSB7XG4gICAgICAgICAgICBhdG9tTGlzdFtpbmRleF0gPSBjYWNoZWRBdG9tO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZWFkID0gKGdldCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJldjIgPSBnZXQobWFwcGluZ0F0b20pO1xuICAgICAgICAgICAgY29uc3QgY3VyckFyciA9IGdldChhcnJBdG9tKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBpbmcyID0gZ2V0TWFwcGluZyhjdXJyQXJyLCBwcmV2MiA9PSBudWxsID8gdm9pZCAwIDogcHJldjIuYXJyKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IG1hcHBpbmcyLmtleUxpc3QuaW5kZXhPZihrZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4MiA8IDAgfHwgaW5kZXgyID49IGN1cnJBcnIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHByZXZJdGVtID0gYXJyW2dldE1hcHBpbmcoYXJyKS5rZXlMaXN0LmluZGV4T2Yoa2V5KV07XG4gICAgICAgICAgICAgIGlmIChwcmV2SXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SXRlbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzcGxpdEF0b206IGluZGV4IG91dCBvZiBib3VuZHMgZm9yIHJlYWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3VyckFycltpbmRleDJdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgd3JpdGUgPSAoZ2V0LCBzZXQsIHVwZGF0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJldjIgPSBnZXQobWFwcGluZ0F0b20pO1xuICAgICAgICAgICAgY29uc3QgYXJyMiA9IGdldChhcnJBdG9tKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcHBpbmcyID0gZ2V0TWFwcGluZyhhcnIyLCBwcmV2MiA9PSBudWxsID8gdm9pZCAwIDogcHJldjIuYXJyKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IG1hcHBpbmcyLmtleUxpc3QuaW5kZXhPZihrZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4MiA8IDAgfHwgaW5kZXgyID49IGFycjIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNwbGl0QXRvbTogaW5kZXggb3V0IG9mIGJvdW5kcyBmb3Igd3JpdGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0SXRlbSA9IGlzRnVuY3Rpb24odXBkYXRlKSA/IHVwZGF0ZShhcnIyW2luZGV4Ml0pIDogdXBkYXRlO1xuICAgICAgICAgICAgaWYgKCFPYmplY3QuaXMoYXJyMltpbmRleDJdLCBuZXh0SXRlbSkpIHtcbiAgICAgICAgICAgICAgc2V0KGFyckF0b20sIFtcbiAgICAgICAgICAgICAgICAuLi5hcnIyLnNsaWNlKDAsIGluZGV4MiksXG4gICAgICAgICAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgICAgICAgICAgLi4uYXJyMi5zbGljZShpbmRleDIgKyAxKVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGF0b21MaXN0W2luZGV4XSA9IGlzV3JpdGFibGUoYXJyQXRvbSkgPyBhdG9tKHJlYWQsIHdyaXRlKSA6IGF0b20ocmVhZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJldk1hcHBpbmcgJiYgcHJldk1hcHBpbmcua2V5TGlzdC5sZW5ndGggPT09IGtleUxpc3QubGVuZ3RoICYmIHByZXZNYXBwaW5nLmtleUxpc3QuZXZlcnkoKHgsIGkpID0+IHggPT09IGtleUxpc3RbaV0pKSB7XG4gICAgICAgICAgbWFwcGluZyA9IHByZXZNYXBwaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcHBpbmcgPSB7IGFyciwgYXRvbUxpc3QsIGtleUxpc3QgfTtcbiAgICAgICAgfVxuICAgICAgICBtYXBwaW5nQ2FjaGUuc2V0KGFyciwgbWFwcGluZyk7XG4gICAgICAgIHJldHVybiBtYXBwaW5nO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IG1hcHBpbmdBdG9tID0gYXRvbSgoZ2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBnZXQobWFwcGluZ0F0b20pO1xuICAgICAgICBjb25zdCBhcnIgPSBnZXQoYXJyQXRvbSk7XG4gICAgICAgIGNvbnN0IG1hcHBpbmcgPSBnZXRNYXBwaW5nKGFyciwgcHJldiA9PSBudWxsID8gdm9pZCAwIDogcHJldi5hcnIpO1xuICAgICAgICByZXR1cm4gbWFwcGluZztcbiAgICAgIH0pO1xuICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIG1hcHBpbmdBdG9tLmRlYnVnUHJpdmF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBtYXBwaW5nQXRvbS5pbml0ID0gdm9pZCAwO1xuICAgICAgY29uc3Qgc3BsaXR0ZWRBdG9tID0gaXNXcml0YWJsZShhcnJBdG9tKSA/IGF0b20oXG4gICAgICAgIChnZXQpID0+IGdldChtYXBwaW5nQXRvbSkuYXRvbUxpc3QsXG4gICAgICAgIChnZXQsIHNldCwgYWN0aW9uKSA9PiB7XG4gICAgICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZ2V0KHNwbGl0dGVkQXRvbSkuaW5kZXhPZihhY3Rpb24uYXRvbSk7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gZ2V0KGFyckF0b20pO1xuICAgICAgICAgICAgICAgIHNldChhcnJBdG9tLCBbXG4gICAgICAgICAgICAgICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgLi4uYXJyLnNsaWNlKGluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJpbnNlcnRcIjoge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGFjdGlvbi5iZWZvcmUgPyBnZXQoc3BsaXR0ZWRBdG9tKS5pbmRleE9mKGFjdGlvbi5iZWZvcmUpIDogZ2V0KHNwbGl0dGVkQXRvbSkubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IGdldChhcnJBdG9tKTtcbiAgICAgICAgICAgICAgICBzZXQoYXJyQXRvbSwgW1xuICAgICAgICAgICAgICAgICAgLi4uYXJyLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIC4uLmFyci5zbGljZShpbmRleClcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJtb3ZlXCI6IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXgxID0gZ2V0KHNwbGl0dGVkQXRvbSkuaW5kZXhPZihhY3Rpb24uYXRvbSk7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4MiA9IGFjdGlvbi5iZWZvcmUgPyBnZXQoc3BsaXR0ZWRBdG9tKS5pbmRleE9mKGFjdGlvbi5iZWZvcmUpIDogZ2V0KHNwbGl0dGVkQXRvbSkubGVuZ3RoO1xuICAgICAgICAgICAgICBpZiAoaW5kZXgxID49IDAgJiYgaW5kZXgyID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSBnZXQoYXJyQXRvbSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4MSA8IGluZGV4Mikge1xuICAgICAgICAgICAgICAgICAgc2V0KGFyckF0b20sIFtcbiAgICAgICAgICAgICAgICAgICAgLi4uYXJyLnNsaWNlKDAsIGluZGV4MSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmFyci5zbGljZShpbmRleDEgKyAxLCBpbmRleDIpLFxuICAgICAgICAgICAgICAgICAgICBhcnJbaW5kZXgxXSxcbiAgICAgICAgICAgICAgICAgICAgLi4uYXJyLnNsaWNlKGluZGV4MilcbiAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzZXQoYXJyQXRvbSwgW1xuICAgICAgICAgICAgICAgICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgyKSxcbiAgICAgICAgICAgICAgICAgICAgYXJyW2luZGV4MV0sXG4gICAgICAgICAgICAgICAgICAgIC4uLmFyci5zbGljZShpbmRleDIsIGluZGV4MSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmFyci5zbGljZShpbmRleDEgKyAxKVxuICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSA6IGF0b20oKGdldCkgPT4gZ2V0KG1hcHBpbmdBdG9tKS5hdG9tTGlzdCk7XG4gICAgICByZXR1cm4gc3BsaXR0ZWRBdG9tO1xuICAgIH0sXG4gICAgYXJyQXRvbSxcbiAgICBrZXlFeHRyYWN0b3IgfHwgY2FjaGVLZXlGb3JFbXB0eUtleUV4dHJhY3RvclxuICApO1xufVxuXG5mdW5jdGlvbiBhdG9tV2l0aERlZmF1bHQoZ2V0RGVmYXVsdCkge1xuICBjb25zdCBFTVBUWSA9IFN5bWJvbCgpO1xuICBjb25zdCBvdmVyd3JpdHRlbkF0b20gPSBhdG9tKEVNUFRZKTtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgb3ZlcndyaXR0ZW5BdG9tLmRlYnVnUHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgY29uc3QgYW5BdG9tID0gYXRvbShcbiAgICAoZ2V0LCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBvdmVyd3JpdHRlbiA9IGdldChvdmVyd3JpdHRlbkF0b20pO1xuICAgICAgaWYgKG92ZXJ3cml0dGVuICE9PSBFTVBUWSkge1xuICAgICAgICByZXR1cm4gb3ZlcndyaXR0ZW47XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0RGVmYXVsdChnZXQsIG9wdGlvbnMpO1xuICAgIH0sXG4gICAgKGdldCwgc2V0LCB1cGRhdGUpID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdHlwZW9mIHVwZGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gdXBkYXRlKGdldChhbkF0b20pKSA6IHVwZGF0ZTtcbiAgICAgIHNldChvdmVyd3JpdHRlbkF0b20sIG5ld1ZhbHVlID09PSBSRVNFVCA/IEVNUFRZIDogbmV3VmFsdWUpO1xuICAgIH1cbiAgKTtcbiAgcmV0dXJuIGFuQXRvbTtcbn1cblxuY29uc3QgaXNQcm9taXNlTGlrZSQzID0gKHgpID0+IHR5cGVvZiAoeCA9PSBudWxsID8gdm9pZCAwIDogeC50aGVuKSA9PT0gXCJmdW5jdGlvblwiO1xuZnVuY3Rpb24gd2l0aFN0b3JhZ2VWYWxpZGF0b3IodmFsaWRhdG9yKSB7XG4gIHJldHVybiAodW5rbm93blN0b3JhZ2UpID0+IHtcbiAgICBjb25zdCBzdG9yYWdlID0ge1xuICAgICAgLi4udW5rbm93blN0b3JhZ2UsXG4gICAgICBnZXRJdGVtOiAoa2V5LCBpbml0aWFsVmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSAodmFsdWUyKSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0b3IodmFsdWUyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlMjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB1bmtub3duU3RvcmFnZS5nZXRJdGVtKGtleSwgaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UkMyh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudGhlbih2YWxpZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBzdG9yYWdlO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlSlNPTlN0b3JhZ2UoZ2V0U3RyaW5nU3RvcmFnZSA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG59LCBvcHRpb25zKSB7XG4gIHZhciBfYTtcbiAgbGV0IGxhc3RTdHI7XG4gIGxldCBsYXN0VmFsdWU7XG4gIGNvbnN0IHN0b3JhZ2UgPSB7XG4gICAgZ2V0SXRlbTogKGtleSwgaW5pdGlhbFZhbHVlKSA9PiB7XG4gICAgICB2YXIgX2EyLCBfYjtcbiAgICAgIGNvbnN0IHBhcnNlID0gKHN0cjIpID0+IHtcbiAgICAgICAgc3RyMiA9IHN0cjIgfHwgXCJcIjtcbiAgICAgICAgaWYgKGxhc3RTdHIgIT09IHN0cjIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGFzdFZhbHVlID0gSlNPTi5wYXJzZShzdHIyLCBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLnJldml2ZXIpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbml0aWFsVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxhc3RTdHIgPSBzdHIyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0VmFsdWU7XG4gICAgICB9O1xuICAgICAgY29uc3Qgc3RyID0gKF9iID0gKF9hMiA9IGdldFN0cmluZ1N0b3JhZ2UoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5nZXRJdGVtKGtleSkpICE9IG51bGwgPyBfYiA6IG51bGw7XG4gICAgICBpZiAoaXNQcm9taXNlTGlrZSQzKHN0cikpIHtcbiAgICAgICAgcmV0dXJuIHN0ci50aGVuKHBhcnNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZShzdHIpO1xuICAgIH0sXG4gICAgc2V0SXRlbTogKGtleSwgbmV3VmFsdWUpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICByZXR1cm4gKF9hMiA9IGdldFN0cmluZ1N0b3JhZ2UoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5zZXRJdGVtKFxuICAgICAgICBrZXksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KG5ld1ZhbHVlLCBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLnJlcGxhY2VyKVxuICAgICAgKTtcbiAgICB9LFxuICAgIHJlbW92ZUl0ZW06IChrZXkpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICByZXR1cm4gKF9hMiA9IGdldFN0cmluZ1N0b3JhZ2UoKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hMi5yZW1vdmVJdGVtKGtleSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVIYW5kbGVTdWJzY3JpYmUgPSAoc3Vic2NyaWJlcjIpID0+IChrZXksIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpID0+IHN1YnNjcmliZXIyKGtleSwgKHYpID0+IHtcbiAgICBsZXQgbmV3VmFsdWU7XG4gICAgdHJ5IHtcbiAgICAgIG5ld1ZhbHVlID0gSlNPTi5wYXJzZSh2IHx8IFwiXCIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG5ld1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgICBjYWxsYmFjayhuZXdWYWx1ZSk7XG4gIH0pO1xuICBsZXQgc3Vic2NyaWJlcjtcbiAgdHJ5IHtcbiAgICBzdWJzY3JpYmVyID0gKF9hID0gZ2V0U3RyaW5nU3RvcmFnZSgpKSA9PSBudWxsID8gdm9pZCAwIDogX2Euc3Vic2NyaWJlO1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbiAgaWYgKCFzdWJzY3JpYmVyICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIgJiYgd2luZG93LlN0b3JhZ2UpIHtcbiAgICBzdWJzY3JpYmVyID0gKGtleSwgY2FsbGJhY2spID0+IHtcbiAgICAgIGlmICghKGdldFN0cmluZ1N0b3JhZ2UoKSBpbnN0YW5jZW9mIHdpbmRvdy5TdG9yYWdlKSkge1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmFnZUV2ZW50Q2FsbGJhY2sgPSAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5zdG9yYWdlQXJlYSA9PT0gZ2V0U3RyaW5nU3RvcmFnZSgpICYmIGUua2V5ID09PSBrZXkpIHtcbiAgICAgICAgICBjYWxsYmFjayhlLm5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic3RvcmFnZVwiLCBzdG9yYWdlRXZlbnRDYWxsYmFjayk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInN0b3JhZ2VcIiwgc3RvcmFnZUV2ZW50Q2FsbGJhY2spO1xuICAgICAgfTtcbiAgICB9O1xuICB9XG4gIGlmIChzdWJzY3JpYmVyKSB7XG4gICAgc3RvcmFnZS5zdWJzY3JpYmUgPSBjcmVhdGVIYW5kbGVTdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gIH1cbiAgcmV0dXJuIHN0b3JhZ2U7XG59XG5jb25zdCBkZWZhdWx0U3RvcmFnZSA9IGNyZWF0ZUpTT05TdG9yYWdlKCk7XG5mdW5jdGlvbiBhdG9tV2l0aFN0b3JhZ2Uoa2V5LCBpbml0aWFsVmFsdWUsIHN0b3JhZ2UgPSBkZWZhdWx0U3RvcmFnZSwgb3B0aW9ucykge1xuICBjb25zdCBnZXRPbkluaXQgPSBvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmdldE9uSW5pdDtcbiAgY29uc3QgYmFzZUF0b20gPSBhdG9tKFxuICAgIGdldE9uSW5pdCA/IHN0b3JhZ2UuZ2V0SXRlbShrZXksIGluaXRpYWxWYWx1ZSkgOiBpbml0aWFsVmFsdWVcbiAgKTtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgYmFzZUF0b20uZGVidWdQcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBiYXNlQXRvbS5vbk1vdW50ID0gKHNldEF0b20pID0+IHtcbiAgICBzZXRBdG9tKHN0b3JhZ2UuZ2V0SXRlbShrZXksIGluaXRpYWxWYWx1ZSkpO1xuICAgIGxldCB1bnN1YjtcbiAgICBpZiAoc3RvcmFnZS5zdWJzY3JpYmUpIHtcbiAgICAgIHVuc3ViID0gc3RvcmFnZS5zdWJzY3JpYmUoa2V5LCBzZXRBdG9tLCBpbml0aWFsVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5zdWI7XG4gIH07XG4gIGNvbnN0IGFuQXRvbSA9IGF0b20oXG4gICAgKGdldCkgPT4gZ2V0KGJhc2VBdG9tKSxcbiAgICAoZ2V0LCBzZXQsIHVwZGF0ZSkgPT4ge1xuICAgICAgY29uc3QgbmV4dFZhbHVlID0gdHlwZW9mIHVwZGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gdXBkYXRlKGdldChiYXNlQXRvbSkpIDogdXBkYXRlO1xuICAgICAgaWYgKG5leHRWYWx1ZSA9PT0gUkVTRVQpIHtcbiAgICAgICAgc2V0KGJhc2VBdG9tLCBpbml0aWFsVmFsdWUpO1xuICAgICAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcm9taXNlTGlrZSQzKG5leHRWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG5leHRWYWx1ZS50aGVuKChyZXNvbHZlZFZhbHVlKSA9PiB7XG4gICAgICAgICAgc2V0KGJhc2VBdG9tLCByZXNvbHZlZFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gc3RvcmFnZS5zZXRJdGVtKGtleSwgcmVzb2x2ZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2V0KGJhc2VBdG9tLCBuZXh0VmFsdWUpO1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0SXRlbShrZXksIG5leHRWYWx1ZSk7XG4gICAgfVxuICApO1xuICByZXR1cm4gYW5BdG9tO1xufVxuXG5jb25zdCBpc1Byb21pc2VMaWtlJDIgPSAoeCkgPT4gdHlwZW9mICh4ID09IG51bGwgPyB2b2lkIDAgOiB4LnRoZW4pID09PSBcImZ1bmN0aW9uXCI7XG5mdW5jdGlvbiBhdG9tV2l0aE9ic2VydmFibGUoZ2V0T2JzZXJ2YWJsZSwgb3B0aW9ucykge1xuICBjb25zdCByZXR1cm5SZXN1bHREYXRhID0gKHJlc3VsdCkgPT4ge1xuICAgIGlmIChcImVcIiBpbiByZXN1bHQpIHtcbiAgICAgIHRocm93IHJlc3VsdC5lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LmQ7XG4gIH07XG4gIGNvbnN0IG9ic2VydmFibGVSZXN1bHRBdG9tID0gYXRvbSgoZ2V0KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGxldCBvYnNlcnZhYmxlID0gZ2V0T2JzZXJ2YWJsZShnZXQpO1xuICAgIGNvbnN0IGl0c2VsZiA9IChfYSA9IG9ic2VydmFibGVbU3ltYm9sLm9ic2VydmFibGVdKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChvYnNlcnZhYmxlKTtcbiAgICBpZiAoaXRzZWxmKSB7XG4gICAgICBvYnNlcnZhYmxlID0gaXRzZWxmO1xuICAgIH1cbiAgICBsZXQgcmVzb2x2ZTtcbiAgICBjb25zdCBtYWtlUGVuZGluZyA9ICgpID0+IG5ldyBQcm9taXNlKChyKSA9PiB7XG4gICAgICByZXNvbHZlID0gcjtcbiAgICB9KTtcbiAgICBjb25zdCBpbml0aWFsUmVzdWx0ID0gb3B0aW9ucyAmJiBcImluaXRpYWxWYWx1ZVwiIGluIG9wdGlvbnMgPyB7XG4gICAgICBkOiB0eXBlb2Ygb3B0aW9ucy5pbml0aWFsVmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaW5pdGlhbFZhbHVlKCkgOiBvcHRpb25zLmluaXRpYWxWYWx1ZVxuICAgIH0gOiBtYWtlUGVuZGluZygpO1xuICAgIGxldCBzZXRSZXN1bHQ7XG4gICAgbGV0IGxhc3RSZXN1bHQ7XG4gICAgY29uc3QgbGlzdGVuZXIgPSAocmVzdWx0KSA9PiB7XG4gICAgICBsYXN0UmVzdWx0ID0gcmVzdWx0O1xuICAgICAgcmVzb2x2ZSA9PSBudWxsID8gdm9pZCAwIDogcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgc2V0UmVzdWx0ID09IG51bGwgPyB2b2lkIDAgOiBzZXRSZXN1bHQocmVzdWx0KTtcbiAgICB9O1xuICAgIGxldCBzdWJzY3JpcHRpb247XG4gICAgbGV0IHRpbWVyO1xuICAgIGNvbnN0IGlzTm90TW91bnRlZCA9ICgpID0+ICFzZXRSZXN1bHQ7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICBzdWJzY3JpcHRpb24gPSB2b2lkIDA7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBzdGFydCA9ICgpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkKSA9PiBsaXN0ZW5lcih7IGQgfSksXG4gICAgICAgIGVycm9yOiAoZSkgPT4gbGlzdGVuZXIoeyBlIH0pLFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChpc05vdE1vdW50ZWQoKSAmJiAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy51bnN0YWJsZV90aW1lb3V0KSkge1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQodW5zdWJzY3JpYmUsIG9wdGlvbnMudW5zdGFibGVfdGltZW91dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBzdGFydCgpO1xuICAgIGNvbnN0IHJlc3VsdEF0b20gPSBhdG9tKGxhc3RSZXN1bHQgfHwgaW5pdGlhbFJlc3VsdCk7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICByZXN1bHRBdG9tLmRlYnVnUHJpdmF0ZSA9IHRydWU7XG4gICAgfVxuICAgIHJlc3VsdEF0b20ub25Nb3VudCA9ICh1cGRhdGUpID0+IHtcbiAgICAgIHNldFJlc3VsdCA9IHVwZGF0ZTtcbiAgICAgIGlmIChsYXN0UmVzdWx0KSB7XG4gICAgICAgIHVwZGF0ZShsYXN0UmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzZXRSZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgIGlmIChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLnVuc3RhYmxlX3RpbWVvdXQpIHtcbiAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQodW5zdWJzY3JpYmUsIG9wdGlvbnMudW5zdGFibGVfdGltZW91dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIHJldHVybiBbcmVzdWx0QXRvbSwgb2JzZXJ2YWJsZSwgbWFrZVBlbmRpbmcsIHN0YXJ0LCBpc05vdE1vdW50ZWRdO1xuICB9KTtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgb2JzZXJ2YWJsZVJlc3VsdEF0b20uZGVidWdQcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBjb25zdCBvYnNlcnZhYmxlQXRvbSA9IGF0b20oXG4gICAgKGdldCkgPT4ge1xuICAgICAgY29uc3QgW3Jlc3VsdEF0b21dID0gZ2V0KG9ic2VydmFibGVSZXN1bHRBdG9tKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldChyZXN1bHRBdG9tKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlJDIocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4ocmV0dXJuUmVzdWx0RGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuUmVzdWx0RGF0YShyZXN1bHQpO1xuICAgIH0sXG4gICAgKGdldCwgc2V0LCBkYXRhKSA9PiB7XG4gICAgICBjb25zdCBbcmVzdWx0QXRvbSwgb2JzZXJ2YWJsZSwgbWFrZVBlbmRpbmcsIHN0YXJ0LCBpc05vdE1vdW50ZWRdID0gZ2V0KG9ic2VydmFibGVSZXN1bHRBdG9tKTtcbiAgICAgIGlmIChcIm5leHRcIiBpbiBvYnNlcnZhYmxlKSB7XG4gICAgICAgIGlmIChpc05vdE1vdW50ZWQoKSkge1xuICAgICAgICAgIHNldChyZXN1bHRBdG9tLCBtYWtlUGVuZGluZygpKTtcbiAgICAgICAgICBzdGFydCgpO1xuICAgICAgICB9XG4gICAgICAgIG9ic2VydmFibGUubmV4dChkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9ic2VydmFibGUgaXMgbm90IHN1YmplY3RcIik7XG4gICAgICB9XG4gICAgfVxuICApO1xuICByZXR1cm4gb2JzZXJ2YWJsZUF0b207XG59XG5cbmNvbnN0IGNhY2hlMSQxID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBtZW1vMSA9IChjcmVhdGUsIGRlcDEpID0+IChjYWNoZTEkMS5oYXMoZGVwMSkgPyBjYWNoZTEkMSA6IGNhY2hlMSQxLnNldChkZXAxLCBjcmVhdGUoKSkpLmdldChkZXAxKTtcbmNvbnN0IGlzUHJvbWlzZUxpa2UkMSA9IChwKSA9PiB0eXBlb2YgKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAudGhlbikgPT09IFwiZnVuY3Rpb25cIjtcbmNvbnN0IExPQURJTkcgPSB7IHN0YXRlOiBcImxvYWRpbmdcIiB9O1xuZnVuY3Rpb24gbG9hZGFibGUoYW5BdG9tKSB7XG4gIHJldHVybiBtZW1vMSgoKSA9PiB7XG4gICAgY29uc3QgbG9hZGFibGVDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICAgIGNvbnN0IHJlZnJlc2hBdG9tID0gYXRvbSgwKTtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHJlZnJlc2hBdG9tLmRlYnVnUHJpdmF0ZSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGRlcml2ZWRBdG9tID0gYXRvbShcbiAgICAgIChnZXQsIHsgc2V0U2VsZiB9KSA9PiB7XG4gICAgICAgIGdldChyZWZyZXNoQXRvbSk7XG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IGdldChhbkF0b20pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBcImhhc0Vycm9yXCIsIGVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1Byb21pc2VMaWtlJDEodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgc3RhdGU6IFwiaGFzRGF0YVwiLCBkYXRhOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB2YWx1ZTtcbiAgICAgICAgY29uc3QgY2FjaGVkMSA9IGxvYWRhYmxlQ2FjaGUuZ2V0KHByb21pc2UpO1xuICAgICAgICBpZiAoY2FjaGVkMSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZWQxO1xuICAgICAgICB9XG4gICAgICAgIHByb21pc2UudGhlbihcbiAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgbG9hZGFibGVDYWNoZS5zZXQocHJvbWlzZSwgeyBzdGF0ZTogXCJoYXNEYXRhXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBzZXRTZWxmKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGxvYWRhYmxlQ2FjaGUuc2V0KHByb21pc2UsIHsgc3RhdGU6IFwiaGFzRXJyb3JcIiwgZXJyb3IgfSk7XG4gICAgICAgICAgICBzZXRTZWxmKCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjYWNoZWQyID0gbG9hZGFibGVDYWNoZS5nZXQocHJvbWlzZSk7XG4gICAgICAgIGlmIChjYWNoZWQyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlZDI7XG4gICAgICAgIH1cbiAgICAgICAgbG9hZGFibGVDYWNoZS5zZXQocHJvbWlzZSwgTE9BRElORyk7XG4gICAgICAgIHJldHVybiBMT0FESU5HO1xuICAgICAgfSxcbiAgICAgIChfZ2V0LCBzZXQpID0+IHtcbiAgICAgICAgc2V0KHJlZnJlc2hBdG9tLCAoYykgPT4gYyArIDEpO1xuICAgICAgfVxuICAgICk7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBkZXJpdmVkQXRvbS5kZWJ1Z1ByaXZhdGUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbSgoZ2V0KSA9PiBnZXQoZGVyaXZlZEF0b20pKTtcbiAgfSwgYW5BdG9tKTtcbn1cblxuY29uc3QgZ2V0Q2FjaGVkID0gKGMsIG0sIGspID0+IChtLmhhcyhrKSA/IG0gOiBtLnNldChrLCBjKCkpKS5nZXQoayk7XG5jb25zdCBjYWNoZTEgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1lbW8yID0gKGNyZWF0ZSwgZGVwMSwgZGVwMikgPT4ge1xuICBjb25zdCBjYWNoZTIgPSBnZXRDYWNoZWQoKCkgPT4gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksIGNhY2hlMSwgZGVwMSk7XG4gIHJldHVybiBnZXRDYWNoZWQoY3JlYXRlLCBjYWNoZTIsIGRlcDIpO1xufTtcbmNvbnN0IGlzUHJvbWlzZUxpa2UgPSAocCkgPT4gdHlwZW9mIChwID09IG51bGwgPyB2b2lkIDAgOiBwLnRoZW4pID09PSBcImZ1bmN0aW9uXCI7XG5jb25zdCBkZWZhdWx0RmFsbGJhY2sgPSAoKSA9PiB2b2lkIDA7XG5mdW5jdGlvbiB1bndyYXAoYW5BdG9tLCBmYWxsYmFjayA9IGRlZmF1bHRGYWxsYmFjaykge1xuICByZXR1cm4gbWVtbzIoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvbWlzZUVycm9yQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgICAgIGNvbnN0IHByb21pc2VSZXN1bHRDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICAgICAgY29uc3QgcmVmcmVzaEF0b20gPSBhdG9tKDApO1xuICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHJlZnJlc2hBdG9tLmRlYnVnUHJpdmF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9taXNlQW5kVmFsdWVBdG9tID0gYXRvbShcbiAgICAgICAgKGdldCwgeyBzZXRTZWxmIH0pID0+IHtcbiAgICAgICAgICBnZXQocmVmcmVzaEF0b20pO1xuICAgICAgICAgIGxldCBwcmV2O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcmV2ID0gZ2V0KHByb21pc2VBbmRWYWx1ZUF0b20pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcHJvbWlzZSA9IGdldChhbkF0b20pO1xuICAgICAgICAgIGlmICghaXNQcm9taXNlTGlrZShwcm9taXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdjogcHJvbWlzZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJvbWlzZSAhPT0gKHByZXYgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXYucCkpIHtcbiAgICAgICAgICAgIHByb21pc2UudGhlbihcbiAgICAgICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgICAgICBwcm9taXNlUmVzdWx0Q2FjaGUuc2V0KHByb21pc2UsIHYpO1xuICAgICAgICAgICAgICAgIHNldFNlbGYoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBwcm9taXNlRXJyb3JDYWNoZS5zZXQocHJvbWlzZSwgZSk7XG4gICAgICAgICAgICAgICAgc2V0U2VsZigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJvbWlzZUVycm9yQ2FjaGUuaGFzKHByb21pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBwcm9taXNlRXJyb3JDYWNoZS5nZXQocHJvbWlzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcm9taXNlUmVzdWx0Q2FjaGUuaGFzKHByb21pc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwOiBwcm9taXNlLFxuICAgICAgICAgICAgICB2OiBwcm9taXNlUmVzdWx0Q2FjaGUuZ2V0KHByb21pc2UpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldiAmJiBcInZcIiBpbiBwcmV2KSB7XG4gICAgICAgICAgICByZXR1cm4geyBwOiBwcm9taXNlLCBmOiBmYWxsYmFjayhwcmV2LnYpLCB2OiBwcmV2LnYgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgcDogcHJvbWlzZSwgZjogZmFsbGJhY2soKSB9O1xuICAgICAgICB9LFxuICAgICAgICAoX2dldCwgc2V0KSA9PiB7XG4gICAgICAgICAgc2V0KHJlZnJlc2hBdG9tLCAoYykgPT4gYyArIDEpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcHJvbWlzZUFuZFZhbHVlQXRvbS5pbml0ID0gdm9pZCAwO1xuICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHByb21pc2VBbmRWYWx1ZUF0b20uZGVidWdQcml2YXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdG9tKFxuICAgICAgICAoZ2V0KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBnZXQocHJvbWlzZUFuZFZhbHVlQXRvbSk7XG4gICAgICAgICAgaWYgKFwiZlwiIGluIHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuZjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLnY7XG4gICAgICAgIH0sXG4gICAgICAgIChfZ2V0LCBzZXQsIC4uLmFyZ3MpID0+IHNldChhbkF0b20sIC4uLmFyZ3MpXG4gICAgICApO1xuICAgIH0sXG4gICAgYW5BdG9tLFxuICAgIGZhbGxiYWNrXG4gICk7XG59XG5cbmZ1bmN0aW9uIGF0b21XaXRoUmVmcmVzaChyZWFkLCB3cml0ZSkge1xuICBjb25zdCByZWZyZXNoQXRvbSA9IGF0b20oMCk7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJlZnJlc2hBdG9tLmRlYnVnUHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGF0b20oXG4gICAgKGdldCwgb3B0aW9ucykgPT4ge1xuICAgICAgZ2V0KHJlZnJlc2hBdG9tKTtcbiAgICAgIHJldHVybiByZWFkKGdldCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgICAoZ2V0LCBzZXQsIC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzZXQocmVmcmVzaEF0b20sIChjKSA9PiBjICsgMSk7XG4gICAgICB9IGVsc2UgaWYgKHdyaXRlKSB7XG4gICAgICAgIHJldHVybiB3cml0ZShnZXQsIHNldCwgLi4uYXJncyk7XG4gICAgICB9IGVsc2UgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlZnJlc2ggbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNcIik7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiBhdG9tV2l0aExhenkobWFrZUluaXRpYWwpIHtcbiAgY29uc3QgYSA9IGF0b20odm9pZCAwKTtcbiAgZGVsZXRlIGEuaW5pdDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIFwiaW5pdFwiLCB7XG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIG1ha2VJbml0aWFsKCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGE7XG59XG5cbmV4cG9ydCB7IFJFU0VULCBhdG9tRmFtaWx5LCBhdG9tV2l0aERlZmF1bHQsIGF0b21XaXRoTGF6eSwgYXRvbVdpdGhPYnNlcnZhYmxlLCBhdG9tV2l0aFJlZHVjZXIsIGF0b21XaXRoUmVmcmVzaCwgYXRvbVdpdGhSZXNldCwgYXRvbVdpdGhTdG9yYWdlLCBjcmVhdGVKU09OU3RvcmFnZSwgZnJlZXplQXRvbSwgZnJlZXplQXRvbUNyZWF0b3IsIGxvYWRhYmxlLCBzZWxlY3RBdG9tLCBzcGxpdEF0b20sIHdpdGhTdG9yYWdlVmFsaWRhdG9yIGFzIHVuc3RhYmxlX3dpdGhTdG9yYWdlVmFsaWRhdG9yLCB1bndyYXAgfTtcbiIsIlwidXNlIGNsaWVudFwiO1xuXG4vLyBzcmMvaW5kZXgudHNcbmltcG9ydCAqIGFzIERldnRvb2xzIGZyb20gXCIuL1JlYWN0UXVlcnlEZXZ0b29scy5qc1wiO1xuaW1wb3J0ICogYXMgRGV2dG9vbHNQYW5lbCBmcm9tIFwiLi9SZWFjdFF1ZXJ5RGV2dG9vbHNQYW5lbC5qc1wiO1xudmFyIFJlYWN0UXVlcnlEZXZ0b29sczIgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJkZXZlbG9wbWVudFwiID8gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBudWxsO1xufSA6IERldnRvb2xzLlJlYWN0UXVlcnlEZXZ0b29scztcbnZhciBSZWFjdFF1ZXJ5RGV2dG9vbHNQYW5lbDIgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJkZXZlbG9wbWVudFwiID8gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBudWxsO1xufSA6IERldnRvb2xzUGFuZWwuUmVhY3RRdWVyeURldnRvb2xzUGFuZWw7XG5leHBvcnQge1xuICBSZWFjdFF1ZXJ5RGV2dG9vbHMyIGFzIFJlYWN0UXVlcnlEZXZ0b29scyxcbiAgUmVhY3RRdWVyeURldnRvb2xzUGFuZWwyIGFzIFJlYWN0UXVlcnlEZXZ0b29sc1BhbmVsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==