@signaltree/core 1.1.7 → 2.0.0
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 +118 -86
- package/fesm2022/signaltree-core.mjs +679 -345
- package/fesm2022/signaltree-core.mjs.map +1 -1
- package/index.d.ts +105 -22
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js"],"sourcesContent":["import { signal, isSignal } from '@angular/core';\nexport function equal(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return a === b;\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB)\n return false;\n if (typeA !== 'object')\n return false;\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size)\n return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !equal(value, b.get(key)))\n return false;\n }\n return true;\n }\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size)\n return false;\n for (const value of a) {\n if (!b.has(value))\n return false;\n }\n return true;\n }\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 if (Array.isArray(b))\n return false;\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}\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\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 this.cache.delete(key);\n this.cache.set(key, value);\n }\n get(key) {\n const value = this.cache.get(key);\n if (value !== undefined) {\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}\nconst MAX_CACHE_SIZE = 1000;\nconst pathCache = new LRUCache(MAX_CACHE_SIZE);\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}\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n const nestedCleanups = new Map();\n const cleanup = () => {\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 signalCache.clear();\n nestedProxies.clear();\n };\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 if (prop === '__cleanup__') {\n return cleanup;\n }\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n if (prop === 'valueOf' || prop === 'toString') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n if (!(key in target)) {\n return undefined;\n }\n const value = target[key];\n if (isSignal(value)) {\n return value;\n }\n if (signalCache.has(path)) {\n return signalCache.get(path);\n }\n if (nestedProxies.has(path)) {\n return nestedProxies.get(path);\n }\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 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 const fallbackSignal = signal(value, ...(ngDevMode ? [{ debugName: \"fallbackSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, fallbackSignal);\n return fallbackSignal;\n }\n }\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;\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 target[key] = value;\n const cachedSignal = signalCache.get(path);\n if (cachedSignal && 'set' in cachedSignal) {\n cachedSignal.set(value);\n }\n if (nestedProxies.has(path)) {\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}\nexport const deepEqual = equal;\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLE1BQU0sRUFBa0IsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBaURqRSxNQUFNLFVBQVUsS0FBSyxDQUFJLENBQUksRUFBRSxDQUFJO0lBRWpDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUd6QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUk7UUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFHM0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkIsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBR2xDLElBQUksS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUdyQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBR0QsSUFBSSxDQUFDLFlBQVksTUFBTSxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQztRQUMvQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztJQUdELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQUUs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LENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQ0csQ0FBNkIsQ0FBQyxHQUFHLENBQUM7Z0JBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDO2dCQUVuQyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIFV0aWxpdHkgRnVuY3Rpb25zIHYxLjEuNiAtIE1JVCBMaWNlbnNlXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9KQm9yZ2lhL3NpZ25hbHRyZWUvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBzaWduYWwsIFdyaXRhYmxlU2lnbmFsLCBpc1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBEZWVwU2lnbmFsaWZ5IH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW5oYW5jZWQgZGVlcCBlcXVhbGl0eSBmdW5jdGlvbiBvcHRpbWl6ZWQgZm9yIFNpZ25hbFRyZWUgb3BlcmF0aW9ucy5cbiAqXG4gKiBQZXJmb3JtcyBjb21wcmVoZW5zaXZlIGVxdWFsaXR5IGNoZWNraW5nIGZvciBhbGwgSmF2YVNjcmlwdCB0eXBlcyBpbmNsdWRpbmdcbiAqIHByaW1pdGl2ZXMsIG9iamVjdHMsIGFycmF5cywgRGF0ZSwgUmVnRXhwLCBNYXAsIFNldCwgYW5kIG90aGVyIGJ1aWx0LWlucy5cbiAqIE9wdGltaXplZCB3aXRoIGVhcmx5IGV4aXRzIGFuZCB0eXBlLXNwZWNpZmljIGNvbXBhcmlzb25zIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdmFsdWVzIGJlaW5nIGNvbXBhcmVkXG4gKiBAcGFyYW0gYSAtIEZpcnN0IHZhbHVlIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBiIC0gU2Vjb25kIHZhbHVlIHRvIGNvbXBhcmVcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWVzIGFyZSBkZWVwbHkgZXF1YWwsIGZhbHNlIG90aGVyd2lzZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBQcmltaXRpdmUgY29tcGFyaXNvbnNcbiAqIGVxdWFsKDQyLCA0Mik7ICAgICAgICAgICAvLyB0cnVlXG4gKiBlcXVhbCgnaGVsbG8nLCAnaGVsbG8nKTsgLy8gdHJ1ZVxuICogZXF1YWwobnVsbCwgdW5kZWZpbmVkKTsgIC8vIGZhbHNlXG4gKlxuICogLy8gT2JqZWN0IGNvbXBhcmlzb25zXG4gKiBlcXVhbCh7IGE6IDEsIGI6IDIgfSwgeyBhOiAxLCBiOiAyIH0pOyAvLyB0cnVlXG4gKiBlcXVhbCh7IGE6IDEgfSwgeyBhOiAxLCBiOiAyIH0pOyAgICAgICAvLyBmYWxzZVxuICpcbiAqIC8vIEFycmF5IGNvbXBhcmlzb25zXG4gKiBlcXVhbChbMSwgMiwgM10sIFsxLCAyLCAzXSk7ICAgICAgICAgICAvLyB0cnVlXG4gKiBlcXVhbChbMSwgWzIsIDNdXSwgWzEsIFsyLCAzXV0pOyAgICAgICAvLyB0cnVlIChkZWVwKVxuICpcbiAqIC8vIENvbXBsZXggdHlwZXNcbiAqIGVxdWFsKG5ldyBEYXRlKCcyMDIzLTAxLTAxJyksIG5ldyBEYXRlKCcyMDIzLTAxLTAxJykpOyAvLyB0cnVlXG4gKiBlcXVhbCgvYWJjL2dpLCAvYWJjL2dpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZXF1YWwobmV3IFNldChbMSwgMl0pLCBuZXcgU2V0KFsxLCAyXSkpOyAgICAgICAgICAgICAgIC8vIHRydWVcbiAqIGVxdWFsKG5ldyBNYXAoW1snYScsIDFdXSksIG5ldyBNYXAoW1snYScsIDFdXSkpOyAgICAgICAvLyB0cnVlXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVXNhZ2UgaW4gU2lnbmFsVHJlZSBmb3IgY2hhbmdlIGRldGVjdGlvblxuICogY29uc3Qgc3RhdGUgPSBzaWduYWxUcmVlKHtcbiAqICAgdXNlcjogeyBuYW1lOiAnSm9obicsIGFnZTogMzAgfVxuICogfSk7XG4gKlxuICogLy8gSW50ZXJuYWwgZXF1YWwoKSB1c2FnZSBwcmV2ZW50cyB1bm5lY2Vzc2FyeSB1cGRhdGVzXG4gKiBzdGF0ZS51c2VyLnNldCh7IG5hbWU6ICdKb2huJywgYWdlOiAzMCB9KTsgLy8gTm8gY2hhbmdlIGRldGVjdGVkXG4gKiBzdGF0ZS51c2VyLnNldCh7IG5hbWU6ICdKYW5lJywgYWdlOiAzMCB9KTsgLy8gQ2hhbmdlIGRldGVjdGVkXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgLy8gRmFzdCBwYXRoIGZvciByZWZlcmVuY2UgZXF1YWxpdHlcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZCBjYXNlc1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT09IGI7XG5cbiAgLy8gVHlwZSBjaGVjayBmaXJzdCAtIG1vc3QgZWZmaWNpZW50IGVhcmx5IGV4aXRcbiAgY29uc3QgdHlwZUEgPSB0eXBlb2YgYTtcbiAgY29uc3QgdHlwZUIgPSB0eXBlb2YgYjtcbiAgaWYgKHR5cGVBICE9PSB0eXBlQikgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIEZvciBwcmltaXRpdmVzLCA9PT0gY2hlY2sgYWJvdmUgaXMgc3VmZmljaWVudFxuICBpZiAodHlwZUEgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIERhdGUgb2JqZWN0cyBzcGVjaWZpY2FsbHlcbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGEuZ2V0VGltZSgpID09PSBiLmdldFRpbWUoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBSZWdFeHAgb2JqZWN0cyBzcGVjaWZpY2FsbHlcbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHAgJiYgYiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgfVxuXG4gIC8vIEhhbmRsZSBvdGhlciBidWlsdC1pbiBvYmplY3RzIHRoYXQgbmVlZCBzcGVjaWFsIGNvbXBhcmlzb25cbiAgaWYgKGEgaW5zdGFuY2VvZiBNYXAgJiYgYiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICAgIGlmICghYi5oYXMoa2V5KSB8fCAhZXF1YWwodmFsdWUsIGIuZ2V0KGtleSkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBTZXQgJiYgYiBpbnN0YW5jZW9mIFNldCkge1xuICAgIGlmIChhLnNpemUgIT09IGIuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYSkge1xuICAgICAgaWYgKCFiLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgYXJyYXlzIHdpdGggb3B0aW1pemVkIGNvbXBhcmlzb25cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikgfHwgYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGluZGV4KSA9PiBlcXVhbChpdGVtLCBiW2luZGV4XSkpO1xuICB9XG5cbiAgLy8gQXJyYXlzIGNoZWNrIGFib3ZlIGhhbmRsZXMgYXJyYXkgdnMgb2JqZWN0IG1pc21hdGNoXG4gIGlmIChBcnJheS5pc0FycmF5KGIpKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIHJlZ3VsYXIgb2JqZWN0cyB3aXRoIG9wdGltaXplZCBjb21wYXJpc29uXG4gIGNvbnN0IG9iakEgPSBhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBvYmpCID0gYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb25zdCBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICBjb25zdCBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PiBrZXkgaW4gb2JqQiAmJiBlcXVhbChvYmpBW2tleV0sIG9iakJba2V5XSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZXJtaW5hbCBzaWduYWwgd2l0aCBlbmhhbmNlZCBkZWVwIGVxdWFsaXR5IGNvbXBhcmlzb24uXG4gKlxuICogQWx0ZXJuYXRpdmUgdG8gQW5ndWxhcidzIHNpZ25hbCgpIHRoYXQgdXNlcyBTaWduYWxUcmVlJ3MgZGVlcCBlcXVhbGl0eVxuICogZnVuY3Rpb24gZm9yIGNoYW5nZSBkZXRlY3Rpb24uIFVzZWZ1bCB3aGVuIHlvdSBuZWVkIHN0YW5kYWxvbmUgc2lnbmFsc1xuICogd2l0aCB0aGUgc2FtZSBlcXVhbGl0eSBzZW1hbnRpY3MgYXMgU2lnbmFsVHJlZS5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBzaWduYWwgdmFsdWVcbiAqIEBwYXJhbSB2YWx1ZSAtIEluaXRpYWwgdmFsdWUgZm9yIHRoZSBzaWduYWxcbiAqIEBwYXJhbSBjdXN0b21FcXVhbCAtIE9wdGlvbmFsIGN1c3RvbSBlcXVhbGl0eSBmdW5jdGlvbiAoZGVmYXVsdHMgdG8gZGVlcCBlcXVhbClcbiAqIEByZXR1cm5zIEEgV3JpdGFibGVTaWduYWwgd2l0aCBkZWVwIGVxdWFsaXR5IGNvbXBhcmlzb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU3RhbmRhcmQgQW5ndWxhciBzaWduYWwgd2l0aCByZWZlcmVuY2UgZXF1YWxpdHlcbiAqIGNvbnN0IHN0YW5kYXJkU2lnbmFsID0gc2lnbmFsKHsgY291bnQ6IDAgfSk7XG4gKiBzdGFuZGFyZFNpZ25hbC5zZXQoeyBjb3VudDogMCB9KTsgLy8gVHJpZ2dlcnMgdXBkYXRlIChkaWZmZXJlbnQgcmVmZXJlbmNlKVxuICpcbiAqIC8vIFRlcm1pbmFsIHNpZ25hbCB3aXRoIGRlZXAgZXF1YWxpdHlcbiAqIGNvbnN0IHRlcm1pbmFsU2lnID0gdGVybWluYWxTaWduYWwoeyBjb3VudDogMCB9KTtcbiAqIHRlcm1pbmFsU2lnLnNldCh7IGNvdW50OiAwIH0pOyAvLyBObyB1cGRhdGUgKHNhbWUgdmFsdWUpXG4gKiB0ZXJtaW5hbFNpZy5zZXQoeyBjb3VudDogMSB9KTsgLy8gVHJpZ2dlcnMgdXBkYXRlIChkaWZmZXJlbnQgdmFsdWUpXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3VzdG9tIGVxdWFsaXR5IGZ1bmN0aW9uXG4gKiBjb25zdCB1c2VyU2lnbmFsID0gdGVybWluYWxTaWduYWwoXG4gKiAgIHsgaWQ6IDEsIG5hbWU6ICdKb2huJyB9LFxuICogICAoYSwgYikgPT4gYS5pZCA9PT0gYi5pZCAvLyBPbmx5IGNvbXBhcmUgYnkgSURcbiAqICk7XG4gKlxuICogdXNlclNpZ25hbC5zZXQoeyBpZDogMSwgbmFtZTogJ0phbmUnIH0pOyAvLyBObyB1cGRhdGUgKHNhbWUgSUQpXG4gKiB1c2VyU2lnbmFsLnNldCh7IGlkOiAyLCBuYW1lOiAnSmFuZScgfSk7IC8vIFRyaWdnZXJzIHVwZGF0ZSAoZGlmZmVyZW50IElEKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXJtaW5hbFNpZ25hbDxUPihcbiAgdmFsdWU6IFQsXG4gIGN1c3RvbUVxdWFsPzogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW5cbik6IFdyaXRhYmxlU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIHNpZ25hbCh2YWx1ZSwge1xuICAgIGVxdWFsOiBjdXN0b21FcXVhbCB8fCBlcXVhbCxcbiAgfSk7XG59XG5cbi8qKlxuICogTFJVIENhY2hlIGltcGxlbWVudGF0aW9uIGZvciBlZmZpY2llbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAqL1xuY2xhc3MgTFJVQ2FjaGU8SywgVj4ge1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxLLCBWPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyKSB7fVxuXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FjaGUuc2l6ZSA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgaWYgZXhpc3RzIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7IC8vIEFkZCB0byBlbmQgKG1vc3QgcmVjZW50KVxuICB9XG5cbiAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTW92ZSB0byBlbmQgKG1hcmsgYXMgcmVjZW50bHkgdXNlZClcbiAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhY2hlLnNpemU7XG4gIH1cbn1cblxuLy8gUGF0aCBwYXJzaW5nIGNhY2hlIHdpdGggcHJvcGVyIExSVSBldmljdGlvbiBzdHJhdGVneVxuY29uc3QgTUFYX0NBQ0hFX1NJWkUgPSAxMDAwO1xuY29uc3QgcGF0aENhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgc3RyaW5nW10+KE1BWF9DQUNIRV9TSVpFKTtcblxuLyoqXG4gKiBQYXJzZXMgYSBkb3Qtbm90YXRpb24gcGF0aCBpbnRvIGFuIGFycmF5IG9mIGtleXMgd2l0aCBpbnRlbGxpZ2VudCBjYWNoaW5nLlxuICpcbiAqIENvbnZlcnRzIHN0cmluZyBwYXRocyBsaWtlICd1c2VyLnByb2ZpbGUubmFtZScgaW50byBhcnJheXMgWyd1c2VyJywgJ3Byb2ZpbGUnLCAnbmFtZSddXG4gKiBmb3IgZWZmaWNpZW50IG5lc3RlZCBwcm9wZXJ0eSBhY2Nlc3MuIFVzZXMgTFJVIGNhY2hpbmcgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2VcbiAqIGZvciBmcmVxdWVudGx5IGFjY2Vzc2VkIHBhdGhzIHdoaWxlIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gRG90LW5vdGF0aW9uIHBhdGggc3RyaW5nIHRvIHBhcnNlXG4gKiBAcmV0dXJucyBBcnJheSBvZiBwcm9wZXJ0eSBrZXlzIGZvciBuZXN0ZWQgYWNjZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEJhc2ljIHBhdGggcGFyc2luZ1xuICogcGFyc2VQYXRoKCd1c2VyLm5hbWUnKTsgICAgICAgICAgIC8vIFsndXNlcicsICduYW1lJ11cbiAqIHBhcnNlUGF0aCgnZGF0YS5pdGVtcy4wLnRpdGxlJyk7ICAvLyBbJ2RhdGEnLCAnaXRlbXMnLCAnMCcsICd0aXRsZSddXG4gKiBwYXJzZVBhdGgoJ3NldHRpbmdzJyk7ICAgICAgICAgICAgLy8gWydzZXR0aW5ncyddXG4gKlxuICogLy8gQ2FjaGVkIGZvciBwZXJmb3JtYW5jZVxuICogcGFyc2VQYXRoKCd1c2VyLnByb2ZpbGUubmFtZScpOyAgIC8vIFBhcnNlcyBhbmQgY2FjaGVzXG4gKiBwYXJzZVBhdGgoJ3VzZXIucHJvZmlsZS5uYW1lJyk7ICAgLy8gUmV0dXJucyBjYWNoZWQgcmVzdWx0XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gVXNlZCBpbnRlcm5hbGx5IGZvciBuZXN0ZWQgc3RhdGUgYWNjZXNzXG4gKiBjb25zdCBzdG9yZSA9IHNpZ25hbFRyZWUoe1xuICogICB1c2VyOiB7IHByb2ZpbGU6IHsgbmFtZTogJ0pvaG4nIH0gfVxuICogfSk7XG4gKlxuICogLy8gSW50ZXJuYWxseSB1c2VzIHBhcnNlUGF0aCBmb3IgZWZmaWNpZW50IGFjY2Vzc1xuICogc3RvcmUudXNlci5wcm9maWxlLm5hbWUuc2V0KCdKYW5lJyk7XG4gKlxuICogLy8gT3Igd2l0aCBzdHJpbmcgcGF0aHMgaW4gZXh0ZW5zaW9uc1xuICogc2V0TmVzdGVkVmFsdWUoc3RvcmUsICd1c2VyLnByb2ZpbGUubmFtZScsICdCb2InKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY2FjaGVkID0gcGF0aENhY2hlLmdldChwYXRoKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgcGF0aENhY2hlLnNldChwYXRoLCBwYXJ0cyk7XG4gIHJldHVybiBwYXJ0cztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF6eSBzaWduYWwgdHJlZSB1c2luZyBQcm94eSBmb3Igb24tZGVtYW5kIHNpZ25hbCBjcmVhdGlvbi5cbiAqIE9ubHkgY3JlYXRlcyBzaWduYWxzIHdoZW4gcHJvcGVydGllcyBhcmUgZmlyc3QgYWNjZXNzZWQuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vSkJvcmdpYS9zaWduYWx0cmVlL2Jsb2IvbWFpbi9kb2NzL2FwaS9jcmVhdGUtbGF6eS1zaWduYWwtdHJlZS5tZFxuICogQHBhcmFtIG9iaiAtIFNvdXJjZSBvYmplY3QgdG8gbGF6aWx5IHNpZ25hbGlmeVxuICogQHBhcmFtIGVxdWFsaXR5Rm4gLSBFcXVhbGl0eSBmdW5jdGlvbiBmb3Igc2lnbmFsIGNvbXBhcmlzb25cbiAqIEBwYXJhbSBiYXNlUGF0aCAtIEJhc2UgcGF0aCBmb3IgbmVzdGVkIG9iamVjdHMgKGludGVybmFsIHVzZSlcbiAqIEByZXR1cm5zIFByb3hpZWQgb2JqZWN0IHRoYXQgY3JlYXRlcyBzaWduYWxzIG9uIGZpcnN0IGFjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF6eVNpZ25hbFRyZWU8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbiAgZXF1YWxpdHlGbjogKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4sXG4gIGJhc2VQYXRoID0gJydcbik6IERlZXBTaWduYWxpZnk8VD4ge1xuICAvLyBVc2UgTWFwIGluc3RlYWQgb2YgV2Vha01hcCBmb3IgYmV0dGVyIGNvbnRyb2wgb3ZlciBjbGVhbnVwXG4gIGNvbnN0IHNpZ25hbENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFdyaXRhYmxlU2lnbmFsPHVua25vd24+PigpO1xuICBjb25zdCBuZXN0ZWRQcm94aWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbiAgLy8gVHJhY2sgY2xlYW51cCBmdW5jdGlvbnMgZm9yIG5lc3RlZCBwcm94aWVzXG4gIGNvbnN0IG5lc3RlZENsZWFudXBzID0gbmV3IE1hcDxzdHJpbmcsICgpID0+IHZvaWQ+KCk7XG5cbiAgLy8gRW5oYW5jZWQgY2xlYW51cCBmdW5jdGlvblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIC8vIENsZWFuIHVwIGFsbCBuZXN0ZWQgcHJveGllcyBmaXJzdFxuICAgIG5lc3RlZENsZWFudXBzLmZvckVhY2goKGNsZWFudXBGbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2xlYW51cEZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGR1cmluZyBuZXN0ZWQgY2xlYW51cDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmVzdGVkQ2xlYW51cHMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyIGNhY2hlc1xuICAgIHNpZ25hbENhY2hlLmNsZWFyKCk7XG4gICAgbmVzdGVkUHJveGllcy5jbGVhcigpO1xuICB9O1xuXG4gIC8vIEVuaGFuY2VkIGJ1aWx0LWluIG9iamVjdCBkZXRlY3Rpb25cbiAgY29uc3QgaXNCdWlsdEluT2JqZWN0ID0gKHY6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiAoXG4gICAgICB2IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFJlZ0V4cCB8fFxuICAgICAgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBTZXQgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBXZWFrTWFwIHx8XG4gICAgICB2IGluc3RhbmNlb2YgV2Vha1NldCB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICB2IGluc3RhbmNlb2YgRGF0YVZpZXcgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICAgdiBpbnN0YW5jZW9mIFByb21pc2UgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkwgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEJsb2IgfHxcbiAgICAgICh0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEZpbGUpXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQodGFyZ2V0OiBvYmplY3QsIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgLy8gSGFuZGxlIGNsZWFudXAgbWV0aG9kXG4gICAgICBpZiAocHJvcCA9PT0gJ19fY2xlYW51cF9fJykge1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN5bWJvbCBwcm9wZXJ0aWVzIChsaWtlIFN5bWJvbC5pdGVyYXRvcikgbm9ybWFsbHlcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW3Byb3BdO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaW5zcGVjdGlvbiBtZXRob2RzXG4gICAgICBpZiAocHJvcCA9PT0gJ3ZhbHVlT2YnIHx8IHByb3AgPT09ICd0b1N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pW3Byb3BdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSBwcm9wIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aCA/IGAke2Jhc2VQYXRofS4ke2tleX1gIDoga2V5O1xuXG4gICAgICAvLyBTYWZldHkgY2hlY2sgZm9yIHByb3BlcnR5IGV4aXN0ZW5jZVxuICAgICAgaWYgKCEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSBzaWduYWwsIHJldHVybiBpdFxuICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHNpZ25hbCBmb3IgdGhpcyBwYXRoXG4gICAgICBpZiAoc2lnbmFsQ2FjaGUuaGFzKHBhdGgpKSB7XG4gICAgICAgIHJldHVybiBzaWduYWxDYWNoZS5nZXQocGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBuZXN0ZWQgcHJveHkgY2FjaGVkXG4gICAgICBpZiAobmVzdGVkUHJveGllcy5oYXMocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIG5lc3RlZFByb3hpZXMuZ2V0KHBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIG9iamVjdHMgLSBjcmVhdGUgbGF6eSBwcm94eVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAhaXNTaWduYWwodmFsdWUpICYmXG4gICAgICAgICFpc0J1aWx0SW5PYmplY3QodmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRQcm94eSA9IGNyZWF0ZUxhenlTaWduYWxUcmVlKFxuICAgICAgICAgICAgdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICBlcXVhbGl0eUZuLFxuICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBuZXN0ZWRQcm94aWVzLnNldChwYXRoLCBuZXN0ZWRQcm94eSk7XG5cbiAgICAgICAgICAvLyBTdG9yZSBjbGVhbnVwIGZ1bmN0aW9uIGZvciBuZXN0ZWQgcHJveHlcbiAgICAgICAgICBjb25zdCBwcm94eVdpdGhDbGVhbnVwID0gbmVzdGVkUHJveHkgYXMgeyBfX2NsZWFudXBfXz86ICgpID0+IHZvaWQgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHByb3h5V2l0aENsZWFudXAuX19jbGVhbnVwX18gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lc3RlZENsZWFudXBzLnNldChwYXRoLCBwcm94eVdpdGhDbGVhbnVwLl9fY2xlYW51cF9fKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmVzdGVkUHJveHk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgbGF6eSBwcm94eSBmb3IgcGF0aCBcIiR7cGF0aH1cIjpgLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIEZhbGxiYWNrOiBjcmVhdGUgYSBzaWduYWwgZm9yIHRoZSBvYmplY3RcbiAgICAgICAgICBjb25zdCBmYWxsYmFja1NpZ25hbCA9IHNpZ25hbCh2YWx1ZSwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KTtcbiAgICAgICAgICBzaWduYWxDYWNoZS5zZXQocGF0aCwgZmFsbGJhY2tTaWduYWwpO1xuICAgICAgICAgIHJldHVybiBmYWxsYmFja1NpZ25hbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgc2lnbmFsIGZvciBwcmltaXRpdmUgdmFsdWVzLCBhcnJheXMsIGFuZCBidWlsdC1pbiBvYmplY3RzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdTaWduYWwgPSBzaWduYWwodmFsdWUsIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSk7XG4gICAgICAgIHNpZ25hbENhY2hlLnNldChwYXRoLCBuZXdTaWduYWwpO1xuICAgICAgICByZXR1cm4gbmV3U2lnbmFsO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hbCBmb3IgcGF0aCBcIiR7cGF0aH1cIjpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiB2YWx1ZTsgLy8gUmV0dXJuIHJhdyB2YWx1ZSBhcyBmYWxsYmFja1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXQodGFyZ2V0OiBvYmplY3QsIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHByb3AgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgb3JpZ2luYWwgb2JqZWN0XG4gICAgICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgY2FjaGVkIHNpZ25hbCwgdXBkYXRlIGl0XG4gICAgICAgIGNvbnN0IGNhY2hlZFNpZ25hbCA9IHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgICAgaWYgKGNhY2hlZFNpZ25hbCAmJiAnc2V0JyBpbiBjYWNoZWRTaWduYWwpIHtcbiAgICAgICAgICAoY2FjaGVkU2lnbmFsIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgbmVzdGVkIHByb3h5IGNhY2hlIGlmIHRoZSB2YWx1ZSB0eXBlIGNoYW5nZWRcbiAgICAgICAgaWYgKG5lc3RlZFByb3hpZXMuaGFzKHBhdGgpKSB7XG4gICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIG5lc3RlZCBwcm94eVxuICAgICAgICAgIGNvbnN0IG5lc3RlZENsZWFudXAgPSBuZXN0ZWRDbGVhbnVwcy5nZXQocGF0aCk7XG4gICAgICAgICAgaWYgKG5lc3RlZENsZWFudXApIHtcbiAgICAgICAgICAgIG5lc3RlZENsZWFudXAoKTtcbiAgICAgICAgICAgIG5lc3RlZENsZWFudXBzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmVzdGVkUHJveGllcy5kZWxldGUocGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNldCB2YWx1ZSBmb3IgcGF0aCBcIiR7cGF0aH1cIjpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AgaW4gdGFyZ2V0O1xuICAgIH0sXG5cbiAgICBvd25LZXlzKHRhcmdldCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICAgIH0sXG5cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcHJveHkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbn1cblxuLyoqXG4gKiBOYXRpdmUgZGVlcCBlcXVhbGl0eSBjaGVjayBmb3IgYXJyYXlzIGFuZCBvYmplY3RzLlxuICogQWxpYXMgZm9yIHRoZSBlbmhhbmNlZCBlcXVhbCBmdW5jdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZXBFcXVhbCA9IGVxdWFsO1xuXG4vKipcbiAqIFNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbDxUPihhOiBULCBiOiBUKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBBcnJheS5pc0FycmF5KGIpKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgY29uc3Qga2V5c0IgPSBPYmplY3Qua2V5cyhiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0EpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gIT09XG4gICAgICAgIChiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=","import { signal, computed, effect, inject, DestroyRef, isSignal, } from '@angular/core';\nimport { createLazySignalTree, equal } from './utils';\nfunction estimateObjectSize(obj, maxDepth = 3, currentDepth = 0) {\n if (currentDepth >= maxDepth)\n return 1;\n if (obj === null || obj === undefined)\n return 0;\n if (typeof obj !== 'object')\n return 1;\n let size = 0;\n try {\n if (Array.isArray(obj)) {\n size = obj.length;\n const sampleSize = Math.min(3, obj.length);\n for (let i = 0; i < sampleSize; i++) {\n size += estimateObjectSize(obj[i], maxDepth, currentDepth + 1) * 0.1;\n }\n }\n else {\n const keys = Object.keys(obj);\n size = keys.length;\n const sampleSize = Math.min(5, keys.length);\n for (let i = 0; i < sampleSize; i++) {\n const value = obj[keys[i]];\n size += estimateObjectSize(value, maxDepth, currentDepth + 1) * 0.5;\n }\n }\n }\n catch {\n return 1;\n }\n return Math.floor(size);\n}\nfunction shouldUseLazy(obj, config) {\n if (config.useLazySignals !== undefined) {\n return config.useLazySignals;\n }\n if (config.debugMode || config.enableDevTools) {\n return false;\n }\n if (config.batchUpdates && config.useMemoization) {\n return true;\n }\n const estimatedSize = estimateObjectSize(obj);\n return estimatedSize > 50;\n}\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\nfunction isBuiltInObject(v) {\n if (v === null || v === undefined)\n return false;\n if (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 return true;\n }\n if (v instanceof Int8Array ||\n v instanceof Uint8Array ||\n v instanceof Uint8ClampedArray ||\n v instanceof Int16Array ||\n v instanceof Uint16Array ||\n v instanceof Int32Array ||\n v instanceof Uint32Array ||\n v instanceof Float32Array ||\n v instanceof Float64Array ||\n v instanceof BigInt64Array ||\n v instanceof BigUint64Array) {\n return true;\n }\n if (typeof window !== 'undefined') {\n if (v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File) ||\n (typeof FileList !== 'undefined' && v instanceof FileList) ||\n (typeof Headers !== 'undefined' && v instanceof Headers) ||\n (typeof Request !== 'undefined' && v instanceof Request) ||\n (typeof Response !== 'undefined' && v instanceof Response) ||\n (typeof AbortController !== 'undefined' &&\n v instanceof AbortController) ||\n (typeof AbortSignal !== 'undefined' && v instanceof AbortSignal)) {\n return true;\n }\n }\n try {\n const NodeBuffer = globalThis?.Buffer;\n if (NodeBuffer && v instanceof NodeBuffer) {\n return true;\n }\n }\n catch {\n }\n return false;\n}\nfunction create(obj, config = {}) {\n if (obj === null || obj === undefined) {\n throw new Error('Cannot create SignalTree from null or undefined');\n }\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n const useLazy = shouldUseLazy(obj, config);\n if (config.debugMode) {\n const estimatedSize = estimateObjectSize(obj);\n console.log(`[SignalTree] Creating tree with ${useLazy ? 'lazy' : 'eager'} strategy (estimated size: ${estimatedSize})`);\n }\n let signalState;\n try {\n if (useLazy && typeof obj === 'object') {\n signalState = createLazySignalTree(obj, equalityFn);\n }\n else {\n signalState = createSignalStore(obj, equalityFn);\n }\n }\n catch (error) {\n if (useLazy) {\n console.warn('[SignalTree] Lazy creation failed, falling back to eager:', error);\n signalState = createSignalStore(obj, equalityFn);\n }\n else {\n throw error;\n }\n }\n const resultTree = {\n state: signalState,\n $: signalState,\n };\n enhanceTree(resultTree, config);\n return resultTree;\n}\nfunction createSignalStore(obj, equalityFn) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return signal(obj, { equal: equalityFn });\n }\n if (Array.isArray(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n if (isBuiltInObject(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n const store = {};\n const processedObjects = new WeakSet();\n if (processedObjects.has(obj)) {\n console.warn('[SignalTree] Circular reference detected, creating reference signal');\n return signal(obj, { equal: equalityFn });\n }\n processedObjects.add(obj);\n try {\n for (const [key, value] of Object.entries(obj)) {\n try {\n if (typeof key === 'symbol')\n continue;\n if (isSignal(value)) {\n store[key] = value;\n continue;\n }\n if (value === null || value === undefined) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (typeof value !== 'object') {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (Array.isArray(value) || isBuiltInObject(value)) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else {\n store[key] = createSignalStore(value, equalityFn);\n }\n }\n catch (error) {\n console.warn(`[SignalTree] Failed to create signal for key \"${key}\":`, error);\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n try {\n if (isSignal(value)) {\n store[sym] = value;\n }\n else {\n store[sym] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n catch (error) {\n console.warn(`[SignalTree] Failed to create signal for symbol key:`, error);\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}\nfunction enhanceTree(tree, config = {}) {\n const isLazy = config.useLazySignals ?? shouldUseLazy(tree.state, config);\n tree.unwrap = () => {\n const unwrapObject = (obj) => {\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n if (isSignal(obj)) {\n return obj();\n }\n if (isSignal(obj)) {\n const value = obj();\n if (Array.isArray(value)) {\n return value;\n }\n }\n const result = {};\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key))\n continue;\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 !isBuiltInObject(value)) {\n result[key] = unwrapObject(value);\n }\n else {\n result[key] = value;\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n if (isSignal(value)) {\n result[sym] = value();\n }\n else {\n result[sym] = value;\n }\n }\n return result;\n };\n return unwrapObject(tree.state);\n };\n tree.update = (updater) => {\n const transactionLog = [];\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 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 const originalValue = currentSignalOrState();\n transactionLog.push({\n path: currentPath,\n oldValue: originalValue,\n newValue: updateValue,\n });\n currentSignalOrState.set(updateValue);\n }\n else if (typeof updateValue === 'object' &&\n updateValue !== null &&\n !Array.isArray(updateValue) &&\n !isBuiltInObject(updateValue) &&\n typeof currentSignalOrState === 'object' &&\n currentSignalOrState !== null &&\n !isSignal(currentSignalOrState)) {\n updateObject(currentSignalOrState, updateValue, currentPath);\n }\n else if (currentSignalOrState === undefined) {\n console.warn(`[SignalTree] Cannot update non-existent path: ${currentPath}`);\n }\n }\n catch (error) {\n console.error(`[SignalTree] Failed to update path \"${currentPath}\":`, error);\n throw error;\n }\n }\n };\n updateObject(tree.state, partialObj);\n if (config.debugMode && transactionLog.length > 0) {\n console.log('[SignalTree] Update transaction:', transactionLog);\n }\n }\n catch (error) {\n console.error('[SignalTree] Update failed, attempting rollback:', error);\n for (const { path, oldValue } of transactionLog.reverse()) {\n try {\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 const lastKey = pathParts[pathParts.length - 1];\n const targetSignal = current[lastKey];\n if (isSignal(targetSignal)) {\n targetSignal.set(oldValue);\n }\n }\n }\n catch (rollbackError) {\n console.error('[SignalTree] Rollback failed for path:', path, rollbackError);\n }\n }\n throw error;\n }\n };\n tree.pipe = ((...fns) => {\n if (fns.length === 0) {\n return tree;\n }\n return fns.reduce((acc, fn) => {\n if (typeof fn !== 'function') {\n throw new Error('All pipe arguments must be functions');\n }\n try {\n return fn(acc);\n }\n catch (error) {\n console.error('[SignalTree] Pipe function failed:', error);\n throw error;\n }\n }, tree);\n });\n tree.destroy = () => {\n try {\n if (isLazy) {\n const state = tree.state;\n if (state && typeof state === 'object' && '__cleanup__' in state) {\n const cleanup = state.__cleanup__;\n if (typeof cleanup === 'function') {\n cleanup();\n }\n }\n }\n if (config.debugMode) {\n console.log('[SignalTree] Tree destroyed');\n }\n }\n catch (error) {\n console.error('[SignalTree] Error during cleanup:', error);\n }\n };\n addStubMethods(tree, config);\n return tree;\n}\nfunction addStubMethods(tree, config) {\n tree.batchUpdate = (updater) => {\n console.warn('⚠️ batchUpdate() called but batching is not enabled.', 'To enable batch updates, install @signaltree/batching');\n tree.update(updater);\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn('⚠️ memoize() called but memoization is not enabled.', 'To enable memoized computations, install @signaltree/memoization');\n void cacheKey;\n return computed(() => fn(tree.unwrap()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree.unwrap()));\n }\n catch (error) {\n if (config.debugMode) {\n console.warn('Effect requires Angular injection context', error);\n }\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 if (config.debugMode) {\n console.warn('Subscribe requires Angular injection context', error);\n }\n fn(tree.unwrap());\n return () => {\n };\n }\n };\n tree.optimize = () => {\n if (config.debugMode) {\n console.warn('⚠️ optimize() called but tree optimization is not available.');\n }\n };\n tree.clearCache = () => {\n if (config.debugMode) {\n console.warn('⚠️ clearCache() called but caching is not available.');\n }\n };\n tree.invalidatePattern = () => {\n if (config.debugMode) {\n console.warn('⚠️ invalidatePattern() called but performance optimization is not enabled.');\n }\n return 0;\n };\n tree.getMetrics = () => {\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n tree.addTap = (middleware) => {\n if (config.debugMode) {\n console.warn('⚠️ addTap() called but middleware support is not available.');\n }\n void middleware;\n };\n tree.removeTap = (id) => {\n if (config.debugMode) {\n console.warn('⚠️ removeTap() called but middleware support is not available.');\n }\n void id;\n };\n tree.asCrud = () => {\n if (config.debugMode) {\n console.warn('⚠️ asCrud() called but entity helpers are not available.');\n }\n return {};\n };\n tree.asyncAction = (operation, asyncConfig = {}) => {\n if (config.debugMode) {\n console.warn('⚠️ asyncAction() called but async actions are not available.');\n }\n void operation;\n void asyncConfig;\n return {};\n };\n tree.undo = () => {\n if (config.debugMode) {\n console.warn('⚠️ undo() called but time travel is not available.');\n }\n };\n tree.redo = () => {\n if (config.debugMode) {\n console.warn('⚠️ redo() called but time travel is not available.');\n }\n };\n tree.getHistory = () => {\n if (config.debugMode) {\n console.warn('⚠️ getHistory() called but time travel is not available.');\n }\n return [];\n };\n tree.resetHistory = () => {\n if (config.debugMode) {\n console.warn('⚠️ resetHistory() called but time travel is not available.');\n }\n };\n}\nexport function signalTree(obj, configOrPreset) {\n if (typeof configOrPreset === 'string') {\n const presetConfigs = {\n basic: {\n useLazySignals: false,\n debugMode: false,\n },\n performance: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n useShallowComparison: true,\n },\n development: {\n useLazySignals: false,\n debugMode: true,\n enableDevTools: true,\n trackPerformance: true,\n },\n production: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n debugMode: false,\n },\n };\n const config = presetConfigs[configOrPreset];\n if (!config) {\n console.warn(`Unknown preset: ${configOrPreset}, using default configuration`);\n return create(obj, {});\n }\n return create(obj, config);\n }\n const config = configOrPreset || {};\n return create(obj, config);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBYXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFTdEQsU0FBUyxrQkFBa0IsQ0FDekIsR0FBWSxFQUNaLFFBQVEsR0FBRyxDQUFDLEVBQ1osWUFBWSxHQUFHLENBQUM7SUFFaEIsSUFBSSxZQUFZLElBQUksUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUViLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBRWxCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7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RUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFHRCxNQUFNLE1BQU0sR0FBRyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3BDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduYWxUcmVlIENvcmUgdjEuMS42IC0gTUlUIExpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAyNSBKb25hdGhhbiBEIEJvcmdpYVxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vSkJvcmdpYS9zaWduYWx0cmVlL2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgc2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgU2lnbmFsLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIERlc3Ryb3lSZWYsXG4gIGlzU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgU2lnbmFsVHJlZSxcbiAgRGVlcFNpZ25hbGlmeSxcbiAgVHJlZUNvbmZpZyxcbiAgVHJlZVByZXNldCxcbiAgTWlkZGxld2FyZSxcbiAgUGVyZm9ybWFuY2VNZXRyaWNzLFxuICBFbnRpdHlIZWxwZXJzLFxuICBBc3luY0FjdGlvbkNvbmZpZyxcbiAgQXN5bmNBY3Rpb24sXG4gIFRpbWVUcmF2ZWxFbnRyeSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBFUkZPUk1BTkNFIEhFVVJJU1RJQ1Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRXN0aW1hdGVzIHRoZSBzaXplIG9mIGFuIG9iamVjdCBmb3Igc3RyYXRlZ3kgc2VsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGVzdGltYXRlT2JqZWN0U2l6ZShcbiAgb2JqOiB1bmtub3duLFxuICBtYXhEZXB0aCA9IDMsXG4gIGN1cnJlbnREZXB0aCA9IDBcbik6IG51bWJlciB7XG4gIGlmIChjdXJyZW50RGVwdGggPj0gbWF4RGVwdGgpIHJldHVybiAxO1xuICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gMTtcblxuICBsZXQgc2l6ZSA9IDA7XG5cbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICBzaXplID0gb2JqLmxlbmd0aDtcbiAgICAgIC8vIFNhbXBsZSBmaXJzdCBmZXcgaXRlbXMgZm9yIG5lc3RlZCBzaXplIGVzdGltYXRpb25cbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbigzLCBvYmoubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIHNpemUgKz0gZXN0aW1hdGVPYmplY3RTaXplKG9ialtpXSwgbWF4RGVwdGgsIGN1cnJlbnREZXB0aCArIDEpICogMC4xO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgIHNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICAgIC8vIFNhbXBsZSBmaXJzdCBmZXcgcHJvcGVydGllcyBmb3IgbmVzdGVkIHNpemUgZXN0aW1hdGlvblxuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKDUsIGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5c1tpXV07XG4gICAgICAgIHNpemUgKz0gZXN0aW1hdGVPYmplY3RTaXplKHZhbHVlLCBtYXhEZXB0aCwgY3VycmVudERlcHRoICsgMSkgKiAwLjU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBJZiB3ZSBjYW4ndCBlc3RpbWF0ZSwgYXNzdW1lIHNtYWxsXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihzaXplKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGxhenkgc2lnbmFsIGNyZWF0aW9uIGJhc2VkIG9uIG9iamVjdCBjaGFyYWN0ZXJpc3RpY3NcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlTGF6eShvYmo6IHVua25vd24sIGNvbmZpZzogVHJlZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAvLyBFeHBsaWNpdCBjb25maWd1cmF0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgaWYgKGNvbmZpZy51c2VMYXp5U2lnbmFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvbmZpZy51c2VMYXp5U2lnbmFscztcbiAgfVxuXG4gIC8vIERldmVsb3BtZW50IG1vZGU6IHByZWZlciBlYWdlciBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICBpZiAoY29uZmlnLmRlYnVnTW9kZSB8fCBjb25maWcuZW5hYmxlRGV2VG9vbHMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBQZXJmb3JtYW5jZSBtb2RlOiBhbHdheXMgdXNlIGxhenlcbiAgaWYgKGNvbmZpZy5iYXRjaFVwZGF0ZXMgJiYgY29uZmlnLnVzZU1lbW9pemF0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBBdXRvLWRldGVjdCBiYXNlZCBvbiBzaXplXG4gIGNvbnN0IGVzdGltYXRlZFNpemUgPSBlc3RpbWF0ZU9iamVjdFNpemUob2JqKTtcblxuICAvLyBVc2UgbGF6eSBmb3Igb2JqZWN0cyB3aXRoIG1vcmUgdGhhbiA1MCBlc3RpbWF0ZWQgcHJvcGVydGllc1xuICByZXR1cm4gZXN0aW1hdGVkU2l6ZSA+IDUwO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZXF1YWxpdHkgZnVuY3Rpb24gYmFzZWQgb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gdXNlU2hhbGxvd0NvbXBhcmlzb24gLSBJZiB0cnVlLCB1c2VzIE9iamVjdC5pcyBmb3IgY29tcGFyaXNvbjsgb3RoZXJ3aXNlIHVzZXMgZGVlcCBlcXVhbGl0eVxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byB2YWx1ZXMgZm9yIGVxdWFsaXR5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVxdWFsaXR5Rm4odXNlU2hhbGxvd0NvbXBhcmlzb246IGJvb2xlYW4pIHtcbiAgcmV0dXJuIHVzZVNoYWxsb3dDb21wYXJpc29uID8gT2JqZWN0LmlzIDogZXF1YWw7XG59XG5cbi8qKlxuICogRW5oYW5jZWQgYnVpbHQtaW4gb2JqZWN0IGRldGVjdGlvbiB3aXRoIGNvbXByZWhlbnNpdmUgY292ZXJhZ2VcbiAqL1xuZnVuY3Rpb24gaXNCdWlsdEluT2JqZWN0KHY6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29yZSBKYXZhU2NyaXB0IGJ1aWx0LWluc1xuICBpZiAoXG4gICAgdiBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICB2IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgfHxcbiAgICB2IGluc3RhbmNlb2YgTWFwIHx8XG4gICAgdiBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHYgaW5zdGFuY2VvZiBXZWFrTWFwIHx8XG4gICAgdiBpbnN0YW5jZW9mIFdlYWtTZXQgfHxcbiAgICB2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICB2IGluc3RhbmNlb2YgRGF0YVZpZXcgfHxcbiAgICB2IGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICB2IGluc3RhbmNlb2YgUHJvbWlzZVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFR5cGVkIEFycmF5c1xuICBpZiAoXG4gICAgdiBpbnN0YW5jZW9mIEludDhBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIEludDE2QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgVWludDE2QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBVaW50MzJBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgQmlnVWludDY0QXJyYXlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBXZWIgQVBJcyAod2hlbiBhdmFpbGFibGUpXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkwgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEJsb2IgfHxcbiAgICAgICh0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEZpbGUpIHx8XG4gICAgICAodHlwZW9mIEZpbGVMaXN0ICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZUxpc3QpIHx8XG4gICAgICAodHlwZW9mIEhlYWRlcnMgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBIZWFkZXJzKSB8fFxuICAgICAgKHR5cGVvZiBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgUmVxdWVzdCkgfHxcbiAgICAgICh0eXBlb2YgUmVzcG9uc2UgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBSZXNwb25zZSkgfHxcbiAgICAgICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB2IGluc3RhbmNlb2YgQWJvcnRDb250cm9sbGVyKSB8fFxuICAgICAgKHR5cGVvZiBBYm9ydFNpZ25hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gTm9kZS5qcyBidWlsdC1pbnMgKHdoZW4gYXZhaWxhYmxlKVxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgTm9kZUJ1ZmZlciA9IChnbG9iYWxUaGlzIGFzIGFueSk/LkJ1ZmZlcjtcbiAgICBpZiAoTm9kZUJ1ZmZlciAmJiB2IGluc3RhbmNlb2YgTm9kZUJ1ZmZlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUgaWYgQnVmZmVyIGlzIG5vdCBhdmFpbGFibGVcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb3JlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGJhc2ljIFNpZ25hbFRyZWUgd2l0aCBlbmhhbmNlZCBzYWZldHkgYW5kIHNtYXJ0IHN0cmF0ZWd5IHNlbGVjdGlvbi5cbiAqIFRoaXMgcHJvdmlkZXMgdGhlIG1pbmltYWwgZnVuY3Rpb25hbGl0eSB3aXRob3V0IGFkdmFuY2VkIGZlYXR1cmVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHN0YXRlIG9iamVjdCB0eXBlIChOTyBjb25zdHJhaW50cyAtIG1heGltdW0gZmxleGliaWxpdHkpXG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0XG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgdHJlZVxuICogQHJldHVybnMgQSBiYXNpYyBTaWduYWxUcmVlIHdpdGggY29yZSBmdW5jdGlvbmFsaXR5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZTxUPihvYmo6IFQsIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9KTogU2lnbmFsVHJlZTxUPiB7XG4gIC8vIFZhbGlkYXRlIGlucHV0XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgU2lnbmFsVHJlZSBmcm9tIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gIH1cblxuICBjb25zdCBlcXVhbGl0eUZuID0gY3JlYXRlRXF1YWxpdHlGbihjb25maWcudXNlU2hhbGxvd0NvbXBhcmlzb24gPz8gZmFsc2UpO1xuICBjb25zdCB1c2VMYXp5ID0gc2hvdWxkVXNlTGF6eShvYmosIGNvbmZpZyk7XG5cbiAgLy8gTG9nIHN0cmF0ZWd5IHNlbGVjdGlvbiBpbiBkZWJ1ZyBtb2RlXG4gIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IGVzdGltYXRlT2JqZWN0U2l6ZShvYmopO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtTaWduYWxUcmVlXSBDcmVhdGluZyB0cmVlIHdpdGggJHtcbiAgICAgICAgdXNlTGF6eSA/ICdsYXp5JyA6ICdlYWdlcidcbiAgICAgIH0gc3RyYXRlZ3kgKGVzdGltYXRlZCBzaXplOiAke2VzdGltYXRlZFNpemV9KWBcbiAgICApO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHNpZ25hbHMgdXNpbmcgYXBwcm9wcmlhdGUgc3RyYXRlZ3lcbiAgbGV0IHNpZ25hbFN0YXRlOiBEZWVwU2lnbmFsaWZ5PFQ+O1xuXG4gIHRyeSB7XG4gICAgaWYgKHVzZUxhenkgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHNpZ25hbFN0YXRlID0gY3JlYXRlTGF6eVNpZ25hbFRyZWUoXG4gICAgICAgIG9iaiBhcyBvYmplY3QsXG4gICAgICAgIGVxdWFsaXR5Rm5cbiAgICAgICkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgICB9IGVsc2Uge1xuICAgICAgc2lnbmFsU3RhdGUgPSBjcmVhdGVTaWduYWxTdG9yZShvYmosIGVxdWFsaXR5Rm4pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBGYWxsYmFjayB0byBlYWdlciBpZiBsYXp5IGZhaWxzXG4gICAgaWYgKHVzZUxhenkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tTaWduYWxUcmVlXSBMYXp5IGNyZWF0aW9uIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGVhZ2VyOicsXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgICAgc2lnbmFsU3RhdGUgPSBjcmVhdGVTaWduYWxTdG9yZShvYmosIGVxdWFsaXR5Rm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXN1bHRUcmVlID0ge1xuICAgIHN0YXRlOiBzaWduYWxTdGF0ZSxcbiAgICAkOiBzaWduYWxTdGF0ZSwgLy8gJCBwb2ludHMgdG8gdGhlIHNhbWUgc3RhdGUgb2JqZWN0XG4gIH0gYXMgU2lnbmFsVHJlZTxUPjtcblxuICBlbmhhbmNlVHJlZShyZXN1bHRUcmVlLCBjb25maWcpO1xuICByZXR1cm4gcmVzdWx0VHJlZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHNpZ25hbHMgdXNpbmcgc2lnbmFsLXN0b3JlIHBhdHRlcm4gZm9yIHBlcmZlY3QgdHlwZSBpbmZlcmVuY2UuXG4gKiBFYWdlciBjcmVhdGlvbiAtIGFsbCBzaWduYWxzIGNyZWF0ZWQgaW1tZWRpYXRlbHkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vSkJvcmdpYS9zaWduYWx0cmVlL2Jsb2IvbWFpbi9kb2NzL2FwaS9jcmVhdGUtc2lnbmFsLXN0b3JlLm1kXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSBvYmplY3QgdHlwZSB0byBwcm9jZXNzIChwcmVzZXJ2ZXMgZXhhY3QgdHlwZSBzdHJ1Y3R1cmUpXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIHNpZ25hbHNcbiAqIEBwYXJhbSBlcXVhbGl0eUZuIC0gRnVuY3Rpb24gdG8gY29tcGFyZSB2YWx1ZXMgZm9yIGVxdWFsaXR5XG4gKiBAcmV0dXJucyBBIGRlZXBseSBzaWduYWxpZmllZCB2ZXJzaW9uIG1haW50YWluaW5nIGV4YWN0IHR5cGUgc3RydWN0dXJlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNpZ25hbFN0b3JlPFQ+KFxuICBvYmo6IFQsXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuXG4pOiBEZWVwU2lnbmFsaWZ5PFQ+IHtcbiAgLy8gSGFuZGxlIHByaW1pdGl2ZXMgYW5kIG51bGwvdW5kZWZpbmVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG5cbiAgLy8gSGFuZGxlIGFycmF5cyAtIHRyZWF0IGFzIHByaW1pdGl2ZSBzaWduYWxcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBzaWduYWwob2JqLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pIGFzIERlZXBTaWduYWxpZnk8VD47XG4gIH1cblxuICAvLyBIYW5kbGUgYnVpbHQtaW4gb2JqZWN0cyAtIHRyZWF0IGFzIHByaW1pdGl2ZSBzaWduYWxcbiAgaWYgKGlzQnVpbHRJbk9iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIHNpZ25hbChvYmosIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgfVxuXG4gIGNvbnN0IHN0b3JlOiBQYXJ0aWFsPERlZXBTaWduYWxpZnk8VD4+ID0ge307XG4gIGNvbnN0IHByb2Nlc3NlZE9iamVjdHMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLy8gUHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzXG4gIGlmIChwcm9jZXNzZWRPYmplY3RzLmhhcyhvYmogYXMgb2JqZWN0KSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdbU2lnbmFsVHJlZV0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkLCBjcmVhdGluZyByZWZlcmVuY2Ugc2lnbmFsJ1xuICAgICk7XG4gICAgcmV0dXJuIHNpZ25hbChvYmosIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgfVxuICBwcm9jZXNzZWRPYmplY3RzLmFkZChvYmogYXMgb2JqZWN0KTtcblxuICB0cnkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNraXAgc3ltYm9sIGtleXMgZm9yIG5vdyAoaGFuZGxlIHNlcGFyYXRlbHkgaWYgbmVlZGVkKVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIE5ldmVyIGRvdWJsZS13cmFwIHNpZ25hbHNcbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCB2YWx1ZSB0eXBlc1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vIFByaW1pdGl2ZXNcbiAgICAgICAgICAoc3RvcmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBzaWduYWwodmFsdWUsIHtcbiAgICAgICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzQnVpbHRJbk9iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBBcnJheXMgYW5kIGJ1aWx0LWluIG9iamVjdHNcbiAgICAgICAgICAoc3RvcmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBzaWduYWwodmFsdWUsIHtcbiAgICAgICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3RzIC0gcmVjdXJzZVxuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IGNyZWF0ZVNpZ25hbFN0b3JlKFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBlcXVhbGl0eUZuXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2lnbmFsVHJlZV0gRmFpbGVkIHRvIGNyZWF0ZSBzaWduYWwgZm9yIGtleSBcIiR7a2V5fVwiOmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgLy8gRmFsbGJhY2s6IHRyZWF0IGFzIHByaW1pdGl2ZVxuICAgICAgICAoc3RvcmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSBzaWduYWwodmFsdWUsIHtcbiAgICAgICAgICBlcXVhbDogZXF1YWxpdHlGbixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHN5bWJvbCBwcm9wZXJ0aWVzIGlmIHByZXNlbnRcbiAgICBjb25zdCBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuICAgIGZvciAoY29uc3Qgc3ltIG9mIHN5bWJvbHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICAoc3RvcmUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoc3RvcmUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV0gPSBzaWduYWwodmFsdWUsIHtcbiAgICAgICAgICAgIGVxdWFsOiBlcXVhbGl0eUZuLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtTaWduYWxUcmVlXSBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hbCBmb3Igc3ltYm9sIGtleTpgLFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hbCBzdG9yZTogJHtcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcidcbiAgICAgIH1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzdG9yZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xufVxuXG4vKipcbiAqIEVuaGFuY2VzIGEgdHJlZSB3aXRoIGJhc2ljIGZ1bmN0aW9uYWxpdHkgKHVud3JhcCwgdXBkYXRlLCBwaXBlKS5cbiAqIEFkZHMgY29yZSBtZXRob2RzIHRoYXQgZXZlcnkgU2lnbmFsVHJlZSBuZWVkcyBmb3IgYmFzaWMgb3BlcmF0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHN0YXRlIG9iamVjdCB0eXBlXG4gKiBAcGFyYW0gdHJlZSAtIFRoZSB0cmVlIHRvIGVuaGFuY2Ugd2l0aCBiYXNpYyBmdW5jdGlvbmFsaXR5XG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiB1c2VkIGR1cmluZyB0cmVlIGNyZWF0aW9uXG4gKiBAcmV0dXJucyBUaGUgZW5oYW5jZWQgdHJlZSB3aXRoIHVud3JhcCwgdXBkYXRlLCBhbmQgcGlwZSBtZXRob2RzXG4gKi9cbmZ1bmN0aW9uIGVuaGFuY2VUcmVlPFQ+KFxuICB0cmVlOiBTaWduYWxUcmVlPFQ+LFxuICBjb25maWc6IFRyZWVDb25maWcgPSB7fVxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIC8vIFRyYWNrIGlmIHRoaXMgdHJlZSB1c2VzIGxhenkgc2lnbmFscyBmb3IgcHJvcGVyIGNsZWFudXBcbiAgY29uc3QgaXNMYXp5ID0gY29uZmlnLnVzZUxhenlTaWduYWxzID8/IHNob3VsZFVzZUxhenkodHJlZS5zdGF0ZSwgY29uZmlnKTtcblxuICAvKipcbiAgICogVW53cmFwcyB0aGUgY3VycmVudCBzdGF0ZSBieSByZWFkaW5nIGFsbCBzaWduYWwgdmFsdWVzLlxuICAgKiBSZWN1cnNpdmVseSBjb252ZXJ0cyB0aGUgc2lnbmFsIHRyZWUgYmFjayB0byBwbGFpbiBKYXZhU2NyaXB0IHZhbHVlcy5cbiAgICovXG4gIHRyZWUudW53cmFwID0gKCk6IFQgPT4ge1xuICAgIGNvbnN0IHVud3JhcE9iamVjdCA9IDxPPihvYmo6IERlZXBTaWduYWxpZnk8Tz4pOiBPID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBPO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc2lnbmFscyBkaXJlY3RseVxuICAgICAgaWYgKGlzU2lnbmFsKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIChvYmogYXMgU2lnbmFsPE8+KSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYXJyYXlzICh3aGljaCBhcmUgc2lnbmFscyBpbiBvdXIgc3RydWN0dXJlKVxuICAgICAgaWYgKGlzU2lnbmFsKG9iaikpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIE87XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAgICFpc0J1aWx0SW5PYmplY3QodmFsdWUpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIE5lc3RlZCBzaWduYWwgc3RhdGVcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcE9iamVjdCh2YWx1ZSBhcyBEZWVwU2lnbmFsaWZ5PG9iamVjdD4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN5bWJvbCBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuICAgICAgZm9yIChjb25zdCBzeW0gb2Ygc3ltYm9scykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV07XG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICAocmVzdWx0IGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtzeW1dID0gKFxuICAgICAgICAgICAgdmFsdWUgYXMgU2lnbmFsPHVua25vd24+XG4gICAgICAgICAgKSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0IGFzIE87XG4gICAgfTtcblxuICAgIHJldHVybiB1bndyYXBPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+KTtcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc3RhdGUgdXNpbmcgYW4gdXBkYXRlciBmdW5jdGlvbiB3aXRoIHRyYW5zYWN0aW9uIHN1cHBvcnQuXG4gICAqL1xuICB0cmVlLnVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uTG9nOiBBcnJheTx7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBvbGRWYWx1ZTogdW5rbm93bjtcbiAgICAgIG5ld1ZhbHVlOiB1bmtub3duO1xuICAgIH0+ID0gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdHJlZS51bndyYXAoKTtcbiAgICAgIGNvbnN0IHBhcnRpYWxPYmogPSB1cGRhdGVyKGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgIGlmICghcGFydGlhbE9iaiB8fCB0eXBlb2YgcGFydGlhbE9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGRhdGVyIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVPYmplY3QgPSA8Tz4oXG4gICAgICAgIHRhcmdldDogRGVlcFNpZ25hbGlmeTxPPixcbiAgICAgICAgdXBkYXRlczogUGFydGlhbDxPPixcbiAgICAgICAgcGF0aCA9ICcnXG4gICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVwZGF0ZXMsIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSB1cGRhdGVzW2tleV07XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50U2lnbmFsT3JTdGF0ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnRTaWduYWxPclN0YXRlKSkge1xuICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gKGN1cnJlbnRTaWduYWxPclN0YXRlIGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Mb2cucHVzaCh7XG4gICAgICAgICAgICAgICAgcGF0aDogY3VycmVudFBhdGgsXG4gICAgICAgICAgICAgICAgb2xkVmFsdWU6IG9yaWdpbmFsVmFsdWUsXG4gICAgICAgICAgICAgICAgbmV3VmFsdWU6IHVwZGF0ZVZhbHVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKGN1cnJlbnRTaWduYWxPclN0YXRlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQoXG4gICAgICAgICAgICAgICAgdXBkYXRlVmFsdWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHR5cGVvZiB1cGRhdGVWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgdXBkYXRlVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkodXBkYXRlVmFsdWUpICYmXG4gICAgICAgICAgICAgICFpc0J1aWx0SW5PYmplY3QodXBkYXRlVmFsdWUpICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBjdXJyZW50U2lnbmFsT3JTdGF0ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgY3VycmVudFNpZ25hbE9yU3RhdGUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgIWlzU2lnbmFsKGN1cnJlbnRTaWduYWxPclN0YXRlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgLSByZWN1cnNlXG4gICAgICAgICAgICAgIHVwZGF0ZU9iamVjdChcbiAgICAgICAgICAgICAgICBjdXJyZW50U2lnbmFsT3JTdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PG9iamVjdD4sXG4gICAgICAgICAgICAgICAgdXBkYXRlVmFsdWUgYXMgUGFydGlhbDxvYmplY3Q+LFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRTaWduYWxPclN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGBbU2lnbmFsVHJlZV0gQ2Fubm90IHVwZGF0ZSBub24tZXhpc3RlbnQgcGF0aDogJHtjdXJyZW50UGF0aH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBbU2lnbmFsVHJlZV0gRmFpbGVkIHRvIHVwZGF0ZSBwYXRoIFwiJHtjdXJyZW50UGF0aH1cIjpgLFxuICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0byB0cmlnZ2VyIHJvbGxiYWNrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB1cGRhdGVPYmplY3QodHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXJ0aWFsT2JqKTtcblxuICAgICAgLy8gTG9nIHRyYW5zYWN0aW9uIGluIGRlYnVnIG1vZGVcbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlICYmIHRyYW5zYWN0aW9uTG9nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaWduYWxUcmVlXSBVcGRhdGUgdHJhbnNhY3Rpb246JywgdHJhbnNhY3Rpb25Mb2cpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSb2xsYmFjayBvbiBlcnJvclxuICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFRyZWVdIFVwZGF0ZSBmYWlsZWQsIGF0dGVtcHRpbmcgcm9sbGJhY2s6JywgZXJyb3IpO1xuXG4gICAgICAvLyBBdHRlbXB0IHRvIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWVzIGZyb20gdHJhbnNhY3Rpb24gbG9nXG4gICAgICBmb3IgKGNvbnN0IHsgcGF0aCwgb2xkVmFsdWUgfSBvZiB0cmFuc2FjdGlvbkxvZy5yZXZlcnNlKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgICAgICAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSB0cmVlLnN0YXRlO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoUGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhdGhQYXJ0c1tpXV07XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnQpIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0S2V5ID0gcGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFNpZ25hbCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtsYXN0S2V5XTtcbiAgICAgICAgICAgIGlmIChpc1NpZ25hbCh0YXJnZXRTaWduYWwpKSB7XG4gICAgICAgICAgICAgICh0YXJnZXRTaWduYWwgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldChvbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICdbU2lnbmFsVHJlZV0gUm9sbGJhY2sgZmFpbGVkIGZvciBwYXRoOicsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgcm9sbGJhY2tFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIC8vIFBpcGUgaW1wbGVtZW50YXRpb24gZm9yIGZ1bmN0aW9uIGNvbXBvc2l0aW9uXG4gIHRyZWUucGlwZSA9ICg8VFJlc3VsdCA9IFNpZ25hbFRyZWU8VD4+KFxuICAgIC4uLmZuczogQXJyYXk8KGlucHV0OiB1bmtub3duKSA9PiB1bmtub3duPlxuICApOiBUUmVzdWx0ID0+IHtcbiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRyZWUgYXMgdW5rbm93biBhcyBUUmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBmbnMucmVkdWNlKChhY2MsIGZuKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIHBpcGUgYXJndW1lbnRzIG11c3QgYmUgZnVuY3Rpb25zJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oYWNjKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaWduYWxUcmVlXSBQaXBlIGZ1bmN0aW9uIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0sIHRyZWUgYXMgdW5rbm93bikgYXMgVFJlc3VsdDtcbiAgfSkgYXMgU2lnbmFsVHJlZTxUPlsncGlwZSddO1xuXG4gIC8vIEVuaGFuY2VkIGRlc3Ryb3kgd2l0aCBwcm9wZXIgY2xlYW51cFxuICB0cmVlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENsZWFuIHVwIGxhenkgc2lnbmFsIHByb3hpZXMgaWYgdGhleSBleGlzdFxuICAgICAgaWYgKGlzTGF6eSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRyZWUuc3RhdGUgYXMgdW5rbm93bjtcbiAgICAgICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gJ29iamVjdCcgJiYgJ19fY2xlYW51cF9fJyBpbiBzdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoc3RhdGUgYXMgeyBfX2NsZWFudXBfXzogdW5rbm93biB9KS5fX2NsZWFudXBfXztcbiAgICAgICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgYW55IGVmZmVjdHMgb3Igc3Vic2NyaXB0aW9uc1xuICAgICAgLy8gKFRoaXMgd291bGQgYmUgdHJhY2tlZCBpZiB3ZSBtYWludGFpbiBhIGxpc3Qgb2YgYWN0aXZlIGVmZmVjdHMpXG5cbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2lnbmFsVHJlZV0gVHJlZSBkZXN0cm95ZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpZ25hbFRyZWVdIEVycm9yIGR1cmluZyBjbGVhbnVwOicsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQWRkIHN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhZHZhbmNlZCBmZWF0dXJlc1xuICBhZGRTdHViTWV0aG9kcyh0cmVlLCBjb25maWcpO1xuXG4gIHJldHVybiB0cmVlO1xufVxuXG4vKipcbiAqIEFkZHMgc3R1YiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFkdmFuY2VkIGZlYXR1cmVzXG4gKi9cbmZ1bmN0aW9uIGFkZFN0dWJNZXRob2RzPFQ+KHRyZWU6IFNpZ25hbFRyZWU8VD4sIGNvbmZpZzogVHJlZUNvbmZpZyk6IHZvaWQge1xuICAvLyBTdHViIGltcGxlbWVudGF0aW9ucyBmb3IgYWR2YW5jZWQgZmVhdHVyZXMgKHdpbGwgbG9nIHdhcm5pbmdzKVxuICB0cmVlLmJhdGNoVXBkYXRlID0gKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ+KaoO+4jyBiYXRjaFVwZGF0ZSgpIGNhbGxlZCBidXQgYmF0Y2hpbmcgaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdUbyBlbmFibGUgYmF0Y2ggdXBkYXRlcywgaW5zdGFsbCBAc2lnbmFsdHJlZS9iYXRjaGluZydcbiAgICApO1xuICAgIC8vIEZhbGxiYWNrOiBKdXN0IGNhbGwgdXBkYXRlIGRpcmVjdGx5XG4gICAgdHJlZS51cGRhdGUodXBkYXRlcik7XG4gIH07XG5cbiAgdHJlZS5tZW1vaXplID0gPFI+KGZuOiAodHJlZTogVCkgPT4gUiwgY2FjaGVLZXk/OiBzdHJpbmcpOiBTaWduYWw8Uj4gPT4ge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICfimqDvuI8gbWVtb2l6ZSgpIGNhbGxlZCBidXQgbWVtb2l6YXRpb24gaXMgbm90IGVuYWJsZWQuJyxcbiAgICAgICdUbyBlbmFibGUgbWVtb2l6ZWQgY29tcHV0YXRpb25zLCBpbnN0YWxsIEBzaWduYWx0cmVlL21lbW9pemF0aW9uJ1xuICAgICk7XG4gICAgdm9pZCBjYWNoZUtleTsgLy8gTWFyayBhcyBpbnRlbnRpb25hbGx5IHVudXNlZFxuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBmbih0cmVlLnVud3JhcCgpKSk7XG4gIH07XG5cbiAgdHJlZS5lZmZlY3QgPSAoZm46ICh0cmVlOiBUKSA9PiB2b2lkKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGVmZmVjdCgoKSA9PiBmbih0cmVlLnVud3JhcCgpKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50cyB3aXRob3V0IGluamVjdGlvbiBjb250ZXh0XG4gICAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0VmZmVjdCByZXF1aXJlcyBBbmd1bGFyIGluamVjdGlvbiBjb250ZXh0JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0cmVlLnN1YnNjcmliZSA9IChmbjogKHRyZWU6IFQpID0+IHZvaWQpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgICAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGVmZmVjdFJlZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICBmbih0cmVlLnVud3JhcCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIGVmZmVjdFJlZi5kZXN0cm95KCk7XG4gICAgICB9O1xuXG4gICAgICBkZXN0cm95UmVmLm9uRGVzdHJveSh1bnN1YnNjcmliZSk7XG4gICAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50XG4gICAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1N1YnNjcmliZSByZXF1aXJlcyBBbmd1bGFyIGluamVjdGlvbiBjb250ZXh0JywgZXJyb3IpO1xuICAgICAgfVxuICAgICAgZm4odHJlZS51bndyYXAoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBOby1vcCB1bnN1YnNjcmliZVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgLy8gUGVyZm9ybWFuY2Ugc3R1YnNcbiAgdHJlZS5vcHRpbWl6ZSA9ICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIG9wdGltaXplKCkgY2FsbGVkIGJ1dCB0cmVlIG9wdGltaXphdGlvbiBpcyBub3QgYXZhaWxhYmxlLidcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuY2xlYXJDYWNoZSA9ICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gY2xlYXJDYWNoZSgpIGNhbGxlZCBidXQgY2FjaGluZyBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgfTtcblxuICB0cmVlLmludmFsaWRhdGVQYXR0ZXJuID0gKCk6IG51bWJlciA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ+KaoO+4jyBpbnZhbGlkYXRlUGF0dGVybigpIGNhbGxlZCBidXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGlzIG5vdCBlbmFibGVkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9O1xuXG4gIHRyZWUuZ2V0TWV0cmljcyA9ICgpOiBQZXJmb3JtYW5jZU1ldHJpY3MgPT4ge1xuICAgIC8vIFJldHVybiBhY3R1YWwgbWV0cmljcyBpZiB3ZSdyZSB0cmFja2luZyB0aGVtXG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICBjb21wdXRhdGlvbnM6IDAsXG4gICAgICBjYWNoZUhpdHM6IDAsXG4gICAgICBjYWNoZU1pc3NlczogMCxcbiAgICAgIGF2ZXJhZ2VVcGRhdGVUaW1lOiAwLFxuICAgIH07XG4gIH07XG5cbiAgLy8gTWlkZGxld2FyZSBzdHVic1xuICB0cmVlLmFkZFRhcCA9IChtaWRkbGV3YXJlOiBNaWRkbGV3YXJlPFQ+KSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ+KaoO+4jyBhZGRUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLidcbiAgICAgICk7XG4gICAgfVxuICAgIHZvaWQgbWlkZGxld2FyZTtcbiAgfTtcblxuICB0cmVlLnJlbW92ZVRhcCA9IChpZDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ+KaoO+4jyByZW1vdmVUYXAoKSBjYWxsZWQgYnV0IG1pZGRsZXdhcmUgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLidcbiAgICAgICk7XG4gICAgfVxuICAgIHZvaWQgaWQ7XG4gIH07XG5cbiAgLy8gRW50aXR5IGhlbHBlcnMgc3R1YlxuICB0cmVlLmFzQ3J1ZCA9IDxFIGV4dGVuZHMgeyBpZDogc3RyaW5nIHwgbnVtYmVyIH0+KCk6IEVudGl0eUhlbHBlcnM8RT4gPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBhc0NydWQoKSBjYWxsZWQgYnV0IGVudGl0eSBoZWxwZXJzIGFyZSBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgICByZXR1cm4ge30gYXMgRW50aXR5SGVscGVyczxFPjtcbiAgfTtcblxuICAvLyBBc3luYyBhY3Rpb24gc3R1YlxuICB0cmVlLmFzeW5jQWN0aW9uID0gPFRJbnB1dCwgVFJlc3VsdD4oXG4gICAgb3BlcmF0aW9uOiAoaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTxUUmVzdWx0PixcbiAgICBhc3luY0NvbmZpZzogQXN5bmNBY3Rpb25Db25maWc8VCwgVFJlc3VsdD4gPSB7fVxuICApOiBBc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+ID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIGFzeW5jQWN0aW9uKCkgY2FsbGVkIGJ1dCBhc3luYyBhY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlLidcbiAgICAgICk7XG4gICAgfVxuICAgIHZvaWQgb3BlcmF0aW9uO1xuICAgIHZvaWQgYXN5bmNDb25maWc7XG4gICAgcmV0dXJuIHt9IGFzIEFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD47XG4gIH07XG5cbiAgLy8gVGltZSB0cmF2ZWwgc3R1YnNcbiAgdHJlZS51bmRvID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyB1bmRvKCkgY2FsbGVkIGJ1dCB0aW1lIHRyYXZlbCBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgfTtcblxuICB0cmVlLnJlZG8gPSAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIHJlZG8oKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuZ2V0SGlzdG9yeSA9ICgpOiBUaW1lVHJhdmVsRW50cnk8VD5bXSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybign4pqg77iPIGdldEhpc3RvcnkoKSBjYWxsZWQgYnV0IHRpbWUgdHJhdmVsIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICB0cmVlLnJlc2V0SGlzdG9yeSA9ICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAn4pqg77iPIHJlc2V0SGlzdG9yeSgpIGNhbGxlZCBidXQgdGltZSB0cmF2ZWwgaXMgbm90IGF2YWlsYWJsZS4nXG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBVQkxJQyBBUElcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlYWN0aXZlIHNpZ25hbCB0cmVlIHdpdGggc21hcnQgcHJvZ3Jlc3NpdmUgZW5oYW5jZW1lbnQuXG4gKlxuICogQXV0b21hdGljYWxseSBjb252ZXJ0cyBwbGFpbiBvYmplY3RzIGludG8gYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aGVyZSBlYWNoIHByb3BlcnR5XG4gKiBiZWNvbWVzIGEgd3JpdGFibGUgc2lnbmFsLiBQcm92aWRlcyBpbnRlbGxpZ2VudCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLCBhdXRvbWF0aWNcbiAqIGNoYW5nZSBkZXRlY3Rpb24sIGFuZCBzZWFtbGVzcyBpbnRlZ3JhdGlvbiB3aXRoIEFuZ3VsYXIncyBzaWduYWwgc3lzdGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IChubyBjb25zdHJhaW50cyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eSlcbiAqIEBwYXJhbSBvYmogLSBUaGUgaW5pdGlhbCBzdGF0ZSBvYmplY3QgdG8gY29udmVydCBpbnRvIGEgcmVhY3RpdmUgdHJlZVxuICogQHJldHVybnMgQSBTaWduYWxUcmVlIHdpdGggYXV0by1lbmFibGluZyBmZWF0dXJlcyBhbmQgcmVhY3RpdmUgcHJvcGVydGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBCYXNpYyB1c2FnZSAtIHNpbXBsZSBzdGF0ZSBtYW5hZ2VtZW50XG4gKiBjb25zdCBzdGF0ZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCwgdXNlcjogeyBuYW1lOiAnSm9obicgfSB9KTtcbiAqXG4gKiAvLyBBY2Nlc3MgcmVhY3RpdmUgcHJvcGVydGllc1xuICogY29uc29sZS5sb2coc3RhdGUuY291bnQoKSk7IC8vIDBcbiAqIGNvbnNvbGUubG9nKHN0YXRlLnVzZXIubmFtZSgpKTsgLy8gJ0pvaG4nXG4gKlxuICogLy8gVXBkYXRlIHN0YXRlXG4gKiBzdGF0ZS5jb3VudC5zZXQoMSk7XG4gKiBzdGF0ZS51c2VyLm5hbWUuc2V0KCdKYW5lJyk7XG4gKlxuICogLy8gQmF0Y2ggdXBkYXRlc1xuICogc3RhdGUudXBkYXRlKGN1cnJlbnQgPT4gKHtcbiAqICAgY291bnQ6IGN1cnJlbnQuY291bnQgKyAxLFxuICogICB1c2VyOiB7IC4uLmN1cnJlbnQudXNlciwgbmFtZTogJ0JvYicgfVxuICogfSkpO1xuICpcbiAqIC8vIFN1YnNjcmliZSB0byBjaGFuZ2VzXG4gKiBzdGF0ZS5zdWJzY3JpYmUobmV3U3RhdGUgPT4ge1xuICogICBjb25zb2xlLmxvZygnU3RhdGUgY2hhbmdlZDonLCBuZXdTdGF0ZSk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBZHZhbmNlZCB1c2FnZSB3aXRoIGVmZmVjdHMgYW5kIGNvbXB1dGVkIHZhbHVlc1xuICogaW50ZXJmYWNlIEFwcFN0YXRlIHtcbiAqICAgdG9kb3M6IFRvZG9bXTtcbiAqICAgZmlsdGVyOiAnYWxsJyB8ICdhY3RpdmUnIHwgJ2NvbXBsZXRlZCc7XG4gKiB9XG4gKlxuICogY29uc3Qgc3RvcmUgPSBzaWduYWxUcmVlPEFwcFN0YXRlPih7XG4gKiAgIHRvZG9zOiBbXSxcbiAqICAgZmlsdGVyOiAnYWxsJ1xuICogfSk7XG4gKlxuICogLy8gQ3JlYXRlIGNvbXB1dGVkIHZhbHVlc1xuICogY29uc3QgZmlsdGVyZWRUb2RvcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAqICAgY29uc3QgdG9kb3MgPSBzdG9yZS50b2RvcygpO1xuICogICBjb25zdCBmaWx0ZXIgPSBzdG9yZS5maWx0ZXIoKTtcbiAqICAgcmV0dXJuIHRvZG9zLmZpbHRlcih0b2RvID0+XG4gKiAgICAgZmlsdGVyID09PSAnYWxsJyB8fFxuICogICAgIChmaWx0ZXIgPT09ICdhY3RpdmUnICYmICF0b2RvLmNvbXBsZXRlZCkgfHxcbiAqICAgICAoZmlsdGVyID09PSAnY29tcGxldGVkJyAmJiB0b2RvLmNvbXBsZXRlZClcbiAqICAgKTtcbiAqIH0pO1xuICpcbiAqIC8vIFJlYWN0IHRvIHN0YXRlIGNoYW5nZXNcbiAqIHN0b3JlLmVmZmVjdChzdGF0ZSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKGAke3N0YXRlLnRvZG9zLmxlbmd0aH0gdG9kb3MsIHNob3dpbmcgJHtzdGF0ZS5maWx0ZXJ9YCk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQpOiBTaWduYWxUcmVlPFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aXRoIHByZXNldCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFVzZXMgcHJlZGVmaW5lZCBjb25maWd1cmF0aW9ucyBvcHRpbWl6ZWQgZm9yIGNvbW1vbiB1c2UgY2FzZXMuXG4gKiBBdmFpbGFibGUgcHJlc2V0czogJ2Jhc2ljJywgJ3BlcmZvcm1hbmNlJywgJ2RldmVsb3BtZW50JywgJ3Byb2R1Y3Rpb24nLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBwcmVzZXQgLSBQcmVkZWZpbmVkIGNvbmZpZ3VyYXRpb24gcHJlc2V0XG4gKiBAcmV0dXJucyBBIFNpZ25hbFRyZWUgY29uZmlndXJlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlc2V0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIERldmVsb3BtZW50IHByZXNldCAtIGVuaGFuY2VkIGRlYnVnZ2luZ1xuICogY29uc3QgZGV2U3RvcmUgPSBzaWduYWxUcmVlKHsgY291bnQ6IDAgfSwgJ2RldmVsb3BtZW50Jyk7XG4gKiAvLyBFbmFibGVzOiBkZWJ1Z01vZGUsIGVuYWJsZURldlRvb2xzLCB0cmFja1BlcmZvcm1hbmNlXG4gKlxuICogLy8gUHJvZHVjdGlvbiBwcmVzZXQgLSBvcHRpbWl6ZWQgcGVyZm9ybWFuY2VcbiAqIGNvbnN0IHByb2RTdG9yZSA9IHNpZ25hbFRyZWUoeyBjb3VudDogMCB9LCAncHJvZHVjdGlvbicpO1xuICogLy8gRW5hYmxlczogdXNlTGF6eVNpZ25hbHMsIGJhdGNoVXBkYXRlcywgdXNlTWVtb2l6YXRpb25cbiAqXG4gKiAvLyBQZXJmb3JtYW5jZSBwcmVzZXQgLSBtYXhpbXVtIG9wdGltaXphdGlvblxuICogY29uc3QgcGVyZlN0b3JlID0gc2lnbmFsVHJlZSh7IHVzZXJzOiBbXSB9LCAncGVyZm9ybWFuY2UnKTtcbiAqIC8vIEVuYWJsZXM6IHVzZUxhenlTaWduYWxzLCBiYXRjaFVwZGF0ZXMsIHVzZU1lbW9pemF0aW9uLCB1c2VTaGFsbG93Q29tcGFyaXNvblxuICpcbiAqIC8vIEJhc2ljIHByZXNldCAtIG1pbmltYWwgZmVhdHVyZXNcbiAqIGNvbnN0IGJhc2ljU3RvcmUgPSBzaWduYWxUcmVlKHsgZGF0YToge30gfSwgJ2Jhc2ljJyk7XG4gKiAvLyBNaW5pbWFsIG92ZXJoZWFkLCBubyBvcHRpbWl6YXRpb25zXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4ob2JqOiBULCBwcmVzZXQ6IFRyZWVQcmVzZXQpOiBTaWduYWxUcmVlPFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWFjdGl2ZSBzaWduYWwgdHJlZSB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFByb3ZpZGVzIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgU2lnbmFsVHJlZSBiZWhhdmlvciBhbmQgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzLlxuICogVXNlIHRoaXMgb3ZlcmxvYWQgd2hlbiB5b3UgbmVlZCBzcGVjaWZpYyBvcHRpbWl6YXRpb24gc2V0dGluZ3Mgb3IgZGVidWdnaW5nIGZlYXR1cmVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0XG4gKiBAcGFyYW0gb2JqIC0gVGhlIGluaXRpYWwgc3RhdGUgb2JqZWN0IHRvIGNvbnZlcnQgaW50byBhIHJlYWN0aXZlIHRyZWVcbiAqIEBwYXJhbSBjb25maWcgLSBDdXN0b20gY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIEEgU2lnbmFsVHJlZSBjb25maWd1cmVkIHdpdGggdGhlIHNwZWNpZmllZCBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEN1c3RvbSBjb25maWd1cmF0aW9uIGZvciBzcGVjaWZpYyBuZWVkc1xuICogY29uc3Qgc3RvcmUgPSBzaWduYWxUcmVlKHtcbiAqICAgdXNlcnM6IFtdLFxuICogICBzZXR0aW5nczogeyB0aGVtZTogJ2RhcmsnIH1cbiAqIH0sIHtcbiAqICAgdXNlTGF6eVNpZ25hbHM6IHRydWUsICAgICAgLy8gQ3JlYXRlIHNpZ25hbHMgb24tZGVtYW5kXG4gKiAgIGJhdGNoVXBkYXRlczogdHJ1ZSwgICAgICAgIC8vIEdyb3VwIHJhcGlkIHVwZGF0ZXNcbiAqICAgdXNlTWVtb2l6YXRpb246IHRydWUsICAgICAgLy8gQ2FjaGUgY29tcHV0ZWQgdmFsdWVzXG4gKiAgIGRlYnVnTW9kZTogZmFsc2UsICAgICAgICAgIC8vIFByb2R1Y3Rpb24gbW9kZVxuICogICBlbmFibGVEZXZUb29sczogZmFsc2UsICAgICAvLyBObyBkZXYgdG9vbHNcbiAqICAgdHJhY2tQZXJmb3JtYW5jZTogdHJ1ZSwgICAgLy8gTW9uaXRvciBwZXJmb3JtYW5jZVxuICogICB1c2VTaGFsbG93Q29tcGFyaXNvbjogZmFsc2UgLy8gRGVlcCBlcXVhbGl0eSBjaGVja2luZ1xuICogfSk7XG4gKlxuICogLy8gQWNjZXNzIHBlcmZvcm1hbmNlIG1ldHJpY3NcbiAqIGNvbnN0IG1ldHJpY3MgPSBzdG9yZS5nZXRNZXRyaWNzKCk7XG4gKiBjb25zb2xlLmxvZyhgVXBkYXRlczogJHttZXRyaWNzLnVwZGF0ZUNvdW50fSwgVGltZTogJHttZXRyaWNzLnRvdGFsVGltZX1tc2ApO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENvbmZpZ3VyYXRpb24gZm9yIGxhcmdlIGRhdGFzZXRzXG4gKiBjb25zdCBiaWdEYXRhU3RvcmUgPSBzaWduYWxUcmVlKGxhcmdlRGF0YXNldCwge1xuICogICB1c2VMYXp5U2lnbmFsczogdHJ1ZSwgICAgICAgIC8vIEVzc2VudGlhbCBmb3IgbGFyZ2Ugb2JqZWN0c1xuICogICB1c2VTaGFsbG93Q29tcGFyaXNvbjogdHJ1ZSwgIC8vIEZhc3RlciBjb21wYXJpc29uc1xuICogICBiYXRjaFVwZGF0ZXM6IHRydWUsICAgICAgICAgIC8vIFByZXZlbnQgVUkgdGhyYXNoaW5nXG4gKiAgIHVzZU1lbW9pemF0aW9uOiB0cnVlLCAgICAgICAgLy8gQ2FjaGUgZXhwZW5zaXZlIGNvbXB1dGF0aW9uc1xuICogICBkZWJ1Z01vZGU6IGZhbHNlICAgICAgICAgICAgIC8vIE5vIGRlYnVnIG92ZXJoZWFkXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQsIGNvbmZpZzogVHJlZUNvbmZpZyk6IFNpZ25hbFRyZWU8VD47XG5cbi8qKlxuICogTWFpbiBTaWduYWxUcmVlIGZhY3RvcnkgZnVuY3Rpb24gd2l0aCBzdXBlcmlvciB0eXBlIGluZmVyZW5jZS5cbiAqXG4gKiBUaGlzIG92ZXJsb2FkIHByb3ZpZGVzIGVuaGFuY2VkIFR5cGVTY3JpcHQgaW5mZXJlbmNlIGZvciBvYmplY3QgdHlwZXMsXG4gKiBlbnN1cmluZyBhbGwgcHJvcGVydGllcyBhcmUgcHJvcGVybHkgdHlwZWQgYW5kIHJlYWN0aXZlLiBJZGVhbCBmb3JcbiAqIHN0cm9uZ2x5LXR5cGVkIGFwcGxpY2F0aW9ucyB3aGVyZSB0eXBlIHNhZmV0eSBpcyBwYXJhbW91bnQuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBPYmplY3QgdHlwZSBleHRlbmRpbmcgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gZm9yIGJldHRlciBpbmZlcmVuY2VcbiAqIEBwYXJhbSBvYmogLSBSZXF1aXJlZCBzdGF0ZSBvYmplY3Qgd2l0aCBhbGwgcHJvcGVydGllcyBkZWZpbmVkXG4gKiBAcGFyYW0gY29uZmlnT3JQcmVzZXQgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9iamVjdCBvciBwcmVzZXQgc3RyaW5nXG4gKiBAcmV0dXJucyBBIFNpZ25hbFRyZWUgd2l0aCBlbmhhbmNlZCB0eXBlIHNhZmV0eSBhbmQgaW5mZXJlbmNlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEVuaGFuY2VkIHR5cGUgaW5mZXJlbmNlXG4gKiBjb25zdCB0eXBlZFN0b3JlID0gc2lnbmFsVHJlZSh7XG4gKiAgIHVzZXI6IHsgaWQ6IDEsIG5hbWU6ICdKb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9LFxuICogICBzZXR0aW5nczogeyB0aGVtZTogJ2RhcmsnLCBub3RpZmljYXRpb25zOiB0cnVlIH0sXG4gKiAgIGRhdGE6IHsgaXRlbXM6IFtdLCBsb2FkaW5nOiBmYWxzZSwgZXJyb3I6IG51bGwgfVxuICogfSBhcyBjb25zdCk7XG4gKlxuICogLy8gVHlwZVNjcmlwdCBrbm93cyBleGFjdCB0eXBlc1xuICogdHlwZWRTdG9yZS51c2VyLmlkLnNldCgyKTsgICAgICAgICAgIC8vIG51bWJlclxuICogdHlwZWRTdG9yZS5zZXR0aW5ncy50aGVtZS5zZXQoJ2xpZ2h0Jyk7IC8vICdkYXJrJyB8ICdsaWdodCdcbiAqIHR5cGVkU3RvcmUuZGF0YS5sb2FkaW5nLnNldCh0cnVlKTsgICAvLyBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb2JqOiBSZXF1aXJlZDxUPixcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxSZXF1aXJlZDxUPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KFxuICBvYmo6IFQsXG4gIGNvbmZpZ09yUHJlc2V0PzogVHJlZUNvbmZpZyB8IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD47XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxUcmVlPFQ+KFxuICBvYmo6IFQsXG4gIGNvbmZpZ09yUHJlc2V0PzogVHJlZUNvbmZpZyB8IFRyZWVQcmVzZXRcbik6IFNpZ25hbFRyZWU8VD4ge1xuICAvLyBIYW5kbGUgcHJlc2V0IHN0cmluZ3NcbiAgaWYgKHR5cGVvZiBjb25maWdPclByZXNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBNYXAgcHJlc2V0IHRvIGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBwcmVzZXRDb25maWdzOiBSZWNvcmQ8VHJlZVByZXNldCwgUGFydGlhbDxUcmVlQ29uZmlnPj4gPSB7XG4gICAgICBiYXNpYzoge1xuICAgICAgICB1c2VMYXp5U2lnbmFsczogZmFsc2UsXG4gICAgICAgIGRlYnVnTW9kZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgcGVyZm9ybWFuY2U6IHtcbiAgICAgICAgdXNlTGF6eVNpZ25hbHM6IHRydWUsXG4gICAgICAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAgICAgICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gICAgICAgIHVzZVNoYWxsb3dDb21wYXJpc29uOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGRldmVsb3BtZW50OiB7XG4gICAgICAgIHVzZUxhenlTaWduYWxzOiBmYWxzZSwgLy8gRWFnZXIgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgICAgZGVidWdNb2RlOiB0cnVlLFxuICAgICAgICBlbmFibGVEZXZUb29sczogdHJ1ZSxcbiAgICAgICAgdHJhY2tQZXJmb3JtYW5jZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICBwcm9kdWN0aW9uOiB7XG4gICAgICAgIHVzZUxhenlTaWduYWxzOiB0cnVlLFxuICAgICAgICBiYXRjaFVwZGF0ZXM6IHRydWUsXG4gICAgICAgIHVzZU1lbW9pemF0aW9uOiB0cnVlLFxuICAgICAgICBkZWJ1Z01vZGU6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uZmlnID0gcHJlc2V0Q29uZmlnc1tjb25maWdPclByZXNldF07XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFVua25vd24gcHJlc2V0OiAke2NvbmZpZ09yUHJlc2V0fSwgdXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBjcmVhdGUob2JqLCB7fSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGUob2JqLCBjb25maWcpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBvciBkZWZhdWx0XG4gIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ09yUHJlc2V0IHx8IHt9O1xuICByZXR1cm4gY3JlYXRlKG9iaiwgY29uZmlnKTtcbn1cbiJdfQ=="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signaltree-core.mjs","sources":["../tmp-esm2022/lib/constants.js","../tmp-esm2022/lib/types.js","../tmp-esm2022/lib/enhancers.js","../tmp-esm2022/lib/utils.js","../tmp-esm2022/lib/signal-tree.js"],"sourcesContent":["export const SIGNAL_TREE_CONSTANTS = {\n MAX_PATH_CACHE_SIZE: 1000,\n LAZY_THRESHOLD: 50,\n ESTIMATE_MAX_DEPTH: 3,\n ESTIMATE_SAMPLE_SIZE_ARRAY: 3,\n ESTIMATE_SAMPLE_SIZE_OBJECT: 5,\n DEFAULT_CACHE_SIZE: 100,\n DEFAULT_BATCH_SIZE: 10,\n};\nconst DEV_MESSAGES = {\n NULL_OR_UNDEFINED: 'null/undefined',\n CIRCULAR_REF: 'circular ref',\n UPDATER_INVALID: 'updater invalid',\n LAZY_FALLBACK: 'lazy fallback',\n SIGNAL_CREATION_FAILED: 'signal creation failed',\n UPDATE_PATH_NOT_FOUND: 'update path not found',\n UPDATE_FAILED: 'update failed',\n ROLLBACK_FAILED: 'rollback failed',\n CLEANUP_ERROR: 'cleanup error',\n PRESET_UNKNOWN: 'unknown preset',\n STRATEGY_SELECTION: 'strategy select',\n TREE_DESTROYED: 'destroyed',\n UPDATE_TRANSACTION: 'update tx',\n BATCH_NOT_ENABLED: 'batching disabled',\n MEMOIZE_NOT_ENABLED: 'memoize disabled',\n MIDDLEWARE_NOT_AVAILABLE: 'middleware missing',\n ENTITY_HELPERS_NOT_AVAILABLE: 'entity helpers missing',\n ASYNC_ACTIONS_NOT_AVAILABLE: 'async actions missing',\n TIME_TRAVEL_NOT_AVAILABLE: 'time travel missing',\n OPTIMIZE_NOT_AVAILABLE: 'optimize missing',\n CACHE_NOT_AVAILABLE: 'cache missing',\n PERFORMANCE_NOT_ENABLED: 'performance disabled',\n ENHANCER_ORDER_FAILED: 'enhancer order failed',\n ENHANCER_CYCLE_DETECTED: 'enhancer cycle',\n ENHANCER_REQUIREMENT_MISSING: 'enhancer req missing',\n ENHANCER_PROVIDES_MISSING: 'enhancer provides missing',\n ENHANCER_FAILED: 'enhancer failed',\n ENHANCER_NOT_FUNCTION: 'enhancer not function',\n EFFECT_NO_CONTEXT: 'no angular context',\n SUBSCRIBE_NO_CONTEXT: 'no angular context',\n};\nconst PROD_MESSAGES = (() => {\n const out = {};\n let i = 0;\n for (const k of Object.keys(DEV_MESSAGES)) {\n out[k] = String(i++);\n }\n return out;\n})();\nconst _isProdByEnv = Boolean(typeof globalThis === 'object' &&\n globalThis !== null &&\n 'process' in globalThis &&\n typeof globalThis.process === 'object' &&\n 'env' in globalThis.process &&\n globalThis.process.env.NODE_ENV === 'production');\nconst _isDev = typeof ngDevMode !== 'undefined' ? Boolean(ngDevMode) : !_isProdByEnv;\nexport const SIGNAL_TREE_MESSAGES = Object.freeze(_isDev\n ? DEV_MESSAGES\n : PROD_MESSAGES);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRztJQUVuQyxtQkFBbUIsRUFBRSxJQUFJO0lBR3pCLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLGtCQUFrQixFQUFFLENBQUM7SUFDckIsMEJBQTBCLEVBQUUsQ0FBQztJQUM3QiwyQkFBMkIsRUFBRSxDQUFDO0lBRzlCLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsa0JBQWtCLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFHWCxNQUFNLFlBQVksR0FBRztJQUNuQixpQkFBaUIsRUFBRSxnQkFBZ0I7SUFDbkMsWUFBWSxFQUFFLGNBQWM7SUFDNUIsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxhQUFhLEVBQUUsZUFBZTtJQUM5QixzQkFBc0IsRUFBRSx3QkFBd0I7SUFDaEQscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMsYUFBYSxFQUFFLGVBQWU7SUFDOUIsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxrQkFBa0IsRUFBRSxpQkFBaUI7SUFDckMsY0FBYyxFQUFFLFdBQVc7SUFDM0Isa0JBQWtCLEVBQUUsV0FBVztJQUMvQixpQkFBaUIsRUFBRSxtQkFBbUI7SUFDdEMsbUJBQW1CLEVBQUUsa0JBQWtCO0lBQ3ZDLHdCQUF3QixFQUFFLG9CQUFvQjtJQUM5Qyw0QkFBNEIsRUFBRSx3QkFBd0I7SUFDdEQsMkJBQTJCLEVBQUUsdUJBQXVCO0lBQ3BELHlCQUF5QixFQUFFLHFCQUFxQjtJQUNoRCxzQkFBc0IsRUFBRSxrQkFBa0I7SUFDMUMsbUJBQW1CLEVBQUUsZUFBZTtJQUNwQyx1QkFBdUIsRUFBRSxzQkFBc0I7SUFDL0MscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLHVCQUF1QixFQUFFLGdCQUFnQjtJQUN6Qyw0QkFBNEIsRUFBRSxzQkFBc0I7SUFDcEQseUJBQXlCLEVBQUUsMkJBQTJCO0lBQ3RELGVBQWUsRUFBRSxpQkFBaUI7SUFDbEMscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLGlCQUFpQixFQUFFLG9CQUFvQjtJQUN2QyxvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQztBQUlYLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQzFCLE1BQU0sR0FBRyxHQUFHLEVBQStDLENBQUM7SUFDNUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FFdkMsRUFBRSxDQUFDO1FBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFRTCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQzFCLE9BQU8sVUFBVSxLQUFLLFFBQVE7SUFDOUIsVUFBVSxLQUFLLElBQUk7SUFDbkIsU0FBUyxJQUFJLFVBQVU7SUFDdkIsT0FBUSxVQUFrQixDQUFDLE9BQU8sS0FBSyxRQUFRO0lBQy9DLEtBQUssSUFBSyxVQUFrQixDQUFDLE9BQU87SUFDbkMsVUFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQzFELENBQUM7QUFFRixNQUFNLE1BQU0sR0FDVixPQUFPLFNBQVMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFFeEUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDL0MsTUFBTTtJQUNKLENBQUMsQ0FBRSxZQUFvQztJQUN2QyxDQUFDLENBQUUsYUFBcUMsQ0FDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2lnbmFsVHJlZSBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFuZCBtZXNzYWdlc1xuICovXG5cbmV4cG9ydCBjb25zdCBTSUdOQUxfVFJFRV9DT05TVEFOVFMgPSB7XG4gIC8qKiBDYWNoZSBjb25maWd1cmF0aW9uICovXG4gIE1BWF9QQVRIX0NBQ0hFX1NJWkU6IDEwMDAsXG5cbiAgLyoqIFBlcmZvcm1hbmNlIHRocmVzaG9sZHMgKi9cbiAgTEFaWV9USFJFU0hPTEQ6IDUwLFxuICBFU1RJTUFURV9NQVhfREVQVEg6IDMsXG4gIEVTVElNQVRFX1NBTVBMRV9TSVpFX0FSUkFZOiAzLFxuICBFU1RJTUFURV9TQU1QTEVfU0laRV9PQkpFQ1Q6IDUsXG5cbiAgLyoqIERlZmF1bHQgdmFsdWVzICovXG4gIERFRkFVTFRfQ0FDSEVfU0laRTogMTAwLFxuICBERUZBVUxUX0JBVENIX1NJWkU6IDEwLFxufSBhcyBjb25zdDtcblxuLy8gRnVsbCBkZXZlbG9wZXItZmFjaW5nIG1lc3NhZ2VzXG5jb25zdCBERVZfTUVTU0FHRVMgPSB7XG4gIE5VTExfT1JfVU5ERUZJTkVEOiAnbnVsbC91bmRlZmluZWQnLFxuICBDSVJDVUxBUl9SRUY6ICdjaXJjdWxhciByZWYnLFxuICBVUERBVEVSX0lOVkFMSUQ6ICd1cGRhdGVyIGludmFsaWQnLFxuICBMQVpZX0ZBTExCQUNLOiAnbGF6eSBmYWxsYmFjaycsXG4gIFNJR05BTF9DUkVBVElPTl9GQUlMRUQ6ICdzaWduYWwgY3JlYXRpb24gZmFpbGVkJyxcbiAgVVBEQVRFX1BBVEhfTk9UX0ZPVU5EOiAndXBkYXRlIHBhdGggbm90IGZvdW5kJyxcbiAgVVBEQVRFX0ZBSUxFRDogJ3VwZGF0ZSBmYWlsZWQnLFxuICBST0xMQkFDS19GQUlMRUQ6ICdyb2xsYmFjayBmYWlsZWQnLFxuICBDTEVBTlVQX0VSUk9SOiAnY2xlYW51cCBlcnJvcicsXG4gIFBSRVNFVF9VTktOT1dOOiAndW5rbm93biBwcmVzZXQnLFxuICBTVFJBVEVHWV9TRUxFQ1RJT046ICdzdHJhdGVneSBzZWxlY3QnLFxuICBUUkVFX0RFU1RST1lFRDogJ2Rlc3Ryb3llZCcsXG4gIFVQREFURV9UUkFOU0FDVElPTjogJ3VwZGF0ZSB0eCcsXG4gIEJBVENIX05PVF9FTkFCTEVEOiAnYmF0Y2hpbmcgZGlzYWJsZWQnLFxuICBNRU1PSVpFX05PVF9FTkFCTEVEOiAnbWVtb2l6ZSBkaXNhYmxlZCcsXG4gIE1JRERMRVdBUkVfTk9UX0FWQUlMQUJMRTogJ21pZGRsZXdhcmUgbWlzc2luZycsXG4gIEVOVElUWV9IRUxQRVJTX05PVF9BVkFJTEFCTEU6ICdlbnRpdHkgaGVscGVycyBtaXNzaW5nJyxcbiAgQVNZTkNfQUNUSU9OU19OT1RfQVZBSUxBQkxFOiAnYXN5bmMgYWN0aW9ucyBtaXNzaW5nJyxcbiAgVElNRV9UUkFWRUxfTk9UX0FWQUlMQUJMRTogJ3RpbWUgdHJhdmVsIG1pc3NpbmcnLFxuICBPUFRJTUlaRV9OT1RfQVZBSUxBQkxFOiAnb3B0aW1pemUgbWlzc2luZycsXG4gIENBQ0hFX05PVF9BVkFJTEFCTEU6ICdjYWNoZSBtaXNzaW5nJyxcbiAgUEVSRk9STUFOQ0VfTk9UX0VOQUJMRUQ6ICdwZXJmb3JtYW5jZSBkaXNhYmxlZCcsXG4gIEVOSEFOQ0VSX09SREVSX0ZBSUxFRDogJ2VuaGFuY2VyIG9yZGVyIGZhaWxlZCcsXG4gIEVOSEFOQ0VSX0NZQ0xFX0RFVEVDVEVEOiAnZW5oYW5jZXIgY3ljbGUnLFxuICBFTkhBTkNFUl9SRVFVSVJFTUVOVF9NSVNTSU5HOiAnZW5oYW5jZXIgcmVxIG1pc3NpbmcnLFxuICBFTkhBTkNFUl9QUk9WSURFU19NSVNTSU5HOiAnZW5oYW5jZXIgcHJvdmlkZXMgbWlzc2luZycsXG4gIEVOSEFOQ0VSX0ZBSUxFRDogJ2VuaGFuY2VyIGZhaWxlZCcsXG4gIEVOSEFOQ0VSX05PVF9GVU5DVElPTjogJ2VuaGFuY2VyIG5vdCBmdW5jdGlvbicsXG4gIEVGRkVDVF9OT19DT05URVhUOiAnbm8gYW5ndWxhciBjb250ZXh0JyxcbiAgU1VCU0NSSUJFX05PX0NPTlRFWFQ6ICdubyBhbmd1bGFyIGNvbnRleHQnLFxufSBhcyBjb25zdDtcblxuLy8gQ29tcGFjdCBwcm9kdWN0aW9uIG1lc3NhZ2VzICh2ZXJ5IHNob3J0IG51bWVyaWMgY29kZXMpIHRvIGtlZXAgYnVuZGxlcyBtaW5pbWFsLlxuLy8gV2UgbWFwIGVhY2gga2V5IHRvIGEgc2hvcnQgbnVtZXJpYyBzdHJpbmcgbGlrZSAnMCcsJzEnLCcyJyB0byBtaW5pbWl6ZSBieXRlcy5cbmNvbnN0IFBST0RfTUVTU0FHRVMgPSAoKCkgPT4ge1xuICBjb25zdCBvdXQgPSB7fSBhcyBSZWNvcmQ8a2V5b2YgdHlwZW9mIERFVl9NRVNTQUdFUywgc3RyaW5nPjtcbiAgbGV0IGkgPSAwO1xuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoREVWX01FU1NBR0VTKSBhcyBBcnJheTxcbiAgICBrZXlvZiB0eXBlb2YgREVWX01FU1NBR0VTXG4gID4pIHtcbiAgICBvdXRba10gPSBTdHJpbmcoaSsrKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufSkoKTtcblxuLy8gUHJlZmVyIEFuZ3VsYXIncyBjb21waWxlLXRpbWUgYG5nRGV2TW9kZWAgZmxhZy4gV2hlbiBgbmdEZXZNb2RlYCBpcyBmYWxzZVxuLy8gaW4gcHJvZHVjdGlvbiBidWlsZHMsIERFVl9NRVNTQUdFUyBjYW4gYmUgdHJlZS1zaGFrZW4uIEZhbGxiYWNrIHRvXG4vLyBwcm9jZXNzLmVudiB3aGVuIG5nRGV2TW9kZSBpcyBub3QgcHJlc2VudC5cbmRlY2xhcmUgY29uc3QgbmdEZXZNb2RlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuLy8gQXZvaWQgcmVmZXJlbmNpbmcgdGhlIGJhcmUgYHByb2Nlc3NgIGlkZW50aWZpZXIgdG8ga2VlcCBidWlsZHMgZnJlZSBvZiBOb2RlXG4vLyB0eXBlIGFzc3VtcHRpb25zOyB1c2UgZ2xvYmFsVGhpcyB0byBjaGVjayBlbnYgd2hlbiBhdmFpbGFibGUuXG5jb25zdCBfaXNQcm9kQnlFbnYgPSBCb29sZWFuKFxuICB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcgJiZcbiAgZ2xvYmFsVGhpcyAhPT0gbnVsbCAmJlxuICAncHJvY2VzcycgaW4gZ2xvYmFsVGhpcyAmJlxuICB0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5wcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICAnZW52JyBpbiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnByb2Nlc3MgJiZcbiAgKGdsb2JhbFRoaXMgYXMgYW55KS5wcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nXG4pO1xuXG5jb25zdCBfaXNEZXYgPVxuICB0eXBlb2YgbmdEZXZNb2RlICE9PSAndW5kZWZpbmVkJyA/IEJvb2xlYW4obmdEZXZNb2RlKSA6ICFfaXNQcm9kQnlFbnY7XG5cbmV4cG9ydCBjb25zdCBTSUdOQUxfVFJFRV9NRVNTQUdFUyA9IE9iamVjdC5mcmVlemUoXG4gIF9pc0RldlxuICAgID8gKERFVl9NRVNTQUdFUyBhcyB0eXBlb2YgREVWX01FU1NBR0VTKVxuICAgIDogKFBST0RfTUVTU0FHRVMgYXMgdHlwZW9mIERFVl9NRVNTQUdFUylcbik7XG4iXX0=","export const ENHANCER_META = Symbol('signaltree:enhancer:meta');\nexport function isSignalTree(value) {\n return (value !== null &&\n typeof value === 'function' &&\n 'state' in value &&\n '$' in value &&\n 'with' in value &&\n 'destroy' in value);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMElBLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztBQXlPaEUsTUFBTSxVQUFVLFlBQVksQ0FBSSxLQUFjO0lBQzVDLE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFVBQVU7UUFDM0IsT0FBTyxJQUFJLEtBQUs7UUFDaEIsR0FBRyxJQUFJLEtBQUs7UUFDWixNQUFNLElBQUksS0FBSztRQUNmLFNBQVMsSUFBSSxLQUFLLENBQ25CLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFNpZ25hbFRyZWUgQ29yZSBUeXBlcyB2MS45LjFcbiAqIE1JVCBMaWNlbnNlIC0gQ29weXJpZ2h0IChjKSAyMDI1IEpvbmF0aGFuIEQgQm9yZ2lhXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENPUkUgVFlQRSBERUZJTklUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQcmltaXRpdmUgdHlwZXMgZm9yIHR5cGUgY2hlY2tpbmdcbiAqL1xuZXhwb3J0IHR5cGUgUHJpbWl0aXZlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IGJpZ2ludFxuICB8IHN5bWJvbDtcblxuLyoqXG4gKiBCdWlsdC1pbiBvYmplY3QgdHlwZXMgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcmltaXRpdmUgdmFsdWVzXG4gKiAoS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHJ1bnRpbWUgaXNCdWlsdEluT2JqZWN0KVxuICovXG5leHBvcnQgdHlwZSBCdWlsdEluT2JqZWN0ID1cbiAgLy8gQ29yZSBKU1xuICB8IERhdGVcbiAgfCBSZWdFeHBcbiAgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bilcbiAgfCBNYXA8dW5rbm93biwgdW5rbm93bj5cbiAgfCBTZXQ8dW5rbm93bj5cbiAgfCBXZWFrTWFwPG9iamVjdCwgdW5rbm93bj5cbiAgfCBXZWFrU2V0PG9iamVjdD5cbiAgfCBBcnJheUJ1ZmZlclxuICB8IERhdGFWaWV3XG4gIHwgRXJyb3JcbiAgfCBQcm9taXNlPHVua25vd24+XG4gIC8vIFR5cGVkIEFycmF5c1xuICB8IFVpbnQxNkFycmF5XG4gIHwgSW50MzJBcnJheVxuICB8IFVpbnQzMkFycmF5XG4gIHwgRmxvYXQzMkFycmF5XG4gIHwgRmxvYXQ2NEFycmF5XG4gIHwgQmlnSW50NjRBcnJheVxuICB8IEJpZ1VpbnQ2NEFycmF5XG4gIC8vIFdlYiBBUElzXG4gIHwgVVJMXG4gIHwgVVJMU2VhcmNoUGFyYW1zXG4gIHwgRm9ybURhdGFcbiAgfCBCbG9iXG4gIHwgRmlsZVxuICB8IEhlYWRlcnNcbiAgfCBSZXF1ZXN0XG4gIHwgUmVzcG9uc2VcbiAgfCBBYm9ydENvbnRyb2xsZXJcbiAgfCBBYm9ydFNpZ25hbDtcblxuLyoqXG4gKiBIZWxwZXIgdHlwZSB0byB1bndyYXAgc2lnbmFscyBhbmQgcmVtb3ZlIGFueSBzaWduYWwtc3BlY2lmaWMgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBVbndyYXA8VD4gPSBUIGV4dGVuZHMgV3JpdGFibGVTaWduYWw8aW5mZXIgVT5cbiAgPyBVXG4gIDogVCBleHRlbmRzIFNpZ25hbDxpbmZlciBVPlxuICA/IFVcbiAgOiBUIGV4dGVuZHMgQnVpbHRJbk9iamVjdFxuICA/IFQgLy8gUHJlc2VydmUgYnVpbHQtaW4gb2JqZWN0cyBleGFjdGx5IGFzIHRoZXkgYXJlXG4gIDogVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXVxuICA/IFQgLy8gUHJlc2VydmUgYXJyYXlzIGV4YWN0bHkgYXMgdGhleSBhcmVcbiAgOiBUIGV4dGVuZHMgb2JqZWN0XG4gID8geyBbSyBpbiBrZXlvZiBUXTogVW53cmFwPFRbS10+IH1cbiAgOiBUO1xuXG4vKipcbiAqIE5vZGUgYWNjZXNzb3IgaW50ZXJmYWNlIC0gdW5pZmllZCBBUEkgZm9yIGdldC9zZXQvdXBkYXRlIHZpYSBmdW5jdGlvbiBjYWxsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vZGVBY2Nlc3NvcjxUPiB7XG4gICgpOiBUOyAvLyBHZXQgdmFsdWVcbiAgKHZhbHVlOiBUKTogdm9pZDsgLy8gU2V0IHZhbHVlXG4gICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gVCk6IHZvaWQ7IC8vIFVwZGF0ZSB3aXRoIGZ1bmN0aW9uXG59XG5cbi8qKlxuICogU2lnbmFsaWZpZWQgbm9kZSB3aXRoIGNhbGxhYmxlIGludGVyZmFjZVxuICovXG5leHBvcnQgdHlwZSBTaWduYWxpZmllZE5vZGU8VD4gPSBOb2RlQWNjZXNzb3I8VD4gJiBEZWVwU2lnbmFsaWZ5PFQ+O1xuXG4vKipcbiAqIERlZXAgc2lnbmFsaWZpY2F0aW9uIHR5cGUgLSBjb252ZXJ0cyBvYmplY3QgcHJvcGVydGllcyB0byBzaWduYWxzIHJlY3Vyc2l2ZWx5XG4gKiAtIExlYXZlcyAocHJpbWl0aXZlcywgYXJyYXlzLCBmdW5jdGlvbnMsIGJ1aWx0LWlucyk6IFJhdyBBbmd1bGFyIFdyaXRhYmxlU2lnbmFsPFQ+XG4gKiAtIE5lc3RlZCBvYmplY3RzOiBOb2RlQWNjZXNzb3I8VD4gKGNhbGxhYmxlKSArIHJlY3Vyc2l2ZSBEZWVwU2lnbmFsaWZ5PFQ+IHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgRGVlcFNpZ25hbGlmeTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyByZWFkb25seSB1bmtub3duW11cbiAgICA/IFdyaXRhYmxlU2lnbmFsPFRbS10+IC8vIEFycmF5cyBhcmUgQW5ndWxhciBzaWduYWxzXG4gICAgOiBUW0tdIGV4dGVuZHMgb2JqZWN0XG4gICAgPyBUW0tdIGV4dGVuZHMgU2lnbmFsPHVua25vd24+XG4gICAgICA/IFRbS10gLy8gRG9uJ3QgZG91YmxlLXdyYXAgc2lnbmFsc1xuICAgICAgOiBUW0tdIGV4dGVuZHMgQnVpbHRJbk9iamVjdFxuICAgICAgPyBXcml0YWJsZVNpZ25hbDxUW0tdPiAvLyBCdWlsdC1pbiBvYmplY3RzIGFyZSBBbmd1bGFyIHNpZ25hbHNcbiAgICAgIDogVFtLXSBleHRlbmRzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd25cbiAgICAgID8gV3JpdGFibGVTaWduYWw8VFtLXT4gLy8gRnVuY3Rpb25zIGFyZSBBbmd1bGFyIHNpZ25hbHNcbiAgICAgIDogLy8gTmVzdGVkIG9iamVjdHM6IFVzZSB0aGUgZXhwbGljaXQgU2lnbmFsaWZpZWROb2RlIHR5cGVcbiAgICAgICAgU2lnbmFsaWZpZWROb2RlPFRbS10+XG4gICAgOiBXcml0YWJsZVNpZ25hbDxUW0tdPjsgLy8gUHJpbWl0aXZlcyBhcmUgQW5ndWxhciBzaWduYWxzXG59O1xuXG4vKipcbiAqIFV0aWxpdHkgdHlwZSB0byByZW1vdmUgc2lnbmFsLXNwZWNpZmljIG1ldGhvZHMgZnJvbSBhIHR5cGVcbiAqIFVzZWQgYnkgY2xlYW5VbndyYXAgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCB0eXBlIHNoYXBlXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW92ZVNpZ25hbE1ldGhvZHM8VD4gPSBUIGV4dGVuZHMgaW5mZXIgVSA/IFUgOiBuZXZlcjtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVOSEFOQ0VSIFNZU1RFTSBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEVuaGFuY2VyIG1ldGFkYXRhIGZvciBvcHRpb25hbCBhdXRvLW9yZGVyaW5nICovXG5leHBvcnQgaW50ZXJmYWNlIEVuaGFuY2VyTWV0YSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJlcXVpcmVzPzogc3RyaW5nW107XG4gIHByb3ZpZGVzPzogc3RyaW5nW107XG59XG5cbi8qKiBFbmhhbmNlciBmdW5jdGlvbiB0aGF0IG1heSBjYXJyeSBtZXRhZGF0YSAqL1xuZXhwb3J0IHR5cGUgRW5oYW5jZXI8SW5wdXQgPSB1bmtub3duLCBPdXRwdXQgPSB1bmtub3duPiA9IChcbiAgaW5wdXQ6IElucHV0XG4pID0+IE91dHB1dDtcblxuLyoqIEVuaGFuY2VyIHdpdGggb3B0aW9uYWwgbWV0YWRhdGEgYXR0YWNoZWQgKi9cbmV4cG9ydCB0eXBlIEVuaGFuY2VyV2l0aE1ldGE8SW5wdXQgPSB1bmtub3duLCBPdXRwdXQgPSB1bmtub3duPiA9IEVuaGFuY2VyPFxuICBJbnB1dCxcbiAgT3V0cHV0XG4+ICYgeyBtZXRhZGF0YT86IEVuaGFuY2VyTWV0YSB9O1xuXG4vKiogU3ltYm9sIGtleSBmb3IgZW5oYW5jZXIgbWV0YWRhdGEgKi9cbmV4cG9ydCBjb25zdCBFTkhBTkNFUl9NRVRBID0gU3ltYm9sKCdzaWduYWx0cmVlOmVuaGFuY2VyOm1ldGEnKTtcblxuLyoqIEluZmVyIHRoZSBmaW5hbCByZXN1bHQgdHlwZSBhZnRlciBhcHBseWluZyBlbmhhbmNlcnMgKi9cbmV4cG9ydCB0eXBlIENoYWluUmVzdWx0PFxuICBTdGFydCxcbiAgRSBleHRlbmRzIEFycmF5PEVuaGFuY2VyV2l0aE1ldGE8dW5rbm93biwgdW5rbm93bj4+XG4+ID0gRSBleHRlbmRzIFtpbmZlciBILCAuLi5pbmZlciBSXVxuICA/IC8vIElmIGVuaGFuY2VyIGFjY2VwdHMgU2lnbmFsVHJlZTxhbnk+IChub24tZ2VuZXJpYyBlbmhhbmNlciksIHRyZWF0IGl0IGFzIGNvbXBhdGlibGVcbiAgICBIIGV4dGVuZHMgRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPGFueT4sIGluZmVyIE8+XG4gICAgPyBSIGV4dGVuZHMgQXJyYXk8RW5oYW5jZXJXaXRoTWV0YTx1bmtub3duLCB1bmtub3duPj5cbiAgICAgID8gQ2hhaW5SZXN1bHQ8TywgUj5cbiAgICAgIDogT1xuICAgIDogSCBleHRlbmRzIEVuaGFuY2VyV2l0aE1ldGE8aW5mZXIgSSwgaW5mZXIgTz5cbiAgICA/IFN0YXJ0IGV4dGVuZHMgSVxuICAgICAgPyBSIGV4dGVuZHMgQXJyYXk8RW5oYW5jZXJXaXRoTWV0YTx1bmtub3duLCB1bmtub3duPj5cbiAgICAgICAgPyBDaGFpblJlc3VsdDxPLCBSPlxuICAgICAgICA6IE9cbiAgICAgIDogYW55XG4gICAgOiB1bmtub3duXG4gIDogU3RhcnQ7XG5cbi8qKlxuICogT3ZlcmxvYWQgc2V0IGZvciAud2l0aCgpIG1ldGhvZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhNZXRob2Q8VD4ge1xuICAoKTogU2lnbmFsVHJlZTxUPjtcbiAgPE8xPihlMTogKGlucHV0OiBTaWduYWxUcmVlPFQ+KSA9PiBPMSk6IE8xO1xuICAvLyBBY2NlcHQgYSBnZW5lcmljIGVuaGFuY2VyIGZ1bmN0aW9uIGxpa2UgYGZ1bmN0aW9uIDxVPih0cmVlOiBTaWduYWxUcmVlPFU+KTogUmBcbiAgPE8xLCBPMj4oZTE6IChpbnB1dDogU2lnbmFsVHJlZTxUPikgPT4gTzEsIGUyOiAoaW5wdXQ6IE8xKSA9PiBPMik6IE8yO1xuICA8TzEsIE8yLCBPMz4oXG4gICAgZTE6IChpbnB1dDogU2lnbmFsVHJlZTxUPikgPT4gTzEsXG4gICAgZTI6IChpbnB1dDogTzEpID0+IE8yLFxuICAgIGUzOiAoaW5wdXQ6IE8yKSA9PiBPM1xuICApOiBPMztcbiAgPE8xLCBPMiwgTzMsIE80PihcbiAgICBlMTogKGlucHV0OiBTaWduYWxUcmVlPFQ+KSA9PiBPMSxcbiAgICBlMjogKGlucHV0OiBPMSkgPT4gTzIsXG4gICAgZTM6IChpbnB1dDogTzIpID0+IE8zLFxuICAgIGU0OiAoaW5wdXQ6IE8zKSA9PiBPNFxuICApOiBPNDtcbiAgLy8gT3ZlcmxvYWRzIGZvciBFbmhhbmNlcldpdGhNZXRhIGZvcm0gc28gZW5oYW5jZXJzIGV4cG9ydGVkIHdpdGggbWV0YWRhdGFcbiAgPE8xPihlMTogRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPFQ+LCBPMT4pOiBPMTtcbiAgLy8gQWNjZXB0IGVuaGFuY2VycyB0aGF0IG9wZXJhdGUgb24gU2lnbmFsVHJlZTxhbnk+IChoZWxwcyBub24tZ2VuZXJpYyBlbmhhbmNlcnMpXG4gIDxPMT4oZTE6IEVuaGFuY2VyV2l0aE1ldGE8U2lnbmFsVHJlZTxhbnk+LCBPMT4pOiBPMTtcbiAgLy8gR2VuZXJpYyBvdmVybG9hZCB0byBhY2NlcHQgRW5oYW5jZXJXaXRoTWV0YSBzdGFydGluZyBmcm9tIFN0YXJ0IHR5cGVcbiAgPE8xPihlMTogRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPFQ+LCBPMT4pOiBPMTtcbiAgPE8xPihcbiAgICBlMTogRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPGFueT4sIE8xPixcbiAgICBlMjogRW5oYW5jZXJXaXRoTWV0YTxPMSwgdW5rbm93bj5cbiAgKTogdW5rbm93bjtcbiAgPE8xLCBPMj4oXG4gICAgZTE6IEVuaGFuY2VyV2l0aE1ldGE8U2lnbmFsVHJlZTxUPiwgTzE+LFxuICAgIGUyOiBFbmhhbmNlcldpdGhNZXRhPE8xLCBPMj5cbiAgKTogTzI7XG4gIDxPMSwgTzI+KFxuICAgIGUxOiBFbmhhbmNlcldpdGhNZXRhPFNpZ25hbFRyZWU8YW55PiwgTzE+LFxuICAgIGUyOiBFbmhhbmNlcldpdGhNZXRhPE8xLCBPMj5cbiAgKTogTzI7XG4gIDxPMSwgTzIsIE8zPihcbiAgICBlMTogRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPFQ+LCBPMT4sXG4gICAgZTI6IEVuaGFuY2VyV2l0aE1ldGE8TzEsIE8yPixcbiAgICBlMzogRW5oYW5jZXJXaXRoTWV0YTxPMiwgTzM+XG4gICk6IE8zO1xuICA8TzEsIE8yLCBPMz4oXG4gICAgZTE6IEVuaGFuY2VyV2l0aE1ldGE8U2lnbmFsVHJlZTxhbnk+LCBPMT4sXG4gICAgZTI6IEVuaGFuY2VyV2l0aE1ldGE8TzEsIE8yPixcbiAgICBlMzogRW5oYW5jZXJXaXRoTWV0YTxPMiwgTzM+XG4gICk6IE8zO1xuICA8TzEsIE8yLCBPMywgTzQ+KFxuICAgIGUxOiBFbmhhbmNlcldpdGhNZXRhPFNpZ25hbFRyZWU8VD4sIE8xPixcbiAgICBlMjogRW5oYW5jZXJXaXRoTWV0YTxPMSwgTzI+LFxuICAgIGUzOiBFbmhhbmNlcldpdGhNZXRhPE8yLCBPMz4sXG4gICAgZTQ6IEVuaGFuY2VyV2l0aE1ldGE8TzMsIE80PlxuICApOiBPNDtcbiAgPE8xLCBPMiwgTzMsIE80PihcbiAgICBlMTogRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPGFueT4sIE8xPixcbiAgICBlMjogRW5oYW5jZXJXaXRoTWV0YTxPMSwgTzI+LFxuICAgIGUzOiBFbmhhbmNlcldpdGhNZXRhPE8yLCBPMz4sXG4gICAgZTQ6IEVuaGFuY2VyV2l0aE1ldGE8TzMsIE80PlxuICApOiBPNDtcbiAgPE8xLCBPMj4oXG4gICAgZTE6IEVuaGFuY2VyV2l0aE1ldGE8U2lnbmFsVHJlZTxUPiwgTzE+LFxuICAgIGUyOiBFbmhhbmNlcldpdGhNZXRhPE8xLCBPMj5cbiAgKTogTzI7XG4gIDxPMSwgTzIsIE8zPihcbiAgICBlMTogRW5oYW5jZXJXaXRoTWV0YTxTaWduYWxUcmVlPFQ+LCBPMT4sXG4gICAgZTI6IEVuaGFuY2VyV2l0aE1ldGE8TzEsIE8yPixcbiAgICBlMzogRW5oYW5jZXJXaXRoTWV0YTxPMiwgTzM+XG4gICk6IE8zO1xuICA8TzEsIE8yLCBPMywgTzQ+KFxuICAgIGUxOiBFbmhhbmNlcldpdGhNZXRhPFNpZ25hbFRyZWU8VD4sIE8xPixcbiAgICBlMjogRW5oYW5jZXJXaXRoTWV0YTxPMSwgTzI+LFxuICAgIGUzOiBFbmhhbmNlcldpdGhNZXRhPE8yLCBPMz4sXG4gICAgZTQ6IEVuaGFuY2VyV2l0aE1ldGE8TzMsIE80PlxuICApOiBPNDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNJR05BTCBUUkVFIElOVEVSRkFDRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBNYWluIFNpZ25hbFRyZWUgdHlwZSB3aXRoIGFsbCBtZXRob2RzXG4gKi9cbmV4cG9ydCB0eXBlIFNpZ25hbFRyZWU8VD4gPSBOb2RlQWNjZXNzb3I8VD4gJiB7XG4gIC8qKiBUaGUgcmVhY3RpdmUgc3RhdGUgb2JqZWN0ICovXG4gIHN0YXRlOiBEZWVwU2lnbmFsaWZ5PFQ+O1xuXG4gIC8qKiBTaG9ydGhhbmQgYWxpYXMgZm9yIHN0YXRlICovXG4gICQ6IERlZXBTaWduYWxpZnk8VD47XG5cbiAgLyoqIENvcmUgbWV0aG9kcyAqL1xuICB3aXRoOiBXaXRoTWV0aG9kPFQ+O1xuICBkZXN0cm95KCk6IHZvaWQ7XG5cbiAgLyoqIEVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgKi9cbiAgZWZmZWN0KGZuOiAodHJlZTogVCkgPT4gdm9pZCk6IHZvaWQ7XG4gIHN1YnNjcmliZShmbjogKHRyZWU6IFQpID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuICBiYXRjaCh1cGRhdGVyOiAodHJlZTogVCkgPT4gdm9pZCk6IHZvaWQ7XG4gIGJhdGNoVXBkYXRlKHVwZGF0ZXI6IChjdXJyZW50OiBUKSA9PiBQYXJ0aWFsPFQ+KTogdm9pZDtcbiAgbWVtb2l6ZTxSPihmbjogKHRyZWU6IFQpID0+IFIsIGNhY2hlS2V5Pzogc3RyaW5nKTogU2lnbmFsPFI+O1xuXG4gIC8qKiBQZXJmb3JtYW5jZSBtZXRob2RzICovXG4gIG9wdGltaXplKCk6IHZvaWQ7XG4gIGNsZWFyQ2FjaGUoKTogdm9pZDtcbiAgaW52YWxpZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogbnVtYmVyO1xuICBnZXRNZXRyaWNzKCk6IFBlcmZvcm1hbmNlTWV0cmljcztcblxuICAvKiogTWlkZGxld2FyZSAqL1xuICBhZGRUYXAobWlkZGxld2FyZTogTWlkZGxld2FyZTxUPik6IHZvaWQ7XG4gIHJlbW92ZVRhcChpZDogc3RyaW5nKTogdm9pZDtcblxuICAvKiogRW50aXR5IGhlbHBlcnMgKi9cbiAgYXNDcnVkPEUgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfT4oXG4gICAgZW50aXR5S2V5Pzoga2V5b2YgVFxuICApOiBFbnRpdHlIZWxwZXJzPEU+O1xuXG4gIC8qKiBBc3luYyBhY3Rpb25zICovXG4gIGFzeW5jQWN0aW9uPFRJbnB1dCwgVFJlc3VsdD4oXG4gICAgb3BlcmF0aW9uOiAoaW5wdXQ6IFRJbnB1dCkgPT4gUHJvbWlzZTxUUmVzdWx0PixcbiAgICBjb25maWc/OiBBc3luY0FjdGlvbkNvbmZpZzxULCBUUmVzdWx0PlxuICApOiBBc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+O1xuXG4gIC8qKiBUaW1lIHRyYXZlbCAqL1xuICB1bmRvKCk6IHZvaWQ7XG4gIHJlZG8oKTogdm9pZDtcbiAgZ2V0SGlzdG9yeSgpOiBUaW1lVHJhdmVsRW50cnk8VD5bXTtcbiAgcmVzZXRIaXN0b3J5KCk6IHZvaWQ7XG5cbiAgLyoqIEluZGV4IHNpZ25hdHVyZSBmb3IgZW5oYW5jZXIgY29tcGF0aWJpbGl0eSAqL1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENPTkZJR1VSQVRJT04gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIFRyZWVQcmVzZXQgPSAnYmFzaWMnIHwgJ3BlcmZvcm1hbmNlJyB8ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJlZUNvbmZpZyB7XG4gIGJhdGNoVXBkYXRlcz86IGJvb2xlYW47XG4gIHVzZU1lbW9pemF0aW9uPzogYm9vbGVhbjtcbiAgZW5hYmxlVGltZVRyYXZlbD86IGJvb2xlYW47XG4gIHVzZUxhenlTaWduYWxzPzogYm9vbGVhbjtcbiAgdXNlU2hhbGxvd0NvbXBhcmlzb24/OiBib29sZWFuO1xuICBtYXhDYWNoZVNpemU/OiBudW1iZXI7XG4gIHRyYWNrUGVyZm9ybWFuY2U/OiBib29sZWFuO1xuICB0cmVlTmFtZT86IHN0cmluZztcbiAgZW5hYmxlRGV2VG9vbHM/OiBib29sZWFuO1xuICBkZWJ1Z01vZGU/OiBib29sZWFuO1xuICB1c2VTdHJ1Y3R1cmFsU2hhcmluZz86IGJvb2xlYW47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGRUFUVVJFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmU8VD4ge1xuICBpZDogc3RyaW5nO1xuICBiZWZvcmU/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24sIHN0YXRlOiBUKSA9PiBib29sZWFuO1xuICBhZnRlcj86IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biwgc3RhdGU6IFQsIG5ld1N0YXRlOiBUKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlTWV0cmljcyB7XG4gIHVwZGF0ZXM6IG51bWJlcjtcbiAgY29tcHV0YXRpb25zOiBudW1iZXI7XG4gIGNhY2hlSGl0czogbnVtYmVyO1xuICBjYWNoZU1pc3NlczogbnVtYmVyO1xuICBhdmVyYWdlVXBkYXRlVGltZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUhlbHBlcnM8RSBleHRlbmRzIHsgaWQ6IHN0cmluZyB8IG51bWJlciB9PiB7XG4gIGFkZChlbnRpdHk6IEUpOiB2b2lkO1xuICB1cGRhdGUoaWQ6IEVbJ2lkJ10sIHVwZGF0ZXM6IFBhcnRpYWw8RT4pOiB2b2lkO1xuICByZW1vdmUoaWQ6IEVbJ2lkJ10pOiB2b2lkO1xuICB1cHNlcnQoZW50aXR5OiBFKTogdm9pZDtcbiAgZmluZEJ5SWQoaWQ6IEVbJ2lkJ10pOiBTaWduYWw8RSB8IHVuZGVmaW5lZD47XG4gIGZpbmRCeShwcmVkaWNhdGU6IChlbnRpdHk6IEUpID0+IGJvb2xlYW4pOiBTaWduYWw8RVtdPjtcbiAgc2VsZWN0SWRzKCk6IFNpZ25hbDxBcnJheTxzdHJpbmcgfCBudW1iZXI+PjtcbiAgc2VsZWN0QWxsKCk6IFNpZ25hbDxFW10+O1xuICBzZWxlY3RUb3RhbCgpOiBTaWduYWw8bnVtYmVyPjtcbiAgZmluZEFsbCgpOiBTaWduYWw8RVtdPjtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3luY0FjdGlvbkNvbmZpZzxULCBUUmVzdWx0PiB7XG4gIG9uU3RhcnQ/OiAoc3RhdGU6IFQpID0+IFBhcnRpYWw8VD47XG4gIG9uU3VjY2Vzcz86IChyZXN1bHQ6IFRSZXN1bHQsIHN0YXRlOiBUKSA9PiBQYXJ0aWFsPFQ+O1xuICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgc3RhdGU6IFQpID0+IFBhcnRpYWw8VD47XG4gIG9uQ29tcGxldGU/OiAoc3RhdGU6IFQpID0+IFBhcnRpYWw8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PiB7XG4gIGV4ZWN1dGUoaW5wdXQ6IFRJbnB1dCk6IFByb21pc2U8VFJlc3VsdD47XG4gIHBlbmRpbmc6IFNpZ25hbDxib29sZWFuPjtcbiAgZXJyb3I6IFNpZ25hbDxFcnJvciB8IG51bGw+O1xuICByZXN1bHQ6IFNpZ25hbDxUUmVzdWx0IHwgbnVsbD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbEVudHJ5PFQ+IHtcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBzdGF0ZTogVDtcbiAgcGF5bG9hZD86IHVua25vd247XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFIEdVQVJEU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSBTaWduYWxUcmVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NpZ25hbFRyZWU8VD4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTaWduYWxUcmVlPFQ+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBJdCdzIGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAnc3RhdGUnIGluIHZhbHVlICYmXG4gICAgJyQnIGluIHZhbHVlICYmXG4gICAgJ3dpdGgnIGluIHZhbHVlICYmXG4gICAgJ2Rlc3Ryb3knIGluIHZhbHVlXG4gICk7XG59XG4iXX0=","import { SIGNAL_TREE_MESSAGES } from './constants';\nimport { ENHANCER_META } from './types';\nexport function createEnhancer(meta, enhancerFn) {\n const fn = enhancerFn;\n try {\n fn.metadata = meta;\n try {\n fn[ENHANCER_META] = meta;\n }\n catch {\n }\n }\n catch {\n }\n return fn;\n}\nexport function resolveEnhancerOrder(enhancers, availableCapabilities = new Set(), debugMode = false) {\n const nodes = enhancers.map((e, idx) => ({\n fn: e,\n name: e.metadata && e.metadata.name\n ? String(e.metadata.name)\n : `enhancer#${idx}`,\n requires: new Set(e.metadata?.requires ?? []),\n provides: new Set(e.metadata?.provides ?? []),\n }));\n const adj = new Map();\n const nameToNode = new Map();\n for (const n of nodes) {\n nameToNode.set(n.name, n);\n adj.set(n.name, new Set());\n }\n for (const a of nodes) {\n for (const b of nodes) {\n if (a === b)\n continue;\n for (const req of b.requires) {\n if (availableCapabilities.has(req))\n continue;\n if (a.provides.has(req)) {\n const set = adj.get(a.name);\n if (set)\n set.add(b.name);\n }\n }\n }\n }\n const inDegree = new Map();\n for (const entry of adj.keys())\n inDegree.set(entry, 0);\n for (const [, outs] of adj) {\n for (const to of outs)\n inDegree.set(to, (inDegree.get(to) || 0) + 1);\n }\n const queue = [];\n for (const [name, deg] of inDegree.entries()) {\n if (deg === 0)\n queue.push(name);\n }\n const ordered = [];\n while (queue.length > 0) {\n const n = queue.shift();\n if (!n)\n break;\n ordered.push(n);\n const outs = adj.get(n);\n if (!outs)\n continue;\n for (const m of outs) {\n inDegree.set(m, (inDegree.get(m) || 0) - 1);\n if (inDegree.get(m) === 0)\n queue.push(m);\n }\n }\n if (ordered.length !== nodes.length) {\n if (debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.ENHANCER_CYCLE_DETECTED);\n }\n return enhancers;\n }\n return ordered.map((name) => {\n const n = nameToNode.get(name);\n return (n ? n.fn : enhancers[0]);\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5oYW5jZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL2VuaGFuY2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQXlCeEMsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsSUFBa0IsRUFDbEIsVUFBMkI7SUFFM0IsTUFBTSxFQUFFLEdBQUcsVUFBb0MsQ0FBQztJQUNoRCxJQUFJLENBQUM7UUFDSCxFQUFFLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUVuQixJQUFJLENBQUM7WUFDRixFQUF5QyxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNuRSxDQUFDO1FBQUMsTUFBTSxDQUFDO1FBRVQsQ0FBQztJQUNILENBQUM7SUFBQyxNQUFNLENBQUM7SUFFVCxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBVUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxTQUErQyxFQUMvQyx3QkFBcUMsSUFBSSxHQUFHLEVBQVUsRUFDdEQsU0FBUyxHQUFHLEtBQUs7SUFHakIsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkMsRUFBRSxFQUFFLENBQUM7UUFDTCxJQUFJLEVBQ0YsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN6QixDQUFDLENBQUMsWUFBWSxHQUFHLEVBQUU7UUFDdkIsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNyRCxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDO0tBQ3RELENBQUMsQ0FBQyxDQUFDO0lBR0osTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7SUFFeEQsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN0QixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFVLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBR0QsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN0QixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUN0QixLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFN0IsSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUFFLFNBQVM7Z0JBRTdDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFFeEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzVCLElBQUksR0FBRzt3QkFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUdELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzNDLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtRQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELEtBQUssTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJO1lBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzdDLElBQUksR0FBRyxLQUFLLENBQUM7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQVksQ0FBQztRQUNsQyxJQUFJLENBQUMsQ0FBQztZQUFFLE1BQU07UUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUk7WUFBRSxTQUFTO1FBQ3BCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFHRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFHRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMxQixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBdUMsQ0FBQztJQUN6RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNpZ25hbFRyZWUgRW5oYW5jZXIgU3lzdGVtXG4gKiBIYW5kbGVzIGVuaGFuY2VyIGNvbXBvc2l0aW9uIGFuZCBkZXBlbmRlbmN5IHJlc29sdXRpb25cbiAqL1xuaW1wb3J0IHsgU0lHTkFMX1RSRUVfTUVTU0FHRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFTkhBTkNFUl9NRVRBIH0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB0eXBlIHsgRW5oYW5jZXJNZXRhLCBFbmhhbmNlcldpdGhNZXRhIH0gZnJvbSAnLi90eXBlcyc7XG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgYW4gZW5oYW5jZXIgd2l0aCBtZXRhZGF0YSBhdHRhY2hlZFxuICpcbiAqIEBwYXJhbSBtZXRhIC0gTWV0YWRhdGEgZGVzY3JpYmluZyB0aGUgZW5oYW5jZXJcbiAqIEBwYXJhbSBlbmhhbmNlckZuIC0gVGhlIGVuaGFuY2VyIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBFbmhhbmNlciBmdW5jdGlvbiB3aXRoIG1ldGFkYXRhIGF0dGFjaGVkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG15RW5oYW5jZXIgPSBjcmVhdGVFbmhhbmNlcihcbiAqICAge1xuICogICAgIG5hbWU6ICdteUVuaGFuY2VyJyxcbiAqICAgICBwcm92aWRlczogWydmZWF0dXJlMSddLFxuICogICAgIHJlcXVpcmVzOiBbJ2ZlYXR1cmUyJ11cbiAqICAgfSxcbiAqICAgKHRyZWUpID0+IHtcbiAqICAgICAvLyBFbmhhbmNlIHRoZSB0cmVlXG4gKiAgICAgcmV0dXJuIHsgLi4udHJlZSwgZmVhdHVyZTE6IHRydWUgfTtcbiAqICAgfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW5oYW5jZXI8SSA9IHVua25vd24sIE8gPSB1bmtub3duPihcbiAgbWV0YTogRW5oYW5jZXJNZXRhLFxuICBlbmhhbmNlckZuOiAoaW5wdXQ6IEkpID0+IE9cbik6IEVuaGFuY2VyV2l0aE1ldGE8SSwgTz4ge1xuICBjb25zdCBmbiA9IGVuaGFuY2VyRm4gYXMgRW5oYW5jZXJXaXRoTWV0YTxJLCBPPjtcbiAgdHJ5IHtcbiAgICBmbi5tZXRhZGF0YSA9IG1ldGE7XG4gICAgLy8gQWxzbyBhdHRhY2ggdW5kZXIgc3ltYm9sIGZvciB0aGlyZC1wYXJ0eSBjb21wYXRpYmlsaXR5XG4gICAgdHJ5IHtcbiAgICAgIChmbiBhcyB1bmtub3duIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtFTkhBTkNFUl9NRVRBXSA9IG1ldGE7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgaWYgcHJvcGVydHkgY2FuJ3QgYmUgc2V0XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBJZ25vcmUgZXJyb3JzXG4gIH1cbiAgcmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZW5oYW5jZXIgb3JkZXIgdXNpbmcgdG9wb2xvZ2ljYWwgc29ydCBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAqXG4gKiBAcGFyYW0gZW5oYW5jZXJzIC0gQXJyYXkgb2YgZW5oYW5jZXJzIHRvIG9yZGVyXG4gKiBAcGFyYW0gYXZhaWxhYmxlQ2FwYWJpbGl0aWVzIC0gU2V0IG9mIGFscmVhZHkgYXZhaWxhYmxlIGNhcGFiaWxpdGllc1xuICogQHBhcmFtIGRlYnVnTW9kZSAtIFdoZXRoZXIgdG8gbG9nIGRlYnVnIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyBPcmRlcmVkIGFycmF5IG9mIGVuaGFuY2Vyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVuaGFuY2VyT3JkZXIoXG4gIGVuaGFuY2VyczogRW5oYW5jZXJXaXRoTWV0YTx1bmtub3duLCB1bmtub3duPltdLFxuICBhdmFpbGFibGVDYXBhYmlsaXRpZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KCksXG4gIGRlYnVnTW9kZSA9IGZhbHNlXG4pOiBFbmhhbmNlcldpdGhNZXRhPHVua25vd24sIHVua25vd24+W10ge1xuICAvLyBCdWlsZCBub2RlcyB3aXRoIG1ldGFkYXRhXG4gIGNvbnN0IG5vZGVzID0gZW5oYW5jZXJzLm1hcCgoZSwgaWR4KSA9PiAoe1xuICAgIGZuOiBlLFxuICAgIG5hbWU6XG4gICAgICBlLm1ldGFkYXRhICYmIGUubWV0YWRhdGEubmFtZVxuICAgICAgICA/IFN0cmluZyhlLm1ldGFkYXRhLm5hbWUpXG4gICAgICAgIDogYGVuaGFuY2VyIyR7aWR4fWAsXG4gICAgcmVxdWlyZXM6IG5ldyBTZXQ8c3RyaW5nPihlLm1ldGFkYXRhPy5yZXF1aXJlcyA/PyBbXSksXG4gICAgcHJvdmlkZXM6IG5ldyBTZXQ8c3RyaW5nPihlLm1ldGFkYXRhPy5wcm92aWRlcyA/PyBbXSksXG4gIH0pKTtcblxuICAvLyBCdWlsZCBkZXBlbmRlbmN5IGdyYXBoXG4gIGNvbnN0IGFkaiA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgY29uc3QgbmFtZVRvTm9kZSA9IG5ldyBNYXA8c3RyaW5nLCAodHlwZW9mIG5vZGVzKVswXT4oKTtcblxuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMpIHtcbiAgICBuYW1lVG9Ob2RlLnNldChuLm5hbWUsIG4pO1xuICAgIGFkai5zZXQobi5uYW1lLCBuZXcgU2V0PHN0cmluZz4oKSk7XG4gIH1cblxuICAvLyBDcmVhdGUgZWRnZXMgYmFzZWQgb24gcmVxdWlyZW1lbnRzXG4gIGZvciAoY29uc3QgYSBvZiBub2Rlcykge1xuICAgIGZvciAoY29uc3QgYiBvZiBub2Rlcykge1xuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCByZXEgb2YgYi5yZXF1aXJlcykge1xuICAgICAgICAvLyBTa2lwIGlmIHJlcXVpcmVtZW50IGlzIGFscmVhZHkgc2F0aXNmaWVkXG4gICAgICAgIGlmIChhdmFpbGFibGVDYXBhYmlsaXRpZXMuaGFzKHJlcSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChhLnByb3ZpZGVzLmhhcyhyZXEpKSB7XG4gICAgICAgICAgLy8gYSBtdXN0IGNvbWUgYmVmb3JlIGJcbiAgICAgICAgICBjb25zdCBzZXQgPSBhZGouZ2V0KGEubmFtZSk7XG4gICAgICAgICAgaWYgKHNldCkgc2V0LmFkZChiLm5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gS2FobidzIGFsZ29yaXRobSBmb3IgdG9wb2xvZ2ljYWwgc29ydFxuICBjb25zdCBpbkRlZ3JlZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWRqLmtleXMoKSkgaW5EZWdyZWUuc2V0KGVudHJ5LCAwKTtcbiAgZm9yIChjb25zdCBbLCBvdXRzXSBvZiBhZGopIHtcbiAgICBmb3IgKGNvbnN0IHRvIG9mIG91dHMpIGluRGVncmVlLnNldCh0bywgKGluRGVncmVlLmdldCh0bykgfHwgMCkgKyAxKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBkZWddIG9mIGluRGVncmVlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZWcgPT09IDApIHF1ZXVlLnB1c2gobmFtZSk7XG4gIH1cblxuICBjb25zdCBvcmRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG4gPSBxdWV1ZS5zaGlmdCgpIGFzIHN0cmluZztcbiAgICBpZiAoIW4pIGJyZWFrO1xuICAgIG9yZGVyZWQucHVzaChuKTtcbiAgICBjb25zdCBvdXRzID0gYWRqLmdldChuKTtcbiAgICBpZiAoIW91dHMpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgbSBvZiBvdXRzKSB7XG4gICAgICBpbkRlZ3JlZS5zZXQobSwgKGluRGVncmVlLmdldChtKSB8fCAwKSAtIDEpO1xuICAgICAgaWYgKGluRGVncmVlLmdldChtKSA9PT0gMCkgcXVldWUucHVzaChtKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBmb3IgY3ljbGVzXG4gIGlmIChvcmRlcmVkLmxlbmd0aCAhPT0gbm9kZXMubGVuZ3RoKSB7XG4gICAgaWYgKGRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFNJR05BTF9UUkVFX01FU1NBR0VTLkVOSEFOQ0VSX0NZQ0xFX0RFVEVDVEVEKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuaGFuY2VycztcbiAgfVxuXG4gIC8vIE1hcCBvcmRlcmVkIG5hbWVzIGJhY2sgdG8gZW5oYW5jZXIgZnVuY3Rpb25zXG4gIHJldHVybiBvcmRlcmVkLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG4gPSBuYW1lVG9Ob2RlLmdldChuYW1lKTtcbiAgICByZXR1cm4gKG4gPyBuLmZuIDogZW5oYW5jZXJzWzBdKSBhcyBFbmhhbmNlcldpdGhNZXRhPHVua25vd24sIHVua25vd24+O1xuICB9KTtcbn1cbiJdfQ==","import { isSignal, signal } from '@angular/core';\nimport { SIGNAL_TREE_CONSTANTS } from './constants';\nconst CALLABLE_SIGNAL_SYMBOL = Symbol.for('NodeAccessor');\nexport function equal(a, b) {\n if (a === b)\n return true;\n if (a == null || b == null)\n return a === b;\n const typeA = typeof a;\n const typeB = typeof b;\n if (typeA !== typeB)\n return false;\n if (typeA !== 'object')\n return false;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (a instanceof RegExp && b instanceof RegExp)\n return a.source === b.source && a.flags === b.flags;\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size)\n return false;\n for (const [key, value] of a) {\n if (!b.has(key) || !equal(value, b.get(key)))\n return false;\n }\n return true;\n }\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size)\n return false;\n for (const value of a) {\n if (!b.has(value))\n return false;\n }\n return true;\n }\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length)\n return false;\n return a.every((item, i) => equal(item, b[i]));\n }\n if (Array.isArray(b))\n return false;\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((k) => k in objB && equal(objA[k], objB[k]));\n}\nexport const deepEqual = equal;\nexport function terminalSignal(value, customEqual) {\n return signal(value, {\n equal: customEqual || equal,\n });\n}\nexport function isBuiltInObject(v) {\n if (v === null || v === undefined)\n return false;\n if (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 return true;\n }\n if (v instanceof Int8Array ||\n v instanceof Uint8Array ||\n v instanceof Uint8ClampedArray ||\n v instanceof Int16Array ||\n v instanceof Uint16Array ||\n v instanceof Int32Array ||\n v instanceof Uint32Array ||\n v instanceof Float32Array ||\n v instanceof Float64Array ||\n v instanceof BigInt64Array ||\n v instanceof BigUint64Array) {\n return true;\n }\n if (typeof window !== 'undefined') {\n if (v instanceof URL ||\n v instanceof URLSearchParams ||\n v instanceof FormData ||\n v instanceof Blob ||\n (typeof File !== 'undefined' && v instanceof File) ||\n (typeof FileList !== 'undefined' && v instanceof FileList) ||\n (typeof Headers !== 'undefined' && v instanceof Headers) ||\n (typeof Request !== 'undefined' && v instanceof Request) ||\n (typeof Response !== 'undefined' && v instanceof Response) ||\n (typeof AbortController !== 'undefined' &&\n v instanceof AbortController) ||\n (typeof AbortSignal !== 'undefined' && v instanceof AbortSignal)) {\n return true;\n }\n }\n try {\n const NodeBuffer = globalThis?.Buffer;\n if (NodeBuffer &&\n v instanceof NodeBuffer)\n return true;\n }\n catch {\n }\n return false;\n}\nexport function isNodeAccessor(value) {\n return (typeof value === 'function' && value && CALLABLE_SIGNAL_SYMBOL in value);\n}\nexport function isAnySignal(value) {\n return isSignal(value) || isNodeAccessor(value);\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 this.cache.delete(key);\n this.cache.set(key, value);\n }\n get(key) {\n const value = this.cache.get(key);\n if (value !== undefined) {\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}\nconst pathCache = new LRUCache(SIGNAL_TREE_CONSTANTS.MAX_PATH_CACHE_SIZE);\nexport function parsePath(path) {\n const cached = pathCache.get(path);\n if (cached)\n return cached;\n const parts = path.split('.');\n pathCache.set(path, parts);\n return parts;\n}\nexport function composeEnhancers(...enhancers) {\n return (tree) => enhancers.reduce((t, e) => e(t), tree);\n}\nexport function createLazySignalTree(obj, equalityFn, basePath = '') {\n const signalCache = new Map();\n const nestedProxies = new Map();\n const nestedCleanups = new Map();\n const cleanup = () => {\n nestedCleanups.forEach((fn) => {\n try {\n fn();\n }\n catch (error) {\n console.warn('Error during nested cleanup:', error);\n }\n });\n nestedCleanups.clear();\n signalCache.clear();\n nestedProxies.clear();\n };\n const proxy = new Proxy(obj, {\n get(target, prop) {\n if (prop === '__cleanup__')\n return cleanup;\n if (typeof prop === 'symbol') {\n return target[prop];\n }\n if (prop === 'valueOf' || prop === 'toString') {\n return target[prop];\n }\n const key = prop;\n const path = basePath ? `${basePath}.${key}` : key;\n if (!(key in target))\n return undefined;\n const value = target[key];\n if (isSignal(value))\n return value;\n if (signalCache.has(path))\n return signalCache.get(path);\n if (nestedProxies.has(path))\n return nestedProxies.get(path);\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 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 const fallbackSignal = signal(value, ...(ngDevMode ? [{ debugName: \"fallbackSignal\", equal: equalityFn }] : [{ equal: equalityFn }]));\n signalCache.set(path, fallbackSignal);\n return fallbackSignal;\n }\n }\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;\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 target[key] = value;\n const cachedSignal = signalCache.get(path);\n if (cachedSignal && 'set' in cachedSignal) {\n cachedSignal.set(value);\n }\n if (nestedProxies.has(path)) {\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}\nexport function unwrap(node) {\n if (node === null || node === undefined) {\n return node;\n }\n if (isNodeAccessor(node)) {\n const result = {};\n for (const key in node) {\n if (!Object.prototype.hasOwnProperty.call(node, key))\n continue;\n if (key === 'length' || key === 'prototype')\n continue;\n if (key === 'name') {\n const value = node[key];\n if (!isSignal(value) && !isNodeAccessor(value)) {\n continue;\n }\n }\n const value = node[key];\n if (isNodeAccessor(value)) {\n result[key] = unwrap(value);\n }\n else if (isSignal(value)) {\n const unwrappedValue = value();\n if (typeof unwrappedValue === 'object' &&\n unwrappedValue !== null &&\n !Array.isArray(unwrappedValue) &&\n !isBuiltInObject(unwrappedValue)) {\n result[key] = unwrap(unwrappedValue);\n }\n else {\n result[key] = unwrappedValue;\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !isBuiltInObject(value)) {\n result[key] = unwrap(value);\n }\n else {\n result[key] = value;\n }\n }\n return result;\n }\n if (isSignal(node)) {\n const value = node();\n if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !isBuiltInObject(value)) {\n return unwrap(value);\n }\n return value;\n }\n if (typeof node !== 'object') {\n return node;\n }\n if (Array.isArray(node)) {\n return node;\n }\n if (isBuiltInObject(node)) {\n return node;\n }\n const result = {};\n for (const key in node) {\n if (!Object.prototype.hasOwnProperty.call(node, key))\n continue;\n if (key === 'set' || key === 'update') {\n const v = node[key];\n if (typeof v === 'function')\n continue;\n }\n const value = node[key];\n if (isNodeAccessor(value)) {\n const unwrappedValue = value();\n if (typeof unwrappedValue === 'object' &&\n unwrappedValue !== null &&\n !Array.isArray(unwrappedValue) &&\n !isBuiltInObject(unwrappedValue)) {\n result[key] = unwrap(unwrappedValue);\n }\n else {\n result[key] = unwrappedValue;\n }\n }\n else if (isSignal(value)) {\n const unwrappedValue = value();\n if (typeof unwrappedValue === 'object' &&\n unwrappedValue !== null &&\n !Array.isArray(unwrappedValue) &&\n !isBuiltInObject(unwrappedValue)) {\n result[key] = unwrap(unwrappedValue);\n }\n else {\n result[key] = unwrappedValue;\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !isBuiltInObject(value)) {\n result[key] = unwrap(value);\n }\n else {\n result[key] = value;\n }\n }\n const symbols = Object.getOwnPropertySymbols(node);\n for (const sym of symbols) {\n const value = node[sym];\n if (isNodeAccessor(value)) {\n const unwrappedValue = value();\n if (typeof unwrappedValue === 'object' &&\n unwrappedValue !== null &&\n !Array.isArray(unwrappedValue) &&\n !isBuiltInObject(unwrappedValue)) {\n result[sym] = unwrap(unwrappedValue);\n }\n else {\n result[sym] = unwrappedValue;\n }\n }\n else if (isSignal(value)) {\n const unwrappedValue = value();\n if (typeof unwrappedValue === 'object' &&\n unwrappedValue !== null &&\n !Array.isArray(unwrappedValue) &&\n !isBuiltInObject(unwrappedValue)) {\n result[sym] = unwrap(unwrappedValue);\n }\n else {\n result[sym] = unwrappedValue;\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n !isBuiltInObject(value)) {\n result[sym] = unwrap(value);\n }\n else {\n result[sym] = value;\n }\n }\n return result;\n}\nexport function cleanUnwrap(node) {\n return unwrap(node);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBRXpFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdwRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFTMUQsTUFBTSxVQUFVLEtBQUssQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekIsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJO1FBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTNDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLElBQUksS0FBSyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyxJQUFJLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFckMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJO1FBQ3hDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsWUFBWSxNQUFNLElBQUksQ0FBQyxZQUFZLE1BQU07UUFDNUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBRXRELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxF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SUFDMUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFzQyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1NpZ25hbCwgU2lnbmFsLCBzaWduYWwsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFNJR05BTF9UUkVFX0NPTlNUQU5UUyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqIFN5bWJvbCB0byBtYXJrIGNhbGxhYmxlIHNpZ25hbHMgLSB1c2luZyBnbG9iYWwgc3ltYm9sIHRvIG1hdGNoIGFjcm9zcyBmaWxlcyAqL1xuY29uc3QgQ0FMTEFCTEVfU0lHTkFMX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ05vZGVBY2Nlc3NvcicpO1xuXG4vKipcbiAqIFNpZ25hbFRyZWUgVXRpbGl0eSBGdW5jdGlvbnMgdjEuMS42XG4gKiBDb3JlIHV0aWxpdGllcyBmb3Igc2lnbmFsIHRyZWUgb3BlcmF0aW9uc1xuICovXG5pbXBvcnQgdHlwZSB7IERlZXBTaWduYWxpZnksIFJlbW92ZVNpZ25hbE1ldGhvZHMsIE5vZGVBY2Nlc3NvciB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogRGVlcCBlcXVhbGl0eSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxdWFsPFQ+KGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT09IGI7XG5cbiAgY29uc3QgdHlwZUEgPSB0eXBlb2YgYTtcbiAgY29uc3QgdHlwZUIgPSB0eXBlb2YgYjtcbiAgaWYgKHR5cGVBICE9PSB0eXBlQikgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZUEgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlICYmIGIgaW5zdGFuY2VvZiBEYXRlKVxuICAgIHJldHVybiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCk7XG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwICYmIGIgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgICBpZiAoIWIuaGFzKGtleSkgfHwgIWVxdWFsKHZhbHVlLCBiLmdldChrZXkpKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgU2V0ICYmIGIgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGEpIHtcbiAgICAgIGlmICghYi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikgfHwgYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKGl0ZW0sIGkpID0+IGVxdWFsKGl0ZW0sIChiIGFzIHVua25vd24gYXMgdW5rbm93bltdKVtpXSkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBvYmpBID0gYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qgb2JqQiA9IGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4ga2V5c0EuZXZlcnkoKGspID0+IGsgaW4gb2JqQiAmJiBlcXVhbChvYmpBW2tdLCBvYmpCW2tdKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWVwRXF1YWwgPSBlcXVhbDtcblxuLyoqIFRlcm1pbmFsIHNpZ25hbCB3aXRoIGRlZXAgZXF1YWxpdHkgKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXJtaW5hbFNpZ25hbDxUPihcbiAgdmFsdWU6IFQsXG4gIGN1c3RvbUVxdWFsPzogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW5cbik6IFdyaXRhYmxlU2lnbmFsPFQ+IHtcbiAgcmV0dXJuIHNpZ25hbCh2YWx1ZSwge1xuICAgIGVxdWFsOiBjdXN0b21FcXVhbCB8fCBlcXVhbCxcbiAgfSk7XG59XG5cbi8qKiBSdW50aW1lIGJ1aWx0LWluIGRldGVjdGlvbiAoa2VlcCBpbiBzeW5jIHdpdGggdHlwZXMgQnVpbHRJbk9iamVjdCkgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWx0SW5PYmplY3QodjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcblxuICBpZiAoXG4gICAgdiBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICB2IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgdHlwZW9mIHYgPT09ICdmdW5jdGlvbicgfHxcbiAgICB2IGluc3RhbmNlb2YgTWFwIHx8XG4gICAgdiBpbnN0YW5jZW9mIFNldCB8fFxuICAgIHYgaW5zdGFuY2VvZiBXZWFrTWFwIHx8XG4gICAgdiBpbnN0YW5jZW9mIFdlYWtTZXQgfHxcbiAgICB2IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICB2IGluc3RhbmNlb2YgRGF0YVZpZXcgfHxcbiAgICB2IGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICB2IGluc3RhbmNlb2YgUHJvbWlzZVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChcbiAgICB2IGluc3RhbmNlb2YgSW50OEFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgSW50MTZBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBVaW50MTZBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5IHx8XG4gICAgdiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkgfHxcbiAgICB2IGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSB8fFxuICAgIHYgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmIChcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkwgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMgfHxcbiAgICAgIHYgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fFxuICAgICAgdiBpbnN0YW5jZW9mIEJsb2IgfHxcbiAgICAgICh0eXBlb2YgRmlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEZpbGUpIHx8XG4gICAgICAodHlwZW9mIEZpbGVMaXN0ICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgRmlsZUxpc3QpIHx8XG4gICAgICAodHlwZW9mIEhlYWRlcnMgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBIZWFkZXJzKSB8fFxuICAgICAgKHR5cGVvZiBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJyAmJiB2IGluc3RhbmNlb2YgUmVxdWVzdCkgfHxcbiAgICAgICh0eXBlb2YgUmVzcG9uc2UgIT09ICd1bmRlZmluZWQnICYmIHYgaW5zdGFuY2VvZiBSZXNwb25zZSkgfHxcbiAgICAgICh0eXBlb2YgQWJvcnRDb250cm9sbGVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB2IGluc3RhbmNlb2YgQWJvcnRDb250cm9sbGVyKSB8fFxuICAgICAgKHR5cGVvZiBBYm9ydFNpZ25hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdiBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBOb2RlQnVmZmVyID0gKGdsb2JhbFRoaXMgYXMgeyBCdWZmZXI/OiB1bmtub3duIH0pPy5CdWZmZXI7XG4gICAgaWYgKFxuICAgICAgTm9kZUJ1ZmZlciAmJlxuICAgICAgdiBpbnN0YW5jZW9mIChOb2RlQnVmZmVyIGFzIG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKVxuICAgIClcbiAgICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICAvKiBpZ25vcmUgKi9cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBhIG5vZGUgYWNjZXNzb3IgY3JlYXRlZCBieSBtYWtlTm9kZUFjY2Vzc29yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVBY2Nlc3Nvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE5vZGVBY2Nlc3Nvcjx1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIHZhbHVlICYmIENBTExBQkxFX1NJR05BTF9TWU1CT0wgaW4gdmFsdWVcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSB2YWx1ZSBpcyBlaXRoZXIgYW4gQW5ndWxhciBzaWduYWwgb3IgYSBjYWxsYWJsZSBzaWduYWxcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBwYWNrYWdlcyB0aGF0IG5lZWQgdG8gd29yayB3aXRoIGJvdGggdHlwZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQW55U2lnbmFsKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1NpZ25hbCh2YWx1ZSkgfHwgaXNOb2RlQWNjZXNzb3IodmFsdWUpO1xufVxuXG4vKiogU21hbGwgTFJVIGNhY2hlIHVzZWQgYnkgcGFyc2VQYXRoICovXG5jbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgY2FjaGUgPSBuZXcgTWFwPEssIFY+KCk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyKSB7fVxuICBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhY2hlLnNpemUgPj0gdGhpcy5tYXhTaXplKSB7XG4gICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChmaXJzdEtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLmNhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgZ2V0KGtleTogSyk6IFYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICB9XG4gIHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5zaXplO1xuICB9XG59XG5cbmNvbnN0IHBhdGhDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIHN0cmluZ1tdPihcbiAgU0lHTkFMX1RSRUVfQ09OU1RBTlRTLk1BWF9QQVRIX0NBQ0hFX1NJWkVcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjYWNoZWQgPSBwYXRoQ2FjaGUuZ2V0KHBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgcGF0aENhY2hlLnNldChwYXRoLCBwYXJ0cyk7XG4gIHJldHVybiBwYXJ0cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VFbmhhbmNlcnM8VD4oXG4gIC4uLmVuaGFuY2VyczogQXJyYXk8KHRyZWU6IFQpID0+IFQ+XG4pOiAodHJlZTogVCkgPT4gVCB7XG4gIHJldHVybiAodHJlZTogVCkgPT4gZW5oYW5jZXJzLnJlZHVjZSgodCwgZSkgPT4gZSh0KSwgdHJlZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGxhenkgc2lnbmFsIHRyZWUgdXNpbmcgUHJveHkgZm9yIG9uLWRlbWFuZCBzaWduYWwgY3JlYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhenlTaWduYWxUcmVlPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFQsXG4gIGVxdWFsaXR5Rm46IChhOiB1bmtub3duLCBiOiB1bmtub3duKSA9PiBib29sZWFuLFxuICBiYXNlUGF0aCA9ICcnXG4pOiBEZWVwU2lnbmFsaWZ5PFQ+IHtcbiAgY29uc3Qgc2lnbmFsQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgV3JpdGFibGVTaWduYWw8dW5rbm93bj4+KCk7XG4gIGNvbnN0IG5lc3RlZFByb3hpZXMgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgY29uc3QgbmVzdGVkQ2xlYW51cHMgPSBuZXcgTWFwPHN0cmluZywgKCkgPT4gdm9pZD4oKTtcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIG5lc3RlZENsZWFudXBzLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBkdXJpbmcgbmVzdGVkIGNsZWFudXA6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5lc3RlZENsZWFudXBzLmNsZWFyKCk7XG4gICAgc2lnbmFsQ2FjaGUuY2xlYXIoKTtcbiAgICBuZXN0ZWRQcm94aWVzLmNsZWFyKCk7XG4gIH07XG5cbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0KHRhcmdldDogb2JqZWN0LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIGlmIChwcm9wID09PSAnX19jbGVhbnVwX18nKSByZXR1cm4gY2xlYW51cDtcblxuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wID09PSAndmFsdWVPZicgfHwgcHJvcCA9PT0gJ3RvU3RyaW5nJykge1xuICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHByb3AgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIGlmICghKGtleSBpbiB0YXJnZXQpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblxuICAgICAgaWYgKHNpZ25hbENhY2hlLmhhcyhwYXRoKSkgcmV0dXJuIHNpZ25hbENhY2hlLmdldChwYXRoKTtcbiAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkgcmV0dXJuIG5lc3RlZFByb3hpZXMuZ2V0KHBhdGgpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc1NpZ25hbCh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFByb3h5ID0gY3JlYXRlTGF6eVNpZ25hbFRyZWUoXG4gICAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIGVxdWFsaXR5Rm4sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXN0ZWRQcm94aWVzLnNldChwYXRoLCBuZXN0ZWRQcm94eSk7XG5cbiAgICAgICAgICBjb25zdCBwcm94eVdpdGhDbGVhbnVwID0gbmVzdGVkUHJveHkgYXMgeyBfX2NsZWFudXBfXz86ICgpID0+IHZvaWQgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHByb3h5V2l0aENsZWFudXAuX19jbGVhbnVwX18gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lc3RlZENsZWFudXBzLnNldChwYXRoLCBwcm94eVdpdGhDbGVhbnVwLl9fY2xlYW51cF9fKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmVzdGVkUHJveHk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgbGF6eSBwcm94eSBmb3IgcGF0aCBcIiR7cGF0aH1cIjpgLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrU2lnbmFsID0gc2lnbmFsKHZhbHVlLCB7IGVxdWFsOiBlcXVhbGl0eUZuIH0pO1xuICAgICAgICAgIHNpZ25hbENhY2hlLnNldChwYXRoLCBmYWxsYmFja1NpZ25hbCk7XG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrU2lnbmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld1NpZ25hbCA9IHNpZ25hbCh2YWx1ZSwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KTtcbiAgICAgICAgc2lnbmFsQ2FjaGUuc2V0KHBhdGgsIG5ld1NpZ25hbCk7XG4gICAgICAgIHJldHVybiBuZXdTaWduYWw7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBjcmVhdGUgc2lnbmFsIGZvciBwYXRoIFwiJHtwYXRofVwiOmAsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXQodGFyZ2V0OiBvYmplY3QsIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IHVua25vd24pIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleSA9IHByb3AgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgcGF0aCA9IGJhc2VQYXRoID8gYCR7YmFzZVBhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgICAgICBjb25zdCBjYWNoZWRTaWduYWwgPSBzaWduYWxDYWNoZS5nZXQocGF0aCk7XG4gICAgICAgIGlmIChjYWNoZWRTaWduYWwgJiYgJ3NldCcgaW4gY2FjaGVkU2lnbmFsKSB7XG4gICAgICAgICAgKGNhY2hlZFNpZ25hbCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXN0ZWRQcm94aWVzLmhhcyhwYXRoKSkge1xuICAgICAgICAgIGNvbnN0IG5lc3RlZENsZWFudXAgPSBuZXN0ZWRDbGVhbnVwcy5nZXQocGF0aCk7XG4gICAgICAgICAgaWYgKG5lc3RlZENsZWFudXApIHtcbiAgICAgICAgICAgIG5lc3RlZENsZWFudXAoKTtcbiAgICAgICAgICAgIG5lc3RlZENsZWFudXBzLmRlbGV0ZShwYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmVzdGVkUHJveGllcy5kZWxldGUocGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNldCB2YWx1ZSBmb3IgcGF0aCBcIiR7cGF0aH1cIjpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIHByb3AgaW4gdGFyZ2V0O1xuICAgIH0sXG5cbiAgICBvd25LZXlzKHRhcmdldCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICAgIH0sXG5cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKSB7XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcHJveHkgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbn1cblxuLyoqXG4gKiBVbndyYXBzIGEgc2lnbmFsIG9yIHNpZ25hbCB0cmVlIGludG8gYSBwbGFpbiBKUyB2YWx1ZSBzaGFwZWQgYXMgVC5cbiAqIE5PVEU6IFJ1bnRpbWUgc3RyaXBzIHRoZSBkeW5hbWljIHNldC91cGRhdGUgaGVscGVyczsgY2FsbCBzaXRlcyByZWNlaXZlIFQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXA8VD4obm9kZTogRGVlcFNpZ25hbGlmeTxUPik6IFQ7XG5leHBvcnQgZnVuY3Rpb24gdW53cmFwPFQ+KG5vZGU6IE5vZGVBY2Nlc3NvcjxUPiAmIERlZXBTaWduYWxpZnk8VD4pOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcDxUPihub2RlOiBOb2RlQWNjZXNzb3I8VD4pOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcDxUPihub2RlOiB1bmtub3duKTogVDtcbmV4cG9ydCBmdW5jdGlvbiB1bndyYXA8VD4obm9kZTogdW5rbm93bik6IFQge1xuICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbm9kZSBhcyBUO1xuICB9XG5cbiAgLy8gSGFuZGxlIGNhbGxhYmxlIHNpZ25hbHMgZmlyc3RcbiAgaWYgKGlzTm9kZUFjY2Vzc29yKG5vZGUpKSB7XG4gICAgLy8gRm9yIE5vZGVBY2Nlc3NvcnMsIGRvbid0IGNhbGwgdGhlbSAtIHJlYWQgZnJvbSB0aGVpciBwcm9wZXJ0aWVzIGRpcmVjdGx5XG4gICAgLy8gVGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gd2hlbiBOb2RlQWNjZXNzb3IgY2FsbHMgdW53cmFwKGFjY2Vzc29yKVxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBrZXkpKSBjb250aW51ZTtcblxuICAgICAgLy8gU2tpcCBmdW5jdGlvbiBwcm90b3R5cGUgcHJvcGVydGllcyBvbmx5LCBub3QgdXNlciBwcm9wZXJ0aWVzXG4gICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSBjb250aW51ZTtcblxuICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgJ25hbWUnIC0gaWYgaXQncyBhIHNpZ25hbCBvciBOb2RlQWNjZXNzb3IsIGluY2x1ZGUgaXRcbiAgICAgIGlmIChrZXkgPT09ICduYW1lJykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChub2RlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICAgIGlmICghaXNTaWduYWwodmFsdWUpICYmICFpc05vZGVBY2Nlc3Nvcih2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBTa2lwIGlmIGl0J3MganVzdCB0aGUgZnVuY3Rpb24gbmFtZSBwcm9wZXJ0eVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcblxuICAgICAgaWYgKGlzTm9kZUFjY2Vzc29yKHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcCh2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICBjb25zdCB1bndyYXBwZWRWYWx1ZSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdW53cmFwcGVkVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgdW53cmFwcGVkVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheSh1bndyYXBwZWRWYWx1ZSkgJiZcbiAgICAgICAgICAhaXNCdWlsdEluT2JqZWN0KHVud3JhcHBlZFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcCh1bndyYXBwZWRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB1bndyYXBwZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgVDtcbiAgfVxuICBpZiAoaXNTaWduYWwobm9kZSkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IChub2RlIGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAhaXNCdWlsdEluT2JqZWN0KHZhbHVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVud3JhcCh2YWx1ZSkgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gIH1cblxuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG5vZGUgYXMgVDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUgYXMgVDtcbiAgfVxuXG4gIGlmIChpc0J1aWx0SW5PYmplY3Qobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZSBhcyBUO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGtleSA9PT0gJ3NldCcgfHwga2V5ID09PSAndXBkYXRlJykge1xuICAgICAgY29uc3QgdiA9IChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgaWYgKGlzTm9kZUFjY2Vzc29yKHZhbHVlKSkge1xuICAgICAgY29uc3QgdW53cmFwcGVkVmFsdWUgPSB2YWx1ZSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdW53cmFwcGVkVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHVud3JhcHBlZFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHVud3JhcHBlZFZhbHVlKSAmJlxuICAgICAgICAhaXNCdWlsdEluT2JqZWN0KHVud3JhcHBlZFZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdW53cmFwKHVud3JhcHBlZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdW53cmFwcGVkVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHVud3JhcHBlZFZhbHVlID0gKHZhbHVlIGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIHVud3JhcHBlZFZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB1bndyYXBwZWRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh1bndyYXBwZWRWYWx1ZSkgJiZcbiAgICAgICAgIWlzQnVpbHRJbk9iamVjdCh1bndyYXBwZWRWYWx1ZSlcbiAgICAgICkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcCh1bndyYXBwZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHVud3JhcHBlZFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAhaXNCdWlsdEluT2JqZWN0KHZhbHVlKVxuICAgICkge1xuICAgICAgcmVzdWx0W2tleV0gPSB1bndyYXAodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG5vZGUgYXMgb2JqZWN0KTtcbiAgZm9yIChjb25zdCBzeW0gb2Ygc3ltYm9scykge1xuICAgIGNvbnN0IHZhbHVlID0gKG5vZGUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV07XG4gICAgaWYgKGlzTm9kZUFjY2Vzc29yKHZhbHVlKSkge1xuICAgICAgY29uc3QgdW53cmFwcGVkVmFsdWUgPSB2YWx1ZSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdW53cmFwcGVkVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHVud3JhcHBlZFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KHVud3JhcHBlZFZhbHVlKSAmJlxuICAgICAgICAhaXNCdWlsdEluT2JqZWN0KHVud3JhcHBlZFZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIChyZXN1bHQgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW3N5bV0gPSB1bndyYXAodW53cmFwcGVkVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHVud3JhcHBlZFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICBjb25zdCB1bndyYXBwZWRWYWx1ZSA9ICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB1bndyYXBwZWRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdW53cmFwcGVkVmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodW53cmFwcGVkVmFsdWUpICYmXG4gICAgICAgICFpc0J1aWx0SW5PYmplY3QodW53cmFwcGVkVmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHVud3JhcCh1bndyYXBwZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAocmVzdWx0IGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtzeW1dID0gdW53cmFwcGVkVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICFpc0J1aWx0SW5PYmplY3QodmFsdWUpXG4gICAgKSB7XG4gICAgICAocmVzdWx0IGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtzeW1dID0gdW53cmFwKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHJlc3VsdCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBUO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHN0cmljdCB2YXJpYW50IGZvciBpbnRlcm5hbCB1c2Ugd2hlbiB5b3Ugd2FudCB0aGUgY2xlYW5lZCBzdHJ1Y3R1cmFsIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVud3JhcDxUPihub2RlOiB1bmtub3duKTogUmVtb3ZlU2lnbmFsTWV0aG9kczxUPiB7XG4gIHJldHVybiB1bndyYXAobm9kZSkgYXMgdW5rbm93biBhcyBSZW1vdmVTaWduYWxNZXRob2RzPFQ+O1xufVxuIl19","import { computed, DestroyRef, effect, inject, isSignal, signal } from '@angular/core';\nimport { SIGNAL_TREE_CONSTANTS, SIGNAL_TREE_MESSAGES } from './constants';\nimport { resolveEnhancerOrder } from './enhancers';\nimport { createLazySignalTree, equal, isBuiltInObject, unwrap } from './utils';\nconst NODE_ACCESSOR_SYMBOL = Symbol.for('NodeAccessor');\nfunction makeNodeAccessor() {\n const accessor = function (arg) {\n if (arguments.length === 0) {\n return unwrap(accessor);\n }\n if (typeof arg === 'function') {\n const updater = arg;\n const currentValue = unwrap(accessor);\n const newValue = updater(currentValue);\n recursiveUpdate(accessor, newValue);\n }\n else {\n recursiveUpdate(accessor, arg);\n }\n };\n accessor[NODE_ACCESSOR_SYMBOL] = true;\n return accessor;\n}\nfunction makeRootNodeAccessor(readSignal, writeSignal) {\n const accessor = function (arg) {\n if (arguments.length === 0) {\n return readSignal();\n }\n if (typeof arg === 'function') {\n const updater = arg;\n writeSignal.set(updater(readSignal()));\n }\n else {\n writeSignal.set(arg);\n }\n };\n accessor[NODE_ACCESSOR_SYMBOL] = true;\n return accessor;\n}\nfunction recursiveUpdate(target, updates) {\n if (!updates || typeof updates !== 'object') {\n return;\n }\n let targetObj;\n if (isNodeAccessor(target)) {\n targetObj = target;\n }\n else if (target && typeof target === 'object') {\n targetObj = target;\n }\n else {\n return;\n }\n const updatesObj = updates;\n for (const key in updatesObj) {\n if (!(key in targetObj)) {\n continue;\n }\n const targetProp = targetObj[key];\n const updateValue = updatesObj[key];\n if (isSignal(targetProp)) {\n if ('set' in targetProp && typeof targetProp.set === 'function') {\n targetProp.set(updateValue);\n }\n }\n else if (isNodeAccessor(targetProp)) {\n if (updateValue && typeof updateValue === 'object') {\n recursiveUpdate(targetProp, updateValue);\n }\n else {\n targetProp(updateValue);\n }\n }\n }\n}\nexport function isNodeAccessor(value) {\n return (typeof value === 'function' &&\n value &&\n value[NODE_ACCESSOR_SYMBOL] === true);\n}\nfunction estimateObjectSize(obj, maxDepth = SIGNAL_TREE_CONSTANTS.ESTIMATE_MAX_DEPTH, currentDepth = 0) {\n if (currentDepth >= maxDepth)\n return 1;\n if (obj === null || obj === undefined)\n return 0;\n if (typeof obj !== 'object')\n return 1;\n let size = 0;\n try {\n if (Array.isArray(obj)) {\n size = obj.length;\n const sampleSize = Math.min(SIGNAL_TREE_CONSTANTS.ESTIMATE_SAMPLE_SIZE_ARRAY, obj.length);\n for (let i = 0; i < sampleSize; i++) {\n size += estimateObjectSize(obj[i], maxDepth, currentDepth + 1) * 0.1;\n }\n }\n else {\n const keys = Object.keys(obj);\n size = keys.length;\n const sampleSize = Math.min(SIGNAL_TREE_CONSTANTS.ESTIMATE_SAMPLE_SIZE_OBJECT, keys.length);\n for (let i = 0; i < sampleSize; i++) {\n const value = obj[keys[i]];\n size += estimateObjectSize(value, maxDepth, currentDepth + 1) * 0.5;\n }\n }\n }\n catch {\n return 1;\n }\n return Math.floor(size);\n}\nfunction shouldUseLazy(obj, config, precomputedSize) {\n if (config.useLazySignals !== undefined)\n return config.useLazySignals;\n if (config.debugMode || config.enableDevTools)\n return false;\n if (config.batchUpdates && config.useMemoization)\n return true;\n const estimatedSize = precomputedSize ?? estimateObjectSize(obj);\n return estimatedSize > SIGNAL_TREE_CONSTANTS.LAZY_THRESHOLD;\n}\nfunction createEqualityFn(useShallowComparison) {\n return useShallowComparison ? Object.is : equal;\n}\nfunction createSignalStore(obj, equalityFn) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return signal(obj, { equal: equalityFn });\n }\n if (Array.isArray(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n if (isBuiltInObject(obj)) {\n return signal(obj, { equal: equalityFn });\n }\n const store = {};\n const processedObjects = new WeakSet();\n if (processedObjects.has(obj)) {\n console.warn(SIGNAL_TREE_MESSAGES.CIRCULAR_REF);\n return signal(obj, { equal: equalityFn });\n }\n processedObjects.add(obj);\n try {\n for (const [key, value] of Object.entries(obj)) {\n try {\n if (typeof key === 'symbol')\n continue;\n if (isSignal(value)) {\n store[key] = value;\n continue;\n }\n if (value === null || value === undefined) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (typeof value !== 'object') {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else if (Array.isArray(value) || isBuiltInObject(value)) {\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n else {\n const branch = createSignalStore(value, equalityFn);\n const callableBranch = makeNodeAccessor();\n for (const branchKey in branch) {\n if (Object.prototype.hasOwnProperty.call(branch, branchKey)) {\n try {\n Object.defineProperty(callableBranch, branchKey, {\n value: branch[branchKey],\n enumerable: true,\n configurable: true,\n });\n }\n catch {\n }\n }\n }\n store[key] = callableBranch;\n }\n }\n catch (error) {\n console.warn(`${SIGNAL_TREE_MESSAGES.SIGNAL_CREATION_FAILED} \"${key}\":`, error);\n store[key] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n const symbols = Object.getOwnPropertySymbols(obj);\n for (const sym of symbols) {\n const value = obj[sym];\n try {\n if (isSignal(value)) {\n store[sym] = value;\n }\n else {\n store[sym] = signal(value, {\n equal: equalityFn,\n });\n }\n }\n catch (error) {\n console.warn(SIGNAL_TREE_MESSAGES.SIGNAL_CREATION_FAILED, error);\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}\nfunction enhanceTree(tree, config = {}) {\n const isLazy = config.useLazySignals ?? shouldUseLazy(tree.state, config);\n tree.with = ((...enhancers) => {\n if (enhancers.length === 0) {\n return tree;\n }\n const coreCapabilities = new Set();\n if (config.batchUpdates)\n coreCapabilities.add('batchUpdate');\n if (config.useMemoization)\n coreCapabilities.add('memoize');\n if (config.enableTimeTravel)\n coreCapabilities.add('undo');\n if (config.enableDevTools)\n coreCapabilities.add('connectDevTools');\n try {\n for (const key of Object.keys(tree))\n coreCapabilities.add(String(key));\n }\n catch {\n }\n const hasMetadata = enhancers.some((e) => Boolean(e.metadata && (e.metadata.requires || e.metadata.provides)));\n let orderedEnhancers = enhancers;\n if (hasMetadata) {\n try {\n orderedEnhancers = resolveEnhancerOrder(enhancers, coreCapabilities, config.debugMode);\n }\n catch (err) {\n console.warn(SIGNAL_TREE_MESSAGES.ENHANCER_ORDER_FAILED, err);\n }\n }\n const provided = new Set(coreCapabilities);\n let currentTree = tree;\n for (let i = 0; i < orderedEnhancers.length; i++) {\n const enhancer = orderedEnhancers[i];\n if (typeof enhancer !== 'function') {\n throw new Error(SIGNAL_TREE_MESSAGES.ENHANCER_NOT_FUNCTION.replace('%d', String(i)));\n }\n const reqs = enhancer.metadata?.requires ?? [];\n for (const r of reqs) {\n if (!(r in currentTree) && !provided.has(r)) {\n const name = enhancer.metadata?.name ?? `enhancer#${i}`;\n const msg = SIGNAL_TREE_MESSAGES.ENHANCER_REQUIREMENT_MISSING.replace('%s', name).replace('%s', r);\n if (config.debugMode) {\n throw new Error(msg);\n }\n else {\n console.warn(msg);\n }\n }\n }\n try {\n const result = enhancer(currentTree);\n if (result !== currentTree)\n currentTree = result;\n const provs = enhancer.metadata?.provides ?? [];\n for (const p of provs)\n provided.add(p);\n if (config.debugMode && provs.length > 0) {\n for (const p of provs) {\n if (!(p in currentTree)) {\n console.warn(SIGNAL_TREE_MESSAGES.ENHANCER_PROVIDES_MISSING.replace('%s', enhancer.metadata?.name ?? String(i)).replace('%s', p));\n }\n }\n }\n }\n catch (error) {\n const name = enhancer.metadata?.name || `enhancer at index ${i}`;\n console.error(SIGNAL_TREE_MESSAGES.ENHANCER_FAILED.replace('%s', name), error);\n if (config.debugMode) {\n console.error('[SignalTree] Enhancer stack trace:', enhancer);\n console.error('[SignalTree] Tree state at failure:', currentTree);\n }\n throw error;\n }\n }\n return currentTree;\n });\n tree.destroy = () => {\n try {\n if (isLazy) {\n const state = tree.state;\n if (state && typeof state === 'object' && '__cleanup__' in state) {\n const cleanup = state.__cleanup__;\n if (typeof cleanup === 'function') {\n cleanup();\n }\n }\n }\n if (config.debugMode) {\n console.log(SIGNAL_TREE_MESSAGES.TREE_DESTROYED);\n }\n }\n catch (error) {\n console.error(SIGNAL_TREE_MESSAGES.CLEANUP_ERROR, error);\n }\n };\n addStubMethods(tree, config);\n return tree;\n}\nfunction addStubMethods(tree, config) {\n tree.batchUpdate = (updater) => {\n console.warn(SIGNAL_TREE_MESSAGES.BATCH_NOT_ENABLED);\n tree((current) => {\n const partial = updater(current);\n return { ...current, ...partial };\n });\n };\n tree.memoize = (fn, cacheKey) => {\n console.warn(SIGNAL_TREE_MESSAGES.MEMOIZE_NOT_ENABLED);\n void cacheKey;\n return computed(() => fn(tree()));\n };\n tree.effect = (fn) => {\n try {\n effect(() => fn(tree()));\n }\n catch (error) {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.EFFECT_NO_CONTEXT, error);\n }\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());\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 if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.SUBSCRIBE_NO_CONTEXT, error);\n }\n fn(tree());\n return () => {\n };\n }\n };\n tree.optimize = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.OPTIMIZE_NOT_AVAILABLE);\n }\n };\n tree.clearCache = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.CACHE_NOT_AVAILABLE);\n }\n };\n tree.invalidatePattern = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.PERFORMANCE_NOT_ENABLED);\n }\n return 0;\n };\n tree.getMetrics = () => {\n return {\n updates: 0,\n computations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageUpdateTime: 0,\n };\n };\n tree.addTap = (middleware) => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.MIDDLEWARE_NOT_AVAILABLE);\n }\n void middleware;\n };\n tree.removeTap = (id) => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.MIDDLEWARE_NOT_AVAILABLE);\n }\n void id;\n };\n tree.asCrud = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.ENTITY_HELPERS_NOT_AVAILABLE);\n }\n return {};\n };\n tree.asyncAction = (operation, asyncConfig = {}) => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.ASYNC_ACTIONS_NOT_AVAILABLE);\n }\n void operation;\n void asyncConfig;\n return {};\n };\n tree.undo = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);\n }\n };\n tree.redo = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);\n }\n };\n tree.getHistory = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);\n }\n return [];\n };\n tree.resetHistory = () => {\n if (config.debugMode) {\n console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);\n }\n };\n}\nfunction create(obj, config = {}) {\n if (obj === null || obj === undefined) {\n throw new Error(SIGNAL_TREE_MESSAGES.NULL_OR_UNDEFINED);\n }\n const estimatedSize = estimateObjectSize(obj);\n const equalityFn = createEqualityFn(config.useShallowComparison ?? false);\n if (Array.isArray(obj)) {\n const signalState = signal(obj, {\n equal: equalityFn,\n });\n const tree = makeRootNodeAccessor(signalState, signalState);\n Object.defineProperty(tree, 'state', {\n value: signalState,\n enumerable: false,\n });\n Object.defineProperty(tree, '$', { value: signalState, enumerable: false });\n enhanceTree(tree, config);\n return tree;\n }\n const useLazy = shouldUseLazy(obj, config, estimatedSize);\n if (config.debugMode) {\n console.log(SIGNAL_TREE_MESSAGES.STRATEGY_SELECTION.replace('%s', useLazy ? 'lazy' : 'eager').replace('%d', String(estimatedSize)));\n }\n let signalState;\n try {\n if (useLazy && typeof obj === 'object') {\n signalState = createLazySignalTree(obj, equalityFn);\n }\n else {\n signalState = createSignalStore(obj, equalityFn);\n }\n }\n catch (error) {\n if (useLazy) {\n console.warn(SIGNAL_TREE_MESSAGES.LAZY_FALLBACK, error);\n signalState = createSignalStore(obj, equalityFn);\n }\n else {\n throw error;\n }\n }\n const tree = function (arg) {\n if (arguments.length === 0) {\n return unwrap(signalState);\n }\n if (typeof arg === 'function') {\n const updater = arg;\n const currentValue = unwrap(signalState);\n const newValue = updater(currentValue);\n recursiveUpdate(signalState, newValue);\n }\n else {\n recursiveUpdate(signalState, arg);\n }\n };\n Object.defineProperty(tree, NODE_ACCESSOR_SYMBOL, {\n value: true,\n enumerable: false,\n });\n Object.defineProperty(tree, 'state', {\n value: signalState,\n enumerable: false,\n });\n Object.defineProperty(tree, '$', { value: signalState, enumerable: false });\n enhanceTree(tree, config);\n for (const key in signalState) {\n if (Object.prototype.hasOwnProperty.call(signalState, key)) {\n if (!(key in tree)) {\n try {\n Object.defineProperty(tree, key, {\n value: signalState[key],\n enumerable: true,\n configurable: true,\n });\n }\n catch {\n }\n }\n }\n }\n return tree;\n}\nconst presetConfigs = {\n basic: {\n useLazySignals: false,\n debugMode: false,\n },\n performance: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n useShallowComparison: true,\n },\n development: {\n useLazySignals: false,\n debugMode: true,\n enableDevTools: true,\n trackPerformance: true,\n },\n production: {\n useLazySignals: true,\n batchUpdates: true,\n useMemoization: true,\n debugMode: false,\n },\n};\nexport function signalTree(obj, configOrPreset) {\n if (typeof configOrPreset === 'string') {\n const config = presetConfigs[configOrPreset];\n if (!config) {\n console.warn(SIGNAL_TREE_MESSAGES.PRESET_UNKNOWN.replace('%s', configOrPreset));\n return create(obj, {});\n }\n return create(obj, config);\n }\n const config = configOrPreset || {};\n return create(obj, config);\n}\nexport function applyEnhancer(tree, enhancer) {\n return enhancer(tree);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2lnbmFsLXRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQVUsTUFBTSxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUUvRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUcvRSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUEwQnhELFNBQVMsZ0JBQWdCO0lBQ3ZCLE1BQU0sUUFBUSxHQUFHLFVBQVUsR0FBYTtRQUN0QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFFM0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUksT0FBTyxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDOUIsTUFBTSxPQUFPLEdBQUcsR0FBd0IsQ0FBQztZQUN6QyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFNLENBQUM7WUFDM0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFFTixlQUFlLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFvQixDQUFDO0lB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LE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3BDLE9BQU8sTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBT0QsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsSUFBbUIsRUFDbkIsUUFBNEM7SUFFNUMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIGluamVjdCwgaXNTaWduYWwsIFNpZ25hbCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTSUdOQUxfVFJFRV9DT05TVEFOVFMsIFNJR05BTF9UUkVFX01FU1NBR0VTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuaGFuY2VyT3JkZXIgfSBmcm9tICcuL2VuaGFuY2Vycyc7XG5pbXBvcnQgeyBjcmVhdGVMYXp5U2lnbmFsVHJlZSwgZXF1YWwsIGlzQnVpbHRJbk9iamVjdCwgdW53cmFwIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIEdsb2JhbCBzeW1ib2wgZm9yIE5vZGVBY2Nlc3NvciBpZGVudGlmaWNhdGlvblxuY29uc3QgTk9ERV9BQ0NFU1NPUl9TWU1CT0wgPSBTeW1ib2wuZm9yKCdOb2RlQWNjZXNzb3InKTtcblxuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBUcmVlQ29uZmlnLFxuICBUcmVlUHJlc2V0LFxuICBNaWRkbGV3YXJlLFxuICBQZXJmb3JtYW5jZU1ldHJpY3MsXG4gIEVudGl0eUhlbHBlcnMsXG4gIEFzeW5jQWN0aW9uQ29uZmlnLFxuICBBc3luY0FjdGlvbixcbiAgVGltZVRyYXZlbEVudHJ5LFxuICBFbmhhbmNlcldpdGhNZXRhLFxuICBDaGFpblJlc3VsdCxcbiAgV2l0aE1ldGhvZCxcbiAgTm9kZUFjY2Vzc29yLFxufSBmcm9tICcuL3R5cGVzJztcblxuLy8gVHlwZSBhbGlhcyBmb3IgaW50ZXJuYWwgdXNlXG50eXBlIExvY2FsVW5rbm93bkVuaGFuY2VyID0gRW5oYW5jZXJXaXRoTWV0YTx1bmtub3duLCB1bmtub3duPjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2FsbGFibGUgTm9kZUFjY2Vzc29yIGZvciBuZXN0ZWQgb2JqZWN0cyBXSVRIT1VUIGEgYmFja2luZyBzaWduYWxcbiAqIFRoaXMgYWNjZXNzb3IgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGNoaWxkIHNpZ25hbHMgZGlyZWN0bHlcbiAqL1xuZnVuY3Rpb24gbWFrZU5vZGVBY2Nlc3NvcjxUPigpOiBOb2RlQWNjZXNzb3I8VD4ge1xuICBjb25zdCBhY2Nlc3NvciA9IGZ1bmN0aW9uIChhcmc/OiB1bmtub3duKTogVCB8IHZvaWQge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBSZWFkIGZyb20gY2hpbGQgc2lnbmFscyAtIHVzZSB0aGUgYWNjZXNzb3IgaXRzZWxmIGFzIHRoZSBjb250ZXh0XG4gICAgICByZXR1cm4gdW53cmFwKGFjY2Vzc29yKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGFyZyBhcyAoY3VycmVudDogVCkgPT4gVDtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHVud3JhcChhY2Nlc3NvcikgYXMgVDtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdXBkYXRlcihjdXJyZW50VmFsdWUpO1xuICAgICAgcmVjdXJzaXZlVXBkYXRlKGFjY2Vzc29yLCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERpcmVjdCBzZXRcbiAgICAgIHJlY3Vyc2l2ZVVwZGF0ZShhY2Nlc3NvciwgYXJnKTtcbiAgICB9XG4gIH0gYXMgTm9kZUFjY2Vzc29yPFQ+O1xuXG4gIChhY2Nlc3NvciBhcyBOb2RlQWNjZXNzb3I8VD4gJiBSZWNvcmQ8c3ltYm9sLCBib29sZWFuPilbXG4gICAgTk9ERV9BQ0NFU1NPUl9TWU1CT0xcbiAgXSA9IHRydWU7XG4gIHJldHVybiBhY2Nlc3Nvcjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgTm9kZUFjY2Vzc29yIGZvciB0aGUgcm9vdCB0cmVlIHRoYXQgbWFuYWdlcyBhIGJhY2tpbmcgc2lnbmFsXG4gKi9cbmZ1bmN0aW9uIG1ha2VSb290Tm9kZUFjY2Vzc29yPFQ+KFxuICByZWFkU2lnbmFsOiBTaWduYWw8VD4sXG4gIHdyaXRlU2lnbmFsOiBXcml0YWJsZVNpZ25hbDxUPlxuKTogTm9kZUFjY2Vzc29yPFQ+IHtcbiAgY29uc3QgYWNjZXNzb3IgPSBmdW5jdGlvbiAoYXJnPzogdW5rbm93bik6IFQgfCB2b2lkIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlYWRTaWduYWwoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGFyZyBhcyAoY3VycmVudDogVCkgPT4gVDtcbiAgICAgIHdyaXRlU2lnbmFsLnNldCh1cGRhdGVyKHJlYWRTaWduYWwoKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3cml0ZVNpZ25hbC5zZXQoYXJnIGFzIFQpO1xuICAgIH1cbiAgfSBhcyBOb2RlQWNjZXNzb3I8VD47XG5cbiAgKGFjY2Vzc29yIGFzIE5vZGVBY2Nlc3NvcjxUPiAmIFJlY29yZDxzeW1ib2wsIGJvb2xlYW4+KVtcbiAgICBOT0RFX0FDQ0VTU09SX1NZTUJPTFxuICBdID0gdHJ1ZTtcbiAgcmV0dXJuIGFjY2Vzc29yO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVVcGRhdGUodGFyZ2V0OiB1bmtub3duLCB1cGRhdGVzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmICghdXBkYXRlcyB8fCB0eXBlb2YgdXBkYXRlcyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgdGFyZ2V0T2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBIYW5kbGUgTm9kZUFjY2Vzc29yIChmdW5jdGlvbikgYXMgdGFyZ2V0XG4gIGlmIChpc05vZGVBY2Nlc3Nvcih0YXJnZXQpKSB7XG4gICAgdGFyZ2V0T2JqID0gdGFyZ2V0IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgdGFyZ2V0T2JqID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGVsc2Uge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZXNPYmogPSB1cGRhdGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXNPYmopIHtcbiAgICBpZiAoIShrZXkgaW4gdGFyZ2V0T2JqKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0UHJvcCA9IHRhcmdldE9ialtrZXldO1xuICAgIGNvbnN0IHVwZGF0ZVZhbHVlID0gdXBkYXRlc09ialtrZXldO1xuXG4gICAgaWYgKGlzU2lnbmFsKHRhcmdldFByb3ApKSB7XG4gICAgICAvLyBMZWFmIHNpZ25hbCAtIGNoZWNrIGlmIGl0J3Mgd3JpdGFibGVcbiAgICAgIGlmICgnc2V0JyBpbiB0YXJnZXRQcm9wICYmIHR5cGVvZiB0YXJnZXRQcm9wLnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAodGFyZ2V0UHJvcCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KHVwZGF0ZVZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTm9kZUFjY2Vzc29yKHRhcmdldFByb3ApKSB7XG4gICAgICAvLyBGb3IgbmVzdGVkIG9iamVjdHMsIGNoZWNrIGlmIHVwZGF0ZVZhbHVlIGlzIGFuIG9iamVjdCBmb3IgcmVjdXJzaXZlIHVwZGF0ZVxuICAgICAgaWYgKHVwZGF0ZVZhbHVlICYmIHR5cGVvZiB1cGRhdGVWYWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVjdXJzaXZlVXBkYXRlKHRhcmdldFByb3AsIHVwZGF0ZVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCB2YWx1ZSBhc3NpZ25tZW50XG4gICAgICAgIHRhcmdldFByb3AodXBkYXRlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGEgTm9kZUFjY2Vzc29yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVBY2Nlc3Nvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIE5vZGVBY2Nlc3Nvcjx1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmXG4gICAgdmFsdWUgJiZcbiAgICAodmFsdWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbTk9ERV9BQ0NFU1NPUl9TWU1CT0xdID09PSB0cnVlXG4gICk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQRVJGT1JNQU5DRSBIRVVSSVNUSUNTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBlc3RpbWF0ZU9iamVjdFNpemUoXG4gIG9iajogdW5rbm93bixcbiAgbWF4RGVwdGggPSBTSUdOQUxfVFJFRV9DT05TVEFOVFMuRVNUSU1BVEVfTUFYX0RFUFRILFxuICBjdXJyZW50RGVwdGggPSAwXG4pOiBudW1iZXIge1xuICBpZiAoY3VycmVudERlcHRoID49IG1heERlcHRoKSByZXR1cm4gMTtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JykgcmV0dXJuIDE7XG5cbiAgbGV0IHNpemUgPSAwO1xuXG4gIHRyeSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgc2l6ZSA9IG9iai5sZW5ndGg7XG4gICAgICBjb25zdCBzYW1wbGVTaXplID0gTWF0aC5taW4oXG4gICAgICAgIFNJR05BTF9UUkVFX0NPTlNUQU5UUy5FU1RJTUFURV9TQU1QTEVfU0laRV9BUlJBWSxcbiAgICAgICAgb2JqLmxlbmd0aFxuICAgICAgKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlU2l6ZTsgaSsrKSB7XG4gICAgICAgIHNpemUgKz0gZXN0aW1hdGVPYmplY3RTaXplKG9ialtpXSwgbWF4RGVwdGgsIGN1cnJlbnREZXB0aCArIDEpICogMC4xO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgIHNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSBNYXRoLm1pbihcbiAgICAgICAgU0lHTkFMX1RSRUVfQ09OU1RBTlRTLkVTVElNQVRFX1NBTVBMRV9TSVpFX09CSkVDVCxcbiAgICAgICAga2V5cy5sZW5ndGhcbiAgICAgICk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNhbXBsZVNpemU7IGkrKykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleXNbaV1dO1xuICAgICAgICBzaXplICs9IGVzdGltYXRlT2JqZWN0U2l6ZSh2YWx1ZSwgbWF4RGVwdGgsIGN1cnJlbnREZXB0aCArIDEpICogMC41O1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihzaXplKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTGF6eShcbiAgb2JqOiB1bmtub3duLFxuICBjb25maWc6IFRyZWVDb25maWcsXG4gIHByZWNvbXB1dGVkU2l6ZT86IG51bWJlclxuKTogYm9vbGVhbiB7XG4gIGlmIChjb25maWcudXNlTGF6eVNpZ25hbHMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNvbmZpZy51c2VMYXp5U2lnbmFscztcbiAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUgfHwgY29uZmlnLmVuYWJsZURldlRvb2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjb25maWcuYmF0Y2hVcGRhdGVzICYmIGNvbmZpZy51c2VNZW1vaXphdGlvbikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGVzdGltYXRlZFNpemUgPSBwcmVjb21wdXRlZFNpemUgPz8gZXN0aW1hdGVPYmplY3RTaXplKG9iaik7XG4gIHJldHVybiBlc3RpbWF0ZWRTaXplID4gU0lHTkFMX1RSRUVfQ09OU1RBTlRTLkxBWllfVEhSRVNIT0xEO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFcXVhbGl0eUZuKHVzZVNoYWxsb3dDb21wYXJpc29uOiBib29sZWFuKSB7XG4gIHJldHVybiB1c2VTaGFsbG93Q29tcGFyaXNvbiA/IE9iamVjdC5pcyA6IGVxdWFsO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU0lHTkFMIENSRUFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjcmVhdGVTaWduYWxTdG9yZTxUPihcbiAgb2JqOiBULFxuICBlcXVhbGl0eUZuOiAoYTogdW5rbm93biwgYjogdW5rbm93bikgPT4gYm9vbGVhblxuKTogRGVlcFNpZ25hbGlmeTxUPiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyB1bmtub3duIGFzIERlZXBTaWduYWxpZnk8VD47XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIHNpZ25hbChvYmosIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSkgYXMgdW5rbm93biBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG5cbiAgaWYgKGlzQnVpbHRJbk9iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIHNpZ25hbChvYmosIHsgZXF1YWw6IGVxdWFsaXR5Rm4gfSkgYXMgdW5rbm93biBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICB9XG5cbiAgY29uc3Qgc3RvcmU6IFBhcnRpYWw8RGVlcFNpZ25hbGlmeTxUPj4gPSB7fTtcbiAgY29uc3QgcHJvY2Vzc2VkT2JqZWN0cyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICBpZiAocHJvY2Vzc2VkT2JqZWN0cy5oYXMob2JqIGFzIG9iamVjdCkpIHtcbiAgICBjb25zb2xlLndhcm4oU0lHTkFMX1RSRUVfTUVTU0FHRVMuQ0lSQ1VMQVJfUkVGKTtcbiAgICByZXR1cm4gc2lnbmFsKG9iaiwgeyBlcXVhbDogZXF1YWxpdHlGbiB9KSBhcyB1bmtub3duIGFzIERlZXBTaWduYWxpZnk8VD47XG4gIH1cbiAgcHJvY2Vzc2VkT2JqZWN0cy5hZGQob2JqIGFzIG9iamVjdCk7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgICAoc3RvcmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgICBlcXVhbDogZXF1YWxpdHlGbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgICBlcXVhbDogZXF1YWxpdHlGbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc0J1aWx0SW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgICBlcXVhbDogZXF1YWxpdHlGbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOZXN0ZWQgb2JqZWN0IC0gY3JlYXRlIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmVcbiAgICAgICAgICBjb25zdCBicmFuY2ggPSBjcmVhdGVTaWduYWxTdG9yZSh2YWx1ZSwgZXF1YWxpdHlGbik7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBOb2RlQWNjZXNzb3IgZm9yIHRoaXMgbmVzdGVkIG9iamVjdCAobm8gYmFja2luZyBzaWduYWwpXG4gICAgICAgICAgY29uc3QgY2FsbGFibGVCcmFuY2ggPSBtYWtlTm9kZUFjY2Vzc29yPHR5cGVvZiB2YWx1ZT4oKTtcblxuICAgICAgICAgIC8vIENvcHkgYWxsIHRoZSBuZXN0ZWQgc2lnbmFsIHByb3BlcnRpZXMgb250byB0aGUgY2FsbGFibGUgYnJhbmNoXG4gICAgICAgICAgZm9yIChjb25zdCBicmFuY2hLZXkgaW4gYnJhbmNoKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGJyYW5jaCwgYnJhbmNoS2V5KSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYWxsYWJsZUJyYW5jaCwgYnJhbmNoS2V5LCB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZTogKGJyYW5jaCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYnJhbmNoS2V5XSxcbiAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgcHJvcGVydHkgY2FuJ3QgYmUgZGVmaW5lZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gY2FsbGFibGVCcmFuY2g7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtTSUdOQUxfVFJFRV9NRVNTQUdFUy5TSUdOQUxfQ1JFQVRJT05fRkFJTEVEfSBcIiR7a2V5fVwiOmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgKHN0b3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gc2lnbmFsKHZhbHVlLCB7XG4gICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgZm9yIChjb25zdCBzeW0gb2Ygc3ltYm9scykge1xuICAgICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtzeW1dO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChzdG9yZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbc3ltXSA9IHNpZ25hbCh2YWx1ZSwge1xuICAgICAgICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5TSUdOQUxfQ1JFQVRJT05fRkFJTEVELCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hbCBzdG9yZTogJHtcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcidcbiAgICAgIH1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzdG9yZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFJFRSBFTkhBTkNFTUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZW5oYW5jZVRyZWU8VD4oXG4gIHRyZWU6IFNpZ25hbFRyZWU8VD4sXG4gIGNvbmZpZzogVHJlZUNvbmZpZyA9IHt9XG4pOiBTaWduYWxUcmVlPFQ+IHtcbiAgY29uc3QgaXNMYXp5ID0gY29uZmlnLnVzZUxhenlTaWduYWxzID8/IHNob3VsZFVzZUxhenkodHJlZS5zdGF0ZSwgY29uZmlnKTtcblxuICAvLyB3aXRoKCkgZW5oYW5jZXIgY29tcG9zaXRpb25cbiAgdHJlZS53aXRoID0gKDxFIGV4dGVuZHMgQXJyYXk8RW5oYW5jZXJXaXRoTWV0YTx1bmtub3duLCB1bmtub3duPj4+KFxuICAgIC4uLmVuaGFuY2VyczogRVxuICApOiBDaGFpblJlc3VsdDxTaWduYWxUcmVlPFQ+LCBFPiA9PiB7XG4gICAgaWYgKGVuaGFuY2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cmVlIGFzIHVua25vd24gYXMgQ2hhaW5SZXN1bHQ8U2lnbmFsVHJlZTxUPiwgRT47XG4gICAgfVxuXG4gICAgY29uc3QgY29yZUNhcGFiaWxpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGlmIChjb25maWcuYmF0Y2hVcGRhdGVzKSBjb3JlQ2FwYWJpbGl0aWVzLmFkZCgnYmF0Y2hVcGRhdGUnKTtcbiAgICBpZiAoY29uZmlnLnVzZU1lbW9pemF0aW9uKSBjb3JlQ2FwYWJpbGl0aWVzLmFkZCgnbWVtb2l6ZScpO1xuICAgIGlmIChjb25maWcuZW5hYmxlVGltZVRyYXZlbCkgY29yZUNhcGFiaWxpdGllcy5hZGQoJ3VuZG8nKTtcbiAgICBpZiAoY29uZmlnLmVuYWJsZURldlRvb2xzKSBjb3JlQ2FwYWJpbGl0aWVzLmFkZCgnY29ubmVjdERldlRvb2xzJyk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModHJlZSkpIGNvcmVDYXBhYmlsaXRpZXMuYWRkKFN0cmluZyhrZXkpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yZSByZWZsZWN0aW9uIGlzc3Vlc1xuICAgIH1cblxuICAgIGNvbnN0IGhhc01ldGFkYXRhID0gZW5oYW5jZXJzLnNvbWUoKGUpID0+XG4gICAgICBCb29sZWFuKGUubWV0YWRhdGEgJiYgKGUubWV0YWRhdGEucmVxdWlyZXMgfHwgZS5tZXRhZGF0YS5wcm92aWRlcykpXG4gICAgKTtcblxuICAgIGxldCBvcmRlcmVkRW5oYW5jZXJzID0gZW5oYW5jZXJzIGFzIExvY2FsVW5rbm93bkVuaGFuY2VyW107XG5cbiAgICBpZiAoaGFzTWV0YWRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9yZGVyZWRFbmhhbmNlcnMgPSByZXNvbHZlRW5oYW5jZXJPcmRlcihcbiAgICAgICAgICBlbmhhbmNlcnMgYXMgTG9jYWxVbmtub3duRW5oYW5jZXJbXSxcbiAgICAgICAgICBjb3JlQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIGNvbmZpZy5kZWJ1Z01vZGVcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oU0lHTkFMX1RSRUVfTUVTU0FHRVMuRU5IQU5DRVJfT1JERVJfRkFJTEVELCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3ZpZGVkID0gbmV3IFNldDxzdHJpbmc+KGNvcmVDYXBhYmlsaXRpZXMpO1xuICAgIGxldCBjdXJyZW50VHJlZTogdW5rbm93biA9IHRyZWU7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyZWRFbmhhbmNlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVuaGFuY2VyID0gb3JkZXJlZEVuaGFuY2Vyc1tpXTtcblxuICAgICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgU0lHTkFMX1RSRUVfTUVTU0FHRVMuRU5IQU5DRVJfTk9UX0ZVTkNUSU9OLnJlcGxhY2UoJyVkJywgU3RyaW5nKGkpKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXFzID0gZW5oYW5jZXIubWV0YWRhdGE/LnJlcXVpcmVzID8/IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIHJlcXMpIHtcbiAgICAgICAgaWYgKCEociBpbiAoY3VycmVudFRyZWUgYXMgb2JqZWN0KSkgJiYgIXByb3ZpZGVkLmhhcyhyKSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbmhhbmNlci5tZXRhZGF0YT8ubmFtZSA/PyBgZW5oYW5jZXIjJHtpfWA7XG4gICAgICAgICAgY29uc3QgbXNnID0gU0lHTkFMX1RSRUVfTUVTU0FHRVMuRU5IQU5DRVJfUkVRVUlSRU1FTlRfTUlTU0lORy5yZXBsYWNlKFxuICAgICAgICAgICAgJyVzJyxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICApLnJlcGxhY2UoJyVzJywgcik7XG4gICAgICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5oYW5jZXIoY3VycmVudFRyZWUgYXMgdW5rbm93bik7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGN1cnJlbnRUcmVlKSBjdXJyZW50VHJlZSA9IHJlc3VsdDtcblxuICAgICAgICBjb25zdCBwcm92cyA9IGVuaGFuY2VyLm1ldGFkYXRhPy5wcm92aWRlcyA/PyBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHByb3ZzKSBwcm92aWRlZC5hZGQocCk7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUgJiYgcHJvdnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm92cykge1xuICAgICAgICAgICAgaWYgKCEocCBpbiAoY3VycmVudFRyZWUgYXMgb2JqZWN0KSkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIFNJR05BTF9UUkVFX01FU1NBR0VTLkVOSEFOQ0VSX1BST1ZJREVTX01JU1NJTkcucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICclcycsXG4gICAgICAgICAgICAgICAgICBlbmhhbmNlci5tZXRhZGF0YT8ubmFtZSA/PyBTdHJpbmcoaSlcbiAgICAgICAgICAgICAgICApLnJlcGxhY2UoJyVzJywgcClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBlbmhhbmNlci5tZXRhZGF0YT8ubmFtZSB8fCBgZW5oYW5jZXIgYXQgaW5kZXggJHtpfWA7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgU0lHTkFMX1RSRUVfTUVTU0FHRVMuRU5IQU5DRVJfRkFJTEVELnJlcGxhY2UoJyVzJywgbmFtZSksXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbU2lnbmFsVHJlZV0gRW5oYW5jZXIgc3RhY2sgdHJhY2U6JywgZW5oYW5jZXIpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaWduYWxUcmVlXSBUcmVlIHN0YXRlIGF0IGZhaWx1cmU6JywgY3VycmVudFRyZWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50VHJlZSBhcyBDaGFpblJlc3VsdDxTaWduYWxUcmVlPFQ+LCBFPjtcbiAgfSkgYXMgdW5rbm93biBhcyBXaXRoTWV0aG9kPFQ+O1xuXG4gIC8vIGRlc3Ryb3kgdW5jaGFuZ2VkXG4gIHRyZWUuZGVzdHJveSA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKGlzTGF6eSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRyZWUuc3RhdGUgYXMgdW5rbm93bjtcbiAgICAgICAgaWYgKHN0YXRlICYmIHR5cGVvZiBzdGF0ZSA9PT0gJ29iamVjdCcgJiYgJ19fY2xlYW51cF9fJyBpbiBzdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoc3RhdGUgYXMgeyBfX2NsZWFudXBfXzogdW5rbm93biB9KS5fX2NsZWFudXBfXztcbiAgICAgICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coU0lHTkFMX1RSRUVfTUVTU0FHRVMuVFJFRV9ERVNUUk9ZRUQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFNJR05BTF9UUkVFX01FU1NBR0VTLkNMRUFOVVBfRVJST1IsIGVycm9yKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gQWRkIHN0dWIgaW1wbGVtZW50YXRpb25zIGZvciBhZHZhbmNlZCBmZWF0dXJlc1xuICBhZGRTdHViTWV0aG9kcyh0cmVlLCBjb25maWcpO1xuXG4gIHJldHVybiB0cmVlO1xufVxuXG5mdW5jdGlvbiBhZGRTdHViTWV0aG9kczxUPih0cmVlOiBTaWduYWxUcmVlPFQ+LCBjb25maWc6IFRyZWVDb25maWcpOiB2b2lkIHtcbiAgdHJlZS5iYXRjaFVwZGF0ZSA9ICh1cGRhdGVyOiAoY3VycmVudDogVCkgPT4gUGFydGlhbDxUPikgPT4ge1xuICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5CQVRDSF9OT1RfRU5BQkxFRCk7XG4gICAgdHJlZSgoY3VycmVudDogVCkgPT4ge1xuICAgICAgY29uc3QgcGFydGlhbCA9IHVwZGF0ZXIoY3VycmVudCk7XG4gICAgICByZXR1cm4geyAuLi5jdXJyZW50LCAuLi5wYXJ0aWFsIH0gYXMgVDtcbiAgICB9KTtcbiAgfTtcblxuICB0cmVlLm1lbW9pemUgPSA8Uj4oZm46ICh0cmVlOiBUKSA9PiBSLCBjYWNoZUtleT86IHN0cmluZyk6IFNpZ25hbDxSPiA9PiB7XG4gICAgY29uc29sZS53YXJuKFNJR05BTF9UUkVFX01FU1NBR0VTLk1FTU9JWkVfTk9UX0VOQUJMRUQpO1xuICAgIHZvaWQgY2FjaGVLZXk7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGZuKHRyZWUoKSkpO1xuICB9O1xuXG4gIHRyZWUuZWZmZWN0ID0gKGZuOiAodHJlZTogVCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBlZmZlY3QoKCkgPT4gZm4odHJlZSgpKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5FRkZFQ1RfTk9fQ09OVEVYVCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0cmVlLnN1YnNjcmliZSA9IChmbjogKHRyZWU6IFQpID0+IHZvaWQpOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgICAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGVmZmVjdFJlZiA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICBmbih0cmVlKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XG4gICAgICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICAgIH07XG5cbiAgICAgIGRlc3Ryb3lSZWYub25EZXN0cm95KHVuc3Vic2NyaWJlKTtcbiAgICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFNJR05BTF9UUkVFX01FU1NBR0VTLlNVQlNDUklCRV9OT19DT05URVhULCBlcnJvcik7XG4gICAgICB9XG4gICAgICBmbih0cmVlKCkpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gTm8tb3BcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8vIFBlcmZvcm1hbmNlIHN0dWJzXG4gIHRyZWUub3B0aW1pemUgPSAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5PUFRJTUlaRV9OT1RfQVZBSUxBQkxFKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5jbGVhckNhY2hlID0gKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oU0lHTkFMX1RSRUVfTUVTU0FHRVMuQ0FDSEVfTk9UX0FWQUlMQUJMRSk7XG4gICAgfVxuICB9O1xuXG4gIHRyZWUuaW52YWxpZGF0ZVBhdHRlcm4gPSAoKTogbnVtYmVyID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFNJR05BTF9UUkVFX01FU1NBR0VTLlBFUkZPUk1BTkNFX05PVF9FTkFCTEVEKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH07XG5cbiAgdHJlZS5nZXRNZXRyaWNzID0gKCk6IFBlcmZvcm1hbmNlTWV0cmljcyA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICBjb21wdXRhdGlvbnM6IDAsXG4gICAgICBjYWNoZUhpdHM6IDAsXG4gICAgICBjYWNoZU1pc3NlczogMCxcbiAgICAgIGF2ZXJhZ2VVcGRhdGVUaW1lOiAwLFxuICAgIH07XG4gIH07XG5cbiAgLy8gTWlkZGxld2FyZSBzdHVic1xuICB0cmVlLmFkZFRhcCA9IChtaWRkbGV3YXJlOiBNaWRkbGV3YXJlPFQ+KSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5NSURETEVXQVJFX05PVF9BVkFJTEFCTEUpO1xuICAgIH1cbiAgICB2b2lkIG1pZGRsZXdhcmU7XG4gIH07XG5cbiAgdHJlZS5yZW1vdmVUYXAgPSAoaWQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChjb25maWcuZGVidWdNb2RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oU0lHTkFMX1RSRUVfTUVTU0FHRVMuTUlERExFV0FSRV9OT1RfQVZBSUxBQkxFKTtcbiAgICB9XG4gICAgdm9pZCBpZDtcbiAgfTtcblxuICAvLyBFbnRpdHkgaGVscGVycyBzdHViXG4gIHRyZWUuYXNDcnVkID0gPEUgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfT4oKTogRW50aXR5SGVscGVyczxFPiA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5FTlRJVFlfSEVMUEVSU19OT1RfQVZBSUxBQkxFKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9IGFzIEVudGl0eUhlbHBlcnM8RT47XG4gIH07XG5cbiAgLy8gQXN5bmMgYWN0aW9uIHN0dWJcbiAgdHJlZS5hc3luY0FjdGlvbiA9IDxUSW5wdXQsIFRSZXN1bHQ+KFxuICAgIG9wZXJhdGlvbjogKGlucHV0OiBUSW5wdXQpID0+IFByb21pc2U8VFJlc3VsdD4sXG4gICAgYXN5bmNDb25maWc6IEFzeW5jQWN0aW9uQ29uZmlnPFQsIFRSZXN1bHQ+ID0ge31cbiAgKTogQXN5bmNBY3Rpb248VElucHV0LCBUUmVzdWx0PiA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5BU1lOQ19BQ1RJT05TX05PVF9BVkFJTEFCTEUpO1xuICAgIH1cbiAgICB2b2lkIG9wZXJhdGlvbjtcbiAgICB2b2lkIGFzeW5jQ29uZmlnO1xuICAgIHJldHVybiB7fSBhcyBBc3luY0FjdGlvbjxUSW5wdXQsIFRSZXN1bHQ+O1xuICB9O1xuXG4gIC8vIFRpbWUgdHJhdmVsIHN0dWJzXG4gIHRyZWUudW5kbyA9ICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFNJR05BTF9UUkVFX01FU1NBR0VTLlRJTUVfVFJBVkVMX05PVF9BVkFJTEFCTEUpO1xuICAgIH1cbiAgfTtcblxuICB0cmVlLnJlZG8gPSAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5USU1FX1RSQVZFTF9OT1RfQVZBSUxBQkxFKTtcbiAgICB9XG4gIH07XG5cbiAgdHJlZS5nZXRIaXN0b3J5ID0gKCk6IFRpbWVUcmF2ZWxFbnRyeTxUPltdID0+IHtcbiAgICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgICAgY29uc29sZS53YXJuKFNJR05BTF9UUkVFX01FU1NBR0VTLlRJTUVfVFJBVkVMX05PVF9BVkFJTEFCTEUpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH07XG5cbiAgdHJlZS5yZXNldEhpc3RvcnkgPSAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZWJ1Z01vZGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5USU1FX1RSQVZFTF9OT1RfQVZBSUxBQkxFKTtcbiAgICB9XG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDT1JFIENSRUFUSU9OIEZVTkNUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBjcmVhdGU8VD4ob2JqOiBULCBjb25maWc6IFRyZWVDb25maWcgPSB7fSk6IFNpZ25hbFRyZWU8VD4ge1xuICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFNJR05BTF9UUkVFX01FU1NBR0VTLk5VTExfT1JfVU5ERUZJTkVEKTtcbiAgfVxuXG4gIGNvbnN0IGVzdGltYXRlZFNpemUgPSBlc3RpbWF0ZU9iamVjdFNpemUob2JqKTtcbiAgY29uc3QgZXF1YWxpdHlGbiA9IGNyZWF0ZUVxdWFsaXR5Rm4oY29uZmlnLnVzZVNoYWxsb3dDb21wYXJpc29uID8/IGZhbHNlKTtcblxuICAvLyBBUlJBWSBST09UIE1PREU6IGFycmF5cyBhcmUgdHJlYXRlZCBhcyBzaW5nbGUgc2lnbmFsc1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgY29uc3Qgc2lnbmFsU3RhdGUgPSBzaWduYWwob2JqIGFzIHVua25vd24gYXMgVCwge1xuICAgICAgZXF1YWw6IGVxdWFsaXR5Rm4sXG4gICAgfSkgYXMgV3JpdGFibGVTaWduYWw8VD47XG5cbiAgICBjb25zdCB0cmVlID0gbWFrZVJvb3ROb2RlQWNjZXNzb3IoXG4gICAgICBzaWduYWxTdGF0ZSxcbiAgICAgIHNpZ25hbFN0YXRlXG4gICAgKSBhcyBTaWduYWxUcmVlPFQ+O1xuXG4gICAgLy8gQWRkIHN0YXRlIGFuZCAkIHByb3BlcnRpZXMgdGhhdCByZWZlcmVuY2UgdGhlIHNpZ25hbCBpdHNlbGZcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJlZSwgJ3N0YXRlJywge1xuICAgICAgdmFsdWU6IHNpZ25hbFN0YXRlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyZWUsICckJywgeyB2YWx1ZTogc2lnbmFsU3RhdGUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuXG4gICAgZW5oYW5jZVRyZWUodHJlZSwgY29uZmlnKTtcbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGNvbnN0IHVzZUxhenkgPSBzaG91bGRVc2VMYXp5KG9iaiwgY29uZmlnLCBlc3RpbWF0ZWRTaXplKTtcblxuICBpZiAoY29uZmlnLmRlYnVnTW9kZSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgU0lHTkFMX1RSRUVfTUVTU0FHRVMuU1RSQVRFR1lfU0VMRUNUSU9OLnJlcGxhY2UoXG4gICAgICAgICclcycsXG4gICAgICAgIHVzZUxhenkgPyAnbGF6eScgOiAnZWFnZXInXG4gICAgICApLnJlcGxhY2UoJyVkJywgU3RyaW5nKGVzdGltYXRlZFNpemUpKVxuICAgICk7XG4gIH1cblxuICBsZXQgc2lnbmFsU3RhdGU6IERlZXBTaWduYWxpZnk8VD47XG5cbiAgdHJ5IHtcbiAgICBpZiAodXNlTGF6eSAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgc2lnbmFsU3RhdGUgPSBjcmVhdGVMYXp5U2lnbmFsVHJlZShcbiAgICAgICAgb2JqIGFzIG9iamVjdCxcbiAgICAgICAgZXF1YWxpdHlGblxuICAgICAgKSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduYWxTdGF0ZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKG9iaiwgZXF1YWxpdHlGbikgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHVzZUxhenkpIHtcbiAgICAgIGNvbnNvbGUud2FybihTSUdOQUxfVFJFRV9NRVNTQUdFUy5MQVpZX0ZBTExCQUNLLCBlcnJvcik7XG4gICAgICBzaWduYWxTdGF0ZSA9IGNyZWF0ZVNpZ25hbFN0b3JlKG9iaiwgZXF1YWxpdHlGbikgYXMgRGVlcFNpZ25hbGlmeTxUPjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGNhbGxhYmxlIHRyZWUgZnVuY3Rpb24gZm9yIHRoZSByb290XG4gIGNvbnN0IHRyZWUgPSBmdW5jdGlvbiAoYXJnPzogdW5rbm93bik6IFQgfCB2b2lkIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVud3JhcChzaWduYWxTdGF0ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB1cGRhdGVyID0gYXJnIGFzIChjdXJyZW50OiBUKSA9PiBUO1xuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdW53cmFwKHNpZ25hbFN0YXRlKTtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdXBkYXRlcihjdXJyZW50VmFsdWUpO1xuICAgICAgLy8gVXNlIHJlY3Vyc2l2ZSB1cGRhdGUgdG8gcHJlc2VydmUgc2lnbmFsc1xuICAgICAgcmVjdXJzaXZlVXBkYXRlKHNpZ25hbFN0YXRlLCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERpcmVjdCBzZXQgLSB1c2UgcmVjdXJzaXZlIHVwZGF0ZVxuICAgICAgcmVjdXJzaXZlVXBkYXRlKHNpZ25hbFN0YXRlLCBhcmcpO1xuICAgIH1cbiAgfSBhcyBTaWduYWxUcmVlPFQ+O1xuXG4gIC8vIE1hcmsgYXMgTm9kZUFjY2Vzc29yXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmVlLCBOT0RFX0FDQ0VTU09SX1NZTUJPTCwge1xuICAgIHZhbHVlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcblxuICAvLyBBZGQgc3RhdGUgYW5kICQgcHJvcGVydGllcyBmaXJzdCAodGhlc2UgYXJlIHNhZmUpXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmVlLCAnc3RhdGUnLCB7XG4gICAgdmFsdWU6IHNpZ25hbFN0YXRlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyZWUsICckJywgeyB2YWx1ZTogc2lnbmFsU3RhdGUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuXG4gIC8vIEVuaGFuY2UgdHJlZSB3aXRoIG1ldGhvZHNcbiAgZW5oYW5jZVRyZWUodHJlZSwgY29uZmlnKTtcblxuICAvLyBBdHRhY2ggc2lnbmFsIHN0YXRlIHByb3BlcnRpZXMgdG8gdGhlIHRyZWUgQUZURVIgZW5oYW5jZW1lbnRcbiAgLy8gVGhpcyBwcmV2ZW50cyBjb25mbGljdHMgd2l0aCBidWlsdC1pbiBtZXRob2RzXG4gIGZvciAoY29uc3Qga2V5IGluIHNpZ25hbFN0YXRlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzaWduYWxTdGF0ZSwga2V5KSkge1xuICAgICAgLy8gU2tpcCBpZiB0aGUgcHJvcGVydHkgYWxyZWFkeSBleGlzdHMgKGZyb20gZW5oYW5jZW1lbnQpXG4gICAgICBpZiAoIShrZXkgaW4gdHJlZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJlZSwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogKHNpZ25hbFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gU2tpcCBpZiBwcm9wZXJ0eSBjYW4ndCBiZSBkZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJlZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBSRVNFVCBDT05GSUdVUkFUSU9OU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgcHJlc2V0Q29uZmlnczogUmVjb3JkPFRyZWVQcmVzZXQsIFBhcnRpYWw8VHJlZUNvbmZpZz4+ID0ge1xuICBiYXNpYzoge1xuICAgIHVzZUxhenlTaWduYWxzOiBmYWxzZSxcbiAgICBkZWJ1Z01vZGU6IGZhbHNlLFxuICB9LFxuICBwZXJmb3JtYW5jZToge1xuICAgIHVzZUxhenlTaWduYWxzOiB0cnVlLFxuICAgIGJhdGNoVXBkYXRlczogdHJ1ZSxcbiAgICB1c2VNZW1vaXphdGlvbjogdHJ1ZSxcbiAgICB1c2VTaGFsbG93Q29tcGFyaXNvbjogdHJ1ZSxcbiAgfSxcbiAgZGV2ZWxvcG1lbnQ6IHtcbiAgICB1c2VMYXp5U2lnbmFsczogZmFsc2UsXG4gICAgZGVidWdNb2RlOiB0cnVlLFxuICAgIGVuYWJsZURldlRvb2xzOiB0cnVlLFxuICAgIHRyYWNrUGVyZm9ybWFuY2U6IHRydWUsXG4gIH0sXG4gIHByb2R1Y3Rpb246IHtcbiAgICB1c2VMYXp5U2lnbmFsczogdHJ1ZSxcbiAgICBiYXRjaFVwZGF0ZXM6IHRydWUsXG4gICAgdXNlTWVtb2l6YXRpb246IHRydWUsXG4gICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgfSxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQVUJMSUMgQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihvYmo6IFQpOiBTaWduYWxUcmVlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4ob2JqOiBULCBwcmVzZXQ6IFRyZWVQcmVzZXQpOiBTaWduYWxUcmVlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4ob2JqOiBULCBjb25maWc6IFRyZWVDb25maWcpOiBTaWduYWxUcmVlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgb2JqOiBSZXF1aXJlZDxUPixcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxSZXF1aXJlZDxUPj47XG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsVHJlZTxUPihcbiAgb2JqOiBULFxuICBjb25maWdPclByZXNldD86IFRyZWVDb25maWcgfCBUcmVlUHJlc2V0XG4pOiBTaWduYWxUcmVlPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFRyZWU8VD4oXG4gIG9iajogVCxcbiAgY29uZmlnT3JQcmVzZXQ/OiBUcmVlQ29uZmlnIHwgVHJlZVByZXNldFxuKTogU2lnbmFsVHJlZTxUPiB7XG4gIGlmICh0eXBlb2YgY29uZmlnT3JQcmVzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29uZmlnID0gcHJlc2V0Q29uZmlnc1tjb25maWdPclByZXNldF07XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgU0lHTkFMX1RSRUVfTUVTU0FHRVMuUFJFU0VUX1VOS05PV04ucmVwbGFjZSgnJXMnLCBjb25maWdPclByZXNldClcbiAgICAgICk7XG4gICAgICByZXR1cm4gY3JlYXRlKG9iaiwge30pO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlKG9iaiwgY29uZmlnKTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ09yUHJlc2V0IHx8IHt9O1xuICByZXR1cm4gY3JlYXRlKG9iaiwgY29uZmlnKTtcbn1cblxuLyoqXG4gKiBUeXBlZCBoZWxwZXIgdG8gYXBwbHkgYSBzaW5nbGUgZW5oYW5jZXIgdG8gYSB0cmVlIHdoZW4gYC53aXRoYCBpbmZlcmVuY2VcbiAqIHByb2R1Y2VzIGB1bmtub3duYC4gVGhpcyBpcyBhIHByYWdtYXRpYyBlc2NhcGUgaGF0Y2ggZm9yIHRlc3RzIGFuZFxuICogbWlncmF0aW9uIHVudGlsIGAud2l0aGAgb3ZlcmxvYWRzIGFyZSBzaW1wbGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFbmhhbmNlcjxULCBPPihcbiAgdHJlZTogU2lnbmFsVHJlZTxUPixcbiAgZW5oYW5jZXI6IEVuaGFuY2VyV2l0aE1ldGE8U2lnbmFsVHJlZTxUPiwgTz5cbik6IE8ge1xuICByZXR1cm4gZW5oYW5jZXIodHJlZSkgYXMgTztcbn1cbiJdfQ=="],"names":["isNodeAccessor"],"mappings":"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"}
|