@signaltree/core 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +273 -116
- package/fesm2022/signaltree-core.mjs +384 -100
- package/fesm2022/signaltree-core.mjs.map +1 -1
- package/index.d.ts +115 -57
- package/package.json +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js","../tmp-esm2022/signaltree-core.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\n// Path parsing cache for performance optimization\nconst pathCache = new Map();\n/**\n * Enhanced equality function inspired by the monolithic implementation.\n * Uses deep equality for arrays and objects, === for primitives.\n * More efficient than lodash while maintaining compatibility.\n */\nexport function equal(a, b) {\n // Fast path for reference equality\n if (a === b)\n return true;\n // Handle null/undefined cases\n if (a == null || b == null)\n return a === b;\n // Handle arrays with deep comparison\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n // Handle objects with deep comparison\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => keysB.includes(key) &&\n equal(a[key], b[key]));\n }\n // Fallback to strict equality\n return a === b;\n}\n/**\n * Creates a terminal signal with the enhanced equality function.\n * This should be used instead of Angular's signal() when you want\n * the same deep equality behavior as signalTree.\n *\n * Inspired by the monolithic implementation's terminal signal creation.\n */\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\n/**\n * Parses a dot-notation path into an array of keys with memoization.\n * Critical for performance when accessing nested properties frequently.\n *\n * @example\n * ```typescript\n * const keys1 = parsePath('user.name'); // Splits and caches\n * const keys2 = parsePath('user.name'); // Returns cached result\n * ```\n */\nexport function parsePath(path) {\n if (!pathCache.has(path)) {\n pathCache.set(path, path.split('.'));\n }\n const cached = pathCache.get(path);\n return cached ?? path.split('.');\n}\n/**\n * Creates a lazy signal tree using Proxy for on-demand signal creation.\n * Only creates signals when properties are first accessed, providing\n * massive memory savings for large state objects.\n *\n * @param obj - Source object to lazily signalify\n * @param equalityFn - Equality function for signal comparison\n * @param basePath - Base path for nested objects (internal use)\n * @returns Proxied object that creates signals on first access\n */\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n return new Proxy(obj, {\n get(target, prop) {\n // Handle symbol properties (like Symbol.iterator) normally\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n const value = target[key];\n // If it's already a signal, return it\n if (isSignal(value)) {\n return value;\n }\n // Check if we already have a signal for this path\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n // Check if we have a nested proxy cached\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n // Handle nested objects - create lazy proxy\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value)) {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n return nestedProxy;\n }\n // Create signal for primitive values and arrays\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n // Update the original object\n target[key] = value;\n // If we have a cached signal, update it\n const cachedSignal = signalCache.get(path);\n if (cachedSignal) {\n cachedSignal.set(value);\n }\n // Clear nested proxy cache if the value type changed\n if (nestedProxies.has(path)) {\n nestedProxies.delete(path);\n }\n return true;\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n}\n/**\n * Native deep equality check for arrays and objects.\n * Handles all common cases that lodash.isEqual handles for our use cases.\n */\nexport function deepEqual(a, b) {\n // Same reference or primitives\n if (a === b)\n return true;\n // Handle null/undefined\n if (a == null || b == null)\n return false;\n // Different types\n if (typeof a !== typeof b)\n return false;\n // Handle dates\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n // Handle objects (but not arrays, dates, or other special objects)\n if (typeof a === 'object' &&\n typeof b === 'object' &&\n !Array.isArray(a) &&\n !Array.isArray(b) &&\n !(a instanceof Date) &&\n !(b instanceof Date)) {\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (!(key in objB))\n return false;\n if (!deepEqual(objA[key], objB[key]))\n return false;\n }\n return true;\n }\n // For all other cases (primitives that aren't equal)\n return false;\n}\n/**\n * Shallow equality check for objects and arrays.\n */\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pFLGtEQUFrRDtBQUNsRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNqQyxtQ0FBbUM7SUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLDhCQUE4QjtJQUM5QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFD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QUFDLEdBQUcsQ0FBQztnQkFFbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNpZ25hbCwgV3JpdGFibGVTaWduYWwsIGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnkgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbmNvbnN0IHBhdGhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblxuLyoqXG4gKiBFbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbiBpbnNwaXJlZCBieSB0aGUgbW9ub2xpdGhpYyBpbXBsZW1lbnRhdGlvbi5cbiAqIFVzZXMgZGVlcCBlcXVhbGl0eSBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLCA9PT0gZm9yIHByaW1pdGl2ZXMuXG4gKiBNb3JlIGVmZmljaWVudCB0aGFuIGxvZGFzaCB3aGlsZSBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggZGVlcCBjb21wYXJpc29uXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBkZWVwIGNvbXBhcmlzb25cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBrZXlzQS5ldmVyeShcbiAgICAgIChrZXkpID0+XG4gICAgICAgIGtleXNCLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgZXF1YWwoXG4gICAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBzdHJpY3QgZXF1YWxpdHlcbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlcm1pbmFsIHNpZ25hbCB3aXRoIHRoZSBlbmhhbmNlZCBlcXVhbGl0eSBmdW5jdGlvbi5cbiAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBBbmd1bGFyJ3Mgc2lnbmFsKCkgd2hlbiB5b3Ugd2FudFxuICogdGhlIHNhbWUgZGVlcCBlcXVhbGl0eSBiZWhhdmlvciBhcyBzaWduYWxUcmVlLlxuICpcbiAqIEluc3BpcmVkIGJ5IHRoZSBtb25vbGl0aGljIGltcGxlbWVudGF0aW9uJ3MgdGVybWluYWwgc2lnbmFsIGNyZWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVybWluYWxTaWduYWw8VD4oXG4gIHZhbHVlOiBULFxuICBjdXN0b21FcXVhbD86IChhOiBULCBiOiBUKSA9PiBib29sZWFuXG4pOiBXcml0YWJsZVNpZ25hbDxUPiB7XG4gIHJldHVybiBzaWduYWwodmFsdWUsIHtcbiAgICBlcXVhbDogY3VzdG9tRXF1YWwgfHwgZXF1YWwsXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGRvdC1ub3RhdGlvbiBwYXRoIGludG8gYW4gYXJyYXkgb2Yga2V5cyB3aXRoIG1lbW9pemF0aW9uLlxuICogQ3JpdGljYWwgZm9yIHBlcmZvcm1hbmNlIHdoZW4gYWNjZXNzaW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGZyZXF1ZW50bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGtleXMxID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gU3BsaXRzIGFuZCBjYWNoZXNcbiAqIGNvbnN0IGtleXMyID0gcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgLy8gUmV0dXJucyBjYWNoZWQgcmVzdWx0XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmICghcGF0aENhY2hlLmhhcyhwYXRoKSkge1xuICAgIHBhdGhDYWNoZS5zZXQocGF0aCwgcGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICByZXR1cm4gY2FjaGVkID8/IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSBzaWduYWwgdHJlZSB1c2luZyBQcm94eSBmb3Igb24tZGVtYW5kIHNpZ25hbCBjcmVhdGlvbi5cbiAqIE9ubHkgY3JlYXRlcyBzaWduYWxzIHdoZW4gcHJvcGVydGllcyBhcmUgZmlyc3QgYWNjZXNzZWQsIHByb3ZpZGluZ1xuICogbWFzc2l2ZSBtZW1vcnkgc2F2aW5ncyBmb3IgbGFyZ2Ugc3RhdGUgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFQsXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuLFxuICBiYXNlUGF0aCA9ICcnXG4pOiBEZWVwU2lnbmFsaWZ5PFQ+IHtcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIC8vIEhhbmRsZSBzeW1ib2wgcHJvcGVydGllcyAobGlrZSBTeW1ib2wuaXRlcmF0b3IpIG5vcm1hbGx5XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0W2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBuZXN0ZWRQcm94eSA9IGNyZWF0ZUxhenlTaWduYWxUcmVlKFxuICAgICAgICAgIHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgcGF0aFxuICAgICAgICApO1xuICAgICAgICBuZXN0ZWRQcm94aWVzLnNldChwYXRoLCBuZXN0ZWRQcm94eSk7XG4gICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hbCBmb3IgcHJpbWl0aXZlIHZhbHVlcyBhbmQgYXJyYXlzXG4gICAgICBjb25zdCBuZXdTaWduYWwgPSBzaWduYWwodmFsdWUsIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSk7XG4gICAgICBzaWduYWxDYWNoZS5zZXQocGF0aCwgbmV3U2lnbmFsKTtcbiAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgfSxcblxuICAgIHNldChcbiAgICAgIHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgICB2YWx1ZTogdW5rbm93blxuICAgICkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgIGNvbnN0IGNhY2hlZFNpZ25hbCA9IHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIGlmIChjYWNoZWRTaWduYWwpIHtcbiAgICAgICAgY2FjaGVkU2lnbmFsLnNldCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIG5lc3RlZCBwcm94eSBjYWNoZSBpZiB0aGUgdmFsdWUgdHlwZSBjaGFuZ2VkXG4gICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgbmVzdGVkUHJveGllcy5kZWxldGUocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG59XG5cbi8qKlxuICogTmF0aXZlIGRlZXAgZXF1YWxpdHkgY2hlY2sgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbiAqIEhhbmRsZXMgYWxsIGNvbW1vbiBjYXNlcyB0aGF0IGxvZGFzaC5pc0VxdWFsIGhhbmRsZXMgZm9yIG91ciB1c2UgY2FzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBTYW1lIHJlZmVyZW5jZSBvciBwcmltaXRpdmVzXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAvLyBEaWZmZXJlbnQgdHlwZXNcbiAgaWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYikgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEhhbmRsZSBkYXRlc1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5c1xuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgb2JqZWN0cyAoYnV0IG5vdCBhcnJheXMsIGRhdGVzLCBvciBvdGhlciBzcGVjaWFsIG9iamVjdHMpXG4gIGlmIChcbiAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShhKSAmJlxuICAgICFBcnJheS5pc0FycmF5KGIpICYmXG4gICAgIShhIGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKGIgaW5zdGFuY2VvZiBEYXRlKVxuICApIHtcbiAgICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvYmpCID0gYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoIShrZXkgaW4gb2JqQikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9iakFba2V5XSwgb2JqQltrZXldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEZvciBhbGwgb3RoZXIgY2FzZXMgKHByaW1pdGl2ZXMgdGhhdCBhcmVuJ3QgZXF1YWwpXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93RXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNBKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldICE9PVxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\n/**\n * Creates an equality function based on configuration.\n *\n * @param useShallowComparison - If true, uses Object.is for comparison; otherwise uses deep equality\n * @returns A function that compares two values for equality\n *\n * @example\n * ```typescript\n * const shallowEqual = createEqualityFn(true);\n * const deepEqual = createEqualityFn(false);\n *\n * shallowEqual({ a: 1 }, { a: 1 }); // false (different objects)\n * deepEqual({ a: 1 }, { a: 1 }); // true (same structure and values)\n * ```\n */\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\n/**\n * Core function to create a basic SignalTree.\n * This provides the minimal functionality without advanced features.\n *\n * @template T - The state object type\n * @param obj - The initial state object\n * @param config - Configuration options for the tree\n * @returns A basic SignalTree with core functionality\n *\n * @example\n * ```typescript\n * const tree = create({\n * count: 0,\n * user: { name: 'John', age: 30 }\n * }, {\n * useLazySignals: true,\n * useShallowComparison: false\n * });\n *\n * // Access nested signals\n * console.log(tree.$.count()); // 0\n * tree.$.user.name.set('Jane');\n * ```\n */\nfunction create(obj, config = {}) {\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = config.useLazySignals ?? true; // Default to lazy loading\n // Choose between lazy and eager signal creation\n const signalState = useLazy\n ? createLazySignalTree(obj, equalityFn)\n : createEagerSignalsFromObject(obj, equalityFn);\n const resultTree = {\n state: signalState,\n $: signalState, // $ points to the same state object\n };\n enhanceTree(resultTree);\n return resultTree;\n}\n/**\n * Creates eager signals from an object (non-lazy approach).\n * All signals are created immediately during initialization.\n *\n * @template O - The object type to convert to signals\n * @param obj - The object to convert to signals\n * @param equalityFn - Function to compare values for equality\n * @returns A deeply signalified version of the object\n *\n * @example\n * ```typescript\n * const eagerSignals = createEagerSignalsFromObject({\n * user: { name: 'John', age: 30 },\n * settings: { theme: 'dark' }\n * }, Object.is);\n *\n * // All signals are created immediately\n * eagerSignals.user.name.set('Jane');\n * console.log(eagerSignals.settings.theme()); // 'dark'\n * ```\n */\nfunction createEagerSignalsFromObject(obj, equalityFn) {\n const result = {};\n for (const [key, value] of Object.entries(obj)) {\n const isObj = (v) => typeof v === 'object' && v !== null;\n if (isObj(value) && !Array.isArray(value) && !isSignal(value)) {\n // For nested objects, create nested signal structure directly\n result[key] = createEagerSignalsFromObject(value, equalityFn);\n }\n else if (isSignal(value)) {\n result[key] = value;\n }\n else {\n result[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n return result;\n}\n/**\n * Enhances a tree with basic functionality (unwrap, update, pipe).\n * Adds core methods that every SignalTree needs for basic operation.\n *\n * @template T - The state object type\n * @param tree - The tree to enhance with basic functionality\n * @returns The enhanced tree with unwrap, update, and pipe methods\n *\n * @example\n * ```typescript\n * const basicTree = { state: signalState, $: signalState };\n * enhanceTree(basicTree);\n *\n * // Now has basic methods:\n * const currentState = basicTree.unwrap();\n * basicTree.update(state => ({ ...state, count: state.count + 1 }));\n * const enhancedTree = basicTree.pipe(withSomeFeature());\n * ```\n */\nfunction enhanceTree(tree) {\n /**\n * Unwraps the current state by reading all signal values.\n * Recursively converts the signal tree back to plain JavaScript values.\n *\n * @returns The current state as a plain object\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0\n * });\n *\n * tree.$.user.name.set('Jane');\n * tree.$.count.set(5);\n *\n * const currentState = tree.unwrap();\n * // { user: { name: 'Jane', age: 30 }, count: 5 }\n * ```\n */\n tree.unwrap = () => {\n // Recursively unwrap with proper typing\n const unwrapObject = (obj) => {\n const result = {};\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n // Nested signal state\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n /**\n * Updates the state using an updater function.\n * The updater receives the current state and returns a partial update.\n * Automatically handles nested signal updates.\n *\n * @param updater - Function that receives current state and returns partial updates\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0,\n * todos: []\n * });\n *\n * // Simple update\n * tree.update(state => ({ count: state.count + 1 }));\n *\n * // Nested update\n * tree.update(state => ({\n * user: { ...state.user, age: state.user.age + 1 },\n * todos: [...state.todos, { id: 1, text: 'New todo' }]\n * }));\n *\n * // Conditional update\n * tree.update(state =>\n * state.count < 10\n * ? { count: state.count + 1 }\n * : { count: 0, user: { ...state.user, name: 'Reset' } }\n * );\n * ```\n */\n tree.update = (updater) => {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n // Recursively update with better typing\n const updateObject = (target, updates) => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentSignalOrState = target[key];\n if (isSignal(currentSignalOrState)) {\n // Direct signal update\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null) {\n // Nested object - recurse\n updateObject(currentSignalOrState, updateValue);\n }\n }\n };\n updateObject(tree.state, partialObj);\n };\n // Pipe implementation for function composition with improved type safety\n tree.pipe = ((...fns // eslint-disable-line @typescript-eslint/no-explicit-any\n ) => {\n // eslint-disable-line @typescript-eslint/no-explicit-any\n if (fns.length === 0) {\n return tree;\n }\n // Type-safe reduce - the return type is determined by the overload signature\n return fns.reduce((acc, fn) => fn(acc), tree);\n });\n // Stub implementations for advanced features (will log warnings)\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', '\\nTo enable batch updates, install @signaltree/batching');\n // Fallback: Just call update directly\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', '\\nTo enable memoized computations, install @signaltree/memoization');\n // Fallback: Use simple Angular computed without memoization\n void cacheKey; // Mark as intentionally unused\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n // Fallback for test environments without injection context\n console.warn('Effect requires Angular injection context', error);\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n // Fallback for test environment - call once immediately\n console.warn('Subscribe requires Angular injection context', error);\n fn(tree.unwrap());\n return () => {\n // No-op unsubscribe\n };\n }\n };\n // Stub implementations for performance features\n tree.optimize = () => {\n console.warn('⚠️ optimize() called but tree optimization is not available.', '\\nTo enable optimization, install @signaltree/memoization');\n };\n tree.clearCache = () => {\n console.warn('⚠️ clearCache() called but caching is not available.', '\\nTo enable caching, install @signaltree/memoization');\n };\n tree.invalidatePattern = () => {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.', '\\nTo enable pattern invalidation, install @signaltree/memoization');\n return 0;\n };\n tree.destroy = () => {\n // Basic cleanup for non-enhanced trees\n console.log('[MEMORY-CLEANUP] Basic tree destroyed');\n };\n tree.getMetrics = () => {\n console.warn('⚠️ getMetrics() called but performance tracking is not enabled.', '\\nTo enable performance tracking, install @signaltree/middleware');\n // Return minimal metrics when tracking not enabled\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n // Stub implementations for middleware\n tree.addTap = (middleware) => {\n console.warn('⚠️ addTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void middleware; // Mark as intentionally unused\n };\n tree.removeTap = (id) => {\n console.warn('⚠️ removeTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void id; // Mark as intentionally unused\n };\n // Stub implementations for entity helpers\n tree.asCrud = () => {\n console.warn('⚠️ asCrud() called but entity helpers are not available.', '\\nTo enable entity helpers, install @signaltree/entities');\n return {};\n };\n // Stub implementations for async actions\n tree.asyncAction = (operation, config = {}) => {\n console.warn('⚠️ asyncAction() called but async actions are not available.', '\\nTo enable async actions, install @signaltree/async');\n void operation;\n void config;\n return {};\n };\n // Stub implementations for time travel\n tree.undo = () => {\n console.warn('⚠️ undo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.redo = () => {\n console.warn('⚠️ redo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.getHistory = () => {\n console.warn('⚠️ getHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n return [];\n };\n tree.resetHistory = () => {\n console.warn('⚠️ resetHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n return tree;\n}\n/**\n * Implementation of the signalTree factory function.\n */\nexport function signalTree(obj, configOrPreset) {\n // Handle preset strings\n if (typeof configOrPreset === 'string') {\n console.warn('⚠️ Preset configurations are not available in @signaltree/core.', '\\nTo use presets, install @signaltree/presets');\n // Fallback to basic configuration\n return create(obj, {});\n }\n // Handle configuration objects or default (smart enhancement)\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBY3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLG9CQUE2QjtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsTUFBTSxDQUNiLEdBQU0sRUFDTixTQUFxQixFQUFFO0lBRXZCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtJQUV6RSxnREFBZ0Q7SUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTztRQUN6QixDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN2QyxDQUFDLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWxELE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLENBQUMsRUFBRSxXQUFXLEVBQUUsb0NBQW9DO0tBQ3BDLENBQUM7SUFFbkIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sVUFB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QyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxuICBTdGF0ZU9iamVjdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVxdWFsaXR5IGZ1bmN0aW9uIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHVzZVNoYWxsb3dDb21wYXJpc29uIC0gSWYgdHJ1ZSwgdXNlcyBPYmplY3QuaXMgZm9yIGNvbXBhcmlzb247IG90aGVyd2lzZSB1c2VzIGRlZXAgZXF1YWxpdHlcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0d28gdmFsdWVzIGZvciBlcXVhbGl0eVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzaGFsbG93RXF1YWwgPSBjcmVhdGVFcXVhbGl0eUZuKHRydWUpO1xuICogY29uc3QgZGVlcEVxdWFsID0gY3JlYXRlRXF1YWxpdHlGbihmYWxzZSk7XG4gKlxuICogc2hhbGxvd0VxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7IC8vIGZhbHNlIChkaWZmZXJlbnQgb2JqZWN0cylcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAvLyB0cnVlIChzYW1lIHN0cnVjdHVyZSBhbmQgdmFsdWVzKVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Rm4odXNlU2hhbGxvd0NvbXBhcmlzb246IGJvb2xlYW4pIHtcbiAgcmV0dXJuIHVzZVNoYWxsb3dDb21wYXJpc29uID8gT2JqZWN0LmlzIDogZXF1YWw7XG59XG5cbi8qKlxuICogQ29yZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBiYXNpYyBTaWduYWxUcmVlLlxuICogVGhpcyBwcm92aWRlcyB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGVcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB0cmVlXG4gKiBAcmV0dXJucyBBIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IGNyZWF0ZSh7XG4gKiAgIGNvdW50OiAwLFxuICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9XG4gKiB9LCB7XG4gKiAgIHVzZUxhenlTaWduYWxzOiB0cnVlLFxuICogICB1c2VTaGFsbG93Q29tcGFyaXNvbjogZmFsc2VcbiAqIH0pO1xuICpcbiAqIC8vIEFjY2VzcyBuZXN0ZWQgc2lnbmFsc1xuICogY29uc29sZS5sb2codHJlZS4kLmNvdW50KCkpOyAvLyAwXG4gKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IFQsXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgY29uc3QgZXF1YWxpdHlGbiA9IGNyZWF0ZUVxdWFsaXR5Rm4oY29uZmlnLnVzZVNoYWxsb3dDb21wYXJpc29uID8/IGZhbHNlKTtcbiAgY29uc3QgdXNlTGF6eSA9IGNvbmZpZy51c2VMYXp5U2lnbmFscyA/PyB0cnVlOyAvLyBEZWZhdWx0IHRvIGxhenkgbG9hZGluZ1xuXG4gIC8vIENob29zZSBiZXR3ZWVuIGxhenkgYW5kIGVhZ2VyIHNpZ25hbCBjcmVhdGlvblxuICBjb25zdCBzaWduYWxTdGF0ZSA9IHVzZUxhenlcbiAgICA/IGNyZWF0ZUxhenlTaWduYWxUcmVlKG9iaiwgZXF1YWxpdHlGbilcbiAgICA6IGNyZWF0ZUVhZ2VyU2lnbmFsc0Zyb21PYmplY3Qob2JqLCBlcXVhbGl0eUZuKTtcblxuICBjb25zdCByZXN1bHRUcmVlID0ge1xuICAgIHN0YXRlOiBzaWduYWxTdGF0ZSxcbiAgICAkOiBzaWduYWxTdGF0ZSwgLy8gJCBwb2ludHMgdG8gdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gIH0gYXMgU2lnbmFsVHJlZTxUPjtcblxuICBlbmhhbmNlVHJlZShyZXN1bHRUcmVlKTtcbiAgcmV0dXJuIHJlc3VsdFRyZWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBlYWdlciBzaWduYWxzIGZyb20gYW4gb2JqZWN0IChub24tbGF6eSBhcHByb2FjaCkuXG4gKiBBbGwgc2lnbmFscyBhcmUgY3JlYXRlZCBpbW1lZGlhdGVseSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uXG4gKlxuICogQHRlbXBsYXRlIE8gLSBUaGUgb2JqZWN0IHR5cGUgdG8gY29udmVydCB0byBzaWduYWxzXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIHNpZ25hbHNcbiAqIEBwYXJhbSBlcXVhbGl0eUZuIC0gRnVuY3Rpb24gdG8gY29tcGFyZSB2YWx1ZXMgZm9yIGVxdWFsaXR5XG4gKiBAcmV0dXJucyBBIGRlZXBseSBzaWduYWxpZmllZCB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZWFnZXJTaWduYWxzID0gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdCh7XG4gKiAgIHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sXG4gKiAgIHNldHRpbmdzOiB7IHRoZW1lOiAnZGFyaycgfVxuICogfSwgT2JqZWN0LmlzKTtcbiAqXG4gKiAvLyBBbGwgc2lnbmFscyBhcmUgY3JlYXRlZCBpbW1lZGlhdGVseVxuICogZWFnZXJTaWduYWxzLnVzZXIubmFtZS5zZXQoJ0phbmUnKTtcbiAqIGNvbnNvbGUubG9nKGVhZ2VyU2lnbmFscy5zZXR0aW5ncy50aGVtZSgpKTsgLy8gJ2RhcmsnXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWFnZXJTaWduYWxzRnJvbU9iamVjdDxPIGV4dGVuZHMgU3RhdGVPYmplY3Q+KFxuICBvYmo6IE8sXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBEZWVwU2lnbmFsaWZ5PE8+IHtcbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgRGVlcFNpZ25hbGlmeTxPPjtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgY29uc3QgaXNPYmogPSAodjogdW5rbm93bik6IHYgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgICAgIHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsO1xuXG4gICAgaWYgKGlzT2JqKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgLy8gRm9yIG5lc3RlZCBvYmplY3RzLCBjcmVhdGUgbmVzdGVkIHNpZ25hbCBzdHJ1Y3R1cmUgZGlyZWN0bHlcbiAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBjcmVhdGVFYWdlclNpZ25hbHNGcm9tT2JqZWN0KFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAocmVzdWx0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIHRyZWUgd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5ICh1bndyYXAsIHVwZGF0ZSwgcGlwZSkuXG4gKiBBZGRzIGNvcmUgbWV0aG9kcyB0aGF0IGV2ZXJ5IFNpZ25hbFRyZWUgbmVlZHMgZm9yIGJhc2ljIG9wZXJhdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZVxuICogQHBhcmFtIHRyZWUgLSBUaGUgdHJlZSB0byBlbmhhbmNlIHdpdGggYmFzaWMgZnVuY3Rpb25hbGl0eVxuICogQHJldHVybnMgVGhlIGVuaGFuY2VkIHRyZWUgd2l0aCB1bndyYXAsIHVwZGF0ZSwgYW5kIHBpcGUgbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBiYXNpY1RyZWUgPSB7IHN0YXRlOiBzaWduYWxTdGF0ZSwgJDogc2lnbmFsU3RhdGUgfTtcbiAqIGVuaGFuY2VUcmVlKGJhc2ljVHJlZSk7XG4gKlxuICogLy8gTm93IGhhcyBiYXNpYyBtZXRob2RzOlxuICogY29uc3QgY3VycmVudFN0YXRlID0gYmFzaWNUcmVlLnVud3JhcCgpO1xuICogYmFzaWNUcmVlLnVwZGF0ZShzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKiBjb25zdCBlbmhhbmNlZFRyZWUgPSBiYXNpY1RyZWUucGlwZSh3aXRoU29tZUZlYXR1cmUoKSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgdHJlZTogU2lnbmFsVHJlZTxUPlxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIC8qKlxuICAgKiBVbndyYXBzIHRoZSBjdXJyZW50IHN0YXRlIGJ5IHJlYWRpbmcgYWxsIHNpZ25hbCB2YWx1ZXMuXG4gICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIHRoZSBzaWduYWwgdHJlZSBiYWNrIHRvIHBsYWluIEphdmFTY3JpcHQgdmFsdWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzdGF0ZSBhcyBhIHBsYWluIG9iamVjdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRyZWUgPSBzaWduYWxUcmVlKHtcbiAgICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9LFxuICAgKiAgIGNvdW50OiAwXG4gICAqIH0pO1xuICAgKlxuICAgKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICAgKiB0cmVlLiQuY291bnQuc2V0KDUpO1xuICAgKlxuICAgKiBjb25zdCBjdXJyZW50U3RhdGUgPSB0cmVlLnVud3JhcCgpO1xuICAgKiAvLyB7IHVzZXI6IHsgbmFtZTogJ0phbmUnLCBhZ2U6IDMwIH0sIGNvdW50OiA1IH1cbiAgICogYGBgXG4gICAqL1xuICB0cmVlLnVud3JhcCA9ICgpOiBUID0+IHtcbiAgICAvLyBSZWN1cnNpdmVseSB1bndyYXAgd2l0aCBwcm9wZXIgdHlwaW5nXG4gICAgY29uc3QgdW53cmFwT2JqZWN0ID0gPE8gZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICBvYmo6IERlZXBTaWduYWxpZnk8Tz5cbiAgICApOiBPID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBOZXN0ZWQgc2lnbmFsIHN0YXRlXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB1bndyYXBPYmplY3QoXG4gICAgICAgICAgICB2YWx1ZSBhcyBEZWVwU2lnbmFsaWZ5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIE87XG4gICAgfTtcblxuICAgIHJldHVybiB1bndyYXBPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3RhdGUgdXNpbmcgYW4gdXBkYXRlciBmdW5jdGlvbi5cbiAgICogVGhlIHVwZGF0ZXIgcmVjZWl2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgYW5kIHJldHVybnMgYSBwYXJ0aWFsIHVwZGF0ZS5cbiAgICogQXV0b21hdGljYWxseSBoYW5kbGVzIG5lc3RlZCBzaWduYWwgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXIgLSBGdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGN1cnJlbnQgc3RhdGUgYW5kIHJldHVybnMgcGFydGlhbCB1cGRhdGVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdHJlZSA9IHNpZ25hbFRyZWUoe1xuICAgKiAgIHVzZXI6IHsgbmFtZTogJ0pvaG4nLCBhZ2U6IDMwIH0sXG4gICAqICAgY291bnQ6IDAsXG4gICAqICAgdG9kb3M6IFtdXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBTaW1wbGUgdXBkYXRlXG4gICAqIHRyZWUudXBkYXRlKHN0YXRlID0+ICh7IGNvdW50OiBzdGF0ZS5jb3VudCArIDEgfSkpO1xuICAgKlxuICAgKiAvLyBOZXN0ZWQgdXBkYXRlXG4gICAqIHRyZWUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAqICAgdXNlcjogeyAuLi5zdGF0ZS51c2VyLCBhZ2U6IHN0YXRlLnVzZXIuYWdlICsgMSB9LFxuICAgKiAgIHRvZG9zOiBbLi4uc3RhdGUudG9kb3MsIHsgaWQ6IDEsIHRleHQ6ICdOZXcgdG9kbycgfV1cbiAgICogfSkpO1xuICAgKlxuICAgKiAvLyBDb25kaXRpb25hbCB1cGRhdGVcbiAgICogdHJlZS51cGRhdGUoc3RhdGUgPT5cbiAgICogICBzdGF0ZS5jb3VudCA8IDEwXG4gICAqICAgICA/IHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9XG4gICAqICAgICA6IHsgY291bnQ6IDAsIHVzZXI6IHsgLi4uc3RhdGUudXNlciwgbmFtZTogJ1Jlc2V0JyB9IH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB0cmVlLnVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRyZWUudW53cmFwKCk7XG4gICAgY29uc3QgcGFydGlhbE9iaiA9IHVwZGF0ZXIoY3VycmVudFZhbHVlKTtcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHVwZGF0ZSB3aXRoIGJldHRlciB0eXBpbmdcbiAgICBjb25zdCB1cGRhdGVPYmplY3QgPSA8TyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICAgIHRhcmdldDogRGVlcFNpZ25hbGlmeTxPPixcbiAgICAgIHVwZGF0ZXM6IFBhcnRpYWw8Tz5cbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodXBkYXRlcywga2V5KSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSB1cGRhdGVzW2tleV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTaWduYWxPclN0YXRlID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwoY3VycmVudFNpZ25hbE9yU3RhdGUpKSB7XG4gICAgICAgICAgLy8gRGlyZWN0IHNpZ25hbCB1cGRhdGVcbiAgICAgICAgICAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh1cGRhdGVWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIHVwZGF0ZVZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHVwZGF0ZVZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodXBkYXRlVmFsdWUpICYmXG4gICAgICAgICAgdHlwZW9mIGN1cnJlbnRTaWduYWxPclN0YXRlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIGN1cnJlbnRTaWduYWxPclN0YXRlICE9PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgLSByZWN1cnNlXG4gICAgICAgICAgdXBkYXRlT2JqZWN0KFxuICAgICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgRGVlcFNpZ25hbGlmeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgICAgICAgICB1cGRhdGVWYWx1ZSBhcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdXBkYXRlT2JqZWN0KHRyZWUuc3RhdGUgYXMgRGVlcFNpZ25hbGlmeTxUPiwgcGFydGlhbE9iaik7XG4gIH07XG5cbiAgLy8gUGlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgZnVuY3Rpb24gY29tcG9zaXRpb24gd2l0aCBpbXByb3ZlZCB0eXBlIHNhZmV0eVxuICB0cmVlLnBpcGUgPSAoKFxuICAgIC4uLmZuczogQXJyYXk8KGlucHV0OiBhbnkpID0+IGFueT4gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IGFueSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIC8vIFR5cGUtc2FmZSByZWR1Y2UgLSB0aGUgcmV0dXJuIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3ZlcmxvYWQgc2lnbmF0dXJlXG4gICAgcmV0dXJuIGZucy5yZWR1Y2UoKGFjYywgZm4pID0+IGZuKGFjYyksIHRyZWUpO1xuICB9KSBhcyBTaWduYWxUcmVlPFQ+WydwaXBlJ107XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzICh3aWxsIGxvZyB3YXJuaW5ncylcbiAgdHJlZS5iYXRjaFVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYmF0Y2hVcGRhdGUoKSBjYWxsZWQgYnV0IGJhdGNoaW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGJhdGNoIHVwZGF0ZXMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYmF0Y2hpbmcnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjazogSnVzdCBjYWxsIHVwZGF0ZSBkaXJlY3RseVxuICAgIHRyZWUudXBkYXRlKHVwZGF0ZXIpO1xuICB9O1xuXG4gIHRyZWUubWVtb2l6ZSA9IDxSPihmbjogKHRyZWU6IFQpID0+IFIsIGNhY2hlS2V5Pzogc3RyaW5nKTogU2lnbmFsPFI+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIG1lbW9pemUoKSBjYWxsZWQgYnV0IG1lbW9pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1lbW9pemVkIGNvbXB1dGF0aW9ucywgaW5zdGFsbCBAc2lnbmFsdHJlZS9tZW1vaXphdGlvbidcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBVc2Ugc2ltcGxlIEFuZ3VsYXIgY29tcHV0ZWQgd2l0aG91dCBtZW1vaXphdGlvblxuICAgIHZvaWQgY2FjaGVLZXk7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICB9O1xuXG4gIHRyZWUuZWZmZWN0ID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3QoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudHMgd2l0aG91dCBpbmplY3Rpb24gY29udGV4dFxuICAgICAgY29uc29sZS53YXJuKCdFZmZlY3QgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5zdWJzY3JpYmUgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICBlZmZlY3RSZWYuZGVzdHJveSgpO1xuICAgICAgfTtcblxuICAgICAgZGVzdHJveVJlZi5vbkRlc3Ryb3kodW5zdWJzY3JpYmUpO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudCAtIGNhbGwgb25jZSBpbW1lZGlhdGVseVxuICAgICAgY29uc29sZS53YXJuKCdTdWJzY3JpYmUgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICAgIGZuKHRyZWUudW53cmFwKCkpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gTm8tb3AgdW5zdWJzY3JpYmVcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBwZXJmb3JtYW5jZSBmZWF0dXJlc1xuICB0cmVlLm9wdGltaXplID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gb3B0aW1pemUoKSBjYWxsZWQgYnV0IHRyZWUgb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgb3B0aW1pemF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gY2xlYXJDYWNoZSgpIGNhbGxlZCBidXQgY2FjaGluZyBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGNhY2hpbmcsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmludmFsaWRhdGVQYXR0ZXJuID0gKCk6IG51bWJlciA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBpbnZhbGlkYXRlUGF0dGVybigpIGNhbGxlZCBidXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBhdHRlcm4gaW52YWxpZGF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgIC8vIEJhc2ljIGNsZWFudXAgZm9yIG5vbi1lbmhhbmNlZCB0cmVlc1xuICAgIGNvbnNvbGUubG9nKCdbTUVNT1JZLUNMRUFOVVBdIEJhc2ljIHRyZWUgZGVzdHJveWVkJyk7XG4gIH07XG5cbiAgdHJlZS5nZXRNZXRyaWNzID0gKCk6IFBlcmZvcm1hbmNlTWV0cmljcyA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBnZXRNZXRyaWNzKCkgY2FsbGVkIGJ1dCBwZXJmb3JtYW5jZSB0cmFja2luZyBpcyBub3QgZW5hYmxlZC4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBwZXJmb3JtYW5jZSB0cmFja2luZywgaW5zdGFsbCBAc2lnbmFsdHJlZS9taWRkbGV3YXJlJ1xuICAgICk7XG4gICAgLy8gUmV0dXJuIG1pbmltYWwgbWV0cmljcyB3aGVuIHRyYWNraW5nIG5vdCBlbmFibGVkXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICBjb21wdXRhdGlvbnM6IDAsXG4gICAgICBjYWNoZUhpdHM6IDAsXG4gICAgICBjYWNoZU1pc3NlczogMCxcbiAgICAgIGF2ZXJhZ2VVcGRhdGVUaW1lOiAwLFxuICAgIH07XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIG1pZGRsZXdhcmVcbiAgdHJlZS5hZGRUYXAgPSAobWlkZGxld2FyZTogTWlkZGxld2FyZTxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYWRkVGFwKCkgY2FsbGVkIGJ1dCBtaWRkbGV3YXJlIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBtaWRkbGV3YXJlLCBpbnN0YWxsIEBzaWduYWx0cmVlL21pZGRsZXdhcmUnXG4gICAgKTtcbiAgICB2b2lkIG1pZGRsZXdhcmU7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgfTtcblxuICB0cmVlLnJlbW92ZVRhcCA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZW1vdmVUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1pZGRsZXdhcmUsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWlkZGxld2FyZSdcbiAgICApO1xuICAgIHZvaWQgaWQ7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgZW50aXR5IGhlbHBlcnNcbiAgdHJlZS5hc0NydWQgPSA8RSBleHRlbmRzIHsgaWQ6IHN0cmluZyB8IG51bWJlciB9PigpOiBFbnRpdHlIZWxwZXJzPEU+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGFzQ3J1ZCgpIGNhbGxlZCBidXQgZW50aXR5IGhlbHBlcnMgYXJlIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgZW50aXR5IGhlbHBlcnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvZW50aXRpZXMnXG4gICAgKTtcbiAgICByZXR1cm4ge30gYXMgRW50aXR5SGVscGVyczxFPjtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYXN5bmMgYWN0aW9uc1xuICB0cmVlLmFzeW5jQWN0aW9uID0gPFRJbnB1dCwgVFJlc3VsdD4oXG4gICAgb3BlcmF0aW9uOiAoaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTxUUmVzdWx0PixcbiAgICBjb25maWc6IEFzeW5jQWN0aW9uQ29uZmlnPFQsIFRSZXN1bHQ+ID0ge31cbiAgKTogQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PiA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBhc3luY0FjdGlvbigpIGNhbGxlZCBidXQgYXN5bmMgYWN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBhc3luYyBhY3Rpb25zLCBpbnN0YWxsIEBzaWduYWx0cmVlL2FzeW5jJ1xuICAgICk7XG4gICAgdm9pZCBvcGVyYXRpb247XG4gICAgdm9pZCBjb25maWc7XG4gICAgcmV0dXJuIHt9IGFzIEFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD47XG4gIH07XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIHRpbWUgdHJhdmVsXG4gIHRyZWUudW5kbyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHVuZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLnJlZG8gPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZWRvKCkgY2FsbGVkIGJ1dCB0aW1lIHRyYXZlbCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHRpbWUgdHJhdmVsLCBpbnN0YWxsIEBzaWduYWx0cmVlL3RpbWUtdHJhdmVsJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5nZXRIaXN0b3J5ID0gKCk6IFRpbWVUcmF2ZWxFbnRyeTxUPltdID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGdldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgICByZXR1cm4gW107XG4gIH07XG5cbiAgdHJlZS5yZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyByZXNldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBVQkxJQyBBUElcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggc21hcnQgcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQuXG4gKlxuICogRmVhdHVyZXMgYXV0by1lbmFibGUgb24gZmlyc3QgdXNlLiBVc2VzIGludGVsbGlnZW50IGRlZmF1bHRzIGJhc2VkIG9uXG4gKiBlbnZpcm9ubWVudCAoZGV2ZWxvcG1lbnQgdnMgcHJvZHVjdGlvbikuIE5vIGNvbmZ1c2luZyB3YXJuaW5ncyBvclxuICogZmFrZSBpbXBsZW1lbnRhdGlvbnMgLSBldmVyeXRoaW5nIGp1c3Qgd29ya3MhXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSB3aXRoIGF1dG8tZW5hYmxpbmcgZmVhdHVyZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCwgdXNlcnM6IFtdIH0pO1xuICpcbiAqIC8vIENvcmUgZnVuY3Rpb25hbGl0eSBhbHdheXMgd29ya3NcbiAqIHRyZWUuc3RhdGUuY291bnQuc2V0KDUpO1xuICogdHJlZS51cGRhdGUoc3RhdGUgPT4gKHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKlxuICogLy8gQ29tcG9zaXRpb24gd2l0aCBwaXBlXG4gKiB0cmVlLnBpcGUoXG4gKiAgIHdpdGhCYXRjaGluZygpLFxuICogICB3aXRoTWVtb2l6YXRpb24oKSxcbiAqICAgd2l0aFRpbWVUcmF2ZWwoKVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUIGV4dGVuZHMgU3RhdGVPYmplY3Q+KG9iajogVCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggcHJlc2V0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVXNlcyBwcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gc2NlbmFyaW9zIHdoaWxlIHN0aWxsXG4gKiBhbGxvd2luZyBmZWF0dXJlcyB0byBhdXRvLWVuYWJsZSBhcyBuZWVkZWQuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBwcmVzZXQgLSBQcmVzZXQgY29uZmlndXJhdGlvbiAoJ2Jhc2ljJywgJ3BlcmZvcm1hbmNlJywgJ2RldmVsb3BtZW50JywgJ3Byb2R1Y3Rpb24nKVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZXNldFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBPcHRpbWl6ZWQgZm9yIHByb2R1Y3Rpb25cbiAqIGNvbnN0IHByb2RUcmVlID0gc2lnbmFsVHJlZShzdGF0ZSwgJ3Byb2R1Y3Rpb24nKTtcbiAqXG4gKiAvLyBGdWxsIGRlYnVnZ2luZyBjYXBhYmlsaXRpZXNcbiAqIGNvbnN0IGRldlRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCAnZGV2ZWxvcG1lbnQnKTtcbiAqXG4gKiAvLyBNYXhpbXVtIHBlcmZvcm1hbmNlXG4gKiBjb25zdCBwZXJmVHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsICdwZXJmb3JtYW5jZScpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQgZXh0ZW5kcyBTdGF0ZU9iamVjdD4oXG4gIG9iajogVCxcbiAgcHJlc2V0OiBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFByb3ZpZGVzIGZ1bGwgY29udHJvbCBvdmVyIGZlYXR1cmUgZW5hYmxlbWVudCB3aGlsZSBtYWludGFpbmluZ1xuICogYXV0by1lbmFibGluZyBiZWhhdmlvciBmb3IgdW5zcGVjaWZpZWQgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUsIG11c3QgZXh0ZW5kIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBjb25maWcgLSBDdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb25cbiAqIGNvbnN0IGN1c3RvbVRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCB7XG4gKiAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAqICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gKiAgIG1heENhY2hlU2l6ZTogNTAwLFxuICogICB0cmVlTmFtZTogJ015QXBwJ1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBjb25maWc6IFRyZWVDb25maWdcbik6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNpZ25hbFRyZWUgZmFjdG9yeSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFN0YXRlT2JqZWN0PihcbiAgb2JqOiBULFxuICBjb25maWdPclByZXNldD86IFRyZWVDb25maWcgfCBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgLy8gSGFuZGxlIHByZXNldCBzdHJpbmdzXG4gIGlmICh0eXBlb2YgY29uZmlnT3JQcmVzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBQcmVzZXQgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gQHNpZ25hbHRyZWUvY29yZS4nLFxuICAgICAgJ1xcblRvIHVzZSBwcmVzZXRzLCBpbnN0YWxsIEBzaWduYWx0cmVlL3ByZXNldHMnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjayB0byBiYXNpYyBjb25maWd1cmF0aW9uXG4gICAgcmV0dXJuIGNyZWF0ZShvYmosIHt9KTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjb25maWd1cmF0aW9uIG9iamVjdHMgb3IgZGVmYXVsdCAoc21hcnQgZW5oYW5jZW1lbnQpXG4gIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ09yUHJlc2V0IHx8IHt9O1xuICByZXR1cm4gY3JlYXRlKG9iaiwgY29uZmlnKTtcbn1cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFsdHJlZS1jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js","../tmp-esm2022/lib/types.js","../tmp-esm2022/signaltree-core.js"],"sourcesContent":["/**\n * SignalTree Utility Functions - Recursive Typing Implementation\n *\n * COPYRIGHT NOTICE:\n * This file contains proprietary utility functions for the recursive typing system.\n * The createLazySignalTree function and built-in object detection methods are\n * protected intellectual property of Jonathan D Borgia.\n *\n * Licensed under Fair Source License - see LICENSE file for complete terms.\n */\nimport { signal, isSignal } from '@angular/core';\n/**\n * Enhanced equality function inspired by the monolithic implementation.\n * Uses deep equality for arrays and objects, === for primitives.\n * Optimized with early exits and type-specific comparisons.\n */\nexport function equal(a, b) {\n // Fast path for reference equality\n if (a === b)\n return true;\n // Handle null/undefined cases\n if (a == null || b == null)\n return a === b;\n // Type check first - most efficient early exit\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB)\n return false;\n // For primitives, === check above is sufficient\n if (typeA !== 'object')\n return false;\n // Handle arrays with optimized comparison\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length)\n return false;\n return a.every((item, index) => equal(item, b[index]));\n }\n // Arrays check above handles array vs object mismatch\n if (Array.isArray(b))\n return false;\n // Handle objects with optimized comparison\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key) => key in objB && equal(objA[key], objB[key]));\n}\n/**\n * Creates a terminal signal with the enhanced equality function.\n * This should be used instead of Angular's signal() when you want\n * the same deep equality behavior as signalTree.\n *\n * Inspired by the monolithic implementation's terminal signal creation.\n */\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\n/**\n * LRU Cache implementation for efficient memory management\n */\nclass LRUCache {\n maxSize;\n cache = new Map();\n constructor(maxSize) {\n this.maxSize = maxSize;\n }\n set(key, value) {\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n // Remove if exists to update position\n this.cache.delete(key);\n this.cache.set(key, value); // Add to end (most recent)\n }\n get(key) {\n const value = this.cache.get(key);\n if (value !== undefined) {\n // Move to end (mark as recently used)\n this.cache.delete(key);\n this.cache.set(key, value);\n }\n return value;\n }\n clear() {\n this.cache.clear();\n }\n size() {\n return this.cache.size;\n }\n}\n// Path parsing cache with proper LRU eviction strategy\nconst MAX_CACHE_SIZE = 1000;\nconst pathCache = new LRUCache(MAX_CACHE_SIZE);\n/**\n * Parses a dot-notation path into an array of keys with LRU memoization.\n * Critical for performance when accessing nested properties frequently.\n * Includes proper LRU cache management to prevent memory leaks.\n *\n * @example\n * ```typescript\n * const keys1 = parsePath('user.name'); // Splits and caches\n * const keys2 = parsePath('user.name'); // Returns cached result\n * ```\n */\nexport function parsePath(path) {\n const cached = pathCache.get(path);\n if (cached) {\n return cached;\n }\n const parts = path.split('.');\n pathCache.set(path, parts);\n return parts;\n}\n/**\n * Creates a lazy signal tree using Proxy for on-demand signal creation.\n * Only creates signals when properties are first accessed, providing\n * massive memory savings for large state objects.\n * Uses WeakMap for memory-safe caching.\n *\n * @param obj - Source object to lazily signalify\n * @param equalityFn - Equality function for signal comparison\n * @param basePath - Base path for nested objects (internal use)\n * @returns Proxied object that creates signals on first access\n */\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n // Use Map instead of WeakMap for better control over cleanup\n const signalCache = new Map();\n const nestedProxies = new Map();\n // Track cleanup functions for nested proxies\n const nestedCleanups = new Map();\n // Enhanced cleanup function\n const cleanup = () => {\n // Clean up all nested proxies first\n nestedCleanups.forEach((cleanupFn) => {\n try {\n cleanupFn();\n }\n catch (error) {\n console.warn('Error during nested cleanup:', error);\n }\n });\n nestedCleanups.clear();\n // Clear caches\n signalCache.clear();\n nestedProxies.clear();\n };\n // Enhanced built-in object detection\n const isBuiltInObject = (v) => {\n if (v === null || v === undefined)\n return false;\n return (v instanceof Date ||\n v instanceof RegExp ||\n typeof v === 'function' ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n v instanceof Error ||\n v instanceof Promise ||\n v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File));\n };\n const proxy = new Proxy(obj, {\n get(target, prop) {\n // Handle cleanup method\n if (prop === '__cleanup__') {\n return cleanup;\n }\n // Handle symbol properties (like Symbol.iterator) normally\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n // Handle inspection methods\n if (prop === 'valueOf' || prop === 'toString') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n // Safety check for property existence\n if (!(key in target)) {\n return undefined;\n }\n const value = target[key];\n // If it's already a signal, return it\n if (isSignal(value)) {\n return value;\n }\n // Check if we already have a signal for this path\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n // Check if we have a nested proxy cached\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\n // Handle nested objects - create lazy proxy\n if (value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !isSignal(value) &&\n !isBuiltInObject(value)) {\n try {\n const nestedProxy = createLazySignalTree(value, equalityFn, path);\n nestedProxies.set(path, nestedProxy);\n // Store cleanup function for nested proxy\n const proxyWithCleanup = nestedProxy;\n if (typeof proxyWithCleanup.__cleanup__ === 'function') {\n nestedCleanups.set(path, proxyWithCleanup.__cleanup__);\n }\n return nestedProxy;\n }\n catch (error) {\n console.warn(`Failed to create lazy proxy for path \"${path}\":`, error);\n // Fallback: create a signal for the object\n const fallbackSignal = signal(value, ...(ngDevMode ? [{ debugName: \"fallbackSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, fallbackSignal);\n return fallbackSignal;\n }\n }\n // Create signal for primitive values, arrays, and built-in objects\n try {\n const newSignal = signal(value, ...(ngDevMode ? [{ debugName: \"newSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, newSignal);\n return newSignal;\n }\n catch (error) {\n console.warn(`Failed to create signal for path \"${path}\":`, error);\n return value; // Return raw value as fallback\n }\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') {\n target[prop] = value;\n return true;\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n try {\n // Update the original object\n target[key] = value;\n // If we have a cached signal, update it\n const cachedSignal = signalCache.get(path);\n if (cachedSignal && 'set' in cachedSignal) {\n cachedSignal.set(value);\n }\n // Clear nested proxy cache if the value type changed\n if (nestedProxies.has(path)) {\n // Clean up the nested proxy\n const nestedCleanup = nestedCleanups.get(path);\n if (nestedCleanup) {\n nestedCleanup();\n nestedCleanups.delete(path);\n }\n nestedProxies.delete(path);\n }\n return true;\n }\n catch (error) {\n console.warn(`Failed to set value for path \"${path}\":`, error);\n return false;\n }\n },\n has(target, prop) {\n return prop in target;\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n });\n return proxy;\n}\n/**\n * Native deep equality check for arrays and objects.\n * Handles all common cases that lodash.isEqual handles for our use cases.\n */\nexport function deepEqual(a, b) {\n // Same reference or primitives\n if (a === b)\n return true;\n // Handle null/undefined\n if (a == null || b == null)\n return false;\n // Different types\n if (typeof a !== typeof b)\n return false;\n // Handle dates\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i]))\n return false;\n }\n return true;\n }\n // Handle objects (but not arrays, dates, or other special objects)\n if (typeof a === 'object' &&\n typeof b === 'object' &&\n !Array.isArray(a) &&\n !Array.isArray(b) &&\n !(a instanceof Date) &&\n !(b instanceof Date)) {\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (!(key in objB))\n return false;\n if (!deepEqual(objA[key], objB[key]))\n return false;\n }\n return true;\n }\n // For all other cases (primitives that aren't equal)\n return false;\n}\n/**\n * Shallow equality check for objects and arrays.\n */\nexport function shallowEqual(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length)\n return false;\n for (const key of keysA) {\n if (a[key] !==\n b[key])\n return false;\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFJLENBQUksRUFBRSxDQUFJO0lBQ2pDLG1DQUFtQztJQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFekIsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUzQywrQ0FBK0M7SUFDL0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRWxDLGdEQUFnRDtJQUNoRCxJQUFJLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFckMsMENBQTBDO0lBQzFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM3RCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFbkMsMkNBQTJDO0lBQzNDLE1BQU0sSUFBSSxHQUFHLENBQTRCLENBQUM7SUFDMUMsTUFBTSxJQUFJLEdBQUcsQ0FBNEIsQ0FBQztJQUUxQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFaEQsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsS0FBUSxFQUNSLFdBQXFDO0lBRXJDLE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNuQixLQUFLLEVBQUUsV0FBVyxJQUFJLEtBQUs7S0FDNUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxRQUFRO0lBR1E7SUFGWixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVEsQ0FBQztJQUVoQyxZQUFvQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7SUFFdkMsR0FBRyxDQUFDLEdBQU0sRUFBRSxLQUFRO1FBQ2xCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hELElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUNELHNDQUFzQztRQUN0QyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQywyQkFBMkI7SUFDekQsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFNO1FBQ1IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQUVELHVEQUF1RDtBQUN2RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxRQUFRLENBQW1CLGNBQWMsQ0FBQyxDQUFDO0FBRWpFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVk7SUFDcEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0IsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsR0FBTSxFQUNOLFVBQStDLEVBQy9DLFFBQVEsR0FBRyxFQUFFO0lBRWIsNkRBQTZEO0lBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBQy9ELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBRWpELDZDQUE2QztJQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUVyRCw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1FBQ25CLG9DQUFvQztRQUNwQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDO2dCQUNILFNBQVMsRUFBRSxDQUFDO1lBQ2QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFdkIsZUFBZTtRQUNmLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsQ0FBQyxDQUFDO0lBRUYscUNBQXFDO0lBQ3JDLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBVSxFQUFXLEVBQUU7UUFDOUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEQsT0FBTyxDQUNMLENBQUMsWUFBWSxJQUFJO1lBQ2pCLENBQUMsWUFBWSxNQUFNO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLFVBQVU7WUFDdkIsQ0FBQyxZQUFZLEdBQUc7WUFDaEIsQ0FBQyxZQUFZLEdBQUc7WUFDaEIsQ0FBQyxZQUFZLE9BQU87WUFDcEIsQ0FBQyxZQUFZLE9BQU87WUFDcEIsQ0FBQyxZQUFZLFdBQVc7WUFDeEIsQ0FBQyxZQUFZLFFBQVE7WUFDckIsQ0FBQyxZQUFZLEtBQUs7WUFDbEIsQ0FBQyxZQUFZLE9BQU87WUFDcEIsQ0FBQyxZQUFZLEdBQUc7WUFDaEIsQ0FBQyxZQUFZLGVBQWU7WUFDNUIsQ0FBQyxZQUFZLFFBQVE7WUFDckIsQ0FBQyxZQUFZLElBQUk7WUFDakIsQ0FBQyxPQUFPLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUNuRCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQzNCLEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBcUI7WUFDdkMsd0JBQXdCO1lBQ3hCLElBQUksSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUMzQixPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1lBRUQsMkRBQTJEO1lBQzNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQVEsTUFBMkMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBRUQsNEJBQTRCO1lBQzVCLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzlDLE9BQVEsTUFBMkMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBYyxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUVuRCxzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBSSxNQUFrQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXZELHNDQUFzQztZQUN0QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxrREFBa0Q7WUFDbEQsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBRUQseUNBQXlDO1lBQ3pDLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsQ0FBQztZQUVELDRDQUE0QztZQUM1QyxJQUNFLEtBQUs7Z0JBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFDekIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDckIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUNoQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFDdkIsQ0FBQztnQkFDRCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQ3RDLEtBQWdDLEVBQ2hDLFVBQVUsRUFDVixJQUFJLENBQ0wsQ0FBQztvQkFFRixhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFFckMsMENBQTBDO29CQUMxQyxNQUFNLGdCQUFnQixHQUFHLFdBQTJDLENBQUM7b0JBQ3JFLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFLENBQUM7d0JBQ3ZELGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUN6RCxDQUFDO29CQUVELE9BQU8sV0FBVyxDQUFDO2dCQUNyQixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FDVix5Q0FBeUMsSUFBSSxJQUFJLEVBQ2pELEtBQUssQ0FDTixDQUFDO29CQUNGLDJDQUEyQztvQkFDM0MsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssa0RBQUksS0FBSyxFQUFFLFVBQVUsT0FBbkIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUMsQ0FBQztvQkFDNUQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7b0JBQ3RDLE9BQU8sY0FBYyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUVELG1FQUFtRTtZQUNuRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssNkNBQUksS0FBSyxFQUFFLFVBQVUsT0FBbkIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUMsQ0FBQztnQkFDdkQsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2pDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtZQUMvQyxDQUFDO1FBQ0gsQ0FBQztRQUVELEdBQUcsQ0FBQyxNQUFjLEVBQUUsSUFBcUIsRUFBRSxLQUFjO1lBQ3ZELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzVCLE1BQTJDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUMzRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFjLENBQUM7WUFDM0IsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBRW5ELElBQUksQ0FBQztnQkFDSCw2QkFBNkI7Z0JBQzVCLE1BQWtDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUVqRCx3Q0FBd0M7Z0JBQ3hDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNDLElBQUksWUFBWSxJQUFJLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDekMsWUFBd0MsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7Z0JBRUQscURBQXFEO2dCQUNyRCxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDNUIsNEJBQTRCO29CQUM1QixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQyxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixhQUFhLEVBQUUsQ0FBQzt3QkFDaEIsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDOUIsQ0FBQztvQkFDRCxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUVELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsSUFBSSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUk7WUFDZCxPQUFPLElBQUksSUFBSSxNQUFNLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sQ0FBQyxNQUFNO1lBQ1osT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsSUFBSTtZQUNuQyxPQUFPLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEQsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBeUIsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNyQywrQkFBK0I7SUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXpCLHdCQUF3QjtJQUN4QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV6QyxrQkFBa0I7SUFDbEIsSUFBSSxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUV4QyxlQUFlO0lBQ2YsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUMzQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsSUFDRSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQ3JCLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFDckIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLEVBQ3BCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxDQUE0QixDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLENBQTRCLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWhELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDckQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUksQ0FBSSxFQUFFLENBQUk7SUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXpDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQ0csQ0FBNkIsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDO2dCQUVuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIFV0aWxpdHkgRnVuY3Rpb25zIC0gUmVjdXJzaXZlIFR5cGluZyBJbXBsZW1lbnRhdGlvblxuICpcbiAqIENPUFlSSUdIVCBOT1RJQ0U6XG4gKiBUaGlzIGZpbGUgY29udGFpbnMgcHJvcHJpZXRhcnkgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSByZWN1cnNpdmUgdHlwaW5nIHN5c3RlbS5cbiAqIFRoZSBjcmVhdGVMYXp5U2lnbmFsVHJlZSBmdW5jdGlvbiBhbmQgYnVpbHQtaW4gb2JqZWN0IGRldGVjdGlvbiBtZXRob2RzIGFyZVxuICogcHJvdGVjdGVkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBKb25hdGhhbiBEIEJvcmdpYS5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBGYWlyIFNvdXJjZSBMaWNlbnNlIC0gc2VlIExJQ0VOU0UgZmlsZSBmb3IgY29tcGxldGUgdGVybXMuXG4gKi9cblxuaW1wb3J0IHsgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCwgaXNTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRGVlcFNpZ25hbGlmeSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEVuaGFuY2VkIGVxdWFsaXR5IGZ1bmN0aW9uIGluc3BpcmVkIGJ5IHRoZSBtb25vbGl0aGljIGltcGxlbWVudGF0aW9uLlxuICogVXNlcyBkZWVwIGVxdWFsaXR5IGZvciBhcnJheXMgYW5kIG9iamVjdHMsID09PSBmb3IgcHJpbWl0aXZlcy5cbiAqIE9wdGltaXplZCB3aXRoIGVhcmx5IGV4aXRzIGFuZCB0eXBlLXNwZWNpZmljIGNvbXBhcmlzb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWw8VD4oYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAvLyBGYXN0IHBhdGggZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkIGNhc2VzXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcblxuICAvLyBUeXBlIGNoZWNrIGZpcnN0IC0gbW9zdCBlZmZpY2llbnQgZWFybHkgZXhpdFxuICBjb25zdCB0eXBlQSA9IHR5cGVvZiBhO1xuICBjb25zdCB0eXBlQiA9IHR5cGVvZiBiO1xuICBpZiAodHlwZUEgIT09IHR5cGVCKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gRm9yIHByaW1pdGl2ZXMsID09PSBjaGVjayBhYm92ZSBpcyBzdWZmaWNpZW50XG4gIGlmICh0eXBlQSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggb3B0aW1pemVkIGNvbXBhcmlzb25cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikgfHwgYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gQXJyYXlzIGNoZWNrIGFib3ZlIGhhbmRsZXMgYXJyYXkgdnMgb2JqZWN0IG1pc21hdGNoXG4gIGlmIChBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBvcHRpbWl6ZWQgY29tcGFyaXNvblxuICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qgb2JqQiA9IGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4ga2V5c0EuZXZlcnkoKGtleSkgPT4ga2V5IGluIG9iakIgJiYgZXF1YWwob2JqQVtrZXldLCBvYmpCW2tleV0pKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVybWluYWwgc2lnbmFsIHdpdGggdGhlIGVuaGFuY2VkIGVxdWFsaXR5IGZ1bmN0aW9uLlxuICogVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIEFuZ3VsYXIncyBzaWduYWwoKSB3aGVuIHlvdSB3YW50XG4gKiB0aGUgc2FtZSBkZWVwIGVxdWFsaXR5IGJlaGF2aW9yIGFzIHNpZ25hbFRyZWUuXG4gKlxuICogSW5zcGlyZWQgYnkgdGhlIG1vbm9saXRoaWMgaW1wbGVtZW50YXRpb24ncyB0ZXJtaW5hbCBzaWduYWwgY3JlYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXJtaW5hbFNpZ25hbDxUPihcbiAgdmFsdWU6IFQsXG4gIGN1c3RvbUVxdWFsPzogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW5cbik6IFdyaXRhYmxlU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIHNpZ25hbCh2YWx1ZSwge1xuICAgIGVxdWFsOiBjdXN0b21FcXVhbCB8fCBlcXVhbCxcbiAgfSk7XG59XG5cbi8qKlxuICogTFJVIENhY2hlIGltcGxlbWVudGF0aW9uIGZvciBlZmZpY2llbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAqL1xuY2xhc3MgTFJVQ2FjaGU8SywgVj4ge1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxLLCBWPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyKSB7fVxuXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FjaGUuc2l6ZSA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgaWYgZXhpc3RzIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7IC8vIEFkZCB0byBlbmQgKG1vc3QgcmVjZW50KVxuICB9XG5cbiAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTW92ZSB0byBlbmQgKG1hcmsgYXMgcmVjZW50bHkgdXNlZClcbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhY2hlLnNpemU7XG4gIH1cbn1cblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIHdpdGggcHJvcGVyIExSVSBldmljdGlvbiBzdHJhdGVneVxuY29uc3QgTUFYX0NBQ0hFX1NJWkUgPSAxMDAwO1xuY29uc3QgcGF0aENhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgc3RyaW5nW10+KE1BWF9DQUNIRV9TSVpFKTtcblxuLyoqXG4gKiBQYXJzZXMgYSBkb3Qtbm90YXRpb24gcGF0aCBpbnRvIGFuIGFycmF5IG9mIGtleXMgd2l0aCBMUlUgbWVtb2l6YXRpb24uXG4gKiBDcml0aWNhbCBmb3IgcGVyZm9ybWFuY2Ugd2hlbiBhY2Nlc3NpbmcgbmVzdGVkIHByb3BlcnRpZXMgZnJlcXVlbnRseS5cbiAqIEluY2x1ZGVzIHByb3BlciBMUlUgY2FjaGUgbWFuYWdlbWVudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qga2V5czEgPSBwYXJzZVBhdGgoJ3VzZXIubmFtZScpOyAvLyBTcGxpdHMgYW5kIGNhY2hlc1xuICogY29uc3Qga2V5czIgPSBwYXJzZVBhdGgoJ3VzZXIubmFtZScpOyAvLyBSZXR1cm5zIGNhY2hlZCByZXN1bHRcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY2FjaGVkID0gcGF0aENhY2hlLmdldChwYXRoKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgcGF0aENhY2hlLnNldChwYXRoLCBwYXJ0cyk7XG4gIHJldHVybiBwYXJ0cztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSBzaWduYWwgdHJlZSB1c2luZyBQcm94eSBmb3Igb24tZGVtYW5kIHNpZ25hbCBjcmVhdGlvbi5cbiAqIE9ubHkgY3JlYXRlcyBzaWduYWxzIHdoZW4gcHJvcGVydGllcyBhcmUgZmlyc3QgYWNjZXNzZWQsIHByb3ZpZGluZ1xuICogbWFzc2l2ZSBtZW1vcnkgc2F2aW5ncyBmb3IgbGFyZ2Ugc3RhdGUgb2JqZWN0cy5cbiAqIFVzZXMgV2Vha01hcCBmb3IgbWVtb3J5LXNhZmUgY2FjaGluZy5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gU291cmNlIG9iamVjdCB0byBsYXppbHkgc2lnbmFsaWZ5XG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEVxdWFsaXR5IGZ1bmN0aW9uIGZvciBzaWduYWwgY29tcGFyaXNvblxuICogQHBhcmFtIGJhc2VQYXRoIC0gQmFzZSBwYXRoIGZvciBuZXN0ZWQgb2JqZWN0cyAoaW50ZXJuYWwgdXNlKVxuICogQHJldHVybnMgUHJveGllZCBvYmplY3QgdGhhdCBjcmVhdGVzIHNpZ25hbHMgb24gZmlyc3QgYWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXp5U2lnbmFsVHJlZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuICBlcXVhbGl0eUZuOiAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhbixcbiAgYmFzZVBhdGggPSAnJ1xuKTogRGVlcFNpZ25hbGlmeTxUPiB7XG4gIC8vIFVzZSBNYXAgaW5zdGVhZCBvZiBXZWFrTWFwIGZvciBiZXR0ZXIgY29udHJvbCBvdmVyIGNsZWFudXBcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICAvLyBUcmFjayBjbGVhbnVwIGZ1bmN0aW9ucyBmb3IgbmVzdGVkIHByb3hpZXNcbiAgY29uc3QgbmVzdGVkQ2xlYW51cHMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gdm9pZD4oKTtcblxuICAvLyBFbmhhbmNlZCBjbGVhbnVwIGZ1bmN0aW9uXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgLy8gQ2xlYW4gdXAgYWxsIG5lc3RlZCBwcm94aWVzIGZpcnN0XG4gICAgbmVzdGVkQ2xlYW51cHMuZm9yRWFjaCgoY2xlYW51cEZuKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjbGVhbnVwRm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgZHVyaW5nIG5lc3RlZCBjbGVhbnVwOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBuZXN0ZWRDbGVhbnVwcy5jbGVhcigpO1xuXG4gICAgLy8gQ2xlYXIgY2FjaGVzXG4gICAgc2lnbmFsQ2FjaGUuY2xlYXIoKTtcbiAgICBuZXN0ZWRQcm94aWVzLmNsZWFyKCk7XG4gIH07XG5cbiAgLy8gRW5oYW5jZWQgYnVpbHQtaW4gb2JqZWN0IGRldGVjdGlvblxuICBjb25zdCBpc0J1aWx0SW5PYmplY3QgPSAodjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHYgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICB2IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgICB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIE1hcCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFNldCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFdlYWtNYXAgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBXZWFrU2V0IHx8XG4gICAgICB2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBEYXRhVmlldyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgICB2IGluc3RhbmNlb2YgUHJvbWlzZSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8XG4gICAgICB2IGluc3RhbmNlb2YgQmxvYiB8fFxuICAgICAgKHR5cGVvZiBGaWxlICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZSlcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICAvLyBIYW5kbGUgY2xlYW51cCBtZXRob2RcbiAgICAgIGlmIChwcm9wID09PSAnX19jbGVhbnVwX18nKSB7XG4gICAgICAgIHJldHVybiBjbGVhbnVwO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3ltYm9sIHByb3BlcnRpZXMgKGxpa2UgU3ltYm9sLml0ZXJhdG9yKSBub3JtYWxseVxuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBpbnNwZWN0aW9uIG1ldGhvZHNcbiAgICAgIGlmIChwcm9wID09PSAndmFsdWVPZicgfHwgcHJvcCA9PT0gJ3RvU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHByb3AgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIC8vIFNhZmV0eSBjaGVjayBmb3IgcHJvcGVydHkgZXhpc3RlbmNlXG4gICAgICBpZiAoIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBhIHNpZ25hbCwgcmV0dXJuIGl0XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc2lnbmFsIGZvciB0aGlzIHBhdGhcbiAgICAgIGlmIChzaWduYWxDYWNoZS5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIG5lc3RlZCBwcm94eSBjYWNoZWRcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkUHJveGllcy5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgb2JqZWN0cyAtIGNyZWF0ZSBsYXp5IHByb3h5XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFByb3h5ID0gY3JlYXRlTGF6eVNpZ25hbFRyZWUoXG4gICAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIG5lc3RlZFByb3hpZXMuc2V0KHBhdGgsIG5lc3RlZFByb3h5KTtcblxuICAgICAgICAgIC8vIFN0b3JlIGNsZWFudXAgZnVuY3Rpb24gZm9yIG5lc3RlZCBwcm94eVxuICAgICAgICAgIGNvbnN0IHByb3h5V2l0aENsZWFudXAgPSBuZXN0ZWRQcm94eSBhcyB7IF9fY2xlYW51cF9fPzogKCkgPT4gdm9pZCB9O1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJveHlXaXRoQ2xlYW51cC5fX2NsZWFudXBfXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cHMuc2V0KHBhdGgsIHByb3h5V2l0aENsZWFudXAuX19jbGVhbnVwX18pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBuZXN0ZWRQcm94eTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBsYXp5IHByb3h5IGZvciBwYXRoIFwiJHtwYXRofVwiOmAsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IGNyZWF0ZSBhIHNpZ25hbCBmb3IgdGhlIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrU2lnbmFsID0gc2lnbmFsKHZhbHVlLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pO1xuICAgICAgICAgIHNpZ25hbENhY2hlLnNldChwYXRoLCBmYWxsYmFja1NpZ25hbCk7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU2lnbmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBzaWduYWwgZm9yIHByaW1pdGl2ZSB2YWx1ZXMsIGFycmF5cywgYW5kIGJ1aWx0LWluIG9iamVjdHNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld1NpZ25hbCA9IHNpZ25hbCh2YWx1ZSwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KTtcbiAgICAgICAgc2lnbmFsQ2FjaGUuc2V0KHBhdGgsIG5ld1NpZ25hbCk7XG4gICAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlOyAvLyBSZXR1cm4gcmF3IHZhbHVlIGFzIGZhbGxiYWNrXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93bikge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+KVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gcHJvcCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBwYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW5hbCBvYmplY3RcbiAgICAgICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2lnbmFsLCB1cGRhdGUgaXRcbiAgICAgICAgY29uc3QgY2FjaGVkU2lnbmFsID0gc2lnbmFsQ2FjaGUuZ2V0KHBhdGgpO1xuICAgICAgICBpZiAoY2FjaGVkU2lnbmFsICYmICdzZXQnIGluIGNhY2hlZFNpZ25hbCkge1xuICAgICAgICAgIChjYWNoZWRTaWduYWwgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBuZXN0ZWQgcHJveHkgY2FjaGUgaWYgdGhlIHZhbHVlIHR5cGUgY2hhbmdlZFxuICAgICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbmVzdGVkIHByb3h5XG4gICAgICAgICAgY29uc3QgbmVzdGVkQ2xlYW51cCA9IG5lc3RlZENsZWFudXBzLmdldChwYXRoKTtcbiAgICAgICAgICBpZiAobmVzdGVkQ2xlYW51cCkge1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cCgpO1xuICAgICAgICAgICAgbmVzdGVkQ2xlYW51cHMuZGVsZXRlKHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXN0ZWRQcm94aWVzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2V0IHZhbHVlIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoYXModGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcblxuICAgIG93bktleXModGFyZ2V0KSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHRhcmdldCk7XG4gICAgfSxcblxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBwcm94eSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xufVxuXG4vKipcbiAqIE5hdGl2ZSBkZWVwIGVxdWFsaXR5IGNoZWNrIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4gKiBIYW5kbGVzIGFsbCBjb21tb24gY2FzZXMgdGhhdCBsb2Rhc2guaXNFcXVhbCBoYW5kbGVzIGZvciBvdXIgdXNlIGNhc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgLy8gU2FtZSByZWZlcmVuY2Ugb3IgcHJpbWl0aXZlc1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG5cbiAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gRGlmZmVyZW50IHR5cGVzXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHJldHVybiBmYWxzZTtcblxuICAvLyBIYW5kbGUgZGF0ZXNcbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheXNcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSGFuZGxlIG9iamVjdHMgKGJ1dCBub3QgYXJyYXlzLCBkYXRlcywgb3Igb3RoZXIgc3BlY2lhbCBvYmplY3RzKVxuICBpZiAoXG4gICAgdHlwZW9mIGEgPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIGIgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoYSkgJiZcbiAgICAhQXJyYXkuaXNBcnJheShiKSAmJlxuICAgICEoYSBpbnN0YW5jZW9mIERhdGUpICYmXG4gICAgIShiIGluc3RhbmNlb2YgRGF0ZSlcbiAgKSB7XG4gICAgY29uc3Qgb2JqQSA9IGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb2JqQiA9IGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgICAgaWYgKCEoa2V5IGluIG9iakIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWRlZXBFcXVhbChvYmpBW2tleV0sIG9iakJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBGb3IgYWxsIG90aGVyIGNhc2VzIChwcmltaXRpdmVzIHRoYXQgYXJlbid0IGVxdWFsKVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0VxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3Qga2V5c0EgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzQSkge1xuICAgICAgaWYgKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSAhPT1cbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==","/**\n * SignalTree Core Implementation - Recursive Typing Engine\n *\n * COPYRIGHT NOTICE:\n * This file contains the proprietary recursive typing implementation protected\n * under the SignalTree license. The signal-store pattern, recursive type-runtime\n * alignment, and \"initiation defines structure\" paradigm are exclusive intellectual\n * property of Jonathan D Borgia.\n *\n * The createSignalStore and createLazySignalTree functions implement patented\n * approaches to recursive type preservation that are strictly protected.\n *\n * Licensed under Fair Source License - see LICENSE file for complete terms.\n */\nimport { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\n/**\n * Creates an equality function based on configuration.\n *\n * @param useShallowComparison - If true, uses Object.is for comparison; otherwise uses deep equality\n * @returns A function that compares two values for equality\n *\n * @example\n * ```typescript\n * const shallowEqual = createEqualityFn(true);\n * const deepEqual = createEqualityFn(false);\n *\n * shallowEqual({ a: 1 }, { a: 1 }); // false (different objects)\n * deepEqual({ a: 1 }, { a: 1 }); // true (same structure and values)\n * ```\n */\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\n/**\n * Core function to create a basic SignalTree with enhanced safety.\n * This provides the minimal functionality without advanced features.\n *\n * CRITICAL: Uses flexible typing - accepts ANY type T, not T\n *\n * @template T - The state object type (NO constraints - maximum flexibility)\n * @param obj - The initial state object\n * @param config - Configuration options for the tree\n * @returns A basic SignalTree with core functionality\n *\n * @example\n * ```typescript\n * const tree = create({\n * count: 0,\n * user: { name: 'John', age: 30 },\n * items: [1, 2, 3],\n * metadata: new Map(), // Any object type!\n * fn: () => 'hello' // Even functions!\n * }, {\n * useLazySignals: true,\n * useShallowComparison: false\n * });\n *\n * // Access nested signals\n * console.log(tree.$.count()); // 0\n * tree.$.user.name.set('Jane');\n * ```\n */\nfunction create(obj, config = {}) {\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = config.useLazySignals ?? true;\n // Create signals using signal-store pattern for perfect type inference\n const signalState = useLazy\n ? createLazySignalTree(obj, equalityFn)\n : createSignalStore(obj, equalityFn);\n const resultTree = {\n state: signalState,\n $: signalState, // $ points to the same state object\n };\n enhanceTree(resultTree);\n return resultTree;\n}\n/**\n * Creates signals using signal-store pattern for perfect type inference.\n * This is the key function that preserves exact type relationships recursively.\n * Based on the original signal-store pattern that maintains type information.\n *\n * @template T - The object type to process (preserves exact type structure)\n * @param obj - The object to convert to signals\n * @param equalityFn - Function to compare values for equality\n * @returns A deeply signalified version maintaining exact type structure\n *\n * @example\n * ```typescript\n * const store = createSignalStore({\n * user: { name: 'John', age: 30 },\n * settings: { theme: 'dark' }\n * }, Object.is);\n *\n * // Perfect type inference maintained throughout\n * store.user.name.set('Jane');\n * console.log(store.settings.theme()); // 'dark'\n * ```\n */\nfunction createSignalStore(obj, equalityFn) {\n // Input validation\n if (obj === null || obj === undefined) {\n throw new Error('Cannot create signal store from null or undefined');\n }\n if (typeof obj !== 'object') {\n // For primitives, just return a signal\n return signal(obj, { equal: equalityFn });\n }\n const store = {};\n // Enhanced built-in object detection\n const isBuiltInObject = (v) => {\n if (v === null || v === undefined)\n return false;\n return (v instanceof Date ||\n v instanceof RegExp ||\n typeof v === 'function' ||\n v instanceof Map ||\n v instanceof Set ||\n v instanceof WeakMap ||\n v instanceof WeakSet ||\n v instanceof ArrayBuffer ||\n v instanceof DataView ||\n v instanceof Error ||\n v instanceof Promise ||\n v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File));\n };\n // Safe object iteration\n try {\n for (const [key, value] of Object.entries(obj)) {\n const isObj = (v) => typeof v === 'object' &&\n v !== null &&\n !Array.isArray(v) &&\n !isBuiltInObject(v);\n // Enhanced safety: Never double-wrap signals\n if (isSignal(value)) {\n store[key] = value;\n }\n else if (isObj(value)) {\n // CRITICAL: Recursive call with type preservation\n try {\n store[key] = createSignalStore(value, equalityFn);\n }\n catch (error) {\n console.warn(`Failed to create signal store for key \"${key}\":`, error);\n // Fallback: treat as primitive\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n else {\n // Create signal for primitives, arrays, and built-in objects\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n }\n catch (error) {\n throw new Error(`Failed to create signal store: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n return store;\n}\n/**\n * Enhances a tree with basic functionality (unwrap, update, pipe).\n * Adds core methods that every SignalTree needs for basic operation.\n *\n * @template T - The state object type\n * @param tree - The tree to enhance with basic functionality\n * @returns The enhanced tree with unwrap, update, and pipe methods\n *\n * @example\n * ```typescript\n * const basicTree = { state: signalState, $: signalState };\n * enhanceTree(basicTree);\n *\n * // Now has basic methods:\n * const currentState = basicTree.unwrap();\n * basicTree.update(state => ({ ...state, count: state.count + 1 }));\n * const enhancedTree = basicTree.pipe(withSomeFeature());\n * ```\n */\nfunction enhanceTree(tree) {\n /**\n * Unwraps the current state by reading all signal values.\n * Recursively converts the signal tree back to plain JavaScript values.\n *\n * @returns The current state as a plain object\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0\n * });\n *\n * tree.$.user.name.set('Jane');\n * tree.$.count.set(5);\n *\n * const currentState = tree.unwrap();\n * // { user: { name: 'Jane', age: 30 }, count: 5 }\n * ```\n */\n tree.unwrap = () => {\n // Recursively unwrap with proper typing\n const unwrapObject = (obj) => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n const result = {};\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n result[key] = value();\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n // Nested signal state\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n /**\n * Updates the state using an updater function.\n * The updater receives the current state and returns a partial update.\n * Automatically handles nested signal updates.\n *\n * @param updater - Function that receives current state and returns partial updates\n *\n * @example\n * ```typescript\n * const tree = signalTree({\n * user: { name: 'John', age: 30 },\n * count: 0,\n * todos: []\n * });\n *\n * // Simple update\n * tree.update(state => ({ count: state.count + 1 }));\n *\n * // Nested update\n * tree.update(state => ({\n * user: { ...state.user, age: state.user.age + 1 },\n * todos: [...state.todos, { id: 1, text: 'New todo' }]\n * }));\n *\n * // Conditional update\n * tree.update(state =>\n * state.count < 10\n * ? { count: state.count + 1 }\n * : { count: 0, user: { ...state.user, name: 'Reset' } }\n * );\n * ```\n */\n /**\n * Enhanced update with error handling and rollback capability\n */\n tree.update = (updater) => {\n const originalState = new Map();\n try {\n const currentValue = tree.unwrap();\n const partialObj = updater(currentValue);\n if (!partialObj || typeof partialObj !== 'object') {\n throw new Error('Updater must return an object');\n }\n // Recursively update with better error handling and rollback\n const updateObject = (target, updates, path = '') => {\n for (const key in updates) {\n if (!Object.prototype.hasOwnProperty.call(updates, key))\n continue;\n const updateValue = updates[key];\n const currentPath = path ? `${path}.${key}` : key;\n const currentSignalOrState = target[key];\n try {\n if (isSignal(currentSignalOrState)) {\n // Store original value for potential rollback\n const originalValue = currentSignalOrState();\n originalState.set(currentPath, originalValue);\n // Direct signal update\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null &&\n !isSignal(currentSignalOrState)) {\n // Nested object - recurse\n updateObject(currentSignalOrState, updateValue, currentPath);\n }\n else if (currentSignalOrState === undefined) {\n console.warn(`Cannot update non-existent path: ${currentPath}`);\n }\n }\n catch (error) {\n console.error(`Failed to update path \"${currentPath}\":`, error);\n // Continue with other updates rather than failing completely\n }\n }\n };\n updateObject(tree.state, partialObj);\n }\n catch (error) {\n // Rollback on error\n console.error('Update failed, attempting rollback:', error);\n try {\n // Attempt to restore original values\n for (const [path, originalValue] of originalState.entries()) {\n const pathParts = path.split('.');\n let current = tree.state;\n for (let i = 0; i < pathParts.length - 1; i++) {\n current = current[pathParts[i]];\n if (!current)\n break;\n }\n if (current &&\n isSignal(current[pathParts[pathParts.length - 1]])) {\n const signal = current[pathParts[pathParts.length - 1]];\n signal.set(originalValue);\n }\n }\n }\n catch (rollbackError) {\n console.error('Rollback failed:', rollbackError);\n }\n throw error;\n }\n };\n // Pipe implementation for function composition with improved type safety\n tree.pipe = ((...fns) => {\n if (fns.length === 0) {\n return tree;\n }\n // Type-safe reduce with proper function composition\n return fns.reduce((acc, fn) => {\n if (typeof fn !== 'function') {\n throw new Error('All pipe arguments must be functions');\n }\n return fn(acc);\n }, tree);\n });\n // Stub implementations for advanced features (will log warnings)\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', '\\nTo enable batch updates, install @signaltree/batching');\n // Fallback: Just call update directly\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', '\\nTo enable memoized computations, install @signaltree/memoization');\n // Fallback: Use simple Angular computed without memoization\n void cacheKey; // Mark as intentionally unused\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n // Fallback for test environments without injection context\n console.warn('Effect requires Angular injection context', error);\n }\n };\n tree.subscribe = (fn) => {\n try {\n const destroyRef = inject(DestroyRef);\n let isDestroyed = false;\n const effectRef = effect(() => {\n if (!isDestroyed) {\n fn(tree.unwrap());\n }\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n const unsubscribe = () => {\n isDestroyed = true;\n effectRef.destroy();\n };\n destroyRef.onDestroy(unsubscribe);\n return unsubscribe;\n }\n catch (error) {\n // Fallback for test environment - call once immediately\n console.warn('Subscribe requires Angular injection context', error);\n fn(tree.unwrap());\n return () => {\n // No-op unsubscribe\n };\n }\n };\n // Stub implementations for performance features\n tree.optimize = () => {\n console.warn('⚠️ optimize() called but tree optimization is not available.', '\\nTo enable optimization, install @signaltree/memoization');\n };\n tree.clearCache = () => {\n console.warn('⚠️ clearCache() called but caching is not available.', '\\nTo enable caching, install @signaltree/memoization');\n };\n tree.invalidatePattern = () => {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.', '\\nTo enable pattern invalidation, install @signaltree/memoization');\n return 0;\n };\n tree.destroy = () => {\n // Clean up lazy signal proxies if they exist\n const state = tree.state;\n if (state && typeof state === 'object' && '__cleanup__' in state) {\n state.__cleanup__();\n }\n // Basic cleanup for non-enhanced trees\n console.log('[MEMORY-CLEANUP] Basic tree destroyed');\n };\n tree.getMetrics = () => {\n console.warn('⚠️ getMetrics() called but performance tracking is not enabled.', '\\nTo enable performance tracking, install @signaltree/middleware');\n // Return minimal metrics when tracking not enabled\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n // Stub implementations for middleware\n tree.addTap = (middleware) => {\n console.warn('⚠️ addTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void middleware; // Mark as intentionally unused\n };\n tree.removeTap = (id) => {\n console.warn('⚠️ removeTap() called but middleware support is not available.', '\\nTo enable middleware, install @signaltree/middleware');\n void id; // Mark as intentionally unused\n };\n // Stub implementations for entity helpers\n tree.asCrud = () => {\n console.warn('⚠️ asCrud() called but entity helpers are not available.', '\\nTo enable entity helpers, install @signaltree/entities');\n return {};\n };\n // Stub implementations for async actions\n tree.asyncAction = (operation, config = {}) => {\n console.warn('⚠️ asyncAction() called but async actions are not available.', '\\nTo enable async actions, install @signaltree/async');\n void operation;\n void config;\n return {};\n };\n // Stub implementations for time travel\n tree.undo = () => {\n console.warn('⚠️ undo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.redo = () => {\n console.warn('⚠️ redo() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n tree.getHistory = () => {\n console.warn('⚠️ getHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n return [];\n };\n tree.resetHistory = () => {\n console.warn('⚠️ resetHistory() called but time travel is not available.', '\\nTo enable time travel, install @signaltree/time-travel');\n };\n return tree;\n}\nexport function signalTree(obj, configOrPreset) {\n // Handle preset strings\n if (typeof configOrPreset === 'string') {\n console.warn('⚠️ Preset configurations are not available in @signaltree/core.', '\\nTo use presets, install @signaltree/presets');\n // Fallback to basic configuration\n return create(obj, {});\n }\n // Handle configuration objects or default (smart enhancement)\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE9BQU8sRUFDTCxNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQWF2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXREOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxvQkFBNkI7SUFDckQsT0FBTyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsTUFBTSxDQUFJLEdBQU0sRUFBRSxTQUFxQixFQUFFO0lBQ2hELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQztJQUU5Qyx1RUFBdUU7SUFDdkUsTUFBTSxXQUFXLEdBQUcsT0FBTztRQUN6QixDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBYSxFQUFFLFVBQVUsQ0FBQztRQUNqRCxDQUFDLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXZDLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEtBQUssRUFBRSxXQUFXO1FBQ2xCLENBQUMsRUFBRSxXQUFXLEVBQUUsb0NBQW9DO0tBQ3BDLENBQUM7SUFFbkIsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFD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RUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FDViw0REFBNEQsRUFDNUQsMERBQTBELENBQzNELENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUF3SEQsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsR0FBTSxFQUNOLGNBQXdDO0lBRXhDLHdCQUF3QjtJQUN4QixJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsaUVBQWlFLEVBQ2pFLCtDQUErQyxDQUNoRCxDQUFDO1FBQ0Ysa0NBQWtDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsOERBQThEO0lBQzlELE1BQU0sTUFBTSxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNpZ25hbFRyZWUgQ29yZSBJbXBsZW1lbnRhdGlvbiAtIFJlY3Vyc2l2ZSBUeXBpbmcgRW5naW5lXG4gKlxuICogQ09QWVJJR0hUIE5PVElDRTpcbiAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcHJvcHJpZXRhcnkgcmVjdXJzaXZlIHR5cGluZyBpbXBsZW1lbnRhdGlvbiBwcm90ZWN0ZWRcbiAqIHVuZGVyIHRoZSBTaWduYWxUcmVlIGxpY2Vuc2UuIFRoZSBzaWduYWwtc3RvcmUgcGF0dGVybiwgcmVjdXJzaXZlIHR5cGUtcnVudGltZVxuICogYWxpZ25tZW50LCBhbmQgXCJpbml0aWF0aW9uIGRlZmluZXMgc3RydWN0dXJlXCIgcGFyYWRpZ20gYXJlIGV4Y2x1c2l2ZSBpbnRlbGxlY3R1YWxcbiAqIHByb3BlcnR5IG9mIEpvbmF0aGFuIEQgQm9yZ2lhLlxuICpcbiAqIFRoZSBjcmVhdGVTaWduYWxTdG9yZSBhbmQgY3JlYXRlTGF6eVNpZ25hbFRyZWUgZnVuY3Rpb25zIGltcGxlbWVudCBwYXRlbnRlZFxuICogYXBwcm9hY2hlcyB0byByZWN1cnNpdmUgdHlwZSBwcmVzZXJ2YXRpb24gdGhhdCBhcmUgc3RyaWN0bHkgcHJvdGVjdGVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEZhaXIgU291cmNlIExpY2Vuc2UgLSBzZWUgTElDRU5TRSBmaWxlIGZvciBjb21wbGV0ZSB0ZXJtcy5cbiAqL1xuXG5pbXBvcnQge1xuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgRGVzdHJveVJlZixcbiAgaXNTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUxhenlTaWduYWxUcmVlLCBlcXVhbCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gYmFzZWQgb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gdXNlU2hhbGxvd0NvbXBhcmlzb24gLSBJZiB0cnVlLCB1c2VzIE9iamVjdC5pcyBmb3IgY29tcGFyaXNvbjsgb3RoZXJ3aXNlIHVzZXMgZGVlcCBlcXVhbGl0eVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byB2YWx1ZXMgZm9yIGVxdWFsaXR5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHNoYWxsb3dFcXVhbCA9IGNyZWF0ZUVxdWFsaXR5Rm4odHJ1ZSk7XG4gKiBjb25zdCBkZWVwRXF1YWwgPSBjcmVhdGVFcXVhbGl0eUZuKGZhbHNlKTtcbiAqXG4gKiBzaGFsbG93RXF1YWwoeyBhOiAxIH0sIHsgYTogMSB9KTsgLy8gZmFsc2UgKGRpZmZlcmVudCBvYmplY3RzKVxuICogZGVlcEVxdWFsKHsgYTogMSB9LCB7IGE6IDEgfSk7IC8vIHRydWUgKHNhbWUgc3RydWN0dXJlIGFuZCB2YWx1ZXMpXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXF1YWxpdHlGbih1c2VTaGFsbG93Q29tcGFyaXNvbjogYm9vbGVhbikge1xuICByZXR1cm4gdXNlU2hhbGxvd0NvbXBhcmlzb24gPyBPYmplY3QuaXMgOiBlcXVhbDtcbn1cblxuLyoqXG4gKiBDb3JlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBlbmhhbmNlZCBzYWZldHkuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBtaW5pbWFsIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBhZHZhbmNlZCBmZWF0dXJlcy5cbiAqXG4gKiBDUklUSUNBTDogVXNlcyBmbGV4aWJsZSB0eXBpbmcgLSBhY2NlcHRzIEFOWSB0eXBlIFQsIG5vdCBUXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgc3RhdGUgb2JqZWN0IHR5cGUgKE5PIGNvbnN0cmFpbnRzIC0gbWF4aW11bSBmbGV4aWJpbGl0eSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSB0cmVlXG4gKiBAcmV0dXJucyBBIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBjb3JlIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgdHJlZSA9IGNyZWF0ZSh7XG4gKiAgIGNvdW50OiAwLFxuICogICB1c2VyOiB7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9LFxuICogICBpdGVtczogWzEsIDIsIDNdLFxuICogICBtZXRhZGF0YTogbmV3IE1hcCgpLCAgLy8gQW55IG9iamVjdCB0eXBlIVxuICogICBmbjogKCkgPT4gJ2hlbGxvJyAgICAgLy8gRXZlbiBmdW5jdGlvbnMhXG4gKiB9LCB7XG4gKiAgIHVzZUxhenlTaWduYWxzOiB0cnVlLFxuICogICB1c2VTaGFsbG93Q29tcGFyaXNvbjogZmFsc2VcbiAqIH0pO1xuICpcbiAqIC8vIEFjY2VzcyBuZXN0ZWQgc2lnbmFsc1xuICogY29uc29sZS5sb2codHJlZS4kLmNvdW50KCkpOyAvLyAwXG4gKiB0cmVlLiQudXNlci5uYW1lLnNldCgnSmFuZScpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUPihvYmo6IFQsIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9KTogU2lnbmFsVHJlZTxUPiB7XG4gIGNvbnN0IGVxdWFsaXR5Rm4gPSBjcmVhdGVFcXVhbGl0eUZuKGNvbmZpZy51c2VTaGFsbG93Q29tcGFyaXNvbiA/PyBmYWxzZSk7XG4gIGNvbnN0IHVzZUxhenkgPSBjb25maWcudXNlTGF6eVNpZ25hbHMgPz8gdHJ1ZTtcblxuICAvLyBDcmVhdGUgc2lnbmFscyB1c2luZyBzaWduYWwtc3RvcmUgcGF0dGVybiBmb3IgcGVyZmVjdCB0eXBlIGluZmVyZW5jZVxuICBjb25zdCBzaWduYWxTdGF0ZSA9IHVzZUxhenlcbiAgICA/IGNyZWF0ZUxhenlTaWduYWxUcmVlKG9iaiBhcyBvYmplY3QsIGVxdWFsaXR5Rm4pXG4gICAgOiBjcmVhdGVTaWduYWxTdG9yZShvYmosIGVxdWFsaXR5Rm4pO1xuXG4gIGNvbnN0IHJlc3VsdFRyZWUgPSB7XG4gICAgc3RhdGU6IHNpZ25hbFN0YXRlLFxuICAgICQ6IHNpZ25hbFN0YXRlLCAvLyAkIHBvaW50cyB0byB0aGUgc2FtZSBzdGF0ZSBvYmplY3RcbiAgfSBhcyBTaWduYWxUcmVlPFQ+O1xuXG4gIGVuaGFuY2VUcmVlKHJlc3VsdFRyZWUpO1xuICByZXR1cm4gcmVzdWx0VHJlZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHNpZ25hbHMgdXNpbmcgc2lnbmFsLXN0b3JlIHBhdHRlcm4gZm9yIHBlcmZlY3QgdHlwZSBpbmZlcmVuY2UuXG4gKiBUaGlzIGlzIHRoZSBrZXkgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgZXhhY3QgdHlwZSByZWxhdGlvbnNoaXBzIHJlY3Vyc2l2ZWx5LlxuICogQmFzZWQgb24gdGhlIG9yaWdpbmFsIHNpZ25hbC1zdG9yZSBwYXR0ZXJuIHRoYXQgbWFpbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgb2JqZWN0IHR5cGUgdG8gcHJvY2VzcyAocHJlc2VydmVzIGV4YWN0IHR5cGUgc3RydWN0dXJlKVxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBzaWduYWxzXG4gKiBAcGFyYW0gZXF1YWxpdHlGbiAtIEZ1bmN0aW9uIHRvIGNvbXBhcmUgdmFsdWVzIGZvciBlcXVhbGl0eVxuICogQHJldHVybnMgQSBkZWVwbHkgc2lnbmFsaWZpZWQgdmVyc2lvbiBtYWludGFpbmluZyBleGFjdCB0eXBlIHN0cnVjdHVyZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdG9yZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKHtcbiAqICAgdXNlcjogeyBuYW1lOiAnSm9obicsIGFnZTogMzAgfSxcbiAqICAgc2V0dGluZ3M6IHsgdGhlbWU6ICdkYXJrJyB9XG4gKiB9LCBPYmplY3QuaXMpO1xuICpcbiAqIC8vIFBlcmZlY3QgdHlwZSBpbmZlcmVuY2UgbWFpbnRhaW5lZCB0aHJvdWdob3V0XG4gKiBzdG9yZS51c2VyLm5hbWUuc2V0KCdKYW5lJyk7XG4gKiBjb25zb2xlLmxvZyhzdG9yZS5zZXR0aW5ncy50aGVtZSgpKTsgLy8gJ2RhcmsnXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2lnbmFsU3RvcmU8VD4oXG4gIG9iajogVCxcbiAgZXF1YWxpdHlGbjogKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW5cbik6IERlZXBTaWduYWxpZnk8VD4ge1xuICAvLyBJbnB1dCB2YWxpZGF0aW9uXG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgc2lnbmFsIHN0b3JlIGZyb20gbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8vIEZvciBwcmltaXRpdmVzLCBqdXN0IHJldHVybiBhIHNpZ25hbFxuICAgIHJldHVybiBzaWduYWwob2JqLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG4gIH1cblxuICBjb25zdCBzdG9yZTogUGFydGlhbDxEZWVwU2lnbmFsaWZ5PFQ+PiA9IHt9O1xuXG4gIC8vIEVuaGFuY2VkIGJ1aWx0LWluIG9iamVjdCBkZXRlY3Rpb25cbiAgY29uc3QgaXNCdWlsdEluT2JqZWN0ID0gKHY6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiAoXG4gICAgICB2IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFJlZ0V4cCB8fFxuICAgICAgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBTZXQgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBXZWFrTWFwIHx8XG4gICAgICB2IGluc3RhbmNlb2YgV2Vha1NldCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICB2IGluc3RhbmNlb2YgRGF0YVZpZXcgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkwgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEJsb2IgfHxcbiAgICAgICh0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEZpbGUpXG4gICAgKTtcbiAgfTtcblxuICAvLyBTYWZlIG9iamVjdCBpdGVyYXRpb25cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBpc09iaiA9ICh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICAgICAgICB0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2KSAmJlxuICAgICAgICAhaXNCdWlsdEluT2JqZWN0KHYpO1xuXG4gICAgICAvLyBFbmhhbmNlZCBzYWZldHk6IE5ldmVyIGRvdWJsZS13cmFwIHNpZ25hbHNcbiAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqKHZhbHVlKSkge1xuICAgICAgICAvLyBDUklUSUNBTDogUmVjdXJzaXZlIGNhbGwgd2l0aCB0eXBlIHByZXNlcnZhdGlvblxuICAgICAgICB0cnkge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IGNyZWF0ZVNpZ25hbFN0b3JlKFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBlcXVhbGl0eUZuXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBzaWduYWwgc3RvcmUgZm9yIGtleSBcIiR7a2V5fVwiOmAsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IHRyZWF0IGFzIHByaW1pdGl2ZVxuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBzaWduYWwgZm9yIHByaW1pdGl2ZXMsIGFycmF5cywgYW5kIGJ1aWx0LWluIG9iamVjdHNcbiAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBzaWduYWwgc3RvcmU6ICR7XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InXG4gICAgICB9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gc3RvcmUgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIHRyZWUgd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5ICh1bndyYXAsIHVwZGF0ZSwgcGlwZSkuXG4gKiBBZGRzIGNvcmUgbWV0aG9kcyB0aGF0IGV2ZXJ5IFNpZ25hbFRyZWUgbmVlZHMgZm9yIGJhc2ljIG9wZXJhdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBzdGF0ZSBvYmplY3QgdHlwZVxuICogQHBhcmFtIHRyZWUgLSBUaGUgdHJlZSB0byBlbmhhbmNlIHdpdGggYmFzaWMgZnVuY3Rpb25hbGl0eVxuICogQHJldHVybnMgVGhlIGVuaGFuY2VkIHRyZWUgd2l0aCB1bndyYXAsIHVwZGF0ZSwgYW5kIHBpcGUgbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBiYXNpY1RyZWUgPSB7IHN0YXRlOiBzaWduYWxTdGF0ZSwgJDogc2lnbmFsU3RhdGUgfTtcbiAqIGVuaGFuY2VUcmVlKGJhc2ljVHJlZSk7XG4gKlxuICogLy8gTm93IGhhcyBiYXNpYyBtZXRob2RzOlxuICogY29uc3QgY3VycmVudFN0YXRlID0gYmFzaWNUcmVlLnVud3JhcCgpO1xuICogYmFzaWNUcmVlLnVwZGF0ZShzdGF0ZSA9PiAoeyAuLi5zdGF0ZSwgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKiBjb25zdCBlbmhhbmNlZFRyZWUgPSBiYXNpY1RyZWUucGlwZSh3aXRoU29tZUZlYXR1cmUoKSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VD4odHJlZTogU2lnbmFsVHJlZTxUPik6IFNpZ25hbFRyZWU8VD4ge1xuICAvKipcbiAgICogVW53cmFwcyB0aGUgY3VycmVudCBzdGF0ZSBieSByZWFkaW5nIGFsbCBzaWduYWwgdmFsdWVzLlxuICAgKiBSZWN1cnNpdmVseSBjb252ZXJ0cyB0aGUgc2lnbmFsIHRyZWUgYmFjayB0byBwbGFpbiBKYXZhU2NyaXB0IHZhbHVlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc3RhdGUgYXMgYSBwbGFpbiBvYmplY3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0cmVlID0gc2lnbmFsVHJlZSh7XG4gICAqICAgdXNlcjogeyBuYW1lOiAnSm9obicsIGFnZTogMzAgfSxcbiAgICogICBjb3VudDogMFxuICAgKiB9KTtcbiAgICpcbiAgICogdHJlZS4kLnVzZXIubmFtZS5zZXQoJ0phbmUnKTtcbiAgICogdHJlZS4kLmNvdW50LnNldCg1KTtcbiAgICpcbiAgICogY29uc3QgY3VycmVudFN0YXRlID0gdHJlZS51bndyYXAoKTtcbiAgICogLy8geyB1c2VyOiB7IG5hbWU6ICdKYW5lJywgYWdlOiAzMCB9LCBjb3VudDogNSB9XG4gICAqIGBgYFxuICAgKi9cbiAgdHJlZS51bndyYXAgPSAoKTogVCA9PiB7XG4gICAgLy8gUmVjdXJzaXZlbHkgdW53cmFwIHdpdGggcHJvcGVyIHR5cGluZ1xuICAgIGNvbnN0IHVud3JhcE9iamVjdCA9IDxPPihvYmo6IERlZXBTaWduYWxpZnk8Tz4pOiBPID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBPO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBOZXN0ZWQgc2lnbmFsIHN0YXRlXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB1bndyYXBPYmplY3QodmFsdWUgYXMgRGVlcFNpZ25hbGlmeTxvYmplY3Q+KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQgYXMgTztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHVud3JhcE9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSB1c2luZyBhbiB1cGRhdGVyIGZ1bmN0aW9uLlxuICAgKiBUaGUgdXBkYXRlciByZWNlaXZlcyB0aGUgY3VycmVudCBzdGF0ZSBhbmQgcmV0dXJucyBhIHBhcnRpYWwgdXBkYXRlLlxuICAgKiBBdXRvbWF0aWNhbGx5IGhhbmRsZXMgbmVzdGVkIHNpZ25hbCB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gdXBkYXRlciAtIEZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgY3VycmVudCBzdGF0ZSBhbmQgcmV0dXJucyBwYXJ0aWFsIHVwZGF0ZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0cmVlID0gc2lnbmFsVHJlZSh7XG4gICAqICAgdXNlcjogeyBuYW1lOiAnSm9obicsIGFnZTogMzAgfSxcbiAgICogICBjb3VudDogMCxcbiAgICogICB0b2RvczogW11cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFNpbXBsZSB1cGRhdGVcbiAgICogdHJlZS51cGRhdGUoc3RhdGUgPT4gKHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gICAqXG4gICAqIC8vIE5lc3RlZCB1cGRhdGVcbiAgICogdHJlZS51cGRhdGUoc3RhdGUgPT4gKHtcbiAgICogICB1c2VyOiB7IC4uLnN0YXRlLnVzZXIsIGFnZTogc3RhdGUudXNlci5hZ2UgKyAxIH0sXG4gICAqICAgdG9kb3M6IFsuLi5zdGF0ZS50b2RvcywgeyBpZDogMSwgdGV4dDogJ05ldyB0b2RvJyB9XVxuICAgKiB9KSk7XG4gICAqXG4gICAqIC8vIENvbmRpdGlvbmFsIHVwZGF0ZVxuICAgKiB0cmVlLnVwZGF0ZShzdGF0ZSA9PlxuICAgKiAgIHN0YXRlLmNvdW50IDwgMTBcbiAgICogICAgID8geyBjb3VudDogc3RhdGUuY291bnQgKyAxIH1cbiAgICogICAgIDogeyBjb3VudDogMCwgdXNlcjogeyAuLi5zdGF0ZS51c2VyLCBuYW1lOiAnUmVzZXQnIH0gfVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIC8qKlxuICAgKiBFbmhhbmNlZCB1cGRhdGUgd2l0aCBlcnJvciBoYW5kbGluZyBhbmQgcm9sbGJhY2sgY2FwYWJpbGl0eVxuICAgKi9cbiAgdHJlZS51cGRhdGUgPSAodXBkYXRlcjogKGN1cnJlbnQ6IFQpID0+IFBhcnRpYWw8VD4pID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbFN0YXRlID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdHJlZS51bndyYXAoKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxPYmogPSB1cGRhdGVyKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIGlmICghcGFydGlhbE9iaiB8fCB0eXBlb2YgcGFydGlhbE9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGRhdGVyIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWN1cnNpdmVseSB1cGRhdGUgd2l0aCBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgYW5kIHJvbGxiYWNrXG4gICAgICBjb25zdCB1cGRhdGVPYmplY3QgPSA8Tz4oXG4gICAgICAgIHRhcmdldDogRGVlcFNpZ25hbGlmeTxPPixcbiAgICAgICAgdXBkYXRlczogUGFydGlhbDxPPixcbiAgICAgICAgcGF0aCA9ICcnXG4gICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVwZGF0ZXMsIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSB1cGRhdGVzW2tleV07XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50U2lnbmFsT3JTdGF0ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnRTaWduYWxPclN0YXRlKSkge1xuICAgICAgICAgICAgICAvLyBTdG9yZSBvcmlnaW5hbCB2YWx1ZSBmb3IgcG90ZW50aWFsIHJvbGxiYWNrXG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSAoY3VycmVudFNpZ25hbE9yU3RhdGUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICAgICAgICBvcmlnaW5hbFN0YXRlLnNldChjdXJyZW50UGF0aCwgb3JpZ2luYWxWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgLy8gRGlyZWN0IHNpZ25hbCB1cGRhdGVcbiAgICAgICAgICAgICAgKGN1cnJlbnRTaWduYWxPclN0YXRlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQoXG4gICAgICAgICAgICAgICAgdXBkYXRlVmFsdWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB1cGRhdGVWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgdXBkYXRlVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodXBkYXRlVmFsdWUpICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBjdXJyZW50U2lnbmFsT3JTdGF0ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgIWlzU2lnbmFsKGN1cnJlbnRTaWduYWxPclN0YXRlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgLSByZWN1cnNlXG4gICAgICAgICAgICAgIHVwZGF0ZU9iamVjdChcbiAgICAgICAgICAgICAgICBjdXJyZW50U2lnbmFsT3JTdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PG9iamVjdD4sXG4gICAgICAgICAgICAgICAgdXBkYXRlVmFsdWUgYXMgUGFydGlhbDxvYmplY3Q+LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTaWduYWxPclN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBDYW5ub3QgdXBkYXRlIG5vbi1leGlzdGVudCBwYXRoOiAke2N1cnJlbnRQYXRofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHBhdGggXCIke2N1cnJlbnRQYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgdXBkYXRlcyByYXRoZXIgdGhhbiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHVwZGF0ZU9iamVjdCh0cmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD4sIHBhcnRpYWxPYmopO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSb2xsYmFjayBvbiBlcnJvclxuICAgICAgY29uc29sZS5lcnJvcignVXBkYXRlIGZhaWxlZCwgYXR0ZW1wdGluZyByb2xsYmFjazonLCBlcnJvcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZXNcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgb3JpZ2luYWxWYWx1ZV0gb2Ygb3JpZ2luYWxTdGF0ZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSB0cmVlLnN0YXRlO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoUGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhdGhQYXJ0c1tpXV07XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQpIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGlzU2lnbmFsKFxuICAgICAgICAgICAgICAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbXG4gICAgICAgICAgICAgICAgcGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBzaWduYWwgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbXG4gICAgICAgICAgICAgIHBhdGhQYXJ0c1twYXRoUGFydHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgIF0gYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gICAgICAgICAgICBzaWduYWwuc2V0KG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocm9sbGJhY2tFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdSb2xsYmFjayBmYWlsZWQ6Jywgcm9sbGJhY2tFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICAvLyBQaXBlIGltcGxlbWVudGF0aW9uIGZvciBmdW5jdGlvbiBjb21wb3NpdGlvbiB3aXRoIGltcHJvdmVkIHR5cGUgc2FmZXR5XG4gIHRyZWUucGlwZSA9ICg8VFJlc3VsdCA9IFNpZ25hbFRyZWU8VD4+KFxuICAgIC4uLmZuczogQXJyYXk8KGlucHV0OiB1bmtub3duKSA9PiB1bmtub3duPlxuICApOiBUUmVzdWx0ID0+IHtcbiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRyZWUgYXMgdW5rbm93biBhcyBUUmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFR5cGUtc2FmZSByZWR1Y2Ugd2l0aCBwcm9wZXIgZnVuY3Rpb24gY29tcG9zaXRpb25cbiAgICByZXR1cm4gZm5zLnJlZHVjZSgoYWNjLCBmbikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBwaXBlIGFyZ3VtZW50cyBtdXN0IGJlIGZ1bmN0aW9ucycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZuKGFjYyk7XG4gICAgfSwgdHJlZSBhcyB1bmtub3duKSBhcyBUUmVzdWx0O1xuICB9KSBhcyBTaWduYWxUcmVlPFQ+WydwaXBlJ107XG5cbiAgLy8gU3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzICh3aWxsIGxvZyB3YXJuaW5ncylcbiAgdHJlZS5iYXRjaFVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYmF0Y2hVcGRhdGUoKSBjYWxsZWQgYnV0IGJhdGNoaW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGJhdGNoIHVwZGF0ZXMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYmF0Y2hpbmcnXG4gICAgKTtcbiAgICAvLyBGYWxsYmFjazogSnVzdCBjYWxsIHVwZGF0ZSBkaXJlY3RseVxuICAgIHRyZWUudXBkYXRlKHVwZGF0ZXIpO1xuICB9O1xuXG4gIHRyZWUubWVtb2l6ZSA9IDxSPihmbjogKHRyZWU6IFQpID0+IFIsIGNhY2hlS2V5Pzogc3RyaW5nKTogU2lnbmFsPFI+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIG1lbW9pemUoKSBjYWxsZWQgYnV0IG1lbW9pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1lbW9pemVkIGNvbXB1dGF0aW9ucywgaW5zdGFsbCBAc2lnbmFsdHJlZS9tZW1vaXphdGlvbidcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBVc2Ugc2ltcGxlIEFuZ3VsYXIgY29tcHV0ZWQgd2l0aG91dCBtZW1vaXphdGlvblxuICAgIHZvaWQgY2FjaGVLZXk7IC8vIE1hcmsgYXMgaW50ZW50aW9uYWxseSB1bnVzZWRcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICB9O1xuXG4gIHRyZWUuZWZmZWN0ID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3QoKCkgPT4gZm4odHJlZS51bndyYXAoKSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudHMgd2l0aG91dCBpbmplY3Rpb24gY29udGV4dFxuICAgICAgY29uc29sZS53YXJuKCdFZmZlY3QgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5zdWJzY3JpYmUgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWlzRGVzdHJveWVkKSB7XG4gICAgICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICBlZmZlY3RSZWYuZGVzdHJveSgpO1xuICAgICAgfTtcblxuICAgICAgZGVzdHJveVJlZi5vbkRlc3Ryb3kodW5zdWJzY3JpYmUpO1xuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudCAtIGNhbGwgb25jZSBpbW1lZGlhdGVseVxuICAgICAgY29uc29sZS53YXJuKCdTdWJzY3JpYmUgcmVxdWlyZXMgQW5ndWxhciBpbmplY3Rpb24gY29udGV4dCcsIGVycm9yKTtcbiAgICAgIGZuKHRyZWUudW53cmFwKCkpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gTm8tb3AgdW5zdWJzY3JpYmVcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBwZXJmb3JtYW5jZSBmZWF0dXJlc1xuICB0cmVlLm9wdGltaXplID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gb3B0aW1pemUoKSBjYWxsZWQgYnV0IHRyZWUgb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgb3B0aW1pemF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gY2xlYXJDYWNoZSgpIGNhbGxlZCBidXQgY2FjaGluZyBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGNhY2hpbmcsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWVtb2l6YXRpb24nXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmludmFsaWRhdGVQYXR0ZXJuID0gKCk6IG51bWJlciA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBpbnZhbGlkYXRlUGF0dGVybigpIGNhbGxlZCBidXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBhdHRlcm4gaW52YWxpZGF0aW9uLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgIC8vIENsZWFuIHVwIGxhenkgc2lnbmFsIHByb3hpZXMgaWYgdGhleSBleGlzdFxuICAgIGNvbnN0IHN0YXRlID0gdHJlZS5zdGF0ZSBhcyB1bmtub3duO1xuICAgIGlmIChzdGF0ZSAmJiB0eXBlb2Ygc3RhdGUgPT09ICdvYmplY3QnICYmICdfX2NsZWFudXBfXycgaW4gc3RhdGUpIHtcbiAgICAgIChzdGF0ZSBhcyB7IF9fY2xlYW51cF9fOiAoKSA9PiB2b2lkIH0pLl9fY2xlYW51cF9fKCk7XG4gICAgfVxuXG4gICAgLy8gQmFzaWMgY2xlYW51cCBmb3Igbm9uLWVuaGFuY2VkIHRyZWVzXG4gICAgY29uc29sZS5sb2coJ1tNRU1PUlktQ0xFQU5VUF0gQmFzaWMgdHJlZSBkZXN0cm95ZWQnKTtcbiAgfTtcblxuICB0cmVlLmdldE1ldHJpY3MgPSAoKTogUGVyZm9ybWFuY2VNZXRyaWNzID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGdldE1ldHJpY3MoKSBjYWxsZWQgYnV0IHBlcmZvcm1hbmNlIHRyYWNraW5nIGlzIG5vdCBlbmFibGVkLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIHBlcmZvcm1hbmNlIHRyYWNraW5nLCBpbnN0YWxsIEBzaWduYWx0cmVlL21pZGRsZXdhcmUnXG4gICAgKTtcbiAgICAvLyBSZXR1cm4gbWluaW1hbCBtZXRyaWNzIHdoZW4gdHJhY2tpbmcgbm90IGVuYWJsZWRcbiAgICByZXR1cm4ge1xuICAgICAgdXBkYXRlczogMCxcbiAgICAgIGNvbXB1dGF0aW9uczogMCxcbiAgICAgIGNhY2hlSGl0czogMCxcbiAgICAgIGNhY2hlTWlzc2VzOiAwLFxuICAgICAgYXZlcmFnZVVwZGF0ZVRpbWU6IDAsXG4gICAgfTtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgbWlkZGxld2FyZVxuICB0cmVlLmFkZFRhcCA9IChtaWRkbGV3YXJlOiBNaWRkbGV3YXJlPFQ+KSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBhZGRUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIG1pZGRsZXdhcmUsIGluc3RhbGwgQHNpZ25hbHRyZWUvbWlkZGxld2FyZSdcbiAgICApO1xuICAgIHZvaWQgbWlkZGxld2FyZTsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICB9O1xuXG4gIHRyZWUucmVtb3ZlVGFwID0gKGlkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlbW92ZVRhcCgpIGNhbGxlZCBidXQgbWlkZGxld2FyZSBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgbWlkZGxld2FyZSwgaW5zdGFsbCBAc2lnbmFsdHJlZS9taWRkbGV3YXJlJ1xuICAgICk7XG4gICAgdm9pZCBpZDsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBlbnRpdHkgaGVscGVyc1xuICB0cmVlLmFzQ3J1ZCA9IDxFIGV4dGVuZHMgeyBpZDogc3RyaW5nIHwgbnVtYmVyIH0+KCk6IEVudGl0eUhlbHBlcnM8RT4gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gYXNDcnVkKCkgY2FsbGVkIGJ1dCBlbnRpdHkgaGVscGVycyBhcmUgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSBlbnRpdHkgaGVscGVycywgaW5zdGFsbCBAc2lnbmFsdHJlZS9lbnRpdGllcydcbiAgICApO1xuICAgIHJldHVybiB7fSBhcyBFbnRpdHlIZWxwZXJzPEU+O1xuICB9O1xuXG4gIC8vIFN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhc3luYyBhY3Rpb25zXG4gIHRyZWUuYXN5bmNBY3Rpb24gPSA8VElucHV0LCBUUmVzdWx0PihcbiAgICBvcGVyYXRpb246IChpbnB1dDogVElucHV0KSA9PiBQcm9taXNlPFRSZXN1bHQ+LFxuICAgIGNvbmZpZzogQXN5bmNBY3Rpb25Db25maWc8VCwgVFJlc3VsdD4gPSB7fVxuICApOiBBc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+ID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIGFzeW5jQWN0aW9uKCkgY2FsbGVkIGJ1dCBhc3luYyBhY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlLicsXG4gICAgICAnXFxuVG8gZW5hYmxlIGFzeW5jIGFjdGlvbnMsIGluc3RhbGwgQHNpZ25hbHRyZWUvYXN5bmMnXG4gICAgKTtcbiAgICB2b2lkIG9wZXJhdGlvbjtcbiAgICB2b2lkIGNvbmZpZztcbiAgICByZXR1cm4ge30gYXMgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PjtcbiAgfTtcblxuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgdGltZSB0cmF2ZWxcbiAgdHJlZS51bmRvID0gKCkgPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gdW5kbygpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICB9O1xuXG4gIHRyZWUucmVkbyA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICdcXG5UbyBlbmFibGUgdGltZSB0cmF2ZWwsIGluc3RhbGwgQHNpZ25hbHRyZWUvdGltZS10cmF2ZWwnXG4gICAgKTtcbiAgfTtcblxuICB0cmVlLmdldEhpc3RvcnkgPSAoKTogVGltZVRyYXZlbEVudHJ5PFQ+W10gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gZ2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICB0cmVlLnJlc2V0SGlzdG9yeSA9ICgpID0+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIHJlc2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nLFxuICAgICAgJ1xcblRvIGVuYWJsZSB0aW1lIHRyYXZlbCwgaW5zdGFsbCBAc2lnbmFsdHJlZS90aW1lLXRyYXZlbCdcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB0cmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVhY3RpdmUgc2lnbmFsIHRyZWUgd2l0aCBzbWFydCBwcm9ncmVzc2l2ZSBlbmhhbmNlbWVudC5cbiAqXG4gKiBNQVhJTVVNIEZMRVhJQklMSVRZOiBBY2NlcHRzIEFOWSB0eXBlIFQgLSBubyBTdGF0ZU9iamVjdCBjb25zdHJhaW50IVxuICogVGhpcyBpcyB0aGUga2V5IGRpZmZlcmVuY2UgZnJvbSBjb25zdHJhaW5lZCBhcHByb2FjaGVzLlxuICpcbiAqIEZlYXR1cmVzIGF1dG8tZW5hYmxlIG9uIGZpcnN0IHVzZS4gVXNlcyBpbnRlbGxpZ2VudCBkZWZhdWx0cyBiYXNlZCBvblxuICogZW52aXJvbm1lbnQgKGRldmVsb3BtZW50IHZzIHByb2R1Y3Rpb24pLiBFbmhhbmNlZCB3aXRoIHNhZmV0eSBmZWF0dXJlc1xuICogdG8gcHJldmVudCBjb21tb24gaXNzdWVzIGxpa2Ugc2lnbmFsIGRvdWJsZS13cmFwcGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIEFOWSB0eXBlIChubyBjb25zdHJhaW50cyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIHdpdGggYXV0by1lbmFibGluZyBmZWF0dXJlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBXb3JrcyB3aXRoIEFOWSBvYmplY3QgLSBubyBjb25zdHJhaW50cyFcbiAqIGNvbnN0IHRyZWUgPSBzaWduYWxUcmVlKHtcbiAqICAgY291bnQ6IDAsXG4gKiAgIHVzZXJzOiBbXSxcbiAqICAgbWV0YWRhdGE6IG5ldyBNYXAoKSwgIC8vIE5vbi1wbGFpbiBvYmplY3RzIHdvcmshXG4gKiAgIGZuOiAoKSA9PiAnaGVsbG8nLCAgICAvLyBGdW5jdGlvbnMgd29yayFcbiAqICAgc3ltYm9sOiBTeW1ib2woJ2lkJykgIC8vIFN5bWJvbHMgd29yayFcbiAqIH0pO1xuICpcbiAqIC8vIENvcmUgZnVuY3Rpb25hbGl0eSBhbHdheXMgd29ya3NcbiAqIHRyZWUuc3RhdGUuY291bnQuc2V0KDUpO1xuICogdHJlZS51cGRhdGUoc3RhdGUgPT4gKHsgY291bnQ6IHN0YXRlLmNvdW50ICsgMSB9KSk7XG4gKlxuICogLy8gQ29tcG9zaXRpb24gd2l0aCBwaXBlXG4gKiB0cmVlLnBpcGUoXG4gKiAgIHdpdGhCYXRjaGluZygpLFxuICogICB3aXRoTWVtb2l6YXRpb24oKSxcbiAqICAgd2l0aFRpbWVUcmF2ZWwoKVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQpOiBTaWduYWxUcmVlPFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aXRoIHByZXNldCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFVzZXMgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9ucyBmb3IgY29tbW9uIHNjZW5hcmlvcyB3aGlsZSBzdGlsbFxuICogYWxsb3dpbmcgZmVhdHVyZXMgdG8gYXV0by1lbmFibGUgYXMgbmVlZGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHN0YXRlIG9iamVjdCB0eXBlLCBtdXN0IGV4dGVuZCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICogQHBhcmFtIG9iaiAtIFRoZSBpbml0aWFsIHN0YXRlIG9iamVjdCB0byBjb252ZXJ0IGludG8gYSByZWFjdGl2ZSB0cmVlXG4gKiBAcGFyYW0gcHJlc2V0IC0gUHJlc2V0IGNvbmZpZ3VyYXRpb24gKCdiYXNpYycsICdwZXJmb3JtYW5jZScsICdkZXZlbG9wbWVudCcsICdwcm9kdWN0aW9uJylcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggdGhlIHNwZWNpZmllZCBwcmVzZXRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gT3B0aW1pemVkIGZvciBwcm9kdWN0aW9uXG4gKiBjb25zdCBwcm9kVHJlZSA9IHNpZ25hbFRyZWUoc3RhdGUsICdwcm9kdWN0aW9uJyk7XG4gKlxuICogLy8gRnVsbCBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzXG4gKiBjb25zdCBkZXZUcmVlID0gc2lnbmFsVHJlZShzdGF0ZSwgJ2RldmVsb3BtZW50Jyk7XG4gKlxuICogLy8gTWF4aW11bSBwZXJmb3JtYW5jZVxuICogY29uc3QgcGVyZlRyZWUgPSBzaWduYWxUcmVlKHN0YXRlLCAncGVyZm9ybWFuY2UnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQsIHByZXNldDogVHJlZVByZXNldCk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogUHJvdmlkZXMgZnVsbCBjb250cm9sIG92ZXIgZmVhdHVyZSBlbmFibGVtZW50IHdoaWxlIG1haW50YWluaW5nXG4gKiBhdXRvLWVuYWJsaW5nIGJlaGF2aW9yIGZvciB1bnNwZWNpZmllZCBmZWF0dXJlcy4gRW5oYW5jZWQgd2l0aCBzYWZldHkgZmVhdHVyZXMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBBTlkgdHlwZSAobm8gY29uc3RyYWludHMgZm9yIG1heGltdW0gZmxleGliaWxpdHkpXG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBjb25maWcgLSBDdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb24gLSB3b3JrcyB3aXRoIEFOWSBvYmplY3QhXG4gKiBjb25zdCBjdXN0b21UcmVlID0gc2lnbmFsVHJlZSh7XG4gKiAgIGRhdGE6IHN0YXRlLFxuICogICBtZXRhZGF0YTogbmV3IE1hcCgpLCAgLy8gQW55IG9iamVjdCB0eXBlXG4gKiAgIGZuOiAoKSA9PiAnY3VzdG9tJyAgICAvLyBFdmVuIGZ1bmN0aW9uc1xuICogfSwge1xuICogICBiYXRjaFVwZGF0ZXM6IHRydWUsXG4gKiAgIHVzZU1lbW9pemF0aW9uOiB0cnVlLFxuICogICBtYXhDYWNoZVNpemU6IDUwMCxcbiAqICAgdHJlZU5hbWU6ICdNeUFwcCdcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KG9iajogVCwgY29uZmlnOiBUcmVlQ29uZmlnKTogU2lnbmFsVHJlZTxUPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2lnbmFsVHJlZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICovXG4vKipcbiAqIE1haW4gU2lnbmFsVHJlZSBmYWN0b3J5IGZ1bmN0aW9uIHdpdGggc3VwZXJpb3IgdHlwZSBpbmZlcmVuY2VcbiAqXG4gKiBLZXkgaW1wcm92ZW1lbnRzIGZyb20gc2lnbmFsLXN0b3JlLnRzIGFwcHJvYWNoOlxuICogMS4gVXNlcyBSZXF1aXJlZDxUPiBmb3IgYmV0dGVyIHR5cGUgaW5mZXJlbmNlIHdoZW4gcG9zc2libGVcbiAqIDIuIE1haW50YWlucyBjb21wbGV0ZSB0eXBlIGluZm9ybWF0aW9uIHRocm91Z2ggcmVjdXJzaW9uXG4gKiAzLiBQcm9wZXIgaGFuZGxpbmcgb2YgbmVzdGVkIG9iamVjdHMgYW5kIGFycmF5c1xuICogNC4gTm8gdHlwZSBjb25zdHJhaW50cyAtIG1heGltdW0gZmxleGliaWxpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb2JqOiBSZXF1aXJlZDxUPixcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxSZXF1aXJlZDxUPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KFxuICBvYmo6IFQsXG4gIGNvbmZpZ09yUHJlc2V0PzogVHJlZUNvbmZpZyB8IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KFxuICBvYmo6IFQsXG4gIGNvbmZpZ09yUHJlc2V0PzogVHJlZUNvbmZpZyB8IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD4ge1xuICAvLyBIYW5kbGUgcHJlc2V0IHN0cmluZ3NcbiAgaWYgKHR5cGVvZiBjb25maWdPclByZXNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAn4pqg77iPIFByZXNldCBjb25maWd1cmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiBAc2lnbmFsdHJlZS9jb3JlLicsXG4gICAgICAnXFxuVG8gdXNlIHByZXNldHMsIGluc3RhbGwgQHNpZ25hbHRyZWUvcHJlc2V0cydcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrIHRvIGJhc2ljIGNvbmZpZ3VyYXRpb25cbiAgICByZXR1cm4gY3JlYXRlKG9iaiwge30pO1xuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBvciBkZWZhdWx0IChzbWFydCBlbmhhbmNlbWVudClcbiAgY29uc3QgY29uZmlnID0gY29uZmlnT3JQcmVzZXQgfHwge307XG4gIHJldHVybiBjcmVhdGUob2JqLCBjb25maWcpO1xufVxuIl19","/**\n * SignalTree Core Types - Recursive Typing System\n *\n * COPYRIGHT NOTICE:\n * This file contains proprietary recursive typing innovations protected under\n * the SignalTree license. The DeepSignalify<T> recursive type system and\n * related implementations are exclusive intellectual property of Jonathan D Borgia.\n *\n * Unauthorized extraction, copying, or reimplementation of these recursive typing\n * concepts is strictly prohibited and constitutes copyright infringement.\n *\n * Licensed under Fair Source License - see LICENSE file for complete terms.\n */\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIENvcmUgVHlwZXMgLSBSZWN1cnNpdmUgVHlwaW5nIFN5c3RlbVxuICpcbiAqIENPUFlSSUdIVCBOT1RJQ0U6XG4gKiBUaGlzIGZpbGUgY29udGFpbnMgcHJvcHJpZXRhcnkgcmVjdXJzaXZlIHR5cGluZyBpbm5vdmF0aW9ucyBwcm90ZWN0ZWQgdW5kZXJcbiAqIHRoZSBTaWduYWxUcmVlIGxpY2Vuc2UuIFRoZSBEZWVwU2lnbmFsaWZ5PFQ+IHJlY3Vyc2l2ZSB0eXBlIHN5c3RlbSBhbmRcbiAqIHJlbGF0ZWQgaW1wbGVtZW50YXRpb25zIGFyZSBleGNsdXNpdmUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIEpvbmF0aGFuIEQgQm9yZ2lhLlxuICpcbiAqIFVuYXV0aG9yaXplZCBleHRyYWN0aW9uLCBjb3B5aW5nLCBvciByZWltcGxlbWVudGF0aW9uIG9mIHRoZXNlIHJlY3Vyc2l2ZSB0eXBpbmdcbiAqIGNvbmNlcHRzIGlzIHN0cmljdGx5IHByb2hpYml0ZWQgYW5kIGNvbnN0aXR1dGVzIGNvcHlyaWdodCBpbmZyaW5nZW1lbnQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRmFpciBTb3VyY2UgTGljZW5zZSAtIHNlZSBMSUNFTlNFIGZpbGUgZm9yIGNvbXBsZXRlIHRlcm1zLlxuICovXG5cbmltcG9ydCB7IFdyaXRhYmxlU2lnbmFsLCBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBST1BSSUVUQVJZIFJFQ1VSU0lWRSBUWVBJTkcgU1lTVEVNXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgSm9uYXRoYW4gRCBCb3JnaWFcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTk8gTU9SRSBTdGF0ZU9iamVjdCBjb25zdHJhaW50IVxuICogV2UgZG9uJ3QgbmVlZCB0aGlzIGF0IGFsbCAtIHJlbW92ZSBpdCBvciBtYWtlIGl0IGFjY2VwdCBhbnl0aGluZ1xuICovXG4vLyBERUxFVEUgVEhJUzogZXhwb3J0IHR5cGUgU3RhdGVPYmplY3QgPSBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+O1xuLy8gUkVQTEFDRSBXSVRIOiBKdXN0IHVzZSBnZW5lcmljIFQgd2l0aCBubyBjb25zdHJhaW50c1xuXG4vKipcbiAqIFByaW1pdGl2ZSB0eXBlcyBmb3IgdHlwZSBjaGVja2luZ1xuICovXG5leHBvcnQgdHlwZSBQcmltaXRpdmUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgYmlnaW50XG4gIHwgc3ltYm9sO1xuXG4vKipcbiAqIEJ1aWx0LWluIG9iamVjdCB0eXBlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaW1pdGl2ZSB2YWx1ZXNcbiAqIEVuaGFuY2VkIGRldGVjdGlvbiBmb3IgYmV0dGVyIGVkZ2UgY2FzZSBoYW5kbGluZ1xuICovXG5leHBvcnQgdHlwZSBCdWlsdEluT2JqZWN0ID1cbiAgfCBEYXRlXG4gIHwgUmVnRXhwXG4gIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pXG4gIHwgTWFwPHVua25vd24sIHVua25vd24+XG4gIHwgU2V0PHVua25vd24+XG4gIHwgV2Vha01hcDxvYmplY3QsIHVua25vd24+XG4gIHwgV2Vha1NldDxvYmplY3Q+XG4gIHwgQXJyYXlCdWZmZXJcbiAgfCBEYXRhVmlld1xuICB8IEVycm9yXG4gIHwgUHJvbWlzZTx1bmtub3duPlxuICB8IFVSTFxuICB8IFVSTFNlYXJjaFBhcmFtc1xuICB8IEZvcm1EYXRhXG4gIHwgQmxvYlxuICB8IEZpbGU7XG5cbmV4cG9ydCB0eXBlIElzUHJpbWl0aXZlPFQ+ID0gVCBleHRlbmRzIFByaW1pdGl2ZSA/IHRydWUgOiBmYWxzZTtcbmV4cG9ydCB0eXBlIElzQnVpbHRJbk9iamVjdDxUPiA9IFQgZXh0ZW5kcyBCdWlsdEluT2JqZWN0ID8gdHJ1ZSA6IGZhbHNlO1xuXG4vKipcbiAqIFNpZ25hbCBkZXRlY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgSXNTaWduYWw8VD4gPSBUIGV4dGVuZHMgU2lnbmFsPHVua25vd24+ID8gdHJ1ZSA6IGZhbHNlO1xuZXhwb3J0IHR5cGUgSXNXcml0YWJsZVNpZ25hbDxUPiA9IFQgZXh0ZW5kcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPlxuICA/IHRydWVcbiAgOiBmYWxzZTtcblxuLyoqXG4gKiBFbmhhbmNlZCBEZWVwU2lnbmFsaWZ5IHdpdGggYmV0dGVyIGVkZ2UgY2FzZSBoYW5kbGluZ1xuICogTmV2ZXIgZG91YmxlLXdyYXBzIHNpZ25hbHMgYW5kIHByb3Blcmx5IGhhbmRsZXMgZnVuY3Rpb25zIGFuZCBidWlsdC1pbiBvYmplY3RzXG4gKi9cbmV4cG9ydCB0eXBlIERlZXBTaWduYWxpZnk8VD4gPSBJc1NpZ25hbDxUPiBleHRlbmRzIHRydWVcbiAgPyBUIC8vIE5ldmVyIGRvdWJsZS13cmFwIHNpZ25hbHNcbiAgOiBUIGV4dGVuZHMgUHJpbWl0aXZlXG4gID8gV3JpdGFibGVTaWduYWw8VD5cbiAgOiBUIGV4dGVuZHMgQnVpbHRJbk9iamVjdFxuICA/IFdyaXRhYmxlU2lnbmFsPFQ+IC8vIFRyZWF0IGJ1aWx0LWluIG9iamVjdHMgYXMgcHJpbWl0aXZlIHZhbHVlc1xuICA6IFQgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgVSlbXVxuICA/IFdyaXRhYmxlU2lnbmFsPFVbXT4gLy8gSGFuZGxlIHJlYWRvbmx5IGFycmF5c1xuICA6IFQgZXh0ZW5kcyAoaW5mZXIgVSlbXVxuICA/IFdyaXRhYmxlU2lnbmFsPFVbXT4gLy8gSGFuZGxlIG11dGFibGUgYXJyYXlzXG4gIDogVCBleHRlbmRzIG9iamVjdFxuICA/IFQgZXh0ZW5kcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duIC8vIEZ1bmN0aW9ucyBzaG91bGQgYmUgd3JhcHBlZCBhcyBzaWduYWxzXG4gICAgPyBXcml0YWJsZVNpZ25hbDxUPlxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIChpbmZlciBVKVtdXG4gICAgICAgICAgPyBXcml0YWJsZVNpZ25hbDxVW10+XG4gICAgICAgICAgOiBUW0tdIGV4dGVuZHMgQnVpbHRJbk9iamVjdFxuICAgICAgICAgID8gV3JpdGFibGVTaWduYWw8VFtLXT5cbiAgICAgICAgICA6IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgICA/IFRbS10gZXh0ZW5kcyBTaWduYWw8aW5mZXIgVEs+XG4gICAgICAgICAgICA/IFdyaXRhYmxlU2lnbmFsPFRLPlxuICAgICAgICAgICAgOiBEZWVwU2lnbmFsaWZ5PFRbS10+IC8vIFJlY3Vyc2l2ZSBjYWxsIHByZXNlcnZlcyBvcmlnaW5hbCB0eXBlIHN0cnVjdHVyZVxuICAgICAgICAgIDogV3JpdGFibGVTaWduYWw8VFtLXT47XG4gICAgICB9XG4gIDogV3JpdGFibGVTaWduYWw8VD47XG5cbi8qKlxuICogU2lnbmFsVHJlZSB0eXBlIC0gTk8gQ09OU1RSQUlOVFMgb24gVFxuICovXG5leHBvcnQgdHlwZSBTaWduYWxUcmVlPFQ+ID0ge1xuICAvKipcbiAgICogVGhlIHJlYWN0aXZlIHN0YXRlIG9iamVjdCB3aXRoIGRlZXAgc2lnbmFsIGNvbnZlcnNpb25cbiAgICovXG4gIHN0YXRlOiBEZWVwU2lnbmFsaWZ5PFQ+O1xuXG4gIC8qKlxuICAgKiBTaG9ydGhhbmQgYWxpYXMgZm9yIHN0YXRlXG4gICAqL1xuICAkOiBEZWVwU2lnbmFsaWZ5PFQ+O1xuXG4gIC8qKlxuICAgKiBDb3JlIG1ldGhvZHNcbiAgICovXG4gIHVud3JhcCgpOiBUO1xuICB1cGRhdGUodXBkYXRlcjogKGN1cnJlbnQ6IFQpID0+IFBhcnRpYWw8VD4pOiB2b2lkO1xuICBlZmZlY3QoZm46ICh0cmVlOiBUKSA9PiB2b2lkKTogdm9pZDtcbiAgc3Vic2NyaWJlKGZuOiAodHJlZTogVCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG4gIGRlc3Ryb3koKTogdm9pZDtcblxuICAvKipcbiAgICogUGlwZSBtZXRob2QgZm9yIGNvbXBvc2l0aW9uXG4gICAqL1xuICBwaXBlKCk6IFNpZ25hbFRyZWU8VD47XG4gIHBpcGU8UjE+KGZuMTogKHRyZWU6IFNpZ25hbFRyZWU8VD4pID0+IFIxKTogUjE7XG4gIHBpcGU8UjEsIFIyPihmbjE6ICh0cmVlOiBTaWduYWxUcmVlPFQ+KSA9PiBSMSwgZm4yOiAoYXJnOiBSMSkgPT4gUjIpOiBSMjtcbiAgcGlwZTxSMSwgUjIsIFIzPihcbiAgICBmbjE6ICh0cmVlOiBTaWduYWxUcmVlPFQ+KSA9PiBSMSxcbiAgICBmbjI6IChhcmc6IFIxKSA9PiBSMixcbiAgICBmbjM6IChhcmc6IFIyKSA9PiBSM1xuICApOiBSMztcblxuICAvLyBFeHRlbmRlZCBmZWF0dXJlc1xuICBiYXRjaFVwZGF0ZSh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPik6IHZvaWQ7XG4gIG1lbW9pemU8Uj4oZm46ICh0cmVlOiBUKSA9PiBSLCBjYWNoZUtleT86IHN0cmluZyk6IFNpZ25hbDxSPjtcbiAgb3B0aW1pemUoKTogdm9pZDtcbiAgY2xlYXJDYWNoZSgpOiB2b2lkO1xuICBpbnZhbGlkYXRlUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpOiBudW1iZXI7XG4gIGdldE1ldHJpY3MoKTogUGVyZm9ybWFuY2VNZXRyaWNzO1xuICBhZGRUYXAobWlkZGxld2FyZTogTWlkZGxld2FyZTxUPik6IHZvaWQ7XG4gIHJlbW92ZVRhcChpZDogc3RyaW5nKTogdm9pZDtcbiAgYXNDcnVkPEUgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfT4oXG4gICAgZW50aXR5S2V5Pzoga2V5b2YgVFxuICApOiBFbnRpdHlIZWxwZXJzPEU+O1xuICBhc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+KFxuICAgIG9wZXJhdGlvbjogKGlucHV0OiBUSW5wdXQpID0+IFByb21pc2U8VFJlc3VsdD4sXG4gICAgY29uZmlnPzogQXN5bmNBY3Rpb25Db25maWc8VCwgVFJlc3VsdD5cbiAgKTogQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PjtcbiAgdW5kbygpOiB2b2lkO1xuICByZWRvKCk6IHZvaWQ7XG4gIGdldEhpc3RvcnkoKTogVGltZVRyYXZlbEVudHJ5PFQ+W107XG4gIHJlc2V0SGlzdG9yeSgpOiB2b2lkO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9USEVSIFRZUEVTIChrZWVwIGFzLWlzIGJ1dCB1cGRhdGUgZ2VuZXJpY3MpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgdHlwZSBUcmVlUHJlc2V0ID0gJ2Jhc2ljJyB8ICdwZXJmb3JtYW5jZScgfCAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyZWVDb25maWcge1xuICBiYXRjaFVwZGF0ZXM/OiBib29sZWFuO1xuICB1c2VNZW1vaXphdGlvbj86IGJvb2xlYW47XG4gIGVuYWJsZVRpbWVUcmF2ZWw/OiBib29sZWFuO1xuICB1c2VMYXp5U2lnbmFscz86IGJvb2xlYW47XG4gIHVzZVNoYWxsb3dDb21wYXJpc29uPzogYm9vbGVhbjtcbiAgbWF4Q2FjaGVTaXplPzogbnVtYmVyO1xuICB0cmFja1BlcmZvcm1hbmNlPzogYm9vbGVhbjtcbiAgdHJlZU5hbWU/OiBzdHJpbmc7XG4gIGVuYWJsZURldlRvb2xzPzogYm9vbGVhbjtcbiAgZGVidWdNb2RlPzogYm9vbGVhbjtcbiAgdXNlU3RydWN0dXJhbFNoYXJpbmc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmU8VD4ge1xuICBpZDogc3RyaW5nO1xuICBiZWZvcmU/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24sIHN0YXRlOiBUKSA9PiBib29sZWFuO1xuICBhZnRlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biwgc3RhdGU6IFQsIG5ld1N0YXRlOiBUKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlTWV0cmljcyB7XG4gIHVwZGF0ZXM6IG51bWJlcjtcbiAgY29tcHV0YXRpb25zOiBudW1iZXI7XG4gIGNhY2hlSGl0czogbnVtYmVyO1xuICBjYWNoZU1pc3NlczogbnVtYmVyO1xuICBhdmVyYWdlVXBkYXRlVGltZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUhlbHBlcnM8RSBleHRlbmRzIHsgaWQ6IHN0cmluZyB8IG51bWJlciB9PiB7XG4gIGFkZChlbnRpdHk6IEUpOiB2b2lkO1xuICB1cGRhdGUoaWQ6IEVbJ2lkJ10sIHVwZGF0ZXM6IFBhcnRpYWw8RT4pOiB2b2lkO1xuICByZW1vdmUoaWQ6IEVbJ2lkJ10pOiB2b2lkO1xuICB1cHNlcnQoZW50aXR5OiBFKTogdm9pZDtcbiAgZmluZEJ5SWQoaWQ6IEVbJ2lkJ10pOiBTaWduYWw8RSB8IHVuZGVmaW5lZD47XG4gIGZpbmRCeShwcmVkaWNhdGU6IChlbnRpdHk6IEUpID0+IGJvb2xlYW4pOiBTaWduYWw8RVtdPjtcbiAgc2VsZWN0SWRzKCk6IFNpZ25hbDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PjtcbiAgc2VsZWN0QWxsKCk6IFNpZ25hbDxFW10+O1xuICBzZWxlY3RUb3RhbCgpOiBTaWduYWw8bnVtYmVyPjtcbiAgZmluZEFsbCgpOiBTaWduYWw8RVtdPjtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3luY0FjdGlvbkNvbmZpZzxULCBUUmVzdWx0PiB7XG4gIG9uU3RhcnQ/OiAoc3RhdGU6IFQpID0+IFBhcnRpYWw8VD47XG4gIG9uU3VjY2Vzcz86IChyZXN1bHQ6IFRSZXN1bHQsIHN0YXRlOiBUKSA9PiBQYXJ0aWFsPFQ+O1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgc3RhdGU6IFQpID0+IFBhcnRpYWw8VD47XG4gIG9uQ29tcGxldGU/OiAoc3RhdGU6IFQpID0+IFBhcnRpYWw8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PiB7XG4gIGV4ZWN1dGUoaW5wdXQ6IFRJbnB1dCk6IFByb21pc2U8VFJlc3VsdD47XG4gIHBlbmRpbmc6IFNpZ25hbDxib29sZWFuPjtcbiAgZXJyb3I6IFNpZ25hbDxFcnJvciB8IG51bGw+O1xuICByZXN1bHQ6IFNpZ25hbDxUUmVzdWx0IHwgbnVsbD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbEVudHJ5PFQ+IHtcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBzdGF0ZTogVDtcbiAgcGF5bG9hZDogdW5rbm93bjtcbn1cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsdHJlZS1jb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFsdHJlZS1jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;AAC5B;AACA,IAAI,IAAI,CAAC,KAAK,CAAC;AACf,QAAQ,OAAO,IAAI;AACnB;AACA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAC9B,QAAQ,OAAO,CAAC,KAAK,CAAC;AACtB;AACA,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC;AAC1B,IAAI,MAAM,KAAK,GAAG,OAAO,CAAC;AAC1B,IAAI,IAAI,KAAK,KAAK,KAAK;AACvB,QAAQ,OAAO,KAAK;AACpB;AACA,IAAI,IAAI,KAAK,KAAK,QAAQ;AAC1B,QAAQ,OAAO,KAAK;AACpB;AACA,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AAC1B,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AACtD,YAAY,OAAO,KAAK;AACxB,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,IAAI;AACJ;AACA,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACxB,QAAQ,OAAO,KAAK;AACpB;AACA,IAAI,MAAM,IAAI,GAAG,CAAC;AAClB,IAAI,MAAM,IAAI,GAAG,CAAC;AAClB,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,IAAI,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACnC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AACrC,QAAQ,OAAO,KAAK;AACpB,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE;AACnD,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE;AACzB,QAAQ,KAAK,EAAE,WAAW,IAAI,KAAK;AACnC,KAAK,CAAC;AACN;AACA;AACA;AACA;AACA,MAAM,QAAQ,CAAC;AACf,IAAI,OAAO;AACX,IAAI,KAAK,GAAG,IAAI,GAAG,EAAE;AACrB,IAAI,WAAW,CAAC,OAAO,EAAE;AACzB,QAAQ,IAAI,CAAC,OAAO,GAAG,OAAO;AAC9B,IAAI;AACJ,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE;AACpB,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;AAC7C,YAAY,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AAC3D,YAAY,IAAI,QAAQ,KAAK,SAAS,EAAE;AACxC,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3C,YAAY;AACZ,QAAQ;AACR;AACA,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACnC,IAAI;AACJ,IAAI,GAAG,CAAC,GAAG,EAAE;AACb,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACzC,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAE;AACjC;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;AAClC,YAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AACtC,QAAQ;AACR,QAAQ,OAAO,KAAK;AACpB,IAAI;AACJ,IAAI,KAAK,GAAG;AACZ,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAC1B,IAAI;AACJ,IAAI,IAAI,GAAG;AACX,QAAQ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI;AAC9B,IAAI;AACJ;AACA;AACA,MAAM,cAAc,GAAG,IAAI;AAC3B,MAAM,SAAS,GAAG,IAAI,QAAQ,CAAC,cAAc,CAAC;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,SAAS,CAAC,IAAI,EAAE;AAChC,IAAI,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,IAAI,IAAI,MAAM,EAAE;AAChB,QAAQ,OAAO,MAAM;AACrB,IAAI;AACJ,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACjC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;AAC9B,IAAI,OAAO,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,GAAG,EAAE,EAAE;AACrE;AACA,IAAI,MAAM,WAAW,GAAG,IAAI,GAAG,EAAE;AACjC,IAAI,MAAM,aAAa,GAAG,IAAI,GAAG,EAAE;AACnC;AACA,IAAI,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE;AACpC;AACA,IAAI,MAAM,OAAO,GAAG,MAAM;AAC1B;AACA,QAAQ,cAAc,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK;AAC9C,YAAY,IAAI;AAChB,gBAAgB,SAAS,EAAE;AAC3B,YAAY;AACZ,YAAY,OAAO,KAAK,EAAE;AAC1B,gBAAgB,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACnE,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV,QAAQ,cAAc,CAAC,KAAK,EAAE;AAC9B;AACA,QAAQ,WAAW,CAAC,KAAK,EAAE;AAC3B,QAAQ,aAAa,CAAC,KAAK,EAAE;AAC7B,IAAI,CAAC;AACL;AACA,IAAI,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK;AACnC,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AACzC,YAAY,OAAO,KAAK;AACxB,QAAQ,QAAQ,CAAC,YAAY,IAAI;AACjC,YAAY,CAAC,YAAY,MAAM;AAC/B,YAAY,OAAO,CAAC,KAAK,UAAU;AACnC,YAAY,CAAC,YAAY,GAAG;AAC5B,YAAY,CAAC,YAAY,GAAG;AAC5B,YAAY,CAAC,YAAY,OAAO;AAChC,YAAY,CAAC,YAAY,OAAO;AAChC,YAAY,CAAC,YAAY,WAAW;AACpC,YAAY,CAAC,YAAY,QAAQ;AACjC,YAAY,CAAC,YAAY,KAAK;AAC9B,YAAY,CAAC,YAAY,OAAO;AAChC,YAAY,CAAC,YAAY,GAAG;AAC5B,YAAY,CAAC,YAAY,eAAe;AACxC,YAAY,CAAC,YAAY,QAAQ;AACjC,YAAY,CAAC,YAAY,IAAI;AAC7B,aAAa,OAAO,IAAI,KAAK,WAAW,IAAI,CAAC,YAAY,IAAI,CAAC;AAC9D,IAAI,CAAC;AACL,IAAI,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;AACjC,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE;AAC1B;AACA,YAAY,IAAI,IAAI,KAAK,aAAa,EAAE;AACxC,gBAAgB,OAAO,OAAO;AAC9B,YAAY;AACZ;AACA,YAAY,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC1C,gBAAgB,OAAO,MAAM,CAAC,IAAI,CAAC;AACnC,YAAY;AACZ;AACA,YAAY,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,UAAU,EAAE;AAC3D,gBAAgB,OAAO,MAAM,CAAC,IAAI,CAAC;AACnC,YAAY;AACZ,YAAY,MAAM,GAAG,GAAG,IAAI;AAC5B,YAAY,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG;AAC9D;AACA,YAAY,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE;AAClC,gBAAgB,OAAO,SAAS;AAChC,YAAY;AACZ,YAAY,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AACrC;AACA,YAAY,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAgB,OAAO,KAAK;AAC5B,YAAY;AACZ;AACA,YAAY,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACvC,gBAAgB,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5C,YAAY;AACZ;AACA,YAAY,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AACzC,gBAAgB,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9C,YAAY;AACZ;AACA,YAAY,IAAI,KAAK;AACrB,gBAAgB,OAAO,KAAK,KAAK,QAAQ;AACzC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AACrC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;AAChC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;AACzC,gBAAgB,IAAI;AACpB,oBAAoB,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC;AACrF,oBAAoB,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC;AACxD;AACA,oBAAoB,MAAM,gBAAgB,GAAG,WAAW;AACxD,oBAAoB,IAAI,OAAO,gBAAgB,CAAC,WAAW,KAAK,UAAU,EAAE;AAC5E,wBAAwB,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,WAAW,CAAC;AAC9E,oBAAoB;AACpB,oBAAoB,OAAO,WAAW;AACtC,gBAAgB;AAChB,gBAAgB,OAAO,KAAK,EAAE;AAC9B,oBAAoB,OAAO,CAAC,IAAI,CAAC,CAAC,sCAAsC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAC1F;AACA,oBAAoB,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AACzJ,oBAAoB,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC;AACzD,oBAAoB,OAAO,cAAc;AACzC,gBAAgB;AAChB,YAAY;AACZ;AACA,YAAY,IAAI;AAChB,gBAAgB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAC3I,gBAAgB,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC;AAChD,gBAAgB,OAAO,SAAS;AAChC,YAAY;AACZ,YAAY,OAAO,KAAK,EAAE;AAC1B,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,kCAAkC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAClF,gBAAgB,OAAO,KAAK,CAAC;AAC7B,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;AACjC,YAAY,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC1C,gBAAgB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK;AACpC,gBAAgB,OAAO,IAAI;AAC3B,YAAY;AACZ,YAAY,MAAM,GAAG,GAAG,IAAI;AAC5B,YAAY,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG;AAC9D,YAAY,IAAI;AAChB;AACA,gBAAgB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;AACnC;AACA,gBAAgB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1D,gBAAgB,IAAI,YAAY,IAAI,KAAK,IAAI,YAAY,EAAE;AAC3D,oBAAoB,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3C,gBAAgB;AAChB;AACA,gBAAgB,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7C;AACA,oBAAoB,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAClE,oBAAoB,IAAI,aAAa,EAAE;AACvC,wBAAwB,aAAa,EAAE;AACvC,wBAAwB,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;AACnD,oBAAoB;AACpB,oBAAoB,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;AAC9C,gBAAgB;AAChB,gBAAgB,OAAO,IAAI;AAC3B,YAAY;AACZ,YAAY,OAAO,KAAK,EAAE;AAC1B,gBAAgB,OAAO,CAAC,IAAI,CAAC,CAAC,8BAA8B,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAC9E,gBAAgB,OAAO,KAAK;AAC5B,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE;AAC1B,YAAY,OAAO,IAAI,IAAI,MAAM;AACjC,QAAQ,CAAC;AACT,QAAQ,OAAO,CAAC,MAAM,EAAE;AACxB,YAAY,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AAC1C,QAAQ,CAAC;AACT,QAAQ,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE;AAC/C,YAAY,OAAO,OAAO,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC;AACjE,QAAQ,CAAC;AACT,KAAK,CAAC;AACN,IAAI,OAAO,KAAK;AAChB;AACA;AACA;AACA;AACA;AACO,SAAS,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE;AAChC;AACA,IAAI,IAAI,CAAC,KAAK,CAAC;AACf,QAAQ,OAAO,IAAI;AACnB;AACA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAC9B,QAAQ,OAAO,KAAK;AACpB;AACA,IAAI,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC;AAC7B,QAAQ,OAAO,KAAK;AACpB;AACA,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;AAChD,QAAQ,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;AAC1C,IAAI;AACJ;AACA,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AAC9C,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AACjC,YAAY,OAAO,KAAK;AACxB,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,gBAAgB,OAAO,KAAK;AAC5B,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;AAC7B,QAAQ,OAAO,CAAC,KAAK,QAAQ;AAC7B,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACzB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACzB,QAAQ,EAAE,CAAC,YAAY,IAAI,CAAC;AAC5B,QAAQ,EAAE,CAAC,YAAY,IAAI,CAAC,EAAE;AAC9B,QAAQ,MAAM,IAAI,GAAG,CAAC;AACtB,QAAQ,MAAM,IAAI,GAAG,CAAC;AACtB,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AACzC,YAAY,OAAO,KAAK;AACxB,QAAQ,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACjC,YAAY,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;AAC9B,gBAAgB,OAAO,KAAK;AAC5B,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,gBAAgB,OAAO,KAAK;AAC5B,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ;AACA,IAAI,OAAO,KAAK;AAChB;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE;AACnC,IAAI,IAAI,CAAC,KAAK,CAAC;AACf,QAAQ,OAAO,IAAI;AACnB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAC9B,QAAQ,OAAO,KAAK;AACpB,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AAC9C,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AACjC,YAAY,OAAO,KAAK;AACxB,QAAQ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7B,gBAAgB,OAAO,KAAK;AAC5B,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACxD,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,QAAQ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;AACzC,YAAY,OAAO,KAAK;AACxB,QAAQ,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACjC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;AACtB,gBAAgB,CAAC,CAAC,GAAG,CAAC;AACtB,gBAAgB,OAAO,KAAK;AAC5B,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,IAAI;AACJ,IAAI,OAAO,KAAK;AAChB;;AChXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,oBAAoB,EAAE;AAChD,IAAI,OAAO,oBAAoB,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE;AAClC,IAAI,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,IAAI,KAAK,CAAC;AAC7E,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI;AACjD;AACA,IAAI,MAAM,WAAW,GAAG;AACxB,UAAU,oBAAoB,CAAC,GAAG,EAAE,UAAU;AAC9C,UAAU,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC;AAC5C,IAAI,MAAM,UAAU,GAAG;AACvB,QAAQ,KAAK,EAAE,WAAW;AAC1B,QAAQ,CAAC,EAAE,WAAW;AACtB,KAAK;AACL,IAAI,WAAW,CAAC,UAAU,CAAC;AAC3B,IAAI,OAAO,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE;AAC5C;AACA,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE;AAC3C,QAAQ,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;AAC5E,IAAI;AACJ,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AACjC;AACA,QAAQ,OAAO,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACjD,IAAI;AACJ,IAAI,MAAM,KAAK,GAAG,EAAE;AACpB;AACA,IAAI,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK;AACnC,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;AACzC,YAAY,OAAO,KAAK;AACxB,QAAQ,QAAQ,CAAC,YAAY,IAAI;AACjC,YAAY,CAAC,YAAY,MAAM;AAC/B,YAAY,OAAO,CAAC,KAAK,UAAU;AACnC,YAAY,CAAC,YAAY,GAAG;AAC5B,YAAY,CAAC,YAAY,GAAG;AAC5B,YAAY,CAAC,YAAY,OAAO;AAChC,YAAY,CAAC,YAAY,OAAO;AAChC,YAAY,CAAC,YAAY,WAAW;AACpC,YAAY,CAAC,YAAY,QAAQ;AACjC,YAAY,CAAC,YAAY,KAAK;AAC9B,YAAY,CAAC,YAAY,OAAO;AAChC,YAAY,CAAC,YAAY,GAAG;AAC5B,YAAY,CAAC,YAAY,eAAe;AACxC,YAAY,CAAC,YAAY,QAAQ;AACjC,YAAY,CAAC,YAAY,IAAI;AAC7B,aAAa,OAAO,IAAI,KAAK,WAAW,IAAI,CAAC,YAAY,IAAI,CAAC;AAC9D,IAAI,CAAC;AACL;AACA,IAAI,IAAI;AACR,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACxD,YAAY,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ;AACtD,gBAAgB,CAAC,KAAK,IAAI;AAC1B,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACjC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;AACnC;AACA,YAAY,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAgB,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK;AAClC,YAAY;AACZ,iBAAiB,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;AACnC;AACA,gBAAgB,IAAI;AACpB,oBAAoB,KAAK,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC;AACrE,gBAAgB;AAChB,gBAAgB,OAAO,KAAK,EAAE;AAC9B,oBAAoB,OAAO,CAAC,IAAI,CAAC,CAAC,uCAAuC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAC1F;AACA,oBAAoB,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE;AAC/C,wBAAwB,KAAK,EAAE,UAAU;AACzC,qBAAqB,CAAC;AACtB,gBAAgB;AAChB,YAAY;AACZ,iBAAiB;AACjB;AACA,gBAAgB,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE;AAC3C,oBAAoB,KAAK,EAAE,UAAU;AACrC,iBAAiB,CAAC;AAClB,YAAY;AACZ,QAAQ;AACR,IAAI;AACJ,IAAI,OAAO,KAAK,EAAE;AAClB,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,+BAA+B,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC;AACrH,IAAI;AACJ,IAAI,OAAO,KAAK;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,WAAW,CAAC,IAAI,EAAE;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB;AACA,QAAQ,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK;AACtC,YAAY,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AACzD,gBAAgB,OAAO,GAAG;AAC1B,YAAY;AACZ,YAAY,MAAM,MAAM,GAAG,EAAE;AAC7B,YAAY,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;AACnC,gBAAgB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;AACtC,gBAAgB,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;AACrC,oBAAoB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE;AACzC,gBAAgB;AAChB,qBAAqB,IAAI,OAAO,KAAK,KAAK,QAAQ;AAClD,oBAAoB,KAAK,KAAK,IAAI;AAClC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC3C;AACA,oBAAoB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;AACrD,gBAAgB;AAChB,qBAAqB;AACrB,oBAAoB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;AACvC,gBAAgB;AAChB,YAAY;AACZ,YAAY,OAAO,MAAM;AACzB,QAAQ,CAAC;AACT,QAAQ,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,IAAI,CAAC;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,KAAK;AAC/B,QAAQ,MAAM,aAAa,GAAG,IAAI,GAAG,EAAE;AACvC,QAAQ,IAAI;AACZ,YAAY,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE;AAC9C,YAAY,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;AACpD,YAAY,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AAC/D,gBAAgB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;AAChE,YAAY;AACZ;AACA,YAAY,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,KAAK;AACjE,gBAAgB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AAC3C,oBAAoB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;AAC3E,wBAAwB;AACxB,oBAAoB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;AACpD,oBAAoB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG;AACrE,oBAAoB,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC;AAC5D,oBAAoB,IAAI;AACxB,wBAAwB,IAAI,QAAQ,CAAC,oBAAoB,CAAC,EAAE;AAC5D;AACA,4BAA4B,MAAM,aAAa,GAAG,oBAAoB,EAAE;AACxE,4BAA4B,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC;AACzE;AACA,4BAA4B,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC;AACjE,wBAAwB;AACxB,6BAA6B,IAAI,OAAO,WAAW,KAAK,QAAQ;AAChE,4BAA4B,WAAW,KAAK,IAAI;AAChD,4BAA4B,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AACvD,4BAA4B,OAAO,oBAAoB,KAAK,QAAQ;AACpE,4BAA4B,oBAAoB,KAAK,IAAI;AACzD,4BAA4B,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE;AAC7D;AACA,4BAA4B,YAAY,CAAC,oBAAoB,EAAE,WAAW,EAAE,WAAW,CAAC;AACxF,wBAAwB;AACxB,6BAA6B,IAAI,oBAAoB,KAAK,SAAS,EAAE;AACrE,4BAA4B,OAAO,CAAC,IAAI,CAAC,CAAC,iCAAiC,EAAE,WAAW,CAAC,CAAC,CAAC;AAC3F,wBAAwB;AACxB,oBAAoB;AACpB,oBAAoB,OAAO,KAAK,EAAE;AAClC,wBAAwB,OAAO,CAAC,KAAK,CAAC,CAAC,uBAAuB,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AACvF;AACA,oBAAoB;AACpB,gBAAgB;AAChB,YAAY,CAAC;AACb,YAAY,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;AAChD,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB;AACA,YAAY,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC;AACvE,YAAY,IAAI;AAChB;AACA,gBAAgB,KAAK,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE;AAC7E,oBAAoB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACrD,oBAAoB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK;AAC5C,oBAAoB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACnE,wBAAwB,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACvD,wBAAwB,IAAI,CAAC,OAAO;AACpC,4BAA4B;AAC5B,oBAAoB;AACpB,oBAAoB,IAAI,OAAO;AAC/B,wBAAwB,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;AAC5E,wBAAwB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/E,wBAAwB,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;AACjD,oBAAoB;AACpB,gBAAgB;AAChB,YAAY;AACZ,YAAY,OAAO,aAAa,EAAE;AAClC,gBAAgB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,aAAa,CAAC;AAChE,YAAY;AACZ,YAAY,MAAM,KAAK;AACvB,QAAQ;AACR,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK;AAC7B,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,YAAY,OAAO,IAAI;AACvB,QAAQ;AACR;AACA,QAAQ,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK;AACvC,YAAY,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;AAC1C,gBAAgB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;AACvE,YAAY;AACZ,YAAY,OAAO,EAAE,CAAC,GAAG,CAAC;AAC1B,QAAQ,CAAC,EAAE,IAAI,CAAC;AAChB,IAAI,CAAC,CAAC;AACN;AACA,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,KAAK;AACpC,QAAQ,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,yDAAyD,CAAC;AACvI;AACA,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5B,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK;AACrC,QAAQ,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,oEAAoE,CAAC;AACjJ;AACA,QAAQ,KAAK,QAAQ,CAAC;AACtB,QAAQ,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAChD,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK;AAC1B,QAAQ,IAAI;AACZ,YAAY,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3C,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB;AACA,YAAY,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,KAAK,CAAC;AAC5E,QAAQ;AACR,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,KAAK;AAC7B,QAAQ,IAAI;AACZ,YAAY,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACjD,YAAY,IAAI,WAAW,GAAG,KAAK;AACnC,YAAY,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;AAC3C,gBAAgB,IAAI,CAAC,WAAW,EAAE;AAClC,oBAAoB,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACrC,gBAAgB;AAChB,YAAY,CAAC,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAClE,YAAY,MAAM,WAAW,GAAG,MAAM;AACtC,gBAAgB,WAAW,GAAG,IAAI;AAClC,gBAAgB,SAAS,CAAC,OAAO,EAAE;AACnC,YAAY,CAAC;AACb,YAAY,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC;AAC7C,YAAY,OAAO,WAAW;AAC9B,QAAQ;AACR,QAAQ,OAAO,KAAK,EAAE;AACtB;AACA,YAAY,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC;AAC/E,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC7B,YAAY,OAAO,MAAM;AACzB;AACA,YAAY,CAAC;AACb,QAAQ;AACR,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,QAAQ,GAAG,MAAM;AAC1B,QAAQ,OAAO,CAAC,IAAI,CAAC,8DAA8D,EAAE,2DAA2D,CAAC;AACjJ,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM;AAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,sDAAsD,CAAC;AACpI,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,iBAAiB,GAAG,MAAM;AACnC,QAAQ,OAAO,CAAC,IAAI,CAAC,4EAA4E,EAAE,mEAAmE,CAAC;AACvK,QAAQ,OAAO,CAAC;AAChB,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM;AACzB;AACA,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;AAChC,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAI,KAAK,EAAE;AAC1E,YAAY,KAAK,CAAC,WAAW,EAAE;AAC/B,QAAQ;AACR;AACA,QAAQ,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC;AAC5D,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM;AAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,iEAAiE,EAAE,kEAAkE,CAAC;AAC3J;AACA,QAAQ,OAAO;AACf,YAAY,OAAO,EAAE,CAAC;AACtB,YAAY,YAAY,EAAE,CAAC;AAC3B,YAAY,SAAS,EAAE,CAAC;AACxB,YAAY,WAAW,EAAE,CAAC;AAC1B,YAAY,iBAAiB,EAAE,CAAC;AAChC,SAAS;AACT,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,UAAU,KAAK;AAClC,QAAQ,OAAO,CAAC,IAAI,CAAC,6DAA6D,EAAE,wDAAwD,CAAC;AAC7I,QAAQ,KAAK,UAAU,CAAC;AACxB,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,KAAK;AAC7B,QAAQ,OAAO,CAAC,IAAI,CAAC,gEAAgE,EAAE,wDAAwD,CAAC;AAChJ,QAAQ,KAAK,EAAE,CAAC;AAChB,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;AACxB,QAAQ,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAE,0DAA0D,CAAC;AAC5I,QAAQ,OAAO,EAAE;AACjB,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,KAAK;AACnD,QAAQ,OAAO,CAAC,IAAI,CAAC,8DAA8D,EAAE,sDAAsD,CAAC;AAC5I,QAAQ,KAAK,SAAS;AACtB,QAAQ,KAAK,MAAM;AACnB,QAAQ,OAAO,EAAE;AACjB,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM;AACtB,QAAQ,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,0DAA0D,CAAC;AACtI,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,IAAI,GAAG,MAAM;AACtB,QAAQ,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,0DAA0D,CAAC;AACtI,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,UAAU,GAAG,MAAM;AAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,0DAA0D,EAAE,0DAA0D,CAAC;AAC5I,QAAQ,OAAO,EAAE;AACjB,IAAI,CAAC;AACL,IAAI,IAAI,CAAC,YAAY,GAAG,MAAM;AAC9B,QAAQ,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAE,0DAA0D,CAAC;AAC9I,IAAI,CAAC;AACL,IAAI,OAAO,IAAI;AACf;AACO,SAAS,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE;AAChD;AACA,IAAI,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;AAC5C,QAAQ,OAAO,CAAC,IAAI,CAAC,iEAAiE,EAAE,+CAA+C,CAAC;AACxI;AACA,QAAQ,OAAO,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;AAC9B,IAAI;AACJ;AACA,IAAI,MAAM,MAAM,GAAG,cAAc,IAAI,EAAE;AACvC,IAAI,OAAO,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;AAC9B;;AC5dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;;;;"}
|