@but212/atom-effect-jquery 0.26.0 → 0.28.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 +2 -2
- package/dist/atom-effect-jquery.min.js +2 -2
- package/dist/atom-effect-jquery.min.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +35 -206
- package/dist/index.mjs +1304 -1232
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atom-effect-jquery.min.js","names":["$"],"sources":["../../core/dist/index.mjs","../src/utils/index.ts","../src/constants.ts","../src/utils/debug.ts","../src/core/lens.ts","../src/core/namespace.ts","../src/utils/array-pool.ts","../src/utils/object-pool.ts","../src/internal/pool.ts","../src/core/registry.ts","../src/core/jquery-patch.ts","../src/types.ts","../src/bindings/input-binding.ts","../src/core/effect-factory.ts","../src/utils/sanitize.ts","../src/bindings/unified.ts","../src/bindings/form.ts","../src/bindings/chainable.ts","../src/bindings/list.ts","../src/bindings/mount.ts","../src/features/route.ts","../src/features/fetch.ts","../src/index.ts"],"sourcesContent":["var y = {\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}, c = {\n DISPOSED: 1,\n EXECUTING: 8\n}, B = {\n DISPOSED: 1,\n IS_COMPUTED: 2,\n DIRTY: 8,\n IDLE: 16,\n PENDING: 32,\n RESOLVED: 64,\n REJECTED: 128,\n RECOMPUTING: 256,\n HAS_ERROR: 512,\n FORCE_COMPUTE: 1024\n}, a = {\n DISPOSED: 1,\n SYNC: 8,\n NOTIFICATION_SCHEDULED: 16\n}, I = {\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}, tt = {\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3\n}, $ = {\n MAX_ASYNC_RETRIES: 3,\n MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1\n}, p = {\n UNINITIALIZED: -1,\n MIN: 1\n}, st = 1073741823, j = { VERSION_BITS: 16 }, Ct = (typeof process < \"u\" && process.env, !1), q = Object.freeze([]), x = class {\n constructor(t, s, e = void 0) {\n this.node = t, this.version = s, this.unsub = e;\n }\n}, ut = class {\n constructor(t, s) {\n this.fn = t, this.sub = s;\n }\n notify(t, s) {\n this.fn ? this.fn(t, s) : this.sub && this.sub.execute();\n }\n}, T = class extends Error {\n constructor(t, s = null, e = !0) {\n super(t), this.cause = s, this.recoverable = e, this.name = \"AtomError\";\n }\n}, v = class extends T {\n constructor(t, s = null) {\n super(t, s, !0), this.name = \"ComputedError\";\n }\n}, D = class extends T {\n constructor(t, s = null) {\n super(t, s, !1), this.name = \"EffectError\";\n }\n}, R = class extends T {\n constructor(t, s = null) {\n super(t, s, !1), this.name = \"SchedulerError\";\n }\n}, h = {\n COMPUTED_MUST_BE_FUNCTION: \"Computed target must be a function\",\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: \"Async computation pending with no default value\",\n COMPUTED_COMPUTATION_FAILED: \"Computation execution failed\",\n COMPUTED_ASYNC_COMPUTATION_FAILED: \"Async computation execution failed\",\n COMPUTED_CIRCULAR_DEPENDENCY: \"Circular dependency detected\",\n COMPUTED_DISPOSED: \"Attempted to access disposed computed\",\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\n EFFECT_MUST_BE_FUNCTION: \"Effect target must be a function\",\n EFFECT_EXECUTION_FAILED: \"Effect execution failed\",\n EFFECT_CLEANUP_FAILED: \"Effect cleanup failed\",\n EFFECT_DISPOSED: \"Attempted to run disposed effect\",\n SCHEDULER_FLUSH_OVERFLOW: (t, s) => `Maximum flush iterations (${t}) exceeded. ${s} jobs dropped. Possible infinite loop.`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\n EFFECT_FREQUENCY_LIMIT_EXCEEDED: \"Effect executed too frequently within 1 second. Suspected infinite loop.\",\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: \"Scheduler callback must be a function\",\n SCHEDULER_END_BATCH_WITHOUT_START: \"endBatch() called without matching startBatch(). Ignoring.\",\n BATCH_CALLBACK_MUST_BE_FUNCTION: \"Batch callback must be a function\"\n}, et = class {\n constructor() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._overflow = null, this._freeIndices = null;\n }\n get size() {\n return this._count;\n }\n getAt(t) {\n switch (t) {\n case 0:\n return this._s0;\n case 1:\n return this._s1;\n case 2:\n return this._s2;\n case 3:\n return this._s3;\n default: {\n const s = this._overflow;\n if (s !== null && t >= 4) {\n const e = t - 4;\n if (e < s.length) return s[e] ?? null;\n }\n return null;\n }\n }\n }\n setAt(t, s) {\n switch (t) {\n case 0:\n this._s0 = s;\n break;\n case 1:\n this._s1 = s;\n break;\n case 2:\n this._s2 = s;\n break;\n case 3:\n this._s3 = s;\n break;\n default: {\n this._overflow ??= [];\n const e = this._overflow;\n e[t - 4] = s;\n }\n }\n t >= this._count && (this._count = t + 1);\n }\n truncateFrom(t) {\n const s = this._count;\n if (t >= s) return;\n if (t <= 3) switch (t) {\n case 0: {\n const i = this._s0;\n i != null && (this._onItemRemoved(i), this._s0 = null);\n }\n case 1: {\n const i = this._s1;\n i != null && (this._onItemRemoved(i), this._s1 = null);\n }\n case 2: {\n const i = this._s2;\n i != null && (this._onItemRemoved(i), this._s2 = null);\n }\n case 3: {\n const i = this._s3;\n i != null && (this._onItemRemoved(i), this._s3 = null);\n }\n }\n const e = this._overflow;\n if (e !== null && s > 4) {\n const i = t > 4 ? t - 4 : 0, n = e.length;\n for (let o = i; o < n; o++) {\n const r = e[o];\n r != null && (this._onItemRemoved(r), e[o] = null);\n }\n t <= 4 ? (e.length = 0, this._overflow = null) : e.length = t - 4;\n }\n this._freeIndices !== null && (this._freeIndices = null), this._count = t;\n }\n _onItemRemoved(t) {\n }\n add(t) {\n if (this._s0 === null) {\n this._s0 = t, this._count++;\n return;\n }\n if (this._s1 === null) {\n this._s1 = t, this._count++;\n return;\n }\n if (this._s2 === null) {\n this._s2 = t, this._count++;\n return;\n }\n if (this._s3 === null) {\n this._s3 = t, this._count++;\n return;\n }\n this._addToOverflow(t);\n }\n _addToOverflow(t) {\n if (this._overflow === null) this._overflow = [t];\n else {\n const s = this._freeIndices;\n s !== null && s.length > 0 ? this._overflow[s.pop()] = t : this._overflow.push(t);\n }\n this._count++;\n }\n remove(t) {\n if (this._s0 === t)\n return this._s0 = null, this._count--, !0;\n if (this._s1 === t)\n return this._s1 = null, this._count--, !0;\n if (this._s2 === t)\n return this._s2 = null, this._count--, !0;\n if (this._s3 === t)\n return this._s3 = null, this._count--, !0;\n const s = this._overflow;\n if (s == null) return !1;\n for (let e = 0, i = s.length; e < i; e++) if (s[e] === t)\n return s[e] = null, this._count--, this._freeIndices === null && (this._freeIndices = []), this._freeIndices.push(e), !0;\n return !1;\n }\n has(t) {\n if (this._count === 0) return !1;\n if (this._s0 === t || this._s1 === t || this._s2 === t || this._s3 === t) return !0;\n const s = this._overflow;\n if (s != null) {\n for (let e = 0, i = s.length; e < i; e++) if (s[e] === t) return !0;\n }\n return !1;\n }\n forEach(t) {\n if (this._count === 0) return;\n const s = this._s0;\n s != null && t(s);\n const e = this._s1;\n e != null && t(e);\n const i = this._s2;\n i != null && t(i);\n const n = this._s3;\n n != null && t(n);\n const o = this._overflow;\n if (o != null) for (let r = 0, u = o.length; r < u; r++) {\n const l = o[r];\n l != null && t(l);\n }\n }\n forEachIndexed(t) {\n const s = this._count;\n if (s === 0) return 0;\n let e = 0;\n const i = this._s0;\n i != null && (t(i), e++);\n const n = this._s1;\n n != null && (t(n), e++);\n const o = this._s2;\n o != null && (t(o), e++);\n const r = this._s3;\n if (r != null && (t(r), e++), e === s) return e;\n const u = this._overflow;\n if (u != null) for (let l = 0, O = u.length; l < O; l++) {\n const Y = u[l];\n Y != null && (t(Y), e++);\n }\n return e;\n }\n compact() {\n const t = this._overflow;\n if (t === null || t.length === 0) return;\n let s = 0;\n for (; s < t.length; ) if (t[s] === null) {\n for (; t.length > s && t[t.length - 1] === null; ) t.pop();\n t.length > s && (t[s] = t.pop(), s++);\n } else s++;\n this._freeIndices = null, t.length === 0 && (this._overflow = null);\n }\n clear() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._overflow !== null && (this._overflow.length = 0, this._overflow = null), this._freeIndices = null;\n }\n dispose() {\n this.clear();\n }\n}, W = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), lt = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), K = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), b = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), G = {\n enabled: !1,\n warnInfiniteLoop: tt.WARN_INFINITE_LOOP,\n warn(t, s) {\n },\n attachDebugInfo(t, s, e) {\n },\n getDebugName: (t) => t?.[W],\n getDebugType: (t) => t?.[K]\n}, _t = 1, ct = () => _t++;\nfunction g(t, s, e) {\n if (t instanceof T) return t;\n const i = t instanceof Error, n = i ? t.message : String(t), o = i ? t : void 0;\n return new s(`${i ? t.constructor.name : \"Unexpected error\"} (${e}): ${n}`, o);\n}\nvar X = class {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = p.UNINITIALIZED, this._notifying = 0, this._hotIndex = -1, this._slots = null, this._deps = null, this.id = ct() & st;\n }\n subscribe(t) {\n const s = typeof t == \"function\";\n if (!s && (!t || typeof t.execute != \"function\")) throw g(/* @__PURE__ */ new TypeError(\"Invalid subscriber\"), T, h.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n let e = this._slots;\n e || (e = new et(), this._slots = e);\n let i = !1;\n if (e.forEach((o) => {\n (s ? o.fn === t : o.sub === t) && (i = !0);\n }), i)\n return () => {\n };\n const n = new ut(s ? t : void 0, s ? void 0 : t);\n return e.add(n), () => this._unsubscribe(n);\n }\n _unsubscribe(t) {\n if (this._slots) {\n if (this._notifying > 0) {\n this._slots.remove(t);\n return;\n }\n this._slots.remove(t), this._slots.compact();\n }\n }\n subscriberCount() {\n return this._slots ? this._slots.size : 0;\n }\n _notifySubscribers(t, s) {\n const e = this._slots;\n if (!(!e || e.size === 0)) {\n this._notifying++;\n try {\n e.forEach((i) => {\n try {\n i.notify(t, s);\n } catch (n) {\n console.error(g(n, T, h.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n });\n } finally {\n this._notifying--, this._notifying === 0 && e.compact();\n }\n }\n }\n _isDirty() {\n const t = this._deps;\n if (!t || t.size === 0) return !1;\n if (this._hotIndex !== -1) {\n const s = t.getAt(this._hotIndex);\n if (s != null && s.node.version !== s.version) return !0;\n }\n return !t.hasComputeds && !t.isDirtyFast() ? !1 : this._deepDirtyCheck();\n }\n}, U = 0, k = () => (U = U + 1 & 1073741823 || 1, U), H = (t) => t + 1 & 1073741823 || 1, V = 0, F = !1, it = 0, nt = () => it;\nfunction Z() {\n return F ? !1 : (F = !0, it = k(), V = 0, !0);\n}\nvar J = () => {\n F = !1;\n}, ft = () => {\n if (!F) return 0;\n const t = ++V;\n if (t > I.MAX_EXECUTIONS_PER_FLUSH) throw new Error(`[atom-effect] Infinite loop detected: flush execution count exceeded ${I.MAX_EXECUTIONS_PER_FLUSH}`);\n return t;\n}, w = /* @__PURE__ */ (function(t) {\n return t[t.IDLE = 0] = \"IDLE\", t[t.BATCHING = 1] = \"BATCHING\", t[t.FLUSHING = 2] = \"FLUSHING\", t;\n})({}), at = class {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isBatching = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = I.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get phase() {\n return this._isProcessing || this._isFlushingSync ? w.FLUSHING : this._isBatching ? w.BATCHING : w.IDLE;\n }\n get queueSize() {\n return this._size;\n }\n get isBatching() {\n return this._isBatching;\n }\n schedule(t) {\n if (t._nextEpoch !== this._epoch) {\n if (t._nextEpoch = this._epoch, this._isBatching || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n this._queueBuffer[this._bufferIndex][this._size++] = t, this._isProcessing || this._flush();\n }\n }\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n _runLoop() {\n try {\n if (this._size === 0) return;\n const t = Z();\n this._drainQueue(), t && J();\n } finally {\n this._isProcessing = !1, this._size > 0 && !this._isBatching && this._flush();\n }\n }\n _flushSync() {\n this._isFlushingSync = !0;\n const t = Z();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = !1, t && J();\n }\n }\n _mergeBatchQueue() {\n if (this._batchQueueSize === 0) return;\n const t = ++this._epoch, s = this._batchQueue, e = this._queueBuffer[this._bufferIndex];\n let i = this._size;\n for (let n = 0; n < this._batchQueueSize; n++) {\n const o = s[n];\n o._nextEpoch !== t && (o._nextEpoch = t, e[i++] = o);\n }\n this._size = i, this._batchQueueSize = 0, s.length = 0;\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._processQueue(), this._mergeBatchQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, s = this._queueBuffer[t], e = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch++;\n for (let i = 0; i < e; i++) try {\n const n = s[i];\n typeof n == \"function\" ? n() : n.execute();\n } catch (n) {\n console.error(new R(\"Error occurred during scheduler execution\", n));\n }\n s.length = 0;\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize;\n if (console.error(new R(h.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, t))), this._size = 0, this._queueBuffer[this._bufferIndex].length = 0, this._batchQueueSize = 0, this.onOverflow) try {\n this.onOverflow(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++, this._isBatching = !0;\n }\n endBatch() {\n this._batchDepth !== 0 && --this._batchDepth === 0 && (this._flushSync(), this._isBatching = !1);\n }\n setMaxFlushIterations(t) {\n if (t < I.MIN_FLUSH_ITERATIONS) throw new R(`Max flush iterations must be at least ${I.MIN_FLUSH_ITERATIONS}`);\n this._maxFlushIterations = t;\n }\n}, A = new at(), Q = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), rt = /* @__PURE__ */ Symbol.for(\"atom-effect/computed\"), ot = /* @__PURE__ */ Symbol.for(\"atom-effect/effect\"), Et = /* @__PURE__ */ Symbol.for(\"atom-effect/writable\"), _ = {\n current: null,\n run(t, s) {\n const e = this.current;\n this.current = t;\n try {\n return s();\n } finally {\n this.current = e;\n }\n }\n};\nfunction Dt(t) {\n const s = _.current;\n if (s === null) return t();\n _.current = null;\n try {\n return t();\n } finally {\n _.current = s;\n }\n}\nvar dt = class extends X {\n constructor(t, s) {\n super(), this[Q] = !0, this[Et] = !0, this._value = t, this._pendingOldValue = void 0, s && (this.flags |= a.SYNC), G.attachDebugInfo(this, \"atom\", this.id);\n }\n get value() {\n const t = _.current;\n return t?.addDependency(this), this._value;\n }\n set value(t) {\n const s = this._value;\n if (Object.is(s, t)) return;\n this._value = t, this.version = H(this.version);\n const e = this._slots, i = this.flags;\n if (e == null || e.size === 0 || i & a.NOTIFICATION_SCHEDULED) return;\n this._pendingOldValue = s;\n const n = i | a.NOTIFICATION_SCHEDULED;\n if (this.flags = n, (n & a.SYNC) !== 0 && !A.isBatching) {\n this._flushNotifications();\n return;\n }\n A.schedule(this);\n }\n execute() {\n this._flushNotifications();\n }\n _flushNotifications() {\n const t = this.flags;\n if (!(t & a.NOTIFICATION_SCHEDULED) || t & a.DISPOSED) return;\n const s = this._pendingOldValue;\n this._pendingOldValue = void 0, this.flags &= ~a.NOTIFICATION_SCHEDULED, this._notifySubscribers(this._value, s);\n }\n peek() {\n return this._value;\n }\n dispose() {\n this.flags & a.DISPOSED || (this._slots?.clear(), this.flags |= a.DISPOSED, this._value = void 0, this._pendingOldValue = void 0);\n }\n _deepDirtyCheck() {\n return !1;\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n};\nfunction vt(t, s = {}) {\n return new dt(t, s.sync ?? !1);\n}\nvar z = class extends et {\n constructor() {\n super(), this._map = null, this._SCAN_THRESHOLD = 32, this.hasComputeds = !1, this._depsHash = 0, this._map = null, this.hasComputeds = !1, this._depsHash = 0;\n }\n prepareTracking() {\n this.hasComputeds = !1;\n }\n _onItemRemoved(t) {\n const s = t.unsub;\n s && s();\n }\n claimExisting(t, s) {\n const e = this._count;\n if (s >= e) return !1;\n const i = e - s;\n if (this._map !== null || i > this._SCAN_THRESHOLD) return this._claimViaMap(t, s);\n if (s < 4) switch (s) {\n case 0: {\n const r = this._s0;\n if (r && r.node === t && r.unsub)\n return r.version = t.version, !0;\n }\n case 1:\n if (e > 1) {\n const r = this._s1;\n if (r && r.node === t && r.unsub)\n return r.version = t.version, s !== 1 && (this._s1 = this._s0, this._s0 = r), !0;\n }\n case 2:\n if (e > 2) {\n const r = this._s2;\n if (r && r.node === t && r.unsub) {\n if (r.version = t.version, s !== 2) {\n const u = s === 0 ? this._s0 : this._s1;\n s === 0 ? this._s0 = r : this._s1 = r, this._s2 = u;\n }\n return !0;\n }\n }\n case 3:\n if (e > 3) {\n const r = this._s3;\n if (r && r.node === t && r.unsub) {\n if (r.version = t.version, s !== 3) {\n let u;\n s === 0 ? (u = this._s0, this._s0 = r) : s === 1 ? (u = this._s1, this._s1 = r) : (u = this._s2, this._s2 = r), this._s3 = u;\n }\n return !0;\n }\n }\n }\n const n = s > 4 ? s : 4, o = this._overflow;\n if (o) for (let r = n - 4, u = o.length; r < u; r++) {\n const l = o[r];\n if (l && l.node === t && l.unsub)\n return l.version = t.version, this._swapGeneral(r + 4, s, l), !0;\n }\n return !1;\n }\n _claimViaMap(t, s) {\n if (this._map === null) {\n this._map = /* @__PURE__ */ new Map();\n const n = this._count;\n s < 4 && (s <= 0 && this._s0?.unsub && this._map.set(this._s0.node, 0), s <= 1 && this._s1?.unsub && this._map.set(this._s1.node, 1), s <= 2 && this._s2?.unsub && this._map.set(this._s2.node, 2), s <= 3 && this._s3?.unsub && this._map.set(this._s3.node, 3));\n const o = this._overflow;\n if (o && n > 4) {\n const r = s > 4 ? s : 4;\n for (let u = r - 4, l = o.length; u < l; u++) {\n const O = o[u];\n O?.unsub && this._map.set(O.node, u + 4);\n }\n }\n }\n const e = this._map.get(t);\n if (e === void 0 || e < s) return !1;\n const i = this.getAt(e);\n if (i == null || !i.unsub) return !1;\n if (i.version = t.version, e !== s) {\n const n = this.getAt(s);\n this.setAt(s, i), this.setAt(e, n), n?.unsub && this._map.set(n.node, e), this._map.set(t, s);\n }\n return !0;\n }\n _swapGeneral(t, s, e) {\n if (t === s) return;\n const i = this.getAt(s);\n if (this.setAt(s, e), t === 0) this._s0 = i;\n else if (t === 1) this._s1 = i;\n else if (t === 2) this._s2 = i;\n else if (t === 3) this._s3 = i;\n else {\n const n = this._overflow;\n n[t - 4] = i;\n }\n }\n insertNew(t, s) {\n const e = this._count;\n if (t < e) {\n const i = this.getAt(t);\n i != null && (this._addToOverflow(i), this._map !== null && i.unsub && this._map.set(i.node, this._count - 1));\n }\n if (t === 0) this._s0 = s;\n else if (t === 1) this._s1 = s;\n else if (t === 2) this._s2 = s;\n else if (t === 3) this._s3 = s;\n else {\n let i = this._overflow;\n i || (i = [], this._overflow = i), i[t - 4] = s;\n }\n t >= e && (this._count = t + 1);\n }\n truncateFrom(t) {\n t >= this._count || (super.truncateFrom(t), this._map !== null && (this._map.clear(), this._map = null));\n }\n seal() {\n const t = this._count;\n if (t === 0) {\n this._depsHash = 0;\n return;\n }\n const s = j.VERSION_BITS;\n let e = 0;\n if (t >= 1) {\n const i = this._s0;\n e = e + (i.version << s) + i.node.id | 0;\n }\n if (t >= 2) {\n const i = this._s1;\n e = e + (i.version << s) + i.node.id | 0;\n }\n if (t >= 3) {\n const i = this._s2;\n e = e + (i.version << s) + i.node.id | 0;\n }\n if (t >= 4) {\n const i = this._s3;\n e = e + (i.version << s) + i.node.id | 0;\n }\n if (t > 4) {\n const i = this._overflow;\n for (let n = 0, o = i.length; n < o; n++) {\n const r = i[n];\n e = e + (r.version << s) + r.node.id | 0;\n }\n }\n this._depsHash = e;\n }\n isDirtyFast() {\n const t = this._count;\n if (t === 0) return !1;\n const s = j.VERSION_BITS;\n let e = 0;\n if (t >= 1) {\n const i = this._s0.node;\n e = e + (i.version << s) + i.id | 0;\n }\n if (t >= 2) {\n const i = this._s1.node;\n e = e + (i.version << s) + i.id | 0;\n }\n if (t >= 3) {\n const i = this._s2.node;\n e = e + (i.version << s) + i.id | 0;\n }\n if (t >= 4) {\n const i = this._s3.node;\n e = e + (i.version << s) + i.id | 0;\n }\n if (t > 4) {\n const i = this._overflow;\n for (let n = 0, o = i.length; n < o; n++) {\n const r = i[n].node;\n e = e + (r.version << s) + r.id | 0;\n }\n }\n return e !== this._depsHash;\n }\n disposeAll() {\n this._count > 0 && this.truncateFrom(0), this.hasComputeds = !1, this._map !== null && (this._map.clear(), this._map = null);\n }\n remove(t) {\n throw new Error(\"remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.\");\n }\n compact() {\n }\n};\nfunction St(t) {\n return t !== null && typeof t == \"object\" && Q in t;\n}\nfunction gt(t) {\n return t !== null && typeof t == \"object\" && rt in t;\n}\nfunction Tt(t) {\n return t !== null && typeof t == \"object\" && ot in t;\n}\nfunction ht(t) {\n return t !== null && typeof t == \"object\" && typeof t.then == \"function\";\n}\nvar { IDLE: d, DIRTY: f, PENDING: S, RESOLVED: E, REJECTED: C, HAS_ERROR: m, RECOMPUTING: N, DISPOSED: L, IS_COMPUTED: M, FORCE_COMPUTE: P } = B, pt = class extends X {\n constructor(t, s = {}) {\n if (typeof t != \"function\") throw new v(h.COMPUTED_MUST_BE_FUNCTION);\n if (super(), this[Q] = !0, this[rt] = !0, this._error = null, this._promiseId = 0, this._deps = new z(), this._asyncRetryCount = 0, this._lastDriftEpoch = p.UNINITIALIZED, this._trackEpoch = p.UNINITIALIZED, this._trackCount = 0, this._value = void 0, this.flags = M | f | d, this._equal = s.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in s ? s.defaultValue : b, this._onError = s.onError ?? null, this._maxAsyncRetries = (s.maxAsyncRetries ?? $.MAX_ASYNC_RETRIES) & st, G.attachDebugInfo(this, \"computed\", this.id), s.lazy === !1) try {\n this._recompute();\n } catch {\n }\n }\n _track() {\n _.current?.addDependency(this);\n }\n get value() {\n this._track();\n const t = this.flags;\n if ((t & (E | f | d)) === E) return this._value;\n if (t & L) throw new v(h.COMPUTED_DISPOSED);\n if (t & N) {\n if (this._defaultValue !== b) return this._defaultValue;\n throw new v(h.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if (t & (f | d) && ((t & d) === 0 && (t & P) === 0 && this._deps.size > 0 && !this._isDirty() ? this.flags &= ~f : this._recompute(), this.flags & E))\n return this._value;\n const s = this._defaultValue, e = s !== b;\n if (this.flags & S) {\n if (e) return s;\n throw new v(h.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if (this.flags & C) {\n if (e) return s;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n this._track();\n const t = this.flags;\n return t & E ? y.RESOLVED : t & S ? y.PENDING : t & C ? y.REJECTED : y.IDLE;\n }\n get hasError() {\n if (this._track(), this.flags & (C | m)) return !0;\n const t = this._deps;\n if (!t.hasComputeds) return !1;\n const s = t.size;\n for (let e = 0; e < s; e++) {\n const i = t.getAt(e);\n if (i != null && i.node.flags & m) return !0;\n }\n return !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n this._track();\n const t = [];\n this._error && t.push(this._error);\n const s = this._deps;\n if (!s.hasComputeds) return t.length === 0 ? q : Object.freeze(t);\n const e = s.size;\n for (let i = 0; i < e; i++) {\n const n = s.getAt(i);\n if (n == null) continue;\n const o = n.node;\n o.flags & m && this._collectErrorsFromDep(o, t);\n }\n return t.length === 0 ? q : Object.freeze(t);\n }\n _collectErrorsFromDep(t, s) {\n const e = t.errors, i = e.length;\n for (let n = 0; n < i; n++) {\n const o = e[n];\n o != null && !s.includes(o) && s.push(o);\n }\n }\n get lastError() {\n return this._track(), this._error;\n }\n get isPending() {\n return this._track(), (this.flags & S) !== 0;\n }\n get isResolved() {\n return this._track(), (this.flags & E) !== 0;\n }\n invalidate() {\n this.flags |= P, this._markDirty();\n }\n dispose() {\n this.flags & L || (this._deps.disposeAll(), this._slots?.clear(), this.flags = L | f | d, this._error = null, this._value = void 0, this._hotIndex = -1);\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n if (t._lastSeenEpoch === this._trackEpoch) return;\n t._lastSeenEpoch = this._trackEpoch;\n const s = this._trackCount, e = this._deps.getAt(s);\n if (e != null && e.node === t) e.version = t.version;\n else if (!this._deps.claimExisting(t, s)) {\n const i = new x(t, t.version, t.subscribe(this));\n this._deps.insertNew(s, i);\n }\n t.flags & M && (this._deps.hasComputeds = !0), this._trackCount = s + 1;\n }\n _recompute() {\n if (this.flags & N) return;\n this.flags = (this.flags | N) & ~P, this._trackEpoch = k(), this._trackCount = 0, this._deps.prepareTracking(), this._hotIndex = -1;\n let t = !1;\n try {\n const s = _.run(this, this._fn);\n this._deps.truncateFrom(this._trackCount), this._deps.seal(), t = !0, ht(s) ? this._handleAsyncComputation(s) : this._finalizeResolution(s);\n } catch (s) {\n if (!t) try {\n this._deps.truncateFrom(this._trackCount);\n } catch {\n }\n this._handleError(s, h.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n this._trackEpoch = p.UNINITIALIZED, this._trackCount = 0, this.flags &= ~N;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | S) & ~(d | f | E | C), this._notifySubscribers(void 0, void 0), this._asyncRetryCount = 0, this._promiseId = (this._promiseId + 1) % $.MAX_PROMISE_ID;\n const s = this._promiseId;\n t.then((e) => {\n if (s === this._promiseId) {\n if (this._isDirty()) {\n const i = nt();\n return this._lastDriftEpoch !== i && (this._lastDriftEpoch = i, this._asyncRetryCount = 0), this._asyncRetryCount++ < this._maxAsyncRetries ? this._markDirty() : this._handleError(new v(`Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`), h.COMPUTED_ASYNC_COMPUTATION_FAILED);\n }\n this._finalizeResolution(e), this._notifySubscribers(e, void 0);\n }\n }, (e) => s === this._promiseId && this._handleError(e, h.COMPUTED_ASYNC_COMPUTATION_FAILED));\n }\n _handleError(t, s, e = !1) {\n const i = g(t, v, s);\n if (!e && !(this.flags & C) && (this.version = H(this.version)), this._error = i, this.flags = this.flags & ~(d | f | S | E) | C | m, this._onError) try {\n this._onError(i);\n } catch (n) {\n console.error(h.CALLBACK_ERROR_IN_ERROR_HANDLER, n);\n }\n if (e) throw i;\n this._notifySubscribers(void 0, void 0);\n }\n _finalizeResolution(t) {\n (!(this.flags & E) || !this._equal(this._value, t)) && (this.version = H(this.version)), this._value = t, this._error = null, this.flags = (this.flags | E) & ~(d | f | S | C | m);\n }\n execute() {\n this._markDirty();\n }\n _markDirty() {\n this.flags & (N | f) || (this.flags |= f, this._notifySubscribers(void 0, void 0));\n }\n _isDirty() {\n const t = this._deps;\n return t.hasComputeds ? this._deepDirtyCheck() : t.isDirtyFast();\n }\n _deepDirtyCheck() {\n const t = this._deps, s = _.current;\n _.current = null;\n try {\n const e = t.size;\n for (let i = 0; i < e; i++) {\n const n = t.getAt(i);\n if (n == null) continue;\n const o = n.node;\n if (o.flags & M) try {\n o.value;\n } catch {\n }\n if (o.version !== n.version)\n return this._hotIndex = i, !0;\n }\n return this._hotIndex = -1, !1;\n } finally {\n _.current = s;\n }\n }\n};\nfunction mt(t, s = {}) {\n return new pt(t, s);\n}\nvar It = class extends X {\n constructor(t, s = {}) {\n super(), this[ot] = !0, this._cleanup = null, this._deps = new z(), this._currentEpoch = p.UNINITIALIZED, this._lastFlushEpoch = p.UNINITIALIZED, this._fn = t, this._onError = s.onError ?? null, this._sync = s.sync ?? !1, this._maxExecutions = s.maxExecutionsPerSecond ?? I.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = s.maxExecutionsPerFlush ?? I.MAX_EXECUTIONS_PER_EFFECT, this._cleanup = null, this._deps = new z(), this._currentEpoch = p.UNINITIALIZED, this._lastFlushEpoch = p.UNINITIALIZED, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._trackCount = 0, this._sync ? this._notifyCallback = () => this.execute() : this._notifyCallback = () => A.schedule(this), G.attachDebugInfo(this, \"effect\", this.id);\n }\n run() {\n if (this.flags & c.DISPOSED) throw new D(h.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.flags & c.DISPOSED || (this.flags |= c.DISPOSED, this._execCleanup(), this._deps?.disposeAll());\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n if (!(this.flags & c.EXECUTING)) return;\n const s = this._currentEpoch;\n if (t._lastSeenEpoch === s) return;\n t._lastSeenEpoch = s;\n const e = this._trackCount, i = this._deps;\n let n;\n e === 0 ? n = i._s0 : e === 1 ? n = i._s1 : e === 2 ? n = i._s2 : e === 3 ? n = i._s3 : n = i.getAt(e), n != null && n.node === t ? n.version = t.version : i.claimExisting(t, e) || this._insertNewDependency(t, e), t.flags & B.IS_COMPUTED && (i.hasComputeds = !0), this._trackCount = e + 1;\n }\n _insertNewDependency(t, s) {\n let e;\n try {\n const i = t.subscribe(this._notifyCallback);\n e = new x(t, t.version, i);\n } catch (i) {\n const n = g(i, D, h.EFFECT_EXECUTION_FAILED);\n if (console.error(n), this._onError) try {\n this._onError(n);\n } catch {\n }\n e = new x(t, t.version, void 0);\n }\n this._deps.insertNew(s, e);\n }\n execute(t = !1) {\n if (this.flags & (c.DISPOSED | c.EXECUTING)) return;\n const s = this._deps;\n if (!t && s.size > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), this.flags |= c.EXECUTING, this._execCleanup(), this._currentEpoch = k(), this._trackCount = 0, s.prepareTracking(), this._hotIndex = -1;\n let e = !1;\n try {\n const i = _.run(this, this._fn);\n s.truncateFrom(this._trackCount), s.seal(), e = !0, ht(i) ? this._handleAsyncResult(i) : this._cleanup = typeof i == \"function\" ? i : null;\n } catch (i) {\n if (!e) try {\n s.truncateFrom(this._trackCount);\n } catch {\n }\n this._handleExecutionError(i), this._cleanup = null;\n } finally {\n this.flags &= ~c.EXECUTING;\n }\n }\n _isDirty() {\n const t = this._deps;\n return t.hasComputeds ? this._deepDirtyCheck() : t.isDirtyFast();\n }\n _handleAsyncResult(t) {\n const s = ++this._execId;\n t.then((e) => {\n if (s !== this._execId || this.flags & c.DISPOSED) {\n if (typeof e == \"function\") try {\n e();\n } catch (i) {\n this._handleExecutionError(i, h.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof e == \"function\" && (this._cleanup = e);\n }, (e) => s === this._execId && this._handleExecutionError(e));\n }\n _deepDirtyCheck() {\n const t = _.current;\n _.current = null;\n const s = this._deps;\n try {\n const e = s.size;\n for (let i = 0; i < e; i++) {\n const n = s.getAt(i);\n if (n == null) continue;\n const o = n.node;\n if (o.flags & B.IS_COMPUTED && this._tryPullComputed(o), o.version !== n.version)\n return this._hotIndex = i, !0;\n }\n return !1;\n } finally {\n _.current = t;\n }\n }\n _tryPullComputed(t) {\n try {\n t.value;\n } catch {\n }\n }\n _execCleanup() {\n if (this._cleanup) {\n try {\n this._cleanup();\n } catch (t) {\n this._handleExecutionError(t, h.EFFECT_CLEANUP_FAILED);\n }\n this._cleanup = null;\n }\n }\n _checkInfiniteLoops() {\n const t = nt();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), ft() > I.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++;\n }\n _checkFrequencyLimit() {\n if (!Number.isFinite(this._maxExecutions)) return;\n const t = Date.now();\n if (t - this._windowStart >= tt.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = t, this._windowCount = 1;\n return;\n }\n if (++this._windowCount > this._maxExecutions) {\n const s = new D(h.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n throw this.dispose(), this._handleExecutionError(s), s;\n }\n }\n get isDisposed() {\n return (this.flags & c.DISPOSED) !== 0;\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & c.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const s = new D(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${V}`);\n throw this.dispose(), console.error(s), s;\n }\n _handleExecutionError(t, s = h.EFFECT_EXECUTION_FAILED) {\n const e = g(t, D, s);\n if (console.error(e), this._onError) try {\n this._onError(e);\n } catch (i) {\n console.error(g(i, D, h.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Nt(t, s = {}) {\n if (typeof t != \"function\") throw new D(h.EFFECT_MUST_BE_FUNCTION);\n const e = new It(t, s);\n return e.execute(), e;\n}\nfunction At(t) {\n if (typeof t != \"function\") throw new TypeError(h.BATCH_CALLBACK_MUST_BE_FUNCTION);\n A.startBatch();\n try {\n return t();\n } finally {\n A.endBatch();\n }\n}\nexport {\n y as AsyncState,\n T as AtomError,\n v as ComputedError,\n tt as DEBUG_CONFIG,\n G as DEBUG_RUNTIME,\n D as EffectError,\n I as SCHEDULER_CONFIG,\n R as SchedulerError,\n vt as atom,\n At as batch,\n mt as computed,\n Nt as effect,\n St as isAtom,\n gt as isComputed,\n Tt as isEffect,\n A as scheduler,\n Dt as untracked\n};\n\n//# sourceMappingURL=index.mjs.map","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { isAtom } from '@but212/atom-effect';\nimport type { RenderRoute, RouteDefinition, TemplateRoute } from '@/types';\n\n// ============================================================================\n// Reactive helpers\n// ============================================================================\n\n/**\n * Checks if a given value is a reactive node (Atom or Computed).\n *\n * `isAtom` returns `true` for both plain atoms and computed atoms because\n * `ComputedAtomImpl` carries `ATOM_BRAND` in addition to `COMPUTED_BRAND`.\n * A separate `isComputed` check would therefore be redundant.\n */\nexport function isReactive(value: unknown): value is ReadonlyAtom<unknown> {\n return isAtom(value);\n}\n\n/**\n * Checks if a value is a Promise (thenable).\n */\nexport function isPromise<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === 'function';\n}\n\n// ============================================================================\n// DOM helpers\n// ============================================================================\n\n/**\n * Generates a CSS selector-like string for a DOM element, suitable for debug\n * output. Returns `tagName#id` when an id is present, otherwise\n * `tagName.class1.class2…`.\n *\n * ⚠ Not a valid CSS selector — do NOT pass this to `querySelector()`.\n * Element IDs and class names may contain characters with special meaning in\n * CSS selectors (e.g. `.`, `[`, `(`). This helper is intended solely for\n * human-readable console/log messages.\n */\nexport function getSelector(el: Element): string {\n const tagName = el.tagName.toLowerCase();\n if (el.id) return `${tagName}#${el.id}`;\n\n const list = el.classList;\n const len = list.length;\n if (len === 0) return tagName;\n\n let selector = tagName;\n for (let i = 0; i < len; i++) {\n selector += `.${list[i]!}`;\n }\n return selector;\n}\n\n// ============================================================================\n// Shared low-level helpers\n// ============================================================================\n\n/** Portable own-property check. Prefer over `in` to exclude prototype keys. */\nexport const hasOwn = Object.prototype.hasOwnProperty;\n\n// ============================================================================\n// Route type guards\n// ============================================================================\n\n/** Narrows a `RouteDefinition` to `TemplateRoute`. */\nexport function isTemplateRoute(r: RouteDefinition): r is TemplateRoute {\n return typeof (r as TemplateRoute).template === 'string';\n}\n\n/** Narrows a `RouteDefinition` to `RenderRoute`. */\nexport function isRenderRoute(r: RouteDefinition): r is RenderRoute {\n return typeof (r as RenderRoute).render === 'function';\n}\n\n// ============================================================================\n// General utilities\n// ============================================================================\n\n/**\n * Shallow equality check for plain objects.\n * Returns `true` if both objects have the same own keys with identical (`===`) values.\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i]!;\n if (!hasOwn.call(objB, key) || objA[key] !== objB[key]) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Constants for atom-effect-jquery\n */\n\nimport type { RouteConfig } from '@/types';\n\n// ============================================================================\n// Log Prefixes\n// ============================================================================\n\n/**\n * Log prefixes keyed by subsystem.\n * Each prefix names the specific subsystem that emitted the message so that\n * console output is unambiguous regardless of which binding triggered it.\n */\nexport const LOG_PREFIXES = {\n /** Used by the SPA router ($.route). */\n ROUTE: '[atom-route]',\n /** Used by all reactive binding helpers (bindText, bindCss, bindAttr, …). */\n BINDING: '[atom-binding]',\n /** Used by atomList reactive list rendering. */\n LIST: '[atom-list]',\n /** Used by mount/unmount lifecycle helpers. */\n MOUNT: '[atom-mount]',\n} as const;\n\n// ============================================================================\n// Route Defaults\n// ============================================================================\n\n/**\n * Subset of RouteConfig fields that have default values.\n * Extracted as a named type so the annotation on ROUTE_DEFAULTS stays concise.\n */\ntype RouteDefaults = Readonly<\n Required<Pick<RouteConfig, 'mode' | 'basePath' | 'autoBindLinks' | 'activeClass'>>\n>;\n\n/**\n * Default values for RouteConfig optional fields.\n */\nexport const ROUTE_DEFAULTS: RouteDefaults = Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n});\n\n// ============================================================================\n// Input & Binding Defaults\n// ============================================================================\n\n/**\n * Default values for input binding options.\n */\nexport const INPUT_DEFAULTS = {\n /** Default DOM event to trigger synchronization. */\n EVENT: 'input',\n /** Default debounce delay in milliseconds. */\n DEBOUNCE: 0,\n} as const;\n\n// ============================================================================\n// Debug Defaults\n// ============================================================================\n\n/**\n * Default values for debug mode.\n */\nexport const DEBUG_DEFAULTS = {\n /** Default duration in ms for visual highlighting during DOM updates. */\n HIGHLIGHT_DURATION_MS: 500,\n} as const;\n\n// ============================================================================\n// Security-Sensitive DOM Elements & Properties\n// ============================================================================\n\n/**\n * Valid input-like tag names for val binding.\n * Internal comparisons MUST use `.toLowerCase()` on the element's tagName.\n */\nexport const VALID_INPUT_TAGS: ReadonlySet<string> = new Set(['input', 'select', 'textarea']);\n\n/**\n * DOM properties that carry URL values.\n *\n * Even when using `bindProp` (Property binding) instead of `bindAttr` (Attribute\n * binding), these properties must be guarded for dangerous protocols\n * (e.g. `javascript:`) to prevent bypasses.\n */\nexport const URL_PROPS: ReadonlySet<string> = new Set([\n 'src',\n 'href',\n 'action',\n 'formaction',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'xlink:href',\n]);\n\n/**\n * DOM properties blocked by `bindProp` to prevent HTML injection and\n * prototype pollution attacks.\n *\n * ⚠ Note: `on*` event handler properties are blocked by logic in `bindProp`,\n * not by this static list, to cover all possible event types (onclick, etc.).\n */\nexport const DANGEROUS_PROPS: ReadonlySet<string> = new Set([\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n// ============================================================================\n// Error & Warning Messages\n// ============================================================================\n\n/**\n * Canonical error and warning messages for all subsystems.\n *\n * Every entry is a function providing consistent caller-side context.\n */\nexport const ERROR_MESSAGES = {\n ROUTE: {\n NOT_FOUND: (name: string) => `Route \"${name}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (selector: string) => `Template \"${selector}\" not found`,\n TARGET_NOT_FOUND: (selector: string) => `Target element \"${selector}\" not found`,\n MALFORMED_URI: (raw: string) => `Malformed URI component: ${raw}`,\n },\n SECURITY: {\n /** Emitted when sanitizeHtml modifies the input. */\n UNSAFE_CONTENT: () => 'Unsafe content neutralized during sanitization.',\n /** Emitted when a CSS style property value contains a dangerous protocol. */\n BLOCKED_CSS_VALUE: (prop: string) => `Blocked dangerous value in CSS style property \"${prop}\".`,\n BLOCKED_EVENT_HANDLER: (name: string) =>\n `Blocked setting dangerous event handler attribute/property \"${name}\".`,\n BLOCKED_PROTOCOL: (name: string) => `Blocked dangerous protocol in \"${name}\".`,\n BLOCKED_PROP: (name: string) =>\n `Blocked setting dangerous property \"${name}\". Use html binding for sanitized HTML.`,\n },\n BINDING: {\n INVALID_INPUT_ELEMENT: (tagName: string) =>\n `Val binding used on non-input element <${tagName}>.`,\n MISSING_SOURCE: (method: string) =>\n `[${method}] source is required when prop/name is a string.`,\n MISSING_CONDITION: (method: string) =>\n `[${method}] condition is required when className is a string.`,\n UPDATER_ERROR: (debugType: string, isStatic?: boolean) =>\n `Updater threw in binding \"${debugType}\"${isStatic ? ' (static)' : ''}`,\n CLEANUP_ERROR: (info?: string) => `Binding cleanup error${info ? `: ${info}` : ''}`,\n PARSE_ERROR: (details?: string) =>\n `parse() threw during DOM→Atom sync${details ? `: ${details}` : ''}`,\n },\n LIST: {\n DUPLICATE_KEY: (key: string | number, index: number, container: string) =>\n `Duplicate key \"${key}\" at index ${index} in atomList <${container}>.`,\n },\n MOUNT: {\n ERROR: (name?: string) => `Mount error${name ? ` in component <${name}>` : ''}`,\n CLEANUP_ERROR: (name?: string) => `Cleanup error${name ? ` in component <${name}>` : ''}`,\n },\n CORE: {\n EFFECT_DISPOSE_ERROR: (info?: string) => `Effect dispose error${info ? `: ${info}` : ''}`,\n },\n} as const;\n","/**\n * Debug Mode\n *\n * When $.atom.debug = true is enabled:\n * 1. Logs state changes to the console.\n * 2. Visually highlights DOM updates (red border flash).\n *\n * Debug mode can be enabled in two ways:\n * 1. Build-time: VITE_ATOM_DEBUG=true (opt-in via env var)\n * 2. Runtime: $.atom.debug = true or window.__ATOM_DEBUG__ = true\n *\n * NOTE: debug mode is NOT enabled automatically in DEV builds to avoid\n * polluting the console without explicit opt-in.\n */\n\nimport { DEBUG_DEFAULTS } from '@/constants';\nimport { getSelector } from '@/utils';\n\n// ============================================================================\n// Timing constants — HIGHLIGHT_TRANSITION is derived from HIGHLIGHT_DEFAULTS\n// so the two values stay in sync automatically.\n// ============================================================================\n\n/** CSS transition duration derived from DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS. */\nconst HIGHLIGHT_TRANSITION = `${DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS / 1000}s`;\n\n// ============================================================================\n// Initial state\n// ============================================================================\n\n/**\n * Determines the initial debug state.\n * Priority: window.__ATOM_DEBUG__ > explicit VITE_ATOM_DEBUG env var.\n * DEV mode alone does NOT enable debug to avoid silent console pollution.\n */\nfunction getInitialDebugState(): boolean {\n if (typeof window !== 'undefined') {\n const flag = (window as Window & { __ATOM_DEBUG__?: boolean }).__ATOM_DEBUG__;\n if (typeof flag === 'boolean') return flag;\n }\n\n // Vite inlines import.meta.env at build time; guard for non-Vite environments.\n // We also check for process.env as a fallback for other build tools.\n try {\n if (import.meta.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {\n /* ignore if import.meta is unavailable */\n }\n\n try {\n // Cast globalThis to include optional process.env for environment detection\n const env = (\n globalThis as typeof globalThis & {\n process?: { env?: Record<string, string | undefined> };\n }\n ).process?.env;\n\n if (env?.VITE_ATOM_DEBUG === 'true') {\n return true;\n }\n } catch {\n /* ignore */\n }\n\n return false;\n}\n\nlet debugEnabled = getInitialDebugState();\n\n// ============================================================================\n// Debug object\n// ============================================================================\n\nexport const debug = {\n get enabled() {\n // Check global flag at runtime to allow dynamic toggling via console.\n if (typeof window !== 'undefined') {\n const globalFlag = (window as Window & { __ATOM_DEBUG__?: boolean }).__ATOM_DEBUG__;\n if (typeof globalFlag === 'boolean') return globalFlag;\n }\n return debugEnabled;\n },\n set enabled(value: boolean) {\n debugEnabled = value;\n },\n\n /**\n * Logs a message only when debug mode is active.\n */\n log(prefix: string, ...args: unknown[]) {\n if (this.enabled) {\n console.log(`${prefix}`, ...args);\n }\n },\n\n /**\n * Logs an atom value change only when debug mode is active.\n */\n atomChanged(prefix: string, name: string | undefined, oldVal: unknown, newVal: unknown) {\n if (this.enabled) {\n console.log(`${prefix} Atom \"${name ?? 'anonymous'}\" changed:`, oldVal, '→', newVal);\n }\n },\n\n /**\n * Logs a DOM update and triggers a visual highlight flash.\n */\n domUpdated(prefix: string, target: Element | JQuery<Element>, type: string, value: unknown) {\n if (!this.enabled) return;\n\n const el: Element | undefined =\n target instanceof Element ? target : (target[0] as Element | undefined);\n\n // SVG elements also support classList, so we relax the check to Element.\n if (!el) return;\n\n console.log(`${prefix} DOM updated: ${getSelector(el)}.${type} =`, value);\n highlightElement(el);\n },\n\n /**\n * Logs a cleanup event only when debug mode is active.\n */\n cleanup(prefix: string, selector: string) {\n if (this.enabled) {\n console.log(`${prefix} Cleanup: ${selector}`);\n }\n },\n\n /**\n * Unconditional warning for runtime errors.\n */\n warn(prefix: string, message: string, ...rest: unknown[]) {\n console.warn(`${prefix} ${message}`, ...rest);\n },\n\n /**\n * Unconditional error for binding failures.\n */\n error(prefix: string, message: string, cause: unknown) {\n console.error(`${prefix} ${message}`, cause);\n },\n};\n\n// ============================================================================\n// Visual highlight\n// ============================================================================\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight';\nconst HIGHLIGHT_STYLE_ATTR = 'data-atom-debug';\n\n/**\n * Injects the highlight CSS once per document lifetime.\n * Uses a WeakRef with a plain fallback to handle both test resets and old environments.\n */\nlet highlightStyleRef: WeakRef<HTMLStyleElement> | HTMLStyleElement | undefined;\nfunction injectHighlightStyle(): void {\n const current =\n highlightStyleRef instanceof HTMLStyleElement ? highlightStyleRef : highlightStyleRef?.deref();\n\n if (current?.isConnected) return;\n\n // Final guard: check if the style already exists in the document (e.g. from a previous session)\n if (document.querySelector(`style[${HIGHLIGHT_STYLE_ATTR}]`)) return;\n\n const style = document.createElement('style');\n style.setAttribute(HIGHLIGHT_STYLE_ATTR, '');\n style.textContent =\n `.${HIGHLIGHT_CLASS}{` +\n `outline:2px solid rgba(255,68,68,0.8);` +\n `outline-offset:1px;` +\n `transition:outline ${HIGHLIGHT_TRANSITION} ease-out` +\n `}`;\n document.head.appendChild(style);\n\n // Use WeakRef only if available (ES2021)\n if (typeof WeakRef !== 'undefined') {\n highlightStyleRef = new WeakRef(style);\n } else {\n highlightStyleRef = style;\n }\n}\n\n// Tracks pending operations per element.\nconst highlightTimers = new WeakMap<Element, ReturnType<typeof setTimeout>>();\nconst highlightRafs = new WeakMap<Element, ReturnType<typeof requestAnimationFrame>>();\n\n/**\n * Flashes a red outline on an element to indicate a reactive DOM update.\n * Supports both HTML and SVG elements via classList manipulation.\n */\nfunction highlightElement(el: Element): void {\n // Re-check debug state and connection.\n if (!debug.enabled || !el.isConnected) return;\n\n injectHighlightStyle();\n\n // Cancel any pending rAF.\n const existingRaf = highlightRafs.get(el);\n if (existingRaf !== undefined) {\n cancelAnimationFrame(existingRaf);\n }\n\n // Cancel any pending timeout.\n const existingTimer = highlightTimers.get(el);\n if (existingTimer !== undefined) {\n clearTimeout(existingTimer);\n }\n\n const rafId = requestAnimationFrame(() => {\n highlightRafs.delete(el);\n\n // Re-verify connection inside rAF as the node might have been removed\n // between the scheduling and execution of the frame.\n if (!el.isConnected) return;\n\n el.classList.add(HIGHLIGHT_CLASS);\n\n highlightTimers.set(\n el,\n setTimeout(() => {\n // Re-verify connection again before trying to remove class.\n if (el.isConnected) {\n el.classList.remove(HIGHLIGHT_CLASS);\n }\n highlightTimers.delete(el);\n }, DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS)\n );\n });\n\n highlightRafs.set(el, rafId);\n}\n","import type { Paths, PathValue, WritableAtom } from '@/types';\n\n// Note: atom-effect brands are based on Symbol.for, which works across realms\n// and library copies. This allows the lens to behave as a first-class atom\n// to any consumer using the core's branding checks.\nconst ATOM_BRAND = Symbol.for('atom-effect/atom');\nconst WRITABLE_BRAND = Symbol.for('atom-effect/writable');\n\n/**\n * Internal recursive helper for creating deep immutable copies with structural sharing.\n * Only clones nodes along the path where changes occur.\n *\n * @internal\n */\nexport function setDeepValue(obj: unknown, keys: string[], index: number, value: unknown): unknown {\n if (index === keys.length) return value;\n\n const key = keys[index]!;\n const currentLevel = obj && typeof obj === 'object' ? obj : {};\n const oldValue = (currentLevel as Record<string, unknown>)[key];\n\n const newValue = setDeepValue(oldValue, keys, index + 1, value);\n\n // Structural Sharing: If the value didn't change, return the original object\n // to avoid unnecessary allocations and downstream effect triggers.\n if (Object.is(oldValue, newValue)) return obj;\n\n if (Array.isArray(currentLevel)) {\n const newArray = [...currentLevel];\n const idx = Number.parseInt(key, 10);\n if (!Number.isNaN(idx)) {\n newArray[idx] = newValue;\n } else {\n (newArray as unknown as Record<string, unknown>)[key] = newValue;\n }\n return newArray;\n }\n return { ...currentLevel, [key]: newValue };\n}\n\n/**\n * Helper to retrieve a nested value from an object/array at a given path.\n *\n * @param source The source object.\n * @param parts Array of path parts.\n * @returns The value at the path or undefined if not found.\n */\nexport function getPathValue(source: unknown, parts: string[]): unknown {\n let result = source;\n for (let i = 0, len = parts.length; i < len && result != null; i++) {\n result = (result as Record<string, unknown>)[parts[i]!];\n }\n return result;\n}\n\n/**\n * Creates a two-way \"lens\" for a specific property path on an object-based atom.\n * Optimized for performance using structural sharing and equality guards.\n *\n * This \"fake\" atom allows fine-grained binding to deep properties of a\n * monolithic state atom without extra memory or complex computed logic.\n *\n * @param atom The source atom containing the object.\n * @param path Dot-separated path to the property (e.g. 'user.profile.name').\n * @returns A WritableAtom that reads from and writes to the specified path.\n */\nexport function atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n): WritableAtom<PathValue<T, P>> {\n const parts = path.includes('.') ? path.split('.') : [path];\n const unsubscribers = new Set<() => void>();\n\n const dispose = () => {\n for (const unsub of unsubscribers) {\n unsub();\n }\n unsubscribers.clear();\n };\n\n return {\n get value() {\n return getPathValue(atom.value, parts) as PathValue<T, P>;\n },\n set value(newVal: PathValue<T, P>) {\n const current = atom.peek();\n const next = setDeepValue(current, parts, 0, newVal);\n\n // Only write back to the atom if a change actually occurred.\n if (next !== current) {\n atom.value = next as T;\n }\n },\n peek() {\n return getPathValue(atom.peek(), parts) as PathValue<T, P>;\n },\n subscribe(listener: (newValue: PathValue<T, P>, oldValue: PathValue<T, P>) => void) {\n const unsub = atom.subscribe((newParent, oldParent) => {\n const newValue = getPathValue(newParent, parts) as PathValue<T, P>;\n const oldValue = getPathValue(oldParent, parts) as PathValue<T, P>;\n if (!Object.is(newValue, oldValue)) {\n listener(newValue, oldValue);\n }\n });\n\n unsubscribers.add(unsub);\n return () => {\n unsub();\n unsubscribers.delete(unsub);\n };\n },\n subscriberCount() {\n return unsubscribers.size;\n },\n dispose,\n [Symbol.dispose]: dispose,\n [ATOM_BRAND]: true,\n [WRITABLE_BRAND]: true,\n } as unknown as WritableAtom<PathValue<T, P>>;\n}\n\n/**\n * Composes an existing lens with a sub-path to create a deeper lens.\n *\n * @param lens The parent lens.\n * @param path Sub-path relative to the parent lens.\n * @returns A new lens pointing to the deeper path.\n */\nexport function composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n): WritableAtom<PathValue<T, P>> {\n return atomLens(lens, path);\n}\n\n/**\n * Creates a lens factory bound to a specific atom.\n * Eliminates the need to pass the atom reference on every call.\n *\n * @example\n * const lens = lensFor(userAtom);\n * const email = lens('settings.notifications.email'); // WritableAtom<boolean>\n */\nexport function lensFor<T extends object>(atom: WritableAtom<T>) {\n return <P extends Paths<T>>(path: P) => atomLens(atom, path);\n}\n","import {\n batch,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { AtomOptions, WritableAtom } from '@/types';\n// isReactive is defined in utils.ts because core's isAtom already covers computed\n// atoms (ComputedAtom carries ATOM_BRAND), making a separate isComputed check redundant.\nimport { isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport { atomLens, composeLens, lensFor } from './lens';\n\n// ============================================================================\n// atom factory + debug namespace\n// ============================================================================\n\n/**\n * Local wrapper around core's `atom` factory.\n *\n * This wrapper exists to attach the `$.atom.debug` accessor directly to the\n * function object at runtime. TypeScript requires a double cast for this\n * augmentation, but `NamespaceExtensions` ensures all other fields are type-safe.\n *\n * `options` is not defaulted here — core's `atom` defaults `options` to `{}`\n * internally, so passing `undefined` is safe and avoids an extra allocation\n * per call.\n */\nfunction atom<T>(initialValue: T, options?: AtomOptions): WritableAtom<T> {\n return createAtom(initialValue, options);\n}\n\nObject.defineProperty(atom, 'debug', {\n enumerable: true,\n // configurable: true allows tests and advanced consumers to redefine or\n // delete the accessor if needed. The default (false) would permanently lock\n // the property on the function object.\n configurable: true,\n get(): boolean {\n return debug.enabled;\n },\n set(value: boolean) {\n debug.enabled = value;\n },\n});\n\n// ============================================================================\n// nextTick\n// ============================================================================\n\n/**\n * Resolves after all pending microtask-scheduled reactive effects have flushed.\n *\n * Implementation uses `setTimeout(0)` (a macrotask) which always runs after\n * the current microtask queue is drained. This is intentional: core's\n * scheduler enqueues effects as microtasks, so by the time the macrotask\n * fires, all pending reactive propagation for the current turn is complete.\n *\n * Note: browsers may enforce a minimum 4 ms delay for nested `setTimeout`\n * calls. For unit tests this is typically not an issue. If sub-millisecond\n * resolution is needed, use `Promise.resolve()` directly to wait for a single\n * microtask tick instead.\n *\n * **Caveats**: A single `await nextTick()` covers one reactive propagation\n * wave. Chains of computed → effect → atom → effect may require multiple\n * awaits — one per propagation step.\n */\nexport function nextTick(): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n\n// ============================================================================\n// Static extension registration\n// ============================================================================\n\n/**\n * The subset of `JQueryStatic` that this module registers.\n *\n * Typed as `Pick<JQueryStatic, ...>` so that the compiler verifies:\n * 1. Every key listed here actually exists on `JQueryStatic`.\n * 2. Every value's type is assignable to the declared `JQueryStatic` member.\n *\n * Adding or removing a key in either `JQueryStatic` or this object without\n * updating the other produces a compile-time error.\n *\n * Dependency direction note: `nextTick` is defined locally in this file, so\n * `JQueryStatic['nextTick']` is validated against its signature. For most other\n * keys, `JQueryStatic` serves as the source of truth for typing.\n *\n * Note: `$.extend(staticExtensions)` merges the fields into `$` at runtime.\n * TypeScript does not model this mutation on the `$` type — the augmented\n * types are declared separately via global interface merging in `types.ts`.\n */\ntype NamespaceExtensions = Pick<\n JQueryStatic,\n | 'atom'\n | 'computed'\n | 'effect'\n | 'batch'\n | 'untracked'\n | 'isAtom'\n | 'isComputed'\n | 'isReactive'\n | 'nextTick'\n | 'atomLens'\n | 'composeLens'\n | 'lensFor'\n>;\n\nconst staticExtensions: NamespaceExtensions = {\n // Double cast required for the `atom` function due to its runtime `debug`\n // accessor (see JSDoc for `function atom` above). All other fields are\n // fully verified by `NamespaceExtensions`.\n atom: atom as unknown as JQueryStatic['atom'],\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n isReactive,\n nextTick,\n atomLens,\n composeLens,\n lensFor,\n};\n\n// $.extend(obj) merges into JQueryStatic (i.e. the $ function itself).\n// Use $.fn.extend(obj) instead to add instance methods on jQuery collections.\n$.extend(staticExtensions);\n","/**\n * Array pool for reusing temporarily allocated arrays to avoid GC pressure.\n * Ported from @but212/atom-effect core.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n /**\n * @param limit - Max unique arrays to hold (default: 50). Prevents the pool itself from consuming too much memory.\n * @param capacity - Max length of an array to accept (default: 256).\n */\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /**\n * Acquires array.\n */\n acquire(): T[] {\n // LIFO reuse for better cache locality\n return this.pool.pop() ?? [];\n }\n\n /**\n * Releases array.\n *\n * @param arr - Array to release.\n */\n release(arr: T[]): void {\n if (arr.length > this.capacity) {\n return;\n }\n\n if (this.pool.length >= this.limit) {\n return;\n }\n\n if (Object.isFrozen(arr)) {\n return;\n }\n\n arr.length = 0;\n this.pool.push(arr);\n }\n\n /**\n * Resets pool.\n */\n reset(): void {\n this.pool.length = 0;\n }\n}\n","/**\n * Generic object pool for reusing fixed-shape plain objects.\n *\n * Design constraints:\n * - Pooled objects MUST have a fixed property shape (monomorphic).\n * Mixing shapes in a single pool will de-optimize V8's hidden classes.\n * - The `reset` callback MUST restore the object to a clean, reusable state.\n * Failing to do so leaks stale references and causes subtle bugs.\n * - The pool is LIFO (stack) for better CPU cache locality.\n *\n * @template T - Object type to pool. Must be a plain object with a fixed shape.\n */\nexport class ObjectPool<T extends object> {\n private readonly pool: T[] = [];\n\n /**\n * @param factory - Creates a new object with the canonical shape.\n * Called when the pool is empty and `acquire()` is invoked.\n * @param reset - Resets a used object to its clean initial state before\n * it is returned to the pool. All mutable fields should be zeroed /\n * set to `undefined` / cleared.\n * @param limit - Maximum number of objects to retain (default: 64).\n * Prevents the pool from growing unbounded if a burst of objects\n * are released at once.\n */\n constructor(\n private readonly factory: () => T,\n private readonly reset: (obj: T) => void,\n private readonly limit = 64\n ) {}\n\n /**\n * Acquires an object from the pool or creates a new one.\n * The returned object is in a clean state (either freshly created or reset).\n */\n acquire(): T {\n return this.pool.pop() ?? this.factory();\n }\n\n /**\n * Releases an object back to the pool after resetting it.\n * If the pool is already at capacity the object is simply discarded (GC'd).\n *\n * @param obj - The object to release.\n */\n release(obj: T): void {\n if (this.pool.length >= this.limit) return;\n this.reset(obj);\n this.pool.push(obj);\n }\n\n /**\n * Drains the pool, releasing all retained objects for GC.\n */\n drain(): void {\n this.pool.length = 0;\n }\n\n /**\n * Current number of objects retained in the pool.\n */\n get size(): number {\n return this.pool.length;\n }\n}\n","import type { EffectObject } from '@/types';\nimport { ArrayPool } from '../utils/array-pool';\nimport { ObjectPool } from '../utils/object-pool';\n\n// ============================================================================\n// Array Pools\n// ============================================================================\n\nexport const effectsArrayPool = new ArrayPool<EffectObject>();\nexport const cleanupsArrayPool = new ArrayPool<() => void>();\n\n// ============================================================================\n// Object Pools\n// ============================================================================\n\n/**\n * Per-element record of all reactive resources that must be released on cleanup.\n * Fields are optional to avoid allocating arrays for the common case where only\n * one resource type is used.\n *\n * Extracted here so that both the pool and registry share the same type.\n */\nexport interface BindingRecord {\n effects: EffectObject[] | undefined;\n cleanups: Array<() => void> | undefined;\n componentCleanup: (() => void) | undefined;\n}\n\n/**\n * Pool for BindingRecord objects.\n *\n * V8 Optimization: Objects always have the same hidden class (monomorphic shape)\n * because the factory creates them with all three fields initialized.\n * The reset callback nulls out references to prevent stale data leaks.\n */\nexport const bindingRecordPool = new ObjectPool<BindingRecord>(\n () => ({ effects: undefined, cleanups: undefined, componentCleanup: undefined }),\n (r) => {\n r.effects = undefined;\n r.cleanups = undefined;\n r.componentCleanup = undefined;\n },\n 128 // SPA pages routinely bind hundreds of elements\n);\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport {\n type BindingRecord,\n bindingRecordPool,\n cleanupsArrayPool,\n effectsArrayPool,\n} from '@/internal/pool';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n/**\n * CSS class added to every element that has at least one active binding.\n * Used by `querySelectorAll` in `cleanupDescendants` for efficient subtree traversal.\n * Internal use only.\n */\nconst AES_BOUND = '_aes-bound';\n\n// BindingRecord type is defined in @/internal/pool to co-locate with its ObjectPool.\n\n// ============================================================================\n// BindingRegistry\n// ============================================================================\n\n/**\n * Central registry mapping DOM elements to their reactive binding records.\n *\n * Design goals:\n * - Zero memory leaks: all collections use WeakMap/WeakSet keyed by Element.\n * - Minimal allocations in the hot tracking path.\n * - O(bound-descendants) cleanup via a single querySelectorAll pass.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n\n // boundElements removed: records is now the Single Source of Truth.\n // WeakMap.has() provides the existence check.\n\n private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>();\n\n // --------------------------------------------------------------------------\n // Lifecycle flags\n // --------------------------------------------------------------------------\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n // --------------------------------------------------------------------------\n // Tracking\n // --------------------------------------------------------------------------\n\n private getOrCreateRecord(el: Element): BindingRecord {\n let res = this.records.get(el);\n if (!res) {\n // Acquire from ObjectPool — monomorphic shape guaranteed by the pool factory.\n res = bindingRecordPool.acquire();\n this.records.set(el, res);\n el.classList.add(AES_BOUND);\n }\n return res;\n }\n\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this.getOrCreateRecord(el);\n record.effects ??= effectsArrayPool.acquire();\n record.effects.push(fx);\n }\n\n trackCleanup(el: Element, fn: () => void): void {\n const record = this.getOrCreateRecord(el);\n record.cleanups ??= cleanupsArrayPool.acquire();\n record.cleanups.push(fn);\n }\n\n setComponentCleanup(el: Element, fn: (() => void) | undefined): void {\n const record = this.getOrCreateRecord(el);\n record.componentCleanup = fn;\n }\n\n hasBind(el: Element): boolean {\n return this.records.has(el);\n }\n\n // --------------------------------------------------------------------------\n // Cleanup\n // --------------------------------------------------------------------------\n\n cleanup(el: Element | Node): void {\n // Optimization: Single lookup + delete.\n const record = this.records.get(el as Element);\n if (!record) {\n // Already cleaned up or never bound.\n // Ensure specific class is removed unconditionally just in case of stale DOM state\n // (e.g. detached node being re-inserted).\n if (el.nodeType === 1) (el as Element).classList.remove(AES_BOUND);\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n return;\n }\n\n // Atomic deletion doubles as a re-entry guard.\n this.records.delete(el as Element);\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n\n // Unconditionally remove the class to prevent \"zombie markers\".\n // If a detached node is cached by the user and re-inserted into the DOM later,\n // leaving the class would cause false-positive lookups during subtree cleanups.\n // (classList.remove on detached nodes is virtually free).\n if (el.nodeType === 1) (el as Element).classList.remove(AES_BOUND);\n\n if (debug.enabled) {\n const info = el.nodeType === 1 ? getSelector(el as Element) : el.nodeName || 'Node';\n debug.cleanup(LOG_PREFIXES.BINDING, info);\n }\n\n // Step 0 — Component cleanup runs first so the component can unmount\n // gracefully before its reactive effects are severed.\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (e) {\n const selector = el.nodeType === 1 ? getSelector(el as Element) : 'Node';\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.CLEANUP_ERROR(selector), e);\n }\n }\n\n // Step 1 — Sever atom → effect subscriptions.\n if (record.effects) {\n const effects = record.effects;\n for (let i = 0, len = effects.length; i < len; i++) {\n try {\n effects[i]!.dispose();\n } catch (e) {\n const selector = el.nodeType === 1 ? getSelector(el as Element) : 'Node';\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.CORE.EFFECT_DISPOSE_ERROR(selector), e);\n }\n }\n effectsArrayPool.release(effects);\n record.effects = undefined;\n }\n\n // Step 2 — Run general-purpose cleanup callbacks.\n if (record.cleanups) {\n const cleanups = record.cleanups;\n for (let i = 0, len = cleanups.length; i < len; i++) {\n try {\n cleanups[i]!();\n } catch (e) {\n const selector = el.nodeType === 1 ? getSelector(el as Element) : 'Node';\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.CLEANUP_ERROR(selector), e);\n }\n }\n cleanupsArrayPool.release(cleanups);\n record.cleanups = undefined;\n }\n\n // Return the record to the pool for reuse.\n bindingRecordPool.release(record);\n }\n\n cleanupDescendants(el: Element | DocumentFragment | ShadowRoot): void {\n // ⚠ Blind Spot Notice: Web Components & Shadow DOM\n // getElementsByClassName only traverses the Light DOM. If reactive elements\n // are placed inside a ShadowRoot, they will NOT be discovered or cleaned up\n // automatically by a parent's removal. Users must explicitly track and call\n // `registry.cleanupTree(shadowRoot)` to avoid memory leaks in Shadow DOMs.\n\n // is not available on ShadowRoot.\n const descendants =\n 'getElementsByClassName' in el && typeof el.getElementsByClassName === 'function'\n ? el.getElementsByClassName(AES_BOUND)\n : el.querySelectorAll(`.${AES_BOUND}`);\n for (let i = descendants.length - 1; i >= 0; i--) {\n const child = descendants[i];\n if (!child) continue;\n\n if (this.records.has(child)) {\n this.cleanup(child);\n } else {\n // The AES_BOUND class is present but the registry has no record.\n // Remove the stale class and warn so it surfaces in debug mode.\n child.classList.remove(AES_BOUND);\n if (debug.enabled) {\n debug.warn(\n LOG_PREFIXES.BINDING,\n `${AES_BOUND} class found on unregistered element:`,\n child\n );\n }\n }\n }\n }\n\n cleanupTree(el: Element | Node): void {\n // 1: Element, 11: DocumentFragment or ShadowRoot\n if (el.nodeType === 1 || el.nodeType === 11) {\n this.cleanupDescendants(el as Element | DocumentFragment | ShadowRoot);\n }\n this.cleanup(el);\n }\n}\n\n// ============================================================================\n// Singleton + auto-cleanup\n// ============================================================================\n\nexport const registry = new BindingRegistry();\n\nconst observers = new Map<Element, MutationObserver>();\n\n/**\n * Starts observing `root` for removed elements and automatically disposes\n * their reactive bindings when they leave the DOM.\n *\n * Multiple roots can be observed concurrently (e.g. for Micro-Frontends).\n * The `root` parameter is required (no default) to make the caller explicit\n * about which subtree is being observed.\n *\n * Idempotent: calling more than once with the same root has no effect.\n */\nexport function enableAutoCleanup(root: Element): void {\n // Support independent multiple roots for Micro-Frontend architectures.\n if (observers.has(root)) {\n return;\n }\n\n const observer = new MutationObserver((mutations) => {\n // Optimization: raw for-loop avoids iterator allocations.\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const removedNodes = mutations[i]!.removedNodes;\n for (let j = 0, rLen = removedNodes.length; j < rLen; j++) {\n const node = removedNodes[j]!;\n\n // Only Element nodes can carry AES_BOUND bindings.\n // 1 === Node.ELEMENT_NODE\n if (node.nodeType !== 1) continue;\n\n // isConnected handles the move case.\n // isKept handles explicit .detach().\n // isIgnored handles .remove().\n if (node.isConnected || registry.isKept(node) || registry.isIgnored(node)) {\n continue;\n }\n\n registry.cleanupTree(node as Element);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observers.set(root, observer);\n}\n\n/**\n * Stops all MutationObservers started by `enableAutoCleanup`.\n */\nexport function disableAutoCleanup(): void {\n observers.forEach((obs) => obs.disconnect());\n observers.clear();\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/** Generic event handler type matching jQuery's internal handler signature. */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/**\n * Symbol marker attached to handlers registered by this library's internals.\n * Handlers carrying this marker are NOT wrapped in batch() — they already\n * manage atom writes directly and do not need an extra reactive flush.\n */\nexport const INTERNAL_HANDLER = Symbol('atom-effect-internal');\n\n/**\n * WeakMap from original handler function → batch-wrapped handler function.\n * Keys are functions (held alive by jQuery's internal event store for as long\n * as the handler is registered), so entries are naturally released when the\n * handler is removed via .off() and jQuery drops its reference.\n */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n// ============================================================================\n// Originals store\n// ============================================================================\n\n/**\n * Snapshot of jQuery prototype methods captured at `enablejQueryOverrides()`\n * time and restored by `disablejQueryOverrides()`.\n *\n * Stored as a typed object and captured into `orig` (a local const) inside\n * `enablejQueryOverrides` so that the override closures always reference the\n * pre-patch methods even if `disablejQueryOverrides()` later resets the\n * module-level `originals` variable to null.\n */\ntype OriginalMethods = {\n on: typeof $.fn.on;\n off: typeof $.fn.off;\n remove: typeof $.fn.remove;\n empty: typeof $.fn.empty;\n detach: typeof $.fn.detach;\n};\n\nlet originals: OriginalMethods | null = null;\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n // Skip wrapping for library-internal handlers.\n if ((fn as unknown as Record<symbol, true>)[INTERNAL_HANDLER]) return fn;\n\n let wrapped = handlerMap.get(fn);\n if (!wrapped) {\n // `function` (not arrow) to preserve the jQuery-provided `this` context.\n // Double cast via `unknown` is required because the rest-args signature\n // `(...args: unknown[])` is not directly assignable to `EventHandler`.\n wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as EventHandler;\n // Mark the wrapper itself as internal so it isn't double-wrapped if passed again.\n (wrapped as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n handlerMap.set(fn, wrapped);\n }\n return wrapped;\n};\n\n/**\n * Wraps each handler in an `.on()` event-map with `getWrappedHandler`.\n * Skips keys whose value is falsy — mirrors jQuery's own behaviour of ignoring\n * undefined handlers in event-maps.\n * Uses `for...in` with `hasOwnProperty` guard to iterate own properties only,\n * consistent with the `for` loops used elsewhere in this file.\n */\nfunction wrapEventMap(map: Record<string, EventHandler>): Record<string, EventHandler> {\n const newMap: Record<string, EventHandler> = {};\n const entries = Object.entries(map);\n for (let i = 0, len = entries.length; i < len; i++) {\n const entry = entries[i]!;\n const key = entry[0];\n const handler = entry[1];\n if (handler) {\n newMap[key] = getWrappedHandler(handler);\n }\n }\n return newMap;\n}\n\n/**\n * Resolves the wrapped counterpart for each handler in an `.off()` event-map.\n * Preserves `undefined` values — `.off({ click: undefined })` is a valid\n * jQuery call that removes ALL listeners for that event type.\n * Uses `for...in` with `hasOwnProperty` guard, consistent with `wrapEventMap`.\n */\nfunction resolveOffEventMap(\n map: Record<string, EventHandler | undefined>\n): Record<string, EventHandler | undefined> {\n const newMap: Record<string, EventHandler | undefined> = {};\n const entries = Object.entries(map);\n for (let i = 0, len = entries.length; i < len; i++) {\n const entry = entries[i]!;\n const key = entry[0];\n const handler = entry[1];\n newMap[key] = handler ? (handlerMap.get(handler) ?? handler) : undefined;\n }\n return newMap;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Patches jQuery's `.on()`, `.off()`, `.remove()`, `.empty()`, and `.detach()`\n * to integrate with the reactive system:\n * - Event handlers are wrapped in `batch()` for efficient atom flushing.\n * - DOM removal triggers reactive binding cleanup.\n * - `.detach()` preserves bindings for re-attachment.\n *\n * Idempotent — calling more than once has no effect.\n * Call `disablejQueryOverrides()` to restore original methods.\n */\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n\n // Capture into a local const so the closures below always hold a stable\n // reference to the originals even after disablejQueryOverrides() resets\n // the module-level `originals` variable to null.\n const orig = originals;\n\n // --- Lifecycle overrides ---\n\n // .remove() — clean up bindings on the matching elements, then delegate.\n // Only elements matched by `selector` (or all elements when selector is\n // omitted) are cleaned up — other elements in `this` are not affected,\n // mirroring jQuery's own selector-scoped remove behaviour.\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n for (let i = 0, len = targets.length; i < len; i++) {\n const el = targets[i];\n if (el) {\n // markIgnored BEFORE cleanupTree: a MutationObserver callback that\n // fires synchronously during removal will see the ignored flag and\n // skip the redundant second cleanup pass.\n registry.markIgnored(el);\n registry.cleanupTree(el);\n }\n }\n const result = orig.remove.call(this, selector);\n // Ensure chaining is definitively unbroken even if original was sub-patched\n return result !== undefined ? (result as JQuery) : this;\n };\n\n // .empty() — recursively clean up descendants, then delegate.\n $.fn.empty = function (this: JQuery) {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i];\n // Fast path: Avoid expensive DOM queries if the element has no children at all.\n // E.g. .empty() called on a text-only or already-empty element.\n if (el?.hasChildNodes()) {\n registry.cleanupDescendants(el);\n }\n }\n const result = orig.empty.call(this);\n return result !== undefined ? (result as JQuery) : this;\n };\n\n // .detach() — mark elements as kept so the MutationObserver does not\n // dispose their bindings while they are temporarily out of the DOM.\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n for (let i = 0, len = targets.length; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n const result = orig.detach.call(this, selector);\n return result !== undefined ? (result as JQuery) : this;\n };\n\n // --- Event overrides ---\n\n // .on() — wrap the handler argument in batch().\n //\n // jQuery's full signature is: .on(events, selector?, data?, handler)\n // When the first arg is an object it is an event-map; otherwise the handler\n // is always the LAST argument (position 1, 2, or 3 depending on overload).\n // Iterating from the end and stopping at the first function is therefore\n // correct for the positional form, because `data` is never a function in\n // jQuery's documented API.\n // `...args: unknown[]` is used instead of jQuery's overloaded signature\n // because TypeScript cannot unify the 4+ overloads into a single rest type.\n // The casts at args[0] and the apply call site are therefore unavoidable.\n $.fn.on = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n\n if (types && typeof types === 'object') {\n args[0] = wrapEventMap(types as Record<string, EventHandler>);\n } else {\n // In jQuery signature .on(events, [selector], [data], handler), the handler\n // is always the last argument provided. We inspect the exact last element\n // to avoid wrapping a function that is actually passed as 'data'.\n const lastIndex = args.length - 1;\n if (lastIndex >= 0 && typeof args[lastIndex] === 'function') {\n args[lastIndex] = getWrappedHandler(args[lastIndex] as EventHandler);\n }\n }\n\n const result = orig.on.apply(this, args as Parameters<typeof $.fn.on>);\n return result !== undefined ? (result as JQuery) : this;\n };\n\n // .off() — resolve the original handler back to its wrapped counterpart so\n // jQuery can find and remove the correct internal listener.\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n\n if (types && typeof types === 'object') {\n args[0] = resolveOffEventMap(types as Record<string, EventHandler | undefined>);\n } else {\n // Like .on(), only unwrap if the last provided argument is a function.\n const lastIndex = args.length - 1;\n if (lastIndex >= 0 && typeof args[lastIndex] === 'function') {\n const fn = args[lastIndex] as EventHandler;\n args[lastIndex] = handlerMap.get(fn) ?? fn;\n }\n }\n\n const result = orig.off.apply(this, args as Parameters<typeof $.fn.off>);\n return result !== undefined ? (result as JQuery) : this;\n };\n}\n\n/**\n * Restores all jQuery methods patched by `enablejQueryOverrides()`.\n * Primarily useful in test environments to reset state between suites.\n */\nexport function disablejQueryOverrides(): void {\n if (originals === null) return;\n\n $.fn.on = originals.on;\n $.fn.off = originals.off;\n $.fn.remove = originals.remove;\n $.fn.empty = originals.empty;\n $.fn.detach = originals.detach;\n\n originals = null;\n}\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n EffectObject,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n// ============================================================================\n// Shared API Types\n// ============================================================================\n\n/**\n * Helper to convert a numeric string to a number type, otherwise returns the string.\n * Used for array indexing in paths.\n */\ntype StringKeyToNumber<S extends string> = S extends `${infer N extends number}` ? N : S;\n\n/**\n * Maximum recursion depth for path generation.\n * Prevents TypeScript compiler from hitting recursion limits on deeply nested types.\n */\ntype MaxDepth = 8;\n\n/**\n * Generates a union of all valid dot-separated paths for type T.\n */\nexport type Paths<T, D extends unknown[] = []> = D['length'] extends MaxDepth\n ? never\n : T extends object\n ? {\n [K in keyof T & (string | number)]-?:\n | `${K}`\n | (T[K] extends object ? `${K}.${Paths<T[K], [...D, 1]>}` : never);\n }[keyof T & (string | number)]\n : never;\n\n/**\n * Extracts the value type at path P within type T.\n */\nexport type PathValue<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? StringKeyToNumber<K> extends keyof T\n ? PathValue<T[StringKeyToNumber<K> & keyof T], Rest>\n : never\n : StringKeyToNumber<P> extends keyof T\n ? T[StringKeyToNumber<P> & keyof T]\n : never;\n\n/**\n * Cleanup function returned by effects or components.\n */\nexport type EffectCleanup = () => void;\n\n/**\n * Result of a reactive factory or component mount.\n * Returns `void` (no cleanup) or an `EffectCleanup` function.\n */\nexport type EffectResult = undefined | EffectCleanup;\n\n/**\n * Generic equality predicate shared by `ValOptions` and any future consumer.\n * Extracted as a named type to avoid duplicating the inline function signature.\n */\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\n/**\n * Extended options for Atom creation.\n */\nexport interface AtomOptions extends BaseAtomOptions {\n /** Name for debugging purposes */\n name?: string;\n}\n\n/**\n * Represents a value that can be either a reactive node (Atom or Computed)\n * or a plain static value of the same type.\n *\n * `ComputedAtom<T>` is a structural sub-type of `ReadonlyAtom<T>`, so it is\n * already covered by `ReadonlyAtom<T>`.\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * Represents a value that can be a synchronous `ReactiveValue<T>`,\n * a `Promise<T>`, or an Atom yielding `T | Promise<T>`.\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\n\n/**\n * Values allowed for DOM properties and attributes.\n */\nexport type PrimitiveValue = string | number | boolean | null | undefined;\n\n/**\n * Helper to extract keys of T whose values extend V.\n * Used to ensure `key` property refers to valid ID-like values.\n */\ntype KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];\n\n/**\n * CSS value: either a direct reactive value or a numeric tuple of [source, unit].\n */\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\n\n/**\n * CSS bindings map property names to CSS values.\n */\nexport type CssBindings = Record<string, CssValue>;\n\n/**\n * Configuration options for `atomBind`.\n * @template T Type of the value for two-way binding (`val` field).\n */\nexport interface BindingOptions<T = unknown> {\n /** Binds textContent to any reactive source. */\n text?: AsyncReactiveValue<unknown>;\n /** Binds innerHTML to a reactive string source (sanitized). */\n html?: AsyncReactiveValue<string>;\n /** Map of class names to reactive boolean conditions. */\n class?: Record<string, AsyncReactiveValue<boolean>>;\n /** Map of CSS properties to reactive values or [value, unit] tuples. */\n css?: CssBindings;\n /** Binds attributes with consistent primitive constraints. */\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n /** Binds DOM properties. */\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n /** Direct visibility control (display: none). */\n show?: AsyncReactiveValue<boolean>;\n /** Inverse visibility control. */\n hide?: AsyncReactiveValue<boolean>;\n\n /**\n * Two-way binding for input values.\n * Pass an atom or a `[atom, options]` tuple.\n */\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n /** Two-way binding for checkboxes and radio buttons. */\n checked?: WritableAtom<boolean>;\n /** Fully automated two-way form binding using name attributes. */\n form?: WritableAtom<T extends object ? T : unknown>;\n /** Event listeners with automatic batched execution and lifecycle-bound cleanup. */\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\n/**\n * A WritableAtom that can be disposed to clean up internal subscriptions.\n * Returned by $.atomLens, $.composeLens, and $.lensFor().\n */\nexport interface DisposableWritableAtom<T> extends WritableAtom<T>, Disposable {\n dispose(): void;\n}\n\n// ============================================================================\n// List API Types\n// ============================================================================\n\n/** Key type for Map/Set inside list.ts */\nexport type ListKey = string | number;\n\n/** Possible return types for render() / empty */\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\n\n/** Key extractor function signature. */\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\n/**\n * Configuration options for `atomList`.\n */\nexport interface ListOptions<T> {\n /**\n * Key to track items. Must be a property name whose value is a string|number,\n * or a key extractor function.\n */\n key: KeysOfType<T, ListKey> | ListKeyFn<T>;\n /** Render function for each item. */\n render: (item: T, index: number) => ListRenderResult;\n /** Optional post-render binding logic. */\n bind?: ($el: JQuery, item: T, index: number) => void;\n /** Optional update logic when item data changes but DOM is reused. */\n update?: ($el: JQuery, item: T, index: number) => void;\n /** Lifecycle hook: called when an element is added to the list. */\n onAdd?: ($el: JQuery) => void;\n /** Lifecycle hook: called when an element is about to be removed. */\n onRemove?: ($el: JQuery) => Promise<void> | void;\n /** Content to show when the list is empty. */\n empty?: ListRenderResult;\n /** Delegated event handlers attached to the container. */\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n /**\n * Custom equality checker to determine if an item has changed.\n * Defaults to `shallowEqual`. If it returns false, the item is re-rendered (unless `update` is provided).\n */\n isEqual?: (a: T, b: T) => boolean;\n}\n\n// ============================================================================\n// Form & Input Types\n// ============================================================================\n\n/**\n * Configuration options for `atomVal`.\n */\nexport interface ValOptions<T> {\n /** Delay in milliseconds before syncing DOM input to Atom. */\n debounce?: number;\n /** DOM event to trigger sync (default: 'input'). */\n event?: string;\n /** Parser to convert string input to Atom type T. */\n parse?: (v: string) => T;\n /** Formatter to convert Atom type T to string for DOM display. */\n format?: (v: T) => string;\n /** Custom equality check for comparing parsed values. Defaults to Object.is. */\n equal?: EqualFn<T>;\n}\n\n// ============================================================================\n// Fetch API Types\n// ============================================================================\n\n/**\n * Configuration options for `atomFetch`.\n */\nexport interface FetchOptions<T> {\n /** Initial value before the first fetch resolves. */\n defaultValue: T;\n /** HTTP method (default: 'GET'). */\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n /** HTTP headers. */\n headers?: Record<string, string>;\n /** Transforms the raw response into T. */\n transform?: (raw: unknown) => T;\n /** Additional `$.ajax` settings. Can be a getter function for reactive data tracking. */\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n /** Error callback. */\n onError?: (err: unknown) => void;\n /** Whether to fetch immediately (default: true). */\n eager?: boolean;\n}\n\n/** Error payload for atomFetch. */\nexport interface FetchError extends Error {\n /** The original jQuery XHR object. */\n jqXHR?: JQuery.jqXHR;\n}\n\n// ============================================================================\n// Component & Router Types\n// ============================================================================\n\n/**\n * A function that initializes logic on a jQuery element and returns an optional cleanup function.\n * `P` defaults to `Record<string, unknown>` for convenience. Use `P = Record<string, never>`\n * for strictly no-props components.\n */\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\n/** Shared route lifecycle hooks. */\nexport interface RouteLifecycle {\n onEnter?: (params: Record<string, string>, router: Router) => Record<string, string> | undefined;\n onLeave?: (router: Router) => boolean | undefined;\n}\n\nexport interface TemplateRoute extends RouteLifecycle {\n template: string;\n render?: never;\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\nexport interface RenderRoute extends RouteLifecycle {\n render: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n template?: never;\n}\n\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\nexport interface RouteConfig {\n target: string;\n default: string;\n routes: Record<string, RouteDefinition>;\n mode?: 'hash' | 'history';\n basePath?: string;\n notFound?: string;\n autoBindLinks?: boolean;\n activeClass?: string;\n beforeTransition?: (from: string, to: string) => void;\n afterTransition?: (from: string, to: string) => void;\n}\n\nexport interface Router {\n currentRoute: ReadonlyAtom<string>;\n queryParams: ReadonlyAtom<Record<string, string>>;\n navigate: (route: string) => void;\n destroy: () => void;\n}\n\n// ============================================================================\n// Internal Types (Implementation Details)\n// ============================================================================\n\n/**\n * Bit flags for input binding state management.\n * @internal\n */\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\n/**\n * Context passed to binding handlers for unified lifecycle management.\n * @internal\n */\nexport interface BindingContext {\n readonly el: HTMLElement;\n readonly trackCleanup: (fn: EffectCleanup) => void;\n}\n\n// ============================================================================\n// JQuery Global Augmentation\n// ============================================================================\n\ndeclare global {\n interface JQueryStatic {\n atom: {\n <T>(initialValue: T, options?: AtomOptions): WritableAtom<T>;\n debug: boolean;\n };\n computed<T>(fn: () => T, options?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n options: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(fn: () => EffectResult): EffectObject;\n batch(fn: () => void): void;\n untracked<T>(fn: () => T): T;\n isAtom(v: unknown): boolean;\n isComputed(v: unknown): boolean;\n isReactive(v: unknown): boolean;\n nextTick(): Promise<void>;\n atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n lensFor<T extends object>(\n atom: WritableAtom<T>\n ): <P extends Paths<T>>(path: P) => DisposableWritableAtom<PathValue<T, P>>;\n route(config: RouteConfig): Router;\n atomFetch<T>(\n urlOrFn: string | (() => string),\n options: FetchOptions<T>\n ): ComputedAtom<T> & { abort: () => void };\n }\n\n interface JQuery {\n atomText<T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): this;\n atomHtml(source: AsyncReactiveValue<string>): this;\n atomClass(className: string, condition: AsyncReactiveValue<boolean>): this;\n atomClass(classMap: Record<string, AsyncReactiveValue<boolean>>): this;\n atomCss(prop: string, source: AsyncReactiveValue<string | number>, unit?: string): this;\n atomCss(cssMap: CssBindings): this;\n atomAttr(name: string, source: AsyncReactiveValue<PrimitiveValue>): this;\n atomAttr(attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>): this;\n atomProp<T>(name: string, source: AsyncReactiveValue<T>): this;\n atomProp<T>(propMap: Record<string, AsyncReactiveValue<T>>): this;\n atomShow(condition: AsyncReactiveValue<boolean>): this;\n atomHide(condition: AsyncReactiveValue<boolean>): this;\n\n atomVal<T>(atom: WritableAtom<T>, options?: ValOptions<T>): this;\n atomChecked(atom: WritableAtom<boolean>): this;\n atomForm<T extends object>(atom: WritableAtom<T>, options?: ValOptions<unknown>): this;\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n\n atomBind<T = unknown>(options: BindingOptions<T>): this;\n atomList<T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): this;\n\n atomMount<P>(component: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n atomUnbind(): this;\n }\n}\n\nexport type { ComputedAtom, ComputedOptions, EffectObject, ReadonlyAtom, WritableAtom };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, INPUT_DEFAULTS, LOG_PREFIXES } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// Monotonically increasing counter used to generate per-instance event\n// namespaces, preventing cleanup of sibling bindings on the same element.\nlet instanceCounter = 0;\n\ntype InputEl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * Marks a handler as library-internal so the jQuery patch skips batch() wrapping.\n * All handlers registered by InputBinding must be marked — unmarked handlers are\n * wrapped in batch() by the jQuery override, which is redundant and potentially\n * harmful here since InputBinding manages atom writes directly.\n */\nfunction markInternal(fn: Function): void {\n (fn as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n}\n\nclass InputBinding<T> {\n // $el: used only for jQuery event binding and debug.domUpdated — kept as a\n // field to avoid re-wrapping $el[0] on every call.\n // el: raw DOM reference for hot-path property access (value, selectionStart,\n // etc.) — avoids jQuery wrapper overhead on every input event.\n private readonly $el: JQuery;\n private readonly el: InputEl;\n private readonly atom: WritableAtom<T>;\n private readonly isMultipleSelect: boolean;\n\n // Hoisted fast local properties vs deep this.options.x lookups for hot paths.\n private readonly parse: (v: string) => T;\n private readonly format: (v: T) => string;\n private readonly equal: (a: T, b: T) => boolean;\n\n private flags = 0;\n // undefined instead of null so clearTimeout(this.timeoutId) is always safe\n // without a null-check (clearTimeout(undefined) is a no-op per spec).\n private timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Per-instance jQuery event namespace — prevents cleanup collisions. */\n private readonly ns: string;\n\n // Declared here so TypeScript knows the field exists; assigned in the\n // constructor where the debounce branch decides which closure to use.\n // Must be readonly after construction — markInternal relies on the final\n // function reference being stable, which is ensured by calling it after\n // all handler assignments are complete.\n private readonly handleInput: () => void;\n\n constructor($el: JQuery, atom: WritableAtom<T>, options: ValOptions<T>) {\n this.$el = $el;\n this.el = $el[0] as InputEl;\n this.atom = atom;\n this.isMultipleSelect = this.el.tagName === 'SELECT' && (this.el as HTMLSelectElement).multiple;\n this.ns = `.atomBind-${++instanceCounter}`;\n\n const debounce = options.debounce ?? 0;\n const eventName = options.event ?? INPUT_DEFAULTS.EVENT;\n\n this.parse = options.parse ?? ((v: string) => v as unknown as T);\n this.format =\n options.format ??\n ((v: T) => {\n // Return array directly for <select multiple> instead of stringifying\n if (this.isMultipleSelect) {\n return (Array.isArray(v) ? v : v ? [String(v)] : []).join(',');\n }\n return String(v ?? '');\n });\n\n // Wrap user-provided or default equality with shallow array comparison\n // to support <select multiple> without leaking `unknown` into the public type.\n const baseEqual = options.equal ?? Object.is;\n this.equal = (a: T, b: T): boolean => {\n if (baseEqual(a, b)) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((val, i) => Object.is(val, b[i]));\n }\n return false;\n };\n\n // Optimization: pre-bind the appropriate input handler to avoid per-event\n // branching at runtime. The debounce branch produces a closure that clears\n // and resets a timer; the no-debounce branch calls syncAtomFromDom directly.\n if (debounce > 0) {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => this.syncAtomFromDom(), debounce);\n };\n } else {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n this.syncAtomFromDom();\n };\n }\n\n // Mark all handlers so the jQuery patch skips batch() wrapping.\n // Done after all handler references are finalized (handleInput is assigned\n // above; the others are class-field arrow functions initialized before the\n // constructor body runs).\n markInternal(this.handleFocus);\n markInternal(this.handleBlur);\n markInternal(this.handleCompositionStart);\n markInternal(this.handleCompositionEnd);\n markInternal(this.handleInput);\n\n this.bindEvents(eventName);\n }\n\n // --- Event Handlers ---\n\n private readonly handleCompositionStart = () => {\n this.flags |= BindingFlags.Composing;\n };\n\n private readonly handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n this.handleInput();\n };\n\n private readonly handleFocus = () => {\n this.flags |= BindingFlags.Focused;\n };\n\n private readonly handleBlur = () => {\n this.flags &= ~BindingFlags.Focused;\n\n // FIX 4: Clear composing state securely when an element is unexpectedly blurred\n // while composition was active (e.g., click away during IME typing).\n const wasComposing = !!(this.flags & BindingFlags.Composing);\n this.flags &= ~BindingFlags.Composing;\n\n // Order matters: flush the pending debounce write BEFORE normalizing the\n // display value so that normalizeDomValue reads the atom state that\n // includes any value the user was typing.\n this.flushPendingDebounce();\n\n // If debounce === 0 and was composing, flushPendingDebounce wouldn't have synced Atom\n // (since timeoutId is undefined), so we must manually sync to prevent typed text from evaporating.\n if (wasComposing && this.timeoutId === undefined) {\n this.syncAtomFromDom();\n }\n\n this.normalizeDomValue();\n };\n\n // --- Blur helpers ---\n\n /**\n * Flushes any pending debounce timer immediately.\n * Called on blur so that a value the user finished typing is not lost\n * when focus moves away before the debounce delay expires.\n */\n private flushPendingDebounce(): void {\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n this.syncAtomFromDom();\n }\n }\n\n /**\n * Re-formats the current atom value into the input element on blur.\n * Ensures the displayed text matches the canonical format (e.g. trims trailing\n * spaces, applies number formatting) after the user finishes editing.\n */\n private normalizeDomValue(): void {\n const formatted = this.format(this.atom.peek());\n\n if (this.isMultipleSelect) {\n const currentVal = (this.$el.val() as string[] | null) || [];\n const formattedArr = Array.isArray(this.atom.peek()) ? this.atom.peek() : [];\n if (!this.equal(currentVal as unknown as T, formattedArr as unknown as T)) {\n this.$el.val(formattedArr as unknown as string[]);\n }\n } else if (this.el.value !== formatted) {\n this.el.value = formatted;\n }\n }\n\n // --- Sync Logic ---\n\n private syncAtomFromDom(): void {\n // BindingFlags.Busy covers Composing | SyncingToAtom | SyncingToDom.\n // SyncingToDom is included defensively: if a future synchronous code path\n // triggers handleInput during an Atom→DOM write, this guard prevents echo.\n if (this.flags & BindingFlags.Busy) return;\n\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n // FIX 3: Support <select multiple> arrays\n let rawValue: string;\n if (this.isMultipleSelect) {\n rawValue = ((this.$el.val() as string[] | null) || []) as unknown as string;\n } else {\n rawValue = this.el.value;\n }\n\n const parsed = this.parse(rawValue);\n // peek() instead of .value: equality check in an event handler must not\n // register a dependency — only syncDomFromAtom (the effect body) tracks.\n if (!this.equal(this.atom.peek(), parsed)) {\n this.atom.value = parsed;\n }\n } catch (e) {\n // parse() threw (e.g. invalid input) — leave the atom unchanged.\n debug.warn(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.PARSE_ERROR(e instanceof Error ? e.message : String(e)),\n e\n );\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n // --- Public Interface ---\n\n /**\n * Reactive effect body (Atom → DOM).\n * Called by the `effect()` wrapper in `applyInputBinding` whenever the atom\n * value changes. Named `syncDomFromAtom` to distinguish it from the imported\n * `effect` function and to clarify the data-flow direction.\n *\n * TRACKING NOTE: only `this.atom.value` is intentionally tracked as a\n * reactive dependency. `format()`, `parse()`, and `equal()` run inside\n * `untracked()` so that user-supplied callbacks cannot accidentally subscribe\n * this effect to additional atoms — even if those callbacks internally read\n * reactive state.\n */\n public readonly syncDomFromAtom = () => {\n const val = this.atom.value;\n\n untracked(() => {\n const formatted = this.format(val);\n\n let currentVal: T;\n if (this.isMultipleSelect) {\n currentVal = ((this.$el.val() as string[] | null) || []) as unknown as T;\n } else {\n currentVal = this.el.value as unknown as T;\n }\n\n // Skip if already synchronised.\n if (this.equal(currentVal, val)) return;\n\n const isFocused = !!(this.flags & BindingFlags.Focused);\n\n // While focused, skip update if the current raw input already parses to\n // the same logical value — avoids interrupting in-progress user input.\n if (isFocused) {\n try {\n const parsedCurrent = this.isMultipleSelect\n ? currentVal // already T (string[]) from DOM\n : this.parse(this.el.value);\n if (this.equal(parsedCurrent, val)) return;\n } catch {\n // parse() threw on the current raw input (e.g. partially typed number).\n // Fall through and apply the formatted value.\n }\n }\n\n this.flags |= BindingFlags.SyncingToDom;\n try {\n if (this.isMultipleSelect) {\n this.$el.val(val as unknown as string[]);\n } else if (\n isFocused &&\n (this.el instanceof HTMLInputElement || this.el instanceof HTMLTextAreaElement)\n ) {\n // Preserve cursor position so external atom updates don't jump the caret.\n try {\n const start = this.el.selectionStart;\n const end = this.el.selectionEnd;\n\n this.el.value = formatted;\n const len = formatted.length;\n\n if (start !== null && end !== null) {\n this.el.setSelectionRange(start < len ? start : len, end < len ? end : len);\n }\n } catch (_e) {\n // FIX 1: Accessing selectionStart on types like 'number' throws an InvalidStateError DOMException.\n this.el.value = formatted;\n }\n } else {\n this.el.value = formatted;\n }\n\n if (debug.enabled) debug.domUpdated(LOG_PREFIXES.BINDING, this.$el, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n public readonly cleanup = () => {\n // Remove only this instance's namespaced events — other bindings on the\n // same element are unaffected.\n this.$el.off(this.ns);\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n };\n\n private bindEvents(eventName: string): void {\n const ns = this.ns;\n // FIX 2: Apply namespace to every space-separated event type.\n const namespacedEvents = eventName\n .trim()\n .split(/\\s+/)\n .map((e) => `${e}${ns}`)\n .join(' ');\n\n this.$el\n .on(`focus${ns}`, this.handleFocus)\n .on(`blur${ns}`, this.handleBlur)\n .on(`compositionstart${ns}`, this.handleCompositionStart)\n .on(`compositionend${ns}`, this.handleCompositionEnd)\n .on(namespacedEvents, this.handleInput);\n }\n}\n\n/**\n * Applies two-way data binding between a writable atom and an input element.\n * Used by both `$.fn.atomVal` (explicit) and `$.fn.atomBind({ val })` (implicit).\n *\n * @param $el - jQuery-wrapped input, textarea, or select element.\n * @param atom - Writable atom to keep in sync with the element's value.\n * @param options - Optional parse/format/debounce/event/equal configuration.\n * @returns `fx` — the registered reactive effect (Atom → DOM),\n * `cleanup` — removes all event listeners and cancels pending timers.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { fx: EffectObject; cleanup: () => void } {\n const binding = new InputBinding($el, atom, options);\n return { fx: effect(binding.syncDomFromAtom), cleanup: binding.cleanup };\n}\n","import { effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\n\nimport { isPromise, isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Debug type\n// ============================================================================\n\n/**\n * Structured label identifying which binding produced a debug log entry.\n * Fixed bindings use a plain literal; per-key bindings use a `prefix.key` form\n * where the key portion must be non-empty.\n *\n * Note: the trailing `(string & {})` member makes this type accept any string\n * at runtime while still surfacing the named literals as IDE autocomplete\n * suggestions. It does NOT enforce that only the listed values are used —\n * TypeScript absorbs all narrower literal members into `string & {}`, so there\n * is no compile-time restriction beyond `string`.\n */\nexport type BindingDebugType =\n | 'text'\n | 'html'\n | 'show'\n | 'hide'\n | 'checked'\n | `class.${string & {}}`\n | `css.${string & {}}`\n | `attr.${string & {}}`\n | `prop.${string & {}}`\n | (string & {});\n\n// ============================================================================\n// Core factory\n// ============================================================================\n\n/**\n * Registers a reactive effect that calls `updater` whenever `source` changes,\n * or calls `updater` once immediately if `source` is a static value.\n *\n * Responsibilities:\n * - Reactive path: wraps `updater` in an `effect`, tracks it on the registry.\n * - Static path: applies the value once; no effect is registered.\n * - Debug path: logs both the static initial bind and reactive updates via\n * `debug.domUpdated` so that all DOM writes appear in a uniform format.\n * - Error path: catches `updater` exceptions and surfaces them via `console.error`\n * so that a broken binding does not silently kill the effect loop.\n * Both the reactive and static paths are guarded consistently with `untracked`.\n *\n * @param el DOM element or SVG element to associate the effect with.\n * @param source Reactive or static value source.\n * @param updater Function that writes the value to the DOM.\n * @param debugType Structured label used in debug log output and effect naming.\n */\nexport function registerReactiveEffect<T>(\n el: Element,\n source: AsyncReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n let latestPromise: Promise<T> | null = null;\n\n const runUpdater = (val: T | Promise<T>) => {\n if (isPromise(val)) {\n const p = val;\n latestPromise = p;\n p.then((resolved) => {\n if (latestPromise === p) {\n untracked(() => {\n try {\n updater(resolved);\n if (debug.enabled)\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolved);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n }).catch((e) => {\n if (latestPromise === p) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n } else {\n latestPromise = null;\n try {\n updater(val as T);\n if (debug.enabled) debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, val);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true), e);\n }\n }\n };\n\n if (isReactive(source)) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const value = (source as ReadonlyAtom<T | Promise<T>>).value;\n untracked(() => runUpdater(value));\n },\n { name: debugType }\n )\n );\n } else if (typeof source === 'function') {\n registry.trackEffect(\n el,\n effect(\n () => {\n const value = (source as () => T | Promise<T>)();\n untracked(() => runUpdater(value));\n },\n { name: debugType }\n )\n );\n } else {\n untracked(() => runUpdater(source as T | Promise<T>));\n }\n}\n\n/**\n * Registers a single reactive effect that observes multiple sources in a map.\n * When any source changes, the entire map is re-processed via the updater.\n *\n * This optimization reduces the number of Effect objects created for complex\n * bindings like atomClass({ ... }) or atomCss({ ... }).\n *\n * @param el DOM element.\n * @param map Dictionary of reactive or static values.\n * @param updater Function that applies the entire map state to the DOM.\n * @param debugType Base label for debugging.\n */\nexport function registerMapEffect<T>(\n el: Element,\n map: Record<string, AsyncReactiveValue<T>>,\n updater: (map: Record<string, T>) => void,\n debugType: BindingDebugType\n): void {\n const keys = Object.keys(map);\n const reactiveKeys: string[] = [];\n const staticValues: Record<string, T | Promise<T>> = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!;\n const val = map[key]!;\n if (isReactive(val) || typeof val === 'function') {\n reactiveKeys.push(key);\n } else {\n staticValues[key] = val as T | Promise<T>;\n }\n }\n\n let latestPromiseId = 0;\n\n const runUpdater = (currentMap: Record<string, T | Promise<T>>) => {\n const keys = Object.keys(currentMap);\n const promises: Promise<{ key: string; val: T }>[] = [];\n const resolvedMap: Record<string, T> = {};\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]!;\n const val = currentMap[key]!;\n if (isPromise(val)) {\n promises.push(val.then((v) => ({ key, val: v })));\n } else {\n resolvedMap[key] = val as T;\n }\n }\n\n if (promises.length > 0) {\n const myId = ++latestPromiseId;\n Promise.all(promises).then((results) => {\n if (myId === latestPromiseId) {\n for (let i = 0; i < results.length; i++) {\n const { key, val } = results[i]!;\n resolvedMap[key] = val;\n }\n untracked(() => {\n try {\n updater(resolvedMap);\n if (debug.enabled)\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolvedMap);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n });\n } else {\n latestPromiseId++; // Invalidate any pending promises\n try {\n updater(resolvedMap);\n if (debug.enabled) debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, resolvedMap);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true), e);\n }\n }\n };\n\n if (reactiveKeys.length > 0) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const currentMap: Record<string, T | Promise<T>> = { ...staticValues };\n for (let i = 0; i < reactiveKeys.length; i++) {\n const key = reactiveKeys[i]!;\n const source = map[key]!;\n currentMap[key] = isReactive(source)\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n }\n\n untracked(() => runUpdater(currentMap));\n },\n { name: debugType }\n )\n );\n } else {\n // Purely static map\n untracked(() => runUpdater(staticValues));\n }\n}\n","/**\n * HTML sanitization and security guards for XSS mitigation.\n *\n * This module is the **sole** sanitization layer — there is no downstream\n * sanitizer (e.g. DOMPurify) applied automatically. All regex-based\n * filtering happens here before content reaches the DOM.\n *\n * **Threat model:** best-effort defence for developer-authored templates and\n * reactive string bindings. For user-controlled rich text (e.g. a WYSIWYG\n * editor), replace or supplement this with DOMPurify.\n */\n\n// ============================================================================\n// URL attribute registry\n// ============================================================================\n\n/**\n * Attributes that carry a single URL value.\n *\n * `srcset` is intentionally excluded: its value is a comma-separated list of\n * URLs (e.g. `\"img.png 1x, img@2x.png 2x\"`), so a start-anchored regex cannot\n * reliably detect a dangerous protocol buried after the first comma. Callers\n * that need to validate srcset should parse each URL individually.\n */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n]);\n\n// ============================================================================\n// Pre-compiled regex constants\n// ============================================================================\n\nexport const DANGEROUS_PROTOCOL_RE = /^\\s*(?:javascript|vbscript)\\s*:/i;\n\nconst DANGEROUS_CSS_RE =\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\n /(?:expression\\s*\\(|behavior\\s*:|-moz-binding\\s*:|(?:\\\\[0-9a-f]{1,6}\\s*|[\\s\\x00-\\x20/'\"])*(?:j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|d\\s*a\\s*t\\s*a)\\s*:(?!image\\/))/i;\n\n/** Detects `javascript:` / `vbscript:` inside a CSS `url()` function. Non-global — no `lastIndex` state. */\nconst DANGEROUS_CSS_URL_RE = /url\\s*\\(\\s*(?:[\"']?\\s*)?(?:javascript|vbscript)\\s*:/i;\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters\nconst STRIP_CTRL_RE = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\n\n/**\n * Numeric HTML entity decoder: &#NNN; and &#xHH; forms.\n *\n * Runs before protocol/tag checks so entity-encoded bypass vectors like\n * \"javascript:\" (j=106) are normalised to their literal characters.\n * Safe structural entities (& < > ") are intentionally left\n * encoded — they produce inert text when re-inserted via innerHTML and must\n * remain escaped for correct HTML rendering.\n *\n * The semicolon is optional (`?`) to catch unterminated references such as\n * \"javascript:\" which some parsers still decode.\n */\nconst DECODE_NUMERIC_ENTITY_RE = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\n\n/**\n * Named-entity decoder for the small set of entities relevant to protocol\n * smuggling (colon, Tab, NewLine).\n *\n * HTML5 named character references are **case-sensitive** — `	` exists,\n * `&tab;` does not. Do NOT add the `i` flag: it would incorrectly decode\n * non-existent variants and widen the attack surface.\n */\nconst NAMED_ENTITY_MAP: Record<string, string> = {\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n};\nconst DECODE_NAMED_ENTITY_RE = /&(colon|Tab|NewLine);/g;\n\nconst STRIP_XML_RE = /<\\?[\\s\\S]*?\\?>/g;\n\nconst DANGEROUS_TAG_RE =\n /(<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*>([\\s\\S]*?)<\\/\\2>|<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*\\/?>)/gi;\n\nconst DANGEROUS_PROTOCOL_GLOBAL_RE =\n /(j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t)\\s*:/gi;\n\nconst DANGEROUS_DATA_URI_RE =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/gi;\n\nconst UNSAFE_ATTR_RE = /\\bon\\w+\\s*=/gim;\n\n/** Global variant of DANGEROUS_CSS_RE for use inside sanitizeHtml. */\nconst DANGEROUS_CSS_GLOBAL_RE = new RegExp(DANGEROUS_CSS_RE.source, 'gim');\n\n// ============================================================================\n// sanitizeHtml\n// ============================================================================\n\n/**\n * HTML sanitization for XSS mitigation using regex-based filtering.\n *\n * Faster than DOMParser but relies on pattern matching.\n * Neutralizes dangerous attributes (`on*`, protocols) instead of removing\n * them entirely, so the surrounding markup structure is preserved.\n *\n * **This is the final sanitization layer.** No additional sanitizer runs\n * downstream. For user-controlled rich text (WYSIWYG, markdown output, etc.)\n * use a dedicated library such as DOMPurify instead of or on top of this.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n let safe = String(html ?? '');\n\n // 0. Pre-process: Remove null bytes and control characters (bypass vectors)\n // These are often used to bypass regex filters while browsers ignore them.\n safe = safe.replace(STRIP_CTRL_RE, '');\n\n // 0b. Decode numeric HTML entities (&#NNN; / &#xHH;) and dangerous named\n // entities so that protocol-bypass vectors like \"javascript:\" are\n // normalised to their literal characters before the dangerous-tag and\n // dangerous-protocol regexes run.\n safe = safe.replace(DECODE_NUMERIC_ENTITY_RE, (_, hex, dec) =>\n String.fromCodePoint(hex ? parseInt(hex, 16) : parseInt(dec, 10))\n );\n safe = safe.replace(DECODE_NAMED_ENTITY_RE, (_, name) => NAMED_ENTITY_MAP[name] ?? '');\n\n // 1. Remove dangerous tags (script, iframe, style, etc.) and their content.\n // Note: <svg> and <math> are intentionally kept — they have legitimate uses\n // (icons, equations). Their event handlers (on*) are neutralized in step 3.\n // Also strip XML processing instructions <?...?> (abused in some parsers).\n safe = safe.replace(STRIP_XML_RE, '');\n\n // Loop tag removal to prevent nested reassembly bypass (e.g. \"<scr<script>ipt>\").\n let prev: string;\n do {\n prev = safe;\n safe = safe.replace(DANGEROUS_TAG_RE, '');\n } while (safe !== prev);\n\n // 2. Neutralize dangerous protocols (javascript:, vbscript:).\n // Whitespace-tolerant regex handles obfuscation like \"j a v a s c r i p t:\".\n safe = safe.replace(DANGEROUS_PROTOCOL_GLOBAL_RE, 'data-unsafe-protocol:');\n\n // Neutralize dangerous data URIs (text/html, application/javascript, image/svg+xml, etc.).\n // Common inline images (data:image/png, data:image/jpeg, etc.) are preserved.\n safe = safe.replace(DANGEROUS_DATA_URI_RE, 'data-unsafe-protocol:');\n\n // 3. Neutralize event handler attributes (on* = → data-unsafe-attr=).\n safe = safe.replace(UNSAFE_ATTR_RE, 'data-unsafe-attr=');\n\n // 4. Neutralize CSS expressions (IE legacy) and -moz-binding.\n safe = safe.replace(DANGEROUS_CSS_GLOBAL_RE, 'data-unsafe-css:');\n\n return safe;\n}\n\n// ============================================================================\n// Security guards (used by the binding layer)\n// ============================================================================\n\n/**\n * Returns `true` when `attrName` is a URL-bearing attribute and `value`\n * contains a `javascript:` or `vbscript:` protocol.\n *\n * Only single-URL attributes are checked (see `URL_ATTRS`). `srcset` is\n * excluded because its comma-separated format requires per-URL parsing that\n * this function does not perform.\n *\n * Used by `bindAttr` to guard URL-bearing attributes.\n */\nexport function isDangerousUrl(attrName: string, value: string): boolean {\n if (!URL_ATTRS.has(attrName.toLowerCase())) return false;\n return DANGEROUS_PROTOCOL_RE.test(value);\n}\n\n/**\n * Returns `true` when a CSS property value contains a dangerous protocol\n * inside a `url()` function (e.g. `background-image: url(\"javascript:…\")`).\n *\n * Uses a non-global regex to avoid `lastIndex` statefulness between calls.\n */\nexport function isDangerousCssValue(value: string): boolean {\n // Fast pre-check avoids running the full regex on every CSS value.\n if (!value.toLowerCase().includes('url(')) return false;\n return DANGEROUS_CSS_URL_RE.test(value);\n}\n","import { computed, effect, isAtom, type ReadonlyAtom, untracked } from '@but212/atom-effect';\n\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from '@/constants';\nimport {\n type BindingDebugType,\n registerMapEffect,\n registerReactiveEffect,\n} from '@/core/effect-factory';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { debug } from '@/utils/debug';\n\nexport type { BindingContext };\n\nimport { hasOwn, isPromise } from '@/utils';\n\nimport {\n DANGEROUS_PROTOCOL_RE,\n isDangerousCssValue,\n sanitizeHtml,\n URL_ATTRS,\n} from '@/utils/sanitize';\n\n// Cache for CSS property camelization to avoid repeated regex overhead.\n// Uses Map instead of a plain object to avoid prototype pollution risk and\n// for clearer semantics — CSS property names are a small, finite set so the\n// cache is effectively bounded in practice.\nconst camelCache = new Map<string, string>();\nfunction getCamelCase(prop: string): string {\n let cached = camelCache.get(prop);\n if (cached !== undefined) return cached;\n\n cached = prop.includes('-') ? prop.replace(/-./g, (m) => m[1]!.toUpperCase()) : prop;\n camelCache.set(prop, cached);\n return cached;\n}\n\n/**\n * Cache for sanitized versions of reactive strings.\n * Ensures that if 100 elements are bound to the same atom, sanitizeHtml() is\n * called only once per update instead of 100 times.\n */\nconst htmlSanitizeCache = new WeakMap<\n ReadonlyAtom<string | Promise<string>>,\n ReadonlyAtom<string | Promise<string>>\n>();\n\nfunction getSanitizedHtml(\n source: ReadonlyAtom<string | Promise<string>>\n): ReadonlyAtom<string | Promise<string>> {\n let cached = htmlSanitizeCache.get(source);\n if (!cached) {\n cached = computed(() => {\n const val = source.value;\n if (isPromise(val)) {\n return val.then((v: string) => sanitizeHtml(v));\n }\n return sanitizeHtml(val);\n });\n htmlSanitizeCache.set(source, cached);\n }\n return cached;\n}\n\n// ============================================================================\n// Binding Context Factory\n// ============================================================================\n\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n el,\n trackCleanup: (fn) => registry.trackCleanup(el, fn),\n };\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\n/**\n * Updates element text content.\n */\nexport function bindText<T = unknown>(\n ctx: BindingContext,\n value: AsyncReactiveValue<T>,\n formatter?: (val: T) => string\n): void {\n const el = ctx.el;\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const newVal = formatter ? formatter(val) : typeof val === 'string' ? val : String(val ?? '');\n if (el.textContent !== newVal) {\n el.textContent = newVal;\n }\n },\n 'text'\n );\n}\n\n/**\n * Updates element inner HTML with XSS sanitization.\n */\nexport function bindHtml(ctx: BindingContext, value: AsyncReactiveValue<string>): void {\n const el = ctx.el;\n\n const reactiveSource = isAtom(value)\n ? getSanitizedHtml(value as ReadonlyAtom<string | Promise<string>>)\n : value;\n\n registerReactiveEffect(\n el,\n reactiveSource,\n (val) => {\n const sanitized = reactiveSource === value ? sanitizeHtml(val) : val;\n if (el.innerHTML !== sanitized) {\n registry.cleanupDescendants(el);\n el.innerHTML = sanitized;\n }\n },\n 'html'\n );\n}\n\n/**\n * Toggles multiple CSS classes based on reactive boolean conditions.\n * Grouped into a single effect per element to reduce subscription overhead.\n */\nexport function bindClass(\n ctx: BindingContext,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const el = ctx.el;\n\n // Pre-calculate whitespace-split tokens for each class name once at\n // registration to avoid repeated string manipulation in the update loop.\n const tokenMap: Record<string, string[]> = {};\n for (const className in classMap) {\n if (hasOwn.call(classMap, className)) {\n tokenMap[className] = className.trim().split(/\\s+/).filter(Boolean);\n }\n }\n\n registerMapEffect(\n el,\n classMap,\n (states: Record<string, boolean>) => {\n for (const className in states) {\n const val = states[className];\n const tokens = tokenMap[className]!;\n if (val) {\n el.classList.add(...tokens);\n } else {\n el.classList.remove(...tokens);\n }\n }\n },\n 'class'\n );\n}\n\n/**\n * Updates multiple CSS style properties.\n * Grouped into a single effect per element to reduce subscription overhead.\n */\nexport function bindCss(ctx: BindingContext, cssMap: Record<string, CssValue>): void {\n const el = ctx.el;\n const style = el.style as unknown as Record<string, string>;\n\n // Metadata cache: pre-calculate camelCase names and extraction logic\n // to minimize overhead inside the reactive loop.\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const meta: Record<string, { camel: string; unit: string }> = {};\n\n for (const prop in cssMap) {\n if (hasOwn.call(cssMap, prop)) {\n const val = cssMap[prop]!;\n const [source, unit] = Array.isArray(val) ? val : ([val, ''] as const);\n\n reactiveMap[prop] = source;\n meta[prop] = {\n camel: getCamelCase(prop),\n unit,\n };\n }\n }\n\n registerMapEffect(\n el,\n reactiveMap,\n (states: Record<string, unknown>) => {\n for (const prop in states) {\n const current = states[prop];\n const { camel, unit } = meta[prop]!;\n const strVal = unit ? String(current) + unit : String(current);\n\n if (!isDangerousCssValue(strVal)) {\n if (style[camel] !== strVal) {\n style[camel] = strVal;\n }\n }\n }\n },\n 'css'\n );\n}\n\n/**\n * Binds DOM attributes with security guards and primitive value constraints.\n */\nexport function bindAttr(\n ctx: BindingContext,\n attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>\n): void {\n const el = ctx.el;\n\n // Metadata cache for performance: pre-calculate attribute properties once\n // at registration time to avoid repeated string operations in the update loop.\n const safeMap: Record<string, AsyncReactiveValue<PrimitiveValue>> = {};\n\n const metadataMap: Record<string, { isAria: boolean; isUrl: boolean }> = {};\n\n for (const name in attrMap) {\n if (hasOwn.call(attrMap, name)) {\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`\n );\n continue;\n }\n safeMap[name] = attrMap[name]!;\n metadataMap[name] = {\n isAria: lower.startsWith('aria-'),\n isUrl: URL_ATTRS.has(lower),\n };\n }\n }\n\n // Last written value cache to avoid expensive DOM reads (getAttribute) during updates.\n // Using JS memory is significantly faster than crossing the DOM boundary in benchmarks.\n const valueCache: Record<string, string | null> = {};\n for (const name in safeMap) {\n valueCache[name] = el.getAttribute(name);\n }\n\n registerMapEffect(\n el,\n safeMap,\n (states: Record<string, PrimitiveValue>) => {\n for (const name in states) {\n const value = states[name] as PrimitiveValue;\n const meta = metadataMap[name]!;\n const isAria = meta.isAria;\n\n // Skip removal and dangerous checks for null/undefined/false (except ARIA)\n if (value == null || (value === false && !isAria)) {\n if (valueCache[name] !== null) {\n el.removeAttribute(name);\n valueCache[name] = null;\n }\n continue;\n }\n\n // Standardize value based on attribute type\n const newVal = value === true ? (isAria ? 'true' : name) : String(value);\n\n // Security check: Only run regex on URL-bearing attributes\n if (meta.isUrl && DANGEROUS_PROTOCOL_RE.test(newVal)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n // JS cache check: Only write to DOM if value changed since last write/registration.\n // This bypasses the expensive getAttribute call identified as a bottleneck.\n if (valueCache[name] !== newVal) {\n el.setAttribute(name, newVal);\n valueCache[name] = newVal;\n }\n }\n },\n 'attr'\n );\n}\n\n/**\n * Binds DOM properties. Uses strict property write guards and security filters.\n */\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, AsyncReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n\n // Metadata cache for performance: pre-calculate whether a property carries a\n // URL once at registration time to avoid repeated string operations.\n const safeMap: Record<string, AsyncReactiveValue<unknown>> = {};\n\n const metadataMap: Record<string, { isUrl: boolean }> = {};\n\n for (const name in propMap) {\n if (hasOwn.call(propMap, name)) {\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`\n );\n continue;\n }\n if (DANGEROUS_PROPS.has(name)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)}`);\n continue;\n }\n safeMap[name] = propMap[name]!;\n metadataMap[name] = {\n isUrl: URL_ATTRS.has(lower),\n };\n }\n }\n\n registerMapEffect(\n ctx.el,\n safeMap,\n (states: Record<string, unknown>) => {\n for (const name in states) {\n const val = states[name];\n const isUrl = metadataMap[name]!.isUrl;\n\n // Security check: Only run regex on URL-bearing properties\n if (isUrl && typeof val === 'string' && DANGEROUS_PROTOCOL_RE.test(val)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n // Write guard: only update if the value has actually changed\n if (el[name] !== val) {\n el[name] = val;\n }\n }\n },\n 'prop'\n );\n}\n\n/**\n * Handles visibility (display: none) toggle.\n */\nexport function bindVisibility(\n ctx: BindingContext,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n const el = ctx.el;\n const label: BindingDebugType = invert ? 'hide' : 'show';\n const originalDisplay = el.style.display;\n const showDisplay = originalDisplay === 'none' ? '' : originalDisplay;\n\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const target = invert !== !!val ? showDisplay : 'none';\n if (el.style.display !== target) {\n el.style.display = target;\n }\n },\n label\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n */\nexport function bindVal(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tagName = ctx.el.tagName.toLowerCase();\n if (!VALID_INPUT_TAGS.has(tagName)) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.INVALID_INPUT_ELEMENT(tagName)}`\n );\n return;\n }\n // Wrap raw element only when needed for complex input binding logic\n const { fx, cleanup } = applyInputBinding($(ctx.el), atom, options);\n\n registry.trackEffect(ctx.el, fx);\n ctx.trackCleanup(cleanup);\n}\n\n/**\n * Two-way binding for checkbox/radio checked state.\n */\nexport function bindChecked(ctx: BindingContext, atom: WritableAtom<boolean>): void {\n const el = ctx.el as HTMLInputElement;\n const $el = $(el);\n const isRadio = el.type === 'radio';\n\n const handler = () => {\n const current = el.checked;\n // peek(): equality check in an event handler must not register a dependency.\n if (atom.peek() !== current) {\n atom.value = current;\n if (isRadio && current && el.name) {\n const escapedName = el.name.replace(/\"/g, '\\\\\"');\n const $scope = el.form ? $(el.form) : $(document);\n $scope\n .find(`input[type=\"radio\"][name=\"${escapedName}\"]`)\n .not(el)\n .trigger('change.atomRadioSync');\n }\n }\n };\n (handler as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n\n $el.on('change change.atomRadioSync', handler);\n ctx.trackCleanup(() => $el.off('change change.atomRadioSync', handler));\n\n const fx = effect(() => {\n const val = !!atom.value;\n untracked(() => {\n if (el.checked !== val) {\n el.checked = val;\n if (debug.enabled) debug.domUpdated(LOG_PREFIXES.BINDING, el, 'checked', val);\n }\n });\n });\n registry.trackEffect(el, fx);\n}\n\n// ============================================================================\n// Event Binding Handler\n// ============================================================================\n\nexport function bindEvents(ctx: BindingContext, eventMap: NonNullable<BindingOptions['on']>): void {\n const $el = $(ctx.el);\n $el.on(eventMap);\n ctx.trackCleanup(() => $el.off(eventMap));\n}\n\n/**\n * Binds a single event handler using jQuery's event system for compatibility.\n */\nexport function bindOn(\n ctx: BindingContext,\n event: string,\n handler: (e: JQuery.Event) => void\n): void {\n const $el = $(ctx.el);\n $el.on(event, handler);\n ctx.trackCleanup(() => $el.off(event, handler));\n}\n\n/**\n * Disposes all reactive bindings on an element and its descendants.\n */\nexport function bindUnbind(el: HTMLElement): void {\n registry.cleanupTree(el);\n}\n","import { atom as createAtom, effect, untracked, type WritableAtom } from '@but212/atom-effect';\nimport { getPathValue, setDeepValue } from '@/core/lens';\nimport { registry } from '@/core/registry';\nimport type { ValOptions } from '@/types';\nimport { bindChecked, bindVal, createContext } from './unified';\n\n/**\n * Binds an entire form to a single object-based atom.\n * Optimized for O(1) performance on large forms by avoiding O(N) effect fan-out.\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: ValOptions<unknown> = {}\n): void {\n const elements = form.elements;\n const fieldAtoms = new Map<string, WritableAtom<unknown>>();\n const fieldPaths = new Map<string, string[]>();\n\n // Single effect to watch the root atom and dispatch updates to individual fields.\n // This is the core optimization: instead of N effects subscribing to the root atom\n // (which causes O(N^2) overhead on large forms), only this single effect reacts\n // to root changes and filters updates to only those fields that actually changed.\n const rootDispatcher = effect(() => {\n const rootVal = atom.value; // Subscribes to the root atom once\n untracked(() => {\n for (const [name, fAtom] of fieldAtoms) {\n const parts = fieldPaths.get(name)!;\n const newVal = getPathValue(rootVal, parts);\n if (!Object.is(fAtom.peek(), newVal)) {\n fAtom.value = newVal;\n }\n }\n });\n });\n\n // Track the dispatcher for cleanup when the form is removed.\n registry.trackEffect(form, rootDispatcher);\n\n const getOrFieldAtom = (name: string): WritableAtom<unknown> => {\n let fAtom = fieldAtoms.get(name);\n if (!fAtom) {\n const parts = name.includes('.') ? name.split('.') : [name];\n fieldPaths.set(name, parts);\n\n // Create a leaf atom that only holds the value of this specific field.\n fAtom = createAtom(getPathValue(atom.peek(), parts));\n\n // Separate effect to sync changes from the field atom back to the root atom.\n // This effect only tracks its specific fAtom, so typing in one field\n // does not wake up other field effects.\n const syncToRoot = effect(() => {\n const newVal = fAtom!.value;\n const currentRoot = atom.peek();\n const nextRoot = setDeepValue(currentRoot, parts, 0, newVal);\n\n if (nextRoot !== currentRoot) {\n atom.value = nextRoot as T;\n }\n });\n\n registry.trackEffect(form, syncToRoot);\n fieldAtoms.set(name, fAtom);\n }\n return fAtom;\n };\n\n const bindElement = (el: Element) => {\n if (\n !(\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n )\n ) {\n return;\n }\n const name = el.name;\n if (!name || registry.hasBind(el)) return;\n\n const fieldAtom = getOrFieldAtom(name);\n const controlCtx = createContext(el as HTMLElement);\n\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) {\n bindChecked(controlCtx, fieldAtom as WritableAtom<boolean>);\n } else {\n bindVal(controlCtx, fieldAtom, options);\n }\n };\n\n for (let i = 0, len = elements.length; i < len; i++) {\n bindElement(elements[i]!);\n }\n\n const observer = new MutationObserver((mutations) => {\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const mutation = mutations[i]!;\n if (mutation.type === 'childList') {\n const added = mutation.addedNodes;\n for (let j = 0, aLen = added.length; j < aLen; j++) {\n if (added[j]!.nodeType === 1) {\n const el = added[j] as Element;\n bindElement(el);\n const controls = el.querySelectorAll('input, select, textarea');\n for (let k = 0, cLen = controls.length; k < cLen; k++) {\n bindElement(controls[k]!);\n }\n }\n }\n } else if (mutation.type === 'attributes' && mutation.attributeName === 'name') {\n bindElement(mutation.target as Element);\n }\n }\n });\n\n observer.observe(form, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['name'],\n });\n\n registry.trackCleanup(form, () => observer.disconnect());\n}\n","import $ from 'jquery';\nimport { bindForm } from '@/bindings/form';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindEvents,\n bindHtml,\n bindOn,\n bindProp,\n bindText,\n bindUnbind,\n bindVal,\n bindVisibility,\n createContext,\n} from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssBindings,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nimport { debug } from '@/utils/debug';\n\n/**\n * Internal helper to iterate over a jQuery set and apply a binding function\n * to each Element node. Handles nodeType check and context creation.\n */\nfunction atomEachElement(jq: JQuery, fn: (ctx: BindingContext, el: HTMLElement) => void): JQuery {\n for (let i = 0, len = jq.length; i < len; i++) {\n const el = jq[i]!;\n if (el.nodeType === 1) {\n fn(createContext(el as HTMLElement), el as HTMLElement);\n } else if (debug.enabled) {\n debug.log(LOG_PREFIXES.BINDING, `Skipping non-Element node (nodeType=${el.nodeType})`);\n }\n }\n return jq;\n}\n\n/**\n * Binds element `textContent` to a reactive source.\n */\n$.fn.atomText = function <T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return atomEachElement(this, (ctx) => bindText(ctx, source, formatter));\n};\n\n/**\n * Binds element `innerHTML` to a reactive string source.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (ctx) => bindHtml(ctx, source));\n};\n\n/**\n * Toggles one or more CSS classes based on reactive boolean conditions.\n */\n$.fn.atomClass = function (\n classNameOrMap: string | Record<string, AsyncReactiveValue<boolean>>,\n condition?: AsyncReactiveValue<boolean>\n): JQuery {\n if (typeof classNameOrMap === 'string' && condition === undefined) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_CONDITION('atomClass')}`\n );\n return this;\n }\n const classMap =\n typeof classNameOrMap === 'string' ? { [classNameOrMap]: condition! } : classNameOrMap;\n return atomEachElement(this, (ctx) => bindClass(ctx, classMap));\n};\n\n/**\n * Binds one or more CSS style properties to reactive values.\n */\n$.fn.atomCss = function (\n propOrMap: string | CssBindings,\n source?: AsyncReactiveValue<string | number>,\n unit?: string\n): JQuery {\n if (typeof propOrMap === 'string' && source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n const cssMap: CssBindings =\n typeof propOrMap === 'string'\n ? { [propOrMap]: unit ? [source as ReactiveValue<number>, unit] : source! }\n : propOrMap;\n return atomEachElement(this, (ctx) => bindCss(ctx, cssMap));\n};\n\n/**\n * Binds one or more HTML attributes to reactive values with security guards.\n */\n$.fn.atomAttr = function (\n nameOrMap: string | Record<string, AsyncReactiveValue<PrimitiveValue>>,\n source?: AsyncReactiveValue<PrimitiveValue>\n): JQuery {\n if (typeof nameOrMap === 'string' && source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomAttr')}`);\n return this;\n }\n const attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>> = typeof nameOrMap === 'string'\n ? { [nameOrMap]: source! }\n : nameOrMap;\n\n return atomEachElement(this, (ctx) => bindAttr(ctx, attrMap));\n};\n\n/**\n * Binds one or more DOM properties to reactive values.\n */\n$.fn.atomProp = function <T>(\n nameOrMap: string | Record<string, AsyncReactiveValue<T>>,\n source?: AsyncReactiveValue<T>\n): JQuery {\n if (typeof nameOrMap === 'string' && source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomProp')}`);\n return this;\n }\n const propMap: Record<string, AsyncReactiveValue<unknown>> = typeof nameOrMap === 'string'\n ? { [nameOrMap]: source as AsyncReactiveValue<unknown> }\n : (nameOrMap as Record<string, AsyncReactiveValue<unknown>>);\n\n return atomEachElement(this, (ctx) => bindProp(ctx, propMap));\n};\n\n/**\n * Shows the element when `condition` is truthy (`display: ''`).\n */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx, condition, false));\n};\n\n/**\n * Hides the element when `condition` is truthy (`display: 'none'`).\n */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx, condition, true));\n};\n\n/**\n * Two-way binding for `<input>`, `<select>`, and `<textarea>` values.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return atomEachElement(this, (ctx) =>\n bindVal(ctx, atom as WritableAtom<unknown>, options as ValOptions<unknown>)\n );\n};\n\n/**\n * Two-way binding for checkbox and radio button `checked` state.\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindChecked(ctx, atom));\n};\n\n/**\n * Two-way binding for an entire form.\n *\n * Note: While this API cannot check nested properties from HTML string elements statically,\n * if you know the form structure, the parameter `atom` supports deep-dotted structural paths matching `Paths<T>`.\n */\n$.fn.atomForm = function <T extends object>(\n atom: WritableAtom<T>,\n options: ValOptions<unknown> = {}\n): JQuery {\n return atomEachElement(this, (_ctx, el) => {\n if (el instanceof HTMLFormElement) {\n bindForm(el, atom, options);\n }\n });\n};\n\n/**\n * Attaches a lifecycle-aware event handler using the jQuery event system.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (ctx) => bindOn(ctx, event, handler));\n};\n\n/**\n * Integrated multi-behavior reactive binding.\n */\n$.fn.atomBind = function <T = unknown>(options: BindingOptions<T>): JQuery {\n const { text, html, class: cls, css, attr, prop, show, hide, val, checked, form, on } = options;\n\n const valParsed: { atom: WritableAtom<unknown>; opts: ValOptions<unknown> | undefined } | null =\n val === undefined\n ? null\n : Array.isArray(val)\n ? {\n atom: val[0] as WritableAtom<unknown>,\n opts: val[1] as unknown as ValOptions<unknown>,\n }\n : { atom: val as WritableAtom<unknown>, opts: undefined };\n\n return atomEachElement(this, (ctx) => {\n if (text !== undefined) bindText(ctx, text);\n if (html !== undefined) bindHtml(ctx, html);\n if (cls !== undefined) bindClass(ctx, cls);\n if (css !== undefined) bindCss(ctx, css);\n if (attr !== undefined) bindAttr(ctx, attr);\n if (prop !== undefined) bindProp(ctx, prop);\n if (show !== undefined) bindVisibility(ctx, show, false);\n if (hide !== undefined) bindVisibility(ctx, hide, true);\n if (valParsed !== null) bindVal(ctx, valParsed.atom, valParsed.opts);\n if (checked !== undefined) bindChecked(ctx, checked);\n if (form !== undefined && ctx.el instanceof HTMLFormElement)\n bindForm(ctx.el, form as WritableAtom<object>);\n if (on !== undefined) bindEvents(ctx, on);\n });\n};\n\n/**\n * Destroys all reactive bindings on the selected elements **and their descendants**.\n */\n$.fn.atomUnbind = function (): JQuery {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i]!;\n if (el.nodeType === 1) bindUnbind(el as HTMLElement);\n }\n return this;\n};\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { EffectObject, ListKey, ListKeyFn, ListOptions, ReadonlyAtom } from '@/types';\nimport { getSelector, hasOwn, shallowEqual } from '@/utils';\nimport { ArrayPool } from '@/utils/array-pool';\nimport { debug } from '@/utils/debug';\nimport { ObjectPool } from '@/utils/object-pool';\nimport { sanitizeHtml } from '@/utils/sanitize';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst listInstances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\nlet listBatchIdCounter = 0;\n\n// Pools for avoiding GC pressure during buildIndices\nconst mapPool = new ObjectPool<Map<ListKey, number>>(\n () => new Map(),\n (m) => m.clear()\n);\nconst setPool = new ObjectPool<Set<ListKey>>(\n () => new Set(),\n (s) => s.clear()\n);\nconst arrayPool = new ArrayPool<unknown>(100, 1024);\n\nfunction insertOrAppend(\n $el: JQuery<Element>,\n nextNode: Node | null,\n $container: JQuery<Element>\n): void {\n if (nextNode?.isConnected) ($el as unknown as JQuery).insertBefore(nextNode);\n else ($el as unknown as JQuery).appendTo($container as unknown as JQuery);\n}\n\nfunction wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n// ============================================================================\n// ListContext\n// ============================================================================\n\nclass ListContext<T> {\n oldKeys: ListKey[] = [];\n oldItems: T[] = [];\n oldNodes: (Element | JQuery)[] = [];\n\n readonly removingKeys = new Set<ListKey>();\n $emptyEl: JQuery | null = null;\n readonly keyToIndex = new Map<ListKey, number>();\n fx?: EffectObject;\n\n // Recycled buffers\n statesBuffer = new Uint8Array(256);\n indicesBuffer = new Int32Array(256);\n\n constructor(\n public readonly $container: JQuery,\n /** @internal */\n public readonly containerSelector: string,\n public readonly onRemove: (($el: JQuery) => Promise<void> | void) | undefined\n ) {}\n\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commitRemoval = () => {\n if (this.fx?.isDisposed) return;\n $el.remove();\n this.removingKeys.delete(k);\n debug.log(LOG_PREFIXES.LIST, `${this.containerSelector} removed item:`, k);\n };\n if (!this.onRemove) {\n commitRemoval();\n return;\n }\n const result = this.onRemove($el);\n if (result instanceof Promise) {\n result.then(commitRemoval, commitRemoval);\n } else {\n commitRemoval();\n }\n }\n\n removeItem(k: ListKey, $el: JQuery): void {\n for (let j = 0; j < $el.length; j++) {\n const el = $el[j];\n if (el instanceof Element) {\n el.removeAttribute('data-atom-key');\n }\n }\n this.removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n dispose(): void {\n this.removingKeys.clear();\n this.oldKeys.length = 0;\n this.oldItems.length = 0;\n this.oldNodes.length = 0;\n this.keyToIndex.clear();\n this.$emptyEl?.remove();\n this.$container.off('.atomList');\n\n // Help GC\n const emptyUint = new Uint8Array(0);\n const emptyInt = new Int32Array(0);\n this.statesBuffer = emptyUint;\n this.indicesBuffer = emptyInt;\n }\n\n ensureBuffers(size: number): void {\n if (this.statesBuffer.length < size) {\n this.statesBuffer = new Uint8Array(Math.max(size, this.statesBuffer.length * 2));\n }\n if (this.indicesBuffer.length < size) {\n this.indicesBuffer = new Int32Array(Math.max(size, this.indicesBuffer.length * 2));\n }\n }\n}\n\n// ============================================================================\n// Internal diff types\n// ============================================================================\n\ninterface PreparedDiff<T> {\n newKeys: ListKey[];\n newKeySet: Set<ListKey>;\n newItems: T[];\n newNodes: (Element | JQuery)[];\n newStates: Uint8Array;\n newIndices: Int32Array;\n trKeys: ListKey[];\n trItems: T[];\n trIdxs: number[];\n\n // Trim hints\n startIndex: number;\n oldEndIndex: number;\n newEndIndex: number;\n}\n\ninterface PlaceCallbacks<T> {\n bind: ListOptions<T>['bind'];\n update: ListOptions<T>['update'];\n onAdd: ListOptions<T>['onAdd'];\n onRemove: ListOptions<T>['onRemove'];\n events: ListOptions<T>['events'];\n}\n\n// ============================================================================\n// Step functions\n// ============================================================================\n\nfunction handleEmpty<T>(\n ctx: ListContext<T>,\n itemCount: number,\n $container: JQuery,\n empty: ListOptions<T>['empty']\n): void {\n if (ctx.$emptyEl && itemCount > 0) {\n ctx.$emptyEl.remove();\n ctx.$emptyEl = null;\n }\n\n if (itemCount !== 0) return;\n\n const { oldKeys, oldNodes, onRemove } = ctx;\n if (!onRemove) {\n // Fast path: bulk remove. Since $container.empty() is called below,\n // we don't need to manually remove 'data-atom-key' from each element.\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n ctx.removingKeys.delete(oldKeys[i]!);\n }\n $container.empty();\n } else {\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n const k = oldKeys[i]!;\n const $el = oldNodes[i];\n if ($el) ctx.removeItem(k, wrap($el));\n }\n }\n\n if (empty && !ctx.$emptyEl) {\n const safeEmpty = typeof empty === 'string' ? sanitizeHtml(empty) : empty;\n ctx.$emptyEl = ($(safeEmpty as string) as JQuery).appendTo($container);\n }\n\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes);\n ctx.oldKeys = [];\n ctx.oldItems = [];\n ctx.oldNodes = [];\n}\n\nfunction buildIndices<T>(\n ctx: ListContext<T>,\n items: T[],\n itemCount: number,\n getKey: ListKeyFn<T>,\n update: ListOptions<T>['update'],\n isEqual: ListOptions<T>['isEqual']\n): PreparedDiff<T> {\n const { oldKeys, oldItems, oldNodes, removingKeys, keyToIndex } = ctx;\n const oldLen = oldKeys.length;\n\n // 1. Prefix/Suffix Trimming (Fast-path)\n let startIndex = 0;\n let oldEndIndex = oldLen - 1;\n let newEndIndex = itemCount - 1;\n\n // Skip common prefix\n while (startIndex <= oldEndIndex && startIndex <= newEndIndex) {\n const item = items[startIndex]!;\n const k = getKey(item, startIndex);\n if (oldKeys[startIndex] !== k) break;\n\n // Must also check for equality to skip update\n const oldItem = oldItems[startIndex]!;\n const isSame = isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item);\n if (!isSame) break;\n\n // Prefix persists, but update index in case of previous shifts\n keyToIndex.set(k, startIndex);\n startIndex++;\n }\n\n // Skip common suffix\n while (oldEndIndex >= startIndex && newEndIndex >= startIndex) {\n const item = items[newEndIndex]!;\n const k = getKey(item, newEndIndex);\n if (oldKeys[oldEndIndex] !== k) break;\n\n const oldItem = oldItems[oldEndIndex]!;\n const isSame = isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item);\n if (!isSame) break;\n\n keyToIndex.set(k, newEndIndex);\n oldEndIndex--;\n newEndIndex--;\n }\n\n // 2. Allocation & Pooling\n const oldIndexMap = mapPool.acquire();\n for (let i = startIndex; i <= oldEndIndex; i++) {\n oldIndexMap.set(oldKeys[i]!, i);\n }\n\n const newKeys = arrayPool.acquire() as ListKey[];\n newKeys.length = itemCount;\n\n const newKeySet = setPool.acquire();\n ctx.ensureBuffers(itemCount);\n\n const newItems = arrayPool.acquire() as T[];\n newItems.length = itemCount;\n\n const newNodes = arrayPool.acquire() as (Element | JQuery)[];\n newNodes.length = itemCount;\n\n const newStates = ctx.statesBuffer; // 0=idle, 1=new, 2=replaced\n const newIndices = ctx.indicesBuffer;\n\n const trKeys = arrayPool.acquire() as ListKey[];\n const trItems = arrayPool.acquire() as T[];\n const trIdxs = arrayPool.acquire() as number[];\n\n // 3. Process Trimmed Zones\n // Prefix\n for (let i = 0; i < startIndex; i++) {\n newKeys[i] = oldKeys[i]!;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[i]!;\n newStates[i] = 3; // 3=trimmed (fast skip)\n newIndices[i] = i;\n }\n // Suffix\n for (let j = oldLen - 1, i = itemCount - 1; i > newEndIndex; i--, j--) {\n newKeys[i] = oldKeys[j]!;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[j]!;\n newStates[i] = 3; // 3=trimmed (fast skip)\n newIndices[i] = j;\n }\n\n // 4. Process Middle Zone (Diffing)\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!;\n const k = getKey(item, i);\n newKeys[i] = k;\n newItems[i] = item;\n keyToIndex.set(k, i);\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.LIST.DUPLICATE_KEY(k, i, ctx.containerSelector));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const oldIdx = oldIndexMap.get(k);\n if (oldIdx === undefined) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newIndices[i] = -1;\n newStates[i] = 1;\n continue;\n }\n\n const oldItem = oldItems[oldIdx]!;\n newNodes[i] = oldNodes[oldIdx]!;\n\n const isSame = isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item);\n if (!update && oldItem !== item && !isSame) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newStates[i] = 2;\n } else {\n newStates[i] = 0;\n }\n newIndices[i] = removingKeys.has(k) ? -1 : oldIdx;\n }\n\n // Clean up pools\n mapPool.release(oldIndexMap);\n\n return {\n newKeys,\n newKeySet,\n newItems,\n newNodes,\n newStates,\n newIndices,\n trKeys,\n trItems,\n trIdxs,\n startIndex,\n oldEndIndex,\n newEndIndex,\n };\n}\n\nfunction renderItems<T>(\n diff: PreparedDiff<T>,\n options: ListOptions<T>,\n isInitial: boolean\n): string[] | null {\n const { trKeys, trItems, trIdxs, newNodes, newStates } = diff;\n const renderCount = trKeys.length;\n const render = options.render;\n\n const renderResults: Array<string | Element | DocumentFragment | JQuery> = new Array(renderCount);\n const htmlParts: string[] = [];\n let stringRenderCount = 0;\n\n for (let t = 0; t < renderCount; t++) {\n const raw = render(trItems[t]!, trIdxs[t]!);\n renderResults[t] = raw;\n if (typeof raw === 'string') {\n htmlParts.push(raw);\n stringRenderCount++;\n }\n }\n\n let sanitizedFragments: string[] | null = null;\n const htmlPartCount = htmlParts.length;\n if (htmlPartCount > 0) {\n if (htmlPartCount === 1) {\n sanitizedFragments = [sanitizeHtml(htmlParts[0]!)];\n } else {\n const batchId = (listBatchIdCounter++).toString(36);\n const batchSeparator = `<template data-atom-sep=\"${batchId}\"></template>`;\n sanitizedFragments = sanitizeHtml(htmlParts.join(batchSeparator)).split(batchSeparator);\n }\n }\n\n const useInnerHtml =\n isInitial &&\n sanitizedFragments &&\n stringRenderCount === renderCount &&\n !options.bind &&\n !options.onAdd &&\n !options.onRemove &&\n !options.events;\n\n if (useInnerHtml) {\n return sanitizedFragments;\n }\n\n let fragIdx = 0;\n for (let t = 0; t < renderCount; t++) {\n const raw = renderResults[t]!;\n const $el =\n typeof raw === 'string' ? $(sanitizedFragments![fragIdx++]!) : ($(raw as never) as JQuery);\n\n const targetIdx = trIdxs[t]!;\n const state = newStates[targetIdx]!;\n const key = trKeys[t]!;\n\n // Attach key for efficient event delegation.\n // Use targetIdx directly on el to avoid redundant JQuery wrapping.\n const keyStr = String(key);\n for (let j = 0, elLen = $el.length; j < elLen; j++) {\n const node = $el[j];\n if (node instanceof Element) {\n node.setAttribute('data-atom-key', keyStr);\n }\n }\n\n if (state === 2) {\n const oldEl = newNodes[targetIdx];\n if (oldEl) {\n const $old = wrap(oldEl);\n for (let j = 0, oldLen = $old.length; j < oldLen; j++) {\n const node = $old[j];\n if (node) registry.cleanupTree(node as Element);\n }\n $old.replaceWith($el);\n }\n }\n\n newNodes[targetIdx] = $el.length === 1 ? ($el[0] as Element) : $el;\n }\n\n return null;\n}\n\nfunction cleanupRemoved<T>(ctx: ListContext<T>, diff: PreparedDiff<T>): void {\n const { startIndex, oldEndIndex, newKeySet } = diff;\n const { oldKeys, oldNodes } = ctx;\n\n // Prefix and Suffix are structural matches, no need to check them for removal.\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = oldKeys[i]!;\n if (newKeySet.has(k)) continue;\n\n const $el = oldNodes[i];\n if ($el) ctx.removeItem(k, wrap($el));\n }\n}\n\nfunction placeItems<T>(\n ctx: ListContext<T>,\n diff: PreparedDiff<T>,\n rawContainer: Element,\n $container: JQuery,\n callbacks: PlaceCallbacks<T>,\n innerHtmlFragments: string[] | null\n): void {\n const { bind, update, onAdd } = callbacks;\n const { newKeys, newItems, newNodes, newStates, newIndices } = diff;\n const itemCount = newKeys.length;\n const isInitial = ctx.oldKeys.length === 0;\n\n if (innerHtmlFragments !== null) {\n // ── Initial render: innerHtml fast path ──────────────\n rawContainer.innerHTML = innerHtmlFragments.join('');\n\n let el = rawContainer.firstElementChild as Element | null;\n for (let i = 0; i < itemCount; i++) {\n if (!el) break;\n const k = newKeys[i]!;\n el.setAttribute('data-atom-key', String(k));\n newNodes[i] = el;\n newStates[i] = 0;\n ctx.removingKeys.delete(k);\n if (debug.enabled)\n debug.domUpdated(LOG_PREFIXES.LIST, $(el) as unknown as JQuery, 'list.add', newItems[i]);\n el = el.nextElementSibling as Element | null;\n }\n return;\n }\n\n if (isInitial) {\n // ── Initial render: accumulate into DocumentFragment ──────────────\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < itemCount; i++) {\n const nodeOrJosh = newNodes[i]!;\n if (nodeOrJosh instanceof Element) {\n fragment.appendChild(nodeOrJosh);\n } else {\n for (let j = 0; j < nodeOrJosh.length; j++) {\n fragment.appendChild(nodeOrJosh[j]!);\n }\n }\n }\n rawContainer.appendChild(fragment);\n } else {\n let nextNode: Node | null = null;\n let minOldIndexSeen = 2147483647; // Max Int32\n\n for (let i = itemCount - 1; i >= 0; i--) {\n const oldIndex = newIndices[i]!;\n const nodeOrJosh = newNodes[i]!;\n\n if (oldIndex !== -1 && oldIndex < minOldIndexSeen) {\n minOldIndexSeen = oldIndex;\n } else {\n const $el = wrap(nodeOrJosh);\n insertOrAppend(\n $el as unknown as JQuery<Element>,\n nextNode,\n $container as unknown as JQuery<Element>\n );\n }\n nextNode = nodeOrJosh instanceof Element ? nodeOrJosh : (nodeOrJosh[0] ?? null);\n }\n }\n\n // ── Post-DOM insertion: apply callbacks ───────────────────────────\n for (let i = 0; i < itemCount; i++) {\n const nodeOrJosh = newNodes[i]!;\n const state = newStates[i]!;\n if (state !== 3) {\n const $el = wrap(nodeOrJosh);\n const item = newItems[i]!;\n if (state === 0) {\n update?.($el, item, i);\n } else {\n bind?.($el, item, i);\n }\n\n if (state === 1) {\n onAdd?.($el);\n const k = newKeys[i]!;\n ctx.removingKeys.delete(k);\n if (debug.enabled) debug.domUpdated(LOG_PREFIXES.LIST, $el, 'list.add', newItems[i]);\n }\n }\n }\n}\n\n// ============================================================================\n// atomList\n// ============================================================================\n\n$.fn.atomList = function <T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const { key, bind, update, onAdd, onRemove, empty, events, isEqual } = options;\n\n const getKey: ListKeyFn<T> =\n typeof key === 'function'\n ? key\n : (item: T, _index: number) => item[key as keyof T] as unknown as ListKey;\n\n const callbacks: PlaceCallbacks<T> = { bind, update, onAdd, onRemove, events };\n\n for (\n let containerIdx = 0, containerLen = this.length;\n containerIdx < containerLen;\n containerIdx++\n ) {\n const rawContainer = this[containerIdx]!;\n const $container = $(rawContainer);\n\n $container.off('.atomList');\n const oldInstance = listInstances.get(rawContainer);\n if (oldInstance) {\n oldInstance.fx.dispose();\n oldInstance.ctx.dispose();\n }\n\n const containerSelector = getSelector(rawContainer);\n const ctx = new ListContext<T>($container, containerSelector, onRemove);\n\n const fx = effect(() => {\n const items = source.value;\n const itemCount = items.length;\n\n untracked(() => {\n handleEmpty(ctx, itemCount, $container, empty);\n if (itemCount === 0) return;\n\n debug.log(LOG_PREFIXES.LIST, `${containerSelector} updating with ${itemCount} items`);\n\n const diff = buildIndices(ctx, items, itemCount, getKey, update, isEqual);\n const isInitial = ctx.oldKeys.length === 0;\n\n const innerHtmlFragments = renderItems(diff, options, isInitial);\n cleanupRemoved(ctx, diff);\n placeItems(ctx, diff, rawContainer, $container, callbacks, innerHtmlFragments);\n\n if (events) {\n // Sync keys that were removed (not handled in buildIndices)\n const { startIndex, oldEndIndex, newKeySet } = diff;\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = ctx.oldKeys[i]!;\n if (!newKeySet.has(k)) {\n ctx.keyToIndex.delete(k);\n }\n }\n }\n\n // Recycle old arrays\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes);\n\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n\n // Release temporary diff resources\n setPool.release(diff.newKeySet);\n arrayPool.release(diff.trKeys);\n arrayPool.release(diff.trItems);\n arrayPool.release(diff.trIdxs);\n });\n });\n\n ctx.fx = fx;\n\n if (events) {\n for (const eventKey in events) {\n if (!hasOwn.call(events, eventKey)) continue;\n const handler = events[eventKey]!;\n\n const spaceIdx = eventKey.indexOf(' ');\n const eventType = spaceIdx === -1 ? eventKey : eventKey.slice(0, spaceIdx);\n const childSelector = spaceIdx === -1 ? null : eventKey.slice(spaceIdx + 1).trim();\n const actualSelector = childSelector ? childSelector : '> *';\n\n const delegateHandler = function (this: Element, e: JQuery.TriggeredEvent) {\n const itemEl = (e.target as Element).closest?.('[data-atom-key]') as HTMLElement | null;\n if (!itemEl) return;\n\n const rawKey = itemEl.getAttribute('data-atom-key');\n if (rawKey === null) return;\n\n // Convert back to number if it was number (ListKey can be string | number)\n let key: ListKey = rawKey;\n if (!ctx.keyToIndex.has(rawKey)) {\n const numKey = Number(rawKey);\n if (!Number.isNaN(numKey) && ctx.keyToIndex.has(numKey)) {\n key = numKey;\n }\n }\n\n const idx = ctx.keyToIndex.get(key);\n if (idx !== undefined) {\n handler.call(itemEl as HTMLElement, ctx.oldItems[idx]!, idx, e);\n }\n };\n\n $container.on(`${eventType}.atomList`, actualSelector, delegateHandler);\n }\n }\n\n registry.trackEffect(rawContainer, fx);\n listInstances.set(rawContainer, { fx, ctx });\n registry.trackCleanup(rawContainer, () => {\n ctx.dispose();\n listInstances.delete(rawContainer);\n });\n }\n\n return this;\n};\n","import { untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { bindUnbind } from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { ComponentFn } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst EMPTY_PROPS = Object.freeze({});\n\n// ============================================================================\n// jQuery plugin methods\n// ============================================================================\n\n/**\n * Mounts a functional component on each selected element.\n *\n * @param component - Function receiving `($el, props)` and returning an\n * optional cleanup callback. See {@link ComponentFn}.\n * @param props - Props passed to the component. When omitted, `P` must be\n * compatible with an empty object (i.e. all fields optional or\n * `P = object`). Passing no props to a component with required fields is\n * a type error that TypeScript will catch at the call site, but only when\n * `props` is explicitly typed — the `{} as P` fallback is not type-safe\n * for components with required fields, which is why the cast is explicit\n * rather than implicit.\n */\n$.fn.atomMount = function <P>(component: ComponentFn<P>, props?: P): JQuery {\n // `props ?? EMPTY_PROPS` is cast to P: when props is omitted, P is\n // constrained by the caller to be compatible with `{}` (all fields optional).\n // The cast is necessary because TypeScript cannot infer the exact type of P\n // from the `props` argument alone, especially for components with required fields.\n const p = (props ?? EMPTY_PROPS) as P;\n\n for (let i = 0, len = this.length; i < len; i++) {\n const rootEl = this[i];\n if (!rootEl) continue;\n\n // Dispose any existing component and its reactive bindings on this element\n // *before* mounting the new one. This ensures a clean slate and uses the\n // same `cleanupTree` path as `atomUnmount` for consistency.\n registry.cleanupTree(rootEl);\n\n const $el = $(rootEl);\n let teardown: ReturnType<typeof component>;\n try {\n // untracked: component setup code must not register dependencies on any\n // outer reactive context (e.g. if atomMount is called inside an effect).\n teardown = untracked(() => component($el, p));\n } catch (err) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.ERROR(component.name), err);\n continue;\n }\n\n if (typeof teardown === 'function') {\n registry.setComponentCleanup(rootEl, teardown);\n }\n }\n\n return this;\n};\n\n/**\n * Unmounts the component and disposes all reactive bindings on each selected\n * element and its descendants.\n *\n * Delegates to `bindUnbind`, which calls `registry.cleanupTree` — performing\n * a recursive cleanup of all reactive bindings on the element and its descendants.\n * This is the same full-subtree cleanup path used by `atomMount` when replacing\n * an existing component.\n */\n$.fn.atomUnmount = function (): JQuery {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i];\n if (el) bindUnbind(el);\n }\n return this;\n};\n","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { computed, atom as createAtom, effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES, ROUTE_DEFAULTS } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, RouteDefinition, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// --- Helper: Safe History API Wrappers ---\nfunction safePushState(data: unknown, url: string | URL | null): boolean {\n try {\n // Second argument (title) is deprecated in the spec and ignored by all\n // browsers — pass an empty string as required by the signature.\n history.pushState(data, '', url);\n return true;\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'PushState failed (likely file:// protocol or security restriction). UI will update, but URL will not.',\n e\n );\n return false;\n }\n}\n\nclass RouterImpl implements Router {\n /**\n * Reactive atom containing the current route name.\n * Exposed as ReadonlyAtom so external code cannot mutate route state\n * without going through navigate(), which keeps URL and atom in sync.\n */\n public currentRoute: ReadonlyAtom<string>;\n public queryParams: ReadonlyAtom<Record<string, string>>;\n\n private config: RouteConfig;\n private isDestroyed = false;\n /**\n * Tracks the route name of the last completed transition.\n * Initialized to empty string so beforeTransition/afterTransition always\n * receive a consistent `from` value — never `from === to` on the first render.\n */\n private previousRoute = '';\n /**\n * Mirrors the browser URL after every committed navigation.\n * Used by handleUrlChange to detect real URL changes (vs. our own\n * programmatic updates) and by restoreUrl to roll back blocked transitions.\n */\n private previousUrl: string;\n private cleanups: Array<() => void> = [];\n\n private $target: JQuery;\n private isHistoryMode: boolean;\n private currentRouteAtom: WritableAtom<string>;\n private queryParamsAtom: WritableAtom<Record<string, string>>;\n /** Caches resolved HTMLTemplateElement references to avoid repeated querySelector calls. */\n private templateCache = new Map<string, HTMLTemplateElement>();\n /** Pre-calculated base path with trailing slash stripped for consistent URL building. */\n private normalizedBasePath: string;\n /**\n * Resolved CSS class for active links. Never `undefined` at runtime as it's\n * always filled from `ROUTE_DEFAULTS.activeClass` in the constructor.\n */\n private activeClass: string;\n\n private routeCleanups: Array<() => void> = [];\n private lastRawQuery: string = '';\n private cachedParams: Record<string, string> = {};\n\n constructor(config: RouteConfig) {\n // Destructure configuration with defaults for internal use\n this.config = {\n ...config,\n mode: config.mode ?? ROUTE_DEFAULTS.mode,\n basePath: config.basePath ?? ROUTE_DEFAULTS.basePath,\n autoBindLinks: config.autoBindLinks ?? ROUTE_DEFAULTS.autoBindLinks,\n activeClass: config.activeClass ?? ROUTE_DEFAULTS.activeClass,\n };\n\n this.isHistoryMode = this.config.mode === 'history';\n this.$target = $(this.config.target);\n // Strip trailing slash so URL construction is always `${base}/${route}`.\n this.normalizedBasePath = this.config.basePath?.replace(/\\/$/, '') || '';\n this.activeClass = this.config.activeClass ?? ROUTE_DEFAULTS.activeClass;\n\n // Initialize previousUrl based on current state before setting up atoms.\n // getCurrentUrl() cannot be called yet (method depends on isHistoryMode which is set above).\n this.previousUrl = this.isHistoryMode\n ? window.location.pathname + window.location.search\n : window.location.hash;\n\n // Initialize state atoms; expose via ReadonlyAtom to prevent external mutation.\n this.currentRouteAtom = createAtom(this.getRouteName());\n this.currentRoute = this.currentRouteAtom;\n this.queryParamsAtom = createAtom(this.getQueryParams());\n // Use computed() to ensure queryParams is truly read-only at runtime,\n // as verified by the 'should be read-only (computed)' test.\n this.queryParams = computed(() => this.queryParamsAtom.value);\n\n // Bind methods that are used as callbacks\n this.handleUrlChange = this.handleUrlChange.bind(this);\n this.destroy = this.destroy.bind(this);\n\n // Initialize\n this.init();\n }\n\n private init() {\n const eventName = this.isHistoryMode ? 'popstate' : 'hashchange';\n window.addEventListener(eventName, this.handleUrlChange);\n this.cleanups.push(() => window.removeEventListener(eventName, this.handleUrlChange));\n\n // Set up reactive rendering effect.\n // The renderRoute call is now TRACKED. If user hooks (like render) read\n // atoms, this effect will automatically re-run and seamlessly update the route.\n const renderEffect = effect(() => {\n const routeName = this.currentRouteAtom.value; // primary tracked dependency\n\n // Cleanup headless effects from previous route render\n untracked(() => {\n const cleanups = this.routeCleanups;\n for (let i = 0, len = cleanups.length; i < len; i++) {\n try {\n cleanups[i]!();\n } catch (e) {\n debug.warn(LOG_PREFIXES.ROUTE, 'Cleanup error during route transition:', e);\n }\n }\n cleanups.length = 0;\n });\n\n this.renderRoute(routeName); // user hooks run TRACKED\n });\n this.cleanups.push(() => renderEffect.dispose());\n\n // Auto-bind navigation links\n this.setupAutoBindLinks();\n\n // Auto-cleanup router if target element is removed\n if (this.$target[0]) {\n registry.trackCleanup(this.$target[0], this.destroy);\n }\n }\n\n // --- Mode-abstracted internal methods ---\n\n /**\n * Extracts route name from current URL.\n * Uses `normalizedBasePath` for consistent stripping in history mode.\n */\n private getRouteName(): string {\n const defaultRoute = this.config.default;\n\n if (this.isHistoryMode) {\n const pathname = window.location.pathname;\n let start = 0;\n\n const base = this.normalizedBasePath;\n if (base && pathname.startsWith(base)) {\n start = base.length;\n }\n\n // Remove leading slash (optimized: charCodeAt avoids substring allocation)\n if (pathname.charCodeAt(start) === 47) {\n start++;\n }\n\n const route = start === 0 ? pathname : pathname.substring(start);\n return route || defaultRoute;\n }\n\n // Hash mode\n const hash = window.location.hash;\n if (hash.length <= 1) return defaultRoute;\n\n const qIndex = hash.indexOf('?');\n const routeName = qIndex === -1 ? hash.substring(1) : hash.substring(1, qIndex);\n return routeName || defaultRoute;\n }\n\n /**\n * Parses query parameters from the current URL.\n *\n * Note: duplicate keys (e.g. `?a=1&a=2`) are collapsed to the last value\n * only (`{ a: '2' }`). This matches `URLSearchParams` → `Object.fromEntries`\n * behaviour. If multi-value keys are needed, access `queryParams` via\n * `new URLSearchParams(window.location.search).getAll('key')` directly.\n *\n * Malformed percent-encoding (e.g. `%FF%FE`) is handled silently by\n * `URLSearchParams` — it replaces undecodable sequences with the replacement\n * character (U+FFFD) and continues parsing. If malformed encoding is detected,\n * a warning is emitted via `debug.warn`, but the best-effort parsed result\n * is still returned.\n */\n private getQueryParams(): Record<string, string> {\n let raw: string = '';\n\n if (this.isHistoryMode) {\n raw = window.location.search.substring(1); // Remove leading '?'\n } else {\n const hash = window.location.hash;\n const qIndex = hash.indexOf('?');\n if (qIndex !== -1) {\n raw = hash.substring(qIndex + 1);\n }\n }\n\n if (raw === this.lastRawQuery) {\n return this.cachedParams;\n }\n\n const newParams: Record<string, string> = {};\n if (raw) {\n const sp = new URLSearchParams(raw);\n // forEach is faster than entries iterator for building the record\n sp.forEach((val, key) => {\n newParams[key] = val;\n });\n }\n\n // Compare newParams with this.cachedParams to mutate only if changed.\n let changed = false;\n const oldParams = this.cachedParams;\n const oldKeys = Object.keys(oldParams);\n const newKeys = Object.keys(newParams);\n\n if (oldKeys.length !== newKeys.length) {\n changed = true;\n } else {\n for (let i = 0, len = newKeys.length; i < len; i++) {\n const key = newKeys[i]!;\n if (oldParams[key] !== newParams[key]) {\n changed = true;\n break;\n }\n }\n }\n\n if (changed) {\n this.cachedParams = newParams;\n }\n this.lastRawQuery = raw;\n\n // Warn about malformed percent-encoded sequences\n if (raw.includes('%')) {\n try {\n decodeURIComponent(raw);\n } catch (_e) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.MALFORMED_URI(raw));\n }\n }\n\n return this.cachedParams;\n }\n\n /**\n * Updates the browser URL to reflect a new route and keeps `previousUrl`\n * in sync so `handleUrlChange` does not re-process our own navigation.\n */\n private setUrl(routeName: string): void {\n if (this.isHistoryMode) {\n const url = `${this.normalizedBasePath}/${routeName}`;\n safePushState(null, url);\n this.previousUrl = url;\n } else {\n const hash = `#${routeName}`;\n window.location.hash = hash;\n this.previousUrl = hash;\n }\n }\n\n /**\n * Restores the URL when a navigation guard blocks the transition.\n * Uses pushState to safely add a new history entry, avoiding \"back button traps\"\n * that occur with replaceState during popstate events.\n */\n private restoreUrl(): void {\n if (this.isHistoryMode) {\n safePushState(null, this.previousUrl);\n } else {\n window.location.hash = this.previousUrl;\n }\n }\n\n /**\n * Returns the current full URL string for comparison purposes.\n */\n private getCurrentUrl(): string {\n if (this.isHistoryMode) {\n return window.location.pathname + window.location.search;\n }\n return window.location.hash;\n }\n\n // --- End mode-abstracted methods ---\n\n /**\n * Resolves route configuration, falling back to notFound route if needed.\n */\n private getRouteConfig(routeName: string): RouteDefinition | null {\n const { routes, notFound } = this.config;\n let routeConfig = routes[routeName];\n\n // Fallback to notFound route if route doesn't exist\n if (!routeConfig && notFound) {\n routeConfig = routes[notFound];\n }\n\n if (!routeConfig) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.NOT_FOUND(routeName));\n return null;\n }\n\n return routeConfig;\n }\n\n /**\n * Appends cloned template content into the target container.\n * Always appends — callers are responsible for calling `$target.empty()`\n * before invoking this method if a clean slate is needed.\n */\n private renderTemplate(templateSelector: string): boolean {\n let template = this.templateCache.get(templateSelector);\n\n if (!template) {\n const el = document.querySelector(templateSelector);\n if (!el || !(el instanceof HTMLTemplateElement)) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.TEMPLATE_NOT_FOUND(templateSelector));\n return false;\n }\n template = el;\n this.templateCache.set(templateSelector, template);\n }\n\n const clonedContent = template.content.cloneNode(true) as DocumentFragment;\n this.$target.append(clonedContent);\n\n return true;\n }\n\n /**\n * Renders the specified route, including lifecycle hooks and content.\n *\n * Called from within a reactive effect, so DOM mutations here run\n * synchronously inside the effect body. `registry.cleanupDescendants` is\n * called before `$target.empty()` to ensure any reactive bindings on\n * outgoing content are disposed before the nodes are removed — preventing\n * the MutationObserver auto-cleanup path from firing a redundant cleanup.\n *\n * EXCEPTION BEHAVIOUR:\n * - `beforeTransition` throws → render aborted, outgoing DOM intact,\n * `previousRoute` unchanged. Intentional: a throwing hook signals that\n * the transition should not proceed.\n * - `onEnter` throws → container is already empty (`$target.empty()` ran),\n * rendering is skipped, and `previousRoute` is NOT updated. The router\n * is left in an empty-container / stale-previousRoute state. This behavior\n * is by design to prevent unintended state changes if the `onEnter` hook fails.\n * If recovery is needed, the hook should catch its own errors internally.\n */\n private renderRoute(routeName: string): void {\n if (this.isDestroyed) return;\n\n // Validate target element exists\n const container = this.$target[0];\n if (!container) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.TARGET_NOT_FOUND(this.config.target));\n return;\n }\n\n // Resolve route configuration\n const routeConfig = this.getRouteConfig(routeName);\n if (!routeConfig) return;\n\n // Parse query parameters\n const params = this.getQueryParams();\n const fromRoute = this.previousRoute;\n\n // Call beforeTransition hook.\n // Untracked to prevent hooks from accidentally subscribing to renderEffect\n const { beforeTransition, afterTransition } = this.config;\n if (beforeTransition) {\n untracked(() => beforeTransition(fromRoute, routeName));\n }\n\n // Dispose reactive bindings on outgoing content before clearing the DOM.\n // $.fn.empty() (patched via jquery-patch) handles cleanupDescendants automatically.\n this.$target.empty();\n\n // Call onEnter hook and merge params\n let routeParams = params;\n const { onEnter } = routeConfig;\n\n if (onEnter) {\n // Untracked to prevent onEnter from creating unintended dependencies\n const result = untracked(() => onEnter!(params, this));\n if (result !== undefined) {\n routeParams = { ...params, ...result };\n }\n }\n\n const onUnmount = (cleanupFn: () => void) => {\n this.routeCleanups.push(cleanupFn);\n };\n\n // Render content (custom render or template)\n if (routeConfig.render) {\n routeConfig.render(container, routeName, routeParams, onUnmount, this);\n } else if (routeConfig.template) {\n if (this.renderTemplate(routeConfig.template)) {\n if (routeConfig.onMount) {\n routeConfig.onMount(this.$target.children(), onUnmount, this);\n }\n }\n }\n\n // Call afterTransition hook\n // Untracked to prevent hooks from accidentally subscribing to renderEffect\n if (afterTransition) {\n untracked(() => afterTransition(fromRoute, routeName));\n }\n\n // Update previous route for next transition\n this.previousRoute = routeName;\n }\n\n /**\n * Handles browser URL change events (hashchange or popstate).\n */\n private handleUrlChange(): void {\n if (this.isDestroyed) return;\n\n const currentUrl = this.getCurrentUrl();\n // Early-exit if URL didn't actually change (e.g., called by our own navigate()).\n if (currentUrl === this.previousUrl) return;\n\n const newRoute = this.getRouteName();\n // peek(): event handler path — reading for comparison only, not to subscribe.\n const oldRouteName = this.currentRouteAtom.peek();\n const params = this.getQueryParams();\n\n if (oldRouteName !== newRoute) {\n // Check onLeave guard for user-driven navigation\n const oldRouteConfig = this.config.routes[oldRouteName];\n if (oldRouteConfig?.onLeave) {\n if (untracked(() => oldRouteConfig.onLeave!(this)) === false) {\n // Navigation blocked — restore the URL without updating previousUrl,\n // so the next real navigation is still detected correctly.\n this.restoreUrl();\n return;\n }\n }\n // Two separate writes — the scheduler's automatic microtask batching\n // guarantees they are flushed together in the next microtask tick,\n // so subscribers always see a consistent snapshot of the (route, params) pair.\n this.currentRouteAtom.value = newRoute;\n this.queryParamsAtom.value = params;\n } else {\n // Same route but URL changed (e.g., query params only)\n // Since renderRoute is now tracked, the atom engine natively handles\n // re-renders if the route's render function accessed queryParamsAtom.value.\n // We don't need onParamsChange or manual renderRoute calls here.\n this.queryParamsAtom.value = params;\n }\n\n // Commit the new URL only after a successful (unblocked) transition.\n this.previousUrl = currentUrl;\n }\n\n /**\n * Sets up automatic binding for navigation links with data-route attribute.\n *\n * Event delegation is attached to `document` (not `$target`) so that\n * `[data-route]` links anywhere in the page — including outside the router's\n * target container — can trigger navigation. This is intentional: nav links\n * typically live in headers or sidebars, not inside the routed content area.\n *\n * Active-link management uses a reactive effect that re-runs only when\n * `currentRoute` changes — more efficient than a persistent MutationObserver.\n */\n private setupAutoBindLinks(): void {\n if (!this.config.autoBindLinks) return;\n\n // 1. Event delegation on document so nav links outside $target are handled.\n const delegateHandler = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const routeAttr = (e.currentTarget as HTMLElement).dataset.route;\n if (routeAttr != null) this.navigate(routeAttr);\n };\n\n $(document).on('click', '[data-route]', delegateHandler);\n this.cleanups.push(() => {\n $(document).off('click', '[data-route]', delegateHandler);\n });\n\n // 2. Active state management — re-runs only when currentRoute changes.\n const activeClass = this.activeClass;\n let prevActiveLinks: HTMLElement[] = [];\n\n const activeLinksEffect = effect(() => {\n const current = this.currentRouteAtom.value; // sole tracked dependency\n // DOM queries and class manipulations run untracked: they must not\n // subscribe the effect to anything beyond currentRouteAtom.\n untracked(() => {\n // 1. Turn off previous active links\n for (let i = 0, len = prevActiveLinks.length; i < len; i++) {\n const el = prevActiveLinks[i]!;\n el.classList.remove(activeClass);\n el.removeAttribute('aria-current');\n }\n\n // 2. Exact match the new target links and turn on\n try {\n const safeSelector = current.replace(/\"/g, '\\\\\"');\n const nodes = document.querySelectorAll<HTMLElement>(`[data-route=\"${safeSelector}\"]`);\n const count = nodes.length;\n const nextLinks = new Array<HTMLElement>(count);\n\n for (let i = 0; i < count; i++) {\n const el = nodes[i]!;\n el.classList.add(activeClass);\n el.setAttribute('aria-current', 'page');\n nextLinks[i] = el;\n }\n\n prevActiveLinks = nextLinks;\n } catch (_e) {\n prevActiveLinks = [];\n }\n });\n });\n\n this.cleanups.push(() => activeLinksEffect.dispose());\n }\n\n /**\n * Navigates to the specified route programmatically.\n *\n * If `routeName` resolves to an empty string after falling back to\n * `config.default`, `setUrl` will be called with an empty string, producing\n * a URL of `${basePath}/` in history mode. Callers should ensure\n * `config.default` is always a non-empty route name.\n */\n public navigate(routeName: string): void {\n if (this.isDestroyed) return;\n\n // peek(): navigate() is called imperatively (not inside an effect), so\n // reading the current route must not register a reactive dependency.\n const currentRouteName = this.currentRouteAtom.peek();\n const currentRouteConfig = this.config.routes[currentRouteName];\n\n if (currentRouteConfig?.onLeave) {\n const canLeave = currentRouteConfig.onLeave(this);\n if (canLeave === false) return; // Navigation blocked\n }\n\n // Resolve empty route name to default route, matching getRouteName behavior\n const resolved = routeName || this.config.default;\n if (!resolved) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'navigate() called with empty routeName and no default configured.'\n );\n return;\n }\n\n // setUrl() updates the browser URL AND sets this.previousUrl so that\n // the resulting hashchange/popstate event (which fires synchronously on\n // some browsers for hash-mode) is ignored by handleUrlChange.\n // This is intentionally different from handleUrlChange, where previousUrl\n // is committed at the END after a successful unblocked transition.\n this.setUrl(resolved);\n // Two separate writes — the scheduler's automatic microtask batching\n // guarantees they are flushed together in the next microtask tick,\n // so subscribers always see a consistent snapshot of the (route, params) pair.\n this.queryParamsAtom.value = {};\n this.currentRouteAtom.value = resolved;\n }\n\n /**\n * Cleans up all event listeners and effects, and releases the template cache.\n * Each cleanup function is called in a try/catch so that a single failing\n * cleanup does not prevent the remaining ones from running.\n */\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n // Swap before iterating: if a cleanup function somehow pushes to\n // this.cleanups (e.g. a misbehaving plugin), those additions are not\n // iterated and do not cause an infinite loop or missed teardown.\n const cleanups = this.cleanups;\n this.cleanups = [];\n\n for (let i = 0, len = cleanups.length; i < len; i++) {\n try {\n cleanups[i]!();\n } catch (e) {\n debug.warn(LOG_PREFIXES.ROUTE, 'Cleanup error during destroy:', e);\n }\n }\n\n // Release cached template references to allow GC.\n this.templateCache.clear();\n }\n}\n\n/**\n * Creates an SPA router with reactive state management.\n * Supports both hash-based and pushState-based (history) routing.\n *\n * This removes boilerplate from manual route handling by:\n * - Automatically tracking URL changes and updating the UI\n * - Managing template rendering with lifecycle hooks\n * - Handling active link states reactively\n * - Providing navigation guard support (onLeave)\n *\n * @param config - Router configuration\n * @returns Router instance with navigate, destroy methods and currentRoute atom\n *\n * @example\n * ```ts\n * const router = $.route({\n * target: '#app',\n * default: 'home',\n * routes: {\n * home: { template: '#tmpl-home' },\n * about: { template: '#tmpl-about' }\n * }\n * });\n * ```\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n/**\n * Register as jQuery static method.\n * `$.extend(obj)` merges into JQueryStatic; use `$.fn.extend(obj)` for instance methods.\n */\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n// ============================================================================\n// atomFetch\n// ============================================================================\n\nclass FetchContext<T> {\n private abortController: AbortController | null = null;\n private readonly ajaxOptionsFn?: () => JQuery.AjaxSettings;\n private readonly staticOptions: JQuery.AjaxSettings;\n private readonly isStaticUrl: boolean;\n private readonly staticUrl?: string;\n private readonly getUrl?: () => string;\n private readonly transformFn: ((val: unknown) => T) | undefined;\n private readonly onErrorFn: ((err: unknown) => void) | undefined;\n\n constructor(urlOrFn: string | (() => string), options: FetchOptions<T>) {\n this.isStaticUrl = typeof urlOrFn === 'string';\n if (this.isStaticUrl) {\n this.staticUrl = urlOrFn as string;\n } else {\n this.getUrl = urlOrFn as () => string;\n }\n\n if (typeof options.ajaxOptions === 'function') {\n this.ajaxOptionsFn = options.ajaxOptions;\n this.staticOptions = {};\n } else {\n this.staticOptions = { ...options.ajaxOptions };\n }\n if (options.method !== undefined) this.staticOptions.method = options.method;\n if (options.headers !== undefined)\n this.staticOptions.headers = { ...this.staticOptions.headers, ...options.headers };\n\n this.transformFn = options.transform;\n this.onErrorFn = options.onError;\n\n this.execute = this.execute.bind(this);\n }\n\n public abort(): void {\n this.abortController?.abort();\n }\n\n public async execute(): Promise<T> {\n this.abortController?.abort();\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n // Evaluate ajaxOptionsFn each time to track reactive atoms inside it.\n // Merge order: staticOptions (method, headers, …) as base, then ajaxOptionsFn()\n // on top so dynamic values can override statics but statics are never lost.\n const dynamicOpts = this.ajaxOptionsFn ? this.ajaxOptionsFn() : {};\n // Deep clone to prevent jQuery from mutating shared objects\n const reqOptions: JQuery.AjaxSettings = $.extend(true, {}, this.staticOptions, dynamicOpts);\n\n // Block jQuery legacy callbacks to prevent fake errors on internal Abort\n reqOptions.success = undefined;\n reqOptions.error = undefined;\n reqOptions.complete = undefined;\n\n reqOptions.url = this.isStaticUrl ? this.staticUrl : this.getUrl!();\n\n const xhr = $.ajax(reqOptions);\n\n signal.onabort = () => xhr.abort();\n if (signal.aborted) xhr.abort();\n\n let raw: unknown;\n try {\n raw = await xhr;\n } catch (err) {\n if (signal.aborted) {\n // Delegate abort handling gracefully to the core computed tracking system.\n // - Superseded aborts: core ignores them (since _promiseId bumps up).\n // - Manual aborts: core catches them, updating state (hasError/isPending).\n const abortErr = new Error('AbortError');\n abortErr.name = 'AbortError';\n throw abortErr;\n }\n\n let finalErr: Error;\n // Normalize jqXHR and other potential rejection values into standard Error instances.\n if (err && typeof (err as JQuery.jqXHR).readyState !== 'undefined') {\n const jXhr = err as JQuery.jqXHR;\n finalErr = new Error(`Network Error: ${jXhr.statusText || 'Unknown'} (${jXhr.status})`);\n (finalErr as FetchError).jqXHR = jXhr;\n } else {\n finalErr = err instanceof Error ? err : new Error(String(err ?? 'Unknown network error'));\n }\n\n const onError = this.onErrorFn;\n if (onError) {\n try {\n // Call without `this` binding to preserve purity of user callback\n onError(finalErr);\n } catch {\n // Ignore errors thrown by onError itself.\n }\n }\n throw finalErr;\n } finally {\n signal.onabort = null;\n if (this.abortController?.signal === signal) this.abortController = null;\n }\n\n // Transform runs synchronously after await, so atoms read here won't be tracked.\n // This is an inherent limitation of async computed.\n // Users who need reactive transform should use a separate synchronous computed.\n const transform = this.transformFn;\n if (transform) {\n try {\n return transform(raw);\n } catch (err) {\n // Surface transform errors via onError callback\n const onError = this.onErrorFn;\n if (onError) {\n try {\n onError(err);\n } catch {\n // Ignore errors thrown by onError itself.\n }\n }\n throw err;\n }\n }\n return raw as T;\n }\n}\n\n$.extend({\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const context = new FetchContext<T>(urlOrFn, options);\n const isLazy = !(options.eager ?? true);\n\n const atomVal = computed(context.execute, {\n defaultValue: options.defaultValue,\n lazy: isLazy,\n });\n\n return Object.assign(atomVal, {\n abort: () => context.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\n },\n});\n","/**\n * atom-effect-jquery\n *\n * Brings reactivity to jQuery.\n *\n * Features:\n * - Full CJK IME Support (Input Method Editor).\n * - Auto-cleanup via MutationObserver (No memory leaks).\n * - Debug Mode: Console logging + Visual Highlighting.\n *\n * Type augmentation note:\n * This package extends both `JQuery` and `JQueryStatic` via global interface\n * merging in `types.ts`. Consumers using the `export default $` path will\n * receive the augmented type automatically because the module's side-effect\n * imports apply the augmentation at import time.\n */\n\nimport $ from 'jquery';\n\n// ============================================================================\n// Plugin registrations (order matters — namespace must come first)\n// ============================================================================\n\n// Registers $.atom, $.computed, $.effect, $.batch, $.untracked,\n// $.isAtom, $.isComputed, $.isReactive, $.nextTick\nimport '@/core/namespace';\n\n// Registers $.fn.atomText/Html/Class/Css/Attr/Prop/Show/Hide/Val/Checked/On/Bind/Unbind.\nimport '@/bindings/chainable';\n\n// Registers $.fn.atomList\nimport '@/bindings/list';\n\n// Registers $.fn.atomMount / $.fn.atomUnmount\nimport '@/bindings/mount';\n\n// Registers $.route\nimport '@/features/route';\n\n// Registers $.atomFetch\nimport '@/features/fetch';\n\n// ============================================================================\n// Runtime initialisation (browser only)\n// ============================================================================\n\nimport { enablejQueryOverrides } from '@/core/jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from '@/core/registry';\n\n// $() runs after DOMContentLoaded, so document.body is guaranteed non-null here.\n// In JSDOM/test environments jQuery calls the callback synchronously.\n$(() => {\n // Wraps jQuery event dispatch in batch() so that rapid user interactions\n // (e.g. typing in an input) batch atom writes into a single reactive flush.\n enablejQueryOverrides();\n\n // Watches document.body for removed elements and disposes their reactive\n // bindings automatically, preventing memory leaks without manual cleanup.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n enableAutoCleanup(document.body!);\n});\n\n// ============================================================================\n// ESM exports — values\n// ============================================================================\n\n// Core primitives — re-exported so consumers do not need to depend on\n// @but212/atom-effect directly.\nexport {\n atom,\n batch,\n computed,\n effect,\n isAtom,\n isComputed,\n untracked,\n} from '@but212/atom-effect';\n\n// jQuery override controls — called automatically on DOM ready, but exposed\n// here for consumers who manage initialisation themselves (e.g. custom roots,\n// shadow DOMs, or environments where the automatic call is not appropriate).\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { atomLens, composeLens, lensFor } from '@/core/lens';\nexport { nextTick } from '@/core/namespace';\nexport { isReactive } from '@/utils';\n\n// Registry API — for advanced lifecycle control (custom roots, manual cleanup).\n// Note: enableAutoCleanup is called automatically on DOM ready with document.body.\n// Call it again only if you need a different root or want to re-initialise.\nexport { disableAutoCleanup, enableAutoCleanup, registry };\n\n// ============================================================================\n// ESM exports — types\n// ============================================================================\n\n// Public-facing types — includes everything needed to fully type-check calls\n// to every exported function and jQuery plugin method.\nexport type {\n // Binding authoring\n BindingOptions,\n ComponentFn,\n // Reactive primitives (core)\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n // Fetch\n FetchOptions,\n // List\n ListOptions,\n Paths,\n PathValue,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n // Routing\n RenderRoute,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n TemplateRoute,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\n// The augmented jQuery object. Consumers importing this receive a $ with all\n// atom-effect plugin methods already typed via global interface merging.\nexport default $;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"atom-effect-jquery.min.js","names":["$"],"sources":["../../core/dist/index.mjs","../src/utils/index.ts","../src/constants.ts","../src/utils/debug.ts","../src/core/namespace.ts","../src/utils/array-pool.ts","../src/utils/object-pool.ts","../src/internal/pool.ts","../src/core/registry.ts","../src/core/jquery-patch.ts","../src/types.ts","../src/bindings/input-binding.ts","../src/core/effect-factory.ts","../src/utils/sanitize.ts","../src/bindings/unified.ts","../src/bindings/form.ts","../src/bindings/chainable.ts","../src/bindings/list.ts","../src/bindings/mount.ts","../src/features/route.ts","../src/features/fetch.ts","../src/index.ts"],"sourcesContent":["var A = {\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}, I = {\n DISPOSED: 1,\n EXECUTING: 8\n}, z = {\n DISPOSED: 1,\n IS_COMPUTED: 2,\n DIRTY: 8,\n IDLE: 16,\n PENDING: 32,\n RESOLVED: 64,\n REJECTED: 128,\n RECOMPUTING: 256,\n HAS_ERROR: 512,\n FORCE_COMPUTE: 1024\n}, a = {\n DISPOSED: 1,\n SYNC: 8,\n NOTIFICATION_SCHEDULED: 16\n}, C = {\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}, et = {\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3\n}, W = {\n MAX_ASYNC_RETRIES: 3,\n MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1\n}, T = {\n UNINITIALIZED: -1,\n MIN: 1\n}, U = 1073741823, Et = { VERSION_BITS: 16 }, Ot = (typeof process < \"u\" && process.env, !1), K = Object.freeze([]), X = class {\n constructor(t, s, e = void 0) {\n this.node = t, this.version = s, this.unsub = e;\n }\n}, dt = class {\n constructor(t, s) {\n this.fn = t, this.sub = s;\n }\n notify(t, s) {\n const e = this.fn;\n if (e !== void 0) {\n e(t, s);\n return;\n }\n const i = this.sub;\n i !== void 0 && i.execute();\n }\n}, N = class extends Error {\n constructor(t, s = null, e = !0) {\n super(t), this.cause = s, this.recoverable = e, this.name = \"AtomError\";\n }\n}, S = class extends N {\n constructor(t, s = null) {\n super(t, s, !0), this.name = \"ComputedError\";\n }\n}, v = class extends N {\n constructor(t, s = null) {\n super(t, s, !1), this.name = \"EffectError\";\n }\n}, P = class extends N {\n constructor(t, s = null) {\n super(t, s, !1), this.name = \"SchedulerError\";\n }\n}, _ = {\n COMPUTED_MUST_BE_FUNCTION: \"Computed target must be a function\",\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: \"Async computation pending with no default value\",\n COMPUTED_COMPUTATION_FAILED: \"Computation execution failed\",\n COMPUTED_ASYNC_COMPUTATION_FAILED: \"Async computation execution failed\",\n COMPUTED_CIRCULAR_DEPENDENCY: \"Circular dependency detected\",\n COMPUTED_DISPOSED: \"Attempted to access disposed computed\",\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\n EFFECT_MUST_BE_FUNCTION: \"Effect target must be a function\",\n EFFECT_EXECUTION_FAILED: \"Effect execution failed\",\n EFFECT_CLEANUP_FAILED: \"Effect cleanup failed\",\n EFFECT_DISPOSED: \"Attempted to run disposed effect\",\n SCHEDULER_FLUSH_OVERFLOW: (t, s) => `Maximum flush iterations (${t}) exceeded. ${s} jobs dropped. Possible infinite loop.`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\n EFFECT_FREQUENCY_LIMIT_EXCEEDED: \"Effect executed too frequently within 1 second. Suspected infinite loop.\",\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: \"Scheduler callback must be a function\",\n SCHEDULER_END_BATCH_WITHOUT_START: \"endBatch() called without matching startBatch(). Ignoring.\",\n BATCH_CALLBACK_MUST_BE_FUNCTION: \"Batch callback must be a function\"\n}, it = class {\n constructor() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._overflow = null, this._freeIndices = null;\n }\n get size() {\n return this._count;\n }\n getAt(t) {\n if (t < 4) switch (t) {\n case 0:\n return this._s0;\n case 1:\n return this._s1;\n case 2:\n return this._s2;\n case 3:\n return this._s3;\n }\n const s = this._overflow;\n if (s !== null) {\n const e = s[t - 4];\n return e === void 0 ? null : e;\n }\n return null;\n }\n setAt(t, s) {\n switch (t) {\n case 0:\n this._s0 = s;\n break;\n case 1:\n this._s1 = s;\n break;\n case 2:\n this._s2 = s;\n break;\n case 3:\n this._s3 = s;\n break;\n default:\n this._overflow ??= [], this._overflow[t - 4] = s;\n }\n t >= this._count && (this._count = t + 1);\n }\n truncateFrom(t) {\n const s = this._count;\n if (t >= s) return;\n if (t <= 3) {\n if (t <= 0) {\n const i = this._s0;\n i != null && (this._onItemRemoved(i), this._s0 = null);\n }\n if (t <= 1) {\n const i = this._s1;\n i != null && (this._onItemRemoved(i), this._s1 = null);\n }\n if (t <= 2) {\n const i = this._s2;\n i != null && (this._onItemRemoved(i), this._s2 = null);\n }\n if (t <= 3) {\n const i = this._s3;\n i != null && (this._onItemRemoved(i), this._s3 = null);\n }\n }\n const e = this._overflow;\n if (e !== null && s > 4) {\n const i = t > 4 ? t - 4 : 0, r = e.length;\n for (let n = i; n < r; n++) {\n const o = e[n];\n o != null && (this._onItemRemoved(o), e[n] = null);\n }\n t <= 4 ? (e.length = 0, this._overflow = null) : e.length = t - 4;\n }\n this._freeIndices !== null && (this._freeIndices = null), this._count = t;\n }\n _onItemRemoved(t) {\n }\n add(t) {\n if (this._s0 === null) {\n this._s0 = t, this._count++;\n return;\n }\n if (this._s1 === null) {\n this._s1 = t, this._count++;\n return;\n }\n if (this._s2 === null) {\n this._s2 = t, this._count++;\n return;\n }\n if (this._s3 === null) {\n this._s3 = t, this._count++;\n return;\n }\n this._addToOverflow(t);\n }\n _addToOverflow(t) {\n const s = this._overflow;\n if (s === null) this._overflow = [t];\n else {\n const e = this._freeIndices;\n e !== null && e.length > 0 ? s[e.pop()] = t : s.push(t);\n }\n this._count++;\n }\n remove(t) {\n if (this._s0 === t)\n return this._s0 = null, this._count--, !0;\n if (this._s1 === t)\n return this._s1 = null, this._count--, !0;\n if (this._s2 === t)\n return this._s2 = null, this._count--, !0;\n if (this._s3 === t)\n return this._s3 = null, this._count--, !0;\n const s = this._overflow;\n if (s == null) return !1;\n for (let e = 0, i = s.length; e < i; e++) if (s[e] === t) {\n s[e] = null, this._count--;\n let r = this._freeIndices;\n return r === null && (r = this._freeIndices = []), r.push(e), !0;\n }\n return !1;\n }\n has(t) {\n if (this._count === 0) return !1;\n if (this._s0 === t || this._s1 === t || this._s2 === t || this._s3 === t) return !0;\n const s = this._overflow;\n if (s != null) {\n for (let e = 0, i = s.length; e < i; e++) if (s[e] === t) return !0;\n }\n return !1;\n }\n forEach(t) {\n const s = this._count;\n if (s === 0) return;\n let e = 0;\n const i = this._s0;\n if (i != null && (t(i), ++e === s))\n return;\n const r = this._s1;\n if (r != null && (t(r), ++e === s))\n return;\n const n = this._s2;\n if (n != null && (t(n), ++e === s))\n return;\n const o = this._s3;\n if (o != null && (t(o), ++e === s))\n return;\n const u = this._overflow;\n if (u != null) for (let l = 0, h = u.length; l < h; l++) {\n const c = u[l];\n if (c != null && (t(c), ++e === s))\n return;\n }\n }\n forEachIndexed(t) {\n const s = this._count;\n if (s === 0) return 0;\n let e = 0;\n const i = this._s0;\n if (i != null && (t(i), ++e === s))\n return e;\n const r = this._s1;\n if (r != null && (t(r), ++e === s))\n return e;\n const n = this._s2;\n if (n != null && (t(n), ++e === s))\n return e;\n const o = this._s3;\n if (o != null && (t(o), ++e === s))\n return e;\n const u = this._overflow;\n if (u != null) for (let l = 0, h = u.length; l < h; l++) {\n const c = u[l];\n if (c != null && (t(c), ++e === s))\n return e;\n }\n return e;\n }\n compact() {\n const t = this._overflow;\n if (t === null) return;\n let s = t.length;\n if (s === 0) return;\n let e = 0;\n for (; e < s; ) if (t[e] === null) {\n for (; s > e && t[s - 1] === null; )\n t.pop(), s--;\n s > e && (t[e] = t.pop(), s--, e++);\n } else e++;\n this._freeIndices = null, s === 0 && (this._overflow = null);\n }\n clear() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._overflow !== null && (this._overflow.length = 0, this._overflow = null), this._freeIndices = null;\n }\n dispose() {\n this.clear();\n }\n}, Z = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), pt = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), J = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), M = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), Ct = class {\n constructor() {\n this.enabled = !1, this.warnInfiniteLoop = et.WARN_INFINITE_LOOP;\n }\n warn(t, s) {\n }\n attachDebugInfo(t, s, e) {\n }\n getDebugName(t) {\n if (t != null)\n return t[Z];\n }\n getDebugType(t) {\n if (t != null)\n return t[J];\n }\n}, Q = new Ct(), It = 1, Dt = () => It++ | 0;\nfunction m(t, s, e) {\n return t instanceof N ? t : t instanceof Error ? new s(`${t.name || t.constructor.name || \"Error\"} (${e}): ${t.message}`, t) : new s(`Unexpected error (${e}): ${String(t)}`);\n}\nvar Y = class {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = T.UNINITIALIZED, this._notifying = 0, this._hotIndex = -1, this._slots = null, this._deps = null, this.id = Dt() & U;\n }\n get isDisposed() {\n return (this.flags & z.DISPOSED) !== 0;\n }\n get isComputed() {\n return (this.flags & z.IS_COMPUTED) !== 0;\n }\n get hasError() {\n return !1;\n }\n subscribe(t) {\n const s = typeof t == \"function\";\n if (!s && (!t || typeof t.execute != \"function\")) throw m(/* @__PURE__ */ new TypeError(\"Invalid subscriber\"), N, _.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n let e = this._slots;\n e || (e = new it(), this._slots = e);\n let i = !1;\n if (e._s0 != null && (s ? e._s0.fn === t : e._s0.sub === t)) i = !0;\n else if (e._s1 != null && (s ? e._s1.fn === t : e._s1.sub === t)) i = !0;\n else if (e._s2 != null && (s ? e._s2.fn === t : e._s2.sub === t)) i = !0;\n else if (e._s3 != null && (s ? e._s3.fn === t : e._s3.sub === t)) i = !0;\n else {\n const n = e._overflow;\n if (n != null) for (let o = 0, u = n.length; o < u; o++) {\n const l = n[o];\n if (l != null && (s ? l.fn === t : l.sub === t)) {\n i = !0;\n break;\n }\n }\n }\n if (i)\n return () => {\n };\n const r = new dt(s ? t : void 0, s ? void 0 : t);\n return e.add(r), () => this._unsubscribe(r);\n }\n _unsubscribe(t) {\n const s = this._slots;\n s && (s.remove(t), this._notifying === 0 && s.compact());\n }\n subscriberCount() {\n const t = this._slots;\n return t === null ? 0 : t.size;\n }\n _notifySubscribers(t, s) {\n const e = this._slots;\n if (!(e === null || e.size === 0)) {\n this._notifying++;\n try {\n let i = e._s0;\n if (i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (i = e._s1, i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (i = e._s2, i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (i = e._s3, i != null) try {\n i.notify(t, s);\n } catch (n) {\n this._logNotifyError(n);\n }\n const r = e._overflow;\n if (r != null) for (let n = 0, o = r.length; n < o; n++) {\n const u = r[n];\n if (u != null) try {\n u.notify(t, s);\n } catch (l) {\n this._logNotifyError(l);\n }\n }\n } finally {\n --this._notifying === 0 && e.compact();\n }\n }\n }\n _logNotifyError(t) {\n console.error(m(t, N, _.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n _isDirty() {\n const t = this._deps;\n if (t === null || t.size === 0) return !1;\n const s = this._hotIndex;\n if (s !== -1) {\n const e = t.getAt(s);\n if (e != null && e.node.version !== e.version) return !0;\n }\n return !t.hasComputeds && !t.isDirtyFast() ? !1 : this._deepDirtyCheck();\n }\n}, x = 0;\nfunction k() {\n const t = x + 1 & U;\n return x = t === 0 ? 1 : t, x;\n}\nfunction G(t) {\n const s = t + 1 & U;\n return s === 0 ? 1 : s;\n}\nvar V = 0, F = !1, nt = 0;\nfunction rt() {\n return nt;\n}\nfunction tt() {\n return F ? !1 : (F = !0, nt = k(), V = 0, !0);\n}\nfunction st() {\n F = !1;\n}\nfunction vt() {\n if (!F) return 0;\n const t = ++V;\n if (t <= C.MAX_EXECUTIONS_PER_FLUSH) return t;\n throw new Error(`[atom-effect] Infinite loop detected: flush execution count exceeded ${C.MAX_EXECUTIONS_PER_FLUSH}`);\n}\nvar St = class {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = C.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get queueSize() {\n return this._size;\n }\n get isBatching() {\n return this._batchDepth > 0;\n }\n schedule(t) {\n const s = this._epoch;\n if (t._nextEpoch === s) return;\n if (t._nextEpoch = s, this._batchDepth > 0 || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n const e = this._bufferIndex, i = this._queueBuffer[e];\n i[this._size++] = t, this._isProcessing || this._flush();\n }\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n _runLoop() {\n try {\n if (this._size === 0) return;\n const t = tt();\n this._drainQueue(), t && st();\n } finally {\n this._isProcessing = !1, this._size > 0 && this._batchDepth === 0 && this._flush();\n }\n }\n _flushSync() {\n this._isFlushingSync = !0;\n const t = tt();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = !1, t && st();\n }\n }\n _mergeBatchQueue() {\n const t = this._batchQueueSize;\n if (t === 0) return;\n const s = ++this._epoch, e = this._batchQueue, i = this._bufferIndex, r = this._queueBuffer[i];\n let n = this._size;\n for (let o = 0; o < t; o++) {\n const u = e[o];\n u._nextEpoch !== s && (u._nextEpoch = s, r[n++] = u);\n }\n this._size = n, this._batchQueueSize = 0, e.length = 0;\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._processQueue(), this._mergeBatchQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, s = this._queueBuffer[t], e = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch = this._epoch + 1 | 0;\n for (let i = 0; i < e; i++) {\n const r = s[i];\n try {\n typeof r == \"function\" ? r() : r.execute();\n } catch (n) {\n console.error(new P(\"Error occurred during scheduler execution\", n));\n }\n }\n s.length = 0;\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize, s = this._maxFlushIterations;\n console.error(new P(_.SCHEDULER_FLUSH_OVERFLOW(s, t))), this._size = 0;\n const e = this._bufferIndex;\n this._queueBuffer[e].length = 0, this._batchQueueSize = 0;\n const i = this.onOverflow;\n if (i) try {\n i(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++;\n }\n endBatch() {\n this._batchDepth !== 0 && --this._batchDepth === 0 && this._flushSync();\n }\n setMaxFlushIterations(t) {\n if (t < C.MIN_FLUSH_ITERATIONS) throw new P(`Max flush iterations must be at least ${C.MIN_FLUSH_ITERATIONS}`);\n this._maxFlushIterations = t;\n }\n}, w = new St(), $ = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), ot = /* @__PURE__ */ Symbol.for(\"atom-effect/computed\"), ut = /* @__PURE__ */ Symbol.for(\"atom-effect/effect\"), gt = /* @__PURE__ */ Symbol.for(\"atom-effect/writable\"), Tt = class {\n constructor() {\n this.current = null;\n }\n run(t, s) {\n if (this.current === t) return s();\n const e = this.current;\n this.current = t;\n try {\n return s();\n } finally {\n this.current = e;\n }\n }\n}, f = new Tt();\nfunction Rt(t) {\n const s = f, e = s.current;\n if (e === null) return t();\n s.current = null;\n try {\n return t();\n } finally {\n s.current = e;\n }\n}\nvar mt = class extends Y {\n constructor(t, s) {\n super(), this[$] = !0, this[gt] = !0, this._value = t, s && (this.flags |= a.SYNC), Q.attachDebugInfo(this, \"atom\", this.id);\n }\n get isNotificationScheduled() {\n return (this.flags & a.NOTIFICATION_SCHEDULED) !== 0;\n }\n get isSync() {\n return (this.flags & a.SYNC) !== 0;\n }\n get value() {\n const t = f.current;\n return t?.addDependency(this), this._value;\n }\n set value(t) {\n const s = this._value;\n if (Object.is(s, t)) return;\n this._value = t, this.version = G(this.version);\n const e = this.flags;\n if ((e & a.NOTIFICATION_SCHEDULED) !== 0) return;\n const i = this._slots;\n i == null || i.size === 0 || (this._pendingOldValue = s, this.flags = e | a.NOTIFICATION_SCHEDULED, (e & a.SYNC) !== 0 && !w.isBatching ? this._flushNotifications() : w.schedule(this));\n }\n execute() {\n this._flushNotifications();\n }\n _flushNotifications() {\n const t = this.flags;\n if ((t & (a.NOTIFICATION_SCHEDULED | a.DISPOSED)) !== a.NOTIFICATION_SCHEDULED) return;\n const s = this._pendingOldValue;\n this._pendingOldValue = void 0, this.flags = t & ~a.NOTIFICATION_SCHEDULED, this._notifySubscribers(this._value, s);\n }\n peek() {\n return this._value;\n }\n dispose() {\n const t = this.flags;\n (t & a.DISPOSED) === 0 && (this._slots?.clear(), this.flags = t | a.DISPOSED, this._value = void 0, this._pendingOldValue = void 0);\n }\n _deepDirtyCheck() {\n return !1;\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n};\nfunction Ft(t, s = {}) {\n return new mt(t, s.sync ?? !1);\n}\nvar lt = class extends it {\n constructor(...t) {\n super(...t), this._map = null, this._SCAN_THRESHOLD = 32, this.hasComputeds = !1, this._depsHash = 0;\n }\n prepareTracking() {\n this.hasComputeds = !1;\n }\n _onItemRemoved(t) {\n const s = t.unsub;\n s && s();\n }\n claimExisting(t, s) {\n const e = this._count;\n if (s >= e) return !1;\n const i = e - s;\n if (this._map !== null || i > this._SCAN_THRESHOLD) return this._claimViaMap(t, s);\n if (s < 4) switch (s) {\n case 0: {\n const n = this._s0;\n if (n && n.node === t && n.unsub)\n return n.version = t.version, !0;\n }\n case 1:\n if (e > 1) {\n const n = this._s1;\n if (n && n.node === t && n.unsub)\n return n.version = t.version, s !== 1 && (this._s1 = this._s0, this._s0 = n), !0;\n }\n case 2:\n if (e > 2) {\n const n = this._s2;\n if (n && n.node === t && n.unsub) {\n if (n.version = t.version, s !== 2) {\n const o = s === 0 ? this._s0 : this._s1;\n s === 0 ? this._s0 = n : this._s1 = n, this._s2 = o;\n }\n return !0;\n }\n }\n case 3:\n if (e > 3) {\n const n = this._s3;\n if (n && n.node === t && n.unsub) {\n if (n.version = t.version, s !== 3) {\n let o;\n s === 0 ? (o = this._s0, this._s0 = n) : s === 1 ? (o = this._s1, this._s1 = n) : (o = this._s2, this._s2 = n), this._s3 = o;\n }\n return !0;\n }\n }\n }\n const r = this._overflow;\n if (r) {\n const n = t.version, o = s > 4 ? s : 4, u = r.length;\n for (let l = o - 4; l < u; l++) {\n const h = r[l];\n if (h && h.node === t && h.unsub)\n return h.version = n, this._swapGeneral(l + 4, s, h), !0;\n }\n }\n return !1;\n }\n _claimViaMap(t, s) {\n let e = this._map;\n if (e === null) {\n e = this._map = /* @__PURE__ */ new Map();\n const n = this._count;\n if (s < 4) {\n const u = this._s0;\n s <= 0 && u?.unsub && e.set(u.node, 0);\n const l = this._s1;\n s <= 1 && l?.unsub && e.set(l.node, 1);\n const h = this._s2;\n s <= 2 && h?.unsub && e.set(h.node, 2);\n const c = this._s3;\n s <= 3 && c?.unsub && e.set(c.node, 3);\n }\n const o = this._overflow;\n if (o && n > 4) {\n const u = s > 4 ? s : 4, l = o.length;\n for (let h = u - 4; h < l; h++) {\n const c = o[h];\n c?.unsub && e.set(c.node, h + 4);\n }\n }\n }\n const i = e.get(t);\n if (i === void 0 || i < s) return !1;\n const r = this.getAt(i);\n if (r == null || !r.unsub) return !1;\n if (r.version = t.version, i !== s) {\n let n;\n s === 0 ? n = this._s0 : s === 1 ? n = this._s1 : s === 2 ? n = this._s2 : s === 3 ? n = this._s3 : n = this._overflow[s - 4] ?? null, this.setAt(s, r), this.setAt(i, n), n?.unsub && e.set(n.node, i), e.set(t, s);\n }\n return !0;\n }\n _swapGeneral(t, s, e) {\n if (t === s) return;\n let i;\n if (s === 0 ? i = this._s0 : s === 1 ? i = this._s1 : s === 2 ? i = this._s2 : s === 3 ? i = this._s3 : i = this._overflow[s - 4] ?? null, this.setAt(s, e), t === 0) this._s0 = i;\n else if (t === 1) this._s1 = i;\n else if (t === 2) this._s2 = i;\n else if (t === 3) this._s3 = i;\n else {\n const r = this._overflow;\n r[t - 4] = i;\n }\n }\n insertNew(t, s) {\n const e = this._count;\n if (t < e) {\n let i;\n t === 0 ? i = this._s0 : t === 1 ? i = this._s1 : t === 2 ? i = this._s2 : t === 3 ? i = this._s3 : i = this._overflow[t - 4] ?? null, i != null && (this._addToOverflow(i), this._map !== null && i.unsub && this._map.set(i.node, this._count - 1));\n }\n if (t === 0) this._s0 = s;\n else if (t === 1) this._s1 = s;\n else if (t === 2) this._s2 = s;\n else if (t === 3) this._s3 = s;\n else {\n let i = this._overflow;\n i || (i = [], this._overflow = i), i[t - 4] = s;\n }\n t >= e && (this._count = t + 1);\n }\n truncateFrom(t) {\n t >= this._count || (super.truncateFrom(t), this._map !== null && (this._map.clear(), this._map = null));\n }\n seal() {\n this._depsHash = this._calculateHash(!1);\n }\n isDirtyFast() {\n return this._calculateHash(!0) !== this._depsHash;\n }\n _calculateHash(t) {\n const s = this._count;\n if (s === 0) return 0;\n const e = Et.VERSION_BITS;\n let i = 0;\n const r = this._s0;\n if (r != null) {\n const n = r.node, o = t ? n.version : r.version;\n i = i + (o << e) + n.id | 0;\n const u = this._s1;\n if (s > 1 && u != null) {\n const l = u.node, h = t ? l.version : u.version;\n i = i + (h << e) + l.id | 0;\n const c = this._s2;\n if (s > 2 && c != null) {\n const q = c.node, ft = t ? q.version : c.version;\n i = i + (ft << e) + q.id | 0;\n const L = this._s3;\n if (s > 3 && L != null) {\n const j = L.node, at = t ? j.version : L.version;\n i = i + (at << e) + j.id | 0;\n }\n }\n }\n }\n if (s > 4) {\n const n = this._overflow;\n for (let o = 0, u = n.length; o < u; o++) {\n const l = n[o], h = l.node, c = t ? h.version : l.version;\n i = i + (c << e) + h.id | 0;\n }\n }\n return i;\n }\n disposeAll() {\n this._count > 0 && this.truncateFrom(0), this.hasComputeds = !1;\n }\n remove(t) {\n throw new Error(\"remove() is strictly prohibited in DepSlotBuffer to preserve sequential cache paths.\");\n }\n compact() {\n }\n};\nfunction wt(t) {\n return typeof t == \"object\" && t !== null && $ in t;\n}\nfunction Ut(t) {\n return typeof t == \"object\" && t !== null && ot in t;\n}\nfunction Lt(t) {\n return typeof t == \"object\" && t !== null && ut in t;\n}\nfunction ht(t) {\n return typeof t == \"object\" && t !== null && typeof t.then == \"function\";\n}\nvar { IDLE: p, DIRTY: E, PENDING: g, RESOLVED: d, REJECTED: D, HAS_ERROR: b, RECOMPUTING: y, DISPOSED: B, IS_COMPUTED: O, FORCE_COMPUTE: H } = z, Nt = class extends Y {\n constructor(t, s = {}) {\n if (typeof t != \"function\") throw new S(_.COMPUTED_MUST_BE_FUNCTION);\n if (super(), this[$] = !0, this[ot] = !0, this._error = null, this._promiseId = 0, this._deps = new lt(), this._asyncRetryCount = 0, this._lastDriftEpoch = T.UNINITIALIZED, this._trackEpoch = T.UNINITIALIZED, this._trackCount = 0, this._value = void 0, this.flags = O | E | p, this._equal = s.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in s ? s.defaultValue : M, this._onError = s.onError ?? null, this._maxAsyncRetries = (s.maxAsyncRetries ?? W.MAX_ASYNC_RETRIES) & U, Q.attachDebugInfo(this, \"computed\", this.id), s.lazy === !1) try {\n this._recompute();\n } catch {\n }\n }\n get isDirty() {\n return (this.flags & E) !== 0;\n }\n get isRejected() {\n return (this.flags & D) !== 0;\n }\n get isRecomputing() {\n return (this.flags & y) !== 0;\n }\n get _hasErrorInternal() {\n return (this.flags & b) !== 0;\n }\n _track() {\n f.current?.addDependency(this);\n }\n get value() {\n const t = f.current;\n t?.addDependency(this);\n let s = this.flags;\n if ((s & (d | E | p)) === d) return this._value;\n if ((s & B) !== 0) throw new S(_.COMPUTED_DISPOSED);\n if ((s & y) !== 0) {\n const r = this._defaultValue;\n if (r !== M) return r;\n throw new S(_.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if ((s & (E | p)) !== 0) {\n const r = this._deps;\n if ((s & p) === 0 && (s & H) === 0 && r.size > 0 && !this._isDirty() ? s = this.flags &= ~E : (this._recompute(), s = this.flags), (s & d) !== 0) return this._value;\n }\n const e = this._defaultValue, i = e !== M;\n if ((s & g) !== 0) {\n if (i) return e;\n throw new S(_.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if ((s & D) !== 0) {\n if (i) return e;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n const t = f.current;\n t?.addDependency(this);\n const s = this.flags;\n return (s & d) !== 0 ? A.RESOLVED : (s & g) !== 0 ? A.PENDING : (s & D) !== 0 ? A.REJECTED : A.IDLE;\n }\n get hasError() {\n const t = f.current;\n if (t?.addDependency(this), (this.flags & (D | b)) !== 0) return !0;\n const s = this._deps;\n if (!s.hasComputeds) return !1;\n const e = s.size;\n for (let i = 0; i < e; i++) if (s.getAt(i)?.node.hasError) return !0;\n return !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n const t = f.current;\n t?.addDependency(this);\n const s = this._error, e = this._deps;\n if (!e.hasComputeds)\n return s == null ? K : Object.freeze([s]);\n const i = [];\n s != null && i.push(s);\n const r = e.size;\n for (let n = 0; n < r; n++) {\n const o = e.getAt(n);\n if (o == null) continue;\n const u = o.node;\n (u.flags & O) !== 0 && u.hasError && this._collectErrorsFromDep(u, i);\n }\n return i.length === 0 ? K : Object.freeze(i);\n }\n _collectErrorsFromDep(t, s) {\n const e = t.errors, i = e.length;\n for (let r = 0; r < i; r++) {\n const n = e[r];\n n != null && !s.includes(n) && s.push(n);\n }\n }\n get lastError() {\n const t = f.current;\n return t?.addDependency(this), this._error;\n }\n get isPending() {\n const t = f.current;\n return t?.addDependency(this), (this.flags & g) !== 0;\n }\n get isResolved() {\n const t = f.current;\n return t?.addDependency(this), (this.flags & d) !== 0;\n }\n invalidate() {\n this.flags |= H, this._markDirty();\n }\n dispose() {\n (this.flags & B) === 0 && (this._deps.disposeAll(), this._slots != null && this._slots.clear(), this.flags = B | E | p, this._error = null, this._value = void 0, this._hotIndex = -1);\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n const s = this._trackEpoch;\n if (t._lastSeenEpoch === s) return;\n t._lastSeenEpoch = s;\n const e = this._trackCount++, i = this._deps, r = i.getAt(e);\n if (r != null && r.node === t) r.version = t.version;\n else if (!i.claimExisting(t, e)) {\n const n = new X(t, t.version, t.subscribe(this));\n i.insertNew(e, n);\n }\n (t.flags & O) !== 0 && (i.hasComputeds = !0);\n }\n _recompute() {\n if (this.isRecomputing) return;\n this.flags = (this.flags | y) & ~H, this._trackEpoch = k(), this._trackCount = 0, this._deps.prepareTracking(), this._hotIndex = -1;\n let t = !1;\n try {\n const s = f.run(this, this._fn);\n this._deps.truncateFrom(this._trackCount), this._deps.seal(), t = !0, ht(s) ? this._handleAsyncComputation(s) : this._finalizeResolution(s);\n } catch (s) {\n if (!t) try {\n this._deps.truncateFrom(this._trackCount);\n } catch {\n }\n this._handleError(s, _.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n this._trackEpoch = T.UNINITIALIZED, this._trackCount = 0, this.flags &= ~y;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | g) & ~(p | E | d | D), this._notifySubscribers(void 0, void 0), this._asyncRetryCount = 0, this._promiseId = (this._promiseId + 1) % W.MAX_PROMISE_ID;\n const s = this._promiseId;\n t.then((e) => {\n if (s === this._promiseId) {\n if (this._isDirty()) {\n const i = rt();\n return this._lastDriftEpoch !== i && (this._lastDriftEpoch = i, this._asyncRetryCount = 0), this._asyncRetryCount++ < this._maxAsyncRetries ? this._markDirty() : this._handleError(new S(`Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`), _.COMPUTED_ASYNC_COMPUTATION_FAILED);\n }\n this._finalizeResolution(e), this._notifySubscribers(e, void 0);\n }\n }, (e) => s === this._promiseId && this._handleError(e, _.COMPUTED_ASYNC_COMPUTATION_FAILED));\n }\n _handleError(t, s, e = !1) {\n const i = m(t, S, s);\n if (!e && !this.isRejected && (this.version = G(this.version)), this._error = i, this.flags = this.flags & ~(p | E | g | d) | D | b, this._onError) try {\n this._onError(i);\n } catch (r) {\n console.error(_.CALLBACK_ERROR_IN_ERROR_HANDLER, r);\n }\n if (e) throw i;\n this._notifySubscribers(void 0, void 0);\n }\n _finalizeResolution(t) {\n const s = this.flags;\n ((s & d) === 0 || !this._equal(this._value, t)) && (this.version = G(this.version)), this._value = t, this._error = null, this.flags = (s | d) & ~(p | E | g | D | b);\n }\n execute() {\n this._markDirty();\n }\n _markDirty() {\n const t = this.flags;\n (t & (y | E)) === 0 && (this.flags = t | E, this._notifySubscribers(void 0, void 0));\n }\n _isDirty() {\n const t = this._deps;\n return t.hasComputeds ? this._deepDirtyCheck() : t.isDirtyFast();\n }\n _deepDirtyCheck() {\n const t = this._deps, s = f.current;\n f.current = null;\n try {\n const e = t.size;\n for (let i = 0; i < e; i++) {\n const r = t.getAt(i);\n if (r == null) continue;\n const n = r.node;\n if ((n.flags & O) !== 0) try {\n n.value;\n } catch {\n }\n if (n.version !== r.version)\n return this._hotIndex = i, !0;\n }\n return this._hotIndex = -1, !1;\n } finally {\n f.current = s;\n }\n }\n};\nfunction Pt(t, s = {}) {\n return new Nt(t, s);\n}\nvar yt = class extends Y {\n constructor(t, s = {}) {\n super(), this[ut] = !0, this._cleanup = null, this._deps = new lt(), this._currentEpoch = T.UNINITIALIZED, this._lastFlushEpoch = T.UNINITIALIZED, this._fn = t, this._onError = s.onError ?? null, this._sync = s.sync ?? !1, this._maxExecutions = s.maxExecutionsPerSecond ?? C.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = s.maxExecutionsPerFlush ?? C.MAX_EXECUTIONS_PER_EFFECT, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._trackCount = 0, this._sync ? this._notifyCallback = () => this.execute() : this._notifyCallback = () => w.schedule(this), Q.attachDebugInfo(this, \"effect\", this.id);\n }\n run() {\n if (this.isDisposed) throw new v(_.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.isDisposed || (this.flags |= I.DISPOSED, this._execCleanup(), this._deps?.disposeAll());\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n if ((this.flags & I.EXECUTING) === 0) return;\n const s = this._currentEpoch;\n if (t._lastSeenEpoch === s) return;\n t._lastSeenEpoch = s;\n const e = this._trackCount++, i = this._deps;\n let r;\n switch (e) {\n case 0:\n r = i._s0;\n break;\n case 1:\n r = i._s1;\n break;\n case 2:\n r = i._s2;\n break;\n case 3:\n r = i._s3;\n break;\n default:\n r = i.getAt(e);\n }\n r != null && r.node === t ? r.version = t.version : i.claimExisting(t, e) || this._insertNewDependency(t, e), t.isComputed && (i.hasComputeds = !0);\n }\n _insertNewDependency(t, s) {\n let e;\n try {\n const i = t.subscribe(this._notifyCallback);\n e = new X(t, t.version, i);\n } catch (i) {\n const r = m(i, v, _.EFFECT_EXECUTION_FAILED);\n if (console.error(r), this._onError) try {\n this._onError(r);\n } catch {\n }\n e = new X(t, t.version, void 0);\n }\n this._deps.insertNew(s, e);\n }\n execute(t = !1) {\n const s = this.flags;\n if ((s & (I.DISPOSED | I.EXECUTING)) !== 0) return;\n const e = this._deps;\n if (!t && e.size > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), this.flags = s | I.EXECUTING, this._execCleanup(), this._currentEpoch = k(), this._trackCount = 0, e.prepareTracking(), this._hotIndex = -1;\n let i = !1;\n try {\n const r = f.run(this, this._fn);\n e.truncateFrom(this._trackCount), e.seal(), i = !0, ht(r) ? this._handleAsyncResult(r) : this._cleanup = typeof r == \"function\" ? r : null;\n } catch (r) {\n if (!i) try {\n e.truncateFrom(this._trackCount);\n } catch {\n }\n this._handleExecutionError(r), this._cleanup = null;\n } finally {\n this.flags &= ~I.EXECUTING;\n }\n }\n _isDirty() {\n const t = this._deps;\n return t.hasComputeds ? this._deepDirtyCheck() : t.isDirtyFast();\n }\n _handleAsyncResult(t) {\n const s = ++this._execId;\n t.then((e) => {\n if (s !== this._execId || this.isDisposed) {\n if (typeof e == \"function\") try {\n e();\n } catch (i) {\n this._handleExecutionError(i, _.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof e == \"function\" && (this._cleanup = e);\n }, (e) => s === this._execId && this._handleExecutionError(e));\n }\n _deepDirtyCheck() {\n const t = f.current;\n f.current = null;\n const s = this._deps;\n try {\n const e = s.size;\n for (let i = 0; i < e; i++) {\n const r = s.getAt(i);\n if (r == null) continue;\n const n = r.node;\n if (n.isComputed && this._tryPullComputed(n), n.version !== r.version)\n return this._hotIndex = i, !0;\n }\n return !1;\n } finally {\n f.current = t;\n }\n }\n _tryPullComputed(t) {\n try {\n t.value;\n } catch {\n }\n }\n _execCleanup() {\n const t = this._cleanup;\n if (t != null) {\n this._cleanup = null;\n try {\n t();\n } catch (s) {\n this._handleExecutionError(s, _.EFFECT_CLEANUP_FAILED);\n }\n }\n }\n _checkInfiniteLoops() {\n const t = rt();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), vt() > C.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++;\n }\n _checkFrequencyLimit() {\n if (!Number.isFinite(this._maxExecutions)) return;\n const t = Date.now();\n if (t - this._windowStart >= et.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = t, this._windowCount = 1;\n return;\n }\n if (++this._windowCount > this._maxExecutions) {\n const s = new v(_.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n throw this.dispose(), this._handleExecutionError(s), s;\n }\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & I.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const s = new v(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${V}`);\n throw this.dispose(), console.error(s), s;\n }\n _handleExecutionError(t, s = _.EFFECT_EXECUTION_FAILED) {\n const e = m(t, v, s);\n if (console.error(e), this._onError) try {\n this._onError(e);\n } catch (i) {\n console.error(m(i, v, _.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Mt(t, s = {}) {\n if (typeof t != \"function\") throw new v(_.EFFECT_MUST_BE_FUNCTION);\n const e = new yt(t, s);\n return e.execute(), e;\n}\nvar At = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), bt = /* @__PURE__ */ Symbol.for(\"atom-effect/writable\");\nfunction ct(t, s, e, i) {\n if (e === s.length) return i;\n const r = s[e], n = t != null && typeof t == \"object\" ? t : {}, o = n[r], u = ct(o, s, e + 1, i);\n if (Object.is(o, u)) return t;\n if (Array.isArray(n)) {\n const l = n.slice(), h = Number.parseInt(r, 10);\n return Number.isNaN(h) ? l[r] = u : l[h] = u, l;\n }\n return {\n ...n,\n [r]: u\n };\n}\nfunction R(t, s) {\n let e = t;\n const i = s.length;\n for (let r = 0; r < i; r++) {\n if (e == null) return;\n e = e[s[r]];\n }\n return e;\n}\nfunction _t(t, s) {\n const e = s.includes(\".\") ? s.split(\".\") : [s], i = /* @__PURE__ */ new Set(), r = () => {\n i.forEach((n) => n()), i.clear();\n };\n return {\n get value() {\n return R(t.value, e);\n },\n set value(n) {\n const o = t.peek(), u = ct(o, e, 0, n);\n u !== o && (t.value = u);\n },\n peek: () => R(t.peek(), e),\n subscribe(n) {\n const o = t.subscribe((u, l) => {\n const h = R(u, e), c = R(l, e);\n Object.is(h, c) || n(h, c);\n });\n return i.add(o), () => {\n o(), i.delete(o);\n };\n },\n subscriberCount: () => i.size,\n dispose: r,\n [Symbol.dispose]: r,\n [At]: !0,\n [bt]: !0\n };\n}\nvar xt = (t, s) => _t(t, s), Bt = (t) => (s) => _t(t, s);\nfunction Ht(t) {\n if (typeof t != \"function\") throw new TypeError(_.BATCH_CALLBACK_MUST_BE_FUNCTION);\n const s = w;\n s.startBatch();\n try {\n return t();\n } finally {\n s.endBatch();\n }\n}\nexport {\n A as AsyncState,\n N as AtomError,\n S as ComputedError,\n et as DEBUG_CONFIG,\n Q as DEBUG_RUNTIME,\n v as EffectError,\n C as SCHEDULER_CONFIG,\n P as SchedulerError,\n Ft as atom,\n _t as atomLens,\n Ht as batch,\n xt as composeLens,\n Pt as computed,\n Mt as effect,\n R as getPathValue,\n wt as isAtom,\n Ut as isComputed,\n Lt as isEffect,\n Bt as lensFor,\n w as scheduler,\n ct as setDeepValue,\n Rt as untracked\n};\n\n//# sourceMappingURL=index.mjs.map","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { isAtom } from '@but212/atom-effect';\nimport type { RenderRoute, RouteDefinition, TemplateRoute } from '@/types';\n\n// ============================================================================\n// Reactive helpers\n// ============================================================================\n\n/** Checks if a given value is a reactive node (Atom or Computed). */\nexport const isReactive = (v: unknown): v is ReadonlyAtom<unknown> => isAtom(v);\n\n/** Checks if value is a Promise. */\nexport const isPromise = <T>(v: unknown): v is Promise<T> =>\n v !== null && typeof v === 'object' && typeof (v as Record<string, unknown>).then === 'function';\n\n/** Generates a human-readable selector string for debug. */\nexport function getSelector(el: Element): string {\n const tag = el.localName;\n const id = el.id;\n if (id) return `${tag}#${id}`;\n const className = el.className;\n if (typeof className === 'string') {\n const trimmed = className.trim();\n if (trimmed) {\n return `${tag}.${trimmed.replace(/\\s+/g, '.')}`;\n }\n }\n return tag;\n}\n\nexport const hasOwn = Object.prototype.hasOwnProperty;\n\nexport const isTemplateRoute = (r: RouteDefinition): r is TemplateRoute =>\n 'template' in r && typeof r.template === 'string';\nexport const isRenderRoute = (r: RouteDefinition): r is RenderRoute =>\n 'render' in r && typeof r.render === 'function';\n\n/**\n * Shallow equality check for objects.\n * Optimized to avoid Object.keys() array allocations.\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n let countA = 0;\n for (const k in objA) {\n if (hasOwn.call(objA, k)) {\n if (!hasOwn.call(objB, k) || objA[k] !== objB[k]) return false;\n countA++;\n }\n }\n\n let countB = 0;\n for (const k in objB) {\n if (hasOwn.call(objB, k)) countB++;\n }\n\n return countA === countB;\n}\n","/**\n * Constants for atom-effect-jquery\n */\n\n// ============================================================================\n// Log Prefixes\n// ============================================================================\n\n/**\n * Log prefixes keyed by subsystem.\n * Each prefix names the specific subsystem that emitted the message so that\n * console output is unambiguous regardless of which binding triggered it.\n */\nexport const LOG_PREFIXES = {\n ROUTE: '[atom-route]',\n BINDING: '[atom-binding]',\n LIST: '[atom-list]',\n MOUNT: '[atom-mount]',\n} as const;\n\nexport const ROUTE_DEFAULTS = Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n} as const);\n\nexport const INPUT_DEFAULTS = { EVENT: 'input', DEBOUNCE: 0 } as const;\nexport const DEBUG_DEFAULTS = { HIGHLIGHT_DURATION_MS: 500 } as const;\n\nexport const VALID_INPUT_TAGS: ReadonlySet<string> = new Set(['input', 'select', 'textarea']);\n\nexport const URL_PROPS: ReadonlySet<string> = new Set([\n 'src',\n 'href',\n 'action',\n 'formaction',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'xlink:href',\n]);\n\nexport const DANGEROUS_PROPS: ReadonlySet<string> = new Set([\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n/**\n * Centralized error messages for the entire library.\n * Structured by subsystem to facilitate easy debugging and consistent error reporting.\n *\n * Each entry is a function that takes dynamic data (e.g. element name) to produce\n * a human-readable and actionable error message.\n */\nexport const ERROR_MESSAGES = {\n /** Errors related to the SPA Router. */\n ROUTE: {\n NOT_FOUND: (n: string) => `Route \"${n}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (s: string) => `Template \"${s}\" not found`,\n TARGET_NOT_FOUND: (s: string) => `Target element \"${s}\" not found`,\n MALFORMED_URI: (r: string) => `Malformed URI component: ${r}`,\n },\n /** Security-related errors, specifically from the CSS/HTML sanitizer. */\n SECURITY: {\n UNSAFE_CONTENT: () => 'Unsafe content neutralized during sanitization.',\n BLOCKED_CSS_VALUE: (p: string) => `Blocked dangerous value in CSS style property \"${p}\".`,\n BLOCKED_EVENT_HANDLER: (n: string) =>\n `Blocked setting dangerous event handler attribute/property \"${n}\".`,\n BLOCKED_PROTOCOL: (n: string) => `Blocked dangerous protocol in \"${n}\".`,\n BLOCKED_PROP: (n: string) =>\n `Blocked setting dangerous property \"${n}\". Use html binding for sanitized HTML.`,\n },\n /** General errors from reactive bindings (text, map, input, etc). */\n BINDING: {\n INVALID_INPUT_ELEMENT: (t: string) => `Val binding used on non-input element <${t}>.`,\n MISSING_SOURCE: (m: string) => `[${m}] source is required when prop/name is a string.`,\n MISSING_CONDITION: (m: string) => `[${m}] condition is required when className is a string.`,\n UPDATER_ERROR: (d: string, s?: boolean) =>\n `Updater threw in binding \"${d}\"${s ? ' (static)' : ''}`,\n CLEANUP_ERROR: (i?: string) => `Binding cleanup error${i ? `: ${i}` : ''}`,\n PARSE_ERROR: (d?: string) => `parse() threw during DOM→Atom sync${d ? `: ${d}` : ''}`,\n },\n /** Errors specific to atomList rendering and reconciliation. */\n LIST: {\n DUPLICATE_KEY: (k: string | number, i: number, c: string) =>\n `Duplicate key \"${k}\" at index ${i} in atomList <${c}>.`,\n },\n /** Lifecycle errors from atomMount/atomUnmount. */\n MOUNT: {\n ERROR: (n?: string) => `Mount error${n ? ` in component <${n}>` : ''}`,\n CLEANUP_ERROR: (n?: string) => `Cleanup error${n ? ` in component <${n}>` : ''}`,\n },\n /** Internal architectural errors from the core engine or registry. */\n CORE: {\n EFFECT_DISPOSE_ERROR: (i?: string) => `Effect dispose error${i ? `: ${i}` : ''}`,\n },\n} as const;\n","import { DEBUG_DEFAULTS } from '@/constants';\nimport { getSelector } from '@/utils';\n\n// ============================================================================\n// Environment utilities\n// ============================================================================\n\nconst IS_BROWSER = typeof window !== 'undefined';\nconst HIGHLIGHT_TRANSITION = `${DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS / 1000}s`;\n\nfunction getInitialState(): boolean {\n // biome-ignore lint/suspicious/noExplicitAny: globalThis is not typed\n const g = globalThis as any;\n if (IS_BROWSER && g.window?.__ATOM_DEBUG__ === true) return true;\n try {\n if (import.meta.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {}\n try {\n if (g.process?.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {}\n return false;\n}\n\n// ============================================================================\n// DebugController — Class-based singleton for JIT optimization\n// ============================================================================\n\nclass DebugController {\n private _enabled = false;\n private _lastState = false;\n\n constructor() {\n this._enabled = getInitialState();\n this._lastState = this._enabled;\n this._applyMethods(this._enabled);\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(v: boolean) {\n if (this._enabled !== v) {\n this._enabled = v;\n this._applyMethods(v);\n }\n }\n\n /** Normal logs (No-op in production) */\n public log: (p: string, ...a: unknown[]) => void = () => {};\n\n /** Atom state change logs (No-op in production) */\n public atomChanged: (p: string, n: string | undefined, o: unknown, v: unknown) => void = () => {};\n\n /** DOM update logs with highlighting (No-op in production) */\n public domUpdated: (p: string, t: Element | JQuery<Element>, type: string, v: unknown) => void =\n () => {};\n\n /** Resource cleanup logs (No-op in production) */\n public cleanup: (p: string, s: string) => void = () => {};\n\n /** Warnings (Always logged) */\n warn(p: string, m: string, ...r: unknown[]): void {\n console.warn(`${p} ${m}`, ...r);\n }\n\n /** Errors (Always logged) */\n error(p: string, m: string, c: unknown): void {\n console.error(`${p} ${m}`, c);\n }\n\n private _applyMethods(isEnabled: boolean) {\n if (isEnabled) {\n this.log = (p, ...a) => console.log(p, ...a);\n this.atomChanged = (p, n, o, v) =>\n console.log(`${p} Atom \"${n ?? 'anonymous'}\" changed:`, o, '→', v);\n this.domUpdated = (p, t, type, v) => {\n const el = t instanceof Element ? t : (t[0] as Element | undefined);\n if (el?.isConnected) {\n console.log(`${p} DOM updated: ${getSelector(el)}.${type} =`, v);\n this._highlightElement(el);\n }\n };\n this.cleanup = (p, s) => console.log(`${p} Cleanup: ${s}`);\n } else {\n this.log = () => {};\n this.atomChanged = () => {};\n this.domUpdated = () => {};\n this.cleanup = () => {};\n }\n }\n\n private _highlightElement(el: Element): void {\n if (!el.isConnected) return;\n injectStyle();\n\n const exR = rafs.get(el);\n const exT = timers.get(el);\n if (exR !== undefined) cancelAnimationFrame(exR);\n if (exT !== undefined) {\n clearTimeout(exT);\n timers.delete(el);\n }\n\n rafs.set(\n el,\n requestAnimationFrame(() => {\n rafs.delete(el);\n if (!el.isConnected) return;\n el.classList.add(HIGHLIGHT_CLASS);\n timers.set(\n el,\n setTimeout(() => {\n if (el.isConnected) el.classList.remove(HIGHLIGHT_CLASS);\n timers.delete(el);\n }, DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS)\n );\n })\n );\n }\n}\n\nexport const debug = new DebugController();\n\n// ============================================================================\n// Highlighting logic\n// ============================================================================\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight',\n H_ATTR = 'data-atom-debug';\nlet styleInjected = false;\n\nfunction injectStyle(): void {\n if (styleInjected || !IS_BROWSER) return;\n if (document.querySelector(`style[${H_ATTR}]`)) {\n styleInjected = true;\n return;\n }\n const s = Object.assign(document.createElement('style'), {\n textContent: `.${HIGHLIGHT_CLASS}{outline:2px solid rgba(255,68,68,0.8);outline-offset:1px;transition:outline ${HIGHLIGHT_TRANSITION} ease-out}`,\n });\n s.setAttribute(H_ATTR, '');\n document.head.appendChild(s);\n styleInjected = true;\n}\n\nconst timers = new WeakMap<Element, ReturnType<typeof setTimeout>>(),\n rafs = new WeakMap<Element, number>();\n","import {\n atomLens,\n batch,\n composeLens,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n lensFor,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { AtomOptions, WritableAtom } from '@/types';\n// isReactive is defined in utils.ts because core's isAtom already covers computed\n// atoms (ComputedAtom carries ATOM_BRAND), making a separate isComputed check redundant.\nimport { isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// atom factory + debug namespace\n// ============================================================================\n\n/**\n * Local wrapper around core's `atom` factory.\n *\n * This wrapper exists to attach the `$.atom.debug` accessor directly to the\n * function object at runtime. TypeScript requires a double cast for this\n * augmentation, but `NamespaceExtensions` ensures all other fields are type-safe.\n *\n * `options` is not defaulted here — core's `atom` defaults `options` to `{}`\n * internally, so passing `undefined` is safe and avoids an extra allocation\n * per call.\n */\nfunction atom<T>(v: T, opts?: AtomOptions): WritableAtom<T> {\n return createAtom(v, opts);\n}\n\nObject.defineProperty(atom, 'debug', {\n enumerable: true,\n configurable: true,\n get: () => debug.enabled,\n set: (v: boolean) => {\n debug.enabled = v;\n },\n});\n\n/** Resolves after microtask effects flush. Fast Promise-based scheduling. */\nexport const nextTick = (): Promise<void> => Promise.resolve();\n\n// Register static extensions to jQuery\n$.extend({\n atom: atom as unknown as JQueryStatic['atom'],\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n isReactive,\n nextTick,\n atomLens,\n composeLens,\n lensFor,\n});\n","/**\n * Array pool for reusing temporarily allocated arrays to avoid GC pressure.\n * Ported from @but212/atom-effect core.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /** Acquires array from pool or returns a new one. */\n acquire(): T[] {\n return this.pool.pop() ?? [];\n }\n\n /** Releases array back to pool if within capacity and limit. */\n release(arr: T[]): void {\n // Fast capacity check first to avoid frozen check cost\n if (arr.length > this.capacity || this.pool.length >= this.limit) return;\n if (Object.isFrozen(arr)) return;\n\n arr.length = 0;\n this.pool.push(arr);\n }\n\n /** Clears the pool. */\n reset(): void {\n this.pool.length = 0;\n }\n}\n","/**\n * Generic object pool for reusing fixed-shape plain objects.\n *\n * Design constraints:\n * - Pooled objects MUST have a fixed property shape (monomorphic).\n * Mixing shapes in a single pool will de-optimize V8's hidden classes.\n * - The `reset` callback MUST restore the object to a clean, reusable state.\n * Failing to do so leaks stale references and causes subtle bugs.\n * - The pool is LIFO (stack) for better CPU cache locality.\n *\n * @template T - Object type to pool. Must be a plain object with a fixed shape.\n */\nexport class ObjectPool<T extends object> {\n private readonly pool: T[] = [];\n\n constructor(\n private readonly factory: () => T,\n private readonly reset: (obj: T) => void,\n private readonly limit = 64\n ) {}\n\n /** Acquires object from pool or creates a new one. */\n acquire(): T {\n return this.pool.pop() ?? this.factory();\n }\n\n /** Releases object back to pool after reset. */\n release(obj: T): void {\n if (this.pool.length < this.limit) {\n this.reset(obj);\n this.pool.push(obj);\n }\n }\n\n /** Drains all retained objects. */\n drain(): void {\n if (this.pool.length > 0) {\n this.pool.length = 0;\n }\n }\n\n get size(): number {\n return this.pool.length;\n }\n}\n","import type { EffectObject } from '@/types';\nimport { ArrayPool } from '../utils/array-pool';\nimport { ObjectPool } from '../utils/object-pool';\n\n// ============================================================================\n// Array Pools\n// ============================================================================\n\nexport const effectsArrayPool = new ArrayPool<EffectObject>();\nexport const cleanupsArrayPool = new ArrayPool<() => void>();\n\n// ============================================================================\n// Object Pools\n// ============================================================================\n\n/**\n * Per-element record of all reactive resources that must be released on cleanup.\n * Fields are optional to avoid allocating arrays for the common case where only\n * one resource type is used.\n *\n * Extracted here so that both the pool and registry share the same type.\n */\nexport interface BindingRecord {\n effects: EffectObject[] | undefined;\n cleanups: Array<() => void> | undefined;\n componentCleanup: (() => void) | undefined;\n}\n\n/**\n * Pool for BindingRecord objects.\n * Uses a fixed hidden class for V8 optimization.\n */\nexport const bindingRecordPool = new ObjectPool<BindingRecord>(\n () => {\n return {\n effects: undefined,\n cleanups: undefined,\n componentCleanup: undefined,\n };\n },\n (r) => {\n r.effects = undefined;\n r.cleanups = undefined;\n r.componentCleanup = undefined;\n },\n 128\n);\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport {\n type BindingRecord,\n bindingRecordPool,\n cleanupsArrayPool,\n effectsArrayPool,\n} from '@/internal/pool';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\n\nlet autoCleanupScheduled = false;\n\n/**\n * Ensures that the MutationObserver for automatic cleanup is active.\n * Lazily triggered on the first reactive binding registration.\n */\nfunction ensureAutoCleanup(): void {\n if (autoCleanupScheduled) return;\n autoCleanupScheduled = true;\n if (typeof document !== 'undefined' && document.body) {\n enableAutoCleanup(document.body);\n }\n}\n\n/**\n * CSS class added to every element that has at least one active binding.\n * Used by `querySelectorAll` in `cleanupDescendants` for efficient subtree traversal.\n * Internal use only.\n */\nconst AES_BOUND = '_aes-bound';\n\n// BindingRecord type is defined in @/internal/pool to co-locate with its ObjectPool.\n\n// ============================================================================\n// BindingRegistry\n// ============================================================================\n\n/**\n * Central registry mapping DOM elements to their reactive binding records.\n *\n * Design goals:\n * - Zero memory leaks: all collections use WeakMap/WeakSet keyed by Element.\n * - Minimal allocations in the hot tracking path.\n * - O(bound-descendants) cleanup via a single querySelectorAll pass.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>();\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n private getOrCreateRecord(el: Element): BindingRecord {\n ensureAutoCleanup();\n let res = this.records.get(el);\n if (!res) {\n res = bindingRecordPool.acquire();\n this.records.set(el, res);\n el.classList.add(AES_BOUND);\n }\n return res;\n }\n\n /**\n * Registers a reactive effect with an element's record.\n * Effects are automatically disposed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the effect to.\n * @param fx - The reactive effect instance.\n */\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this.getOrCreateRecord(el);\n if (!record.effects) {\n record.effects = effectsArrayPool.acquire();\n }\n record.effects.push(fx);\n }\n\n /**\n * Registers an arbitrary cleanup function with an element's record.\n * Cleanups are executed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the cleanup to.\n * @param fn - The cleanup function (e.g., event unbinding, timer clear).\n */\n trackCleanup(el: Element, fn: () => void): void {\n const record = this.getOrCreateRecord(el);\n if (!record.cleanups) {\n record.cleanups = cleanupsArrayPool.acquire();\n }\n record.cleanups.push(fn);\n }\n\n /**\n * Assigns a component-level cleanup function (e.g., from atomMount).\n * Unlike generic cleanups, there can only be one component cleanup per element.\n */\n setComponentCleanup(el: Element, fn: (() => void) | undefined): void {\n this.getOrCreateRecord(el).componentCleanup = fn;\n }\n\n hasBind(el: Element): boolean {\n return this.records.has(el);\n }\n\n cleanup(el: Element | Node): void {\n const isElement = el.nodeType === 1;\n const record = this.records.get(el as Element);\n\n // Consolidate deletions\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n\n if (!record) {\n if (isElement) (el as Element).classList.remove(AES_BOUND);\n return;\n }\n\n this.records.delete(el as Element);\n if (isElement) (el as Element).classList.remove(AES_BOUND);\n\n const selector = isElement ? getSelector(el as Element) : el.nodeName || 'Node';\n debug.cleanup(LOG_PREFIXES.BINDING, selector);\n\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (e) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.CLEANUP_ERROR(selector), e);\n }\n }\n\n if (record.effects) {\n for (const fx of record.effects) {\n try {\n fx.dispose();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.CORE.EFFECT_DISPOSE_ERROR(selector), e);\n }\n }\n effectsArrayPool.release(record.effects);\n record.effects = undefined;\n }\n\n if (record.cleanups) {\n for (const fn of record.cleanups) {\n try {\n fn();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.CLEANUP_ERROR(selector), e);\n }\n }\n cleanupsArrayPool.release(record.cleanups);\n record.cleanups = undefined;\n }\n bindingRecordPool.release(record);\n }\n\n cleanupDescendants(el: Element | DocumentFragment | ShadowRoot): void {\n // Fast path: getElementsByClassName is significantly faster than querySelectorAll\n const live = (el as { getElementsByClassName?(name: string): HTMLCollectionOf<Element> })\n .getElementsByClassName\n ? (el as Element).getElementsByClassName(AES_BOUND)\n : el.querySelectorAll(`.${AES_BOUND}`);\n\n const len = live.length;\n if (len === 0) return;\n\n // Snapshot to avoid issues with live collection changing during cleanup\n // and to stabilize loop prediction.\n const snapshot = new Array<Element>(len);\n for (let i = 0; i < len; i++) snapshot[i] = live[i]!;\n\n for (let i = len - 1; i >= 0; i--) {\n const child = snapshot[i]!;\n // Pre-check registry to avoid unnecessary cleanup calls\n if (this.records.has(child)) {\n this.cleanup(child);\n } else {\n child.classList.remove(AES_BOUND);\n }\n }\n }\n\n cleanupTree(el: Element | Node): void {\n if (el.nodeType === 1 || el.nodeType === 11) {\n this.cleanupDescendants(el as Element | DocumentFragment | ShadowRoot);\n }\n this.cleanup(el);\n }\n}\n\n// ============================================================================\n// Singleton + auto-cleanup\n// ============================================================================\n\nexport const registry = new BindingRegistry();\n\nconst observers = new Map<Element, MutationObserver>();\n\n/**\n * Starts observing `root` for removed elements and automatically disposes\n * their reactive bindings when they leave the DOM.\n *\n * Multiple roots can be observed concurrently (e.g. for Micro-Frontends).\n * The `root` parameter is required (no default) to make the caller explicit\n * about which subtree is being observed.\n *\n * Idempotent: calling more than once with the same root has no effect.\n */\nexport function enableAutoCleanup(root: Element): void {\n // Support independent multiple roots for Micro-Frontend architectures.\n if (observers.has(root)) {\n return;\n }\n\n const observer = new MutationObserver((mutations) => {\n const reg = registry;\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const removedNodes = mutations[i]!.removedNodes;\n for (let j = 0, rLen = removedNodes.length; j < rLen; j++) {\n const node = removedNodes[j]!;\n\n // Only Element nodes can carry bindings marked by our AES_BOUND class.\n // We skip text and comment nodes early for performance.\n // Combined check for nodeType and connectivity (the two most common early exits)\n // to reduce separate branch prediction entries.\n if (node.nodeType !== 1 || (node as Element).isConnected) continue;\n\n const el = node as Element;\n\n // Combined flag checks for explicit detach (.keep) or manual cleanup traversal (.ignore).\n if (reg.isKept(el) || reg.isIgnored(el)) continue;\n\n reg.cleanupTree(el);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observers.set(root, observer);\n}\n\n/**\n * Marks the auto-cleanup as scheduled or already running.\n * Used internally and by reset helpers in tests.\n */\nexport function setAutoCleanupScheduled(scheduled: boolean): void {\n autoCleanupScheduled = scheduled;\n}\n\n/**\n * Stops all MutationObservers started by `enableAutoCleanup`.\n */\nexport function disableAutoCleanup(): void {\n observers.forEach((obs) => obs.disconnect());\n observers.clear();\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/** Generic event handler type matching jQuery's internal handler signature. */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/**\n * Symbol marker attached to handlers registered by this library's internals.\n * Handlers carrying this marker are NOT wrapped in batch() — they already\n * manage atom writes directly and do not need an extra reactive flush.\n */\nexport const INTERNAL_HANDLER = Symbol('atom-effect-internal');\n\n/**\n * WeakMap from original handler function → batch-wrapped handler function.\n * Keys are functions (held alive by jQuery's internal event store for as long\n * as the handler is registered), so entries are naturally released when the\n * handler is removed via .off() and jQuery drops its reference.\n */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n// ============================================================================\n// Originals store\n// ============================================================================\n\n/**\n * Snapshot of jQuery prototype methods captured at `enablejQueryOverrides()`\n * time and restored by `disablejQueryOverrides()`.\n *\n * Stored as a typed object and captured into `orig` (a local const) inside\n * `enablejQueryOverrides` so that the override closures always reference the\n * pre-patch methods even if `disablejQueryOverrides()` later resets the\n * module-level `originals` variable to null.\n */\ntype OriginalMethods = {\n on: typeof $.fn.on;\n off: typeof $.fn.off;\n remove: typeof $.fn.remove;\n empty: typeof $.fn.empty;\n detach: typeof $.fn.detach;\n};\n\nlet originals: OriginalMethods | null = null;\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n // Fast check: is already wrapped?\n if ((fn as { [INTERNAL_HANDLER]?: boolean })[INTERNAL_HANDLER]) return fn;\n\n let wrapped = handlerMap.get(fn);\n if (!wrapped) {\n wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as EventHandler;\n (wrapped as { [INTERNAL_HANDLER]?: boolean })[INTERNAL_HANDLER] = true;\n handlerMap.set(fn, wrapped);\n }\n return wrapped;\n};\n\nfunction wrapEventMap(map: Record<string, EventHandler>): Record<string, EventHandler> {\n const newMap: Record<string, EventHandler> = {};\n for (const k in map) if (map[k]) newMap[k] = getWrappedHandler(map[k]);\n return newMap;\n}\n\nfunction resolveOffEventMap(\n map: Record<string, EventHandler | undefined>\n): Record<string, EventHandler | undefined> {\n const newMap: Record<string, EventHandler | undefined> = {};\n for (const k in map) {\n const h = map[k];\n newMap[k] = h ? (handlerMap.get(h) ?? h) : undefined;\n }\n return newMap;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n const orig = originals;\n\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) {\n registry.markIgnored(el);\n registry.cleanupTree(el);\n }\n }\n return orig.remove.call(this, selector) ?? this;\n };\n\n $.fn.empty = function (this: JQuery) {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const el = this[i];\n if (el?.hasChildNodes()) registry.cleanupDescendants(el);\n }\n return orig.empty.call(this) ?? this;\n };\n\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n return orig.detach.call(this, selector) ?? this;\n };\n\n $.fn.on = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n if (types && typeof types === 'object') {\n args[0] = wrapEventMap(types as Record<string, EventHandler>);\n } else {\n const last = args.length - 1;\n if (last >= 0 && typeof args[last] === 'function') {\n args[last] = getWrappedHandler(args[last] as EventHandler);\n }\n }\n return orig.on.apply(this, args as Parameters<typeof $.fn.on>) ?? this;\n };\n\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n if (types && typeof types === 'object') {\n args[0] = resolveOffEventMap(types as Record<string, EventHandler | undefined>);\n } else {\n const last = args.length - 1;\n if (last >= 0 && typeof args[last] === 'function') {\n const fn = args[last] as EventHandler;\n args[last] = handlerMap.get(fn) ?? fn;\n }\n }\n return orig.off.apply(this, args as Parameters<typeof $.fn.off>) ?? this;\n };\n}\n\n/**\n * Restores all jQuery methods patched by `enablejQueryOverrides()`.\n * Primarily useful in test environments to reset state between suites.\n */\nexport function disablejQueryOverrides(): void {\n if (originals === null) return;\n\n $.fn.on = originals.on;\n $.fn.off = originals.off;\n $.fn.remove = originals.remove;\n $.fn.empty = originals.empty;\n $.fn.detach = originals.detach;\n\n originals = null;\n}\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n EffectObject,\n Paths,\n PathValue,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n// ============================================================================\n// Shared API Types\n// ============================================================================\n\nexport type EffectCleanup = () => void;\nexport type EffectResult = undefined | EffectCleanup;\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\nexport interface AtomOptions extends BaseAtomOptions {\n name?: string;\n}\n\n/**\n * Represents a value that can be tracked by the reactive system.\n * - T: Static value (one-time bind)\n * - ReadonlyAtom<T>: Reactive value (updates DOM when atom changes)\n * - () => T: Reactive function (updates DOM when any atom read inside changes)\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * An extension of ReactiveValue that also supports Promises and async functions.\n * The binding system automatically handles the promise lifecycle, showing the\n * latest resolved value and ignoring stale ones (race condition protection).\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\nexport type PrimitiveValue = string | number | boolean | null | undefined;\ntype KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];\n\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\nexport type CssBindings = Record<string, CssValue>;\n\nexport interface BindingOptions<T = unknown> {\n text?: AsyncReactiveValue<unknown>;\n html?: AsyncReactiveValue<string>;\n class?: Record<string, AsyncReactiveValue<boolean>>;\n css?: CssBindings;\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n show?: AsyncReactiveValue<boolean>;\n hide?: AsyncReactiveValue<boolean>;\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n checked?: WritableAtom<boolean>;\n form?: WritableAtom<T extends object ? T : unknown>;\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\nexport interface DisposableWritableAtom<T> extends WritableAtom<T>, Disposable {\n dispose(): void;\n}\n\nexport type ListKey = string | number;\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\nexport interface ListOptions<T> {\n key: KeysOfType<T, ListKey> | ListKeyFn<T>;\n render: (item: T, index: number) => ListRenderResult;\n bind?: ($el: JQuery, item: T, index: number) => void;\n update?: ($el: JQuery, item: T, index: number) => void;\n onAdd?: ($el: JQuery) => void;\n onRemove?: ($el: JQuery) => Promise<void> | void;\n empty?: ListRenderResult;\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n isEqual?: (a: T, b: T) => boolean;\n}\n\n/**\n * Options for `atomVal`, `atomChecked`, and `atomForm` bindings.\n */\nexport interface ValOptions<T> {\n /** Debounce duration in milliseconds for DOM -> Atom sync. Defaults to 0. */\n debounce?: number;\n /** jQuery event name(s) to listen to. Defaults to \"input\". */\n event?: string;\n /** Custom function to parse DOM string to atom type T. */\n parse?: (v: string) => T;\n /** Custom function to format atom type T to DOM string. */\n format?: (v: T) => string;\n /** Custom equality check to prevent redundant atom updates. */\n equal?: EqualFn<T>;\n}\n\nexport interface FetchOptions<T> {\n defaultValue: T;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n headers?: Record<string, string>;\n transform?: (raw: unknown) => T;\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n onError?: (err: unknown) => void;\n eager?: boolean;\n}\n\nexport interface FetchError extends Error {\n jqXHR?: JQuery.jqXHR;\n}\n\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\nexport interface RouteLifecycle {\n onEnter?: (params: Record<string, string>, router: Router) => Record<string, string> | undefined;\n onLeave?: (router: Router) => boolean | undefined;\n}\n\nexport interface TemplateRoute extends RouteLifecycle {\n template: string;\n render?: never;\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\nexport interface RenderRoute extends RouteLifecycle {\n render: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n template?: never;\n}\n\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\nexport interface RouteConfig {\n target: string;\n default: string;\n routes: Record<string, RouteDefinition>;\n mode?: 'hash' | 'history';\n basePath?: string;\n notFound?: string;\n autoBindLinks?: boolean;\n activeClass?: string;\n beforeTransition?: (from: string, to: string) => void;\n afterTransition?: (from: string, to: string) => void;\n}\n\nexport interface Router {\n currentRoute: ReadonlyAtom<string>;\n queryParams: ReadonlyAtom<Record<string, string>>;\n navigate: (route: string) => void;\n destroy: () => void;\n}\n\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\nexport interface BindingContext {\n readonly el: HTMLElement;\n readonly trackCleanup: (fn: EffectCleanup) => void;\n}\n\ndeclare global {\n interface JQueryStatic {\n atom: { <T>(v: T, opts?: AtomOptions): WritableAtom<T>; debug: boolean };\n computed<T>(fn: () => T, opts?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n opts: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(fn: () => EffectResult): EffectObject;\n batch(fn: () => void): void;\n untracked<T>(fn: () => T): T;\n isAtom(v: unknown): boolean;\n isComputed(v: unknown): boolean;\n isReactive(v: unknown): boolean;\n nextTick(): Promise<void>;\n atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n lensFor<T extends object>(\n atom: WritableAtom<T>\n ): <P extends Paths<T>>(p: P) => DisposableWritableAtom<PathValue<T, P>>;\n route(config: RouteConfig): Router;\n atomFetch<T>(\n url: string | (() => string),\n opts: FetchOptions<T>\n ): ComputedAtom<T> & { abort: () => void };\n }\n\n interface JQuery {\n atomText<T>(src: AsyncReactiveValue<T>, fmt?: (v: T) => string): this;\n atomHtml(src: AsyncReactiveValue<string>): this;\n atomClass(name: string, cond: AsyncReactiveValue<boolean>): this;\n atomClass(map: Record<string, AsyncReactiveValue<boolean>>): this;\n atomCss(prop: string, src: AsyncReactiveValue<string | number>, unit?: string): this;\n atomCss(map: CssBindings): this;\n atomAttr(name: string, src: AsyncReactiveValue<PrimitiveValue>): this;\n atomAttr(map: Record<string, AsyncReactiveValue<PrimitiveValue>>): this;\n atomProp<T>(name: string, src: AsyncReactiveValue<T>): this;\n atomProp<T>(map: Record<string, AsyncReactiveValue<T>>): this;\n atomShow(cond: AsyncReactiveValue<boolean>): this;\n atomHide(cond: AsyncReactiveValue<boolean>): this;\n atomVal<T>(atom: WritableAtom<T>, opts?: ValOptions<T>): this;\n atomChecked(atom: WritableAtom<boolean>): this;\n atomForm<T extends object>(atom: WritableAtom<T>, opts?: ValOptions<unknown>): this;\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n atomBind<T = unknown>(opts: BindingOptions<T>): this;\n atomList<T>(src: ReadonlyAtom<T[]>, opts: ListOptions<T>): this;\n atomMount<P>(comp: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n atomUnbind(): this;\n }\n}\n\nexport type { ComputedAtom, ComputedOptions, EffectObject, ReadonlyAtom, WritableAtom };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, INPUT_DEFAULTS, LOG_PREFIXES } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// Monotonically increasing counter used to generate per-instance event\n// namespaces, preventing cleanup of sibling bindings on the same element.\nlet instanceCounter = 0;\n\ntype InputEl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * Marks a handler as library-internal so the jQuery patch skips batch() wrapping.\n * All handlers registered by InputBinding must be marked — unmarked handlers are\n * wrapped in batch() by the jQuery override, which is redundant and potentially\n * harmful here since InputBinding manages atom writes directly.\n */\nfunction markInternal(fn: Function): void {\n (fn as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n}\n\nclass InputBinding<T> {\n private readonly $el: JQuery;\n private readonly el: InputEl;\n private readonly atom: WritableAtom<T>;\n private readonly isMultipleSelect: boolean;\n private readonly isTextControl: boolean;\n\n private readonly parse: (v: string) => T;\n private readonly format: (v: T) => string;\n private readonly equal: (a: T, b: T) => boolean;\n private readonly readDom: () => T;\n private readonly getRawDom: () => string | string[];\n private readonly writeDom: (val: T, formatted: string) => void;\n\n /**\n * Internal state flags using bitwise operations for zero-overhead tracking.\n * Tracks focus, IME composition, and sync direction to prevent infinite loops.\n */\n private flags = 0;\n private timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Per-instance jQuery event namespace — prevents cleanup collisions. */\n private readonly ns: string;\n private readonly handleInput: () => void;\n\n constructor($el: JQuery, atom: WritableAtom<T>, options: ValOptions<T>) {\n this.$el = $el;\n this.el = $el[0] as InputEl;\n this.atom = atom;\n const tagName = this.el.tagName;\n const isMultiple = tagName === 'SELECT' && (this.el as HTMLSelectElement).multiple;\n this.isMultipleSelect = isMultiple;\n this.isTextControl = tagName === 'INPUT' || tagName === 'TEXTAREA';\n this.ns = `.atomBind-${++instanceCounter}`;\n\n const debounce = options.debounce ?? 0;\n\n this.parse = options.parse ?? ((v: string) => v as unknown as T);\n\n // Specialize strategy functions at construction to avoid branches in sync hot-paths\n if (isMultiple) {\n this.format =\n options.format ?? ((v: T) => (Array.isArray(v) ? v : v ? [String(v)] : []).join(','));\n this.getRawDom = () => (this.$el.val() as string[] | null) || [];\n this.readDom = () => this.getRawDom() as unknown as T;\n this.writeDom = (val) => {\n this.$el.val(val as unknown as string[]);\n };\n } else {\n this.format = options.format ?? ((v: T) => String(v ?? ''));\n this.getRawDom = () => this.el.value;\n this.readDom = () => this.parse(this.el.value);\n\n if (this.isTextControl) {\n this.writeDom = (_val, formatted) => {\n if (this.flags & BindingFlags.Focused) {\n // --- Cursor Preservation Strategy ---\n try {\n const el = this.el as HTMLInputElement;\n const start = el.selectionStart;\n const end = el.selectionEnd;\n el.value = formatted;\n const len = formatted.length;\n if (start !== null && end !== null) {\n el.setSelectionRange(start < len ? start : len, end < len ? end : len);\n }\n } catch {\n this.el.value = formatted;\n }\n } else {\n this.el.value = formatted;\n }\n };\n } else {\n this.writeDom = (_, formatted) => {\n this.el.value = formatted;\n };\n }\n }\n\n const baseEqual = options.equal ?? Object.is;\n if (isMultiple) {\n this.equal = (a: T, b: T): boolean => {\n if (baseEqual(a, b)) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = a.length;\n if (len !== b.length) return false;\n for (let i = 0; i < len; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n }\n return false;\n };\n } else {\n this.equal = baseEqual;\n }\n\n if (debounce > 0) {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => this.syncAtomFromDom(), debounce);\n };\n } else {\n this.handleInput = () => {\n if (!(this.flags & BindingFlags.Composing)) this.syncAtomFromDom();\n };\n }\n\n [\n this.handleFocus,\n this.handleBlur,\n this.handleCompositionStart,\n this.handleCompositionEnd,\n this.handleInput,\n ].forEach(markInternal);\n\n this.bindEvents(options.event ?? INPUT_DEFAULTS.EVENT);\n }\n\n // --- Event Handlers ---\n\n private readonly handleCompositionStart = () => {\n // We ignore input events while the user is still composing characters\n // (e.g., CJK character selection) to avoid syncing incomplete/partial data.\n this.flags |= BindingFlags.Composing;\n };\n\n private readonly handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n // Trigger sync once composition is finished to capture the final character.\n this.handleInput();\n };\n\n private readonly handleFocus = () => {\n this.flags |= BindingFlags.Focused;\n };\n\n private readonly handleBlur = () => {\n this.flags &= ~BindingFlags.Focused;\n const wasComposing = !!(this.flags & BindingFlags.Composing);\n this.flags &= ~BindingFlags.Composing;\n\n // Ensure any pending debounced change is committed immediately on blur.\n this.flushPendingDebounce();\n\n // If composition was interrupted by blur (e.g. clicking away),\n // we must perform a final sync to stay consistent with the DOM.\n if (wasComposing && this.timeoutId === undefined) {\n this.syncAtomFromDom();\n }\n\n // Restore the strict formatted value from the atom.\n this.normalizeDomValue();\n };\n\n // --- Helpers ---\n\n private flushPendingDebounce(): void {\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n this.syncAtomFromDom();\n }\n }\n\n private normalizeDomValue(): void {\n const val = this.atom.peek();\n const formatted = this.format(val);\n const raw = this.getRawDom();\n\n if (this.isMultipleSelect) {\n if (!this.equal(raw as unknown as T, val)) {\n this.writeDom(val, formatted);\n }\n } else if (raw !== formatted) {\n this.writeDom(val, formatted);\n }\n }\n\n private syncAtomFromDom(): void {\n if (this.flags & BindingFlags.Busy) return;\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n const parsed = this.readDom();\n if (!this.equal(this.atom.peek(), parsed)) {\n this.atom.value = parsed;\n }\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.PARSE_ERROR(e instanceof Error ? e.message : String(e)),\n e\n );\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n public readonly syncDomFromAtom = () => {\n const val = this.atom.value;\n\n untracked(() => {\n const formatted = this.format(val);\n const raw = this.getRawDom();\n\n // Skip if raw DOM matches formatted string (or array for select-multiple)\n if (this.isMultipleSelect) {\n if (this.equal(raw as unknown as T, val)) return;\n } else if (raw === formatted) {\n return;\n }\n\n // If focused, check if it's already \"functionally\" equal via parse to avoid\n // overwriting while user is typing (e.g. typing \"1.0\" when atom is 1)\n if (this.flags & BindingFlags.Focused) {\n try {\n if (this.equal(this.readDom(), val)) return;\n } catch {\n // Ignore parse errors on check-only read\n }\n }\n\n this.flags |= BindingFlags.SyncingToDom;\n try {\n this.writeDom(val, formatted);\n debug.domUpdated(LOG_PREFIXES.BINDING, this.$el, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n public readonly cleanup = () => {\n this.$el.off(this.ns);\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n };\n\n private bindEvents(eventName: string): void {\n const ns = this.ns;\n const namespacedEvents = eventName\n .trim()\n .split(/\\s+/)\n .map((e) => `${e}${ns}`)\n .join(' ');\n\n this.$el\n .on(`focus${ns}`, this.handleFocus)\n .on(`blur${ns}`, this.handleBlur)\n .on(`compositionstart${ns}`, this.handleCompositionStart)\n .on(`compositionend${ns}`, this.handleCompositionEnd)\n .on(namespacedEvents, this.handleInput);\n }\n}\n\n/**\n * Applies two-way data binding between a writable atom and an input element.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { fx: EffectObject; cleanup: () => void } {\n let binding: InputBinding<T> | null = new InputBinding($el, atom, options);\n return {\n fx: effect(binding.syncDomFromAtom),\n cleanup: () => {\n if (binding) {\n binding.cleanup();\n binding = null;\n }\n },\n };\n}\n","import { effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\n\nimport { isPromise, isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Debug type\n// ============================================================================\n\n/**\n * Structured label identifying which binding produced a debug log entry.\n * Fixed bindings use a plain literal; per-key bindings use a `prefix.key` form\n * where the key portion must be non-empty.\n *\n * Note: the trailing `(string & {})` member makes this type accept any string\n * at runtime while still surfacing the named literals as IDE autocomplete\n * suggestions. It does NOT enforce that only the listed values are used —\n * TypeScript absorbs all narrower literal members into `string & {}`, so there\n * is no compile-time restriction beyond `string`.\n */\nexport type BindingDebugType =\n | 'text'\n | 'html'\n | 'show'\n | 'hide'\n | 'checked'\n | `class.${string & {}}`\n | `css.${string & {}}`\n | `attr.${string & {}}`\n | `prop.${string & {}}`\n | (string & {});\n\n// ============================================================================\n// Core factory\n// ============================================================================\n\n/**\n * Registers a reactive effect that calls `updater` whenever `source` changes,\n * or calls `updater` once immediately if `source` is a static value.\n *\n * Responsibilities:\n * - Reactive path: wraps `updater` in an `effect`, tracks it on the registry.\n * - Static path: applies the value once; no effect is registered.\n * - Debug path: logs both the static initial bind and reactive updates via\n * `debug.domUpdated` so that all DOM writes appear in a uniform format.\n * - Error path: catches `updater` exceptions and surfaces them via `console.error`\n * so that a broken binding does not silently kill the effect loop.\n * Both the reactive and static paths are guarded consistently with `untracked`.\n *\n * @param el DOM element or SVG element to associate the effect with.\n * @param source Reactive or static value source.\n * @param updater Function that writes the value to the DOM.\n * @param debugType Structured label used in debug log output and effect naming.\n */\nexport function registerReactiveEffect<T>(\n el: Element,\n source: AsyncReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n let latestPromise: Promise<T> | null = null;\n\n const runUpdater = (val: T | Promise<T>) => {\n if (!isPromise(val)) {\n latestPromise = null;\n try {\n updater(val);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, val);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true), e);\n }\n return;\n }\n\n latestPromise = val;\n val\n .then((resolved) => {\n // Ensure this is still the most recent promise to avoid race conditions\n if (latestPromise === val) {\n untracked(() => {\n try {\n updater(resolved);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolved);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n })\n .catch((e) => {\n if (latestPromise === val) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n };\n\n /**\n * Decide whether to register a reactive effect or perform a one-time static update.\n *\n * STRATEGY:\n * 1. If it's an Atom or a function, it's considered 'reactive' and wrapped in an effect.\n * 2. If it's a plain value or a Promise, it's 'static' and applied once.\n */\n const sourceIsReactive = isReactive(source);\n const sourceIsFunction = typeof source === 'function';\n\n if (sourceIsReactive || sourceIsFunction) {\n registry.trackEffect(\n el,\n effect(\n () => {\n // Resolve the current value based on the source type.\n // Both paths subscribe to their respective dependencies automatically.\n const value = sourceIsReactive\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n\n untracked(() => runUpdater(value));\n },\n { name: debugType }\n )\n );\n } else {\n // Static path: applies the value immediately and doesn't register an effect.\n untracked(() => runUpdater(source as T | Promise<T>));\n }\n}\n\n/**\n * Registers a single reactive effect that observes multiple sources in a map.\n * When any source changes, the entire map is re-processed via the updater.\n */\nexport function registerMapEffect<T>(\n el: Element,\n map: Record<string, AsyncReactiveValue<T>>,\n updater: (map: Record<string, T>) => void,\n debugType: BindingDebugType\n): void {\n const keys = Object.keys(map);\n const reactiveKeys: string[] = [];\n const reactiveSources: AsyncReactiveValue<T>[] = [];\n const sourceIsAtom: boolean[] = [];\n const staticValues: Record<string, T | Promise<T>> = {};\n\n for (let i = 0, len = keys.length; i < len; i++) {\n const key = keys[i]!;\n const val = map[key]!;\n const isAtomVal = isReactive(val);\n if (isAtomVal || typeof val === 'function') {\n reactiveKeys.push(key);\n reactiveSources.push(val);\n sourceIsAtom.push(isAtomVal);\n } else {\n staticValues[key] = val;\n }\n }\n\n let latestPromiseId = 0;\n\n const runUpdater = (currentMap: Record<string, T | Promise<T>>) => {\n const promises: Promise<{ key: string; val: T }>[] = [];\n const resolvedMap: Record<string, T> = {};\n const len = keys.length;\n\n for (let i = 0; i < len; i++) {\n const key = keys[i]!;\n const val = currentMap[key]!;\n if (isPromise(val)) {\n promises.push(val.then((v) => ({ key, val: v })));\n } else {\n resolvedMap[key] = val as T;\n }\n }\n\n const pLen = promises.length;\n if (pLen > 0) {\n const myId = ++latestPromiseId;\n Promise.all(promises).then((results) => {\n if (myId === latestPromiseId) {\n for (let i = 0; i < pLen; i++) {\n const res = results[i]!;\n resolvedMap[res.key] = res.val;\n }\n untracked(() => {\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolvedMap);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n });\n } else {\n latestPromiseId++; // Invalidate any pending promises\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, resolvedMap);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true), e);\n }\n }\n };\n\n if (reactiveKeys.length > 0) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const currentMap: Record<string, T | Promise<T>> = { ...staticValues };\n for (let i = 0, len = reactiveKeys.length; i < len; i++) {\n const source = reactiveSources[i]!;\n currentMap[reactiveKeys[i]!] = sourceIsAtom[i]\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n }\n untracked(() => runUpdater(currentMap));\n },\n { name: debugType }\n )\n );\n } else {\n untracked(() => runUpdater(staticValues));\n }\n}\n","/**\n * HTML sanitization and security guards for XSS mitigation.\n *\n * This module is the **sole** sanitization layer — there is no downstream\n * sanitizer (e.g. DOMPurify) applied automatically. All regex-based\n * filtering happens here before content reaches the DOM.\n *\n * **Threat model:** best-effort defence for developer-authored templates and\n * reactive string bindings. For user-controlled rich text (e.g. a WYSIWYG\n * editor), replace or supplement this with DOMPurify.\n */\n\n// ============================================================================\n// URL attribute registry\n// ============================================================================\n\n/**\n * Attributes that carry a single URL value.\n *\n * `srcset` is intentionally excluded: its value is a comma-separated list of\n * URLs (e.g. `\"img.png 1x, img@2x.png 2x\"`), so a start-anchored regex cannot\n * reliably detect a dangerous protocol buried after the first comma. Callers\n * that need to validate srcset should parse each URL individually.\n */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n]);\n\n// ============================================================================\n// Pre-compiled regex constants\n// ============================================================================\n\nexport const DANGEROUS_PROTOCOL_RE = /^\\s*(?:javascript|vbscript)\\s*:/i;\n\nconst DANGEROUS_CSS_RE =\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\n /(?:expression\\s*\\(|behavior\\s*:|-moz-binding\\s*:|(?:\\\\[0-9a-f]{1,6}\\s*|[\\s\\x00-\\x20/'\"])*(?:j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|d\\s*a\\s*t\\s*a)\\s*:(?!image\\/))/i;\n\n/** Detects `javascript:` / `vbscript:` inside a CSS `url()` function. Non-global — no `lastIndex` state. */\nconst DANGEROUS_CSS_URL_RE = /url\\s*\\(\\s*(?:[\"']?\\s*)?(?:javascript|vbscript)\\s*:/i;\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters\nconst STRIP_CTRL_RE = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\n\n/**\n * Numeric HTML entity decoder: &#NNN; and &#xHH; forms.\n *\n * Runs before protocol/tag checks so entity-encoded bypass vectors like\n * \"javascript:\" (j=106) are normalised to their literal characters.\n * Safe structural entities (& < > ") are intentionally left\n * encoded — they produce inert text when re-inserted via innerHTML and must\n * remain escaped for correct HTML rendering.\n *\n * The semicolon is optional (`?`) to catch unterminated references such as\n * \"javascript:\" which some parsers still decode.\n */\nconst DECODE_NUMERIC_ENTITY_RE = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\n\n/**\n * Named-entity decoder for the small set of entities relevant to protocol\n * smuggling (colon, Tab, NewLine).\n *\n * HTML5 named character references are **case-sensitive** — `	` exists,\n * `&tab;` does not. Do NOT add the `i` flag: it would incorrectly decode\n * non-existent variants and widen the attack surface.\n */\nconst NAMED_ENTITY_MAP: Record<string, string> = {\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n};\nconst DECODE_NAMED_ENTITY_RE = /&(colon|Tab|NewLine);/g;\n\nconst STRIP_XML_RE = /<\\?[\\s\\S]*?\\?>/g;\n\nconst DANGEROUS_TAG_RE =\n /(<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*>([\\s\\S]*?)<\\/\\2>|<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*\\/?>)/gi;\n\nconst DANGEROUS_PROTOCOL_GLOBAL_RE =\n /(j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t)\\s*:/gi;\n\nconst DANGEROUS_DATA_URI_RE =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/gi;\n\nconst UNSAFE_ATTR_RE = /\\bon\\w+\\s*=/gim;\n\n/** Global variant of DANGEROUS_CSS_RE for use inside sanitizeHtml. */\nconst DANGEROUS_CSS_GLOBAL_RE = new RegExp(DANGEROUS_CSS_RE.source, 'gim');\n\n// ============================================================================\n// sanitizeHtml\n// ============================================================================\n\n/**\n * O(n) single-pass scan for characters that indicate potential danger.\n * Much cheaper than running 5+ regexes on safe strings.\n */\nfunction needsSanitization(s: string): boolean {\n const len = s.length;\n for (let i = 0; i < len; i++) {\n const c = s.charCodeAt(i);\n // '<' (0x3C), '&' (0x26), control chars (0x00-0x1F excl. tab/nl/cr)\n if (c === 0x3c || c === 0x26 || (c <= 0x1f && c !== 0x09 && c !== 0x0a && c !== 0x0d)) {\n return true;\n }\n }\n\n // Use a more conservative check for protocols and event handlers.\n // Any colon or the pattern \"on\" + letter should trigger a full regex-based sanitization.\n if (s.indexOf(':') !== -1) return true;\n\n const lower = s.toLowerCase();\n const onIdx = lower.indexOf('on');\n if (onIdx !== -1 && onIdx < len - 2) {\n const nextChar = lower.charCodeAt(onIdx + 2);\n // Check if it's \"on\" followed by a letter (potential event handler like onclick)\n if (nextChar >= 97 && nextChar <= 122) return true;\n }\n\n return false;\n}\n\n/**\n * HTML sanitization for XSS mitigation using regex-based filtering.\n * Optimized with an early-exit fast-path for safe strings.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n if (!html) return '';\n const sInit = String(html);\n\n // Fast path: if no dangerous characters or patterns exist, skip all regex processing.\n if (!needsSanitization(sInit)) return sInit;\n\n let s = sInit\n .replace(STRIP_CTRL_RE, '')\n .replace(DECODE_NUMERIC_ENTITY_RE, (_, hex, dec) =>\n String.fromCodePoint(hex ? parseInt(hex, 16) : parseInt(dec, 10))\n )\n .replace(DECODE_NAMED_ENTITY_RE, (_, name) => NAMED_ENTITY_MAP[name] ?? '');\n\n if (s.indexOf('<') !== -1) {\n s = s.replace(STRIP_XML_RE, '');\n let prev: string;\n do {\n prev = s;\n s = s.replace(DANGEROUS_TAG_RE, '');\n } while (s !== prev);\n }\n\n return s\n .replace(DANGEROUS_PROTOCOL_GLOBAL_RE, 'data-unsafe-protocol:')\n .replace(DANGEROUS_DATA_URI_RE, 'data-unsafe-protocol:')\n .replace(UNSAFE_ATTR_RE, 'data-unsafe-attr=')\n .replace(DANGEROUS_CSS_GLOBAL_RE, 'data-unsafe-css:');\n}\n\n/** Checks for javascript:/vbscript: protocols in URL attributes. */\nexport const isDangerousUrl = (attr: string, val: string): boolean => {\n if (val.length < 10) return false; // \"javascript:\".length = 11\n const lower = attr.toLowerCase();\n return URL_ATTRS.has(lower) && DANGEROUS_PROTOCOL_RE.test(val);\n};\n\n/** Checks for protocols inside CSS url() functions. */\nexport const isDangerousCssValue = (val: string): boolean => {\n if (val.length < 15) return false; // \"url(javascript:)\".length = 15\n return val.toLowerCase().includes('url(') && DANGEROUS_CSS_URL_RE.test(val);\n};\n","import { computed, effect, isAtom, type ReadonlyAtom, untracked } from '@but212/atom-effect';\n\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from '@/constants';\nimport { registerMapEffect, registerReactiveEffect } from '@/core/effect-factory';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { debug } from '@/utils/debug';\n\nexport type { BindingContext };\n\nimport { hasOwn, isPromise } from '@/utils';\n\nimport {\n DANGEROUS_PROTOCOL_RE,\n isDangerousCssValue,\n sanitizeHtml,\n URL_ATTRS,\n} from '@/utils/sanitize';\n\n// Cache for CSS property camelization to avoid repeated regex overhead.\n// Uses Map instead of a plain object to avoid prototype pollution risk and\n// for clearer semantics — CSS property names are a small, finite set so the\n// cache is effectively bounded in practice.\nconst camelCache = new Map<string, string>();\nfunction getCamelCase(prop: string): string {\n let cached = camelCache.get(prop);\n if (cached !== undefined) return cached;\n\n cached = prop.includes('-') ? prop.replace(/-./g, (m) => m[1]!.toUpperCase()) : prop;\n camelCache.set(prop, cached);\n return cached;\n}\n\n/**\n * Cache for sanitized versions of reactive strings.\n * Ensures that if 100 elements are bound to the same atom, sanitizeHtml() is\n * called only once per update instead of 100 times.\n */\nconst htmlSanitizeCache = new WeakMap<\n ReadonlyAtom<string | Promise<string>>,\n ReadonlyAtom<string | Promise<string>>\n>();\n\nfunction getSanitizedHtml(\n source: ReadonlyAtom<string | Promise<string>>\n): ReadonlyAtom<string | Promise<string>> {\n let cached = htmlSanitizeCache.get(source);\n if (!cached) {\n cached = computed(() => {\n const val = source.value;\n if (isPromise(val)) {\n return val.then((v: string) => sanitizeHtml(v));\n }\n return sanitizeHtml(val);\n });\n htmlSanitizeCache.set(source, cached);\n }\n return cached;\n}\n\n// ============================================================================\n// Binding Context Factory\n// ============================================================================\n\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n el,\n trackCleanup: (fn) => registry.trackCleanup(el, fn),\n };\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\n/**\n * Updates element text content.\n */\nexport function bindText<T = unknown>(\n { el }: BindingContext,\n value: AsyncReactiveValue<T>,\n formatter?: (val: T) => string\n): void {\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const text = formatter ? formatter(val) : String(val ?? '');\n if (el.textContent !== text) el.textContent = text;\n },\n 'text'\n );\n}\n\n/**\n * Updates element inner HTML with XSS sanitization.\n */\nexport function bindHtml({ el }: BindingContext, value: AsyncReactiveValue<string>): void {\n const source = isAtom(value)\n ? getSanitizedHtml(value as ReadonlyAtom<string | Promise<string>>)\n : value;\n\n registerReactiveEffect(\n el,\n source,\n (val) => {\n const html = source === value ? sanitizeHtml(val) : val;\n if (el.innerHTML !== html) {\n registry.cleanupDescendants(el);\n el.innerHTML = html;\n }\n },\n 'html'\n );\n}\n\n/**\n * Toggles multiple CSS classes based on reactive boolean conditions.\n */\nexport function bindClass(\n { el }: BindingContext,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const tokenMap: Record<string, string[]> = {};\n for (const k in classMap) {\n if (hasOwn.call(classMap, k)) {\n const trimmed = k.trim();\n // Optimization: avoid regex for simple single-class keys\n tokenMap[k] = trimmed.indexOf(' ') === -1 ? [trimmed] : trimmed.split(/\\s+/).filter(Boolean);\n }\n }\n\n registerMapEffect(\n el,\n classMap,\n (states) => {\n for (const k in states) {\n const tokens = tokenMap[k]!;\n if (states[k]) {\n el.classList.add(...tokens);\n } else {\n el.classList.remove(...tokens);\n }\n }\n },\n 'class'\n );\n}\n\n/**\n * Updates multiple CSS style properties.\n */\nexport function bindCss({ el }: BindingContext, cssMap: Record<string, CssValue>): void {\n const style = el.style as unknown as Record<string, string | null>;\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const meta: Record<string, { camel: string; unit: string }> = {};\n\n for (const p in cssMap) {\n if (hasOwn.call(cssMap, p)) {\n const val = cssMap[p]!;\n const [src, unit] = Array.isArray(val) ? val : ([val, ''] as const);\n reactiveMap[p] = src;\n meta[p] = { camel: getCamelCase(p), unit };\n }\n }\n\n registerMapEffect(\n el,\n reactiveMap,\n (states) => {\n for (const p in states) {\n const m = meta[p]!;\n const val = states[p];\n const str = m.unit ? `${val}${m.unit}` : String(val);\n const camel = m.camel;\n if (!isDangerousCssValue(str) && style[camel] !== str) {\n style[camel] = str;\n }\n }\n },\n 'css'\n );\n}\n\n/**\n * Binds DOM attributes with security guards and primitive value constraints.\n */\nexport function bindAttr(\n { el }: BindingContext,\n attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>\n): void {\n const safeMap: Record<string, AsyncReactiveValue<PrimitiveValue>> = {};\n const metaMap: Record<string, { isAria: boolean; isUrl: boolean }> = {};\n const cache: Record<string, string | null> = {};\n\n for (const name in attrMap) {\n if (!hasOwn.call(attrMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`\n );\n continue;\n }\n safeMap[name] = attrMap[name]!;\n metaMap[name] = { isAria: lower.startsWith('aria-'), isUrl: URL_ATTRS.has(lower) };\n cache[name] = el.getAttribute(name);\n }\n\n registerMapEffect(\n el,\n safeMap,\n (states) => {\n for (const name in states) {\n const m = metaMap[name]!;\n const val = states[name] as PrimitiveValue;\n\n if (val == null || (val === false && !m.isAria)) {\n if (cache[name] !== null) el.removeAttribute(name);\n cache[name] = null;\n continue;\n }\n\n const newVal = val === true ? (m.isAria ? 'true' : name) : String(val);\n if (m.isUrl && DANGEROUS_PROTOCOL_RE.test(newVal)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n if (cache[name] !== newVal) {\n el.setAttribute(name, newVal);\n cache[name] = newVal;\n }\n }\n },\n 'attr'\n );\n}\n\n/**\n * Binds DOM properties. Uses strict property write guards and security filters.\n */\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, AsyncReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n const safeMap: Record<string, AsyncReactiveValue<unknown>> = {};\n const metaMap: Record<string, { isUrl: boolean }> = {};\n\n for (const name in propMap) {\n if (!hasOwn.call(propMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on') || DANGEROUS_PROPS.has(name)) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${\n lower.startsWith('on')\n ? ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)\n : ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)\n }`\n );\n continue;\n }\n safeMap[name] = propMap[name]!;\n metaMap[name] = { isUrl: URL_ATTRS.has(lower) };\n }\n\n registerMapEffect(\n ctx.el,\n safeMap,\n (states) => {\n for (const name in states) {\n const val = states[name];\n if (metaMap[name]!.isUrl && typeof val === 'string' && DANGEROUS_PROTOCOL_RE.test(val)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n if (el[name] !== val) {\n el[name] = val;\n }\n }\n },\n 'prop'\n );\n}\n\n/**\n * Handles visibility (display: none) toggle.\n */\nexport function bindVisibility(\n { el }: BindingContext,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n const show = el.style.display === 'none' ? '' : el.style.display;\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const target = invert !== !!val ? show : 'none';\n if (el.style.display !== target) el.style.display = target;\n },\n invert ? 'hide' : 'show'\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n */\nexport function bindVal(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tag = ctx.el.tagName.toLowerCase();\n if (!VALID_INPUT_TAGS.has(tag)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.INVALID_INPUT_ELEMENT(tag)}`);\n return;\n }\n const { fx, cleanup } = applyInputBinding($(ctx.el), atom, options);\n registry.trackEffect(ctx.el, fx);\n ctx.trackCleanup(cleanup);\n}\n\n/**\n * Two-way binding for checkbox/radio checked state.\n */\nexport function bindChecked(ctx: BindingContext, atom: WritableAtom<boolean>): void {\n const el = ctx.el as HTMLInputElement;\n const $el = $(el);\n\n const handler = () => {\n if (atom.peek() !== el.checked) {\n atom.value = el.checked;\n if (el.type === 'radio' && el.checked && el.name) {\n (el.form ? $(el.form) : $(document))\n .find(`input[type=\"radio\"][name=\"${el.name.replace(/\"/g, '\\\\\"')}\"]`)\n .not(el)\n .trigger('change.atomRadioSync');\n }\n }\n };\n (handler as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n $el.on('change change.atomRadioSync', handler);\n ctx.trackCleanup(() => $el.off('change change.atomRadioSync', handler));\n\n registry.trackEffect(\n el,\n effect(() => {\n const val = !!atom.value;\n untracked(() => {\n if (el.checked !== val) {\n el.checked = val;\n debug.domUpdated(LOG_PREFIXES.BINDING, el, 'checked', val);\n }\n });\n })\n );\n}\n\n// ============================================================================\n// Event Binding Handler\n// ============================================================================\n\nexport function bindEvents(ctx: BindingContext, eventMap: NonNullable<BindingOptions['on']>): void {\n const $el = $(ctx.el);\n $el.on(eventMap);\n ctx.trackCleanup(() => $el.off(eventMap));\n}\n\n/**\n * Binds a single event handler using jQuery's event system for compatibility.\n */\nexport function bindOn(\n { el, trackCleanup }: BindingContext,\n event: string,\n handler: (e: JQuery.TriggeredEvent) => void\n): void {\n const $el = $(el);\n $el.on(event, handler);\n trackCleanup(() => $el.off(event, handler));\n}\n\n/**\n * Disposes all reactive bindings on an element and its descendants.\n */\nexport function bindUnbind(el: HTMLElement): void {\n registry.cleanupTree(el);\n}\n","import {\n atom as createAtom,\n effect,\n getPathValue,\n setDeepValue,\n untracked,\n type WritableAtom,\n} from '@but212/atom-effect';\nimport { registry } from '@/core/registry';\nimport type { ValOptions } from '@/types';\nimport { bindChecked, bindVal, createContext } from './unified';\n\n/**\n * Binds an entire form to a single object-based atom.\n *\n * DESIGN STRATEGY:\n * Optimized for O(1) performance on large forms. Instead of each input\n * directly observing a \"lens\" of the root atom (which would create N effects),\n * we use a single centralized 'rootDispatcher' effect. This dispatcher\n * watches the root atom once and pushes updates to individual 'leaf atoms'\n * only when their specific values change, eliminating O(N) effect fan-out.\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: ValOptions<unknown> = {}\n): void {\n // Use a flat array for O(N) iteration without Map iterator overhead\n const fieldAtoms = new Map<string, WritableAtom<unknown>>();\n const fields: { atom: WritableAtom<unknown>; parts: string[] }[] = [];\n\n // Single effect to watch the root atom and dispatch updates to individual fields.\n // This ensures that typing in one field doesn't trigger O(N) re-computations\n // across all other fields.\n const rootDispatcher = effect(() => {\n const rootValue = atom.value; // Subscribes to the root atom once\n const len = fields.length;\n if (len === 0) return;\n\n untracked(() => {\n for (let i = 0; i < len; i++) {\n const item = fields[i]!;\n const newValue = getPathValue(rootValue, item.parts);\n // Only trigger the leaf atom if the value actually changed.\n if (!Object.is(item.atom.peek(), newValue)) {\n item.atom.value = newValue;\n }\n }\n });\n });\n\n // Track the dispatcher for cleanup when the form is removed.\n registry.trackEffect(form, rootDispatcher);\n\n const getOrFieldAtom = (name: string): WritableAtom<unknown> => {\n let fieldAtom = fieldAtoms.get(name);\n if (!fieldAtom) {\n const parts = name.includes('.') ? name.split('.') : [name];\n\n // Create a leaf atom that only holds the value of this specific field.\n fieldAtom = createAtom(getPathValue(atom.peek(), parts));\n fields.push({ atom: fieldAtom, parts });\n\n // Separate effect to sync changes from the field atom back to the root atom.\n registry.trackEffect(\n form,\n effect(() => {\n const newValue = fieldAtom!.value; // Subscribes to the leaf atom only\n const currentRoot = atom.peek();\n const nextRoot = setDeepValue(currentRoot, parts, 0, newValue);\n\n if (nextRoot !== currentRoot) {\n atom.value = nextRoot as T;\n }\n })\n );\n\n fieldAtoms.set(name, fieldAtom);\n }\n return fieldAtom;\n };\n\n const bindElement = (el: Element) => {\n if (\n !(\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n )\n ) {\n return;\n }\n const name = el.name;\n if (!name || registry.hasBind(el)) return;\n\n const fieldAtom = getOrFieldAtom(name);\n const controlCtx = createContext(el as HTMLElement);\n\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) {\n bindChecked(controlCtx, fieldAtom as WritableAtom<boolean>);\n } else {\n bindVal(controlCtx, fieldAtom, options);\n }\n };\n\n for (let i = 0, len = form.elements.length; i < len; i++) {\n bindElement(form.elements[i]!);\n }\n\n const observer = new MutationObserver((mutations) => {\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const mutation = mutations[i]!;\n if (mutation.type === 'childList') {\n for (let j = 0, aLen = mutation.addedNodes.length; j < aLen; j++) {\n const node = mutation.addedNodes[j]!;\n if (node.nodeType === 1) {\n const el = node as HTMLElement;\n bindElement(el);\n // Search for inputs within the newly added fragment\n const controls = el.matches?.('input, select, textarea')\n ? [el]\n : el.querySelectorAll('input, select, textarea');\n for (let k = 0, cLen = controls.length; k < cLen; k++) {\n bindElement(controls[k]!);\n }\n }\n }\n } else if (mutation.type === 'attributes' && mutation.attributeName === 'name') {\n bindElement(mutation.target as Element);\n }\n }\n });\n\n observer.observe(form, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['name'],\n });\n\n registry.trackCleanup(form, () => observer.disconnect());\n}\n","import $ from 'jquery';\nimport { bindForm } from '@/bindings/form';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindEvents,\n bindHtml,\n bindOn,\n bindProp,\n bindText,\n bindUnbind,\n bindVal,\n bindVisibility,\n createContext,\n} from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssBindings,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nimport { debug } from '@/utils/debug';\n\n/**\n * Internal helper to iterate over a jQuery set and apply a binding function\n * to each Element node. Handles nodeType check and context creation.\n */\nfunction atomEachElement(jq: JQuery, fn: (ctx: BindingContext, el: HTMLElement) => void): JQuery {\n const len = jq.length;\n for (let i = 0; i < len; i++) {\n const node = jq[i];\n if (node?.nodeType === 1) {\n const el = node as HTMLElement;\n fn(createContext(el), el);\n } else if (node) {\n debug.log(LOG_PREFIXES.BINDING, `Skipping non-Element node (nodeType=${node.nodeType})`);\n }\n }\n return jq;\n}\n\n/**\n * Binds element `textContent` to a reactive source.\n */\n$.fn.atomText = function <T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return atomEachElement(this, (ctx) => bindText(ctx, source, formatter));\n};\n\n/**\n * Binds element `innerHTML` to a reactive string source.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (ctx) => bindHtml(ctx, source));\n};\n\n/**\n * Toggles one or more CSS classes based on reactive boolean conditions.\n */\n$.fn.atomClass = function (\n this: JQuery,\n classNameOrMap: string | Record<string, AsyncReactiveValue<boolean>>,\n condition?: AsyncReactiveValue<boolean>\n): JQuery {\n if (typeof classNameOrMap === 'string') {\n if (condition === undefined) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_CONDITION('atomClass')}`\n );\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [classNameOrMap]: condition };\n return atomEachElement(this, (ctx) => bindClass(ctx, map));\n }\n return atomEachElement(this, (ctx) => bindClass(ctx, classNameOrMap));\n};\n\n/**\n * Binds one or more CSS style properties to reactive values.\n */\n$.fn.atomCss = function (\n this: JQuery,\n propOrMap: string | CssBindings,\n source?: AsyncReactiveValue<string | number>,\n unit?: string\n): JQuery {\n if (typeof propOrMap === 'string') {\n if (source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [propOrMap]: unit ? [source as ReactiveValue<number>, unit] : source! };\n return atomEachElement(this, (ctx) => bindCss(ctx, map as CssBindings));\n }\n return atomEachElement(this, (ctx) => bindCss(ctx, propOrMap));\n};\n\n/**\n * Binds one or more HTML attributes to reactive values with security guards.\n */\n$.fn.atomAttr = function (\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<PrimitiveValue>>,\n source?: AsyncReactiveValue<PrimitiveValue>\n): JQuery {\n if (typeof nameOrMap === 'string') {\n if (source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomAttr')}`);\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [nameOrMap]: source };\n return atomEachElement(this, (ctx) => bindAttr(ctx, map));\n }\n return atomEachElement(this, (ctx) => bindAttr(ctx, nameOrMap));\n};\n\n/**\n * Binds one or more DOM properties to reactive values.\n */\n$.fn.atomProp = function <T>(\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<T>>,\n source?: AsyncReactiveValue<T>\n): JQuery {\n if (typeof nameOrMap === 'string') {\n if (source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomProp')}`);\n return this;\n }\n // Hoist map creation outside the element loop\n const map = { [nameOrMap]: source } as Record<string, AsyncReactiveValue<unknown>>;\n return atomEachElement(this, (ctx) => bindProp(ctx, map));\n }\n return atomEachElement(this, (ctx) =>\n bindProp(ctx, nameOrMap as Record<string, AsyncReactiveValue<unknown>>)\n );\n};\n\n/**\n * Shows the element when `condition` is truthy (`display: ''`).\n */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx, condition, false));\n};\n\n/**\n * Hides the element when `condition` is truthy (`display: 'none'`).\n */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx, condition, true));\n};\n\n/**\n * Two-way binding for `<input>`, `<select>`, and `<textarea>` values.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return atomEachElement(this, (ctx) =>\n bindVal(ctx, atom as WritableAtom<unknown>, options as unknown as ValOptions<unknown>)\n );\n};\n\n/**\n * Two-way binding for checkbox and radio button `checked` state.\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindChecked(ctx, atom));\n};\n\n/**\n * Two-way binding for an entire form.\n */\n$.fn.atomForm = function <T extends object>(\n atom: WritableAtom<T>,\n options: ValOptions<unknown> = {}\n): JQuery {\n return atomEachElement(this, (_, el) => {\n if (el instanceof HTMLFormElement) bindForm(el, atom, options);\n });\n};\n\n/**\n * Attaches a lifecycle-aware event handler using the jQuery event system.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (ctx) => bindOn(ctx, event, handler));\n};\n\n/**\n * Lookup table for reactive binding handlers.\n * Ordered to match the bitmask bits in atomBind.\n */\nconst BIND_HANDLERS: Array<(ctx: BindingContext, options: BindingOptions<unknown>) => void> = [\n (ctx, o) => bindText(ctx, o.text), // 1 << 0\n (ctx, o) => bindHtml(ctx, o.html!), // 1 << 1\n (ctx, o) => bindClass(ctx, o.class!), // 1 << 2\n (ctx, o) => bindCss(ctx, o.css!), // 1 << 3\n (ctx, o) => bindAttr(ctx, o.attr!), // 1 << 4\n (ctx, o) => bindProp(ctx, o.prop as Record<string, AsyncReactiveValue<unknown>>), // 1 << 5\n (ctx, o) => bindVisibility(ctx, o.show!, false), // 1 << 6\n (ctx, o) => bindVisibility(ctx, o.hide!, true), // 1 << 7\n (ctx, o) => {\n // 1 << 8: val\n const v = o.val!;\n if (Array.isArray(v)) {\n bindVal(ctx, v[0] as WritableAtom<unknown>, v[1] as ValOptions<unknown>);\n } else {\n bindVal(ctx, v as WritableAtom<unknown>);\n }\n },\n (ctx, o) => bindChecked(ctx, o.checked!), // 1 << 9\n (ctx, o) => {\n // 1 << 10: form\n if (ctx.el instanceof HTMLFormElement) {\n bindForm(ctx.el, o.form as WritableAtom<object>);\n }\n },\n (ctx, o) => bindEvents(ctx, o.on!), // 1 << 11\n];\n\n/**\n * Integrated multi-behavior reactive binding.\n * Uses a bitmask dispatch strategy to minimize branch mispredictions in hot-path.\n */\n$.fn.atomBind = function <T>(this: JQuery, options: BindingOptions<T>): JQuery {\n let mask = 0;\n if (options.text !== undefined) mask |= 1 << 0;\n if (options.html !== undefined) mask |= 1 << 1;\n if (options.class !== undefined) mask |= 1 << 2;\n if (options.css !== undefined) mask |= 1 << 3;\n if (options.attr !== undefined) mask |= 1 << 4;\n if (options.prop !== undefined) mask |= 1 << 5;\n if (options.show !== undefined) mask |= 1 << 6;\n if (options.hide !== undefined) mask |= 1 << 7;\n if (options.val !== undefined) mask |= 1 << 8;\n if (options.checked !== undefined) mask |= 1 << 9;\n if (options.form !== undefined) mask |= 1 << 10;\n if (options.on !== undefined) mask |= 1 << 11;\n\n if (mask === 0) return this;\n\n return atomEachElement(this, (ctx) => {\n let m = mask;\n while (m > 0) {\n const bit = m & -m;\n const idx = 31 - Math.clz32(bit);\n BIND_HANDLERS[idx]!(ctx, options as BindingOptions<unknown>);\n m ^= bit;\n }\n });\n};\n\n/**\n * Destroys all reactive bindings on the selected elements **and their descendants**.\n */\n$.fn.atomUnbind = function (this: JQuery): JQuery {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const node = this[i];\n if (node?.nodeType === 1) {\n bindUnbind(node as HTMLElement);\n }\n }\n return this;\n};\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { EffectObject, ListKey, ListKeyFn, ListOptions, ReadonlyAtom } from '@/types';\nimport { getSelector, hasOwn, shallowEqual } from '@/utils';\nimport { ArrayPool } from '@/utils/array-pool';\nimport { debug } from '@/utils/debug';\nimport { ObjectPool } from '@/utils/object-pool';\nimport { sanitizeHtml } from '@/utils/sanitize';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst listInstances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\nlet listBatchIdCounter = 0;\n\nconst mapPool = new ObjectPool<Map<ListKey, number>>(\n () => new Map(),\n (m) => m.clear()\n);\nconst setPool = new ObjectPool<Set<ListKey>>(\n () => new Set(),\n (s) => s.clear()\n);\nconst arrayPool = new ArrayPool<unknown>(100, 1024);\n\nfunction insertOrAppend(elOrJq: Element | JQuery, nextNode: Node | null, container: Element): void {\n // Optimization: insertBefore(node, null) is same as appendChild(node)\n if (elOrJq instanceof Element) {\n container.insertBefore(elOrJq, nextNode);\n return;\n }\n const len = elOrJq.length;\n for (let i = 0; i < len; i++) {\n const el = elOrJq[i];\n if (el) {\n container.insertBefore(el, nextNode);\n }\n }\n}\n\nfunction wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n// ============================================================================\n// ListContext\n// ============================================================================\n\nclass ListContext<T> {\n oldKeys: ListKey[] = [];\n oldItems: T[] = [];\n oldNodes: (Element | JQuery)[] = [];\n\n readonly removingKeys = new Set<ListKey>();\n $emptyEl: JQuery | null = null;\n readonly keyToIndex = new Map<ListKey, number>();\n fx?: EffectObject;\n\n statesBuffer = new Uint8Array(256);\n indicesBuffer = new Int32Array(256);\n\n constructor(\n public readonly $container: JQuery,\n /** @internal */\n public readonly containerSelector: string,\n public readonly onRemove: (($el: JQuery) => Promise<void> | void) | undefined\n ) {}\n\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commit = () => {\n if (this.fx?.isDisposed) return;\n if ($el[0]?.isConnected) $el.remove();\n this.removingKeys.delete(k);\n debug.log(LOG_PREFIXES.LIST, `${this.containerSelector} removed item:`, k);\n };\n\n const res = this.onRemove?.($el);\n if (res instanceof Promise) res.then(commit, commit);\n else commit();\n }\n\n removeItem(k: ListKey, $el: JQuery): void {\n for (let j = 0; j < $el.length; j++) {\n if ($el[j] instanceof Element) ($el[j] as Element).removeAttribute('data-atom-key');\n }\n this.removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n dispose(): void {\n this.removingKeys.clear();\n this.oldKeys.length = 0;\n this.oldItems.length = 0;\n this.oldNodes.length = 0;\n this.keyToIndex.clear();\n this.$emptyEl?.remove();\n this.$container.off('.atomList');\n this.statesBuffer = new Uint8Array(0);\n this.indicesBuffer = new Int32Array(0);\n }\n\n ensureBuffers(size: number): void {\n if (this.statesBuffer.length < size) {\n this.statesBuffer = new Uint8Array(Math.max(size, this.statesBuffer.length * 2));\n }\n if (this.indicesBuffer.length < size) {\n this.indicesBuffer = new Int32Array(Math.max(size, this.indicesBuffer.length * 2));\n }\n }\n}\n\n// ============================================================================\n// Internal diff types\n// ============================================================================\n\ninterface PreparedDiff<T> {\n newKeys: ListKey[];\n newKeySet: Set<ListKey>;\n newItems: T[];\n newNodes: (Element | JQuery)[];\n newStates: Uint8Array;\n newIndices: Int32Array;\n trKeys: ListKey[];\n trItems: T[];\n trIdxs: number[];\n startIndex: number;\n oldEndIndex: number;\n newEndIndex: number;\n}\n\ninterface PlaceCallbacks<T> {\n bind: ListOptions<T>['bind'];\n update: ListOptions<T>['update'];\n onAdd: ListOptions<T>['onAdd'];\n onRemove: ListOptions<T>['onRemove'];\n events: ListOptions<T>['events'];\n}\n\n// ============================================================================\n// Step functions\n// ============================================================================\n\nfunction handleEmpty<T>(\n ctx: ListContext<T>,\n itemCount: number,\n $container: JQuery,\n empty: ListOptions<T>['empty']\n): void {\n if (ctx.$emptyEl && itemCount > 0) {\n ctx.$emptyEl.remove();\n ctx.$emptyEl = null;\n }\n if (itemCount !== 0) return;\n\n const { oldKeys, oldNodes, onRemove } = ctx;\n if (!onRemove) {\n for (let i = 0, len = oldKeys.length; i < len; i++) ctx.removingKeys.delete(oldKeys[i]!);\n $container.empty();\n } else {\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n const k = oldKeys[i]!;\n if (oldNodes[i]) ctx.removeItem(k, wrap(oldNodes[i]!));\n }\n }\n\n if (empty && !ctx.$emptyEl) {\n ctx.$emptyEl = (typeof empty === 'string'\n ? $(sanitizeHtml(empty))\n : $(empty as Element | JQuery)) as unknown as JQuery;\n ctx.$emptyEl.appendTo($container);\n }\n\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes);\n ctx.oldKeys = [];\n ctx.oldItems = [];\n ctx.oldNodes = [];\n}\n\nfunction buildIndices<T>(\n ctx: ListContext<T>,\n items: T[],\n itemCount: number,\n getKey: ListKeyFn<T>,\n update: ListOptions<T>['update'],\n isEqual: ListOptions<T>['isEqual']\n): PreparedDiff<T> {\n const { oldKeys, oldItems, oldNodes, removingKeys, keyToIndex } = ctx;\n const oldLen = oldKeys.length;\n\n let startIndex = 0,\n oldEndIndex = oldLen - 1,\n newEndIndex = itemCount - 1;\n\n const eq = isEqual || shallowEqual;\n\n while (startIndex <= oldEndIndex && startIndex <= newEndIndex) {\n const item = items[startIndex]!;\n const k = getKey(item, startIndex);\n if (oldKeys[startIndex] !== k || !eq(oldItems[startIndex]!, item)) {\n break;\n }\n keyToIndex.set(k, startIndex++);\n }\n\n while (oldEndIndex >= startIndex && newEndIndex >= startIndex) {\n const item = items[newEndIndex]!;\n const k = getKey(item, newEndIndex);\n if (oldKeys[oldEndIndex] !== k || !eq(oldItems[oldEndIndex]!, item)) {\n break;\n }\n keyToIndex.set(k, newEndIndex--);\n oldEndIndex--;\n }\n\n const oldIndexMap = mapPool.acquire();\n for (let i = startIndex; i <= oldEndIndex; i++) oldIndexMap.set(oldKeys[i]!, i);\n\n const newKeySet = setPool.acquire();\n ctx.ensureBuffers(itemCount);\n\n const newKeys = arrayPool.acquire() as ListKey[];\n newKeys.length = itemCount;\n const newItems = arrayPool.acquire() as T[];\n newItems.length = itemCount;\n const newNodes = arrayPool.acquire() as (Element | JQuery)[];\n newNodes.length = itemCount;\n const newStates = ctx.statesBuffer,\n newIndices = ctx.indicesBuffer;\n\n const trKeys = arrayPool.acquire() as ListKey[],\n trItems = arrayPool.acquire() as T[],\n trIdxs = arrayPool.acquire() as number[];\n\n for (let i = 0; i < startIndex; i++) {\n newKeys[i] = oldKeys[i]!;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[i]!;\n newStates[i] = 3;\n newIndices[i] = i;\n }\n for (let j = oldLen - 1, i = itemCount - 1; i > newEndIndex; i--, j--) {\n newKeys[i] = oldKeys[j]!;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[j]!;\n newStates[i] = 3;\n newIndices[i] = j;\n }\n\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!,\n k = getKey(item, i);\n newKeys[i] = k;\n newItems[i] = item;\n keyToIndex.set(k, i);\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.LIST.DUPLICATE_KEY(k, i, ctx.containerSelector));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const oldIdx = oldIndexMap.get(k);\n if (oldIdx === undefined) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newIndices[i] = -1;\n newStates[i] = 1;\n continue;\n }\n\n const oldItem = oldItems[oldIdx]!;\n newNodes[i] = oldNodes[oldIdx]!;\n\n if (\n !update &&\n oldItem !== item &&\n !(isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item))\n ) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newStates[i] = 2;\n } else {\n newStates[i] = 0;\n }\n newIndices[i] = removingKeys.has(k) ? -1 : oldIdx;\n }\n\n mapPool.release(oldIndexMap);\n return {\n newKeys,\n newKeySet,\n newItems,\n newNodes,\n newStates,\n newIndices,\n trKeys,\n trItems,\n trIdxs,\n startIndex,\n oldEndIndex,\n newEndIndex,\n };\n}\n\nfunction renderItems<T>(\n diff: PreparedDiff<T>,\n options: ListOptions<T>,\n isInitial: boolean\n): string[] | null {\n const { trKeys, trItems, trIdxs, newNodes, newStates } = diff;\n const renderCount = trKeys.length;\n const renderResults: (string | Element | DocumentFragment | JQuery)[] = new Array(renderCount);\n const htmlParts: string[] = [];\n let stringCount = 0;\n\n for (let t = 0; t < renderCount; t++) {\n const raw = options.render(trItems[t]!, trIdxs[t]!);\n renderResults[t] = raw;\n if (typeof raw === 'string') {\n htmlParts.push(raw);\n stringCount++;\n }\n }\n\n let sanitized: string[] | null = null;\n if (htmlParts.length > 0) {\n if (htmlParts.length === 1) sanitized = [sanitizeHtml(htmlParts[0]!)];\n else {\n const sep = `<template data-atom-sep=\"${(listBatchIdCounter++).toString(36)}\"></template>`;\n sanitized = sanitizeHtml(htmlParts.join(sep)).split(sep);\n }\n }\n\n if (\n isInitial &&\n sanitized &&\n stringCount === renderCount &&\n !options.bind &&\n !options.onAdd &&\n !options.onRemove &&\n !options.events\n ) {\n return sanitized;\n }\n\n let fragIdx = 0;\n for (let t = 0; t < renderCount; t++) {\n const raw = renderResults[t]!;\n const $el = (typeof raw === 'string'\n ? $(sanitized![fragIdx++]!)\n : $(raw as Element | DocumentFragment | JQuery)) as unknown as JQuery;\n const targetIdx = trIdxs[t]!,\n keyStr = String(trKeys[t]!);\n\n for (let j = 0, elLen = $el.length; j < elLen; j++) {\n const node = $el[j];\n if (node instanceof Element) {\n node.setAttribute('data-atom-key', keyStr);\n }\n }\n\n if (newStates[targetIdx] === 2 && newNodes[targetIdx]) {\n const node = newNodes[targetIdx]!;\n if (node instanceof Element) {\n registry.cleanupTree(node);\n } else {\n for (let j = 0, nLen = node.length; j < nLen; j++) {\n const el = node[j];\n if (el instanceof Element) registry.cleanupTree(el);\n }\n }\n wrap(node).replaceWith($el);\n }\n newNodes[targetIdx] = $el.length === 1 ? ($el[0] as Element) : $el;\n }\n return null;\n}\n\nfunction cleanupRemoved<T>(ctx: ListContext<T>, diff: PreparedDiff<T>): void {\n const { startIndex, oldEndIndex, newKeySet } = diff;\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = ctx.oldKeys[i]!;\n if (!newKeySet.has(k) && ctx.oldNodes[i]) ctx.removeItem(k, wrap(ctx.oldNodes[i]!));\n }\n}\n\nfunction placeItems<T>(\n ctx: ListContext<T>,\n diff: PreparedDiff<T>,\n rawContainer: Element,\n callbacks: PlaceCallbacks<T>,\n innerHtmlFragments: string[] | null\n): void {\n const { newKeys, newItems, newNodes, newStates, newIndices } = diff;\n const itemCount = newKeys.length;\n\n if (innerHtmlFragments !== null) {\n rawContainer.innerHTML = innerHtmlFragments.join('');\n let el = rawContainer.firstElementChild;\n for (let i = 0; i < itemCount; i++) {\n if (!el) break;\n el.setAttribute('data-atom-key', String(newKeys[i]));\n newNodes[i] = el;\n newStates[i] = 0;\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $(el) as unknown as JQuery, 'list.add', newItems[i]);\n el = el.nextElementSibling;\n }\n return;\n }\n\n if (ctx.oldKeys.length === 0) {\n const frag = document.createDocumentFragment();\n for (let i = 0; i < itemCount; i++) {\n const node = newNodes[i]!;\n if (node instanceof Element) frag.appendChild(node);\n else for (let j = 0; j < node.length; j++) frag.appendChild(node[j]!);\n }\n rawContainer.appendChild(frag);\n } else {\n let nextNode: Node | null = null,\n min = 2147483647;\n for (let i = itemCount - 1; i >= 0; i--) {\n const idx = newIndices[i]!;\n if (idx !== -1 && idx < min) {\n min = idx;\n } else {\n insertOrAppend(newNodes[i]!, nextNode, rawContainer);\n }\n const node = newNodes[i]!;\n nextNode = node instanceof Element ? node : (node[0] ?? null);\n }\n }\n\n for (let i = 0; i < itemCount; i++) {\n const state = newStates[i]!;\n if (state !== 3) {\n const $el = wrap(newNodes[i]!),\n item = newItems[i]!;\n if (state === 0) callbacks.update?.($el, item, i);\n else callbacks.bind?.($el, item, i);\n if (state === 1) {\n callbacks.onAdd?.($el);\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $el, 'list.add', item);\n }\n }\n }\n}\n\n// ============================================================================\n// atomList\n// ============================================================================\n\n$.fn.atomList = function <T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const getKey: ListKeyFn<T> =\n typeof options.key === 'function'\n ? options.key\n : (item: T) => item[options.key as keyof T] as unknown as ListKey;\n const callbacks: PlaceCallbacks<T> = {\n bind: options.bind,\n update: options.update,\n onAdd: options.onAdd,\n onRemove: options.onRemove,\n events: options.events,\n };\n\n for (let cIdx = 0, cLen = this.length; cIdx < cLen; cIdx++) {\n const raw = this[cIdx]!,\n $c = $(raw);\n $c.off('.atomList');\n const old = listInstances.get(raw);\n if (old) {\n old.fx.dispose();\n old.ctx.dispose();\n }\n\n const ctx = new ListContext<T>($c, getSelector(raw), options.onRemove);\n const fx = effect(() => {\n const items = source.value,\n len = items.length;\n untracked(() => {\n handleEmpty(ctx, len, $c, options.empty);\n if (len === 0) return;\n debug.log(LOG_PREFIXES.LIST, `${ctx.containerSelector} updating with ${len} items`);\n\n const diff = buildIndices(ctx, items, len, getKey, options.update, options.isEqual);\n const frag = renderItems(diff, options, ctx.oldKeys.length === 0);\n cleanupRemoved(ctx, diff);\n placeItems(ctx, diff, raw, callbacks, frag);\n\n if (options.events) {\n for (let i = diff.startIndex; i <= diff.oldEndIndex; i++) {\n if (!diff.newKeySet.has(ctx.oldKeys[i]!)) ctx.keyToIndex.delete(ctx.oldKeys[i]!);\n }\n }\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes);\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n setPool.release(diff.newKeySet);\n arrayPool.release(diff.trKeys);\n arrayPool.release(diff.trItems);\n arrayPool.release(diff.trIdxs);\n });\n });\n\n ctx.fx = fx;\n if (options.events) {\n for (const ek in options.events) {\n if (!hasOwn.call(options.events, ek)) continue;\n const s = ek.indexOf(' '),\n type = s === -1 ? ek : ek.slice(0, s),\n sel = s === -1 ? '> *' : ek.slice(s + 1).trim();\n const handler = options.events[ek]!;\n\n $c.on(`${type}.atomList`, sel, function (this: Element, e: JQuery.TriggeredEvent) {\n const itemEl = (e.target as Element).closest?.('[data-atom-key]') as HTMLElement | null;\n const rk = itemEl?.getAttribute('data-atom-key');\n if (rk === null || rk === undefined) return;\n\n let k: ListKey = rk;\n if (!ctx.keyToIndex.has(rk)) {\n const nk = Number(rk);\n if (!Number.isNaN(nk) && ctx.keyToIndex.has(nk)) k = nk;\n }\n const idx = ctx.keyToIndex.get(k);\n if (idx !== undefined) handler.call(itemEl as HTMLElement, ctx.oldItems[idx]!, idx, e);\n });\n }\n }\n registry.trackEffect(raw, fx);\n listInstances.set(raw, { fx, ctx });\n registry.trackCleanup(raw, () => {\n ctx.dispose();\n listInstances.delete(raw);\n });\n }\n return this;\n};\n","import { untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { bindUnbind } from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { ComponentFn } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst EMPTY_PROPS = Object.freeze({});\n\n// ============================================================================\n// jQuery plugin methods\n// ============================================================================\n\n/**\n * Mounts a functional component on each selected element.\n *\n * @param component - Function receiving `($el, props)` and returning an\n * optional cleanup callback. See {@link ComponentFn}.\n * @param props - Props passed to the component. When omitted, `P` must be\n * compatible with an empty object (i.e. all fields optional or\n * `P = object`). Passing no props to a component with required fields is\n * a type error that TypeScript will catch at the call site, but only when\n * `props` is explicitly typed — the `{} as P` fallback is not type-safe\n * for components with required fields, which is why the cast is explicit\n * rather than implicit.\n */\n$.fn.atomMount = function <P>(this: JQuery, component: ComponentFn<P>, props?: P): JQuery {\n const p = (props ?? EMPTY_PROPS) as P;\n const compName = component.name || 'Component';\n\n for (let i = 0, len = this.length; i < len; i++) {\n const rootEl = this[i];\n if (!rootEl) continue;\n\n registry.cleanupTree(rootEl);\n try {\n // Untracked execution prevents component initialization from leaking into parent effects\n const teardown = untracked(() => component($(rootEl), p));\n if (typeof teardown === 'function') {\n registry.setComponentCleanup(rootEl, teardown);\n }\n } catch (err) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.ERROR(compName), err);\n }\n }\n return this;\n};\n\n/**\n * Unmounts the component and disposes all reactive bindings on each selected\n * element and its descendants.\n */\n$.fn.atomUnmount = function (this: JQuery): JQuery {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i];\n if (el) bindUnbind(el);\n }\n return this;\n};\n","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { computed, atom as createAtom, effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES, ROUTE_DEFAULTS } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// --- Helper: Safe History API Wrappers ---\nfunction safePushState(data: unknown, url: string | URL | null): void {\n try {\n history.pushState(data, '', url);\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'PushState failed (likely file:// protocol or security restriction). UI will update, but URL will not.',\n e\n );\n }\n}\n\nclass RouterImpl implements Router {\n public currentRoute: ReadonlyAtom<string>;\n public queryParams: ReadonlyAtom<Record<string, string>>;\n\n private config: RouteConfig &\n Required<Pick<RouteConfig, 'mode' | 'basePath' | 'autoBindLinks' | 'activeClass'>>;\n private readonly isHistoryMode: boolean;\n private readonly basePath: string;\n private readonly activeClass: string;\n\n private isDestroyed = false;\n private previousRoute = '';\n private previousUrl: string;\n private cleanups: Array<() => void> = [];\n private $target: JQuery;\n private currentRouteAtom: WritableAtom<string>;\n private queryParamsAtom: WritableAtom<Record<string, string>>;\n private templateCache = new Map<string, HTMLTemplateElement>();\n private routeCleanups: Array<() => void> = [];\n private lastRawQuery = '';\n private cachedParams: Record<string, string> = {};\n\n constructor(config: RouteConfig) {\n this.config = {\n mode: ROUTE_DEFAULTS.mode,\n basePath: ROUTE_DEFAULTS.basePath,\n autoBindLinks: ROUTE_DEFAULTS.autoBindLinks,\n activeClass: ROUTE_DEFAULTS.activeClass,\n ...config,\n } as typeof this.config;\n\n this.isHistoryMode = this.config.mode === 'history';\n this.basePath = this.config.basePath.replace(/\\/$/, '');\n this.activeClass = this.config.activeClass;\n\n this.$target = $(this.config.target);\n this.previousUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n this.currentRouteAtom = createAtom(this.getRouteName());\n this.currentRoute = this.currentRouteAtom;\n this.queryParamsAtom = createAtom(this.getQueryParams());\n this.queryParams = computed(() => this.queryParamsAtom.value);\n this.init();\n }\n\n private init() {\n const event = this.isHistoryMode ? 'popstate' : 'hashchange';\n const handler = this.handleUrlChange.bind(this);\n window.addEventListener(event, handler);\n this.cleanups.push(() => window.removeEventListener(event, handler));\n\n const renderEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n untracked(() => {\n for (const fn of this.routeCleanups)\n try {\n fn();\n } catch {}\n this.routeCleanups.length = 0;\n });\n this.renderRoute(routeName);\n });\n this.cleanups.push(() => renderEffect.dispose());\n this.setupAutoBindLinks();\n if (this.$target[0]) registry.trackCleanup(this.$target[0], () => this.destroy());\n }\n\n private getRouteName(): string {\n const { default: defaultRoute } = this.config;\n if (this.isHistoryMode) {\n const base = this.basePath;\n let path = location.pathname;\n if (base && path.startsWith(base)) {\n path = path.substring(base.length);\n }\n return path.replace(/^\\//, '') || defaultRoute!;\n }\n return location.hash.split('?')[0]!.substring(1) || defaultRoute!;\n }\n\n private getQueryParams(): Record<string, string> {\n const hash = location.hash;\n const queryIndex = hash.indexOf('?');\n const raw = this.isHistoryMode\n ? location.search.substring(1)\n : queryIndex !== -1\n ? hash.substring(queryIndex + 1)\n : '';\n\n if (raw === this.lastRawQuery) return this.cachedParams;\n this.lastRawQuery = raw;\n\n const res: Record<string, string> = {};\n let newLen = 0;\n if (raw) {\n new URLSearchParams(raw).forEach((v, k) => {\n res[k] = v;\n newLen++;\n });\n }\n\n let oldLen = 0;\n for (const _ in this.cachedParams) oldLen++;\n\n let changed = newLen !== oldLen;\n if (!changed) {\n for (const k in res) {\n if (res[k] !== this.cachedParams[k]) {\n changed = true;\n break;\n }\n }\n }\n\n if (changed) {\n if (raw.indexOf('%') !== -1)\n try {\n decodeURIComponent(raw);\n } catch {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.MALFORMED_URI(raw));\n }\n this.cachedParams = res;\n }\n return this.cachedParams;\n }\n\n private setUrl(name: string): void {\n const url = this.isHistoryMode ? `${this.basePath}/${name}` : `#${name}`;\n if (this.isHistoryMode) {\n safePushState(null, url);\n } else {\n location.hash = url;\n }\n this.previousUrl = this.isHistoryMode ? url : location.hash;\n }\n\n private restoreUrl(): void {\n if (this.isHistoryMode) {\n safePushState(null, this.previousUrl);\n } else {\n location.hash = this.previousUrl;\n }\n }\n\n private renderRoute(name: string): void {\n if (this.isDestroyed || !this.$target[0]) return;\n const { routes, notFound, beforeTransition, afterTransition } = this.config;\n const cfg = routes[name] ?? (notFound ? routes[notFound] : undefined);\n if (!cfg) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.NOT_FOUND(name));\n return;\n }\n\n const params = this.getQueryParams(),\n from = this.previousRoute;\n if (beforeTransition) untracked(() => beforeTransition(from, name));\n\n this.$target.empty();\n let routeParams = params;\n if (cfg.onEnter) {\n const res = untracked(() => cfg.onEnter!(params, this));\n if (res) routeParams = { ...params, ...res };\n }\n\n const onUnmount = (fn: () => void) => this.routeCleanups.push(fn);\n if (cfg.render) cfg.render(this.$target[0], name, routeParams, onUnmount, this);\n else if (cfg.template) {\n let tmpl = this.templateCache.get(cfg.template);\n if (!tmpl) {\n const el = document.querySelector(cfg.template);\n if (el instanceof HTMLTemplateElement) {\n tmpl = el;\n this.templateCache.set(cfg.template, tmpl);\n } else {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.TEMPLATE_NOT_FOUND(cfg.template));\n return;\n }\n }\n this.$target.append(tmpl.content.cloneNode(true) as DocumentFragment);\n if (cfg.onMount) cfg.onMount(this.$target.children(), onUnmount, this);\n }\n\n if (afterTransition) untracked(() => afterTransition(from, name));\n this.previousRoute = name;\n }\n\n private handleUrlChange(): void {\n if (this.isDestroyed) return;\n\n const currentUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n if (currentUrl === this.previousUrl) return;\n\n const nextRoute = this.getRouteName();\n const oldRoute = this.currentRouteAtom.peek();\n\n if (oldRoute !== nextRoute) {\n if (untracked(() => this.config.routes[oldRoute]?.onLeave?.(this)) === false) {\n this.restoreUrl();\n return;\n }\n this.currentRouteAtom.value = nextRoute;\n }\n this.queryParamsAtom.value = this.getQueryParams();\n this.previousUrl = currentUrl;\n }\n\n private setupAutoBindLinks(): void {\n if (!this.config.autoBindLinks) return;\n const onClick = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const r = (e.currentTarget as HTMLElement).dataset.route;\n if (r != null) this.navigate(r);\n };\n $(document).on('click', '[data-route]', onClick);\n this.cleanups.push(() => $(document).off('click', '[data-route]', onClick));\n\n let previousActiveNodes: HTMLElement[] = [];\n const activeLinkEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n const activeClass = this.activeClass;\n untracked(() => {\n const len = previousActiveNodes.length;\n for (let i = 0; i < len; i++) {\n const el = previousActiveNodes[i]!;\n el.classList.remove(activeClass);\n el.removeAttribute('aria-current');\n }\n\n try {\n const selector = `[data-route=\"${routeName.replace(/\"/g, '\\\\\"')}\"]`;\n const nodes = Array.from(document.querySelectorAll<HTMLElement>(selector));\n const nLen = nodes.length;\n for (let i = 0; i < nLen; i++) {\n const el = nodes[i]!;\n el.classList.add(activeClass);\n el.setAttribute('aria-current', 'page');\n }\n previousActiveNodes = nodes;\n } catch {\n previousActiveNodes = [];\n }\n });\n });\n this.cleanups.push(() => activeLinkEffect.dispose());\n }\n\n public navigate(name: string): void {\n if (this.isDestroyed) return;\n const old = this.currentRouteAtom.peek();\n if (this.config.routes[old]?.onLeave?.(this) === false) return;\n\n const resolved = name || this.config.default;\n if (!resolved) return;\n\n this.setUrl(resolved);\n this.queryParamsAtom.value = {};\n this.currentRouteAtom.value = resolved;\n }\n\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n for (const fn of this.cleanups)\n try {\n fn();\n } catch {}\n this.templateCache.clear();\n }\n}\n\n/**\n * Creates an SPA router with reactive state management.\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n// ============================================================================\n// atomFetch\n// ============================================================================\n\n/**\n * Context for a reactive fetch operation.\n * Manages the lifecycle of a single $.ajax request, including automatic\n * cancellation (via AbortController) and reactive URL/option resolution.\n */\nclass FetchContext<T> {\n private abortController: AbortController | null = null;\n private readonly staticOptions: JQuery.AjaxSettings;\n private readonly ajaxOptionsFn: (() => JQuery.AjaxSettings) | undefined;\n private readonly getUrl: () => string;\n\n /**\n * Optimization: If true, the URL is a static string and doesn't need to be\n * re-evaluated within a reactive scope.\n */\n private readonly isStaticUrl: boolean;\n private readonly staticUrl: string | undefined;\n\n private readonly transformFn: ((val: unknown) => T) | undefined;\n private readonly onErrorFn: ((err: unknown) => void) | undefined;\n\n constructor(urlOrFn: string | (() => string), options: FetchOptions<T>) {\n const isStatic = typeof urlOrFn === 'string';\n this.isStaticUrl = isStatic;\n if (isStatic) {\n this.staticUrl = urlOrFn as string;\n this.getUrl = () => this.staticUrl!;\n } else {\n this.getUrl = urlOrFn as () => string;\n }\n\n this.ajaxOptionsFn =\n typeof options.ajaxOptions === 'function' ? options.ajaxOptions : undefined;\n\n const baseAjax = typeof options.ajaxOptions === 'object' ? options.ajaxOptions : {};\n this.staticOptions = {\n ...baseAjax,\n method: options.method,\n headers: { ...(baseAjax as JQuery.AjaxSettings)?.headers, ...options.headers },\n };\n this.transformFn = options.transform;\n this.onErrorFn = options.onError;\n }\n\n public abort(): void {\n this.abortController?.abort();\n }\n\n private handleError(err: unknown): never {\n let final: Error;\n if (err && typeof (err as JQuery.jqXHR).readyState !== 'undefined') {\n const x = err as JQuery.jqXHR;\n final = new Error(`Network Error: ${x.statusText || 'Unknown'} (${x.status})`);\n (final as FetchError).jqXHR = x;\n } else {\n final = err instanceof Error ? err : new Error(String(err ?? 'Unknown error'));\n }\n\n if (this.onErrorFn) {\n try {\n this.onErrorFn(final);\n } catch {\n // Suppress errors in error callback\n }\n }\n throw final;\n }\n\n public execute = async (): Promise<T> => {\n this.abortController?.abort();\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n\n const dynamicOptions = this.ajaxOptionsFn?.() ?? {};\n // Use shallow merge for high-performance request setup\n const req: JQuery.AjaxSettings = {\n ...this.staticOptions,\n ...dynamicOptions,\n headers: {\n ...this.staticOptions.headers,\n ...dynamicOptions.headers,\n },\n url: this.isStaticUrl ? this.staticUrl : this.getUrl(),\n success: undefined,\n error: undefined,\n complete: undefined,\n };\n const xhr = $.ajax(req);\n\n signal.onabort = () => xhr.abort();\n if (signal.aborted) xhr.abort();\n\n try {\n const raw = await xhr;\n return this.transformFn ? this.transformFn(raw) : (raw as T);\n } catch (err) {\n if (signal.aborted) {\n const e = new Error('AbortError');\n e.name = 'AbortError';\n throw e;\n }\n return this.handleError(err);\n } finally {\n signal.onabort = null;\n if (this.abortController?.signal === signal) this.abortController = null;\n }\n };\n}\n\n/**\n * Creates a declarative reactive AJAX primitive.\n * Wraps core's async `computed` with jQuery's `$.ajax`.\n *\n * Features:\n * - Auto-Cancellation: Aborts pending requests when dependencies change.\n * - Reactive URL: Re-fetches automatically if `urlOrFn` depends on atoms.\n * - Error Isolation: Network errors are captured in .hasError/.lastError.\n */\n$.extend({\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const ctx = new FetchContext<T>(urlOrFn, options);\n const atomVal = computed(ctx.execute, {\n defaultValue: options.defaultValue,\n lazy: options.eager === false,\n });\n return Object.assign(atomVal, {\n abort: () => ctx.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\n },\n});\n","/**\n * atom-effect-jquery\n *\n * Brings reactivity to jQuery.\n *\n * Features:\n * - Full CJK IME Support (Input Method Editor).\n * - Auto-cleanup via MutationObserver (No memory leaks).\n * - Debug Mode: Console logging + Visual Highlighting.\n *\n * Type augmentation note:\n * This package extends both `JQuery` and `JQueryStatic` via global interface\n * merging in `types.ts`. Consumers using the `export default $` path will\n * receive the augmented type automatically because the module's side-effect\n * imports apply the augmentation at import time.\n */\n\nimport $ from 'jquery';\nimport '@/core/namespace'; // $.atom, $.computed, etc.\nimport '@/bindings/chainable'; // $.fn.atomText, etc.\nimport '@/bindings/list'; // $.fn.atomList\nimport '@/bindings/mount'; // $.fn.atomMount\nimport '@/features/route'; // $.route\nimport '@/features/fetch'; // $.atomFetch\n\nimport { enablejQueryOverrides } from '@/core/jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from '@/core/registry';\n\n// Global initialization on DOM ready.\n$(() => {\n enablejQueryOverrides();\n enableAutoCleanup(document.body!);\n});\n\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { nextTick } from '@/core/namespace';\nexport type {\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n FetchOptions,\n ListOptions,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n RenderRoute,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n TemplateRoute,\n ValOptions,\n WritableAtom,\n} from '@/types';\nexport { isReactive } from '@/utils';\nexport { disableAutoCleanup, enableAutoCleanup, registry };\n\nexport default $;\n"],"mappings":"6zBAAA,IAAI,EAAI,CACN,KAAM,OACN,QAAS,UACT,SAAU,WACV,SAAU,WACX,CAAE,EAAI,CACL,SAAU,EACV,UAAW,EACZ,CAAE,EAAI,CACL,SAAU,EACV,YAAa,EACb,MAAO,EACP,KAAM,GACN,QAAS,GACT,SAAU,GACV,SAAU,IACV,YAAa,IACb,UAAW,IACX,cAAe,KAChB,CAAE,EAAI,CACL,SAAU,EACV,KAAM,EACN,uBAAwB,GACzB,CAAE,EAAI,CACL,0BAA2B,IAC3B,0BAA2B,IAC3B,yBAA0B,IAC1B,qBAAsB,IACtB,qBAAsB,GACtB,6BAA8B,IAC/B,CAAE,EAAK,CACN,mBAAoB,CAAC,EACrB,wBAAyB,IAC1B,CAAE,EAAI,CACL,kBAAmB,EACnB,uBAA0C,EAC3C,CAAE,EAAI,CACL,cAAe,GACf,IAAK,EACN,CAAE,EAAI,WAAY,EAAK,CAAE,aAAc,GAAI,CAAQ,OAAO,QAAU,KAAO,QAAQ,IAvCpF,IAuC8F,EAAI,OAAO,OAAO,EAAE,CAAC,CAAE,EAAI,KAAM,CAC7H,YAAY,EAAG,EAAG,EAAI,IAAK,GAAG,CAC5B,KAAK,KAAO,EAAG,KAAK,QAAU,EAAG,KAAK,MAAQ,IAE/C,EAAK,KAAM,CACZ,YAAY,EAAG,EAAG,CAChB,KAAK,GAAK,EAAG,KAAK,IAAM,EAE1B,OAAO,EAAG,EAAG,CACX,IAAM,EAAI,KAAK,GACf,GAAI,IAAM,IAAK,GAAG,CAChB,EAAE,EAAG,EAAE,CACP,OAEF,IAAM,EAAI,KAAK,IACf,IAAM,IAAK,IAAK,EAAE,SAAS,GAE5B,EAAI,cAAc,KAAM,CACzB,YAAY,EAAG,EAAI,KAAM,EAAI,CAAC,EAAG,CAC/B,MAAM,EAAE,CAAE,KAAK,MAAQ,EAAG,KAAK,YAAc,EAAG,KAAK,KAAO,cAE7D,EAAI,cAAc,CAAE,CACrB,YAAY,EAAG,EAAI,KAAM,CACvB,MAAM,EAAG,EAAG,CAAC,EAAE,CAAE,KAAK,KAAO,kBAE9B,EAAI,cAAc,CAAE,CACrB,YAAY,EAAG,EAAI,KAAM,CACvB,MAAM,EAAG,EAAG,CAAC,EAAE,CAAE,KAAK,KAAO,gBAE9B,EAAI,cAAc,CAAE,CACrB,YAAY,EAAG,EAAI,KAAM,CACvB,MAAM,EAAG,EAAG,CAAC,EAAE,CAAE,KAAK,KAAO,mBAE9B,EAAI,CACL,0BAA2B,qCAC3B,kCAAmC,kDACnC,4BAA6B,+BAC7B,kCAAmC,qCACnC,6BAA8B,+BAC9B,kBAAmB,wCACnB,iCAAkC,qDAClC,kCAAmC,8BACnC,wBAAyB,mCACzB,wBAAyB,0BACzB,sBAAuB,wBACvB,gBAAiB,mCACjB,0BAA2B,EAAG,IAAM,6BAA6B,EAAE,cAAc,EAAE,wCACnF,gCAAiC,2CACjC,gCAAiC,2EACjC,oCAAqC,wCACrC,kCAAmC,6DACnC,gCAAiC,oCAClC,CAAE,GAAK,KAAM,CACZ,aAAc,CACZ,KAAK,IAAM,KAAM,KAAK,IAAM,KAAM,KAAK,IAAM,KAAM,KAAK,IAAM,KAAM,KAAK,OAAS,EAAG,KAAK,UAAY,KAAM,KAAK,aAAe,KAElI,IAAI,MAAO,CACT,OAAO,KAAK,OAEd,MAAM,EAAG,CACP,GAAI,EAAI,EAAG,OAAQ,EAAR,CACT,IAAK,GACH,OAAO,KAAK,IACd,IAAK,GACH,OAAO,KAAK,IACd,IAAK,GACH,OAAO,KAAK,IACd,IAAK,GACH,OAAO,KAAK,IAEhB,IAAM,EAAI,KAAK,UACf,GAAI,IAAM,KAAM,CACd,IAAM,EAAI,EAAE,EAAI,GAChB,OAAO,IAAM,IAAK,GAAI,KAAO,EAE/B,OAAO,KAET,MAAM,EAAG,EAAG,CACV,OAAQ,EAAR,CACE,IAAK,GACH,KAAK,IAAM,EACX,MACF,IAAK,GACH,KAAK,IAAM,EACX,MACF,IAAK,GACH,KAAK,IAAM,EACX,MACF,IAAK,GACH,KAAK,IAAM,EACX,MACF,QACE,KAAK,YAAc,EAAE,CAAE,KAAK,UAAU,EAAI,GAAK,EAEnD,GAAK,KAAK,SAAW,KAAK,OAAS,EAAI,GAEzC,aAAa,EAAG,CACd,IAAM,EAAI,KAAK,OACf,GAAI,GAAK,EAAG,OACZ,GAAI,GAAK,EAAG,CACV,GAAI,GAAK,EAAG,CACV,IAAM,EAAI,KAAK,IACf,GAAK,OAAS,KAAK,eAAe,EAAE,CAAE,KAAK,IAAM,MAEnD,GAAI,GAAK,EAAG,CACV,IAAM,EAAI,KAAK,IACf,GAAK,OAAS,KAAK,eAAe,EAAE,CAAE,KAAK,IAAM,MAEnD,GAAI,GAAK,EAAG,CACV,IAAM,EAAI,KAAK,IACf,GAAK,OAAS,KAAK,eAAe,EAAE,CAAE,KAAK,IAAM,MAEnD,GAAI,GAAK,EAAG,CACV,IAAM,EAAI,KAAK,IACf,GAAK,OAAS,KAAK,eAAe,EAAE,CAAE,KAAK,IAAM,OAGrD,IAAM,EAAI,KAAK,UACf,GAAI,IAAM,MAAQ,EAAI,EAAG,CACvB,IAAM,EAAI,EAAI,EAAI,EAAI,EAAI,EAAG,EAAI,EAAE,OACnC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,GACZ,GAAK,OAAS,KAAK,eAAe,EAAE,CAAE,EAAE,GAAK,MAE/C,GAAK,GAAK,EAAE,OAAS,EAAG,KAAK,UAAY,MAAQ,EAAE,OAAS,EAAI,EAElE,KAAK,eAAiB,OAAS,KAAK,aAAe,MAAO,KAAK,OAAS,EAE1E,eAAe,EAAG,EAElB,IAAI,EAAG,CACL,GAAI,KAAK,MAAQ,KAAM,CACrB,KAAK,IAAM,EAAG,KAAK,SACnB,OAEF,GAAI,KAAK,MAAQ,KAAM,CACrB,KAAK,IAAM,EAAG,KAAK,SACnB,OAEF,GAAI,KAAK,MAAQ,KAAM,CACrB,KAAK,IAAM,EAAG,KAAK,SACnB,OAEF,GAAI,KAAK,MAAQ,KAAM,CACrB,KAAK,IAAM,EAAG,KAAK,SACnB,OAEF,KAAK,eAAe,EAAE,CAExB,eAAe,EAAG,CAChB,IAAM,EAAI,KAAK,UACf,GAAI,IAAM,KAAM,KAAK,UAAY,CAAC,EAAE,KAC/B,CACH,IAAM,EAAI,KAAK,aACf,IAAM,MAAQ,EAAE,OAAS,EAAI,EAAE,EAAE,KAAK,EAAI,EAAI,EAAE,KAAK,EAAE,CAEzD,KAAK,SAEP,OAAO,EAAG,CACR,GAAI,KAAK,MAAQ,EACf,MAAO,MAAK,IAAM,KAAM,KAAK,SAAU,CAAC,EAC1C,GAAI,KAAK,MAAQ,EACf,MAAO,MAAK,IAAM,KAAM,KAAK,SAAU,CAAC,EAC1C,GAAI,KAAK,MAAQ,EACf,MAAO,MAAK,IAAM,KAAM,KAAK,SAAU,CAAC,EAC1C,GAAI,KAAK,MAAQ,EACf,MAAO,MAAK,IAAM,KAAM,KAAK,SAAU,CAAC,EAC1C,IAAM,EAAI,KAAK,UACf,GAAI,GAAK,KAAM,MAAO,CAAC,EACvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,GAAI,EAAE,KAAO,EAAG,CACxD,EAAE,GAAK,KAAM,KAAK,SAClB,IAAI,EAAI,KAAK,aACb,OAAO,IAAM,OAAS,EAAI,KAAK,aAAe,EAAE,EAAG,EAAE,KAAK,EAAE,CAAE,CAAC,EAEjE,MAAO,CAAC,EAEV,IAAI,EAAG,CACL,GAAI,KAAK,SAAW,EAAG,MAAO,CAAC,EAC/B,GAAI,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,EAAG,MAAO,CAAC,EAClF,IAAM,EAAI,KAAK,UACf,GAAI,GAAK,UACF,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,GAAI,EAAE,KAAO,EAAG,MAAO,CAAC,EAEpE,MAAO,CAAC,EAEV,QAAQ,EAAG,CACT,IAAM,EAAI,KAAK,OACf,GAAI,IAAM,EAAG,OACb,IAAI,EAAI,EACF,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OACF,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OACF,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OACF,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OACF,IAAM,EAAI,KAAK,UACf,GAAI,GAAK,KAAM,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,CACvD,IAAM,EAAI,EAAE,GACZ,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,QAGN,eAAe,EAAG,CAChB,IAAM,EAAI,KAAK,OACf,GAAI,IAAM,EAAG,MAAO,GACpB,IAAI,EAAI,EACF,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OAAO,EACT,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OAAO,EACT,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OAAO,EACT,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OAAO,EACT,IAAM,EAAI,KAAK,UACf,GAAI,GAAK,KAAM,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,CACvD,IAAM,EAAI,EAAE,GACZ,GAAI,GAAK,OAAS,EAAE,EAAE,CAAE,EAAE,IAAM,GAC9B,OAAO,EAEX,OAAO,EAET,SAAU,CACR,IAAM,EAAI,KAAK,UACf,GAAI,IAAM,KAAM,OAChB,IAAI,EAAI,EAAE,OACV,GAAI,IAAM,EAAG,OACb,IAAI,EAAI,EACR,KAAO,EAAI,GAAK,GAAI,EAAE,KAAO,KAAM,CACjC,KAAO,EAAI,GAAK,EAAE,EAAI,KAAO,MAC3B,EAAE,KAAK,CAAE,IACX,EAAI,IAAM,EAAE,GAAK,EAAE,KAAK,CAAE,IAAK,UAC1B,IACP,KAAK,aAAe,KAAM,IAAM,IAAM,KAAK,UAAY,MAEzD,OAAQ,CACN,KAAK,IAAM,KAAM,KAAK,IAAM,KAAM,KAAK,IAAM,KAAM,KAAK,IAAM,KAAM,KAAK,OAAS,EAAG,KAAK,YAAc,OAAS,KAAK,UAAU,OAAS,EAAG,KAAK,UAAY,MAAO,KAAK,aAAe,KAE1L,SAAU,CACR,KAAK,OAAO,GAEb,GAAoB,OAAO,uBAAuB,CAAgD,GAAoB,OAAO,kBAAkB,CAAE,GAAoB,OAAO,4BAA4B,CAgBxM,GAAI,IAhB2M,KAAM,CACtN,aAAc,CACZ,KAAK,QAAU,CAAC,EAAG,KAAK,iBAAmB,EAAG,mBAEhD,KAAK,EAAG,EAAG,EAEX,gBAAgB,EAAG,EAAG,EAAG,EAEzB,aAAa,EAAG,CACd,GAAI,GAAK,KACP,OAAO,EAAE,IAEb,aAAa,EAAG,CACd,GAAI,GAAK,KACP,OAAO,EAAE,MAEE,GAAK,EAAG,OAAW,KAAO,EAC3C,SAAS,EAAE,EAAG,EAAG,EAAG,CAClB,OAAO,aAAa,EAAI,EAAI,aAAa,MAAQ,IAAI,EAAE,GAAG,EAAE,MAAQ,EAAE,YAAY,MAAQ,QAAQ,IAAI,EAAE,KAAK,EAAE,UAAW,EAAE,CAAG,IAAI,EAAE,qBAAqB,EAAE,KAAK,OAAO,EAAE,GAAG,CAE/K,IAAI,GAAI,KAAM,CACZ,aAAc,CACZ,KAAK,MAAQ,EAAG,KAAK,QAAU,EAAG,KAAK,eAAiB,EAAE,cAAe,KAAK,WAAa,EAAG,KAAK,UAAY,GAAI,KAAK,OAAS,KAAM,KAAK,MAAQ,KAAM,KAAK,GAAK,IAAI,CAAG,EAE7K,IAAI,YAAa,CACf,OAAQ,KAAK,MAAQ,EAAE,YAAc,EAEvC,IAAI,YAAa,CACf,OAAQ,KAAK,MAAQ,EAAE,eAAiB,EAE1C,IAAI,UAAW,CACb,MAAO,CAAC,EAEV,UAAU,EAAG,CACX,IAAM,EAAI,OAAO,GAAK,WACtB,GAAI,CAAC,IAAM,CAAC,GAAK,OAAO,EAAE,SAAW,YAAa,MAAM,EAAsB,UAAU,qBAAqB,CAAE,EAAG,EAAE,iCAAiC,CACrJ,IAAI,EAAI,KAAK,OACb,IAAM,EAAI,IAAI,GAAM,KAAK,OAAS,GAClC,IAAI,EAAI,CAAC,EACT,GAAI,EAAE,KAAO,OAAS,EAAI,EAAE,IAAI,KAAO,EAAI,EAAE,IAAI,MAAQ,GAAI,EAAI,CAAC,UACzD,EAAE,KAAO,OAAS,EAAI,EAAE,IAAI,KAAO,EAAI,EAAE,IAAI,MAAQ,GAAI,EAAI,CAAC,UAC9D,EAAE,KAAO,OAAS,EAAI,EAAE,IAAI,KAAO,EAAI,EAAE,IAAI,MAAQ,GAAI,EAAI,CAAC,UAC9D,EAAE,KAAO,OAAS,EAAI,EAAE,IAAI,KAAO,EAAI,EAAE,IAAI,MAAQ,GAAI,EAAI,CAAC,MAClE,CACH,IAAM,EAAI,EAAE,UACZ,GAAI,GAAK,KAAM,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,CACvD,IAAM,EAAI,EAAE,GACZ,GAAI,GAAK,OAAS,EAAI,EAAE,KAAO,EAAI,EAAE,MAAQ,GAAI,CAC/C,EAAI,CAAC,EACL,QAIN,GAAI,EACF,UAAa,GAEf,IAAM,EAAI,IAAI,EAAG,EAAI,EAAI,IAAK,GAAG,EAAI,IAAK,GAAI,EAAE,CAChD,OAAO,EAAE,IAAI,EAAE,KAAQ,KAAK,aAAa,EAAE,CAE7C,aAAa,EAAG,CACd,IAAM,EAAI,KAAK,OACf,IAAM,EAAE,OAAO,EAAE,CAAE,KAAK,aAAe,GAAK,EAAE,SAAS,EAEzD,iBAAkB,CAChB,IAAM,EAAI,KAAK,OACf,OAAO,IAAM,KAAO,EAAI,EAAE,KAE5B,mBAAmB,EAAG,EAAG,CACvB,IAAM,EAAI,KAAK,OACf,GAAI,EAAE,IAAM,MAAQ,EAAE,OAAS,GAAI,CACjC,KAAK,aACL,GAAI,CACF,IAAI,EAAI,EAAE,IACV,GAAI,GAAK,KAAM,GAAI,CACjB,EAAE,OAAO,EAAG,EAAE,OACP,EAAG,CACV,KAAK,gBAAgB,EAAE,CAEzB,GAAI,EAAI,EAAE,IAAK,GAAK,KAAM,GAAI,CAC5B,EAAE,OAAO,EAAG,EAAE,OACP,EAAG,CACV,KAAK,gBAAgB,EAAE,CAEzB,GAAI,EAAI,EAAE,IAAK,GAAK,KAAM,GAAI,CAC5B,EAAE,OAAO,EAAG,EAAE,OACP,EAAG,CACV,KAAK,gBAAgB,EAAE,CAEzB,GAAI,EAAI,EAAE,IAAK,GAAK,KAAM,GAAI,CAC5B,EAAE,OAAO,EAAG,EAAE,OACP,EAAG,CACV,KAAK,gBAAgB,EAAE,CAEzB,IAAM,EAAI,EAAE,UACZ,GAAI,GAAK,KAAM,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,CACvD,IAAM,EAAI,EAAE,GACZ,GAAI,GAAK,KAAM,GAAI,CACjB,EAAE,OAAO,EAAG,EAAE,OACP,EAAG,CACV,KAAK,gBAAgB,EAAE,UAGnB,CACR,EAAE,KAAK,aAAe,GAAK,EAAE,SAAS,GAI5C,gBAAgB,EAAG,CACjB,QAAQ,MAAM,EAAE,EAAG,EAAG,EAAE,kCAAkC,CAAC,CAE7D,UAAW,CACT,IAAM,EAAI,KAAK,MACf,GAAI,IAAM,MAAQ,EAAE,OAAS,EAAG,MAAO,CAAC,EACxC,IAAM,EAAI,KAAK,UACf,GAAI,IAAM,GAAI,CACZ,IAAM,EAAI,EAAE,MAAM,EAAE,CACpB,GAAI,GAAK,MAAQ,EAAE,KAAK,UAAY,EAAE,QAAS,MAAO,CAAC,EAEzD,MAAO,CAAC,EAAE,cAAgB,CAAC,EAAE,aAAa,CAAG,CAAC,EAAI,KAAK,iBAAiB,GAEzE,GAAI,EACP,SAAS,IAAI,CACX,IAAM,EAAI,GAAI,EAAI,EAClB,MAAO,IAAI,IAAM,EAAI,EAAI,EAAG,GAE9B,SAAS,GAAE,EAAG,CACZ,IAAM,EAAI,EAAI,EAAI,EAClB,OAAO,IAAM,EAAI,EAAI,EAEvB,IAAI,GAAI,EAAG,GAAI,CAAC,EAAG,GAAK,EACxB,SAAS,IAAK,CACZ,OAAO,GAET,SAAS,IAAK,CACZ,OAAO,GAAI,CAAC,GAAK,GAAI,CAAC,EAAG,GAAK,IAAG,CAAE,GAAI,EAAG,CAAC,GAE7C,SAAS,IAAK,CACZ,GAAI,CAAC,EAEP,SAAS,IAAK,CACZ,GAAI,CAAC,GAAG,MAAO,GACf,IAAM,EAAI,EAAE,GACZ,GAAI,GAAK,EAAE,yBAA0B,OAAO,EAC5C,MAAU,MAAM,wEAAwE,EAAE,2BAA2B,CAEvH,IAgGG,GAAI,IAhGE,KAAM,CACb,aAAc,CACZ,KAAK,aAAe,CAAC,EAAE,CAAE,EAAE,CAAC,CAAE,KAAK,aAAe,EAAG,KAAK,MAAQ,EAAG,KAAK,OAAS,EAAG,KAAK,cAAgB,CAAC,EAAG,KAAK,gBAAkB,CAAC,EAAG,KAAK,YAAc,EAAG,KAAK,YAAc,EAAE,CAAE,KAAK,gBAAkB,EAAG,KAAK,oBAAsB,EAAE,qBAAsB,KAAK,WAAa,KAAM,KAAK,cAAgB,KAAK,SAAS,KAAK,KAAK,CAE3U,IAAI,WAAY,CACd,OAAO,KAAK,MAEd,IAAI,YAAa,CACf,OAAO,KAAK,YAAc,EAE5B,SAAS,EAAG,CACV,IAAM,EAAI,KAAK,OACf,GAAI,EAAE,aAAe,EAAG,OACxB,GAAI,EAAE,WAAa,EAAG,KAAK,YAAc,GAAK,KAAK,gBAAiB,CAClE,KAAK,YAAY,KAAK,mBAAqB,EAC3C,OAEF,IAAM,EAAI,KAAK,aAAc,EAAI,KAAK,aAAa,GACnD,EAAE,KAAK,SAAW,EAAG,KAAK,eAAiB,KAAK,QAAQ,CAE1D,QAAS,CACP,KAAK,eAAiB,KAAK,QAAU,IAAM,KAAK,cAAgB,CAAC,EAAG,eAAe,KAAK,cAAc,EAExG,UAAW,CACT,GAAI,CACF,GAAI,KAAK,QAAU,EAAG,OACtB,IAAM,EAAI,IAAI,CACd,KAAK,aAAa,CAAE,GAAK,IAAI,QACrB,CACR,KAAK,cAAgB,CAAC,EAAG,KAAK,MAAQ,GAAK,KAAK,cAAgB,GAAK,KAAK,QAAQ,EAGtF,YAAa,CACX,KAAK,gBAAkB,CAAC,EACxB,IAAM,EAAI,IAAI,CACd,GAAI,CACF,KAAK,kBAAkB,CAAE,KAAK,aAAa,QACnC,CACR,KAAK,gBAAkB,CAAC,EAAG,GAAK,IAAI,EAGxC,kBAAmB,CACjB,IAAM,EAAI,KAAK,gBACf,GAAI,IAAM,EAAG,OACb,IAAM,EAAI,EAAE,KAAK,OAAQ,EAAI,KAAK,YAAa,EAAI,KAAK,aAAc,EAAI,KAAK,aAAa,GACxF,EAAI,KAAK,MACb,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,GACZ,EAAE,aAAe,IAAM,EAAE,WAAa,EAAG,EAAE,KAAO,GAEpD,KAAK,MAAQ,EAAG,KAAK,gBAAkB,EAAG,EAAE,OAAS,EAEvD,aAAc,CACZ,IAAI,EAAI,EACR,KAAO,KAAK,MAAQ,GAAK,CACvB,GAAI,EAAE,EAAI,KAAK,oBAAqB,CAClC,KAAK,sBAAsB,CAC3B,OAEF,KAAK,eAAe,CAAE,KAAK,kBAAkB,EAGjD,eAAgB,CACd,IAAM,EAAI,KAAK,aAAc,EAAI,KAAK,aAAa,GAAI,EAAI,KAAK,MAChE,KAAK,aAAe,EAAI,EAAG,KAAK,MAAQ,EAAG,KAAK,OAAS,KAAK,OAAS,EAAI,EAC3E,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,GACZ,GAAI,CACF,OAAO,GAAK,WAAa,GAAG,CAAG,EAAE,SAAS,OACnC,EAAG,CACV,QAAQ,MAAM,IAAI,EAAE,4CAA6C,EAAE,CAAC,EAGxE,EAAE,OAAS,EAEb,sBAAuB,CACrB,IAAM,EAAI,KAAK,MAAQ,KAAK,gBAAiB,EAAI,KAAK,oBACtD,QAAQ,MAAM,IAAI,EAAE,EAAE,yBAAyB,EAAG,EAAE,CAAC,CAAC,CAAE,KAAK,MAAQ,EACrE,IAAM,EAAI,KAAK,aACf,KAAK,aAAa,GAAG,OAAS,EAAG,KAAK,gBAAkB,EACxD,IAAM,EAAI,KAAK,WACf,GAAI,EAAG,GAAI,CACT,EAAE,EAAE,MACE,GAGV,YAAa,CACX,KAAK,cAEP,UAAW,CACT,KAAK,cAAgB,GAAK,EAAE,KAAK,cAAgB,GAAK,KAAK,YAAY,CAEzE,sBAAsB,EAAG,CACvB,GAAI,EAAI,EAAE,qBAAsB,MAAM,IAAI,EAAE,yCAAyC,EAAE,uBAAuB,CAC9G,KAAK,oBAAsB,IAEdA,GAAoB,OAAO,IAAI,mBAAmB,CAAE,GAAqB,OAAO,IAAI,uBAAuB,CAAE,GAAqB,OAAO,IAAI,qBAAqB,CAAE,GAAqB,OAAO,IAAI,uBAAuB,CAczO,EAAI,IAd4O,KAAM,CACvP,aAAc,CACZ,KAAK,QAAU,KAEjB,IAAI,EAAG,EAAG,CACR,GAAI,KAAK,UAAY,EAAG,OAAO,GAAG,CAClC,IAAM,EAAI,KAAK,QACf,KAAK,QAAU,EACf,GAAI,CACF,OAAO,GAAG,QACF,CACR,KAAK,QAAU,KAIrB,SAAS,EAAG,EAAG,CACb,IAAM,EAAI,EAAG,EAAI,EAAE,QACnB,GAAI,IAAM,KAAM,OAAO,GAAG,CAC1B,EAAE,QAAU,KACZ,GAAI,CACF,OAAO,GAAG,QACF,CACR,EAAE,QAAU,GAGhB,IAAI,GAAK,cAAc,EAAE,CACvB,YAAY,EAAG,EAAG,CAChB,OAAO,CAAE,KAAKA,IAAK,CAAC,EAAG,KAAK,IAAM,CAAC,EAAG,KAAK,OAAS,EAAG,IAAM,KAAK,OAAS,EAAE,MAAO,GAAE,gBAAgB,KAAM,OAAQ,KAAK,GAAG,CAE9H,IAAI,yBAA0B,CAC5B,OAAQ,KAAK,MAAQ,EAAE,0BAA4B,EAErD,IAAI,QAAS,CACX,OAAQ,KAAK,MAAQ,EAAE,QAAU,EAEnC,IAAI,OAAQ,CAEV,OADU,EAAE,SACF,cAAc,KAAK,CAAE,KAAK,OAEtC,IAAI,MAAM,EAAG,CACX,IAAM,EAAI,KAAK,OACf,GAAI,OAAO,GAAG,EAAG,EAAE,CAAE,OACrB,KAAK,OAAS,EAAG,KAAK,QAAU,GAAE,KAAK,QAAQ,CAC/C,IAAM,EAAI,KAAK,MACf,IAAK,EAAI,EAAE,0BAA4B,EAAG,OAC1C,IAAM,EAAI,KAAK,OACf,GAAK,MAAQ,EAAE,OAAS,IAAM,KAAK,iBAAmB,EAAG,KAAK,MAAQ,EAAI,EAAE,wBAAyB,EAAI,EAAE,QAAU,GAAK,CAAC,GAAE,WAAa,KAAK,qBAAqB,CAAG,GAAE,SAAS,KAAK,EAEzL,SAAU,CACR,KAAK,qBAAqB,CAE5B,qBAAsB,CACpB,IAAM,EAAI,KAAK,MACf,IAAK,GAAK,EAAE,uBAAyB,EAAE,aAAe,EAAE,uBAAwB,OAChF,IAAM,EAAI,KAAK,iBACf,KAAK,iBAAmB,IAAK,GAAG,KAAK,MAAQ,EAAI,CAAC,EAAE,uBAAwB,KAAK,mBAAmB,KAAK,OAAQ,EAAE,CAErH,MAAO,CACL,OAAO,KAAK,OAEd,SAAU,CACR,IAAM,EAAI,KAAK,OACd,EAAI,EAAE,YAAc,IAAM,KAAK,QAAQ,OAAO,CAAE,KAAK,MAAQ,EAAI,EAAE,SAAU,KAAK,OAAS,IAAK,GAAG,KAAK,iBAAmB,IAAK,IAEnI,iBAAkB,CAChB,MAAO,CAAC,EAEV,CAAC,OAAO,UAAW,CACjB,KAAK,SAAS,GAGlB,SAAS,EAAG,EAAG,EAAI,EAAE,CAAE,CACrB,OAAO,IAAI,GAAG,EAAG,EAAE,MAAQ,CAAC,EAAE,CAEhC,IAAI,GAAK,cAAc,EAAG,CACxB,YAAY,GAAG,EAAG,CAChB,MAAM,GAAG,EAAE,CAAE,KAAK,KAAO,KAAM,KAAK,gBAAkB,GAAI,KAAK,aAAe,CAAC,EAAG,KAAK,UAAY,EAErG,iBAAkB,CAChB,KAAK,aAAe,CAAC,EAEvB,eAAe,EAAG,CAChB,IAAM,EAAI,EAAE,MACZ,GAAK,GAAG,CAEV,cAAc,EAAG,EAAG,CAClB,IAAM,EAAI,KAAK,OACf,GAAI,GAAK,EAAG,MAAO,CAAC,EACpB,IAAM,EAAI,EAAI,EACd,GAAI,KAAK,OAAS,MAAQ,EAAI,KAAK,gBAAiB,OAAO,KAAK,aAAa,EAAG,EAAE,CAClF,GAAI,EAAI,EAAG,OAAQ,EAAR,CACT,IAAK,GAAG,CACN,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,EAAE,OAAS,GAAK,EAAE,MACzB,MAAO,GAAE,QAAU,EAAE,QAAS,CAAC,EAEnC,IAAK,GACH,GAAI,EAAI,EAAG,CACT,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,EAAE,OAAS,GAAK,EAAE,MACzB,MAAO,GAAE,QAAU,EAAE,QAAS,IAAM,IAAM,KAAK,IAAM,KAAK,IAAK,KAAK,IAAM,GAAI,CAAC,EAErF,IAAK,GACH,GAAI,EAAI,EAAG,CACT,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,EAAE,OAAS,GAAK,EAAE,MAAO,CAChC,GAAI,EAAE,QAAU,EAAE,QAAS,IAAM,EAAG,CAClC,IAAM,EAAI,IAAM,EAAI,KAAK,IAAM,KAAK,IACpC,IAAM,EAAI,KAAK,IAAM,EAAI,KAAK,IAAM,EAAG,KAAK,IAAM,EAEpD,MAAO,CAAC,GAGd,IAAK,GACH,GAAI,EAAI,EAAG,CACT,IAAM,EAAI,KAAK,IACf,GAAI,GAAK,EAAE,OAAS,GAAK,EAAE,MAAO,CAChC,GAAI,EAAE,QAAU,EAAE,QAAS,IAAM,EAAG,CAClC,IAAI,EACJ,IAAM,GAAK,EAAI,KAAK,IAAK,KAAK,IAAM,GAAK,IAAM,GAAK,EAAI,KAAK,IAAK,KAAK,IAAM,IAAM,EAAI,KAAK,IAAK,KAAK,IAAM,GAAI,KAAK,IAAM,EAE7H,MAAO,CAAC,IAIhB,IAAM,EAAI,KAAK,UACf,GAAI,EAAG,CACL,IAAM,EAAI,EAAE,QAAS,EAAI,EAAI,EAAI,EAAI,EAAG,EAAI,EAAE,OAC9C,IAAK,IAAI,EAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC9B,IAAM,EAAI,EAAE,GACZ,GAAI,GAAK,EAAE,OAAS,GAAK,EAAE,MACzB,MAAO,GAAE,QAAU,EAAG,KAAK,aAAa,EAAI,EAAG,EAAG,EAAE,CAAE,CAAC,GAG7D,MAAO,CAAC,EAEV,aAAa,EAAG,EAAG,CACjB,IAAI,EAAI,KAAK,KACb,GAAI,IAAM,KAAM,CACd,EAAI,KAAK,KAAuB,IAAI,IACpC,IAAM,EAAI,KAAK,OACf,GAAI,EAAI,EAAG,CACT,IAAM,EAAI,KAAK,IACf,GAAK,GAAK,GAAG,OAAS,EAAE,IAAI,EAAE,KAAM,EAAE,CACtC,IAAM,EAAI,KAAK,IACf,GAAK,GAAK,GAAG,OAAS,EAAE,IAAI,EAAE,KAAM,EAAE,CACtC,IAAM,EAAI,KAAK,IACf,GAAK,GAAK,GAAG,OAAS,EAAE,IAAI,EAAE,KAAM,EAAE,CACtC,IAAM,EAAI,KAAK,IACf,GAAK,GAAK,GAAG,OAAS,EAAE,IAAI,EAAE,KAAM,EAAE,CAExC,IAAM,EAAI,KAAK,UACf,GAAI,GAAK,EAAI,EAAG,CACd,IAAM,EAAI,EAAI,EAAI,EAAI,EAAG,EAAI,EAAE,OAC/B,IAAK,IAAI,EAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC9B,IAAM,EAAI,EAAE,GACZ,GAAG,OAAS,EAAE,IAAI,EAAE,KAAM,EAAI,EAAE,GAItC,IAAM,EAAI,EAAE,IAAI,EAAE,CAClB,GAAI,IAAM,IAAK,IAAK,EAAI,EAAG,MAAO,CAAC,EACnC,IAAM,EAAI,KAAK,MAAM,EAAE,CACvB,GAAI,GAAK,MAAQ,CAAC,EAAE,MAAO,MAAO,CAAC,EACnC,GAAI,EAAE,QAAU,EAAE,QAAS,IAAM,EAAG,CAClC,IAAI,EACJ,AAAoG,EAApG,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAU,KAAK,UAAU,EAAI,IAAM,KAAM,KAAK,MAAM,EAAG,EAAE,CAAE,KAAK,MAAM,EAAG,EAAE,CAAE,GAAG,OAAS,EAAE,IAAI,EAAE,KAAM,EAAE,CAAE,EAAE,IAAI,EAAG,EAAE,CAEtN,MAAO,CAAC,EAEV,aAAa,EAAG,EAAG,EAAG,CACpB,GAAI,IAAM,EAAG,OACb,IAAI,EACJ,GAAI,AAAoG,EAApG,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAU,KAAK,UAAU,EAAI,IAAM,KAAM,KAAK,MAAM,EAAG,EAAE,CAAE,IAAM,EAAG,KAAK,IAAM,UACxK,IAAM,EAAG,KAAK,IAAM,UACpB,IAAM,EAAG,KAAK,IAAM,UACpB,IAAM,EAAG,KAAK,IAAM,MACxB,CACH,IAAM,EAAI,KAAK,UACf,EAAE,EAAI,GAAK,GAGf,UAAU,EAAG,EAAG,CACd,IAAM,EAAI,KAAK,OACf,GAAI,EAAI,EAAG,CACT,IAAI,EACJ,AAAoG,EAApG,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAM,IAAM,EAAQ,KAAK,IAAU,KAAK,UAAU,EAAI,IAAM,KAAM,GAAK,OAAS,KAAK,eAAe,EAAE,CAAE,KAAK,OAAS,MAAQ,EAAE,OAAS,KAAK,KAAK,IAAI,EAAE,KAAM,KAAK,OAAS,EAAE,EAEtP,GAAI,IAAM,EAAG,KAAK,IAAM,UACf,IAAM,EAAG,KAAK,IAAM,UACpB,IAAM,EAAG,KAAK,IAAM,UACpB,IAAM,EAAG,KAAK,IAAM,MACxB,CACH,IAAI,EAAI,KAAK,UACb,IAAM,EAAI,EAAE,CAAE,KAAK,UAAY,GAAI,EAAE,EAAI,GAAK,EAEhD,GAAK,IAAM,KAAK,OAAS,EAAI,GAE/B,aAAa,EAAG,CACd,GAAK,KAAK,SAAW,MAAM,aAAa,EAAE,CAAE,KAAK,OAAS,OAAS,KAAK,KAAK,OAAO,CAAE,KAAK,KAAO,OAEpG,MAAO,CACL,KAAK,UAAY,KAAK,eAAe,CAAC,EAAE,CAE1C,aAAc,CACZ,OAAO,KAAK,eAAe,CAAC,EAAE,GAAK,KAAK,UAE1C,eAAe,EAAG,CAChB,IAAM,EAAI,KAAK,OACf,GAAI,IAAM,EAAG,MAAO,GACpB,IAAM,EAAI,EAAG,aACT,EAAI,EACF,EAAI,KAAK,IACf,GAAI,GAAK,KAAM,CACb,IAAM,EAAI,EAAE,KAAM,EAAI,EAAI,EAAE,QAAU,EAAE,QACxC,EAAI,GAAK,GAAK,GAAK,EAAE,GAAK,EAC1B,IAAM,EAAI,KAAK,IACf,GAAI,EAAI,GAAK,GAAK,KAAM,CACtB,IAAM,EAAI,EAAE,KAAM,EAAI,EAAI,EAAE,QAAU,EAAE,QACxC,EAAI,GAAK,GAAK,GAAK,EAAE,GAAK,EAC1B,IAAM,EAAI,KAAK,IACf,GAAI,EAAI,GAAK,GAAK,KAAM,CACtB,IAAM,EAAI,EAAE,KAAM,EAAK,EAAI,EAAE,QAAU,EAAE,QACzC,EAAI,GAAK,GAAM,GAAK,EAAE,GAAK,EAC3B,IAAM,EAAI,KAAK,IACf,GAAI,EAAI,GAAK,GAAK,KAAM,CACtB,IAAM,EAAI,EAAE,KAAM,EAAK,EAAI,EAAE,QAAU,EAAE,QACzC,EAAI,GAAK,GAAM,GAAK,EAAE,GAAK,KAKnC,GAAI,EAAI,EAAG,CACT,IAAM,EAAI,KAAK,UACf,IAAK,IAAI,EAAI,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAG,IAAK,CACxC,IAAM,EAAI,EAAE,GAAI,EAAI,EAAE,KAAM,EAAI,EAAI,EAAE,QAAU,EAAE,QAClD,EAAI,GAAK,GAAK,GAAK,EAAE,GAAK,GAG9B,OAAO,EAET,YAAa,CACX,KAAK,OAAS,GAAK,KAAK,aAAa,EAAE,CAAE,KAAK,aAAe,CAAC,EAEhE,OAAO,EAAG,CACR,MAAU,MAAM,uFAAuF,CAEzG,SAAU,IAGZ,SAAS,GAAG,EAAG,CACb,OAAO,OAAO,GAAK,YAAY,GAAcA,MAAK,EAEpD,SAAS,GAAG,EAAG,CACb,OAAO,OAAO,GAAK,YAAY,GAAc,MAAM,EAKrD,SAAS,GAAG,EAAG,CACb,OAAO,OAAO,GAAK,YAAY,GAAc,OAAO,EAAE,MAAQ,WAEhE,GAAI,CAAE,KAAM,EAAG,MAAO,EAAG,QAAS,EAAG,SAAU,EAAG,SAAU,EAAG,UAAW,EAAG,YAAa,EAAG,SAAU,GAAG,YAAa,EAAG,cAAe,IAAM,EAAG,GAAK,cAAc,EAAE,CACrK,YAAY,EAAG,EAAI,EAAE,CAAE,CACrB,GAAI,OAAO,GAAK,WAAY,MAAM,IAAI,EAAE,EAAE,0BAA0B,CACpE,GAAI,OAAO,CAAE,KAAKA,IAAK,CAAC,EAAG,KAAK,IAAM,CAAC,EAAG,KAAK,OAAS,KAAM,KAAK,WAAa,EAAG,KAAK,MAAQ,IAAI,GAAM,KAAK,iBAAmB,EAAG,KAAK,gBAAkB,EAAE,cAAe,KAAK,YAAc,EAAE,cAAe,KAAK,YAAc,EAAG,KAAK,OAAS,IAAK,GAAG,KAAK,MAAQ,EAAI,EAAI,EAAG,KAAK,OAAS,EAAE,OAAS,OAAO,GAAI,KAAK,IAAM,EAAG,KAAK,cAAgB,iBAAkB,EAAI,EAAE,aAAe,GAAG,KAAK,SAAW,EAAE,SAAW,KAAM,KAAK,kBAAoB,EAAE,iBAAmB,EAAE,mBAAqB,EAAG,GAAE,gBAAgB,KAAM,WAAY,KAAK,GAAG,CAAE,EAAE,OAAS,CAAC,EAAG,GAAI,CAChjB,KAAK,YAAY,MACX,GAGV,IAAI,SAAU,CACZ,OAAQ,KAAK,MAAQ,KAAO,EAE9B,IAAI,YAAa,CACf,OAAQ,KAAK,MAAQ,KAAO,EAE9B,IAAI,eAAgB,CAClB,OAAQ,KAAK,MAAQ,KAAO,EAE9B,IAAI,mBAAoB,CACtB,OAAQ,KAAK,MAAQ,KAAO,EAE9B,QAAS,CACP,EAAE,SAAS,cAAc,KAAK,CAEhC,IAAI,OAAQ,CACA,EAAE,SACT,cAAc,KAAK,CACtB,IAAI,EAAI,KAAK,MACb,IAAK,GAAK,EAAI,EAAI,MAAQ,EAAG,OAAO,KAAK,OACzC,IAAK,EAAI,MAAO,EAAG,MAAM,IAAI,EAAE,EAAE,kBAAkB,CACnD,IAAK,EAAI,KAAO,EAAG,CACjB,IAAM,EAAI,KAAK,cACf,GAAI,IAAM,GAAG,OAAO,EACpB,MAAM,IAAI,EAAE,EAAE,6BAA6B,CAE7C,IAAK,GAAK,EAAI,MAAQ,EAAG,CACvB,IAAM,EAAI,KAAK,MACf,IAAK,EAAI,KAAO,IAAM,EAAI,MAAO,GAAK,EAAE,KAAO,GAAK,CAAC,KAAK,UAAU,CAAG,EAAI,KAAK,OAAS,CAAC,GAAK,KAAK,YAAY,CAAE,EAAI,KAAK,QAAS,EAAI,KAAO,EAAG,OAAO,KAAK,OAEhK,IAAM,EAAI,KAAK,cAAe,EAAI,IAAM,GACxC,IAAK,EAAI,KAAO,EAAG,CACjB,GAAI,EAAG,OAAO,EACd,MAAM,IAAI,EAAE,EAAE,kCAAkC,CAElD,IAAK,EAAI,KAAO,EAAG,CACjB,GAAI,EAAG,OAAO,EACd,MAAM,KAAK,OAEb,OAAO,KAAK,OAEd,MAAO,CACL,OAAO,KAAK,OAEd,IAAI,OAAQ,CACA,EAAE,SACT,cAAc,KAAK,CACtB,IAAM,EAAI,KAAK,MACf,OAAQ,EAAI,KAAO,GAAkB,EAAI,KAAO,GAAiB,EAAI,KAAO,EAAiB,EAAE,KAAf,EAAE,SAA9B,EAAE,QAA/B,EAAE,SAE3B,IAAI,UAAW,CAEb,GADU,EAAE,SACL,cAAc,KAAK,EAAG,KAAK,OAAS,EAAI,MAAQ,EAAG,MAAO,CAAC,EAClE,IAAM,EAAI,KAAK,MACf,GAAI,CAAC,EAAE,aAAc,MAAO,CAAC,EAC7B,IAAM,EAAI,EAAE,KACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,GAAI,EAAE,MAAM,EAAE,EAAE,KAAK,SAAU,MAAO,CAAC,EACnE,MAAO,CAAC,EAEV,IAAI,SAAU,CACZ,MAAO,CAAC,KAAK,SAEf,IAAI,QAAS,CACD,EAAE,SACT,cAAc,KAAK,CACtB,IAAM,EAAI,KAAK,OAAQ,EAAI,KAAK,MAChC,GAAI,CAAC,EAAE,aACL,OAAO,GAAK,KAAO,EAAI,OAAO,OAAO,CAAC,EAAE,CAAC,CAC3C,IAAM,EAAI,EAAE,CACZ,GAAK,MAAQ,EAAE,KAAK,EAAE,CACtB,IAAM,EAAI,EAAE,KACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,MAAM,EAAE,CACpB,GAAI,GAAK,KAAM,SACf,IAAM,EAAI,EAAE,MACX,EAAE,MAAQ,KAAO,GAAK,EAAE,UAAY,KAAK,sBAAsB,EAAG,EAAE,CAEvE,OAAO,EAAE,SAAW,EAAI,EAAI,OAAO,OAAO,EAAE,CAE9C,sBAAsB,EAAG,EAAG,CAC1B,IAAM,EAAI,EAAE,OAAQ,EAAI,EAAE,OAC1B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,GACZ,GAAK,MAAQ,CAAC,EAAE,SAAS,EAAE,EAAI,EAAE,KAAK,EAAE,EAG5C,IAAI,WAAY,CAEd,OADU,EAAE,SACF,cAAc,KAAK,CAAE,KAAK,OAEtC,IAAI,WAAY,CAEd,OADU,EAAE,SACF,cAAc,KAAK,EAAG,KAAK,MAAQ,KAAO,EAEtD,IAAI,YAAa,CAEf,OADU,EAAE,SACF,cAAc,KAAK,EAAG,KAAK,MAAQ,KAAO,EAEtD,YAAa,CACX,KAAK,OAAS,GAAG,KAAK,YAAY,CAEpC,SAAU,EACP,KAAK,MAAQ,MAAO,IAAM,KAAK,MAAM,YAAY,CAAE,KAAK,QAAU,MAAQ,KAAK,OAAO,OAAO,CAAE,KAAK,MAAQ,GAAI,EAAI,EAAG,KAAK,OAAS,KAAM,KAAK,OAAS,IAAK,GAAG,KAAK,UAAY,IAErL,CAAC,OAAO,UAAW,CACjB,KAAK,SAAS,CAEhB,cAAc,EAAG,CACf,IAAM,EAAI,KAAK,YACf,GAAI,EAAE,iBAAmB,EAAG,OAC5B,EAAE,eAAiB,EACnB,IAAM,EAAI,KAAK,cAAe,EAAI,KAAK,MAAO,EAAI,EAAE,MAAM,EAAE,CAC5D,GAAI,GAAK,MAAQ,EAAE,OAAS,EAAG,EAAE,QAAU,EAAE,gBACpC,CAAC,EAAE,cAAc,EAAG,EAAE,CAAE,CAC/B,IAAM,EAAI,IAAI,EAAE,EAAG,EAAE,QAAS,EAAE,UAAU,KAAK,CAAC,CAChD,EAAE,UAAU,EAAG,EAAE,EAElB,EAAE,MAAQ,KAAO,IAAM,EAAE,aAAe,CAAC,GAE5C,YAAa,CACX,GAAI,KAAK,cAAe,OACxB,KAAK,OAAS,KAAK,MAAQ,GAAK,CAAC,GAAG,KAAK,YAAc,IAAG,CAAE,KAAK,YAAc,EAAG,KAAK,MAAM,iBAAiB,CAAE,KAAK,UAAY,GACjI,IAAI,EAAI,CAAC,EACT,GAAI,CACF,IAAM,EAAI,EAAE,IAAI,KAAM,KAAK,IAAI,CAC/B,KAAK,MAAM,aAAa,KAAK,YAAY,CAAE,KAAK,MAAM,MAAM,CAAE,EAAI,CAAC,EAAG,GAAG,EAAE,CAAG,KAAK,wBAAwB,EAAE,CAAG,KAAK,oBAAoB,EAAE,OACpI,EAAG,CACV,GAAI,CAAC,EAAG,GAAI,CACV,KAAK,MAAM,aAAa,KAAK,YAAY,MACnC,EAER,KAAK,aAAa,EAAG,EAAE,4BAA6B,CAAC,EAAE,QAC/C,CACR,KAAK,YAAc,EAAE,cAAe,KAAK,YAAc,EAAG,KAAK,OAAS,CAAC,GAG7E,wBAAwB,EAAG,CACzB,KAAK,OAAS,KAAK,MAAQ,GAAK,EAAE,EAAI,EAAI,EAAI,GAAI,KAAK,mBAAmB,IAAK,GAAG,IAAK,GAAE,CAAE,KAAK,iBAAmB,EAAG,KAAK,YAAc,KAAK,WAAa,GAAK,EAAE,eAClK,IAAM,EAAI,KAAK,WACf,EAAE,KAAM,GAAM,CACZ,GAAI,IAAM,KAAK,WAAY,CACzB,GAAI,KAAK,UAAU,CAAE,CACnB,IAAM,EAAI,IAAI,CACd,OAAO,KAAK,kBAAoB,IAAM,KAAK,gBAAkB,EAAG,KAAK,iBAAmB,GAAI,KAAK,mBAAqB,KAAK,iBAAmB,KAAK,YAAY,CAAG,KAAK,aAAa,IAAI,EAAE,wCAAwC,KAAK,iBAAiB,WAAW,CAAE,EAAE,kCAAkC,CAE3S,KAAK,oBAAoB,EAAE,CAAE,KAAK,mBAAmB,EAAG,IAAK,GAAE,GAE/D,GAAM,IAAM,KAAK,YAAc,KAAK,aAAa,EAAG,EAAE,kCAAkC,CAAC,CAE/F,aAAa,EAAG,EAAG,EAAI,CAAC,EAAG,CACzB,IAAM,EAAI,EAAE,EAAG,EAAG,EAAE,CACpB,GAAI,CAAC,GAAK,CAAC,KAAK,aAAe,KAAK,QAAU,GAAE,KAAK,QAAQ,EAAG,KAAK,OAAS,EAAG,KAAK,MAAQ,KAAK,MAAQ,EAAE,EAAI,EAAI,EAAI,GAAK,EAAI,EAAG,KAAK,SAAU,GAAI,CACtJ,KAAK,SAAS,EAAE,OACT,EAAG,CACV,QAAQ,MAAM,EAAE,gCAAiC,EAAE,CAErD,GAAI,EAAG,MAAM,EACb,KAAK,mBAAmB,IAAK,GAAG,IAAK,GAAE,CAEzC,oBAAoB,EAAG,CACrB,IAAM,EAAI,KAAK,QACb,EAAI,KAAO,GAAK,CAAC,KAAK,OAAO,KAAK,OAAQ,EAAE,IAAM,KAAK,QAAU,GAAE,KAAK,QAAQ,EAAG,KAAK,OAAS,EAAG,KAAK,OAAS,KAAM,KAAK,OAAS,EAAI,GAAK,EAAE,EAAI,EAAI,EAAI,EAAI,GAErK,SAAU,CACR,KAAK,YAAY,CAEnB,YAAa,CACX,IAAM,EAAI,KAAK,OACd,GAAK,EAAI,MAAQ,IAAM,KAAK,MAAQ,EAAI,EAAG,KAAK,mBAAmB,IAAK,GAAG,IAAK,GAAE,EAErF,UAAW,CACT,IAAM,EAAI,KAAK,MACf,OAAO,EAAE,aAAe,KAAK,iBAAiB,CAAG,EAAE,aAAa,CAElE,iBAAkB,CAChB,IAAM,EAAI,KAAK,MAAO,EAAI,EAAE,QAC5B,EAAE,QAAU,KACZ,GAAI,CACF,IAAM,EAAI,EAAE,KACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,MAAM,EAAE,CACpB,GAAI,GAAK,KAAM,SACf,IAAM,EAAI,EAAE,KACZ,IAAK,EAAE,MAAQ,KAAO,EAAG,GAAI,CAC3B,EAAE,WACI,EAER,GAAI,EAAE,UAAY,EAAE,QAClB,MAAO,MAAK,UAAY,EAAG,CAAC,EAEhC,MAAO,MAAK,UAAY,GAAI,CAAC,SACrB,CACR,EAAE,QAAU,KAIlB,SAAS,GAAG,EAAG,EAAI,EAAE,CAAE,CACrB,OAAO,IAAI,GAAG,EAAG,EAAE,CAErB,IAAI,GAAK,cAAc,EAAE,CACvB,YAAY,EAAG,EAAI,EAAE,CAAE,CACrB,OAAO,CAAE,KAAK,IAAM,CAAC,EAAG,KAAK,SAAW,KAAM,KAAK,MAAQ,IAAI,GAAM,KAAK,cAAgB,EAAE,cAAe,KAAK,gBAAkB,EAAE,cAAe,KAAK,IAAM,EAAG,KAAK,SAAW,EAAE,SAAW,KAAM,KAAK,MAAQ,EAAE,MAAQ,CAAC,EAAG,KAAK,eAAiB,EAAE,wBAA0B,EAAE,0BAA2B,KAAK,uBAAyB,EAAE,uBAAyB,EAAE,0BAA2B,KAAK,mBAAqB,EAAG,KAAK,gBAAkB,EAAG,KAAK,aAAe,EAAG,KAAK,aAAe,EAAG,KAAK,QAAU,EAAG,KAAK,YAAc,EAAG,KAAK,MAAQ,KAAK,oBAAwB,KAAK,SAAS,CAAG,KAAK,oBAAwB,GAAE,SAAS,KAAK,CAAE,GAAE,gBAAgB,KAAM,SAAU,KAAK,GAAG,CAEvqB,KAAM,CACJ,GAAI,KAAK,WAAY,MAAM,IAAI,EAAE,EAAE,gBAAgB,CACnD,KAAK,QAAQ,CAAC,EAAE,CAElB,SAAU,CACR,KAAK,aAAe,KAAK,OAAS,EAAE,SAAU,KAAK,cAAc,CAAE,KAAK,OAAO,YAAY,EAE7F,CAAC,OAAO,UAAW,CACjB,KAAK,SAAS,CAEhB,cAAc,EAAG,CACf,IAAK,KAAK,MAAQ,EAAE,aAAe,EAAG,OACtC,IAAM,EAAI,KAAK,cACf,GAAI,EAAE,iBAAmB,EAAG,OAC5B,EAAE,eAAiB,EACnB,IAAM,EAAI,KAAK,cAAe,EAAI,KAAK,MACnC,EACJ,OAAQ,EAAR,CACE,IAAK,GACH,EAAI,EAAE,IACN,MACF,IAAK,GACH,EAAI,EAAE,IACN,MACF,IAAK,GACH,EAAI,EAAE,IACN,MACF,IAAK,GACH,EAAI,EAAE,IACN,MACF,QACE,EAAI,EAAE,MAAM,EAAE,CAElB,GAAK,MAAQ,EAAE,OAAS,EAAI,EAAE,QAAU,EAAE,QAAU,EAAE,cAAc,EAAG,EAAE,EAAI,KAAK,qBAAqB,EAAG,EAAE,CAAE,EAAE,aAAe,EAAE,aAAe,CAAC,GAEnJ,qBAAqB,EAAG,EAAG,CACzB,IAAI,EACJ,GAAI,CACF,IAAM,EAAI,EAAE,UAAU,KAAK,gBAAgB,CAC3C,EAAI,IAAI,EAAE,EAAG,EAAE,QAAS,EAAE,OACnB,EAAG,CACV,IAAM,EAAI,EAAE,EAAG,EAAG,EAAE,wBAAwB,CAC5C,GAAI,QAAQ,MAAM,EAAE,CAAE,KAAK,SAAU,GAAI,CACvC,KAAK,SAAS,EAAE,MACV,EAER,EAAI,IAAI,EAAE,EAAG,EAAE,QAAS,IAAK,GAAE,CAEjC,KAAK,MAAM,UAAU,EAAG,EAAE,CAE5B,QAAQ,EAAI,CAAC,EAAG,CACd,IAAM,EAAI,KAAK,MACf,IAAK,GAAK,EAAE,SAAW,EAAE,cAAgB,EAAG,OAC5C,IAAM,EAAI,KAAK,MACf,GAAI,CAAC,GAAK,EAAE,KAAO,GAAK,CAAC,KAAK,UAAU,CAAE,OAC1C,KAAK,qBAAqB,CAAE,KAAK,MAAQ,EAAI,EAAE,UAAW,KAAK,cAAc,CAAE,KAAK,cAAgB,IAAG,CAAE,KAAK,YAAc,EAAG,EAAE,iBAAiB,CAAE,KAAK,UAAY,GACrK,IAAI,EAAI,CAAC,EACT,GAAI,CACF,IAAM,EAAI,EAAE,IAAI,KAAM,KAAK,IAAI,CAC/B,EAAE,aAAa,KAAK,YAAY,CAAE,EAAE,MAAM,CAAE,EAAI,CAAC,EAAG,GAAG,EAAE,CAAG,KAAK,mBAAmB,EAAE,CAAG,KAAK,SAAW,OAAO,GAAK,WAAa,EAAI,WAC/H,EAAG,CACV,GAAI,CAAC,EAAG,GAAI,CACV,EAAE,aAAa,KAAK,YAAY,MAC1B,EAER,KAAK,sBAAsB,EAAE,CAAE,KAAK,SAAW,YACvC,CACR,KAAK,OAAS,CAAC,EAAE,WAGrB,UAAW,CACT,IAAM,EAAI,KAAK,MACf,OAAO,EAAE,aAAe,KAAK,iBAAiB,CAAG,EAAE,aAAa,CAElE,mBAAmB,EAAG,CACpB,IAAM,EAAI,EAAE,KAAK,QACjB,EAAE,KAAM,GAAM,CACZ,GAAI,IAAM,KAAK,SAAW,KAAK,WAAY,CACzC,GAAI,OAAO,GAAK,WAAY,GAAI,CAC9B,GAAG,OACI,EAAG,CACV,KAAK,sBAAsB,EAAG,EAAE,sBAAsB,CAExD,OAEF,OAAO,GAAK,aAAe,KAAK,SAAW,IACzC,GAAM,IAAM,KAAK,SAAW,KAAK,sBAAsB,EAAE,CAAC,CAEhE,iBAAkB,CAChB,IAAM,EAAI,EAAE,QACZ,EAAE,QAAU,KACZ,IAAM,EAAI,KAAK,MACf,GAAI,CACF,IAAM,EAAI,EAAE,KACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,IAAM,EAAI,EAAE,MAAM,EAAE,CACpB,GAAI,GAAK,KAAM,SACf,IAAM,EAAI,EAAE,KACZ,GAAI,EAAE,YAAc,KAAK,iBAAiB,EAAE,CAAE,EAAE,UAAY,EAAE,QAC5D,MAAO,MAAK,UAAY,EAAG,CAAC,EAEhC,MAAO,CAAC,SACA,CACR,EAAE,QAAU,GAGhB,iBAAiB,EAAG,CAClB,GAAI,CACF,EAAE,WACI,GAGV,cAAe,CACb,IAAM,EAAI,KAAK,SACf,GAAI,GAAK,KAAM,CACb,KAAK,SAAW,KAChB,GAAI,CACF,GAAG,OACI,EAAG,CACV,KAAK,sBAAsB,EAAG,EAAE,sBAAsB,GAI5D,qBAAsB,CACpB,IAAM,EAAI,IAAI,CACd,KAAK,kBAAoB,IAAM,KAAK,gBAAkB,EAAG,KAAK,mBAAqB,GAAI,EAAE,KAAK,mBAAqB,KAAK,wBAA0B,KAAK,wBAAwB,aAAa,CAAE,IAAI,CAAG,EAAE,0BAA4B,KAAK,wBAAwB,SAAS,CAAE,KAAK,kBAElR,sBAAuB,CACrB,GAAI,CAAC,OAAO,SAAS,KAAK,eAAe,CAAE,OAC3C,IAAM,EAAI,KAAK,KAAK,CACpB,GAAI,EAAI,KAAK,cAAgB,EAAG,wBAAyB,CACvD,KAAK,aAAe,EAAG,KAAK,aAAe,EAC3C,OAEF,GAAI,EAAE,KAAK,aAAe,KAAK,eAAgB,CAC7C,IAAM,EAAI,IAAI,EAAE,EAAE,gCAAgC,CAClD,MAAM,KAAK,SAAS,CAAE,KAAK,sBAAsB,EAAE,CAAE,GAGzD,IAAI,gBAAiB,CACnB,OAAO,KAAK,gBAEd,IAAI,aAAc,CAChB,OAAQ,KAAK,MAAQ,EAAE,aAAe,EAExC,wBAAwB,EAAG,CACzB,IAAM,EAAI,IAAI,EAAE,2BAA2B,EAAE,qBAAqB,KAAK,mBAAmB,sDAAsD,KAAI,CACpJ,MAAM,KAAK,SAAS,CAAE,QAAQ,MAAM,EAAE,CAAE,EAE1C,sBAAsB,EAAG,EAAI,EAAE,wBAAyB,CACtD,IAAM,EAAI,EAAE,EAAG,EAAG,EAAE,CACpB,GAAI,QAAQ,MAAM,EAAE,CAAE,KAAK,SAAU,GAAI,CACvC,KAAK,SAAS,EAAE,OACT,EAAG,CACV,QAAQ,MAAM,EAAE,EAAG,EAAG,EAAE,gCAAgC,CAAC,IAI/D,SAAS,EAAG,EAAG,EAAI,EAAE,CAAE,CACrB,GAAI,OAAO,GAAK,WAAY,MAAM,IAAI,EAAE,EAAE,wBAAwB,CAClE,IAAM,EAAI,IAAI,GAAG,EAAG,EAAE,CACtB,OAAO,EAAE,SAAS,CAAE,EAEtB,IAAI,GAAqB,OAAO,IAAI,mBAAmB,CAAE,GAAqB,OAAO,IAAI,uBAAuB,CAChH,SAAS,GAAG,EAAG,EAAG,EAAG,EAAG,CACtB,GAAI,IAAM,EAAE,OAAQ,OAAO,EAC3B,IAAM,EAAI,EAAE,GAAI,EAAiB,OAAO,GAAK,UAAzB,EAAoC,EAAI,EAAE,CAAE,EAAI,EAAE,GAAI,EAAI,GAAG,EAAG,EAAG,EAAI,EAAG,EAAE,CAChG,GAAI,OAAO,GAAG,EAAG,EAAE,CAAE,OAAO,EAC5B,GAAI,MAAM,QAAQ,EAAE,CAAE,CACpB,IAAM,EAAI,EAAE,OAAO,CAAE,EAAI,OAAO,SAAS,EAAG,GAAG,CAC/C,OAAO,OAAO,MAAM,EAAE,CAAG,EAAE,GAAK,EAAI,EAAE,GAAK,EAAG,EAEhD,MAAO,CACL,GAAG,GACF,GAAI,EACN,CAEH,SAAS,EAAE,EAAG,EAAG,CACf,IAAI,EAAI,EACF,EAAI,EAAE,OACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,IAAK,CAC1B,GAAI,GAAK,KAAM,OACf,EAAI,EAAE,EAAE,IAEV,OAAO,EAET,SAAS,GAAG,EAAG,EAAG,CAChB,IAAM,EAAI,EAAE,SAAS,IAAI,CAAG,EAAE,MAAM,IAAI,CAAG,CAAC,EAAE,CAAE,EAAoB,IAAI,IAAO,MAAU,CACvF,EAAE,QAAS,GAAM,GAAG,CAAC,CAAE,EAAE,OAAO,EAElC,MAAO,CACL,IAAI,OAAQ,CACV,OAAO,EAAE,EAAE,MAAO,EAAE,EAEtB,IAAI,MAAM,EAAG,CACX,IAAM,EAAI,EAAE,MAAM,CAAE,EAAI,GAAG,EAAG,EAAG,EAAG,EAAE,CACtC,IAAM,IAAM,EAAE,MAAQ,IAExB,SAAY,EAAE,EAAE,MAAM,CAAE,EAAE,CAC1B,UAAU,EAAG,CACX,IAAM,EAAI,EAAE,WAAW,EAAG,IAAM,CAC9B,IAAM,EAAI,EAAE,EAAG,EAAE,CAAE,EAAI,EAAE,EAAG,EAAE,CAC9B,OAAO,GAAG,EAAG,EAAE,EAAI,EAAE,EAAG,EAAE,EAC1B,CACF,OAAO,EAAE,IAAI,EAAE,KAAQ,CACrB,GAAG,CAAE,EAAE,OAAO,EAAE,GAGpB,oBAAuB,EAAE,KACzB,QAAS,GACR,OAAO,SAAU,GACjB,IAAK,CAAC,GACN,IAAK,CAAC,EACR,CAEH,IAAI,IAAM,EAAG,IAAM,GAAG,EAAG,EAAE,CAAE,GAAM,GAAO,GAAM,GAAG,EAAG,EAAE,CACxD,SAAS,GAAG,EAAG,CACb,GAAI,OAAO,GAAK,WAAY,MAAU,UAAU,EAAE,gCAAgC,CAClF,IAAM,EAAI,GACV,EAAE,YAAY,CACd,GAAI,CACF,OAAO,GAAG,QACF,CACR,EAAE,UAAU,EClsChB,IAAa,GAAc,GAA2C,GAAO,EAAE,CAGlE,GAAgB,GACb,OAAO,GAAM,YAA3B,GAAuC,OAAQ,EAA8B,MAAS,WAGxF,SAAgB,GAAY,EAAqB,CAC/C,IAAM,EAAM,EAAG,UACT,EAAK,EAAG,GACd,GAAI,EAAI,MAAO,GAAG,EAAI,GAAG,IACzB,IAAM,EAAY,EAAG,UACrB,GAAI,OAAO,GAAc,SAAU,CACjC,IAAM,EAAU,EAAU,MAAM,CAChC,GAAI,EACF,MAAO,GAAG,EAAI,GAAG,EAAQ,QAAQ,OAAQ,IAAI,GAGjD,OAAO,EAGT,IAAa,EAAS,OAAO,UAAU,eAWvC,SAAgB,GAAa,EAAY,EAAqB,CAC5D,GAAI,IAAM,EAAG,MAAO,GACpB,GAAI,OAAO,GAAM,WAAY,GAAc,OAAO,GAAM,WAAY,EAAY,MAAO,GAEvF,IAAM,EAAO,EACP,EAAO,EAET,EAAS,EACb,IAAK,IAAM,KAAK,EACd,GAAI,EAAO,KAAK,EAAM,EAAE,CAAE,CACxB,GAAI,CAAC,EAAO,KAAK,EAAM,EAAE,EAAI,EAAK,KAAO,EAAK,GAAI,MAAO,GACzD,IAIJ,IAAI,EAAS,EACb,IAAK,IAAM,KAAK,EACV,EAAO,KAAK,EAAM,EAAE,EAAE,IAG5B,OAAO,IAAW,EChDpB,IAAa,EAAe,CAC1B,MAAO,eACP,QAAS,iBACT,KAAM,cACN,MAAO,eACR,CAEY,GAAiB,OAAO,OAAO,CAC1C,KAAM,OACN,SAAU,GACV,cAAe,GACf,YAAa,SACd,CAAU,CAEE,GAAiB,CAAE,MAAO,QAAS,SAAU,EAAG,CAChD,GAAiB,CAAE,sBAAuB,IAAK,CAE/C,GAAwC,IAAI,IAAI,CAAC,QAAS,SAAU,WAAW,CAAC,CAmBhF,GAAuC,IAAI,IAAI,CAC1D,YACA,YACA,SACA,YACA,cACA,YACD,CAAC,CASW,EAAiB,CAE5B,MAAO,CACL,UAAY,GAAc,UAAU,EAAE,8CACtC,mBAAqB,GAAc,aAAa,EAAE,aAClD,iBAAmB,GAAc,mBAAmB,EAAE,aACtD,cAAgB,GAAc,4BAA4B,IAC3D,CAED,SAAU,CACR,mBAAsB,kDACtB,kBAAoB,GAAc,kDAAkD,EAAE,IACtF,sBAAwB,GACtB,+DAA+D,EAAE,IACnE,iBAAmB,GAAc,kCAAkC,EAAE,IACrE,aAAe,GACb,uCAAuC,EAAE,yCAC5C,CAED,QAAS,CACP,sBAAwB,GAAc,0CAA0C,EAAE,IAClF,eAAiB,GAAc,IAAI,EAAE,kDACrC,kBAAoB,GAAc,IAAI,EAAE,qDACxC,eAAgB,EAAW,IACzB,6BAA6B,EAAE,GAAG,EAAI,YAAc,KACtD,cAAgB,GAAe,wBAAwB,EAAI,KAAK,IAAM,KACtE,YAAc,GAAe,qCAAqC,EAAI,KAAK,IAAM,KAClF,CAED,KAAM,CACJ,eAAgB,EAAoB,EAAW,IAC7C,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,IACxD,CAED,MAAO,CACL,MAAQ,GAAe,cAAc,EAAI,kBAAkB,EAAE,GAAK,KAClE,cAAgB,GAAe,gBAAgB,EAAI,kBAAkB,EAAE,GAAK,KAC7E,CAED,KAAM,CACJ,qBAAuB,GAAe,uBAAuB,EAAI,KAAK,IAAM,KAC7E,CACF,CCpGK,GAAa,OAAO,OAAW,IAC/B,GAAuB,GAAG,GAAe,sBAAwB,IAAK,GAE5E,SAAS,IAA2B,CAElC,IAAM,EAAI,WACV,GAAI,IAAc,EAAE,QAAQ,iBAAmB,GAAM,MAAO,GAI5D,GAAI,CACF,GAAI,EAAE,SAAS,KAAK,kBAAoB,OAAQ,MAAO,QACjD,EACR,MAAO,GAsGT,IAAa,EAAQ,IA/FrB,KAAsB,CAIpB,aAAc,eAHK,mBACE,gBAoBoC,wBAGsC,uBAIvF,oBAG+C,GA3BrD,KAAK,SAAW,IAAiB,CACjC,KAAK,WAAa,KAAK,SACvB,KAAK,cAAc,KAAK,SAAS,CAGnC,IAAI,SAAmB,CACrB,OAAO,KAAK,SAGd,IAAI,QAAQ,EAAY,CAClB,KAAK,WAAa,IACpB,KAAK,SAAW,EAChB,KAAK,cAAc,EAAE,EAkBzB,KAAK,EAAW,EAAW,GAAG,EAAoB,CAChD,QAAQ,KAAK,GAAG,EAAE,GAAG,IAAK,GAAG,EAAE,CAIjC,MAAM,EAAW,EAAW,EAAkB,CAC5C,QAAQ,MAAM,GAAG,EAAE,GAAG,IAAK,EAAE,CAG/B,cAAsB,EAAoB,CACpC,GACF,KAAK,KAAO,EAAG,GAAG,IAAM,QAAQ,IAAI,EAAG,GAAG,EAAE,CAC5C,KAAK,aAAe,EAAG,EAAG,EAAG,IAC3B,QAAQ,IAAI,GAAG,EAAE,SAAS,GAAK,YAAY,YAAa,EAAG,IAAK,EAAE,CACpE,KAAK,YAAc,EAAG,EAAG,EAAM,IAAM,CACnC,IAAM,EAAK,aAAa,QAAU,EAAK,EAAE,GACrC,GAAI,cACN,QAAQ,IAAI,GAAG,EAAE,gBAAgB,GAAY,EAAG,CAAC,GAAG,EAAK,IAAK,EAAE,CAChE,KAAK,kBAAkB,EAAG,GAG9B,KAAK,SAAW,EAAG,IAAM,QAAQ,IAAI,GAAG,EAAE,YAAY,IAAI,GAE1D,KAAK,QAAY,GACjB,KAAK,gBAAoB,GACzB,KAAK,eAAmB,GACxB,KAAK,YAAgB,IAIzB,kBAA0B,EAAmB,CAC3C,GAAI,CAAC,EAAG,YAAa,OACrB,IAAa,CAEb,IAAM,EAAM,GAAK,IAAI,EAAG,CAClB,EAAM,GAAO,IAAI,EAAG,CACtB,IAAQ,IAAA,IAAW,qBAAqB,EAAI,CAC5C,IAAQ,IAAA,KACV,aAAa,EAAI,CACjB,GAAO,OAAO,EAAG,EAGnB,GAAK,IACH,EACA,0BAA4B,CAC1B,GAAK,OAAO,EAAG,CACV,EAAG,cACR,EAAG,UAAU,IAAI,GAAgB,CACjC,GAAO,IACL,EACA,eAAiB,CACX,EAAG,aAAa,EAAG,UAAU,OAAO,GAAgB,CACxD,GAAO,OAAO,EAAG,EAChB,GAAe,sBAAsB,CACzC,GACD,CACH,GAUC,GAAkB,uBACtB,GAAS,kBACP,GAAgB,GAEpB,SAAS,IAAoB,CAC3B,GAAI,IAAiB,CAAC,GAAY,OAClC,GAAI,SAAS,cAAc,SAAS,GAAO,GAAG,CAAE,CAC9C,GAAgB,GAChB,OAEF,IAAM,EAAI,OAAO,OAAO,SAAS,cAAc,QAAQ,CAAE,CACvD,YAAa,IAAI,GAAgB,+EAA+E,GAAqB,YACtI,CAAC,CACF,EAAE,aAAa,GAAQ,GAAG,CAC1B,SAAS,KAAK,YAAY,EAAE,CAC5B,GAAgB,GAGlB,IAAM,GAAS,IAAI,QACjB,GAAO,IAAI,QCjHb,SAAS,GAAQ,EAAM,EAAqC,CAC1D,OAAO,EAAW,EAAG,EAAK,CAG5B,OAAO,eAAe,GAAM,QAAS,CACnC,WAAY,GACZ,aAAc,GACd,QAAW,EAAM,QACjB,IAAM,GAAe,CACnB,EAAM,QAAU,GAEnB,CAAC,CAGF,IAAa,OAAgC,QAAQ,SAAS,CAG9D,EAAA,QAAE,OAAO,CACD,QACN,SAAA,GACA,OAAA,EACA,MAAA,GACA,UAAA,EACA,OAAA,GACA,WAAA,GACA,cACA,YACA,SAAA,GACA,YAAA,GACA,QAAA,GACD,CAAC,CC1DF,IAAa,GAAb,KAA0B,CAGxB,YACE,EAAyB,GACzB,EAA4B,IAC5B,CAFiB,KAAA,MAAA,EACA,KAAA,SAAA,YAJY,EAAE,CAQjC,SAAe,CACb,OAAO,KAAK,KAAK,KAAK,EAAI,EAAE,CAI9B,QAAQ,EAAgB,CAElB,EAAI,OAAS,KAAK,UAAY,KAAK,KAAK,QAAU,KAAK,OACvD,OAAO,SAAS,EAAI,GAExB,EAAI,OAAS,EACb,KAAK,KAAK,KAAK,EAAI,EAIrB,OAAc,CACZ,KAAK,KAAK,OAAS,ICnBV,GAAb,KAA0C,CAGxC,YACE,EACA,EACA,EAAyB,GACzB,CAHiB,KAAA,QAAA,EACA,KAAA,MAAA,EACA,KAAA,MAAA,YALU,EAAE,CAS/B,SAAa,CACX,OAAO,KAAK,KAAK,KAAK,EAAI,KAAK,SAAS,CAI1C,QAAQ,EAAc,CAChB,KAAK,KAAK,OAAS,KAAK,QAC1B,KAAK,MAAM,EAAI,CACf,KAAK,KAAK,KAAK,EAAI,EAKvB,OAAc,CACR,KAAK,KAAK,OAAS,IACrB,KAAK,KAAK,OAAS,GAIvB,IAAI,MAAe,CACjB,OAAO,KAAK,KAAK,SClCR,GAAmB,IAAI,GACvB,GAAoB,IAAI,GAuBxB,GAAoB,IAAI,QAE1B,CACL,QAAS,IAAA,GACT,SAAU,IAAA,GACV,iBAAkB,IAAA,GACnB,EAEF,GAAM,CACL,EAAE,QAAU,IAAA,GACZ,EAAE,SAAW,IAAA,GACb,EAAE,iBAAmB,IAAA,IAEvB,IACD,CCnCG,GAAuB,GAM3B,SAAS,IAA0B,CAC7B,KACJ,GAAuB,GACnB,OAAO,SAAa,KAAe,SAAS,MAC9C,GAAkB,SAAS,KAAK,EASpC,IAAM,EAAY,aAkLL,EAAW,IAlKxB,KAAsB,4BACF,IAAI,4BACG,IAAI,0BACN,IAAI,QAE3B,KAAK,EAAkB,CACrB,KAAK,eAAe,IAAI,EAAK,CAE/B,OAAO,EAAqB,CAC1B,OAAO,KAAK,eAAe,IAAI,EAAK,CAEtC,YAAY,EAAkB,CAC5B,KAAK,aAAa,IAAI,EAAK,CAE7B,UAAU,EAAqB,CAC7B,OAAO,KAAK,aAAa,IAAI,EAAK,CAGpC,kBAA0B,EAA4B,CACpD,IAAmB,CACnB,IAAI,EAAM,KAAK,QAAQ,IAAI,EAAG,CAM9B,OALK,IACH,EAAM,GAAkB,SAAS,CACjC,KAAK,QAAQ,IAAI,EAAI,EAAI,CACzB,EAAG,UAAU,IAAI,EAAU,EAEtB,EAUT,YAAY,EAAa,EAAwB,CAC/C,IAAM,EAAS,KAAK,kBAAkB,EAAG,CACzC,AACE,EAAO,UAAU,GAAiB,SAAS,CAE7C,EAAO,QAAQ,KAAK,EAAG,CAUzB,aAAa,EAAa,EAAsB,CAC9C,IAAM,EAAS,KAAK,kBAAkB,EAAG,CACzC,AACE,EAAO,WAAW,GAAkB,SAAS,CAE/C,EAAO,SAAS,KAAK,EAAG,CAO1B,oBAAoB,EAAa,EAAoC,CACnE,KAAK,kBAAkB,EAAG,CAAC,iBAAmB,EAGhD,QAAQ,EAAsB,CAC5B,OAAO,KAAK,QAAQ,IAAI,EAAG,CAG7B,QAAQ,EAA0B,CAChC,IAAM,EAAY,EAAG,WAAa,EAC5B,EAAS,KAAK,QAAQ,IAAI,EAAc,CAM9C,GAHA,KAAK,eAAe,OAAO,EAAG,CAC9B,KAAK,aAAa,OAAO,EAAG,CAExB,CAAC,EAAQ,CACP,GAAY,EAAe,UAAU,OAAO,EAAU,CAC1D,OAGF,KAAK,QAAQ,OAAO,EAAc,CAC9B,GAAY,EAAe,UAAU,OAAO,EAAU,CAE1D,IAAM,EAAW,EAAY,GAAY,EAAc,CAAG,EAAG,UAAY,OAGzE,GAFA,EAAM,QAAQ,EAAa,QAAS,EAAS,CAEzC,EAAO,iBACT,GAAI,CACF,EAAO,kBAAkB,OAClB,EAAG,CACV,EAAM,MAAM,EAAa,MAAO,EAAe,MAAM,cAAc,EAAS,CAAE,EAAE,CAIpF,GAAI,EAAO,QAAS,CAClB,IAAK,IAAM,KAAM,EAAO,QACtB,GAAI,CACF,EAAG,SAAS,OACL,EAAG,CACV,EAAM,MAAM,EAAa,QAAS,EAAe,KAAK,qBAAqB,EAAS,CAAE,EAAE,CAG5F,GAAiB,QAAQ,EAAO,QAAQ,CACxC,EAAO,QAAU,IAAA,GAGnB,GAAI,EAAO,SAAU,CACnB,IAAK,IAAM,KAAM,EAAO,SACtB,GAAI,CACF,GAAI,OACG,EAAG,CACV,EAAM,MAAM,EAAa,QAAS,EAAe,QAAQ,cAAc,EAAS,CAAE,EAAE,CAGxF,GAAkB,QAAQ,EAAO,SAAS,CAC1C,EAAO,SAAW,IAAA,GAEpB,GAAkB,QAAQ,EAAO,CAGnC,mBAAmB,EAAmD,CAEpE,IAAM,EAAQ,EACX,uBACE,EAAe,uBAAuB,EAAU,CACjD,EAAG,iBAAiB,IAAI,IAAY,CAElC,EAAM,EAAK,OACjB,GAAI,IAAQ,EAAG,OAIf,IAAM,EAAe,MAAe,EAAI,CACxC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,EAAS,GAAK,EAAK,GAEjD,IAAK,IAAI,EAAI,EAAM,EAAG,GAAK,EAAG,IAAK,CACjC,IAAM,EAAQ,EAAS,GAEnB,KAAK,QAAQ,IAAI,EAAM,CACzB,KAAK,QAAQ,EAAM,CAEnB,EAAM,UAAU,OAAO,EAAU,EAKvC,YAAY,EAA0B,EAChC,EAAG,WAAa,GAAK,EAAG,WAAa,KACvC,KAAK,mBAAmB,EAA8C,CAExE,KAAK,QAAQ,EAAG,GAUd,GAAY,IAAI,IAYtB,SAAgB,GAAkB,EAAqB,CAErD,GAAI,GAAU,IAAI,EAAK,CACrB,OAGF,IAAM,EAAW,IAAI,iBAAkB,GAAc,CACnD,IAAM,EAAM,EACZ,IAAK,IAAI,EAAI,EAAG,EAAO,EAAU,OAAQ,EAAI,EAAM,IAAK,CACtD,IAAM,EAAe,EAAU,GAAI,aACnC,IAAK,IAAI,EAAI,EAAG,EAAO,EAAa,OAAQ,EAAI,EAAM,IAAK,CACzD,IAAM,EAAO,EAAa,GAM1B,GAAI,EAAK,WAAa,GAAM,EAAiB,YAAa,SAE1D,IAAM,EAAK,EAGP,EAAI,OAAO,EAAG,EAAI,EAAI,UAAU,EAAG,EAEvC,EAAI,YAAY,EAAG,IAGvB,CAEF,EAAS,QAAQ,EAAM,CAAE,UAAW,GAAM,QAAS,GAAM,CAAC,CAC1D,GAAU,IAAI,EAAM,EAAS,CAc/B,SAAgB,IAA2B,CACzC,GAAU,QAAS,GAAQ,EAAI,YAAY,CAAC,CAC5C,GAAU,OAAO,CChQnB,IAAa,GAAmB,OAAO,uBAAuB,CAQxD,GAAa,IAAI,QAuBnB,EAAoC,KAMlC,GAAqB,GAAmC,CAE5D,GAAK,EAAwC,IAAmB,OAAO,EAEvE,IAAI,EAAU,GAAW,IAAI,EAAG,CAQhC,OAPK,IACH,EAAU,SAAyB,GAAG,EAAiB,CACrD,OAAO,OAAY,EAAG,MAAM,KAAM,EAAiC,CAAC,EAErE,EAA6C,IAAoB,GAClE,GAAW,IAAI,EAAI,EAAQ,EAEtB,GAGT,SAAS,GAAa,EAAiE,CACrF,IAAM,EAAuC,EAAE,CAC/C,IAAK,IAAM,KAAK,EAAS,EAAI,KAAI,EAAO,GAAK,GAAkB,EAAI,GAAG,EACtE,OAAO,EAGT,SAAS,GACP,EAC0C,CAC1C,IAAM,EAAmD,EAAE,CAC3D,IAAK,IAAM,KAAK,EAAK,CACnB,IAAM,EAAI,EAAI,GACd,EAAO,GAAK,EAAK,GAAW,IAAI,EAAE,EAAI,EAAK,IAAA,GAE7C,OAAO,EAOT,SAAgB,IAA8B,CAC5C,GAAI,IAAc,KAAM,OAExB,EAAY,CACV,GAAI,EAAA,QAAE,GAAG,GACT,IAAK,EAAA,QAAE,GAAG,IACV,OAAQ,EAAA,QAAE,GAAG,OACb,MAAO,EAAA,QAAE,GAAG,MACZ,OAAQ,EAAA,QAAE,GAAG,OACd,CACD,IAAM,EAAO,EAEb,EAAA,QAAE,GAAG,OAAS,SAAwB,EAAmB,CACvD,IAAM,EAAU,EAAW,KAAK,OAAO,EAAS,CAAG,KAC7C,EAAM,EAAQ,OACpB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAK,EAAQ,GACf,IACF,EAAS,YAAY,EAAG,CACxB,EAAS,YAAY,EAAG,EAG5B,OAAO,EAAK,OAAO,KAAK,KAAM,EAAS,EAAI,MAG7C,EAAA,QAAE,GAAG,MAAQ,UAAwB,CACnC,IAAM,EAAM,KAAK,OACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAK,KAAK,GACZ,GAAI,eAAe,EAAE,EAAS,mBAAmB,EAAG,CAE1D,OAAO,EAAK,MAAM,KAAK,KAAK,EAAI,MAGlC,EAAA,QAAE,GAAG,OAAS,SAAwB,EAAmB,CACvD,IAAM,EAAU,EAAW,KAAK,OAAO,EAAS,CAAG,KAC7C,EAAM,EAAQ,OACpB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAK,EAAQ,GACf,GAAI,EAAS,KAAK,EAAG,CAE3B,OAAO,EAAK,OAAO,KAAK,KAAM,EAAS,EAAI,MAG7C,EAAA,QAAE,GAAG,GAAK,SAAwB,GAAG,EAAiB,CACpD,IAAM,EAAQ,EAAK,GACnB,GAAI,GAAS,OAAO,GAAU,SAC5B,EAAK,GAAK,GAAa,EAAsC,KACxD,CACL,IAAM,EAAO,EAAK,OAAS,EACvB,GAAQ,GAAK,OAAO,EAAK,IAAU,aACrC,EAAK,GAAQ,GAAkB,EAAK,GAAsB,EAG9D,OAAO,EAAK,GAAG,MAAM,KAAM,EAAmC,EAAI,MAGpE,EAAA,QAAE,GAAG,IAAM,SAAwB,GAAG,EAAiB,CACrD,IAAM,EAAQ,EAAK,GACnB,GAAI,GAAS,OAAO,GAAU,SAC5B,EAAK,GAAK,GAAmB,EAAkD,KAC1E,CACL,IAAM,EAAO,EAAK,OAAS,EAC3B,GAAI,GAAQ,GAAK,OAAO,EAAK,IAAU,WAAY,CACjD,IAAM,EAAK,EAAK,GAChB,EAAK,GAAQ,GAAW,IAAI,EAAG,EAAI,GAGvC,OAAO,EAAK,IAAI,MAAM,KAAM,EAAoC,EAAI,MAQxE,SAAgB,IAA+B,CACzC,IAAc,OAElB,EAAA,QAAE,GAAG,GAAK,EAAU,GACpB,EAAA,QAAE,GAAG,IAAM,EAAU,IACrB,EAAA,QAAE,GAAG,OAAS,EAAU,OACxB,EAAA,QAAE,GAAG,MAAQ,EAAU,MACvB,EAAA,QAAE,GAAG,OAAS,EAAU,OAExB,EAAY,MCVd,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,EAAA,KAAA,GAAA,OACA,EAAA,EAAA,QAAA,GAAA,UACA,EAAA,EAAA,UAAA,GAAA,YACA,EAAA,EAAA,cAAA,GAAA,gBACA,EAAA,EAAA,aAAA,GAAA,eACA,EAAA,EAAA,KAAA,IAAA,aACD,CC9JG,GAAkB,EAUtB,SAAS,GAAa,EAAoB,CACvC,EAAuC,IAAoB,GAG9D,IAAM,GAAN,KAAsB,CAyBpB,YAAY,EAAa,EAAuB,EAAwB,YAPxD,iBAC+C,IAAA,mCAwGf,CAG9C,KAAK,OAAS,EAAa,yCAGiB,CAC5C,KAAK,OAAS,CAAC,EAAa,UAE5B,KAAK,aAAa,uBAGiB,CACnC,KAAK,OAAS,EAAa,6BAGO,CAClC,KAAK,OAAS,CAAC,EAAa,QAC5B,IAAM,EAAe,CAAC,EAAE,KAAK,MAAQ,EAAa,WAClD,KAAK,OAAS,CAAC,EAAa,UAG5B,KAAK,sBAAsB,CAIvB,GAAgB,KAAK,YAAc,IAAA,IACrC,KAAK,iBAAiB,CAIxB,KAAK,mBAAmB,2BA8Cc,CACtC,IAAM,EAAM,KAAK,KAAK,MAEtB,MAAgB,CACd,IAAM,EAAY,KAAK,OAAO,EAAI,CAC5B,EAAM,KAAK,WAAW,CAG5B,GAAI,KAAK,qBACH,KAAK,MAAM,EAAqB,EAAI,CAAE,eACjC,IAAQ,EACjB,OAKF,GAAI,KAAK,MAAQ,EAAa,QAC5B,GAAI,CACF,GAAI,KAAK,MAAM,KAAK,SAAS,CAAE,EAAI,CAAE,YAC/B,EAKV,KAAK,OAAS,EAAa,aAC3B,GAAI,CACF,KAAK,SAAS,EAAK,EAAU,CAC7B,EAAM,WAAW,EAAa,QAAS,KAAK,IAAK,MAAO,EAAU,QAC1D,CACR,KAAK,OAAS,CAAC,EAAa,eAE9B,mBAG4B,CAC9B,KAAK,IAAI,IAAI,KAAK,GAAG,CACrB,aAAa,KAAK,UAAU,CAC5B,KAAK,UAAY,IAAA,IAnNjB,KAAK,IAAM,EACX,KAAK,GAAK,EAAI,GACd,KAAK,KAAO,EACZ,IAAM,EAAU,KAAK,GAAG,QAClB,EAAa,IAAY,UAAa,KAAK,GAAyB,SAC1E,KAAK,iBAAmB,EACxB,KAAK,cAAgB,IAAY,SAAW,IAAY,WACxD,KAAK,GAAK,aAAa,EAAE,KAEzB,IAAM,EAAW,EAAQ,UAAY,EAErC,KAAK,MAAQ,EAAQ,QAAW,GAAc,GAG1C,GACF,KAAK,OACH,EAAQ,SAAY,IAAU,MAAM,QAAQ,EAAE,CAAG,EAAI,EAAI,CAAC,OAAO,EAAE,CAAC,CAAG,EAAE,EAAE,KAAK,IAAI,EACtF,KAAK,cAAmB,KAAK,IAAI,KAAK,EAAwB,EAAE,CAChE,KAAK,YAAgB,KAAK,WAAW,CACrC,KAAK,SAAY,GAAQ,CACvB,KAAK,IAAI,IAAI,EAA2B,IAG1C,KAAK,OAAS,EAAQ,SAAY,GAAS,OAAO,GAAK,GAAG,EAC1D,KAAK,cAAkB,KAAK,GAAG,MAC/B,KAAK,YAAgB,KAAK,MAAM,KAAK,GAAG,MAAM,CAE1C,KAAK,cACP,KAAK,UAAY,EAAM,IAAc,CACnC,GAAI,KAAK,MAAQ,EAAa,QAE5B,GAAI,CACF,IAAM,EAAK,KAAK,GACV,EAAQ,EAAG,eACX,EAAM,EAAG,aACf,EAAG,MAAQ,EACX,IAAM,EAAM,EAAU,OAClB,IAAU,MAAQ,IAAQ,MAC5B,EAAG,kBAAkB,EAAQ,EAAM,EAAQ,EAAK,EAAM,EAAM,EAAM,EAAI,MAElE,CACN,KAAK,GAAG,MAAQ,OAGlB,KAAK,GAAG,MAAQ,GAIpB,KAAK,UAAY,EAAG,IAAc,CAChC,KAAK,GAAG,MAAQ,IAKtB,IAAM,EAAY,EAAQ,OAAS,OAAO,GACtC,EACF,KAAK,OAAS,EAAM,IAAkB,CACpC,GAAI,EAAU,EAAG,EAAE,CAAE,MAAO,GAC5B,GAAI,MAAM,QAAQ,EAAE,EAAI,MAAM,QAAQ,EAAE,CAAE,CACxC,IAAM,EAAM,EAAE,OACd,GAAI,IAAQ,EAAE,OAAQ,MAAO,GAC7B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IACvB,GAAI,CAAC,OAAO,GAAG,EAAE,GAAI,EAAE,GAAG,CAAE,MAAO,GAErC,MAAO,GAET,MAAO,IAGT,KAAK,MAAQ,EAGX,EAAW,EACb,KAAK,gBAAoB,CACnB,KAAK,MAAQ,EAAa,YAC9B,aAAa,KAAK,UAAU,CAC5B,KAAK,UAAY,eAAiB,KAAK,iBAAiB,CAAE,EAAS,GAGrE,KAAK,gBAAoB,CACjB,KAAK,MAAQ,EAAa,WAAY,KAAK,iBAAiB,EAItE,CACE,KAAK,YACL,KAAK,WACL,KAAK,uBACL,KAAK,qBACL,KAAK,YACN,CAAC,QAAQ,GAAa,CAEvB,KAAK,WAAW,EAAQ,OAAS,GAAe,MAAM,CAyCxD,sBAAqC,CAC/B,KAAK,YAAc,IAAA,KACrB,aAAa,KAAK,UAAU,CAC5B,KAAK,UAAY,IAAA,GACjB,KAAK,iBAAiB,EAI1B,mBAAkC,CAChC,IAAM,EAAM,KAAK,KAAK,MAAM,CACtB,EAAY,KAAK,OAAO,EAAI,CAC5B,EAAM,KAAK,WAAW,CAExB,KAAK,iBACF,KAAK,MAAM,EAAqB,EAAI,EACvC,KAAK,SAAS,EAAK,EAAU,CAEtB,IAAQ,GACjB,KAAK,SAAS,EAAK,EAAU,CAIjC,iBAAgC,CAC1B,UAAK,MAAQ,EAAa,MAC9B,MAAK,OAAS,EAAa,cAC3B,GAAI,CACF,IAAM,EAAS,KAAK,SAAS,CACxB,KAAK,MAAM,KAAK,KAAK,MAAM,CAAE,EAAO,GACvC,KAAK,KAAK,MAAQ,SAEb,EAAG,CACV,EAAM,KACJ,EAAa,QACb,EAAe,QAAQ,YAAY,aAAa,MAAQ,EAAE,QAAU,OAAO,EAAE,CAAC,CAC9E,EACD,QACO,CACR,KAAK,OAAS,CAAC,EAAa,gBA4ChC,WAAmB,EAAyB,CAC1C,IAAM,EAAK,KAAK,GACV,EAAmB,EACtB,MAAM,CACN,MAAM,MAAM,CACZ,IAAK,GAAM,GAAG,IAAI,IAAK,CACvB,KAAK,IAAI,CAEZ,KAAK,IACF,GAAG,QAAQ,IAAM,KAAK,YAAY,CAClC,GAAG,OAAO,IAAM,KAAK,WAAW,CAChC,GAAG,mBAAmB,IAAM,KAAK,uBAAuB,CACxD,GAAG,iBAAiB,IAAM,KAAK,qBAAqB,CACpD,GAAG,EAAkB,KAAK,YAAY,GAO7C,SAAgB,GACd,EACA,EACA,EAC2C,CAC3C,IAAI,EAAkC,IAAI,GAAa,EAAK,EAAM,EAAQ,CAC1E,MAAO,CACL,GAAI,EAAO,EAAQ,gBAAgB,CACnC,YAAe,CACb,AAEE,KADA,EAAQ,SAAS,CACP,OAGf,CChPH,SAAgB,GACd,EACA,EACA,EACA,EACM,CACN,IAAI,EAAmC,KAEjC,EAAc,GAAwB,CAC1C,GAAI,CAAC,GAAU,EAAI,CAAE,CACnB,EAAgB,KAChB,GAAI,CACF,EAAQ,EAAI,CACZ,EAAM,WAAW,EAAa,QAAS,EAAI,EAAW,EAAI,OACnD,EAAG,CACV,EAAM,MAAM,EAAa,QAAS,EAAe,QAAQ,cAAc,EAAW,GAAK,CAAE,EAAE,CAE7F,OAGF,EAAgB,EAChB,EACG,KAAM,GAAa,CAEd,IAAkB,GACpB,MAAgB,CACd,GAAI,CACF,EAAQ,EAAS,CACjB,EAAM,WAAW,EAAa,QAAS,EAAI,GAAG,EAAU,UAAW,EAAS,OACrE,EAAG,CACV,EAAM,MAAM,EAAa,QAAS,EAAe,QAAQ,cAAc,EAAU,CAAE,EAAE,GAEvF,EAEJ,CACD,MAAO,GAAM,CACR,IAAkB,GACpB,EAAM,MAAM,EAAa,QAAS,EAAe,QAAQ,cAAc,EAAU,CAAE,EAAE,EAEvF,EAUA,EAAmB,GAAW,EAAO,CAGvC,GAFqB,OAAO,GAAW,WAGzC,EAAS,YACP,EACA,MACQ,CAGJ,IAAM,EAAQ,EACT,EAAwC,MACxC,GAAiC,CAEtC,MAAgB,EAAW,EAAM,CAAC,EAEpC,CAAE,KAAM,EAAW,CACpB,CACF,CAGD,MAAgB,EAAW,EAAyB,CAAC,CAQzD,SAAgB,GACd,EACA,EACA,EACA,EACM,CACN,IAAM,EAAO,OAAO,KAAK,EAAI,CACvB,EAAyB,EAAE,CAC3B,EAA2C,EAAE,CAC7C,EAA0B,EAAE,CAC5B,EAA+C,EAAE,CAEvD,IAAK,IAAI,EAAI,EAAG,EAAM,EAAK,OAAQ,EAAI,EAAK,IAAK,CAC/C,IAAM,EAAM,EAAK,GACX,EAAM,EAAI,GACV,EAAY,GAAW,EAAI,CAC7B,GAAa,OAAO,GAAQ,YAC9B,EAAa,KAAK,EAAI,CACtB,EAAgB,KAAK,EAAI,CACzB,EAAa,KAAK,EAAU,EAE5B,EAAa,GAAO,EAIxB,IAAI,EAAkB,EAEhB,EAAc,GAA+C,CACjE,IAAM,EAA+C,EAAE,CACjD,EAAiC,EAAE,CACnC,EAAM,EAAK,OAEjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAM,EAAK,GACX,EAAM,EAAW,GACnB,GAAU,EAAI,CAChB,EAAS,KAAK,EAAI,KAAM,IAAO,CAAE,MAAK,IAAK,EAAG,EAAE,CAAC,CAEjD,EAAY,GAAO,EAIvB,IAAM,EAAO,EAAS,OACtB,GAAI,EAAO,EAAG,CACZ,IAAM,EAAO,EAAE,EACf,QAAQ,IAAI,EAAS,CAAC,KAAM,GAAY,CACtC,GAAI,IAAS,EAAiB,CAC5B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,IAAK,CAC7B,IAAM,EAAM,EAAQ,GACpB,EAAY,EAAI,KAAO,EAAI,IAE7B,MAAgB,CACd,GAAI,CACF,EAAQ,EAAY,CACpB,EAAM,WAAW,EAAa,QAAS,EAAI,GAAG,EAAU,UAAW,EAAY,OACxE,EAAG,CACV,EAAM,MAAM,EAAa,QAAS,EAAe,QAAQ,cAAc,EAAU,CAAE,EAAE,GAEvF,GAEJ,KACG,CACL,IACA,GAAI,CACF,EAAQ,EAAY,CACpB,EAAM,WAAW,EAAa,QAAS,EAAI,EAAW,EAAY,OAC3D,EAAG,CACV,EAAM,MAAM,EAAa,QAAS,EAAe,QAAQ,cAAc,EAAW,GAAK,CAAE,EAAE,IAK7F,EAAa,OAAS,EACxB,EAAS,YACP,EACA,MACQ,CACJ,IAAM,EAA6C,CAAE,GAAG,EAAc,CACtE,IAAK,IAAI,EAAI,EAAG,EAAM,EAAa,OAAQ,EAAI,EAAK,IAAK,CACvD,IAAM,EAAS,EAAgB,GAC/B,EAAW,EAAa,IAAO,EAAa,GACvC,EAAwC,MACxC,GAAiC,CAExC,MAAgB,EAAW,EAAW,CAAC,EAEzC,CAAE,KAAM,EAAW,CACpB,CACF,CAED,MAAgB,EAAW,EAAa,CAAC,CCzM7C,IAAa,GAAY,IAAI,IAAI,CAC/B,OACA,MACA,SACA,aACA,aACA,OACA,SACA,aACA,OACA,WACA,UACA,SACA,UACA,WACD,CAAC,CAMW,GAAwB,mCAE/B,GAEJ,kMAGI,GAAuB,uDAGvB,GAAgB,oCAchB,GAA2B,kCAU3B,GAA2C,CAC/C,MAAO,IACP,IAAK,IACL,QAAS;EACV,CACK,GAAyB,yBAEzB,GAAe,kBAEf,GACJ,yLAEI,GACJ,8EAEI,GACJ,uIAEI,GAAiB,iBAGjB,GAA0B,IAAI,OAAO,GAAiB,OAAQ,MAAM,CAU1E,SAAS,GAAkB,EAAoB,CAC7C,IAAM,EAAM,EAAE,OACd,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAI,EAAE,WAAW,EAAE,CAEzB,GAAI,IAAM,IAAQ,IAAM,IAAS,GAAK,IAAQ,IAAM,GAAQ,IAAM,IAAQ,IAAM,GAC9E,MAAO,GAMX,GAAI,EAAE,QAAQ,IAAI,GAAK,GAAI,MAAO,GAElC,IAAM,EAAQ,EAAE,aAAa,CACvB,EAAQ,EAAM,QAAQ,KAAK,CACjC,GAAI,IAAU,IAAM,EAAQ,EAAM,EAAG,CACnC,IAAM,EAAW,EAAM,WAAW,EAAQ,EAAE,CAE5C,GAAI,GAAY,IAAM,GAAY,IAAK,MAAO,GAGhD,MAAO,GAOT,SAAgB,EAAa,EAAyC,CACpE,GAAI,CAAC,EAAM,MAAO,GAClB,IAAM,EAAQ,OAAO,EAAK,CAG1B,GAAI,CAAC,GAAkB,EAAM,CAAE,OAAO,EAEtC,IAAI,EAAI,EACL,QAAQ,GAAe,GAAG,CAC1B,QAAQ,IAA2B,EAAG,EAAK,IAC1C,OAAO,cAAc,EAAM,SAAS,EAAK,GAAG,CAAG,SAAS,EAAK,GAAG,CAAC,CAClE,CACA,QAAQ,IAAyB,EAAG,IAAS,GAAiB,IAAS,GAAG,CAE7E,GAAI,EAAE,QAAQ,IAAI,GAAK,GAAI,CACzB,EAAI,EAAE,QAAQ,GAAc,GAAG,CAC/B,IAAI,EACJ,EACE,GAAO,EACP,EAAI,EAAE,QAAQ,GAAkB,GAAG,OAC5B,IAAM,GAGjB,OAAO,EACJ,QAAQ,GAA8B,wBAAwB,CAC9D,QAAQ,GAAuB,wBAAwB,CACvD,QAAQ,GAAgB,oBAAoB,CAC5C,QAAQ,GAAyB,mBAAmB,CAWzD,IAAa,GAAuB,GAC9B,EAAI,OAAS,GAAW,GACrB,EAAI,aAAa,CAAC,SAAS,OAAO,EAAI,GAAqB,KAAK,EAAI,CChJvE,GAAa,IAAI,IACvB,SAAS,GAAa,EAAsB,CAC1C,IAAI,EAAS,GAAW,IAAI,EAAK,CAKjC,OAJI,IAAW,IAAA,IAEf,EAAS,EAAK,SAAS,IAAI,CAAG,EAAK,QAAQ,MAAQ,GAAM,EAAE,GAAI,aAAa,CAAC,CAAG,EAChF,GAAW,IAAI,EAAM,EAAO,CACrB,GAJ0B,EAYnC,IAAM,GAAoB,IAAI,QAK9B,SAAS,GACP,EACwC,CACxC,IAAI,EAAS,GAAkB,IAAI,EAAO,CAW1C,OAVK,IACH,EAAS,OAAe,CACtB,IAAM,EAAM,EAAO,MAInB,OAHI,GAAU,EAAI,CACT,EAAI,KAAM,GAAc,EAAa,EAAE,CAAC,CAE1C,EAAa,EAAI,EACxB,CACF,GAAkB,IAAI,EAAQ,EAAO,EAEhC,EAOT,SAAgB,GAAc,EAAiC,CAC7D,MAAO,CACL,KACA,aAAe,GAAO,EAAS,aAAa,EAAI,EAAG,CACpD,CAUH,SAAgB,GACd,CAAE,MACF,EACA,EACM,CACN,GACE,EACA,EACC,GAAQ,CACP,IAAM,EAAO,EAAY,EAAU,EAAI,CAAG,OAAO,GAAO,GAAG,CACvD,EAAG,cAAgB,IAAM,EAAG,YAAc,IAEhD,OACD,CAMH,SAAgB,GAAS,CAAE,MAAsB,EAAyC,CACxF,IAAM,EAAS,GAAO,EAAM,CACxB,GAAiB,EAAgD,CACjE,EAEJ,GACE,EACA,EACC,GAAQ,CACP,IAAM,EAAO,IAAW,EAAQ,EAAa,EAAI,CAAG,EAChD,EAAG,YAAc,IACnB,EAAS,mBAAmB,EAAG,CAC/B,EAAG,UAAY,IAGnB,OACD,CAMH,SAAgB,GACd,CAAE,MACF,EACM,CACN,IAAM,EAAqC,EAAE,CAC7C,IAAK,IAAM,KAAK,EACd,GAAI,EAAO,KAAK,EAAU,EAAE,CAAE,CAC5B,IAAM,EAAU,EAAE,MAAM,CAExB,EAAS,GAAK,EAAQ,QAAQ,IAAI,GAAK,GAAK,CAAC,EAAQ,CAAG,EAAQ,MAAM,MAAM,CAAC,OAAO,QAAQ,CAIhG,GACE,EACA,EACC,GAAW,CACV,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAS,EAAS,GACpB,EAAO,GACT,EAAG,UAAU,IAAI,GAAG,EAAO,CAE3B,EAAG,UAAU,OAAO,GAAG,EAAO,GAIpC,QACD,CAMH,SAAgB,GAAQ,CAAE,MAAsB,EAAwC,CACtF,IAAM,EAAQ,EAAG,MACX,EAAsD,EAAE,CACxD,EAAwD,EAAE,CAEhE,IAAK,IAAM,KAAK,EACd,GAAI,EAAO,KAAK,EAAQ,EAAE,CAAE,CAC1B,IAAM,EAAM,EAAO,GACb,CAAC,EAAK,GAAQ,MAAM,QAAQ,EAAI,CAAG,EAAO,CAAC,EAAK,GAAG,CACzD,EAAY,GAAK,EACjB,EAAK,GAAK,CAAE,MAAO,GAAa,EAAE,CAAE,OAAM,CAI9C,GACE,EACA,EACC,GAAW,CACV,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAI,EAAK,GACT,EAAM,EAAO,GACb,EAAM,EAAE,KAAO,GAAG,IAAM,EAAE,OAAS,OAAO,EAAI,CAC9C,EAAQ,EAAE,MACZ,CAAC,GAAoB,EAAI,EAAI,EAAM,KAAW,IAChD,EAAM,GAAS,KAIrB,MACD,CAMH,SAAgB,GACd,CAAE,MACF,EACM,CACN,IAAM,EAA8D,EAAE,CAChE,EAA+D,EAAE,CACjE,EAAuC,EAAE,CAE/C,IAAK,IAAM,KAAQ,EAAS,CAC1B,GAAI,CAAC,EAAO,KAAK,EAAS,EAAK,CAAE,SACjC,IAAM,EAAQ,EAAK,aAAa,CAChC,GAAI,EAAM,WAAW,KAAK,CAAE,CAC1B,QAAQ,KACN,GAAG,EAAa,QAAQ,GAAG,EAAe,SAAS,sBAAsB,EAAK,GAC/E,CACD,SAEF,EAAQ,GAAQ,EAAQ,GACxB,EAAQ,GAAQ,CAAE,OAAQ,EAAM,WAAW,QAAQ,CAAE,MAAO,GAAU,IAAI,EAAM,CAAE,CAClF,EAAM,GAAQ,EAAG,aAAa,EAAK,CAGrC,GACE,EACA,EACC,GAAW,CACV,IAAK,IAAM,KAAQ,EAAQ,CACzB,IAAM,EAAI,EAAQ,GACZ,EAAM,EAAO,GAEnB,GAAI,GAAO,MAAS,IAAQ,IAAS,CAAC,EAAE,OAAS,CAC3C,EAAM,KAAU,MAAM,EAAG,gBAAgB,EAAK,CAClD,EAAM,GAAQ,KACd,SAGF,IAAM,EAAS,IAAQ,GAAQ,EAAE,OAAS,OAAS,EAAQ,OAAO,EAAI,CACtE,GAAI,EAAE,OAAS,GAAsB,KAAK,EAAO,CAAE,CACjD,QAAQ,KAAK,GAAG,EAAa,QAAQ,GAAG,EAAe,SAAS,iBAAiB,EAAK,GAAG,CACzF,SAGE,EAAM,KAAU,IAClB,EAAG,aAAa,EAAM,EAAO,CAC7B,EAAM,GAAQ,KAIpB,OACD,CAMH,SAAgB,GACd,EACA,EACM,CACN,IAAM,EAAK,EAAI,GACT,EAAuD,EAAE,CACzD,EAA8C,EAAE,CAEtD,IAAK,IAAM,KAAQ,EAAS,CAC1B,GAAI,CAAC,EAAO,KAAK,EAAS,EAAK,CAAE,SACjC,IAAM,EAAQ,EAAK,aAAa,CAChC,GAAI,EAAM,WAAW,KAAK,EAAI,GAAgB,IAAI,EAAK,CAAE,CACvD,QAAQ,KACN,GAAG,EAAa,QAAQ,GACtB,EAAM,WAAW,KAAK,CAClB,EAAe,SAAS,sBAAsB,EAAK,CACnD,EAAe,SAAS,aAAa,EAAK,GAEjD,CACD,SAEF,EAAQ,GAAQ,EAAQ,GACxB,EAAQ,GAAQ,CAAE,MAAO,GAAU,IAAI,EAAM,CAAE,CAGjD,GACE,EAAI,GACJ,EACC,GAAW,CACV,IAAK,IAAM,KAAQ,EAAQ,CACzB,IAAM,EAAM,EAAO,GACnB,GAAI,EAAQ,GAAO,OAAS,OAAO,GAAQ,UAAY,GAAsB,KAAK,EAAI,CAAE,CACtF,QAAQ,KAAK,GAAG,EAAa,QAAQ,GAAG,EAAe,SAAS,iBAAiB,EAAK,GAAG,CACzF,SAEE,EAAG,KAAU,IACf,EAAG,GAAQ,KAIjB,OACD,CAMH,SAAgB,GACd,CAAE,MACF,EACA,EACM,CACN,IAAM,EAAO,EAAG,MAAM,UAAY,OAAS,GAAK,EAAG,MAAM,QACzD,GACE,EACA,EACC,GAAQ,CACP,IAAM,EAAS,IAAW,CAAC,CAAC,EAAa,OAAP,EAC9B,EAAG,MAAM,UAAY,IAAQ,EAAG,MAAM,QAAU,IAEtD,EAAS,OAAS,OACnB,CAMH,SAAgB,EACd,EACA,EACA,EAA+B,EAAE,CAC3B,CACN,IAAM,EAAM,EAAI,GAAG,QAAQ,aAAa,CACxC,GAAI,CAAC,GAAiB,IAAI,EAAI,CAAE,CAC9B,QAAQ,KAAK,GAAG,EAAa,QAAQ,GAAG,EAAe,QAAQ,sBAAsB,EAAI,GAAG,CAC5F,OAEF,GAAM,CAAE,KAAI,WAAY,IAAA,EAAA,EAAA,SAAoB,EAAI,GAAG,CAAE,EAAM,EAAQ,CACnE,EAAS,YAAY,EAAI,GAAI,EAAG,CAChC,EAAI,aAAa,EAAQ,CAM3B,SAAgB,GAAY,EAAqB,EAAmC,CAClF,IAAM,EAAK,EAAI,GACT,GAAA,EAAA,EAAA,SAAQ,EAAG,CAEX,MAAgB,CAChB,EAAK,MAAM,GAAK,EAAG,UACrB,EAAK,MAAQ,EAAG,QACZ,EAAG,OAAS,SAAW,EAAG,SAAW,EAAG,OACzC,EAAG,MAAA,EAAA,EAAA,SAAS,EAAG,KAAK,EAAA,EAAA,EAAA,SAAK,SAAS,EAChC,KAAK,6BAA6B,EAAG,KAAK,QAAQ,KAAM,MAAM,CAAC,IAAI,CACnE,IAAI,EAAG,CACP,QAAQ,uBAAuB,GAIvC,EAA+C,IAAoB,GAEpE,EAAI,GAAG,8BAA+B,EAAQ,CAC9C,EAAI,iBAAmB,EAAI,IAAI,8BAA+B,EAAQ,CAAC,CAEvE,EAAS,YACP,EACA,MAAa,CACX,IAAM,EAAM,CAAC,CAAC,EAAK,MACnB,MAAgB,CACV,EAAG,UAAY,IACjB,EAAG,QAAU,EACb,EAAM,WAAW,EAAa,QAAS,EAAI,UAAW,EAAI,GAE5D,EACF,CACH,CAOH,SAAgB,GAAW,EAAqB,EAAmD,CACjG,IAAM,GAAA,EAAA,EAAA,SAAQ,EAAI,GAAG,CACrB,EAAI,GAAG,EAAS,CAChB,EAAI,iBAAmB,EAAI,IAAI,EAAS,CAAC,CAM3C,SAAgB,GACd,CAAE,KAAI,gBACN,EACA,EACM,CACN,IAAM,GAAA,EAAA,EAAA,SAAQ,EAAG,CACjB,EAAI,GAAG,EAAO,EAAQ,CACtB,MAAmB,EAAI,IAAI,EAAO,EAAQ,CAAC,CAM7C,SAAgB,GAAW,EAAuB,CAChD,EAAS,YAAY,EAAG,CC1X1B,SAAgB,GACd,EACA,EACA,EAA+B,EAAE,CAC3B,CAEN,IAAM,EAAa,IAAI,IACjB,EAA6D,EAAE,CAK/D,EAAiB,MAAa,CAClC,IAAM,EAAY,EAAK,MACjB,EAAM,EAAO,OACf,IAAQ,GAEZ,MAAgB,CACd,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAO,EAAO,GACd,EAAW,EAAa,EAAW,EAAK,MAAM,CAE/C,OAAO,GAAG,EAAK,KAAK,MAAM,CAAE,EAAS,GACxC,EAAK,KAAK,MAAQ,KAGtB,EACF,CAGF,EAAS,YAAY,EAAM,EAAe,CAE1C,IAAM,EAAkB,GAAwC,CAC9D,IAAI,EAAY,EAAW,IAAI,EAAK,CACpC,GAAI,CAAC,EAAW,CACd,IAAM,EAAQ,EAAK,SAAS,IAAI,CAAG,EAAK,MAAM,IAAI,CAAG,CAAC,EAAK,CAG3D,EAAY,EAAW,EAAa,EAAK,MAAM,CAAE,EAAM,CAAC,CACxD,EAAO,KAAK,CAAE,KAAM,EAAW,QAAO,CAAC,CAGvC,EAAS,YACP,EACA,MAAa,CACX,IAAM,EAAW,EAAW,MACtB,EAAc,EAAK,MAAM,CACzB,EAAW,GAAa,EAAa,EAAO,EAAG,EAAS,CAE1D,IAAa,IACf,EAAK,MAAQ,IAEf,CACH,CAED,EAAW,IAAI,EAAM,EAAU,CAEjC,OAAO,GAGH,EAAe,GAAgB,CACnC,GACE,EACE,aAAc,kBACd,aAAc,qBACd,aAAc,mBAGhB,OAEF,IAAM,EAAO,EAAG,KAChB,GAAI,CAAC,GAAQ,EAAS,QAAQ,EAAG,CAAE,OAEnC,IAAM,EAAY,EAAe,EAAK,CAChC,EAAa,GAAc,EAAkB,CAE/C,aAAc,mBAAqB,EAAG,OAAS,YAAc,EAAG,OAAS,SAC3E,GAAY,EAAY,EAAmC,CAE3D,EAAQ,EAAY,EAAW,EAAQ,EAI3C,IAAK,IAAI,EAAI,EAAG,EAAM,EAAK,SAAS,OAAQ,EAAI,EAAK,IACnD,EAAY,EAAK,SAAS,GAAI,CAGhC,IAAM,EAAW,IAAI,iBAAkB,GAAc,CACnD,IAAK,IAAI,EAAI,EAAG,EAAO,EAAU,OAAQ,EAAI,EAAM,IAAK,CACtD,IAAM,EAAW,EAAU,GAC3B,GAAI,EAAS,OAAS,YACpB,IAAK,IAAI,EAAI,EAAG,EAAO,EAAS,WAAW,OAAQ,EAAI,EAAM,IAAK,CAChE,IAAM,EAAO,EAAS,WAAW,GACjC,GAAI,EAAK,WAAa,EAAG,CACvB,IAAM,EAAK,EACX,EAAY,EAAG,CAEf,IAAM,EAAW,EAAG,UAAU,0BAA0B,CACpD,CAAC,EAAG,CACJ,EAAG,iBAAiB,0BAA0B,CAClD,IAAK,IAAI,EAAI,EAAG,EAAO,EAAS,OAAQ,EAAI,EAAM,IAChD,EAAY,EAAS,GAAI,OAItB,EAAS,OAAS,cAAgB,EAAS,gBAAkB,QACtE,EAAY,EAAS,OAAkB,GAG3C,CAEF,EAAS,QAAQ,EAAM,CACrB,UAAW,GACX,QAAS,GACT,WAAY,GACZ,gBAAiB,CAAC,OAAO,CAC1B,CAAC,CAEF,EAAS,aAAa,MAAY,EAAS,YAAY,CAAC,CCzG1D,SAAS,EAAgB,EAAY,EAA4D,CAC/F,IAAM,EAAM,EAAG,OACf,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAO,EAAG,GAChB,GAAI,GAAM,WAAa,EAAG,CACxB,IAAM,EAAK,EACX,EAAG,GAAc,EAAG,CAAE,EAAG,MAChB,GACT,EAAM,IAAI,EAAa,QAAS,uCAAuC,EAAK,SAAS,GAAG,CAG5F,OAAO,EAMT,EAAA,QAAE,GAAG,SAAW,SAAa,EAA+B,EAAsC,CAChG,OAAO,EAAgB,KAAO,GAAQ,GAAS,EAAK,EAAQ,EAAU,CAAC,EAMzE,EAAA,QAAE,GAAG,SAAW,SAAU,EAA4C,CACpE,OAAO,EAAgB,KAAO,GAAQ,GAAS,EAAK,EAAO,CAAC,EAM9D,EAAA,QAAE,GAAG,UAAY,SAEf,EACA,EACQ,CACR,GAAI,OAAO,GAAmB,SAAU,CACtC,GAAI,IAAc,IAAA,GAIhB,OAHA,QAAQ,KACN,GAAG,EAAa,QAAQ,GAAG,EAAe,QAAQ,kBAAkB,YAAY,GACjF,CACM,KAGT,IAAM,EAAM,EAAG,GAAiB,EAAW,CAC3C,OAAO,EAAgB,KAAO,GAAQ,GAAU,EAAK,EAAI,CAAC,CAE5D,OAAO,EAAgB,KAAO,GAAQ,GAAU,EAAK,EAAe,CAAC,EAMvE,EAAA,QAAE,GAAG,QAAU,SAEb,EACA,EACA,EACQ,CACR,GAAI,OAAO,GAAc,SAAU,CACjC,GAAI,IAAW,IAAA,GAEb,OADA,QAAQ,KAAK,GAAG,EAAa,QAAQ,GAAG,EAAe,QAAQ,eAAe,UAAU,GAAG,CACpF,KAGT,IAAM,EAAM,EAAG,GAAY,EAAO,CAAC,EAAiC,EAAK,CAAG,EAAS,CACrF,OAAO,EAAgB,KAAO,GAAQ,GAAQ,EAAK,EAAmB,CAAC,CAEzE,OAAO,EAAgB,KAAO,GAAQ,GAAQ,EAAK,EAAU,CAAC,EAMhE,EAAA,QAAE,GAAG,SAAW,SAEd,EACA,EACQ,CACR,GAAI,OAAO,GAAc,SAAU,CACjC,GAAI,IAAW,IAAA,GAEb,OADA,QAAQ,KAAK,GAAG,EAAa,QAAQ,GAAG,EAAe,QAAQ,eAAe,WAAW,GAAG,CACrF,KAGT,IAAM,EAAM,EAAG,GAAY,EAAQ,CACnC,OAAO,EAAgB,KAAO,GAAQ,GAAS,EAAK,EAAI,CAAC,CAE3D,OAAO,EAAgB,KAAO,GAAQ,GAAS,EAAK,EAAU,CAAC,EAMjE,EAAA,QAAE,GAAG,SAAW,SAEd,EACA,EACQ,CACR,GAAI,OAAO,GAAc,SAAU,CACjC,GAAI,IAAW,IAAA,GAEb,OADA,QAAQ,KAAK,GAAG,EAAa,QAAQ,GAAG,EAAe,QAAQ,eAAe,WAAW,GAAG,CACrF,KAGT,IAAM,EAAM,EAAG,GAAY,EAAQ,CACnC,OAAO,EAAgB,KAAO,GAAQ,GAAS,EAAK,EAAI,CAAC,CAE3D,OAAO,EAAgB,KAAO,GAC5B,GAAS,EAAK,EAAyD,CACxE,EAMH,EAAA,QAAE,GAAG,SAAW,SAAU,EAAgD,CACxE,OAAO,EAAgB,KAAO,GAAQ,GAAe,EAAK,EAAW,GAAM,CAAC,EAM9E,EAAA,QAAE,GAAG,SAAW,SAAU,EAAgD,CACxE,OAAO,EAAgB,KAAO,GAAQ,GAAe,EAAK,EAAW,GAAK,CAAC,EAM7E,EAAA,QAAE,GAAG,QAAU,SAAa,EAAuB,EAAyB,EAAE,CAAU,CACtF,OAAO,EAAgB,KAAO,GAC5B,EAAQ,EAAK,EAA+B,EAA0C,CACvF,EAMH,EAAA,QAAE,GAAG,YAAc,SAAU,EAAqC,CAChE,OAAO,EAAgB,KAAO,GAAQ,GAAY,EAAK,EAAK,CAAC,EAM/D,EAAA,QAAE,GAAG,SAAW,SACd,EACA,EAA+B,EAAE,CACzB,CACR,OAAO,EAAgB,MAAO,EAAG,IAAO,CAClC,aAAc,iBAAiB,GAAS,EAAI,EAAM,EAAQ,EAC9D,EAMJ,EAAA,QAAE,GAAG,OAAS,SAAU,EAAe,EAA4C,CACjF,OAAO,EAAgB,KAAO,GAAQ,GAAO,EAAK,EAAO,EAAQ,CAAC,EAOpE,IAAM,GAAwF,EAC3F,EAAK,IAAM,GAAS,EAAK,EAAE,KAAK,EAChC,EAAK,IAAM,GAAS,EAAK,EAAE,KAAM,EACjC,EAAK,IAAM,GAAU,EAAK,EAAE,MAAO,EACnC,EAAK,IAAM,GAAQ,EAAK,EAAE,IAAK,EAC/B,EAAK,IAAM,GAAS,EAAK,EAAE,KAAM,EACjC,EAAK,IAAM,GAAS,EAAK,EAAE,KAAoD,EAC/E,EAAK,IAAM,GAAe,EAAK,EAAE,KAAO,GAAM,EAC9C,EAAK,IAAM,GAAe,EAAK,EAAE,KAAO,GAAK,EAC7C,EAAK,IAAM,CAEV,IAAM,EAAI,EAAE,IACR,MAAM,QAAQ,EAAE,CAClB,EAAQ,EAAK,EAAE,GAA6B,EAAE,GAA0B,CAExE,EAAQ,EAAK,EAA2B,GAG3C,EAAK,IAAM,GAAY,EAAK,EAAE,QAAS,EACvC,EAAK,IAAM,CAEN,EAAI,cAAc,iBACpB,GAAS,EAAI,GAAI,EAAE,KAA6B,GAGnD,EAAK,IAAM,GAAW,EAAK,EAAE,GAAI,CACnC,CAMD,EAAA,QAAE,GAAG,SAAW,SAA2B,EAAoC,CAC7E,IAAI,EAAO,EAgBX,OAfI,EAAQ,OAAS,IAAA,KAAW,GAAQ,GACpC,EAAQ,OAAS,IAAA,KAAW,GAAQ,GACpC,EAAQ,QAAU,IAAA,KAAW,GAAQ,GACrC,EAAQ,MAAQ,IAAA,KAAW,GAAQ,GACnC,EAAQ,OAAS,IAAA,KAAW,GAAQ,IACpC,EAAQ,OAAS,IAAA,KAAW,GAAQ,IACpC,EAAQ,OAAS,IAAA,KAAW,GAAQ,IACpC,EAAQ,OAAS,IAAA,KAAW,GAAQ,KACpC,EAAQ,MAAQ,IAAA,KAAW,GAAQ,KACnC,EAAQ,UAAY,IAAA,KAAW,GAAQ,KACvC,EAAQ,OAAS,IAAA,KAAW,GAAQ,MACpC,EAAQ,KAAO,IAAA,KAAW,GAAQ,MAElC,IAAS,EAAU,KAEhB,EAAgB,KAAO,GAAQ,CACpC,IAAI,EAAI,EACR,KAAO,EAAI,GAAG,CACZ,IAAM,EAAM,EAAI,CAAC,EAEjB,GADY,GAAK,KAAK,MAAM,EAAI,EACZ,EAAK,EAAmC,CAC5D,GAAK,IAEP,EAMJ,EAAA,QAAE,GAAG,WAAa,UAAgC,CAChD,IAAM,EAAM,KAAK,OACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAO,KAAK,GACd,GAAM,WAAa,GACrB,GAAW,EAAoB,CAGnC,OAAO,MCjQT,IAAM,GAAgB,IAAI,QACtB,GAAqB,EAEnB,GAAU,IAAI,OACZ,IAAI,IACT,GAAM,EAAE,OAAO,CACjB,CACK,GAAU,IAAI,OACZ,IAAI,IACT,GAAM,EAAE,OAAO,CACjB,CACK,EAAY,IAAI,GAAmB,IAAK,KAAK,CAEnD,SAAS,GAAe,EAA0B,EAAuB,EAA0B,CAEjG,GAAI,aAAkB,QAAS,CAC7B,EAAU,aAAa,EAAQ,EAAS,CACxC,OAEF,IAAM,EAAM,EAAO,OACnB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAK,EAAO,GACd,GACF,EAAU,aAAa,EAAI,EAAS,EAK1C,SAAS,EAAK,EAAwC,CACpD,OAAQ,aAAe,SAAA,EAAA,EAAA,SAAY,EAAI,CAAG,EAO5C,IAAM,GAAN,KAAqB,CAanB,YACE,EAEA,EACA,EACA,CAJgB,KAAA,WAAA,EAEA,KAAA,kBAAA,EACA,KAAA,SAAA,eAhBG,EAAE,eACP,EAAE,eACe,EAAE,mBAEX,IAAI,kBACF,qBACJ,IAAI,sBAGX,IAAI,WAAW,IAAI,oBAClB,IAAI,WAAW,IAAI,CASnC,gBAAgB,EAAY,EAAmB,CAC7C,IAAM,MAAe,CACf,KAAK,IAAI,aACT,EAAI,IAAI,aAAa,EAAI,QAAQ,CACrC,KAAK,aAAa,OAAO,EAAE,CAC3B,EAAM,IAAI,EAAa,KAAM,GAAG,KAAK,kBAAkB,gBAAiB,EAAE,GAGtE,EAAM,KAAK,WAAW,EAAI,CAC5B,aAAe,QAAS,EAAI,KAAK,EAAQ,EAAO,CAC/C,GAAQ,CAGf,WAAW,EAAY,EAAmB,CACxC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAI,OAAQ,IAC1B,EAAI,aAAc,SAAU,EAAI,GAAe,gBAAgB,gBAAgB,CAErF,KAAK,aAAa,IAAI,EAAE,CACxB,KAAK,gBAAgB,EAAG,EAAI,CAG9B,SAAgB,CACd,KAAK,aAAa,OAAO,CACzB,KAAK,QAAQ,OAAS,EACtB,KAAK,SAAS,OAAS,EACvB,KAAK,SAAS,OAAS,EACvB,KAAK,WAAW,OAAO,CACvB,KAAK,UAAU,QAAQ,CACvB,KAAK,WAAW,IAAI,YAAY,CAChC,KAAK,aAAe,IAAI,WACxB,KAAK,cAAgB,IAAI,WAG3B,cAAc,EAAoB,CAC5B,KAAK,aAAa,OAAS,IAC7B,KAAK,aAAe,IAAI,WAAW,KAAK,IAAI,EAAM,KAAK,aAAa,OAAS,EAAE,CAAC,EAE9E,KAAK,cAAc,OAAS,IAC9B,KAAK,cAAgB,IAAI,WAAW,KAAK,IAAI,EAAM,KAAK,cAAc,OAAS,EAAE,CAAC,IAoCxF,SAAS,GACP,EACA,EACA,EACA,EACM,CAKN,GAJI,EAAI,UAAY,EAAY,IAC9B,EAAI,SAAS,QAAQ,CACrB,EAAI,SAAW,MAEb,IAAc,EAAG,OAErB,GAAM,CAAE,UAAS,WAAU,YAAa,EACxC,GAAK,EAIH,IAAK,IAAI,EAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,CAClD,IAAM,EAAI,EAAQ,GACd,EAAS,IAAI,EAAI,WAAW,EAAG,EAAK,EAAS,GAAI,CAAC,KAN3C,CACb,IAAK,IAAI,EAAI,EAAG,EAAM,EAAQ,OAAQ,EAAI,EAAK,IAAK,EAAI,aAAa,OAAO,EAAQ,GAAI,CACxF,EAAW,OAAO,CAQhB,GAAS,CAAC,EAAI,WAChB,EAAI,SAAY,OAAO,GAAU,UAAA,EAAA,EAAA,SAC3B,EAAa,EAAM,CAAC,EAAA,EAAA,EAAA,SACpB,EAA0B,CAChC,EAAI,SAAS,SAAS,EAAW,EAGnC,EAAU,QAAQ,EAAI,QAAQ,CAC9B,EAAU,QAAQ,EAAI,SAAS,CAC/B,EAAU,QAAQ,EAAI,SAAS,CAC/B,EAAI,QAAU,EAAE,CAChB,EAAI,SAAW,EAAE,CACjB,EAAI,SAAW,EAAE,CAGnB,SAAS,GACP,EACA,EACA,EACA,EACA,EACA,EACiB,CACjB,GAAM,CAAE,UAAS,WAAU,WAAU,eAAc,cAAe,EAC5D,EAAS,EAAQ,OAEnB,EAAa,EACf,EAAc,EAAS,EACvB,EAAc,EAAY,EAEtB,EAAK,GAAW,GAEtB,KAAO,GAAc,GAAe,GAAc,GAAa,CAC7D,IAAM,EAAO,EAAM,GACb,EAAI,EAAO,EAAM,EAAW,CAClC,GAAI,EAAQ,KAAgB,GAAK,CAAC,EAAG,EAAS,GAAc,EAAK,CAC/D,MAEF,EAAW,IAAI,EAAG,IAAa,CAGjC,KAAO,GAAe,GAAc,GAAe,GAAY,CAC7D,IAAM,EAAO,EAAM,GACb,EAAI,EAAO,EAAM,EAAY,CACnC,GAAI,EAAQ,KAAiB,GAAK,CAAC,EAAG,EAAS,GAAe,EAAK,CACjE,MAEF,EAAW,IAAI,EAAG,IAAc,CAChC,IAGF,IAAM,EAAc,GAAQ,SAAS,CACrC,IAAK,IAAI,EAAI,EAAY,GAAK,EAAa,IAAK,EAAY,IAAI,EAAQ,GAAK,EAAE,CAE/E,IAAM,EAAY,GAAQ,SAAS,CACnC,EAAI,cAAc,EAAU,CAE5B,IAAM,EAAU,EAAU,SAAS,CACnC,EAAQ,OAAS,EACjB,IAAM,EAAW,EAAU,SAAS,CACpC,EAAS,OAAS,EAClB,IAAM,EAAW,EAAU,SAAS,CACpC,EAAS,OAAS,EAClB,IAAM,EAAY,EAAI,aACpB,EAAa,EAAI,cAEb,EAAS,EAAU,SAAS,CAChC,EAAU,EAAU,SAAS,CAC7B,EAAS,EAAU,SAAS,CAE9B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,IAC9B,EAAQ,GAAK,EAAQ,GACrB,EAAS,GAAK,EAAM,GACpB,EAAS,GAAK,EAAS,GACvB,EAAU,GAAK,EACf,EAAW,GAAK,EAElB,IAAK,IAAI,EAAI,EAAS,EAAG,EAAI,EAAY,EAAG,EAAI,EAAa,IAAK,IAChE,EAAQ,GAAK,EAAQ,GACrB,EAAS,GAAK,EAAM,GACpB,EAAS,GAAK,EAAS,GACvB,EAAU,GAAK,EACf,EAAW,GAAK,EAGlB,IAAK,IAAI,EAAI,EAAY,GAAK,EAAa,IAAK,CAC9C,IAAM,EAAO,EAAM,GACjB,EAAI,EAAO,EAAM,EAAE,CAKrB,GAJA,EAAQ,GAAK,EACb,EAAS,GAAK,EACd,EAAW,IAAI,EAAG,EAAE,CAEhB,EAAU,IAAI,EAAE,CAAE,CACpB,EAAM,KAAK,EAAa,KAAM,EAAe,KAAK,cAAc,EAAG,EAAG,EAAI,kBAAkB,CAAC,CAC7F,EAAW,GAAK,GAChB,SAEF,EAAU,IAAI,EAAE,CAEhB,IAAM,EAAS,EAAY,IAAI,EAAE,CACjC,GAAI,IAAW,IAAA,GAAW,CACxB,EAAO,KAAK,EAAE,CACd,EAAQ,KAAK,EAAK,CAClB,EAAO,KAAK,EAAE,CACd,EAAW,GAAK,GAChB,EAAU,GAAK,EACf,SAGF,IAAM,EAAU,EAAS,GACzB,EAAS,GAAK,EAAS,GAGrB,CAAC,GACD,IAAY,GACZ,EAAE,EAAU,EAAQ,EAAS,EAAK,CAAG,GAAa,EAAS,EAAK,GAEhE,EAAO,KAAK,EAAE,CACd,EAAQ,KAAK,EAAK,CAClB,EAAO,KAAK,EAAE,CACd,EAAU,GAAK,GAEf,EAAU,GAAK,EAEjB,EAAW,GAAK,EAAa,IAAI,EAAE,CAAG,GAAK,EAI7C,OADA,GAAQ,QAAQ,EAAY,CACrB,CACL,UACA,YACA,WACA,WACA,YACA,aACA,SACA,UACA,SACA,aACA,cACA,cACD,CAGH,SAAS,GACP,EACA,EACA,EACiB,CACjB,GAAM,CAAE,SAAQ,UAAS,SAAQ,WAAU,aAAc,EACnD,EAAc,EAAO,OACrB,EAAsE,MAAM,EAAY,CACxF,EAAsB,EAAE,CAC1B,EAAc,EAElB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,IAAK,CACpC,IAAM,EAAM,EAAQ,OAAO,EAAQ,GAAK,EAAO,GAAI,CACnD,EAAc,GAAK,EACf,OAAO,GAAQ,WACjB,EAAU,KAAK,EAAI,CACnB,KAIJ,IAAI,EAA6B,KACjC,GAAI,EAAU,OAAS,EACrB,GAAI,EAAU,SAAW,EAAG,EAAY,CAAC,EAAa,EAAU,GAAI,CAAC,KAChE,CACH,IAAM,EAAM,6BAA6B,MAAsB,SAAS,GAAG,CAAC,eAC5E,EAAY,EAAa,EAAU,KAAK,EAAI,CAAC,CAAC,MAAM,EAAI,CAI5D,GACE,GACA,GACA,IAAgB,GAChB,CAAC,EAAQ,MACT,CAAC,EAAQ,OACT,CAAC,EAAQ,UACT,CAAC,EAAQ,OAET,OAAO,EAGT,IAAI,EAAU,EACd,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,IAAK,CACpC,IAAM,EAAM,EAAc,GACpB,EAAO,OAAO,GAAQ,UAAA,EAAA,EAAA,SACtB,EAAW,KAAY,EAAA,EAAA,EAAA,SACvB,EAA2C,CAC3C,EAAY,EAAO,GACvB,EAAS,OAAO,EAAO,GAAI,CAE7B,IAAK,IAAI,EAAI,EAAG,EAAQ,EAAI,OAAQ,EAAI,EAAO,IAAK,CAClD,IAAM,EAAO,EAAI,GACb,aAAgB,SAClB,EAAK,aAAa,gBAAiB,EAAO,CAI9C,GAAI,EAAU,KAAe,GAAK,EAAS,GAAY,CACrD,IAAM,EAAO,EAAS,GACtB,GAAI,aAAgB,QAClB,EAAS,YAAY,EAAK,MAE1B,IAAK,IAAI,EAAI,EAAG,EAAO,EAAK,OAAQ,EAAI,EAAM,IAAK,CACjD,IAAM,EAAK,EAAK,GACZ,aAAc,SAAS,EAAS,YAAY,EAAG,CAGvD,EAAK,EAAK,CAAC,YAAY,EAAI,CAE7B,EAAS,GAAa,EAAI,SAAW,EAAK,EAAI,GAAiB,EAEjE,OAAO,KAGT,SAAS,GAAkB,EAAqB,EAA6B,CAC3E,GAAM,CAAE,aAAY,cAAa,aAAc,EAC/C,IAAK,IAAI,EAAI,EAAY,GAAK,EAAa,IAAK,CAC9C,IAAM,EAAI,EAAI,QAAQ,GAClB,CAAC,EAAU,IAAI,EAAE,EAAI,EAAI,SAAS,IAAI,EAAI,WAAW,EAAG,EAAK,EAAI,SAAS,GAAI,CAAC,EAIvF,SAAS,GACP,EACA,EACA,EACA,EACA,EACM,CACN,GAAM,CAAE,UAAS,WAAU,WAAU,YAAW,cAAe,EACzD,EAAY,EAAQ,OAE1B,GAAI,IAAuB,KAAM,CAC/B,EAAa,UAAY,EAAmB,KAAK,GAAG,CACpD,IAAI,EAAK,EAAa,kBACtB,IAAK,IAAI,EAAI,EAAG,EAAI,GACb,EADwB,IAE7B,EAAG,aAAa,gBAAiB,OAAO,EAAQ,GAAG,CAAC,CACpD,EAAS,GAAK,EACd,EAAU,GAAK,EACf,EAAI,aAAa,OAAO,EAAQ,GAAI,CACpC,EAAM,WAAW,EAAa,MAAA,EAAA,EAAA,SAAQ,EAAG,CAAuB,WAAY,EAAS,GAAG,CACxF,EAAK,EAAG,mBAEV,OAGF,GAAI,EAAI,QAAQ,SAAW,EAAG,CAC5B,IAAM,EAAO,SAAS,wBAAwB,CAC9C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,IAAK,CAClC,IAAM,EAAO,EAAS,GACtB,GAAI,aAAgB,QAAS,EAAK,YAAY,EAAK,MAC9C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,OAAQ,IAAK,EAAK,YAAY,EAAK,GAAI,CAEvE,EAAa,YAAY,EAAK,KACzB,CACL,IAAI,EAAwB,KAC1B,EAAM,WACR,IAAK,IAAI,EAAI,EAAY,EAAG,GAAK,EAAG,IAAK,CACvC,IAAM,EAAM,EAAW,GACnB,IAAQ,IAAM,EAAM,EACtB,EAAM,EAEN,GAAe,EAAS,GAAK,EAAU,EAAa,CAEtD,IAAM,EAAO,EAAS,GACtB,EAAW,aAAgB,QAAU,EAAQ,EAAK,IAAM,MAI5D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,IAAK,CAClC,IAAM,EAAQ,EAAU,GACxB,GAAI,IAAU,EAAG,CACf,IAAM,EAAM,EAAK,EAAS,GAAI,CAC5B,EAAO,EAAS,GACd,IAAU,EAAG,EAAU,SAAS,EAAK,EAAM,EAAE,CAC5C,EAAU,OAAO,EAAK,EAAM,EAAE,CAC/B,IAAU,IACZ,EAAU,QAAQ,EAAI,CACtB,EAAI,aAAa,OAAO,EAAQ,GAAI,CACpC,EAAM,WAAW,EAAa,KAAM,EAAK,WAAY,EAAK,IAUlE,EAAA,QAAE,GAAG,SAAW,SAAa,EAA2B,EAAiC,CACvF,IAAM,EACJ,OAAO,EAAQ,KAAQ,WACnB,EAAQ,IACP,GAAY,EAAK,EAAQ,KAC1B,EAA+B,CACnC,KAAM,EAAQ,KACd,OAAQ,EAAQ,OAChB,MAAO,EAAQ,MACf,SAAU,EAAQ,SAClB,OAAQ,EAAQ,OACjB,CAED,IAAK,IAAI,EAAO,EAAG,EAAO,KAAK,OAAQ,EAAO,EAAM,IAAQ,CAC1D,IAAM,EAAM,KAAK,GACf,GAAA,EAAA,EAAA,SAAO,EAAI,CACb,EAAG,IAAI,YAAY,CACnB,IAAM,EAAM,GAAc,IAAI,EAAI,CAC9B,IACF,EAAI,GAAG,SAAS,CAChB,EAAI,IAAI,SAAS,EAGnB,IAAM,EAAM,IAAI,GAAe,EAAI,GAAY,EAAI,CAAE,EAAQ,SAAS,CAChE,EAAK,MAAa,CACtB,IAAM,EAAQ,EAAO,MACnB,EAAM,EAAM,OACd,MAAgB,CAEd,GADA,GAAY,EAAK,EAAK,EAAI,EAAQ,MAAM,CACpC,IAAQ,EAAG,OACf,EAAM,IAAI,EAAa,KAAM,GAAG,EAAI,kBAAkB,iBAAiB,EAAI,QAAQ,CAEnF,IAAM,EAAO,GAAa,EAAK,EAAO,EAAK,EAAQ,EAAQ,OAAQ,EAAQ,QAAQ,CAC7E,EAAO,GAAY,EAAM,EAAS,EAAI,QAAQ,SAAW,EAAE,CAIjE,GAHA,GAAe,EAAK,EAAK,CACzB,GAAW,EAAK,EAAM,EAAK,EAAW,EAAK,CAEvC,EAAQ,WACL,IAAI,EAAI,EAAK,WAAY,GAAK,EAAK,YAAa,IAC9C,EAAK,UAAU,IAAI,EAAI,QAAQ,GAAI,EAAE,EAAI,WAAW,OAAO,EAAI,QAAQ,GAAI,CAGpF,EAAU,QAAQ,EAAI,QAAQ,CAC9B,EAAU,QAAQ,EAAI,SAAS,CAC/B,EAAU,QAAQ,EAAI,SAAS,CAC/B,EAAI,QAAU,EAAK,QACnB,EAAI,SAAW,EAAK,SACpB,EAAI,SAAW,EAAK,SACpB,GAAQ,QAAQ,EAAK,UAAU,CAC/B,EAAU,QAAQ,EAAK,OAAO,CAC9B,EAAU,QAAQ,EAAK,QAAQ,CAC/B,EAAU,QAAQ,EAAK,OAAO,EAC9B,EACF,CAGF,GADA,EAAI,GAAK,EACL,EAAQ,OACV,IAAK,IAAM,KAAM,EAAQ,OAAQ,CAC/B,GAAI,CAAC,EAAO,KAAK,EAAQ,OAAQ,EAAG,CAAE,SACtC,IAAM,EAAI,EAAG,QAAQ,IAAI,CACvB,EAAO,IAAM,GAAK,EAAK,EAAG,MAAM,EAAG,EAAE,CACrC,EAAM,IAAM,GAAK,MAAQ,EAAG,MAAM,EAAI,EAAE,CAAC,MAAM,CAC3C,EAAU,EAAQ,OAAO,GAE/B,EAAG,GAAG,GAAG,EAAK,WAAY,EAAK,SAAyB,EAA0B,CAChF,IAAM,EAAU,EAAE,OAAmB,UAAU,kBAAkB,CAC3D,EAAK,GAAQ,aAAa,gBAAgB,CAChD,GAAI,GAAO,KAA0B,OAErC,IAAI,EAAa,EACjB,GAAI,CAAC,EAAI,WAAW,IAAI,EAAG,CAAE,CAC3B,IAAM,EAAK,OAAO,EAAG,CACjB,CAAC,OAAO,MAAM,EAAG,EAAI,EAAI,WAAW,IAAI,EAAG,GAAE,EAAI,GAEvD,IAAM,EAAM,EAAI,WAAW,IAAI,EAAE,CAC7B,IAAQ,IAAA,IAAW,EAAQ,KAAK,EAAuB,EAAI,SAAS,GAAO,EAAK,EAAE,EACtF,CAGN,EAAS,YAAY,EAAK,EAAG,CAC7B,GAAc,IAAI,EAAK,CAAE,KAAI,MAAK,CAAC,CACnC,EAAS,aAAa,MAAW,CAC/B,EAAI,SAAS,CACb,GAAc,OAAO,EAAI,EACzB,CAEJ,OAAO,MCxhBT,IAAM,GAAc,OAAO,OAAO,EAAE,CAAC,CAmBrC,EAAA,QAAE,GAAG,UAAY,SAA2B,EAA2B,EAAmB,CACxF,IAAM,EAAK,GAAS,GACd,EAAW,EAAU,MAAQ,YAEnC,IAAK,IAAI,EAAI,EAAG,EAAM,KAAK,OAAQ,EAAI,EAAK,IAAK,CAC/C,IAAM,EAAS,KAAK,GACf,KAEL,GAAS,YAAY,EAAO,CAC5B,GAAI,CAEF,IAAM,EAAW,MAAgB,GAAA,EAAA,EAAA,SAAY,EAAO,CAAE,EAAE,CAAC,CACrD,OAAO,GAAa,YACtB,EAAS,oBAAoB,EAAQ,EAAS,OAEzC,EAAK,CACZ,EAAM,MAAM,EAAa,MAAO,EAAe,MAAM,MAAM,EAAS,CAAE,EAAI,GAG9E,OAAO,MAOT,EAAA,QAAE,GAAG,YAAc,UAAgC,CACjD,IAAK,IAAI,EAAI,EAAG,EAAM,KAAK,OAAQ,EAAI,EAAK,IAAK,CAC/C,IAAM,EAAK,KAAK,GACZ,GAAI,GAAW,EAAG,CAExB,OAAO,MCrDT,SAAS,GAAc,EAAe,EAAgC,CACpE,GAAI,CACF,QAAQ,UAAU,EAAM,GAAI,EAAI,OACzB,EAAG,CACV,EAAM,KACJ,EAAa,MACb,wGACA,EACD,EAIL,IAAM,GAAN,KAAmC,CAsBjC,YAAY,EAAqB,kBAZX,sBACE,iBAEc,EAAE,oBAIhB,IAAI,uBACe,EAAE,mBACtB,qBACwB,EAAE,CAG/C,KAAK,OAAS,CACZ,KAAM,GAAe,KACrB,SAAU,GAAe,SACzB,cAAe,GAAe,cAC9B,YAAa,GAAe,YAC5B,GAAG,EACJ,CAED,KAAK,cAAgB,KAAK,OAAO,OAAS,UAC1C,KAAK,SAAW,KAAK,OAAO,SAAS,QAAQ,MAAO,GAAG,CACvD,KAAK,YAAc,KAAK,OAAO,YAE/B,KAAK,SAAA,EAAA,EAAA,SAAY,KAAK,OAAO,OAAO,CACpC,KAAK,YAAc,KAAK,cAAgB,SAAS,SAAW,SAAS,OAAS,SAAS,KACvF,KAAK,iBAAmB,EAAW,KAAK,cAAc,CAAC,CACvD,KAAK,aAAe,KAAK,iBACzB,KAAK,gBAAkB,EAAW,KAAK,gBAAgB,CAAC,CACxD,KAAK,YAAc,OAAe,KAAK,gBAAgB,MAAM,CAC7D,KAAK,MAAM,CAGb,MAAe,CACb,IAAM,EAAQ,KAAK,cAAgB,WAAa,aAC1C,EAAU,KAAK,gBAAgB,KAAK,KAAK,CAC/C,OAAO,iBAAiB,EAAO,EAAQ,CACvC,KAAK,SAAS,SAAW,OAAO,oBAAoB,EAAO,EAAQ,CAAC,CAEpE,IAAM,EAAe,MAAa,CAChC,IAAM,EAAY,KAAK,iBAAiB,MACxC,MAAgB,CACd,IAAK,IAAM,KAAM,KAAK,cACpB,GAAI,CACF,GAAI,MACE,EACV,KAAK,cAAc,OAAS,GAC5B,CACF,KAAK,YAAY,EAAU,EAC3B,CACF,KAAK,SAAS,SAAW,EAAa,SAAS,CAAC,CAChD,KAAK,oBAAoB,CACrB,KAAK,QAAQ,IAAI,EAAS,aAAa,KAAK,QAAQ,OAAU,KAAK,SAAS,CAAC,CAGnF,cAA+B,CAC7B,GAAM,CAAE,QAAS,GAAiB,KAAK,OACvC,GAAI,KAAK,cAAe,CACtB,IAAM,EAAO,KAAK,SACd,EAAO,SAAS,SAIpB,OAHI,GAAQ,EAAK,WAAW,EAAK,GAC/B,EAAO,EAAK,UAAU,EAAK,OAAO,EAE7B,EAAK,QAAQ,MAAO,GAAG,EAAI,EAEpC,OAAO,SAAS,KAAK,MAAM,IAAI,CAAC,GAAI,UAAU,EAAE,EAAI,EAGtD,gBAAiD,CAC/C,IAAM,EAAO,SAAS,KAChB,EAAa,EAAK,QAAQ,IAAI,CAC9B,EAAM,KAAK,cACb,SAAS,OAAO,UAAU,EAAE,CAC5B,IAAe,GAEb,GADA,EAAK,UAAU,EAAa,EAAE,CAGpC,GAAI,IAAQ,KAAK,aAAc,OAAO,KAAK,aAC3C,KAAK,aAAe,EAEpB,IAAM,EAA8B,EAAE,CAClC,EAAS,EACT,GACF,IAAI,gBAAgB,EAAI,CAAC,SAAS,EAAG,IAAM,CACzC,EAAI,GAAK,EACT,KACA,CAGJ,IAAI,EAAS,EACb,IAAK,IAAM,KAAK,KAAK,aAAc,IAEnC,IAAI,EAAU,IAAW,EACzB,GAAI,CAAC,OACE,IAAM,KAAK,EACd,GAAI,EAAI,KAAO,KAAK,aAAa,GAAI,CACnC,EAAU,GACV,OAcN,OATI,IACE,EAAI,QAAQ,IAAI,CAMpB,KAAK,aAAe,GAEf,KAAK,aAGd,OAAe,EAAoB,CACjC,IAAM,EAAM,KAAK,cAAgB,GAAG,KAAK,SAAS,GAAG,IAAS,IAAI,IAC9D,KAAK,cACP,GAAc,KAAM,EAAI,CAExB,SAAS,KAAO,EAElB,KAAK,YAAc,KAAK,cAAgB,EAAM,SAAS,KAGzD,YAA2B,CACrB,KAAK,cACP,GAAc,KAAM,KAAK,YAAY,CAErC,SAAS,KAAO,KAAK,YAIzB,YAAoB,EAAoB,CACtC,GAAI,KAAK,aAAe,CAAC,KAAK,QAAQ,GAAI,OAC1C,GAAM,CAAE,SAAQ,WAAU,mBAAkB,mBAAoB,KAAK,OAC/D,EAAM,EAAO,KAAU,EAAW,EAAO,GAAY,IAAA,IAC3D,GAAI,CAAC,EAAK,CACR,EAAM,KAAK,EAAa,MAAO,EAAe,MAAM,UAAU,EAAK,CAAC,CACpE,OAGF,IAAM,EAAS,KAAK,gBAAgB,CAClC,EAAO,KAAK,cACV,GAAkB,MAAgB,EAAiB,EAAM,EAAK,CAAC,CAEnE,KAAK,QAAQ,OAAO,CACpB,IAAI,EAAc,EAClB,GAAI,EAAI,QAAS,CACf,IAAM,EAAM,MAAgB,EAAI,QAAS,EAAQ,KAAK,CAAC,CACnD,IAAK,EAAc,CAAE,GAAG,EAAQ,GAAG,EAAK,EAG9C,IAAM,EAAa,GAAmB,KAAK,cAAc,KAAK,EAAG,CACjE,GAAI,EAAI,OAAQ,EAAI,OAAO,KAAK,QAAQ,GAAI,EAAM,EAAa,EAAW,KAAK,SACtE,EAAI,SAAU,CACrB,IAAI,EAAO,KAAK,cAAc,IAAI,EAAI,SAAS,CAC/C,GAAI,CAAC,EAAM,CACT,IAAM,EAAK,SAAS,cAAc,EAAI,SAAS,CAC/C,GAAI,aAAc,oBAChB,EAAO,EACP,KAAK,cAAc,IAAI,EAAI,SAAU,EAAK,KACrC,CACL,EAAM,KAAK,EAAa,MAAO,EAAe,MAAM,mBAAmB,EAAI,SAAS,CAAC,CACrF,QAGJ,KAAK,QAAQ,OAAO,EAAK,QAAQ,UAAU,GAAK,CAAqB,CACjE,EAAI,SAAS,EAAI,QAAQ,KAAK,QAAQ,UAAU,CAAE,EAAW,KAAK,CAGpE,GAAiB,MAAgB,EAAgB,EAAM,EAAK,CAAC,CACjE,KAAK,cAAgB,EAGvB,iBAAgC,CAC9B,GAAI,KAAK,YAAa,OAEtB,IAAM,EAAa,KAAK,cAAgB,SAAS,SAAW,SAAS,OAAS,SAAS,KACvF,GAAI,IAAe,KAAK,YAAa,OAErC,IAAM,EAAY,KAAK,cAAc,CAC/B,EAAW,KAAK,iBAAiB,MAAM,CAE7C,GAAI,IAAa,EAAW,CAC1B,GAAI,MAAgB,KAAK,OAAO,OAAO,IAAW,UAAU,KAAK,CAAC,GAAK,GAAO,CAC5E,KAAK,YAAY,CACjB,OAEF,KAAK,iBAAiB,MAAQ,EAEhC,KAAK,gBAAgB,MAAQ,KAAK,gBAAgB,CAClD,KAAK,YAAc,EAGrB,oBAAmC,CACjC,GAAI,CAAC,KAAK,OAAO,cAAe,OAChC,IAAM,EAAW,GAA6B,CAC5C,EAAE,gBAAgB,CAClB,IAAM,EAAK,EAAE,cAA8B,QAAQ,MAC/C,GAAK,MAAM,KAAK,SAAS,EAAE,GAEjC,EAAA,EAAA,SAAE,SAAS,CAAC,GAAG,QAAS,eAAgB,EAAQ,CAChD,KAAK,SAAS,UAAA,EAAA,EAAA,SAAa,SAAS,CAAC,IAAI,QAAS,eAAgB,EAAQ,CAAC,CAE3E,IAAI,EAAqC,EAAE,CACrC,EAAmB,MAAa,CACpC,IAAM,EAAY,KAAK,iBAAiB,MAClC,EAAc,KAAK,YACzB,MAAgB,CACd,IAAM,EAAM,EAAoB,OAChC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAK,EAAoB,GAC/B,EAAG,UAAU,OAAO,EAAY,CAChC,EAAG,gBAAgB,eAAe,CAGpC,GAAI,CACF,IAAM,EAAW,gBAAgB,EAAU,QAAQ,KAAM,MAAM,CAAC,IAC1D,EAAQ,MAAM,KAAK,SAAS,iBAA8B,EAAS,CAAC,CACpE,EAAO,EAAM,OACnB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,IAAK,CAC7B,IAAM,EAAK,EAAM,GACjB,EAAG,UAAU,IAAI,EAAY,CAC7B,EAAG,aAAa,eAAgB,OAAO,CAEzC,EAAsB,OAChB,CACN,EAAsB,EAAE,GAE1B,EACF,CACF,KAAK,SAAS,SAAW,EAAiB,SAAS,CAAC,CAGtD,SAAgB,EAAoB,CAClC,GAAI,KAAK,YAAa,OACtB,IAAM,EAAM,KAAK,iBAAiB,MAAM,CACxC,GAAI,KAAK,OAAO,OAAO,IAAM,UAAU,KAAK,GAAK,GAAO,OAExD,IAAM,EAAW,GAAQ,KAAK,OAAO,QAChC,IAEL,KAAK,OAAO,EAAS,CACrB,KAAK,gBAAgB,MAAQ,EAAE,CAC/B,KAAK,iBAAiB,MAAQ,GAGhC,SAAuB,CACjB,SAAK,YACT,MAAK,YAAc,GACnB,IAAK,IAAM,KAAM,KAAK,SACpB,GAAI,CACF,GAAI,MACE,EACV,KAAK,cAAc,OAAO,IAO9B,SAAgB,GAAM,EAA6B,CACjD,OAAO,IAAI,GAAW,EAAO,CAG/B,EAAA,QAAE,OAAO,CACP,SACD,CAAC,CC9RF,IAAM,GAAN,KAAsB,CAgBpB,YAAY,EAAkC,EAA0B,sBAftB,kBA8DjC,SAAwB,CACvC,KAAK,iBAAiB,OAAO,CAC7B,KAAK,gBAAkB,IAAI,gBAC3B,GAAM,CAAE,UAAW,KAAK,gBAElB,EAAiB,KAAK,iBAAiB,EAAI,EAAE,CAE7C,EAA2B,CAC/B,GAAG,KAAK,cACR,GAAG,EACH,QAAS,CACP,GAAG,KAAK,cAAc,QACtB,GAAG,EAAe,QACnB,CACD,IAAK,KAAK,YAAc,KAAK,UAAY,KAAK,QAAQ,CACtD,QAAS,IAAA,GACT,MAAO,IAAA,GACP,SAAU,IAAA,GACX,CACK,EAAM,EAAA,QAAE,KAAK,EAAI,CAEvB,EAAO,YAAgB,EAAI,OAAO,CAC9B,EAAO,SAAS,EAAI,OAAO,CAE/B,GAAI,CACF,IAAM,EAAM,MAAM,EAClB,OAAO,KAAK,YAAc,KAAK,YAAY,EAAI,CAAI,QAC5C,EAAK,CACZ,GAAI,EAAO,QAAS,CAClB,IAAM,EAAQ,MAAM,aAAa,CAEjC,KADA,GAAE,KAAO,aACH,EAER,OAAO,KAAK,YAAY,EAAI,QACpB,CACR,EAAO,QAAU,KACb,KAAK,iBAAiB,SAAW,IAAQ,KAAK,gBAAkB,QAlFtE,IAAM,EAAW,OAAO,GAAY,SACpC,KAAK,YAAc,EACf,GACF,KAAK,UAAY,EACjB,KAAK,WAAe,KAAK,WAEzB,KAAK,OAAS,EAGhB,KAAK,cACH,OAAO,EAAQ,aAAgB,WAAa,EAAQ,YAAc,IAAA,GAEpE,IAAM,EAAW,OAAO,EAAQ,aAAgB,SAAW,EAAQ,YAAc,EAAE,CACnF,KAAK,cAAgB,CACnB,GAAG,EACH,OAAQ,EAAQ,OAChB,QAAS,CAAE,GAAI,GAAkC,QAAS,GAAG,EAAQ,QAAS,CAC/E,CACD,KAAK,YAAc,EAAQ,UAC3B,KAAK,UAAY,EAAQ,QAG3B,OAAqB,CACnB,KAAK,iBAAiB,OAAO,CAG/B,YAAoB,EAAqB,CACvC,IAAI,EACJ,GAAI,GAAe,EAAqB,aAAe,OAAa,CAClE,IAAM,EAAI,EACV,EAAY,MAAM,kBAAkB,EAAE,YAAc,UAAU,IAAI,EAAE,OAAO,GAAG,CAC7E,EAAqB,MAAQ,OAE9B,EAAQ,aAAe,MAAQ,EAAU,MAAM,OAAO,GAAO,gBAAgB,CAAC,CAGhF,GAAI,KAAK,UACP,GAAI,CACF,KAAK,UAAU,EAAM,MACf,EAIV,MAAM,IAqDV,EAAA,QAAE,OAAO,CACP,UAAa,EAAkC,EAA2C,CACxF,IAAM,EAAM,IAAI,GAAgB,EAAS,EAAQ,CAC3C,EAAU,GAAS,EAAI,QAAS,CACpC,aAAc,EAAQ,aACtB,KAAM,EAAQ,QAAU,GACzB,CAAC,CACF,OAAO,OAAO,OAAO,EAAS,CAC5B,UAAa,EAAI,OAAO,CACzB,CAAC,EAEL,CAAC,EC5GF,EAAA,EAAA,aAAQ,CACN,IAAuB,CACvB,GAAkB,SAAS,KAAM,EACjC,WA8Ba,EAAA"}
|