effect-browser 0.2.0-beta.6 → 0.2.0-beta.7

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserRuntime-DImn_Oe_.mjs","names":["Registration.snapshot","Registration.invoke","invoke","TextResult","Bootstrap.empty"],"sources":["../src/internal/browser/Binding.ts","../src/internal/browser/BindingRunner.ts","../src/internal/browser/Bootstrap.ts","../src/internal/browser/Bindings.ts","../src/internal/browser/PageRead.ts","../src/internal/browser/Observation.ts","../src/internal/browser/Actions.ts","../src/internal/browser/CallbackTasks.ts","../src/internal/browser/CaptureSource.ts","../src/internal/browser/NativeBindings.ts","../src/internal/browser/Initialization.ts","../src/internal/browser/Keyboard.ts","../src/internal/browser/PageExecution.ts","../src/internal/browser/NativePageControl.ts","../src/internal/browser/Pointer.ts","../src/internal/browser/PolicyCleanup.ts","../src/internal/browser/Targets.ts","../src/internal/browser/Playwright.ts","../src/internal/browser/SchemaPath.ts","../src/internal/browser/PublicSession.ts","../src/internal/browser/ConnectionCleanup.ts","../src/internal/browser/Owner.ts","../src/internal/browser/Random.ts","../src/internal/browser/Session.ts","../src/BrowserRuntime.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nimport { BrowserError, InitializationError, Reasons } from \"../../Errors.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\n\n/**\n * Random values the owner draws from its `Crypto` service for one connection attempt. A native\n * engine has no randomness of its own.\n */\nexport interface ConnectionIdentity {\n /** Scopes the page, frame, observation and suspension ids this connection reports. */\n readonly namespace: string;\n /** Names the native binding channel's page globals. Never reported, so no page can claim them first. */\n readonly bindings: string;\n}\n\n/** What the owner asks of a native engine for one connection attempt. */\nexport interface ConnectRequest {\n /** The provider-issued connection address, unvalidated. */\n readonly connection: unknown;\n readonly identity: ConnectionIdentity;\n readonly options: DriverOptions;\n readonly events: DriverEvents;\n /** A connection that completes after the attempt was interrupted is disposed through this. */\n readonly onAbandoned: () => void;\n /** Called once the native attempt settles, whether or not anyone still waits for it. */\n readonly onSettled: () => void;\n}\n\nexport interface BindingImplementation {\n readonly connect: (\n request: ConnectRequest,\n ) => Effect.Effect<Driver, BrowserError | InitializationError>;\n}\n\n/**\n * A native attempt as a Promise with its own abort signal. Interruption aborts the signal; a\n * connection that still arrives afterwards is fenced and disconnected here, so a late native\n * success can never become a live, unowned browser.\n */\nexport type NativeAttempt = (request: ConnectRequest, signal: AbortSignal) => Promise<Driver>;\n\nexport const fromNativeAttempt = (attempt: NativeAttempt): BindingImplementation => ({\n connect: (request) =>\n Effect.tryPromise({\n try: (signal) => {\n const pending = attempt(request, signal).then(async (driver) => {\n if (signal.aborted) {\n request.onAbandoned();\n driver.fenceInitialization?.();\n await driver.disconnect().catch(() => {});\n throw BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Interrupted.make({}),\n outcome: \"unknown\",\n });\n }\n\n return driver;\n });\n\n void pending.then(request.onSettled, request.onSettled);\n\n return pending;\n },\n catch: (error) =>\n Schema.is(InitializationError)(error)\n ? error\n : publicError(error, \"connect\", {\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }),\n});\n\n/**\n * Binding identity is issuance, never shape: a value that merely looks like a binding has no\n * entry here and cannot reach the owner, so only this package's constructors supply an engine.\n */\nconst issued = new WeakMap<object, BindingImplementation>();\n\nexport const issueBinding = <B extends object>(\n binding: B,\n implementation: BindingImplementation,\n) => {\n issued.set(binding, implementation);\n\n return Object.freeze(binding);\n};\n\nexport const bindingImplementation = (binding: object): BindingImplementation | undefined =>\n issued.get(binding);\n","import { Effect, Exit, FiberSet, Scope } from \"effect\";\n\nimport type { CallbackFailureMode } from \"./CallbackTasks.ts\";\nimport type { DriverFault } from \"./Driver.ts\";\n\nexport type BindingRejection = \"closed\" | \"capacity\";\n\nexport type BindingAdmission<A, E> =\n | { readonly _tag: \"Rejected\"; readonly reason: BindingRejection }\n | { readonly _tag: \"Accepted\"; readonly result: Promise<Exit.Exit<A, E>> };\n\n/**\n * Scoped host runner for future page-callable bindings. Admission is synchronous and finite:\n * no Fiber exists until a slot has been reserved. The owning Scope interrupts accepted work;\n * consumer failures remain in an Exit on the host and are never page reply material here.\n */\nexport interface BindingRunner<I, A, E> {\n /** Fence new callbacks synchronously; the owning Scope still owns accepted work. */\n readonly close: () => void;\n /** Native owner faults request cancellation immediately; the Scope still joins every fiber. */\n readonly interrupt: () => void;\n readonly submit: (input: I, failureMode?: CallbackFailureMode) => BindingAdmission<A, E>;\n}\n\nexport const makeBindingRunner = <I, A, E, R>(\n capacity: number,\n handle: (input: I) => Effect.Effect<A, E, R>,\n onFault: (event: Extract<DriverFault, { readonly source: \"binding\" }>) => void,\n): Effect.Effect<BindingRunner<I, A, E>, never, R | Scope.Scope> => {\n if (!Number.isSafeInteger(capacity) || capacity < 1)\n throw new RangeError(\"Invalid binding callback capacity\");\n\n return Effect.gen(function* () {\n const parent = yield* Scope.Scope;\n // Do not depend on an application's ambient finalizer strategy for callback ordering.\n // One private sequential child owns both FiberSet and the admission fence.\n const runtimeScope = yield* Scope.fork(parent, \"sequential\");\n\n const fibers = yield* FiberSet.make<Exit.Exit<A, E>, never>().pipe(Scope.provide(runtimeScope));\n const run = yield* FiberSet.runtimePromise(fibers)<R>();\n\n let accepting = true;\n let faulted = false;\n let inFlight = 0;\n\n const close = () => {\n accepting = false;\n };\n\n const interrupt = () => {\n close();\n // Called synchronously by native owner fencing; scoped FiberSet cleanup performs the join.\n for (const fiber of fibers) fiber.interruptUnsafe();\n };\n\n const fault = () => {\n if (!accepting || faulted) return;\n faulted = true;\n onFault({ source: \"binding\", reason: \"callback-failure\", disposition: \"known\" });\n };\n\n // FiberSet registered its child-scope finalizer first. Sequential reverse registration\n // order therefore closes admission before the set interrupts accepted callbacks.\n yield* Scope.addFinalizer(runtimeScope, Effect.sync(close));\n\n const submit = (\n input: I,\n failureMode: CallbackFailureMode = \"fail-session\",\n ): BindingAdmission<A, E> => {\n if (!accepting || faulted) return { _tag: \"Rejected\", reason: \"closed\" };\n if (inFlight >= capacity) {\n if (failureMode === \"fail-session\") fault();\n\n return { _tag: \"Rejected\", reason: \"capacity\" };\n }\n\n inFlight++;\n // Construct the consumer Effect inside the admitted fiber as well: a consumer callback\n // that throws while producing its Effect is a host defect, not work allowed before admission.\n const execution = run(Effect.exit(Effect.suspend(() => handle(input))));\n\n const result = execution\n .then(\n (exit) => {\n if (failureMode === \"fail-session\" && Exit.isFailure(exit)) fault();\n\n return exit;\n },\n (error: unknown) => {\n if (failureMode === \"fail-session\") fault();\n throw error;\n },\n )\n .finally(() => {\n inFlight--;\n });\n\n // A native caller may disappear while the host callback is still settling. Keep the\n // Promise observed without consuming the Exit returned to a caller that is still present.\n void result.catch(() => {});\n\n return { _tag: \"Accepted\", result };\n };\n\n return { close, interrupt, submit };\n });\n};\n","import type { Plan } from \"../../Bootstrap.ts\";\n\nexport interface ReadinessRequirement {\n readonly step: string;\n readonly expression: string;\n readonly timeoutMillis: number;\n readonly origins?: ReadonlyArray<string>;\n}\n\n/** What the native driver installs: one ordered bundle, its capabilities and its gates. */\nexport interface CompiledBootstrap {\n readonly bundle?: string;\n readonly permissions: ReadonlyArray<{\n readonly origin: string;\n readonly permissions: ReadonlyArray<string>;\n }>;\n readonly readiness: ReadonlyArray<ReadinessRequirement>;\n readonly existingDocuments: \"RequireFreshNavigation\" | \"AcceptAlreadyRunning\";\n}\n\nconst guarded = (content: string, origins: ReadonlyArray<string> | undefined): string =>\n origins === undefined\n ? `(() => {\\n${content}\\n})();`\n : `(() => {\\nconst origins = ${JSON.stringify([...origins])};\\nif (!origins.includes(globalThis.location && globalThis.location.origin)) return;\\n${content}\\n})();`;\n\n/**\n * Dependent steps become one script in declared order: a failing step stops the ones after it\n * rather than letting a later step observe half-initialized state. Origin-excluded steps are\n * skipped inside the document that reports the origin, never by guessing from a navigation URL.\n */\nexport const compileBootstrap = (\n plan: Pick<Plan, \"scripts\" | \"permissions\">,\n): CompiledBootstrap | undefined => {\n if (plan.scripts.length === 0 && plan.permissions.length === 0) return undefined;\n\n const bundle =\n plan.scripts.length === 0\n ? undefined\n : plan.scripts.map((script) => guarded(script.content, script.origins)).join(\"\\n\");\n\n const readiness = plan.scripts.flatMap((script) =>\n script.readiness === undefined\n ? []\n : [\n {\n step: script.id,\n expression: script.readiness.expression,\n timeoutMillis: script.readiness.timeoutMillis,\n ...(script.origins === undefined ? {} : { origins: script.origins }),\n },\n ],\n );\n\n // The most conservative declared policy governs the whole plan: one document is either\n // admitted for dependent work or it is not, and steps cannot disagree about that.\n const existingDocuments = plan.scripts.some(\n (script) => script.readiness?.existingDocuments === \"RequireFreshNavigation\",\n )\n ? \"RequireFreshNavigation\"\n : \"AcceptAlreadyRunning\";\n\n return {\n ...(bundle === undefined ? {} : { bundle }),\n permissions: plan.permissions.map((grant) => ({\n origin: grant.origin,\n permissions: [...grant.permissions],\n })),\n readiness,\n existingDocuments,\n };\n};\n\n/** Duplicate step identity would make registration order and readiness reports ambiguous. */\nexport const duplicateStep = (plan: Pick<Plan, \"scripts\" | \"permissions\" | \"bindings\">): boolean =>\n new Set(plan.scripts.map((script) => script.id)).size !== plan.scripts.length ||\n new Set(plan.permissions.map((grant) => grant.origin)).size !== plan.permissions.length ||\n new Set((plan.bindings ?? []).map((registration) => registration.name)).size !==\n (plan.bindings?.length ?? 0);\n","import { Cause, Deferred, Effect, Exit, Schema, Scope } from \"effect\";\n\nimport * as Bootstrap from \"../../Bootstrap.ts\";\nimport { BrowserError, InitializationError, Reasons } from \"../../Errors.ts\";\nimport * as Registration from \"./BindingRegistration.ts\";\nimport { makeBindingRunner } from \"./BindingRunner.ts\";\nimport { duplicateStep } from \"./Bootstrap.ts\";\nimport type { DriverFault } from \"./Driver.ts\";\n\nexport interface NativeBindingCall {\n /** Validate native membership, allowed origin and the captured document before returning JSON. */\n readonly read: (signal: AbortSignal) => Promise<string>;\n /** Revalidate the same native caller/document; never substitute a newly selected document. */\n readonly check: (signal: AbortSignal) => Promise<void>;\n /** Idempotently fence retained handles and dispose late arrivals as they become available. */\n readonly dispose: () => Promise<void>;\n}\n\nexport interface NativeBinding {\n readonly name: string;\n readonly origins: ReadonlyArray<string>;\n readonly maxConcurrent: number;\n readonly maxInputBytes: number;\n readonly timeoutMillis: number;\n /** Rejected admission never calls read/check/dispose; the native callback still owns its handles. */\n readonly invoke: (call: NativeBindingCall) => Promise<string>;\n}\n\nexport interface ConnectionBindings {\n readonly bindings: ReadonlyArray<NativeBinding>;\n readonly close: () => void;\n /** Native registration/transport failure supervises the owner, not a single page invocation. */\n readonly reportFailure: (error: InitializationError) => void;\n /** Drain scoped Effect fibers. Late native promises remain observed and occupy capacity. */\n readonly dispose: Effect.Effect<void>;\n}\n\nexport interface Bindings<E> {\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly diagnostics: Effect.Effect<Bootstrap.BindingDiagnostics<E>>;\n readonly connect: (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent?: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\nconst invalidPlan = () =>\n BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n\nconst AdmissionPlan = Schema.Struct({\n ...Bootstrap.Plan.fields,\n bindings: Schema.optionalKey(Schema.Array(Schema.Unknown).check(Schema.isMaxLength(16))),\n});\n\n/** Validate before allocation and retain an immutable snapshot, including authenticated callbacks. */\nexport const preparePlan = Effect.fnUntraced(function* <E, R>(\n plan: Bootstrap.Plan<E, R>,\n): Effect.fn.Return<Bootstrap.Plan<E, R>, BrowserError> {\n const source = yield* Effect.try({\n try: () => ({ ...plan }),\n catch: invalidPlan,\n });\n\n const data = yield* Schema.decodeEffect(AdmissionPlan, { onExcessProperty: \"error\" })(\n source,\n ).pipe(Effect.mapError(invalidPlan));\n\n if (duplicateStep({ scripts: data.scripts, permissions: data.permissions }))\n return yield* invalidPlan();\n const candidates = source.bindings === undefined ? [] : source.bindings;\n\n const bindings = yield* Effect.forEach([...candidates], (registration) =>\n Registration.snapshot(registration),\n );\n\n if (new Set(bindings.map((registration) => registration.name)).size !== bindings.length) {\n return yield* invalidPlan();\n }\n\n return Object.freeze({\n scripts: Object.freeze(\n data.scripts.map((script) =>\n Object.freeze({\n ...script,\n ...(script.origins === undefined ? {} : { origins: Object.freeze([...script.origins]) }),\n ...(script.readiness === undefined\n ? {}\n : { readiness: Object.freeze({ ...script.readiness }) }),\n }),\n ),\n ),\n permissions: Object.freeze(\n data.permissions.map((grant) =>\n Object.freeze({\n ...grant,\n permissions: Object.freeze([...grant.permissions]),\n }),\n ),\n ),\n ...(bindings.length === 0 ? {} : { bindings: Object.freeze(bindings) }),\n });\n});\n\nconst rejected = (): Promise<never> => {\n const error = new Error(\"Browser binding call rejected\");\n\n error.name = \"BrowserBindingError\";\n error.stack = \"\";\n const result = Promise.reject(error);\n\n void result.catch(() => {});\n\n return result;\n};\n\nconst increment = (value: number) => Math.min(Number.MAX_SAFE_INTEGER, value + 1);\n\n/** The caller must pass preparePlan's snapshot; dependencies are captured at acquisition. */\nexport const makeBindings = Effect.fnUntraced(function* <E, R>(\n plan: Bootstrap.Plan<E, R>,\n): Effect.fn.Return<Bindings<E>, never, Exclude<R, Scope.Scope> | Scope.Scope> {\n // Effect.scoped installs a fresh invocation Scope inside this captured context. A consumer\n // handler never receives the acquisition Scope even when the actual context contains it.\n const consumer = yield* Effect.context<Exclude<R, Scope.Scope>>();\n const ownerScope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n const failure = yield* Deferred.make<never, E | InitializationError>();\n const connections = new Set<ConnectionBindings>();\n const failures: Array<Bootstrap.BindingFailure<E>> = [];\n let droppedFailures = 0;\n let faulted = false;\n let ownerClosed = false;\n\n const entries = (plan.bindings ?? []).map((registration) => ({\n registration,\n state: {\n name: registration.name,\n inFlight: 0,\n pendingNative: 0,\n retired: 0,\n accepted: 0,\n succeeded: 0,\n rejected: 0,\n },\n }));\n\n yield* Scope.addFinalizer(\n ownerScope,\n Effect.suspend(() => {\n ownerClosed = true;\n const owned = [...connections];\n\n for (const connection of owned) connection.close();\n\n return Effect.forEach(owned, (connection) => connection.dispose, { discard: true });\n }),\n );\n\n const connect = Effect.fnUntraced(function* (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent: () => boolean = isActive,\n ): Effect.fn.Return<ConnectionBindings, never, Scope.Scope> {\n const connectionScope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n let closed = ownerClosed || faulted;\n const fences: Array<() => void> = [];\n const current = () => !closed && !ownerClosed && !faulted && isCurrent();\n const active = () => current() && isActive();\n\n const close = () => {\n closed = true;\n for (const fence of fences) fence();\n };\n\n const record = (\n registration: Pick<Registration.Registration<E, R>, \"name\" | \"failureMode\">,\n cause: Cause.Cause<E | InitializationError>,\n event: DriverFault = { source: \"binding\", reason: \"callback-failure\", disposition: \"known\" },\n ) => {\n if (failures.length === 32) {\n failures.shift();\n droppedFailures = increment(droppedFailures);\n }\n failures.push(\n Object.freeze({ name: registration.name, mode: registration.failureMode, cause }),\n );\n if (registration.failureMode === \"fail-session\" && current()) {\n faulted = true;\n // The host can observe the original typed cause as soon as its owner is fenced.\n Deferred.doneUnsafe(failure, Effect.failCause(cause));\n // The owner must fence browser admission before interrupted callback finalizers run.\n onFault(event);\n for (const connection of connections) connection.close();\n }\n };\n\n const bindings = yield* Effect.forEach(entries, ({ registration, state }) =>\n Effect.gen(function* () {\n const error = (\n reason: InitializationError[\"reason\"],\n operation: InitializationError[\"operation\"] = \"callback\",\n ) => InitializationError.make({ operation, step: registration.name, reason });\n\n interface Work {\n readonly call: NativeBindingCall;\n pending: number;\n finished: boolean;\n released: boolean;\n nativeFault?: Extract<DriverFault, { readonly source: \"native\" }>;\n }\n\n const release = (work: Work) => {\n if (!work.finished || work.pending !== 0 || work.released) return;\n work.released = true;\n state.inFlight--;\n state.retired--;\n };\n\n const track = <A>(work: Work, promise: Promise<A>): Promise<A> => {\n work.pending++;\n state.pendingNative++;\n\n const settled = () => {\n work.pending--;\n state.pendingNative--;\n release(work);\n };\n\n void promise.then(settled, settled);\n\n return promise;\n };\n\n const finish = (work: Work) => {\n if (work.finished) return;\n work.finished = true;\n state.retired++;\n\n // Disposal may complete before an abort-ignoring read. Both remain accounted for.\n const disposing = Promise.resolve()\n .then(() => work.call.dispose())\n .catch(() => {\n record(registration, Cause.fail(error(\"native\", \"dispose\")), {\n source: \"native\",\n reason: \"callback\",\n disposition: \"unknown\",\n });\n });\n\n void track(work, disposing);\n };\n\n const native = <A>(work: Work, action: (signal: AbortSignal) => Promise<A>) =>\n Effect.tryPromise({\n try: (signal) => track(work, action(signal)),\n catch: (cause) => {\n work.nativeFault = { source: \"native\", reason: \"callback\", disposition: \"unknown\" };\n\n return Schema.is(InitializationError)(cause) ? error(cause.reason) : error(\"native\");\n },\n });\n\n const execute = Effect.fnUntraced(function* (work: Work) {\n const check = Effect.suspend(() =>\n active() ? native(work, work.call.check) : Effect.fail(error(\"closed\")),\n );\n\n if (!active()) return yield* error(\"closed\");\n const text = yield* native(work, work.call.read);\n const result = yield* Registration.invoke(registration, text, check);\n\n yield* check;\n\n return result;\n });\n\n const runner = yield* makeBindingRunner(\n registration.maxConcurrent,\n (work: Work) =>\n Effect.scoped(execute(work)).pipe(\n Effect.timeoutOrElse({\n duration: registration.timeoutMillis,\n orElse: () => Effect.fail(error(\"timeout\")),\n }),\n Effect.provideContext(consumer),\n ),\n () => {},\n ).pipe(Scope.provide(connectionScope));\n\n fences.push(runner.interrupt);\n\n const invoke = (call: NativeBindingCall): Promise<string> => {\n if (!active()) {\n state.rejected = increment(state.rejected);\n\n return rejected();\n }\n if (state.inFlight >= registration.maxConcurrent) {\n state.rejected = increment(state.rejected);\n record(registration, Cause.fail(error(\"busy\")));\n\n return rejected();\n }\n // This reservation also covers codec work, native validation and late native disposal.\n // It is shared across connections, so reconnect cannot reset quarantined capacity.\n state.inFlight++;\n state.accepted = increment(state.accepted);\n const work: Work = { call, pending: 0, finished: false, released: false };\n const admission = runner.submit(work, \"reject-call\");\n\n if (admission._tag === \"Rejected\") {\n state.rejected = increment(state.rejected);\n finish(work);\n\n return rejected();\n }\n\n const result = admission.result\n .then(\n (exit) => {\n if (Exit.isFailure(exit)) {\n state.rejected = increment(state.rejected);\n record(registration, exit.cause, work.nativeFault);\n\n return rejected();\n }\n if (!active()) {\n state.rejected = increment(state.rejected);\n\n return rejected();\n }\n state.succeeded = increment(state.succeeded);\n\n return exit.value;\n },\n () => {\n state.rejected = increment(state.rejected);\n if (active())\n record(registration, Cause.fail(error(\"native\")), {\n source: \"native\",\n reason: \"callback\",\n disposition: \"unknown\",\n });\n\n return rejected();\n },\n )\n .finally(() => finish(work));\n\n void result.catch(() => {});\n\n return result;\n };\n\n return Object.freeze({\n name: registration.name,\n origins: registration.origins,\n maxConcurrent: registration.maxConcurrent,\n maxInputBytes: registration.maxInputBytes,\n timeoutMillis: registration.timeoutMillis,\n invoke,\n });\n }),\n );\n\n const connection: ConnectionBindings = {\n bindings: Object.freeze(bindings),\n close,\n reportFailure: (error) => {\n if (!current()) return;\n record({ name: error.step, failureMode: \"fail-session\" }, Cause.fail(error), {\n source: \"native\",\n reason: \"registration\",\n disposition: \"unknown\",\n });\n },\n dispose: Effect.sync(close).pipe(Effect.andThen(Scope.close(connectionScope, Exit.void))),\n };\n\n connections.add(connection);\n yield* Scope.addFinalizer(\n connectionScope,\n Effect.sync(() => {\n close();\n connections.delete(connection);\n }),\n );\n\n return connection;\n }, Effect.uninterruptible);\n\n return {\n failure: Deferred.await(failure),\n diagnostics: Effect.sync(() =>\n Object.freeze({\n faulted,\n bindings: Object.freeze(entries.map(({ state }) => Object.freeze({ ...state }))),\n failures: Object.freeze([...failures]),\n droppedFailures,\n }),\n ),\n connect,\n };\n});\n","import { Schema } from \"effect\";\n\nimport { ControlFacts, ObservedControl } from \"../../BrowserData.ts\";\n\nconst ControlIndex = Schema.Natural.check(Schema.isLessThanOrEqualTo(63));\n\n/**\n * What the page reader returns. It is decoded on the host, so a page that tampers with its own\n * prototypes can make a read fail but cannot make it return something unbounded or untyped.\n */\nexport const PageReadResult = Schema.Struct({\n text: Schema.String.check(Schema.isMaxLength(131072)),\n textTruncated: Schema.Boolean,\n controlsTruncated: Schema.Boolean,\n controls: Schema.Array(ControlFacts).check(Schema.isMaxLength(64)),\n /** Private selection identity, separate from every public control-facts projection. */\n selects: Schema.optionalKey(\n Schema.Array(\n Schema.Struct({\n index: ControlIndex,\n optionsTruncated: Schema.Boolean,\n options: Schema.Array(\n Schema.Struct({\n index: ControlIndex,\n value: Schema.String.check(Schema.isMaxLength(65536)),\n }),\n ).check(Schema.isMaxLength(64)),\n }),\n ).check(\n Schema.isMaxLength(64),\n Schema.makeFilter(\n (selects) => selects.reduce((size, select) => size + select.options.length, 0) <= 64,\n ),\n ),\n ),\n viewport: Schema.Struct({\n width: Schema.Finite,\n height: Schema.Finite,\n clippedText: Schema.Natural,\n coveredText: Schema.Natural,\n uncertainText: Schema.Natural,\n unreachableControls: Schema.Natural,\n exhausted: Schema.Boolean,\n }),\n /**\n * Sampled points that something taking no pointer events lies over, which only the browser's\n * own hit test can settle. They were counted as uncertain in this reading.\n */\n pending: Schema.optionalKey(\n Schema.Struct({\n points: Schema.Array(Schema.Tuple([Schema.Int, Schema.Int])).check(\n Schema.isMinLength(1),\n Schema.isMaxLength(256),\n ),\n scrollX: Schema.Finite,\n scrollY: Schema.Finite,\n }),\n ),\n});\n\nexport type PageReadResult = typeof PageReadResult.Type;\n\n/**\n * What the browser found on top at one sampled point once pointer events are ignored: the\n * pointer's own target or something inside it (`self`), a box that paints there (`covered`), or\n * boxes that paint nothing there (`clear`).\n */\nexport const PointVerdict = Schema.Literals([\"self\", \"covered\", \"clear\"]);\n\nexport type PointVerdict = typeof PointVerdict.Type;\n\nexport interface PageReadRequest {\n readonly scope: \"document\" | \"viewport\";\n readonly maximumBytes: number;\n readonly controlLimit: number;\n /** Bounds the traversal itself, not just what is returned from it. */\n readonly nodeBudget: number;\n /** When set, only this exact node's facts are read and nothing is traversed. */\n readonly only?: Element;\n /** Action observations issue a visible select's choices even while its dropdown is closed. */\n readonly choices?: boolean;\n /**\n * Case-insensitive text a reading keeps, applied before any limit: text lines and controls\n * whose label contains it. A select is kept through its own label or any option label, and an\n * option only beside the select it belongs to.\n */\n readonly match?: string;\n /** Fresh membership and identity checks for already retained options; values stay private. */\n readonly options?: ReadonlyArray<{ readonly node: Element; readonly value: string }>;\n /** The browser's answers for the points an earlier reading of this page left pending. */\n readonly verdicts?: Readonly<Record<string, PointVerdict>>;\n /**\n * Classify these points against `top`, the box the browser found above each with pointer\n * events ignored, instead of reading anything.\n */\n readonly classify?: ReadonlyArray<readonly [number, number]>;\n}\n\n/** What makes a control the one that was inspected. Geometry is excluded: scrolling moves it. */\nexport const identityOf = (facts: ControlFacts): string =>\n JSON.stringify([\n facts.kind,\n facts.label,\n facts.disabled,\n facts.checked ?? null,\n facts.selected ?? null,\n facts.required ?? null,\n facts.multiple ?? null,\n facts.editable,\n facts.inputType ?? null,\n facts.autocomplete ?? null,\n facts.destination ?? null,\n facts.formMethod ?? null,\n ]);\n\n/**\n * The same identity without enablement. A form may enable the control it is about to use, so a\n * form step compares this and separately requires the control to be enabled now. `editable`\n * follows `disabled`, so it is left out too; a form step checks it where text is written.\n */\nexport const stableIdentityOf = (facts: ControlFacts): string =>\n JSON.stringify([\n facts.kind,\n facts.label,\n facts.checked ?? null,\n facts.selected ?? null,\n facts.required ?? null,\n facts.multiple ?? null,\n facts.inputType ?? null,\n facts.autocomplete ?? null,\n facts.destination ?? null,\n facts.formMethod ?? null,\n ]);\n\n/** The model-facing projection: no destination, form or geometry ever leaves through it. */\nexport const observedControl = (\n facts: ControlFacts,\n elementId: string,\n selection: { readonly selectElementId?: string; readonly optionsTruncated?: boolean } = {},\n): ObservedControl =>\n ObservedControl.make({\n elementId,\n kind: facts.kind,\n label: facts.label,\n disabled: facts.disabled,\n ...(facts.checked === undefined ? {} : { checked: facts.checked }),\n ...(facts.selected === undefined ? {} : { selected: facts.selected }),\n ...(facts.inputType === undefined ? {} : { inputType: facts.inputType }),\n ...(facts.required === undefined ? {} : { required: facts.required }),\n ...(facts.multiple === undefined ? {} : { multiple: facts.multiple }),\n ...selection,\n });\n\n/**\n * Runs inside the page, so it is one self-contained function: it may not reference anything in\n * this module. It reads; it never scrolls, focuses, mutates or dispatches.\n *\n * Visibility here is geometry and hit-testing, never a pixel comparison. Text is kept only when\n * its line boxes intersect the viewport and the browser finds its own element at a sampled\n * point. Something that takes no pointer events is invisible to that hit test, so a point with\n * such a box over it is left pending and counted as uncertain. The host then asks the browser\n * which box is on top there with pointer events ignored, which also finds boxes inside closed\n * shadow roots, and reads again with the answers: a box that paints at the point covers it, and\n * a box that paints nothing there does not. Nothing is kept as visible without that answer.\n *\n * With `classify`, it instead judges each point against `top`, the box the browser returned for\n * it, and returns one verdict per point.\n */\nexport const readPage = (\n request: PageReadRequest,\n top?: unknown,\n): { readonly nodes: Array<Element>; readonly data: unknown } => {\n const { scope, maximumBytes, controlLimit, nodeBudget, only } = request;\n const width = window.innerWidth;\n const height = window.innerHeight;\n const needle = request.match?.toLowerCase();\n\n const matches = (value: string): boolean =>\n needle === undefined || value.toLowerCase().includes(needle);\n\n const evidence = {\n width,\n height,\n clippedText: 0,\n coveredText: 0,\n uncertainText: 0,\n unreachableControls: 0,\n exhausted: false,\n };\n\n type Box = Pick<DOMRect, \"left\" | \"top\" | \"right\" | \"bottom\" | \"width\" | \"height\">;\n\n const intersects = (rect: Box): boolean =>\n rect.width > 0 &&\n rect.height > 0 &&\n rect.bottom > 0 &&\n rect.right > 0 &&\n rect.top < height &&\n rect.left < width;\n\n const within = (rect: DOMRect): boolean =>\n rect.top >= 0 && rect.left >= 0 && rect.bottom <= height && rect.right <= width;\n\n const contains = (rect: Box, x: number, y: number): boolean =>\n x >= rect.left && x < rect.right && y >= rect.top && y < rect.bottom;\n\n /** The flat-tree parent: a shadow root's host rather than the root itself. */\n const parentOf = (node: Node): Node | null => {\n const parent = node.parentNode;\n\n return parent instanceof ShadowRoot ? parent.host : parent;\n };\n\n /** Whether `inner` is `outer` or lies inside it, across shadow boundaries. */\n const holds = (outer: Node, inner: Node): boolean => {\n for (let node: Node | null = inner; node !== null; node = parentOf(node))\n if (node === outer) return true;\n\n return false;\n };\n\n const related = (left: Node, right: Node): boolean => holds(left, right) || holds(right, left);\n\n /** The alpha of a computed colour; an unparsed format counts as opaque. */\n const alphaOf = (color: string): number => {\n if (color === \"transparent\") return 0;\n const inside = /\\(([^)]*)\\)/.exec(color)?.[1];\n\n if (inside === undefined) return 1;\n const alpha = inside.includes(\"/\") ? inside.split(\"/\")[1] : inside.split(\",\")[3];\n\n if (alpha === undefined) return 1;\n const value = Number.parseFloat(alpha);\n\n if (Number.isNaN(value)) return 1;\n\n return alpha.trim().endsWith(\"%\") ? value / 100 : value;\n };\n\n /** Whether a computed style draws anything of its own: a fill, a border, a shadow or an effect. */\n const draws = (style: CSSStyleDeclaration): boolean =>\n alphaOf(style.backgroundColor) > 0 ||\n style.backgroundImage !== \"none\" ||\n [\"top\", \"right\", \"bottom\", \"left\"].some(\n (side) =>\n Number.parseFloat(style.getPropertyValue(`border-${side}-width`)) > 0 &&\n ![\"none\", \"hidden\"].includes(style.getPropertyValue(`border-${side}-style`)) &&\n alphaOf(style.getPropertyValue(`border-${side}-color`)) > 0,\n ) ||\n style.boxShadow !== \"none\" ||\n (style.outlineStyle !== \"none\" && Number.parseFloat(style.outlineWidth) > 0) ||\n style.filter !== \"none\" ||\n (style.getPropertyValue(\"backdrop-filter\") || \"none\") !== \"none\" ||\n style.mixBlendMode !== \"normal\";\n\n // Elements whose own box shows content, whatever their style says.\n const replaced = new Set([\n \"IMG\",\n \"VIDEO\",\n \"CANVAS\",\n \"IFRAME\",\n \"EMBED\",\n \"OBJECT\",\n \"INPUT\",\n \"SELECT\",\n \"TEXTAREA\",\n \"BUTTON\",\n \"METER\",\n \"PROGRESS\",\n ]);\n\n const pseudoDraws = (element: Element, type: \"::before\" | \"::after\"): boolean => {\n const style = getComputedStyle(element, type);\n\n return (\n style.content !== \"none\" &&\n style.content !== \"normal\" &&\n style.display !== \"none\" &&\n (draws(style) || !/^(\"\"|'')$/.test(style.content))\n );\n };\n\n /** Whether `element` has its own text on a line box over the point. */\n const textAt = (element: Element, x: number, y: number): boolean => {\n const lines = document.createRange();\n\n for (const child of element.childNodes) {\n if (!(child instanceof Text) || child.data.trim() === \"\") continue;\n lines.selectNodeContents(child);\n for (const rect of lines.getClientRects()) if (contains(rect, x, y)) return true;\n }\n\n return false;\n };\n\n /** Whether `element` itself, not a descendant, paints at the point. */\n const paintsAt = (element: Element, x: number, y: number): boolean =>\n element.checkVisibility?.({ opacityProperty: true, visibilityProperty: true }) !== false &&\n (replaced.has(element.tagName) ||\n element instanceof SVGElement ||\n draws(getComputedStyle(element)) ||\n textAt(element, x, y));\n\n /** The element the pointer would reach at this point, inside open shadow roots. */\n const pointerAt = (x: number, y: number): Element | null => {\n let hit = document.elementFromPoint(x, y);\n\n while (hit?.shadowRoot) {\n const inner = hit.shadowRoot.elementFromPoint(x, y);\n\n if (inner === null || inner === hit) break;\n hit = inner;\n }\n\n return hit;\n };\n\n if (request.classify !== undefined) {\n // `top` is an Element, or a CSSPseudoElement that stands for a ::before or ::after box.\n const pseudo =\n top instanceof Node || typeof top !== \"object\" || top === null\n ? undefined\n : (top as { readonly element?: unknown; readonly type?: unknown });\n\n const origin =\n top instanceof Element\n ? top\n : pseudo?.element instanceof Element\n ? pseudo.element\n : undefined;\n\n const verdictAt = ([x, y]: readonly [number, number]): string => {\n const hit = pointerAt(x, y);\n\n if (hit === null || origin === undefined) return \"unknown\";\n if (pseudo === undefined) {\n if (related(origin, hit)) return \"self\";\n } else {\n // The pointer's own generated box, or one of something inside it.\n if (holds(hit, origin)) return \"self\";\n if (pseudoDraws(origin, pseudo.type === \"::after\" ? \"::after\" : \"::before\"))\n return \"covered\";\n }\n // Every box from the top down to the first one that also holds the pointer's target lies\n // above that target here. Any of them that paints at the point covers it.\n for (\n let node: Node | null = origin;\n node !== null && !holds(node, hit);\n node = parentOf(node)\n )\n if (\n node instanceof Element &&\n contains(node.getBoundingClientRect(), x, y) &&\n paintsAt(node, x, y)\n )\n return \"covered\";\n\n return \"clear\";\n };\n\n return { nodes: [], data: request.classify.map(verdictAt) };\n }\n\n // Boxes of elements that take no pointer events, in the light DOM and open shadow roots.\n // Hit-testing sees through them, so a point beneath one waits for the browser's own answer.\n // `painting` keeps those that draw something of their own, with painting pseudo-elements at an\n // approximated box. The scan has its own budget: an incomplete one leaves every point pending.\n const boxes: Array<{ readonly element: Element; readonly rect: Box }> = [];\n const painting: Array<{ readonly element: Element; readonly rect: Box }> = [];\n let scanned = 0;\n let scanComplete = true;\n\n if (only === undefined && scope === \"viewport\" && document.body !== null) {\n const roots: Array<ParentNode> = [document.body];\n\n for (let root = roots.pop(); root !== undefined && scanComplete; root = roots.pop()) {\n const all = root.querySelectorAll(\"*\");\n\n for (let i = 0; i < all.length; i++) {\n const element = all[i];\n\n if (++scanned > nodeBudget || boxes.length >= 512 || painting.length >= 512) {\n scanComplete = false;\n break;\n }\n if (element === undefined) continue;\n if (element.shadowRoot !== null) roots.push(element.shadowRoot);\n const style = getComputedStyle(element);\n\n if (style.pointerEvents !== \"none\" || style.visibility === \"hidden\") continue;\n if (Number(style.opacity) <= 0) continue;\n const rect = element.getBoundingClientRect();\n\n if (intersects(rect)) {\n boxes.push({ element, rect });\n if (\n replaced.has(element.tagName) ||\n element instanceof SVGElement ||\n draws(style) ||\n [...element.childNodes].some(\n (child) => child instanceof Text && child.data.trim() !== \"\",\n )\n )\n painting.push({ element, rect });\n }\n for (const type of [\"::before\", \"::after\"] as const) {\n if (!pseudoDraws(element, type)) continue;\n const generated = getComputedStyle(element, type);\n let area: Box = rect;\n\n // A positioned pseudo-element is placed from its host's box; others fill it.\n if (\n (generated.position === \"absolute\" || generated.position === \"fixed\") &&\n style.position !== \"static\"\n ) {\n const left = rect.left + (Number.parseFloat(generated.left) || 0);\n const top = rect.top + (Number.parseFloat(generated.top) || 0);\n const across = Number.parseFloat(generated.width) || 0;\n const down = Number.parseFloat(generated.height) || 0;\n\n area = {\n left,\n top,\n right: left + across,\n bottom: top + down,\n width: across,\n height: down,\n };\n }\n if (intersects(area)) {\n boxes.push({ element, rect: area });\n painting.push({ element, rect: area });\n }\n }\n }\n }\n if (!scanComplete) evidence.exhausted = true;\n }\n\n const pending: Array<readonly [number, number]> = [];\n const pendingKeys = new Set<string>();\n let visited = 0;\n\n /** Whether the browser finds `owner` at this point, and how far that can be trusted. */\n const hitTest = (owner: Element, rect: DOMRect): \"self\" | \"covered\" | \"uncertain\" => {\n const x = Math.floor(Math.min(width - 1, Math.max(0, rect.left + rect.width / 2)));\n const y = Math.floor(Math.min(height - 1, Math.max(0, rect.top + rect.height / 2)));\n const hit = pointerAt(x, y);\n\n if (hit === null) return \"uncertain\";\n if (hit !== owner && !owner.contains(hit) && !hit.contains(owner)) return \"covered\";\n\n const over = (layers: ReadonlyArray<{ readonly element: Element; readonly rect: Box }>) =>\n layers.some((layer) => !related(layer.element, owner) && contains(layer.rect, x, y));\n\n if (scanComplete && !over(boxes)) return \"self\";\n const key = `${String(x)},${String(y)}`;\n const verdict = request.verdicts?.[key];\n\n if (verdict === \"self\") return \"self\";\n if (verdict === \"covered\") return \"covered\";\n // Nothing on top paints here; a painting box beneath the top one could still hide it.\n if (verdict === \"clear\") return over(painting) ? \"uncertain\" : \"self\";\n if (request.verdicts === undefined && !pendingKeys.has(key) && pending.length < 256) {\n pendingKeys.add(key);\n pending.push([x, y]);\n }\n\n return \"uncertain\";\n };\n\n const factsOf = (node: Element) => {\n const tag = node.tagName.toLowerCase();\n const role = node.getAttribute(\"role\");\n\n const booleanAttribute = (name: string): boolean | undefined => {\n const value = node.getAttribute(name);\n\n return value === \"true\" ? true : value === \"false\" ? false : undefined;\n };\n\n const isNativeToggle =\n node instanceof HTMLInputElement && (node.type === \"checkbox\" || node.type === \"radio\");\n\n const checked = isNativeToggle\n ? node.type === \"checkbox\" && node.indeterminate\n ? undefined\n : node.checked\n : role !== null &&\n [\"checkbox\", \"radio\", \"switch\", \"menuitemcheckbox\", \"menuitemradio\"].includes(role)\n ? booleanAttribute(\"aria-checked\")\n : undefined;\n\n const selected =\n node instanceof HTMLOptionElement\n ? node.selected\n : !(node instanceof HTMLSelectElement) &&\n role !== null &&\n [\"option\", \"tab\", \"treeitem\", \"row\", \"gridcell\"].includes(role)\n ? booleanAttribute(\"aria-selected\")\n : undefined;\n\n const required =\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement ||\n (node instanceof HTMLInputElement &&\n ![\"hidden\", \"button\", \"submit\", \"reset\", \"image\", \"range\", \"color\"].includes(node.type))\n ? node.required\n : role !== null &&\n [\n \"checkbox\",\n \"combobox\",\n \"gridcell\",\n \"listbox\",\n \"radiogroup\",\n \"spinbutton\",\n \"textbox\",\n \"tree\",\n ].includes(role)\n ? booleanAttribute(\"aria-required\")\n : undefined;\n\n const field =\n node instanceof HTMLInputElement ||\n node instanceof HTMLButtonElement ||\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement\n ? node\n : undefined;\n\n const submits =\n (node instanceof HTMLButtonElement && node.type === \"submit\") ||\n (node instanceof HTMLInputElement && (node.type === \"submit\" || node.type === \"image\"));\n\n // The effective destination: a resolved link target, or where this control submits its\n // form, including a `formaction` override. The browser resolves both against the base URL.\n const form = submits ? field?.form : undefined;\n\n const target =\n node instanceof HTMLAnchorElement || node instanceof HTMLAreaElement\n ? node.href\n : form === undefined || form === null\n ? undefined\n : node.hasAttribute(\"formaction\") && field !== undefined && \"formAction\" in field\n ? field.formAction\n : form.action;\n\n const method =\n form === undefined || form === null\n ? undefined\n : (node.hasAttribute(\"formmethod\") && field !== undefined && \"formMethod\" in field\n ? field.formMethod\n : form.method\n ).toLowerCase();\n\n const disabled = node.matches(\":disabled\") || node.getAttribute(\"aria-disabled\") === \"true\";\n const rect = node.getBoundingClientRect();\n const placement = !intersects(rect) ? \"outside\" : within(rect) ? \"inside\" : \"partial\";\n\n const autocomplete =\n node instanceof HTMLInputElement ||\n node instanceof HTMLSelectElement ||\n node instanceof HTMLTextAreaElement\n ? node.autocomplete\n : \"\";\n\n return {\n kind:\n tag === \"a\"\n ? \"link\"\n : [\"button\", \"input\", \"select\", \"textarea\"].includes(tag)\n ? tag\n : \"other\",\n label: (\n node.getAttribute(\"aria-label\") ??\n node.getAttribute(\"placeholder\") ??\n (node instanceof HTMLInputElement\n ? node.labels?.[0]?.textContent\n : node instanceof HTMLOptionElement\n ? node.label\n : node.textContent) ??\n \"\"\n ).slice(0, 256),\n disabled,\n ...(checked === undefined ? {} : { checked }),\n ...(selected === undefined ? {} : { selected }),\n ...(required === undefined ? {} : { required }),\n ...(node instanceof HTMLSelectElement ? { multiple: node.multiple } : {}),\n editable:\n !disabled &&\n (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement\n ? !node.readOnly\n : node instanceof HTMLSelectElement),\n ...(node instanceof HTMLInputElement || node instanceof HTMLButtonElement\n ? { inputType: node.type.slice(0, 32) }\n : {}),\n ...(autocomplete === \"\" ? {} : { autocomplete: autocomplete.slice(0, 128) }),\n // An over-long destination is left out, never cut: half a URL is a different URL.\n ...(target === undefined || target.length > 2048 ? {} : { destination: target }),\n ...(method === \"get\" || method === \"post\" || method === \"dialog\"\n ? { formMethod: method }\n : {}),\n box: { x: rect.left, y: rect.top, width: rect.width, height: rect.height },\n placement,\n hitTest: placement === \"outside\" ? \"unsampled\" : hitTest(node, rect),\n mainFrame: window.top === window,\n };\n };\n\n if (only !== undefined)\n return {\n nodes: [only],\n data: {\n facts: factsOf(only),\n ...(request.options === undefined\n ? {}\n : {\n attached: only.isConnected && only.ownerDocument === document,\n options: request.options.map(({ node, value }) => ({\n facts: factsOf(node),\n member:\n only instanceof HTMLSelectElement &&\n node instanceof HTMLOptionElement &&\n node.isConnected &&\n node.ownerDocument === document &&\n node.closest(\"select\") === only &&\n only.options.item(node.index) === node,\n valueMatches: node instanceof HTMLOptionElement && node.value === value,\n })),\n }),\n },\n };\n\n const nodes: Array<Element> = [];\n const controls: Array<ReturnType<typeof factsOf>> = [];\n const selectIndices = new Map<HTMLSelectElement, number>();\n\n const candidates = document.querySelectorAll(\n \"a[href],button,input,select,textarea,option,[role=button],[role=checkbox],[role=radio],[role=switch],[role=menuitemcheckbox],[role=menuitemradio],[role=option],[role=tab],[role=treeitem],[role=row],[role=gridcell],[role=textbox],[role=combobox],[role=listbox],[role=radiogroup],[role=spinbutton],[role=tree]\",\n );\n\n let controlsTruncated = false;\n\n for (let i = 0; i < candidates.length; i++) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n controlsTruncated = true;\n break;\n }\n const node = candidates[i];\n\n if (node === undefined) continue;\n const facts = factsOf(node);\n\n const parentSelect = node instanceof HTMLOptionElement ? node.closest(\"select\") : null;\n\n const choice =\n request.choices === true && parentSelect !== null && selectIndices.has(parentSelect);\n\n // A select stays with its choices: it matches through its own label or any option label,\n // and an option is kept only beside the select it belongs to.\n if (needle !== undefined) {\n const kept =\n node instanceof HTMLOptionElement\n ? parentSelect !== null && selectIndices.has(parentSelect)\n : matches(facts.label) ||\n (node instanceof HTMLSelectElement &&\n Array.from(node.options).some((option) => matches(option.label)));\n\n if (!kept) continue;\n }\n\n // Choices of a visible native select are metadata, not evidence of visible dropdown rows.\n // Filter before applying the shared limit so offscreen controls cannot spend it first.\n if (scope === \"viewport\" && !choice && facts.hitTest !== \"self\") {\n if (facts.placement !== \"outside\") evidence.unreachableControls++;\n continue;\n }\n if (nodes.length >= controlLimit) {\n controlsTruncated = true;\n break;\n }\n nodes.push(node);\n controls.push(facts);\n if (node instanceof HTMLSelectElement) selectIndices.set(node, nodes.length - 1);\n }\n\n const selects =\n request.choices === true\n ? [...selectIndices].map(([select, index]) => {\n const options: Array<{ readonly index: number; readonly value: string }> = [];\n\n nodes.forEach((node, optionIndex) => {\n if (\n node instanceof HTMLOptionElement &&\n node.closest(\"select\") === select &&\n select.options.item(node.index) === node\n ) {\n const value = node.value;\n\n if (value.length <= 65536) options.push({ index: optionIndex, value });\n }\n });\n\n return { index, options, optionsTruncated: options.length !== select.options.length };\n })\n : undefined;\n\n const encoder = new TextEncoder();\n let text = \"\";\n let textTruncated = false;\n\n if (scope === \"document\") {\n const whole = document.body?.innerText ?? \"\";\n\n const encoded = encoder.encode(\n needle === undefined\n ? whole\n : whole\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line !== \"\" && matches(line))\n .join(\"\\n\"),\n );\n\n let end = Math.min(encoded.length, maximumBytes);\n\n // Do not manufacture a replacement character by cutting a UTF-8 sequence.\n while (end > 0 && end < encoded.length && ((encoded[end] ?? 0) & 192) === 128) end--;\n text = new TextDecoder().decode(encoded.subarray(0, end));\n textTruncated = end < encoded.length;\n } else if (document.body !== null) {\n const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);\n const range = document.createRange();\n let bytes = 0;\n let lastBottom = Number.NEGATIVE_INFINITY;\n\n // The first laid-out character at or after `index`; collapsed whitespace has no box.\n const boxAt = (node: Text, index: number): DOMRect | undefined => {\n const length = node.data.length;\n\n for (let k = index; k < Math.min(length, index + 8); k++) {\n range.setStart(node, k);\n range.setEnd(node, k + 1);\n const rect = range.getClientRects()[0];\n\n if (rect !== undefined && rect.width + rect.height > 0) return rect;\n }\n\n return undefined;\n };\n\n for (let node = walker.nextNode(); node !== null; node = walker.nextNode()) {\n if (++visited > nodeBudget) {\n evidence.exhausted = true;\n textTruncated = true;\n break;\n }\n const owner = node.parentElement;\n\n if (!(node instanceof Text) || owner === null || node.data.trim() === \"\") continue;\n if ([\"SCRIPT\", \"STYLE\", \"NOSCRIPT\", \"TEMPLATE\"].includes(owner.tagName)) continue;\n if (owner.checkVisibility?.({ opacityProperty: true, visibilityProperty: true }) === false)\n continue;\n range.selectNodeContents(node);\n const lines = [...range.getClientRects()].filter(intersects);\n const first = lines[0];\n\n // Laid out entirely off screen: not evidence of anything, and not counted as hidden.\n if (first === undefined) continue;\n const verdict = hitTest(owner, first);\n\n if (verdict !== \"self\") {\n if (verdict === \"covered\") evidence.coveredText++;\n else evidence.uncertainText++;\n continue;\n }\n range.selectNodeContents(node);\n let visible = node.data;\n\n if (![...range.getClientRects()].every(within)) {\n // Lines run top to bottom, so the visible run is found by bisecting on character boxes\n // rather than by copying a whole node of which one line is on screen.\n const length = node.data.length;\n let low = 0;\n let high = length;\n\n while (low < high) {\n const middle = (low + high) >> 1;\n const rect = boxAt(node, middle);\n\n if (rect === undefined || rect.bottom <= 0) low = middle + 1;\n else high = middle;\n }\n const start = low;\n\n high = length;\n while (low < high) {\n const middle = (low + high) >> 1;\n const rect = boxAt(node, middle);\n\n if (rect !== undefined && rect.top >= height) high = middle;\n else low = middle + 1;\n }\n visible = node.data.slice(start, low);\n evidence.clippedText++;\n }\n const fragment = visible.replace(/\\s+/g, \" \").trim();\n\n if (fragment === \"\" || !matches(fragment)) continue;\n const joined = (text === \"\" ? \"\" : first.top >= lastBottom - 1 ? \"\\n\" : \" \") + fragment;\n const size = encoder.encode(joined).length;\n\n if (bytes + size > maximumBytes) {\n textTruncated = true;\n break;\n }\n text += joined;\n bytes += size;\n lastBottom = Math.max(lastBottom, first.bottom);\n }\n }\n\n return {\n nodes,\n data: {\n text,\n textTruncated,\n controlsTruncated,\n controls,\n viewport: evidence,\n ...(selects === undefined ? {} : { selects }),\n ...(pending.length === 0\n ? {}\n : { pending: { points: pending, scrollX: window.scrollX, scrollY: window.scrollY } }),\n },\n };\n};\n","import { Schema } from \"effect\";\nimport type { ElementHandle, JSHandle, Page } from \"playwright-core\";\n\nimport { ControlFacts, type ObservedElement, type SelectOptions } from \"../../BrowserData.ts\";\nimport { BrowserError, Reasons } from \"../../Errors.ts\";\nimport type { DriverEvents, DriverTarget, NativeCheckpoint, NativeObservation } from \"./Driver.ts\";\nimport { pngGeometry } from \"./Images.ts\";\nimport {\n closeWithin,\n failure,\n NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport type { ObservationScope, ReadTicket, Ticket } from \"./Owner.ts\";\nimport {\n identityOf,\n observedControl,\n PageReadResult,\n PointVerdict,\n readPage,\n stableIdentityOf,\n} from \"./PageRead.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nconst TextResult = Schema.Struct({\n text: Schema.String,\n missing: Schema.Boolean,\n byteLength: Schema.Natural,\n});\n\nconst Geometry = Schema.Struct({ width: Schema.Natural, height: Schema.Natural });\n\nconst checkScreenshotGeometry = (geometry: typeof Geometry.Type) => {\n if (geometry.width < 1) throw failure(Reasons.Malformed.make({ path: \"screenshot.width\" }));\n if (geometry.height < 1) throw failure(Reasons.Malformed.make({ path: \"screenshot.height\" }));\n if (geometry.width > 16384)\n throw failure(\n Reasons.Limit.make({ dimension: \"width\", maximum: 16384, observed: geometry.width }),\n );\n if (geometry.height > 16384)\n throw failure(\n Reasons.Limit.make({ dimension: \"height\", maximum: 16384, observed: geometry.height }),\n );\n const pixels = geometry.width * geometry.height;\n\n if (pixels > 33_554_432)\n throw failure(\n Reasons.Limit.make({ dimension: \"pixels\", maximum: 33_554_432, observed: pixels }),\n );\n};\n\nconst Count = Schema.Natural.check(Schema.isLessThanOrEqualTo(1000000));\n\nconst Facts = Schema.Struct({ facts: ControlFacts });\n\nconst SelectionFacts = Schema.Struct({\n facts: ControlFacts,\n attached: Schema.Boolean,\n options: Schema.Array(\n Schema.Struct({\n facts: ControlFacts,\n member: Schema.Boolean,\n valueMatches: Schema.Boolean,\n }),\n ).check(Schema.isMaxLength(64)),\n});\n\n/** Bounds the page traversal itself, so a huge document costs a bounded read. */\nconst NodeBudget = 20_000;\n\n/** Bounds the browser's own hit test for one reading; past it, pending points stay uncertain. */\nconst ConfirmMillis = 5000;\n\nconst FrameTree = Schema.Struct({\n frameTree: Schema.Struct({ frame: Schema.Struct({ id: Schema.String }) }),\n});\n\nconst Located = Schema.Struct({ backendNodeId: Schema.Int, frameId: Schema.String });\n\nconst Resolved = Schema.Struct({ object: Schema.Struct({ objectId: Schema.String }) });\n\nconst Classified = Schema.Struct({\n result: Schema.Struct({\n value: Schema.Struct({\n data: Schema.Array(Schema.Union([PointVerdict, Schema.Literal(\"unknown\")])).check(\n Schema.isMaxLength(256),\n ),\n }),\n }),\n});\n\n/**\n * Asks the browser which box is on top at each pending point once pointer events are ignored,\n * then has the page judge whether that box paints there. Chromium's own hit test finds boxes the\n * page cannot see, such as those inside closed shadow roots. It runs on a short-lived session of\n * the page's existing connection, reads only, and answers for main-frame boxes; a point whose\n * top box belongs to another frame, or whose answer does not arrive, gets no verdict.\n */\nconst confirmPending = async (\n page: Page,\n pending: NonNullable<PageReadResult[\"pending\"]>,\n check: () => void,\n): Promise<Record<string, PointVerdict>> => {\n const cdp = await page.context().newCDPSession(page);\n const group = \"effect-browser-occlusion\";\n\n try {\n check();\n\n const [tree, ...located] = await Promise.all([\n cdp.send(\"Page.getFrameTree\"),\n ...pending.points.map(([x, y]) =>\n cdp\n .send(\"DOM.getNodeForLocation\", {\n x: x + Math.round(pending.scrollX),\n y: y + Math.round(pending.scrollY),\n ignorePointerEventsNone: true,\n })\n .then((raw) => safeDecode(Located, raw))\n .catch(() => undefined),\n ),\n ]);\n\n check();\n const mainFrame = safeDecode(FrameTree, tree).frameTree.frame.id;\n const byNode = new Map<number, Array<readonly [number, number]>>();\n\n pending.points.forEach((point, index) => {\n const top = located[index];\n\n if (top === undefined || top.frameId !== mainFrame) return;\n byNode.set(top.backendNodeId, [...(byNode.get(top.backendNodeId) ?? []), point]);\n });\n\n const answers = await Promise.all(\n [...byNode].map(async ([backendNodeId, points]) => {\n try {\n const { object } = safeDecode(\n Resolved,\n await cdp.send(\"DOM.resolveNode\", { backendNodeId, objectGroup: group }),\n );\n\n check();\n\n const { result } = safeDecode(\n Classified,\n await cdp.send(\"Runtime.callFunctionOn\", {\n functionDeclaration: String(readPage),\n objectId: object.objectId,\n arguments: [\n {\n value: {\n scope: \"viewport\",\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: 0,\n classify: points,\n },\n },\n { objectId: object.objectId },\n ],\n returnByValue: true,\n }),\n );\n\n return points.map((point, index) => [point, result.value.data[index]] as const);\n } catch {\n return [];\n }\n }),\n );\n\n check();\n const verdicts: Record<string, PointVerdict> = {};\n\n for (const [[x, y], verdict] of answers.flat())\n if (verdict !== undefined && verdict !== \"unknown\")\n verdicts[`${String(x)},${String(y)}`] = verdict;\n\n return verdicts;\n } finally {\n await closeWithin(() => cdp.send(\"Runtime.releaseObjectGroup\", { objectGroup: group })).catch(\n () => {},\n );\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n};\n\n/** A host's own decision about one control, made on facts read from the page just now. */\nexport type AdmissionPolicy = (facts: ControlFacts) => boolean;\n\n/**\n * A node's private state after a form step: its value, checked state or selected option values.\n * It is compared on the host and never leaves it. Runs inside the page, so it is self-contained.\n */\nconst privateState = (node: Element): string | null => {\n if (!node.isConnected || node.ownerDocument !== document) return null;\n const role = node.getAttribute(\"role\");\n\n if (node instanceof HTMLInputElement && (node.type === \"checkbox\" || node.type === \"radio\"))\n return JSON.stringify([\"checked\", node.checked]);\n if (node instanceof HTMLInputElement || node instanceof HTMLTextAreaElement)\n return JSON.stringify([\"value\", node.value]);\n if (node instanceof HTMLSelectElement)\n return JSON.stringify([\"options\", Array.from(node.selectedOptions, (option) => option.value)]);\n if (\n role !== null &&\n [\"checkbox\", \"radio\", \"switch\", \"menuitemcheckbox\", \"menuitemradio\"].includes(role)\n )\n return JSON.stringify([\"checked\", node.getAttribute(\"aria-checked\") === \"true\"]);\n if (node instanceof HTMLElement && node.isContentEditable)\n return JSON.stringify([\"text\", node.textContent ?? \"\"]);\n\n return JSON.stringify([\"other\"]);\n};\n\n/**\n * Reads that private state once. A node that is gone, or a document that navigated away while it\n * was read, reads as unknown: after a dispatched step this never becomes a failure of its own.\n */\nexport const readFieldState = async (\n element: ElementHandle<Element>,\n): Promise<string | undefined> => {\n try {\n const value: unknown = await element.evaluate(privateState);\n\n return typeof value === \"string\" ? value : undefined;\n } catch {\n return undefined;\n }\n};\n\n/** Whether a private state says a toggle ended checked, or unchecked, as it was asked to. */\nexport const holdsChecked = (state: string | undefined, checked: boolean): boolean =>\n state === JSON.stringify([\"checked\", checked]);\n\ninterface Retained {\n readonly handle: ElementHandle<Element>;\n /** What made this control the one that was inspected; see `identityOf`. */\n readonly identity: string;\n /** The same without enablement, for form steps; see `stableIdentityOf`. */\n readonly stable: string;\n readonly multiple?: boolean;\n /** The submitted value is retained privately and never appears in a control or receipt. */\n readonly option?: { readonly selectElementId: string; readonly value: string };\n leases: number;\n retired: boolean;\n disposal?: Promise<void>;\n}\n\n/**\n * `suspended` is a page hold: the nodes are kept but none may be acted on until it is checked\n * again, one node at a time. Anything else that could change the page makes it `invalid`.\n */\ninterface Snapshot {\n readonly id: string;\n readonly target: DriverTarget;\n readonly documentEpoch: number;\n readonly generation: number;\n validity: \"reading\" | \"valid\" | \"suspended\" | \"invalid\";\n readonly nodes: Map<string, Retained>;\n readonly revalidated: Set<string>;\n}\n\n/**\n * What is read from the selected document, and the one retained observation whose nodes a later\n * action may name. That observation is valid only until the next invalidating event.\n */\nexport const makeObservation = (\n targets: Targets,\n /** Observation ids from an earlier connection never name this one's nodes. */\n connectionNamespace: string,\n events: DriverEvents,\n) => {\n const { current } = targets;\n let observation: Snapshot | undefined;\n let observationSerial = 0;\n let connectionRetired = false;\n\n const invalidate = (scope: ObservationScope = \"all\") => {\n if (\n observation !== undefined &&\n scope !== \"none\" &&\n (scope === \"all\" ||\n (scope.pageId === observation.target.pageId &&\n (scope.frameId === undefined || scope.frameId === observation.target.frameId)))\n )\n observation.validity = \"invalid\";\n };\n\n /**\n * A read is ordered against document replacement by failing: if the document it was reading\n * was replaced underneath it, or a navigation is still in flight on its page, the native error\n * is `target-changed` and `undispatched`, so a caller knows to read again. A read is never a\n * mutation, so reading again is always safe.\n */\n const reading = async <A>(body: () => Promise<A>, target?: DriverTarget): Promise<A> => {\n const { entry, frame } = current(target);\n const epoch = targets.epochOf(frame);\n\n try {\n return await body();\n } catch (error) {\n // A fenced ticket and a failure with its own reason already say what happened. Only an\n // unexplained native error is explained by the document having gone.\n const unexplained =\n !Schema.is(BrowserError)(error) &&\n (!Schema.is(NativeFailure)(error) || error.reason._tag === \"Provider\");\n\n if (unexplained && (targets.epochOf(frame) !== epoch || targets.navigating.has(entry.id)))\n throw failure(Reasons.TargetChanged.make({}), \"undispatched\");\n throw error;\n }\n };\n\n const changed = (\n reason: Parameters<DriverEvents[\"invalidate\"]>[0],\n scope: ObservationScope = \"all\",\n ) => {\n invalidate(scope);\n events.invalidate(reason, scope);\n };\n\n /**\n * Holding or resuming a page may run its `freeze` and `resume` handlers, so nothing observed\n * on it may be acted on unchecked. Another page's observation is untouched: a stage hold is\n * independent of the page an agent is driving.\n */\n const held = (pageId: string) => {\n if (observation?.target.pageId === pageId) {\n if (observation.validity === \"reading\") observation.validity = \"invalid\";\n else if (observation.validity === \"valid\") {\n observation.validity = \"suspended\";\n observation.revalidated.clear();\n }\n }\n };\n\n const disposeNode = (node: Retained): Promise<void> =>\n connectionRetired\n ? Promise.resolve()\n : (node.disposal ??= Promise.resolve().then(() =>\n connectionRetired ? undefined : node.handle.dispose(),\n ));\n\n const retireNode = (node: Retained): Promise<void> => {\n node.retired = true;\n\n return node.leases === 0 ? disposeNode(node) : Promise.resolve();\n };\n\n const dispose = async () => {\n const old = observation;\n\n observation = undefined;\n if (old !== undefined) {\n old.validity = \"invalid\";\n await closeWithin(() => Promise.allSettled([...old.nodes.values()].map(retireNode)));\n }\n };\n\n const exactElement = async (\n selector: string,\n ticket: Ticket,\n target?: DriverTarget,\n ): Promise<ElementHandle<Element>> => {\n ticket.check();\n\n const holder = await current(target).frame.evaluateHandle((requested) => {\n try {\n const matches = document.querySelectorAll(requested);\n\n return { count: matches.length, node: matches.length === 1 ? matches[0] : null };\n } catch {\n return { count: 0, node: null };\n }\n }, selector);\n\n let node: JSHandle | undefined;\n\n try {\n const countHandle = await holder.getProperty(\"count\");\n let count: number;\n\n try {\n count = safeDecode(Count, await countHandle.jsonValue());\n } finally {\n await countHandle.dispose();\n }\n ticket.check();\n if (count !== 1)\n throw failure(\n count === 0 ? Reasons.NotFound.make({}) : Reasons.Ambiguous.make({}),\n \"undispatched\",\n );\n node = await holder.getProperty(\"node\");\n const element = node.asElement();\n\n if (element === null) throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n\n return element;\n } catch (error) {\n await node?.dispose().catch(() => {});\n throw error;\n } finally {\n await holder.dispose();\n }\n };\n\n /** Selection can move away and back; the original document and snapshot cannot be replaced. */\n const checkSnapshot = (snapshot: Snapshot, ticket: ReadTicket): void => {\n ticket.check();\n if (\n observation !== snapshot ||\n snapshot.generation !== ticket.generation ||\n snapshot.validity === \"invalid\"\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const selected = targets.selected();\n\n if (\n selected.pageId !== snapshot.target.pageId ||\n selected.frameId !== snapshot.target.frameId ||\n targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n /** A retained node is only as current as the observation that produced it. */\n const retained = (target: ObservedElement, ticket: ReadTicket, allowSuspended = false) => {\n const snapshot = observation;\n\n if (snapshot === undefined || snapshot.id !== target.observationId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const node = snapshot.nodes.get(target.elementId);\n\n if (node === undefined) throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n const check = (): void => {\n checkSnapshot(snapshot, ticket);\n\n const usable =\n snapshot.validity === \"valid\" ||\n (snapshot.validity === \"suspended\" &&\n (allowSuspended || snapshot.revalidated.has(target.elementId)));\n\n if (!usable || snapshot.nodes.get(target.elementId) !== node)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n check();\n\n return { node, snapshot, check };\n };\n\n /**\n * A wait borrows one exact node without authorizing input. Its state may change. Retiring the\n * observation defers this node's disposal until the native wait actually releases the lease.\n */\n const lease = (reference: ObservedElement, ticket: ReadTicket) => {\n const { node, snapshot } = retained(reference, ticket);\n\n node.leases++;\n let released: Promise<void> | undefined;\n\n return {\n element: node.handle,\n check: () => {\n ticket.check();\n if (\n connectionRetired ||\n observation !== snapshot ||\n snapshot.validity === \"invalid\" ||\n targets.epochOf(current(snapshot.target).frame) !== snapshot.documentEpoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n },\n release: (): Promise<void> => {\n released ??= (async () => {\n node.leases--;\n if (node.retired && node.leases === 0) await disposeNode(node);\n })();\n\n return released;\n },\n };\n };\n\n /**\n * Read from the exact node, never re-resolved from a selector or a label. It is the same page\n * function an observation uses, told to read one node and traverse nothing.\n */\n const sampleFacts = async (\n element: ElementHandle<Element>,\n check: () => void,\n target?: DriverTarget,\n options?: ReadonlyArray<{ readonly node: ElementHandle<Element>; readonly value: string }>,\n ): Promise<unknown> => {\n check();\n\n const holder = await current(target).frame.evaluateHandle(readPage, {\n scope: \"document\" as const,\n maximumBytes: 0,\n controlLimit: 0,\n nodeBudget: 0,\n only: element,\n ...(options === undefined ? {} : { options }),\n });\n\n try {\n check();\n const raw = await holder.evaluate((read) => read.data);\n\n check();\n\n return raw;\n } finally {\n await holder.dispose();\n }\n };\n\n /**\n * The exact attached node a target names, checked against the page right now. A selector must\n * still match it and nothing else. A retained node must still be the control that was\n * inspected: the same node with a different destination, type or label is not. A host policy\n * then decides on those fresh facts, and a refusal or a policy that throws sends nothing.\n * `enablement` is for form steps only: the control may have become enabled since it was\n * observed, and it must be enabled now; every other fact must be unchanged.\n */\n const resolve = async (\n target: string | ObservedElement,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n allowSuspended = false,\n browserTarget?: DriverTarget,\n enablement = false,\n ): Promise<{\n readonly element: ElementHandle<Element>;\n readonly kept: boolean;\n readonly check: () => void;\n readonly facts: ControlFacts | undefined;\n }> => {\n const kept = typeof target !== \"string\";\n\n const retainedNode =\n typeof target === \"string\" ? undefined : retained(target, ticket, allowSuspended);\n\n const node = retainedNode?.node;\n const resolvedTarget = retainedNode?.snapshot.target ?? browserTarget;\n const check = retainedNode?.check ?? (() => ticket.check());\n\n const element =\n typeof target === \"string\" ? await exactElement(target, ticket, browserTarget) : node?.handle;\n\n if (element === undefined) throw failure(Reasons.Stale.make({}), \"undispatched\");\n let facts: ControlFacts | undefined;\n\n try {\n check();\n\n const select =\n node?.option === undefined\n ? undefined\n : retainedNode?.snapshot.nodes.get(node.option.selectElementId)?.handle;\n\n const attached: unknown = await element.evaluate(\n (candidate, { selector, selection }) => {\n if (!candidate.isConnected || candidate.ownerDocument !== document) return false;\n if (\n selection !== undefined &&\n (!(candidate instanceof HTMLOptionElement) ||\n !(selection.select instanceof HTMLSelectElement) ||\n !selection.select.isConnected ||\n candidate.closest(\"select\") !== selection.select ||\n selection.select.options.item(candidate.index) !== candidate ||\n candidate.value !== selection.value)\n )\n return false;\n if (selector === undefined) return true;\n const matches = candidate.ownerDocument.querySelectorAll(selector);\n\n return matches.length === 1 && matches[0] === candidate;\n },\n {\n selector: typeof target === \"string\" ? target : undefined,\n selection:\n select === undefined || node?.option === undefined\n ? undefined\n : { select, value: node.option.value },\n },\n );\n\n check();\n if (attached !== true) throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (node !== undefined || policy !== undefined) {\n facts = safeDecode(Facts, await sampleFacts(element, check, resolvedTarget)).facts;\n\n check();\n if (\n node !== undefined &&\n (enablement\n ? stableIdentityOf(facts) !== node.stable\n : identityOf(facts) !== node.identity)\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (enablement && facts.disabled) throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (policy !== undefined) {\n let admitted = false;\n\n try {\n admitted = policy(facts) === true;\n } catch {\n admitted = false;\n }\n if (!admitted) throw failure(Reasons.Denied.make({}), \"undispatched\");\n }\n }\n check();\n\n return { element, kept, check, facts };\n } catch (error) {\n if (!kept) await closeWithin(() => element.dispose()).catch(() => {});\n check();\n throw error;\n }\n };\n\n /** Validate all options in one fresh page read, while keeping the original exact handles. */\n const selectOptions = async (\n target: ObservedElement,\n ids: SelectOptions,\n element: ElementHandle<Element>,\n ticket: Ticket,\n enablement = false,\n ) => {\n const same = (facts: ControlFacts, node: Retained) =>\n enablement ? stableIdentityOf(facts) === node.stable : identityOf(facts) === node.identity;\n\n const select = retained(target, ticket);\n\n if (select.node.handle !== element) throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (select.node.multiple === undefined)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n\n const options = ids.map((elementId) => {\n const option = retained({ observationId: target.observationId, elementId }, ticket);\n const identity = option.node.option;\n\n if (identity === undefined || identity.selectElementId !== target.elementId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return { ...option, value: identity.value };\n });\n\n const check = () => {\n select.check();\n for (const option of options) option.check();\n };\n\n const fresh = safeDecode(\n SelectionFacts,\n await sampleFacts(\n element,\n check,\n select.snapshot.target,\n options.map((option) => ({ node: option.node.handle, value: option.value })),\n ),\n );\n\n check();\n if (!fresh.attached || !same(fresh.facts, select.node))\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n if (fresh.options.length !== options.length)\n throw failure(Reasons.Malformed.make({}), \"undispatched\");\n for (const [index, sampled] of fresh.options.entries()) {\n const option = options[index];\n\n if (\n option === undefined ||\n !sampled.member ||\n !sampled.valueMatches ||\n !same(sampled.facts, option.node)\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n }\n if (fresh.facts.disabled || fresh.options.some((option) => option.facts.disabled))\n throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (fresh.facts.multiple !== true && ids.length > 1)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n check();\n\n return {\n handles: options.map((option) => option.node.handle),\n values: options.map((option) => option.value),\n };\n };\n\n const controlFacts = (target: ObservedElement, ticket: Ticket) =>\n sanitize(async () => {\n const { facts, check } = await resolve(target, ticket);\n\n check();\n if (facts === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n\n return facts;\n });\n\n /**\n * Current private states of this observation's own nodes, read without an identity check: a\n * form's own steps may have changed exactly what identity compares. A retired observation or a\n * replaced document still fails stale, and a detached node reads as absent.\n */\n const formState = (references: ReadonlyArray<ObservedElement>, ticket: Ticket) =>\n sanitize(async () => {\n const states: Array<string | undefined> = [];\n\n for (const reference of references) {\n const leased = lease(reference, ticket);\n\n try {\n leased.check();\n states.push(await readFieldState(leased.element));\n leased.check();\n } finally {\n await leased.release();\n }\n }\n\n return states;\n });\n\n /** After a hold, one node at a time: still attached, and still the control inspected. */\n const revalidate = (target: ObservedElement, ticket: Ticket) =>\n sanitize(async () => {\n const snapshot = observation;\n const { check } = await resolve(target, ticket, undefined, true);\n\n check();\n if (snapshot === undefined || snapshot !== observation)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n snapshot.revalidated.add(target.elementId);\n });\n\n const readText = (\n selector: string | undefined,\n maximumBytes: number,\n ticket: Ticket,\n target?: DriverTarget,\n ) =>\n sanitize(async () => {\n ticket.check();\n\n const raw: unknown = await reading(\n () =>\n current(target).frame.evaluate(\n ({ selector, maximumBytes }) => {\n const element =\n selector === undefined ? document.body : document.querySelector(selector);\n\n if (element === null) return { text: \"\", missing: true, byteLength: 0 };\n\n const text =\n element instanceof HTMLElement ? element.innerText : (element.textContent ?? \"\");\n\n const byteLength = new TextEncoder().encode(text).length;\n\n return { text: byteLength > maximumBytes ? \"\" : text, missing: false, byteLength };\n },\n { selector, maximumBytes },\n ),\n target,\n );\n\n ticket.check();\n const value = safeDecode(TextResult, raw);\n\n if (value.missing) throw failure(Reasons.NotFound.make({}));\n const observedBytes = Math.max(value.byteLength, new TextEncoder().encode(value.text).length);\n\n if (observedBytes > maximumBytes)\n throw failure(\n Reasons.Limit.make({ dimension: \"text\", maximum: maximumBytes, observed: observedBytes }),\n );\n\n return value.text;\n });\n\n /** One pass of the page reader over the selected frame, and the node handles it names. */\n const readOnce = async (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n check: () => void,\n keepNodes: boolean,\n target: DriverTarget | undefined,\n match: string | undefined,\n verdicts: Record<string, PointVerdict> | undefined,\n ) => {\n check();\n\n const holder = await current(target).frame.evaluateHandle(readPage, {\n scope,\n maximumBytes,\n controlLimit,\n nodeBudget: NodeBudget,\n choices: keepNodes,\n ...(match === undefined ? {} : { match }),\n ...(verdicts === undefined ? {} : { verdicts }),\n });\n\n const handles: Array<ElementHandle<Element>> = [];\n let nodesHandle: JSHandle | undefined;\n // A hosted page can take hundreds of milliseconds to answer each call, so a reading makes a\n // fixed number of them: one for the data, and one for every node handle at once.\n let spare: Array<JSHandle> = [];\n\n try {\n let data: PageReadResult;\n\n try {\n check();\n const raw = await holder.evaluate((read) => read.data);\n\n check();\n data = safeDecode(PageReadResult, raw);\n check();\n const textBytes = new TextEncoder().encode(data.text).length;\n\n if (textBytes > maximumBytes)\n throw failure(\n Reasons.Limit.make({ dimension: \"text\", maximum: maximumBytes, observed: textBytes }),\n );\n if (data.controls.length > controlLimit)\n throw failure(\n Reasons.Limit.make({\n dimension: \"controls\",\n maximum: controlLimit,\n observed: data.controls.length,\n }),\n );\n if (keepNodes) {\n nodesHandle = await holder.evaluateHandle((read) => read.nodes);\n check();\n const nodes = await nodesHandle.getProperties();\n\n spare = [...nodes.values()];\n check();\n const picked: Array<ElementHandle<Element>> = [];\n\n for (let i = 0; i < data.controls.length; i++) {\n const element = nodes.get(String(i))?.asElement() ?? null;\n\n if (element === null) throw failure(Reasons.Malformed.make({}));\n // Playwright types every property handle as `any`. readPage stores only Elements\n // under `nodes`, and asElement() has already rejected any other value.\n // oxlint-disable-next-line typescript/no-unsafe-argument -- untyped Playwright handle\n picked.push(element);\n }\n const kept = new Set<JSHandle>(picked);\n\n spare = spare.filter((node) => !kept.has(node));\n handles.push(...picked);\n }\n } finally {\n await closeWithin(() => Promise.allSettled(spare.map((node) => node.dispose()))).catch(\n () => {},\n );\n await nodesHandle?.dispose().catch(() => {});\n await holder.dispose();\n }\n check();\n\n return { data, handles };\n } catch (error) {\n // Ownership transfers only after wrapper release succeeds and the snapshot is rechecked.\n await closeWithin(() => Promise.allSettled(handles.map((handle) => handle.dispose()))).catch(\n () => {},\n );\n check();\n throw error;\n }\n };\n\n /**\n * One bounded read of the selected frame, and the node handles it names, in order. A viewport\n * read of the main frame that left points pending asks the browser about them and reads once\n * more with its answers; if that fails, the first reading stands, pending points uncertain.\n */\n const read = async (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n check: () => void,\n keepNodes: boolean,\n target?: DriverTarget,\n match?: string,\n ) => {\n const first = await readOnce(\n scope,\n maximumBytes,\n controlLimit,\n check,\n keepNodes,\n target,\n match,\n undefined,\n );\n\n const pending = first.data.pending;\n const { entry, frame } = current(target);\n\n if (pending === undefined || frame !== entry.page.mainFrame()) return first;\n let verdicts: Record<string, PointVerdict> | undefined;\n\n await closeWithin(async () => {\n verdicts = await confirmPending(entry.page, pending, check);\n }, ConfirmMillis).catch(() => {});\n check();\n if (verdicts === undefined || Object.keys(verdicts).length === 0) return first;\n await closeWithin(() =>\n Promise.allSettled(first.handles.map((handle) => handle.dispose())),\n ).catch(() => {});\n\n return readOnce(scope, maximumBytes, controlLimit, check, keepNodes, target, match, verdicts);\n };\n\n const observe = (\n scope: \"document\" | \"viewport\",\n maximumBytes: number,\n controlLimit: number,\n ticket: Ticket,\n match?: string,\n ) =>\n sanitize(async () => {\n ticket.check();\n await dispose();\n ticket.check();\n const target = targets.selected();\n\n const snapshot: Snapshot = {\n id: `observation-${connectionNamespace}-${++observationSerial}`,\n target,\n documentEpoch: targets.epochOf(current(target).frame),\n generation: ticket.generation,\n validity: \"reading\",\n nodes: new Map(),\n revalidated: new Set(),\n };\n\n // Own-page events must also retire a read whose native handles have not arrived yet.\n observation = snapshot;\n let handles: Array<ElementHandle<Element>> = [];\n\n try {\n const sampled = await reading(\n () =>\n read(\n scope,\n maximumBytes,\n controlLimit,\n () => checkSnapshot(snapshot, ticket),\n true,\n target,\n match,\n ),\n target,\n );\n\n handles = sampled.handles;\n checkSnapshot(snapshot, ticket);\n const { data } = sampled;\n const selects = new Map<number, boolean>();\n const options = new Map<number, NonNullable<Retained[\"option\"]>>();\n\n for (const select of data.selects ?? []) {\n if (selects.has(select.index) || data.controls[select.index]?.multiple === undefined)\n throw failure(Reasons.Malformed.make({}));\n selects.set(select.index, select.optionsTruncated);\n for (const option of select.options) {\n if (options.has(option.index) || data.controls[option.index]?.selected === undefined)\n throw failure(Reasons.Malformed.make({}));\n options.set(option.index, {\n selectElementId: `element-${select.index}`,\n value: option.value,\n });\n }\n }\n\n // One handle per control, in the order the page returned them.\n handles.forEach((handle, i) => {\n const facts = data.controls[i];\n\n if (facts !== undefined) {\n const option = options.get(i);\n\n snapshot.nodes.set(`element-${i}`, {\n handle,\n identity: identityOf(facts),\n stable: stableIdentityOf(facts),\n leases: 0,\n retired: false,\n ...(facts.multiple === undefined ? {} : { multiple: facts.multiple }),\n ...(option === undefined ? {} : { option }),\n });\n }\n });\n if (snapshot.nodes.size !== data.controls.length) throw failure(Reasons.Malformed.make({}));\n\n const result: NativeObservation = {\n observationId: snapshot.id,\n scope,\n ...(match === undefined ? {} : { match }),\n url: targets.url(target),\n text: data.text,\n textTruncated: data.textTruncated,\n controlsTruncated: data.controlsTruncated,\n controls: data.controls.map((facts, i) => {\n const option = options.get(i);\n const optionsTruncated = selects.get(i);\n\n return observedControl(facts, `element-${i}`, {\n ...(option === undefined ? {} : { selectElementId: option.selectElementId }),\n ...(optionsTruncated === undefined ? {} : { optionsTruncated }),\n });\n }),\n viewport: data.viewport,\n };\n\n checkSnapshot(snapshot, ticket);\n snapshot.validity = \"valid\";\n\n return result;\n } catch (error) {\n snapshot.validity = \"invalid\";\n if (observation === snapshot) observation = undefined;\n await closeWithin(() =>\n Promise.allSettled(handles.map((handle) => handle.dispose())),\n ).catch(() => {});\n throw error;\n }\n });\n\n const screenshot = (\n fullPage: boolean,\n maximumBytes: number,\n ticket: Ticket,\n target?: DriverTarget,\n ) =>\n sanitize(() =>\n reading(async () => {\n const page = current(target).entry.page;\n\n ticket.check();\n\n const raw: unknown = await page.evaluate(\n (full) => ({\n width: full\n ? Math.max(document.documentElement.scrollWidth, window.innerWidth)\n : window.innerWidth,\n height: full\n ? Math.max(document.documentElement.scrollHeight, window.innerHeight)\n : window.innerHeight,\n }),\n fullPage,\n );\n\n const geometry = safeDecode(Geometry, raw);\n\n checkScreenshotGeometry(geometry);\n ticket.check();\n\n const bytes: unknown = await page.screenshot({\n type: \"png\",\n fullPage,\n scale: \"css\",\n timeout: timeout(ticket),\n });\n\n if (!(bytes instanceof Uint8Array)) throw failure(Reasons.Malformed.make({}));\n if (bytes.length > maximumBytes)\n throw failure(\n Reasons.Limit.make({\n dimension: \"returned-bytes\",\n maximum: maximumBytes,\n observed: bytes.length,\n }),\n );\n const actual = pngGeometry(bytes);\n\n checkScreenshotGeometry(actual);\n ticket.check();\n\n return new Uint8Array(bytes);\n }, target),\n );\n\n /**\n * Passive: it reads what is on screen and takes a picture, keeps no node, and leaves the\n * retained observation exactly as it was. Text and picture are sampled one after the other,\n * so a document replaced in between is reported rather than hidden.\n */\n const checkpoint = (\n maximumBytes: number,\n controlLimit: number,\n pictureBytes: number | undefined,\n ticket: Ticket,\n ) =>\n sanitize(async () => {\n ticket.check();\n const { frame } = current();\n const epoch = targets.epochOf(frame);\n\n const { data } = await reading(() =>\n read(\"viewport\", maximumBytes, controlLimit, () => ticket.check(), false),\n );\n\n const picture =\n pictureBytes === undefined ? undefined : await screenshot(false, pictureBytes, ticket);\n\n const result: NativeCheckpoint = {\n url: targets.selectedUrl(),\n text: data.text,\n textTruncated: data.textTruncated,\n controls: data.controls,\n controlsTruncated: data.controlsTruncated,\n viewport: data.viewport,\n ...(picture === undefined ? {} : { picture }),\n documentChanged: targets.epochOf(frame) !== epoch,\n };\n\n return result;\n });\n\n return {\n invalidate,\n changed,\n held,\n dispose,\n lease,\n retireConnection: () => {\n connectionRetired = true;\n const old = observation;\n\n observation = undefined;\n if (old !== undefined) {\n old.validity = \"invalid\";\n for (const node of old.nodes.values()) node.retired = true;\n }\n },\n resolve,\n selectOptions,\n controlFacts,\n formState,\n revalidate,\n readText,\n observe,\n screenshot,\n checkpoint,\n };\n};\n\nexport type Observation = ReturnType<typeof makeObservation>;\n","import { Schema } from \"effect\";\nimport type {\n BrowserContext,\n Download,\n ElementHandle,\n FileChooser,\n Frame,\n Page,\n} from \"playwright-core\";\n\nimport {\n type ControlFacts,\n type InputReceipt,\n type ObservedElement,\n SafeFilename,\n} from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type {\n Driver,\n DriverTarget,\n InputCapture,\n NativeFileSelection,\n NavigationControl,\n} from \"./Driver.ts\";\nimport {\n closeWithin,\n failure,\n type NativeFailure,\n safeDecode,\n sanitize,\n timeout,\n} from \"./NativeCalls.ts\";\nimport {\n type AdmissionPolicy,\n holdsChecked,\n type Observation,\n readFieldState,\n} from \"./Observation.ts\";\nimport type { Ticket, WaitTicket } from \"./Owner.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\n/**\n * What Playwright's own input would refuse only after dispatch, checked before it: a node it\n * would wait for until the deadline, or text it would not put into this control. Either way the\n * wait or the thrown error would be an unknown outcome that fences the owner. It mirrors\n * Playwright's visible, enabled and editable checks and its fill rules for the control and text.\n * Runs in the page, so it is self-contained.\n */\nconst inputRefusal = (\n node: Element,\n text: string | undefined,\n): \"not-visible\" | \"disabled\" | \"unsupported\" | null => {\n const style = getComputedStyle(node);\n\n if (style.display !== \"contents\") {\n const rect = node.getBoundingClientRect();\n\n if (\n (\"checkVisibility\" in node && !node.checkVisibility()) ||\n style.visibility !== \"visible\" ||\n !(rect.width > 0 && rect.height > 0)\n )\n return \"not-visible\";\n }\n if (node.matches(\":disabled\") || node.getAttribute(\"aria-disabled\") === \"true\") return \"disabled\";\n if (text === undefined) return null;\n if (node instanceof HTMLInputElement) {\n const type = node.type.toLowerCase();\n const assigned = [\"color\", \"date\", \"time\", \"datetime-local\", \"month\", \"range\", \"week\"];\n const typed = [\"\", \"email\", \"number\", \"password\", \"search\", \"tel\", \"text\", \"url\"];\n\n if (node.readOnly || (!typed.includes(type) && !assigned.includes(type))) return \"unsupported\";\n if (type === \"number\" && Number.isNaN(Number(text.trim()))) return \"unsupported\";\n if (assigned.includes(type)) {\n // A fresh detached control with the same constraints shows whether this one would keep\n // the value; nothing is written to the page's own node or announced to the page.\n const probe = document.createElement(\"input\");\n const value = type === \"color\" ? text.trim().toLowerCase() : text.trim();\n\n probe.type = type;\n for (const name of [\"min\", \"max\", \"step\"]) {\n const constraint = node.getAttribute(name);\n\n if (constraint !== null) probe.setAttribute(name, constraint);\n }\n probe.value = value;\n if (probe.value !== value) return \"unsupported\";\n }\n\n return null;\n }\n if (node instanceof HTMLTextAreaElement) return node.readOnly ? \"unsupported\" : null;\n\n return node instanceof HTMLElement && node.isContentEditable ? null : \"unsupported\";\n};\n\n/**\n * Lets the page's own handlers run after a form step: two animation frames when the page renders\n * them, then `millis`. A hidden page renders no frames, so the host bounds the wait as well; the\n * wait is never a failure of a step that already dispatched. Runs in the page.\n */\nconst settleInPage = (_node: Element, millis: number) =>\n new Promise<void>((resolve) => {\n let rendered = false;\n let elapsed = false;\n\n const finish = () => {\n if (rendered && elapsed) resolve();\n };\n\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n rendered = true;\n finish();\n }),\n );\n setTimeout(() => {\n elapsed = true;\n finish();\n }, millis);\n });\n\n/** A step that already dispatched reads back within a bounded wait, and never fails for it. */\nconst bounded = async <A>(work: Promise<A>, millis: number, fallback: A): Promise<A> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n void work.catch(() => {});\n\n try {\n return await Promise.race([\n work.catch(() => fallback),\n new Promise<A>((resolve) => {\n timer = setTimeout(() => resolve(fallback), Math.max(0, millis));\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n};\n\nexport const waitEvent = <A>(\n add: (listener: (value: A) => void) => void,\n remove: (listener: (value: A) => void) => void,\n ticket: Ticket,\n accepts: (value: A) => boolean = () => true,\n) => {\n let done = false;\n let resolve: (value: A) => void = () => {};\n let reject: (error: NativeFailure) => void = () => {};\n\n const promise = new Promise<A>((yes, no) => {\n resolve = yes;\n reject = no;\n });\n\n // Attach a rejection observer immediately, even while the action is still running.\n void promise.catch(() => {});\n\n const cleanup = () => {\n remove(listener);\n ticket.signal.removeEventListener(\"abort\", abort);\n clearTimeout(timer);\n };\n\n const abort = () => {\n if (!done) {\n done = true;\n cleanup();\n reject(failure(Reasons.Interrupted.make({})));\n }\n };\n\n const listener = (value: A) => {\n if (!done && accepts(value)) {\n done = true;\n cleanup();\n resolve(value);\n }\n };\n\n const timer = setTimeout(() => {\n if (!done) {\n done = true;\n cleanup();\n reject(failure(Reasons.Timeout.make({})));\n }\n }, ticket.remainingMillis());\n\n add(listener);\n ticket.signal.addEventListener(\"abort\", abort, { once: true });\n if (ticket.signal.aborted) abort();\n\n return { promise, cancel: abort };\n};\n\ninterface NavigationStopPort {\n readonly stop: () => Promise<void>;\n readonly close: () => Promise<void>;\n}\n\n/**\n * Native stop setup may yield while the navigation completes. Recheck its owner immediately\n * before dispatch, while the caller still holds the browser-owner permit.\n */\nexport const dispatchNavigationStop = async (\n ticket: Ticket,\n pending: () => boolean,\n onDispatch: () => void,\n open: () => Promise<NavigationStopPort>,\n retainSetup: () => () => void,\n): Promise<\"dispatched\" | \"settled\"> => {\n ticket.check();\n const retired = retainSetup();\n let port: NavigationStopPort | undefined;\n\n try {\n port = await open();\n ticket.check();\n if (!pending()) return \"settled\";\n // No await may separate this admission check from dispatch.\n ticket.check();\n ticket.dispatch();\n onDispatch();\n await port.stop();\n ticket.check();\n\n return \"dispatched\";\n } finally {\n // The owner's Effect bounds the caller's wait. A timeout or rejection of native detach\n // does not prove retirement and must not allow another setup to consume this slot.\n if (port !== undefined) await port.close();\n retired();\n }\n};\n\n/**\n * In-memory bytes and provider-stored paths reach the page by different mechanisms and are\n * never mixed: the first is streamed from this client, the second is opened by the browser\n * process itself. A mixed request is a configuration error, not a native surprise later.\n */\nexport const nativeSelection = (\n files: ReadonlyArray<NativeFileSelection>,\n):\n | {\n readonly _tag: \"Inline\";\n readonly payload: Array<{ name: string; mimeType: string; buffer: Buffer }>;\n }\n | { readonly _tag: \"Remote\"; readonly paths: Array<string> } => {\n if (files.length === 0) throw failure(Reasons.Configuration.make({}), \"undispatched\");\n const inline = files.filter((file) => file._tag === \"Inline\");\n const remote = files.filter((file) => file._tag === \"Remote\");\n\n // The maintained native API encodes a Node Buffer; this lazily loaded driver already\n // requires the Node-only Playwright peer, so the conversion belongs here and nowhere else.\n if (inline.length === files.length) {\n return {\n _tag: \"Inline\",\n payload: inline.map((file) => ({\n name: file.name,\n mimeType: file.mediaType,\n buffer: Buffer.from(file.bytes),\n })),\n };\n }\n if (remote.length === files.length)\n return { _tag: \"Remote\", paths: remote.map((file) => file.path) };\n throw failure(Reasons.Configuration.make({}), \"undispatched\");\n};\n\n/**\n * Input to the selected document. A mutation marks its ticket dispatched immediately before the\n * one native command that may change the page; any outcome after that point is uncertain.\n */\nexport const makeActions = (\n context: BrowserContext,\n targets: Targets,\n observation: Observation,\n isTimeoutError: (error: unknown) => boolean,\n) => {\n const { current } = targets;\n let invalidatePointer = (_page: Page): void => {};\n\n const setPointerInvalidator = (invalidate: (page: Page) => void) => {\n invalidatePointer = invalidate;\n };\n\n const navigationControls = new Map<\n string,\n {\n readonly control: NavigationControl | undefined;\n readonly mainFrame: boolean;\n }\n >();\n\n let downloadSerial = 0;\n\n /** A result URL is only ever an http(s) address without credentials. */\n const httpUrl = (value: string) => {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw failure(Reasons.Malformed.make({}));\n }\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password)\n throw failure(Reasons.Malformed.make({}));\n\n return value;\n };\n\n const postUrl = (target?: DriverTarget) => httpUrl(targets.url(target));\n\n /**\n * Acts on the exact attached node a target names. The observation seam establishes that it is\n * still the control that was inspected and that the host's policy, if any, admits it. `admit`\n * then sees that node before anything is dispatched, so a refusal it raises is undispatched\n * too, and what it learns reaches the action without the node being resolved a second time.\n * `enablement` is a form step's: see `Observation.resolve`.\n */\n const withAdmittedElement = async <Admitted, A>(\n target: string | ObservedElement,\n ticket: Ticket,\n admit: (element: ElementHandle<Element>, facts: ControlFacts | undefined) => Promise<Admitted>,\n action: (element: ElementHandle<Element>, admitted: Admitted) => Promise<A>,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n enablement = false,\n ): Promise<A> => {\n const { element, kept, check, facts } = await observation.resolve(\n target,\n ticket,\n policy,\n false,\n browserTarget,\n enablement,\n );\n\n try {\n check();\n const admitted = await admit(element, facts);\n\n check();\n ticket.check();\n // ElementHandle actions do not re-resolve the selector onto a replacement node.\n ticket.dispatch();\n\n return await action(element, admitted);\n } finally {\n if (!kept) await closeWithin(() => element.dispose()).catch(() => {});\n }\n };\n\n const withElement = <A>(\n target: string | ObservedElement,\n ticket: Ticket,\n action: (element: ElementHandle<Element>) => Promise<A>,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n ): Promise<A> =>\n withAdmittedElement(target, ticket, async () => {}, action, policy, browserTarget);\n\n /** Refuses, undispatched, what `inputRefusal` finds on this exact node right now. */\n const refuseInput = async (element: ElementHandle<Element>, text?: string) => {\n const refusal: unknown = await element.evaluate(inputRefusal, text);\n\n if (refusal === \"not-visible\") throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n if (refusal === \"disabled\") throw failure(Reasons.Disabled.make({}), \"undispatched\");\n if (refusal === \"unsupported\") throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n if (refusal !== null) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n };\n\n /** What is left of a step's deadline for reading back, keeping a margin for the owner. */\n const readBack = (ticket: Ticket, wanted: number) =>\n Math.min(wanted, Math.max(0, ticket.remainingMillis() - 250));\n\n const clickElement = (\n page: Page,\n element: ElementHandle<Element>,\n ticket: Ticket,\n capture?: InputCapture,\n ): Promise<InputReceipt | undefined> => {\n const dispatch = async () => {\n invalidatePointer(page);\n await element.click({ timeout: timeout(ticket) });\n };\n\n return capture === undefined\n ? dispatch().then(() => undefined)\n : capture(dispatch, { position: null });\n };\n\n const click: Driver[\"click\"] = (target, ticket, capture, policy, browserTarget) =>\n sanitize(async () => {\n const { page } = current(browserTarget).entry;\n\n const input = await withElement(\n target,\n ticket,\n (element) => clickElement(page, element, ticket, capture),\n policy,\n browserTarget,\n );\n\n ticket.check();\n\n if (input === undefined) throw failure(Reasons.Malformed.make({}), \"unknown\");\n\n return { url: postUrl(browserTarget), input };\n });\n\n const clickWithoutReceipt = async (\n target: string | ObservedElement,\n ticket: Ticket,\n ): Promise<string> => {\n const { page } = current().entry;\n\n await withElement(target, ticket, (element) => clickElement(page, element, ticket));\n ticket.check();\n\n return postUrl();\n };\n\n /**\n * A file the provider already stores is named to the browser process, which opens it; this\n * client never reads that path. Exactly one main-frame node may match, and exactly one\n * command dispatches. A retained node or child frame is refused rather than approximated.\n */\n const attachStoredFiles = async (\n target: string | ObservedElement,\n paths: ReadonlyArray<string>,\n ticket: Ticket,\n ) => {\n if (typeof target !== \"string\") throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n const { entry, frame } = current();\n\n if (frame !== entry.page.mainFrame())\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n ticket.check();\n\n const root = safeDecode(\n Schema.Struct({ root: Schema.Struct({ nodeId: Schema.Int }) }),\n await cdp.send(\"DOM.getDocument\", { depth: 0 }),\n );\n\n const matched = safeDecode(\n Schema.Struct({ nodeIds: Schema.Array(Schema.Int).check(Schema.isMaxLength(64)) }),\n await cdp.send(\"DOM.querySelectorAll\", { nodeId: root.root.nodeId, selector: target }),\n );\n\n ticket.check();\n const nodeId = matched.nodeIds[0];\n\n if (matched.nodeIds.length !== 1 || nodeId === undefined)\n throw failure(\n matched.nodeIds.length === 0 ? Reasons.NotFound.make({}) : Reasons.Ambiguous.make({}),\n \"undispatched\",\n );\n ticket.dispatch();\n await cdp.send(\"DOM.setFileInputFiles\", { files: [...paths], nodeId });\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n };\n\n const beginNavigation: Driver[\"beginNavigation\"] = (\n url,\n timeoutMillis,\n ticket,\n target,\n control,\n ) =>\n sanitize(async () => {\n const { entry, frame } = current(target);\n const active = { control, mainFrame: frame === entry.page.mainFrame() };\n\n ticket.dispatch();\n navigationControls.set(entry.id, active);\n targets.navigating.begin(entry.id);\n\n // Not awaited here: the permit that dispatched it is released while the browser loads.\n const settled = sanitize(async () => {\n try {\n await frame.goto(url, { waitUntil: \"domcontentloaded\", timeout: timeoutMillis });\n } catch (error) {\n // Preserve the installed engine's exact timeout identity before generic sanitization.\n if (isTimeoutError(error)) throw failure(Reasons.Timeout.make({}), \"unknown\");\n throw error;\n } finally {\n // A stop may have admitted a successor before this old goto finally rejects.\n if (navigationControls.get(entry.id) === active) {\n navigationControls.delete(entry.id);\n targets.navigating.end(entry.id);\n }\n }\n\n // The frame that navigated, not whatever is selected by the time it finishes.\n return httpUrl(targets.urlOf(frame));\n });\n\n // Whoever awaits it sees the failure; a caller that never does raises nothing unhandled.\n void settled.catch(() => {});\n\n return {\n pageId: entry.id,\n mainFrame: active.mainFrame,\n settled,\n stop: (stopTicket, pending, onDispatch, retainSetup) =>\n sanitize(async () => {\n return dispatchNavigationStop(\n stopTicket,\n pending,\n onDispatch,\n async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n return {\n stop: async () => {\n await cdp.send(\"Page.stopLoading\");\n },\n close: () => cdp.detach(),\n };\n },\n retainSetup,\n );\n }),\n };\n });\n\n const fill: Driver[\"fill\"] = (target, value, ticket, policy, browserTarget) =>\n sanitize(async () => {\n await withAdmittedElement(\n target,\n ticket,\n (element) => refuseInput(element, value),\n (element) => element.fill(value, { timeout: timeout(ticket) }),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return postUrl(browserTarget);\n });\n\n /**\n * One form step on an exact observed node, which may have become enabled since it was\n * observed. Text is filled and the control is then left, as a person moving on would, so what\n * the page does on blur belongs to this step. A toggle is clicked only when it is not already\n * in the requested state, and a native radio is never asked to clear itself. Options are the\n * issued nodes of the same observation, exactly as `selectOption` sends them.\n */\n const formStep: Driver[\"formStep\"] = (target, field, ticket, policy, settleMillis, capture) =>\n sanitize(async () => {\n const { element, check, facts } = await observation.resolve(\n target,\n ticket,\n policy,\n false,\n undefined,\n true,\n );\n\n check();\n if (facts === undefined) throw failure(Reasons.Malformed.make({}), \"undispatched\");\n let act: (() => Promise<unknown>) | undefined;\n let input: InputReceipt | undefined;\n\n if (field.options !== undefined) {\n const admitted = await observation.selectOptions(\n target,\n field.options,\n element,\n ticket,\n true,\n );\n\n act = async () => {\n const values = await element.selectOption(admitted.handles, { timeout: timeout(ticket) });\n const expected = [...admitted.values].sort();\n\n if (\n values.length !== expected.length ||\n values.sort().some((value, i) => value !== expected[i])\n )\n throw failure(Reasons.Stale.make({}), \"unknown\");\n };\n } else if (field.checked !== undefined) {\n if (facts.checked === undefined)\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n if (facts.checked !== field.checked) {\n if (!field.checked && facts.inputType === \"radio\")\n throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n await refuseInput(element);\n act = async () => {\n input = await clickElement(current().entry.page, element, ticket, capture);\n };\n }\n } else {\n const text = field.value ?? \"\";\n\n await refuseInput(element, text);\n act = async () => {\n await element.fill(text, { timeout: timeout(ticket) });\n await bounded(\n element.evaluate((node) => {\n if (node instanceof HTMLElement && node.ownerDocument.activeElement === node)\n node.blur();\n }),\n readBack(ticket, 1000),\n undefined,\n );\n };\n }\n check();\n ticket.check();\n if (act !== undefined) {\n // ElementHandle actions do not re-resolve onto a replacement node.\n ticket.dispatch();\n await act();\n if (settleMillis > 0)\n await bounded(\n element.evaluate(settleInPage, settleMillis),\n readBack(ticket, settleMillis + 250),\n undefined,\n );\n }\n const state = await bounded(readFieldState(element), readBack(ticket, 1000), undefined);\n\n ticket.check();\n\n return {\n status: act === undefined ? \"unchanged\" : \"set\",\n reached:\n field.checked === undefined || state === undefined || holdsChecked(state, field.checked),\n state,\n url: postUrl(),\n ...(input === undefined ? {} : { input }),\n };\n });\n\n /** The one submit click, on an exact observed node that may have become enabled. */\n const formSubmit: Driver[\"formSubmit\"] = (target, ticket, capture, policy) =>\n sanitize(async () => {\n const { page } = current().entry;\n\n const input = await withAdmittedElement(\n target,\n ticket,\n (element) => refuseInput(element),\n (element) => clickElement(page, element, ticket, capture),\n policy,\n undefined,\n true,\n );\n\n ticket.check();\n\n if (input === undefined) throw failure(Reasons.Malformed.make({}), \"unknown\");\n\n return { url: postUrl(), input };\n });\n\n const selectOption: Driver[\"selectOption\"] = (target, options, ticket, policy) =>\n sanitize(async () => {\n await withAdmittedElement(\n target,\n ticket,\n (element) => observation.selectOptions(target, options, element, ticket),\n async (element, admitted) => {\n // Only issued native nodes reach this command. Its returned values stay private.\n const values = await element.selectOption(admitted.handles, { timeout: timeout(ticket) });\n const expected = [...admitted.values].sort();\n\n if (\n values.length !== expected.length ||\n values.sort().some((value, i) => value !== expected[i])\n )\n throw failure(Reasons.Stale.make({}), \"unknown\");\n },\n policy,\n );\n ticket.check();\n\n return postUrl();\n });\n\n const scroll: Driver[\"scroll\"] = (deltaX, deltaY, ticket, target) =>\n sanitize(async () => {\n const { frame } = current(target);\n\n ticket.dispatch();\n await frame.evaluate(\n ({ x, y }) => window.scrollBy({ left: x, top: y, behavior: \"instant\" }),\n { x: deltaX, y: deltaY },\n );\n ticket.check();\n\n return postUrl(target);\n });\n\n let waitConnectionRetired = false;\n\n let pendingWait:\n | { readonly entry: Entry; readonly frame: Frame; readonly ticket: WaitTicket }\n | undefined;\n\n /** Capture native identity before releasing admission; no later read follows live selection. */\n const waitOn = (\n ticket: WaitTicket,\n target: DriverTarget,\n acquire: () => {\n readonly wait: () => Promise<void>;\n readonly check?: () => void;\n readonly dispose: () => Promise<void>;\n },\n ): Promise<void> => {\n ticket.check();\n const { entry, frame } = current(target);\n const epoch = targets.epochOf(frame);\n const resource = acquire();\n const pending = { entry, frame, ticket };\n\n pendingWait = pending;\n\n const check = () => {\n ticket.check();\n const resolved = current(target);\n\n if (\n waitConnectionRetired ||\n resolved.entry !== entry ||\n resolved.frame !== frame ||\n targets.epochOf(frame) !== epoch\n )\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n resource.check?.();\n };\n\n return sanitize(async () => {\n try {\n try {\n check();\n await resource.wait();\n check();\n } catch (error) {\n // Lifecycle/deadline evidence wins over a native cancellation or detached-node error.\n check();\n if (isTimeoutError(error)) throw failure(Reasons.Timeout.make({}), \"undispatched\");\n throw error;\n }\n } finally {\n try {\n // This raw release is observed after caller cancellation, without renewing its deadline.\n await resource.dispose();\n ticket.retire();\n } finally {\n if (pendingWait === pending) pendingWait = undefined;\n }\n }\n check();\n });\n };\n\n const waitFor: Driver[\"waitFor\"] = (selector, state, ticket, target) =>\n waitOn(ticket, target, () => {\n const { frame } = current(target);\n let node: ElementHandle<Element> | null | undefined;\n\n return {\n wait: async () => {\n node = await frame.waitForSelector(selector, {\n state,\n strict: true,\n timeout: timeout(ticket),\n signal: ticket.signal,\n });\n },\n dispose: async () => {\n if (!waitConnectionRetired) await node?.dispose();\n },\n };\n });\n\n const waitForElement: Driver[\"waitForElement\"] = (reference, state, ticket, target) =>\n waitOn(ticket, target, () => {\n const leased = observation.lease(reference, ticket);\n\n /** A node that can no longer be read, because its document is gone, is not attached. */\n const attached = async () => {\n leased.check();\n\n const present = await leased.element\n .evaluate((node) => node.isConnected && node.ownerDocument === document)\n .catch(() => false);\n\n leased.check();\n if (present !== true) throw failure(Reasons.Stale.make({}), \"undispatched\");\n };\n\n return {\n check: leased.check,\n wait: async () => {\n try {\n await leased.element.waitForElementState(state, {\n timeout: timeout(ticket),\n signal: ticket.signal,\n });\n } catch (error) {\n // A replaced document can reject the native wait before the navigation event\n // advances its epoch, so ask the node itself. A hidden wait needs asking only then:\n // a node removed from a live document already satisfies it.\n if (state !== \"hidden\" || !(isTimeoutError(error) || ticket.signal.aborted))\n await attached();\n throw error;\n }\n // A hidden node may have left its document; any other state needs it attached.\n if (state !== \"hidden\") await attached();\n },\n dispose: leased.release,\n };\n });\n\n const clickAndWait: Driver[\"clickAndWait\"] = (target, ticket, capture) =>\n sanitize(async () => {\n const { entry, frame } = current();\n\n const observer = waitEvent<Frame>(\n (on) => entry.page.on(\"framenavigated\", on),\n (off) => entry.page.off(\"framenavigated\", off),\n ticket,\n (changedFrame) => changedFrame === frame,\n );\n\n try {\n const clicked = await click(target, ticket, capture);\n\n await observer.promise;\n await frame.waitForLoadState(\"domcontentloaded\", { timeout: timeout(ticket) });\n ticket.check();\n\n return { url: postUrl(), input: clicked.input };\n } finally {\n observer.cancel();\n }\n });\n\n const clickForDownload: Driver[\"clickForDownload\"] = (target, ticket) =>\n sanitize(async () => {\n const page = current().entry.page;\n\n const observer = waitEvent<Download>(\n (on) => page.on(\"download\", on),\n (off) => page.off(\"download\", off),\n ticket,\n );\n\n try {\n await clickWithoutReceipt(target, ticket);\n const download = await observer.promise;\n\n const filename = safeDecode(SafeFilename, download.suggestedFilename());\n\n const error = await download.failure();\n\n ticket.check();\n\n return {\n downloadId: `native-download-${++downloadSerial}`,\n filename,\n state: error === null ? \"completed\" : \"failed\",\n };\n } finally {\n observer.cancel();\n }\n });\n\n const selectFiles: Driver[\"selectFiles\"] = (target, files, ticket) =>\n sanitize(async () => {\n const selection = nativeSelection(files);\n\n if (selection._tag === \"Remote\") await attachStoredFiles(target, selection.paths, ticket);\n else\n await withElement(target, ticket, (element) =>\n element.setInputFiles(selection.payload, { timeout: timeout(ticket) }),\n );\n ticket.check();\n\n return postUrl();\n });\n\n const clickForFileSelection: Driver[\"clickForFileSelection\"] = (target, files, ticket) =>\n sanitize(async () => {\n const selection = nativeSelection(files);\n\n // A chooser is satisfied with bytes this client holds. A provider-stored file is\n // attached to an exact input node instead, where the browser can open the path.\n if (selection._tag === \"Remote\") throw failure(Reasons.Unsupported.make({}), \"undispatched\");\n const page = current().entry.page;\n\n const observer = waitEvent<FileChooser>(\n (on) => page.on(\"filechooser\", on),\n (off) => page.off(\"filechooser\", off),\n ticket,\n );\n\n try {\n await clickWithoutReceipt(target, ticket);\n const chooser = await observer.promise;\n\n ticket.check();\n if (!chooser.isMultiple() && selection.payload.length > 1)\n throw failure(Reasons.Unsupported.make({}));\n // Exactly one attachment for this chooser; a second would open another dispatch.\n await chooser.setFiles(selection.payload, { timeout: timeout(ticket) });\n ticket.check();\n\n return postUrl();\n } finally {\n observer.cancel();\n }\n });\n\n return {\n setPointerInvalidator,\n withAdmittedElement,\n beginNavigation,\n /** Capture the exact navigation at dialog arrival; acknowledgement never looks it up again. */\n beforeUnload: (pageId: string) => {\n const active = navigationControls.get(pageId);\n\n return active?.mainFrame === true ? active.control?.beforeUnload() : undefined;\n },\n click,\n fill,\n formStep,\n formSubmit,\n selectOption,\n scroll,\n waitFor,\n waitForElement,\n waitChanged: (entry: Entry, frame?: Frame) => {\n const pending = pendingWait;\n\n if (\n pending?.entry === entry &&\n (frame === undefined || frame === pending.frame || frame === entry.page.mainFrame())\n )\n pending.ticket.invalidate();\n },\n retireWait: () => {\n waitConnectionRetired = true;\n pendingWait?.ticket.invalidate();\n pendingWait?.ticket.retire();\n pendingWait = undefined;\n },\n clickAndWait,\n clickForDownload,\n selectFiles,\n clickForFileSelection,\n };\n};\n","export type CallbackFailureMode = \"reject-call\" | \"fail-session\";\n\nexport type CallbackDisposition = \"not-dispatched\" | \"unknown\";\n\n/** Native callbacks cannot await a Semaphore. Reserve a bounded slot synchronously\n * before starting native work; never construct an already-running Promise first.\n * Fail-session pressure/failure fences the connection once. Reject-call pressure or\n * failure remains local to that invocation and reopens admission when accepted work\n * settles. Accepted rejections remain observed after close, and no callback-side Fiber\n * or unbounded producer queue is created. */\nexport class CallbackTasks {\n private readonly pending = new Set<Promise<void>>();\n private stopped = false;\n private faulted = false;\n\n private readonly capacity: number;\n private readonly onFault: (disposition: CallbackDisposition) => void;\n\n constructor(capacity: number, onFault: (disposition: CallbackDisposition) => void) {\n if (!Number.isSafeInteger(capacity) || capacity < 1)\n throw new RangeError(\"Invalid callback capacity\");\n this.capacity = capacity;\n this.onFault = onFault;\n }\n\n private fault(disposition: CallbackDisposition): void {\n if (this.stopped || this.faulted) return;\n this.faulted = true;\n this.onFault(disposition);\n }\n\n submit(\n action: () => Promise<unknown>,\n failureMode: CallbackFailureMode = \"fail-session\",\n ): boolean {\n if (this.stopped || this.faulted) return false;\n if (this.pending.size >= this.capacity) {\n if (failureMode === \"fail-session\") this.fault(\"not-dispatched\");\n\n return false;\n }\n\n const task = Promise.resolve()\n .then(action)\n .then(\n () => {},\n () => {\n if (failureMode === \"fail-session\") this.fault(\"unknown\");\n },\n )\n .finally(() => this.pending.delete(task));\n\n this.pending.add(task);\n\n return true;\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n async settle(): Promise<void> {\n await Promise.all(this.pending);\n }\n}\n","import type { Frame } from \"playwright-core\";\n\nimport { Reasons } from \"../../Errors.ts\";\nimport type {\n CaptureBinding,\n CaptureInvalidation,\n CaptureSource,\n CaptureTarget,\n NativeFrame,\n} from \"./Driver.ts\";\nimport { failure, sanitize } from \"./NativeCalls.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\ninterface CaptureWatcher {\n readonly frameId: string;\n readonly invalidate: (reason: CaptureInvalidation) => void;\n readonly document?: (url: string, sameDocument: boolean) => void;\n}\n\n/**\n * Screencast sources bound to one page and frame, and the watchers that learn when that binding\n * stops describing what the page shows. A main-frame change invalidates every watcher on the page.\n */\nexport const makeCaptureSources = (targets: Targets) => {\n const { current, entries, frameId } = targets;\n const captureWatchers = new Map<string, Set<CaptureWatcher>>();\n\n const invalidate = (entry: Entry, reason: CaptureInvalidation, frame?: Frame): void => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers === undefined) return;\n const changedFrameId = frame === undefined ? undefined : frameId(frame);\n const mainFrameId = frameId(entry.page.mainFrame());\n\n // oxlint-disable-next-line unicorn/no-useless-spread -- a callback may start or stop a watcher\n for (const watcher of [...watchers]) {\n if (\n frame !== undefined &&\n changedFrameId !== mainFrameId &&\n changedFrameId !== watcher.frameId\n )\n continue;\n // The page's screencast keeps running across a main-frame navigation. An interval that\n // follows its page is told a new document began; one bound to a document ends, as before.\n if (\n frame !== undefined &&\n watcher.document !== undefined &&\n reason === \"target-changed\" &&\n changedFrameId === mainFrameId &&\n watcher.frameId === mainFrameId\n )\n // Read inside the navigation event itself: this is the address that just committed.\n watcher.document(frame.url(), false);\n else watcher.invalidate(reason);\n }\n };\n\n const sameDocumentNavigated = (entry: Entry, frame: Frame): void => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers === undefined || frame !== entry.page.mainFrame()) return;\n for (const watcher of watchers)\n if (watcher.frameId === frameId(frame)) watcher.document?.(frame.url(), true);\n };\n\n const forget = (entry: Entry) => {\n const watchers = captureWatchers.get(entry.id);\n\n if (watchers !== undefined)\n // oxlint-disable-next-line unicorn/no-useless-spread -- invalidation releases watchers from this set\n for (const watcher of [...watchers]) watcher.invalidate(\"target-closed\");\n captureWatchers.delete(entry.id);\n };\n\n const clear = () => {\n captureWatchers.clear();\n };\n\n const capture = (target?: CaptureTarget): Promise<CaptureBinding> =>\n sanitize(async () => {\n let entry: Entry;\n let captureFrame: Frame;\n\n if (target === undefined) {\n const selectedTarget = current();\n\n entry = selectedTarget.entry;\n captureFrame = selectedTarget.frame;\n } else {\n const requested = entries.get(target.pageId);\n\n if (requested === undefined || requested.page.isClosed())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n if ((await targets.targetId(requested)) !== target.targetId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n entry = requested;\n captureFrame = entry.page.mainFrame();\n }\n const page = entry.page;\n const targetId = await targets.targetId(entry);\n const watchedFrameId = frameId(captureFrame);\n\n // The maintained API is required; older Playwright versions fail explicitly, never silently emulate it.\n if (page.screencast === undefined) throw failure(Reasons.Unsupported.make({}));\n let watcherSet: Set<CaptureWatcher> | undefined;\n let watcher: CaptureWatcher | undefined;\n\n const source: CaptureSource = {\n start: ({ receive, quality, size, invalidate, opened, document }) =>\n sanitize(async () => {\n watcherSet = captureWatchers.get(entry.id) ?? new Set<CaptureWatcher>();\n captureWatchers.set(entry.id, watcherSet);\n watcher = {\n frameId: watchedFrameId,\n invalidate,\n ...(document === undefined ? {} : { document }),\n };\n watcherSet.add(watcher);\n // No await separates these two lines, so no navigation event can run between them.\n opened?.(captureFrame.url());\n await page.screencast.start({\n quality,\n ...(size === undefined ? {} : { size }),\n onFrame: (frame: NativeFrame) => {\n receive(frame);\n },\n });\n }),\n stop: () =>\n sanitize(async () => {\n // A closed target cannot produce more frames; its page channel rejects stop.\n if (page.isClosed()) return;\n try {\n await page.screencast.stop();\n } catch (error) {\n // Closure can race the stop request. A live target still requires quarantine.\n if (!page.isClosed()) throw error;\n }\n }),\n release: () => {\n if (watcher !== undefined && watcherSet !== undefined) {\n watcherSet.delete(watcher);\n watcher = undefined;\n if (watcherSet.size === 0) captureWatchers.delete(entry.id);\n }\n },\n };\n\n return { pageId: entry.id, targetId, frameId: watchedFrameId, source };\n });\n\n return { invalidate, sameDocumentNavigated, forget, clear, capture };\n};\n","import { Schema } from \"effect\";\nimport type { BrowserContext, CDPSession, Frame, Page } from \"playwright-core\";\n\nimport { Identifier } from \"../../BrowserData.ts\";\nimport { InitializationError } from \"../../Errors.ts\";\nimport type { NativeBinding } from \"./Bindings.ts\";\nimport { safeDecode } from \"./NativeCalls.ts\";\n\nconst ContextCreated = Schema.Struct({\n context: Schema.Struct({\n id: Schema.Int.check(Schema.isGreaterThan(0)),\n uniqueId: Schema.NonEmptyString.check(Schema.isMaxLength(256)),\n origin: Schema.String.check(Schema.isMaxLength(2048)),\n auxData: Schema.optionalKey(Schema.Struct({ isDefault: Schema.Boolean, frameId: Identifier })),\n }),\n});\n\nconst ContextDestroyed = Schema.Struct({ executionContextId: Schema.Int });\nconst TargetIdentity = Schema.Struct({ targetInfo: Schema.Struct({ targetId: Identifier }) });\n\nconst Call = Schema.Struct({\n name: Identifier,\n sequence: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: Number.MAX_SAFE_INTEGER })),\n input: Schema.String.check(Schema.isMaxLength(1024 * 1024)),\n});\n\ntype DocumentIdentity = typeof ContextCreated.Type.context & {\n sequence: number;\n readonly targetId: string;\n};\n\ninterface TargetRegistration {\n readonly cdp: CDPSession;\n readonly documents: Map<number, DocumentIdentity>;\n readonly page: Page;\n readonly off: () => void;\n closed: boolean;\n}\n\nconst error = (step: string, reason: InitializationError[\"reason\"]) =>\n InitializationError.make({ operation: \"callback\", step, reason });\n\n/**\n * A small page-side transport, not a second host scheduler. Each document owns its finite\n * pending replies and one startup timer; host authority always comes from Chromium's native\n * execution-context event, never the fields in this message or a page-reported origin.\n */\nconst pageBundle = (\n nativeName: string,\n controllerName: string,\n bindings: ReadonlyArray<NativeBinding>,\n): string => `(() => {\n const nativeName = ${JSON.stringify(nativeName)};\n const controllerName = ${JSON.stringify(controllerName)};\n if (Object.prototype.hasOwnProperty.call(globalThis, controllerName)) return;\n const definitions = ${JSON.stringify(\n bindings.map(({ name, maxConcurrent, maxInputBytes, timeoutMillis }) => ({\n name,\n maximum: maxConcurrent + 1,\n maxInputBytes,\n timeoutMillis,\n })),\n )};\n const stringify = JSON.stringify.bind(JSON);\n const parse = JSON.parse.bind(JSON);\n const encode = new TextEncoder();\n const descriptors = Object.getOwnPropertyDescriptors;\n const ownKeys = Reflect.ownKeys;\n const prototype = Object.getPrototypeOf;\n const plain = Object.prototype;\n const arrayPrototype = Array.prototype;\n const pending = new Map();\n const functions = new Map();\n const counts = new Map();\n let sequence = 0;\n let closed = false;\n let startup;\n const rejected = () => {\n const value = new Error('Browser binding call rejected');\n value.name = 'BrowserBindingError';\n value.stack = '';\n return value;\n };\n const jsonInput = (value, maximum) => {\n let nodes = 0;\n const ancestors = new Set();\n const visit = (item, depth) => {\n if (++nodes > Math.min(maximum, 65536) || depth > 64) throw rejected();\n if (item === null || typeof item === 'boolean') return;\n if (typeof item === 'string') { if (item.length > maximum) throw rejected(); return; }\n if (typeof item === 'number') { if (!Number.isFinite(item)) throw rejected(); return; }\n if (typeof item !== 'object' || ancestors.has(item)) throw rejected();\n const array = Array.isArray(item);\n const parent = prototype(item);\n if (array ? parent !== arrayPrototype : parent !== plain && parent !== null) throw rejected();\n ancestors.add(item);\n const fields = descriptors(item);\n const keys = ownKeys(fields);\n if (keys.length > Math.min(maximum, 65536)) throw rejected();\n if (array && keys.length !== item.length + 1) throw rejected();\n for (const key of keys) {\n if (array && key === 'length') continue;\n if (typeof key !== 'string' || key.length > maximum || key === 'toJSON') throw rejected();\n const field = fields[key];\n if (!field.enumerable || !Object.prototype.hasOwnProperty.call(field, 'value')) throw rejected();\n if (array && (!/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= item.length)) throw rejected();\n visit(field.value, depth + 1);\n }\n ancestors.delete(item);\n };\n visit(value, 0);\n return stringify(value);\n };\n const settle = (id, packet) => {\n const call = pending.get(id);\n if (!call) return;\n pending.delete(id);\n clearTimeout(call.timer);\n counts.set(call.name, (counts.get(call.name) || 1) - 1);\n if (packet && packet.ok === true) {\n try { call.resolve(parse(packet.text)); } catch { call.reject(rejected()); }\n } else call.reject(rejected());\n };\n const dispatch = () => {\n clearTimeout(startup);\n startup = undefined;\n if (closed) return;\n const native = globalThis[nativeName];\n if (typeof native !== 'function') {\n if (pending.size > 0) startup = setTimeout(dispatch, 10);\n return;\n }\n for (const [id, call] of pending) {\n if (call.sent) continue;\n call.sent = true;\n try { native(call.message); } catch { settle(id); }\n }\n };\n const close = () => {\n if (closed) return;\n closed = true;\n clearTimeout(startup);\n for (const id of [...pending.keys()]) settle(id);\n for (const [name, fn] of functions) {\n if (globalThis[name] === fn) delete globalThis[name];\n }\n };\n const controller = Object.freeze({ deliver: settle, close,\n get status() { return closed ? 'closed' : functions.size === definitions.length ? 'ready' : 'installing'; }\n });\n Object.defineProperty(globalThis, controllerName, { value: controller, configurable: true });\n for (const definition of definitions) {\n if (Object.prototype.hasOwnProperty.call(globalThis, definition.name)) { close(); return; }\n const fn = (...args) => new Promise((resolve, reject) => {\n if (closed || args.length !== 1 || sequence >= Number.MAX_SAFE_INTEGER ||\n (counts.get(definition.name) || 0) >= definition.maximum) {\n reject(rejected()); return;\n }\n let input;\n try {\n input = jsonInput(args[0], definition.maxInputBytes);\n if (typeof input !== 'string' || input.length > definition.maxInputBytes ||\n encode.encode(input).byteLength > definition.maxInputBytes) throw rejected();\n } catch { reject(rejected()); return; }\n const id = ++sequence;\n const timer = setTimeout(() => settle(id), definition.timeoutMillis);\n counts.set(definition.name, (counts.get(definition.name) || 0) + 1);\n pending.set(id, { name: definition.name, resolve, reject, timer, sent: false,\n message: stringify({ name: definition.name, sequence: id, input }) });\n dispatch();\n });\n functions.set(definition.name, fn);\n Object.defineProperty(globalThis, definition.name, { value: fn, configurable: true });\n }\n})();`;\n\n/**\n * The pinned Playwright binding callback reports a Frame but no calling document identity.\n * That Frame survives navigation, so checking frame.url() would authorize an old document\n * using its replacement's origin. Chromium's maintained Runtime binding protocol supplies\n * the original executionContextId; uniqueId prevents context-id reuse when publishing replies.\n * These are child CDP sessions on the existing owned Playwright connection, not another owner,\n * websocket, browser resource or publicly exposed raw-protocol capability.\n */\nexport const makeNativeBindings = (\n context: BrowserContext,\n /** Unpredictable and never reported, so no page can define these globals before they install. */\n bindingIdentity: string,\n bindings: ReadonlyArray<NativeBinding>,\n fault: () => void,\n) => {\n const identity = bindingIdentity.replaceAll(\"-\", \"\");\n const nativeName = `__effect_agent_binding_${identity}`;\n const controllerName = `__effect_agent_bindings_${identity}`;\n const bundle = pageBundle(nativeName, controllerName, bindings);\n const byName = new Map(bindings.map((binding) => [binding.name, binding]));\n const targets = new Map<string, TargetRegistration>();\n const currentDocuments = new Map<string, DocumentIdentity>();\n const attaching = new WeakSet<Page | Frame>();\n // Native replies are bounded too, including rejected calls and late native completions.\n const maximumReplies = 16 + bindings.reduce((sum, binding) => sum + binding.maxConcurrent, 0);\n let replies = 0;\n let closing = false;\n let disposed: Promise<void> | undefined;\n\n const close = () => {\n closing = true;\n };\n\n const attach = async (subject: Page | Frame, page: Page): Promise<void> => {\n if (closing || page.isClosed() || attaching.has(subject)) return;\n attaching.add(subject);\n let cdp: CDPSession | undefined;\n let retained = false;\n\n try {\n try {\n cdp = await context.newCDPSession(subject);\n } catch (cause) {\n // Chromium routes same-process child frames through their parent's target. Only this\n // exact pinned Playwright refusal selects that already-owned session; other failures\n // remain faults rather than silently omitting an out-of-process frame.\n if (\n subject !== page &&\n cause instanceof Error &&\n cause.message.includes(\"This frame does not have a separate CDP session\")\n )\n return;\n if (\n page.isClosed() ||\n (subject !== page && \"isDetached\" in subject && subject.isDetached())\n )\n return;\n throw cause;\n }\n const native = cdp;\n\n const targetId = safeDecode(TargetIdentity, await native.send(\"Target.getTargetInfo\"))\n .targetInfo.targetId;\n\n if (closing || page.isClosed() || targets.has(targetId)) return;\n if (targets.size >= 128) throw error(\"bindings\", \"busy\");\n const documents = new Map<number, DocumentIdentity>();\n\n const created = (raw: unknown) => {\n const parsed = Schema.decodeUnknownOption(ContextCreated)(raw);\n\n if (parsed._tag === \"None\") return;\n const value = parsed.value.context;\n\n if (closing || value.auxData?.isDefault !== true) return;\n const prior = documents.get(value.id);\n\n if (prior?.uniqueId === value.uniqueId) return;\n const previous = currentDocuments.get(value.auxData.frameId);\n\n if (previous !== undefined) {\n const previousDocuments = targets.get(previous.targetId)?.documents;\n\n if (previousDocuments?.get(previous.id) === previous)\n previousDocuments.delete(previous.id);\n currentDocuments.delete(value.auxData.frameId);\n }\n if (documents.size >= 128 && !documents.has(value.id)) {\n fault();\n\n return;\n }\n const document = { ...value, sequence: 0, targetId };\n\n // A new default context for the native frame retires the old document even when its\n // destruction event lags a process swap or a back/forward-cache transition.\n currentDocuments.set(value.auxData.frameId, document);\n documents.set(value.id, document);\n };\n\n const destroyed = (raw: unknown) => {\n const parsed = Schema.decodeUnknownOption(ContextDestroyed)(raw);\n\n if (parsed._tag === \"Some\") {\n const document = documents.get(parsed.value.executionContextId);\n const frameId = document?.auxData?.frameId;\n\n if (frameId !== undefined && currentDocuments.get(frameId) === document)\n currentDocuments.delete(frameId);\n documents.delete(parsed.value.executionContextId);\n }\n };\n\n const cleared = () => {\n for (const document of documents.values()) {\n const frameId = document.auxData?.frameId;\n\n if (frameId !== undefined && currentDocuments.get(frameId) === document)\n currentDocuments.delete(frameId);\n }\n documents.clear();\n };\n\n const called = (event: {\n readonly name: string;\n readonly payload: string;\n readonly executionContextId: number;\n }) => {\n if (closing || event.name !== nativeName || replies >= maximumReplies) return;\n const document = documents.get(event.executionContextId);\n\n if (document === undefined || event.payload.length > 2 * 1024 * 1024 + 512) return;\n const parsed = Schema.decodeOption(Schema.fromJsonString(Call))(event.payload);\n\n if (parsed._tag === \"None\") return;\n const call = parsed.value;\n const binding = byName.get(call.name);\n\n if (binding === undefined || call.sequence <= document.sequence) return;\n document.sequence = call.sequence;\n replies++;\n let retired = false;\n\n const check = async (signal: AbortSignal) => {\n const current = () => {\n if (closing || retired || signal.aborted || page.isClosed())\n throw error(binding.name, \"closed\");\n if (\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n throw error(binding.name, \"stale\");\n if (!binding.origins.includes(document.origin)) throw error(binding.name, \"origin\");\n };\n\n current();\n\n const result = await native.send(\"Runtime.evaluate\", {\n expression: \"true\",\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: binding.timeoutMillis,\n });\n\n current();\n if (result.exceptionDetails !== undefined || result.result.value !== true)\n throw error(binding.name, \"stale\");\n };\n\n const reply = async (\n packet: { readonly ok: false } | { readonly ok: true; readonly text: string },\n ) => {\n if (\n closing ||\n page.isClosed() ||\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n return;\n await native.send(\"Runtime.evaluate\", {\n expression: `globalThis[${JSON.stringify(controllerName)}]?.deliver(${call.sequence},${JSON.stringify(packet)})`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: binding.timeoutMillis,\n });\n };\n\n // Runtime admission is synchronous before a consumer fiber or native validation starts.\n // Both branches stay observed even when the source document disappears while settling.\n void binding\n .invoke({\n read: async (signal) => {\n // An environment-free codec can still suspend or invoke host code. Authorize\n // before even decoding, then recheck after decode and before publishing a reply.\n await check(signal);\n\n return call.input;\n },\n check,\n dispose: async () => {\n retired = true;\n },\n })\n .then(\n (text) => reply({ ok: true, text }),\n () => reply({ ok: false }),\n )\n .catch(() => {})\n .finally(() => {\n replies--;\n });\n };\n\n const off = () => {\n native.off(\"Runtime.executionContextCreated\", created);\n native.off(\"Runtime.executionContextDestroyed\", destroyed);\n native.off(\"Runtime.executionContextsCleared\", cleared);\n native.off(\"Runtime.bindingCalled\", called);\n cleared();\n };\n\n const target: TargetRegistration = { cdp: native, documents, page, off, closed: false };\n\n const onClosed = () => {\n target.closed = true;\n off();\n if (targets.get(targetId) === target) targets.delete(targetId);\n native.off(\"close\", onClosed);\n };\n\n native.on(\"close\", onClosed);\n targets.set(targetId, target);\n retained = true;\n native.on(\"Runtime.executionContextCreated\", created);\n native.on(\"Runtime.executionContextDestroyed\", destroyed);\n native.on(\"Runtime.executionContextsCleared\", cleared);\n native.on(\"Runtime.bindingCalled\", called);\n await native.send(\"Runtime.enable\");\n if (closing) return;\n await native.send(\"Runtime.addBinding\", { name: nativeName });\n if (closing) {\n await native.send(\"Runtime.removeBinding\", { name: nativeName }).catch(() => {});\n\n return;\n }\n // Existing documents receive only the callable bridge, never replayed consumer init scripts.\n for (const document of documents.values()) {\n if (closing) return;\n\n const installed = await native.send(\"Runtime.evaluate\", {\n expression: `${bundle}\\nglobalThis[${JSON.stringify(controllerName)}]?.status`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: 2000,\n });\n\n if (\n documents.get(document.id) !== document ||\n currentDocuments.get(document.auxData?.frameId ?? \"\") !== document\n )\n continue;\n if (installed.exceptionDetails !== undefined || installed.result.value !== \"ready\")\n throw InitializationError.make({\n operation: \"register\",\n step: \"bindings\",\n reason: \"configuration\",\n });\n }\n } finally {\n attaching.delete(subject);\n if (cdp !== undefined && (!retained || closing)) await cdp.detach().catch(() => {});\n }\n };\n\n const dispose = (): Promise<void> => {\n close();\n disposed ??= (async () => {\n const settled = await Promise.allSettled(\n [...targets.values()].map(async (target) => {\n const documents = [...target.documents.values()];\n\n target.off();\n\n const removal = await Promise.allSettled([\n (async () => {\n if (!target.closed && !target.page.isClosed()) {\n for (const document of documents) {\n await target.cdp\n .send(\"Runtime.evaluate\", {\n expression: `globalThis[${JSON.stringify(controllerName)}]?.close()`,\n uniqueContextId: document.uniqueId,\n returnByValue: true,\n silent: true,\n timeout: 1000,\n })\n .catch(() => {});\n }\n if (!target.closed)\n await target.cdp.send(\"Runtime.removeBinding\", { name: nativeName });\n }\n })(),\n ]);\n\n // Always attempt detach without overwriting an earlier removal failure. A native\n // target close is terminal evidence; an arbitrary transport error is not.\n const wasClosed = target.closed || target.page.isClosed();\n\n const detachment = await Promise.allSettled([\n target.closed ? Promise.resolve() : target.cdp.detach(),\n ]);\n\n if (!wasClosed && removal.some((result) => result.status === \"rejected\"))\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n if (\n !target.closed &&\n !target.page.isClosed() &&\n detachment.some((result) => result.status === \"rejected\")\n )\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n }),\n );\n\n targets.clear();\n currentDocuments.clear();\n if (settled.some((result) => result.status === \"rejected\"))\n throw InitializationError.make({\n operation: \"dispose\",\n step: \"bindings\",\n reason: \"native\",\n });\n })();\n\n return disposed;\n };\n\n return { bundle, attach, close, dispose };\n};\n","import { Schema } from \"effect\";\nimport type { BrowserContext, Disposable, Frame, Page } from \"playwright-core\";\n\nimport { Reasons, InitializationError } from \"../../Errors.ts\";\nimport type { CompiledBootstrap } from \"./Bootstrap.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type {\n Driver,\n DriverEvents,\n DriverOptions,\n DriverTarget,\n ReadinessState,\n} from \"./Driver.ts\";\nimport { makeNativeBindings } from \"./NativeBindings.ts\";\nimport { failure, NativeFailure, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\n/**\n * The connection's bootstrap registrations and native bindings, and the readiness of the selected\n * document under that bootstrap. Fencing is synchronous; disposal removes what was registered.\n */\nexport const makeInitialization = (\n context: BrowserContext,\n options: DriverOptions,\n bindingIdentity: string,\n targets: Targets,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n) => {\n const { current, entries, epochOf } = targets;\n const registeredEpochs = new WeakMap<Frame, number>();\n const readyDocuments = new WeakMap<Frame, number>();\n const registrations: Disposable[] = [];\n let initializationClosed = false;\n let disposal: Promise<void> | undefined;\n\n const initializationFault = (error: InitializationError) => {\n if (closing() || initializationClosed) return;\n if (options.onBindingFault === undefined)\n events.fault({\n source: \"native\",\n reason: \"registration\",\n disposition: error.reason === \"busy\" ? \"not-dispatched\" : \"unknown\",\n });\n else options.onBindingFault(error);\n };\n\n const bindingTask = (action: () => Promise<void>) => {\n const admitted = callbacks.submit(async () => {\n try {\n await action();\n } catch (cause) {\n initializationFault(\n Schema.is(InitializationError)(cause)\n ? cause\n : InitializationError.make({\n operation: \"register\",\n step: \"bindings\",\n reason: \"native\",\n }),\n );\n }\n }, \"reject-call\");\n\n if (!admitted)\n initializationFault(\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason: \"busy\" }),\n );\n };\n\n const bindings =\n options.bindings === undefined || options.bindings.length === 0\n ? undefined\n : makeNativeBindings(context, bindingIdentity, options.bindings, () =>\n initializationFault(\n InitializationError.make({ operation: \"register\", step: \"bindings\", reason: \"busy\" }),\n ),\n );\n\n const attach = async (page: Page) => {\n if (bindings === undefined) return;\n await bindings.attach(page, page);\n for (const frame of page.frames())\n if (frame !== page.mainFrame()) await bindings.attach(frame, page);\n };\n\n const fence = () => {\n initializationClosed = true;\n bindings?.close();\n };\n\n const dispose = (): Promise<void> => {\n fence();\n disposal ??= (async () => {\n const outcomes = await Promise.allSettled([\n ...registrations.splice(0).map((registration) => registration.dispose()),\n ...(bindings === undefined ? [] : [bindings.dispose()]),\n ]);\n\n if (outcomes.some((result) => result.status === \"rejected\"))\n throw failure(Reasons.Provider.make({}));\n })();\n\n return disposal;\n };\n\n /** Attaches a page this connection registered after initialization, off the event path. */\n const attachPage = (page: Page) => {\n if (bindings !== undefined) bindingTask(() => attach(page));\n };\n\n /** Attaches the new document of a frame that navigated after initialization. */\n const attachFrame = (frame: Frame, page: Page) => {\n if (bindings !== undefined) bindingTask(() => bindings.attach(frame, page));\n };\n\n /**\n * Registrations are installed once per connection and before this connection creates any\n * document. Documents that were already running keep their recorded epoch, so the readiness\n * policy can tell them apart from documents that actually ran the bundle.\n */\n const install = async () => {\n const bootstrap = options.bootstrap;\n\n if (bootstrap === undefined && bindings === undefined) return;\n for (const entry of entries.values())\n for (const frame of entry.page.frames()) registeredEpochs.set(frame, epochOf(frame));\n // Host capabilities precede the bundle: a step may depend on a granted capability.\n for (const grant of bootstrap?.permissions ?? [])\n await context.grantPermissions([...grant.permissions], { origin: grant.origin });\n\n // One bundle guarantees callable wrappers exist before dependent init steps. Ordering\n // between two Playwright addInitScript registrations is intentionally not assumed.\n const content = [bindings?.bundle, bootstrap?.bundle]\n .filter((part) => part !== undefined)\n .join(\"\\n\");\n\n if (content.length > 0) {\n const registration = await context.addInitScript({ content });\n\n if (initializationClosed) await registration.dispose();\n else registrations.push(registration);\n }\n };\n\n const documentOrigin = (frame: Frame): string => {\n try {\n const url = new URL(frame.url());\n\n return [\"http:\", \"https:\"].includes(url.protocol) ? url.origin : \"\";\n } catch {\n return \"\";\n }\n };\n\n /** A finite wait for a page promise. Native work continues; only this wait is bounded. */\n const evaluateWithin = async (\n frame: Frame,\n expression: string,\n milliseconds: number,\n ): Promise<unknown> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n return await Promise.race([\n frame.evaluate(expression),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(failure(Reasons.Timeout.make({}))), milliseconds);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n };\n\n const readiness = async (\n bootstrap: CompiledBootstrap,\n ticket: Ticket,\n target?: DriverTarget,\n ): Promise<ReadinessState> => {\n const { frame } = current(target);\n const epoch = epochOf(frame);\n\n if (readyDocuments.get(frame) === epoch) return { _tag: \"Ready\" };\n ticket.check();\n // A document that predates registration never ran the bundle; saying so is the contract.\n if (epoch <= (registeredEpochs.get(frame) ?? -1)) {\n if (bootstrap.existingDocuments === \"RequireFreshNavigation\")\n return { _tag: \"RequiresNavigation\" };\n }\n const origin = documentOrigin(frame);\n\n const applicable = bootstrap.readiness.filter(\n (requirement) => requirement.origins === undefined || requirement.origins.includes(origin),\n );\n\n if (applicable.length === 0) {\n readyDocuments.set(frame, epoch);\n\n return { _tag: \"NotApplicable\" };\n }\n\n for (const requirement of applicable) {\n const budget = Math.max(1, Math.min(requirement.timeoutMillis, ticket.remainingMillis()));\n let value: unknown;\n\n try {\n value = await evaluateWithin(frame, requirement.expression, budget);\n } catch (error) {\n if (epochOf(frame) !== epoch || frame.isDetached())\n return { _tag: \"NotReady\", step: requirement.step, reason: \"stale\" };\n\n return {\n _tag: \"NotReady\",\n step: requirement.step,\n reason:\n Schema.is(NativeFailure)(error) && error.reason._tag === \"Timeout\"\n ? \"timeout\"\n : \"failed\",\n };\n }\n ticket.check();\n // A completed wait cannot ready a document that replaced the one it observed.\n if (epochOf(frame) !== epoch)\n return { _tag: \"NotReady\", step: requirement.step, reason: \"stale\" };\n if (value !== true) return { _tag: \"NotReady\", step: requirement.step, reason: \"failed\" };\n }\n readyDocuments.set(frame, epoch);\n\n return { _tag: \"Ready\" };\n };\n\n const documentReadiness: Driver[\"documentReadiness\"] = (ticket, target) =>\n sanitize(async () => {\n const bootstrap = options.bootstrap;\n\n return bootstrap === undefined || bootstrap.readiness.length === 0\n ? { _tag: \"Ready\" as const }\n : readiness(bootstrap, ticket, target);\n });\n\n return { attach, attachPage, attachFrame, fence, dispose, install, documentReadiness };\n};\n","import type { ElementHandle, Page } from \"playwright-core\";\n\nimport type { KeyModifier, ObservedElement } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { makeActions } from \"./Actions.ts\";\nimport type { DriverTarget } from \"./Driver.ts\";\nimport { failure, sanitize } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { NativeInput } from \"./Pointer.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\n/**\n * Real key input to the selected page. Every stroke is one the browser would receive from a\n * keyboard, so handlers see trusted `keydown` and `keyup`, and the browser itself decides what\n * has focus. Nothing here focuses, paces or retries: a caller that wants a cadence sends its keys.\n */\nexport const makeKeyboard = (\n targets: Targets,\n actions: ReturnType<typeof makeActions>,\n receipt: (page: Page) => NativeInput,\n) => {\n const { current } = targets;\n\n /**\n * Keys reach the focused element of the focused document, so the guard requires both: the\n * element named is that element or holds it, through any open shadow root, and its document\n * has focus. The pinned Chromium clears a frame's active element when focus leaves that\n * frame, which makes the second check redundant wherever that holds. It is kept because that\n * is the browser's bookkeeping, not a guarantee, and where it failed the keys would land in\n * another frame than the one this guard was asked about.\n */\n const requireFocus = async (element: ElementHandle<Element>): Promise<void> => {\n const focused: unknown = await element.evaluate((node) => {\n if (!node.ownerDocument.hasFocus()) return false;\n let active = node.ownerDocument.activeElement;\n\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n\n for (let at: Node | null = active; at !== null;) {\n if (at === node) return true;\n at = at.parentNode ?? (at instanceof ShadowRoot ? at.host : null);\n }\n\n return false;\n });\n\n if (focused !== true) throw failure(Reasons.NotFocused.make({}), \"undispatched\");\n };\n\n /** Sends under one dispatch, either to whatever has focus or to the one element that must. */\n const send = async (\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy: AdmissionPolicy | undefined,\n keys: (page: Page) => Promise<void>,\n browserTarget?: DriverTarget,\n ): Promise<NativeInput> => {\n const { page } = current(browserTarget).entry;\n\n if (into === undefined) {\n ticket.dispatch();\n await keys(page);\n } else\n await actions.withAdmittedElement(\n into,\n ticket,\n requireFocus,\n () => keys(page),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return receipt(page);\n };\n\n const press = (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n ) =>\n sanitize(() =>\n // Both halves are closed vocabularies by now, so the engine's `+` syntax is only ever ours.\n send(\n into,\n ticket,\n policy,\n (page) => page.keyboard.press([...modifiers, key].join(\"+\")),\n browserTarget,\n ),\n );\n\n const type = (\n text: string,\n into: string | ObservedElement | undefined,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n ) =>\n sanitize(() =>\n send(\n into,\n ticket,\n policy,\n async (page) => {\n for (const character of text) {\n // A fence between characters stops the rest; what was already sent stays unknown.\n ticket.check();\n await page.keyboard.type(character);\n }\n },\n browserTarget,\n ),\n );\n\n return { press, type };\n};\n","import { PageExecutionState, PageSuspension } from \"../../BrowserData.ts\";\nimport { Reasons, BrowserError } from \"../../Errors.ts\";\nimport type { Ticket } from \"./Owner.ts\";\n\nexport interface PageExecutionNative {\n readonly readRate: () => Promise<number>;\n readonly rate: (value: number) => Promise<void>;\n readonly focus: (enabled: boolean) => Promise<void>;\n readonly lifecycle: (state: \"active\" | \"frozen\") => Promise<void>;\n readonly activate: () => Promise<void>;\n readonly frameBarrier: (ticket: Ticket) => Promise<void>;\n readonly closed: () => boolean;\n readonly detach: () => Promise<void>;\n}\n\nconst fail = (\n reason: BrowserError[\"reason\"],\n outcome: \"undispatched\" | \"unknown\" = \"undispatched\",\n) => BrowserError.make({ operation: \"page-control\", reason, outcome });\n\n/** Owned by one native page/connection. Cleanup never resumes or rolls back a hold. */\nexport class PageExecution {\n private phase: PageExecutionState[\"state\"] = \"running\";\n private revision = 0;\n private receipt: PageSuspension | undefined;\n private priorRate: number | undefined;\n private disposed = false;\n readonly pageId: string;\n readonly targetId: string;\n private readonly port: PageExecutionNative;\n private readonly freshId: () => string;\n constructor(\n pageId: string,\n targetId: string,\n /** Each hold's receipt id, unique on this connection and never reissued by a later one. */\n freshId: () => string,\n port: PageExecutionNative,\n ) {\n this.pageId = pageId;\n this.targetId = targetId;\n this.port = port;\n this.freshId = freshId;\n }\n state(): PageExecutionState {\n if (this.disposed || this.port.closed()) throw fail(Reasons.Closed.make({}));\n\n return PageExecutionState.make({\n pageId: this.pageId,\n targetId: this.targetId,\n state: this.phase,\n ...(this.receipt === undefined ? {} : { suspensionId: this.receipt.suspensionId }),\n });\n }\n assertRunning(): void {\n if (this.disposed || this.port.closed()) throw fail(Reasons.Closed.make({}));\n if (this.phase !== \"running\") throw fail(Reasons.Busy.make({}));\n }\n invalidate(): boolean {\n const held = this.phase !== \"running\";\n\n this.revision++;\n this.receipt = undefined;\n if (held) this.phase = \"unknown\";\n\n return held;\n }\n private check(ticket: Ticket, revision: number): void {\n ticket.check();\n const outcome = ticket.dispatched ? \"unknown\" : \"undispatched\";\n\n if (this.disposed || this.port.closed()) throw fail(Reasons.Closed.make({}), outcome);\n if (this.revision !== revision) throw fail(Reasons.Stale.make({}), outcome);\n }\n private async write(\n ticket: Ticket,\n revision: number,\n command: () => Promise<void>,\n ): Promise<void> {\n this.check(ticket, revision);\n ticket.dispatch();\n await command();\n this.check(ticket, revision);\n }\n async suspend(ticket: Ticket): Promise<PageSuspension> {\n this.assertRunning();\n const revision = this.revision;\n\n this.check(ticket, revision);\n const rate = await this.port.readRate();\n\n this.check(ticket, revision);\n if (!Number.isFinite(rate)) throw fail(Reasons.Malformed.make({}));\n this.phase = \"unknown\";\n this.priorRate = rate;\n await this.write(ticket, revision, () => this.port.rate(0));\n await this.write(ticket, revision, () => this.port.focus(false));\n await this.write(ticket, revision, () => this.port.lifecycle(\"frozen\"));\n\n const receipt = Object.freeze(\n PageSuspension.make({\n pageId: this.pageId,\n targetId: this.targetId,\n suspensionId: this.freshId(),\n }),\n );\n\n this.check(ticket, revision);\n this.receipt = receipt;\n this.phase = \"suspended\";\n\n return receipt;\n }\n async resume(receipt: PageSuspension, ticket: Ticket): Promise<void> {\n this.check(ticket, this.revision);\n if (\n this.phase !== \"suspended\" ||\n this.receipt === undefined ||\n receipt.pageId !== this.pageId ||\n receipt.targetId !== this.targetId ||\n receipt.suspensionId !== this.receipt.suspensionId ||\n this.priorRate === undefined\n )\n throw fail(Reasons.Stale.make({}));\n const revision = this.revision;\n const rate = this.priorRate;\n\n this.receipt = undefined;\n this.phase = \"unknown\";\n await this.write(ticket, revision, () => this.port.lifecycle(\"active\"));\n await this.write(ticket, revision, () => this.port.activate());\n await this.write(ticket, revision, () => this.port.focus(true));\n // Blink anchors SetPlaybackRate to the last animation-frame clock. Settle one real frame at zero.\n await this.write(ticket, revision, () => this.port.frameBarrier(ticket));\n await this.write(ticket, revision, () => this.port.rate(rate));\n this.priorRate = undefined;\n this.phase = \"running\";\n }\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n this.phase = \"unknown\";\n this.receipt = undefined;\n this.revision++;\n await this.port.detach();\n }\n}\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Frame } from \"playwright-core\";\n\nimport { Identifier, type PageInfo, type PageSuspension } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { CallbackTasks } from \"./CallbackTasks.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport { PageExecution } from \"./PageExecution.ts\";\nimport type { Entry, Targets } from \"./Targets.ts\";\n\n/**\n * One native page execution per registered page, created once over its own CDP session. Its\n * receipt is invalidated when the page closes or its main frame navigates, and holds and\n * resumes act only on the exact page and target they name.\n */\nexport const makePageControl = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\n /** Suspension ids from an earlier connection never match a hold on this one. */\n connectionNamespace: string,\n targets: Targets,\n callbacks: CallbackTasks,\n events: DriverEvents,\n closing: () => boolean,\n /** A hold or a resume is about to be dispatched to this page. */\n held: (pageId: string) => void,\n) => {\n const { current, entries } = targets;\n let suspensions = 0;\n\n const suspensionId = () => `suspension-${connectionNamespace}-${++suspensions}`;\n\n const execution = (entry: Entry): Promise<PageExecution> => {\n if (!options.pageControl)\n return Promise.reject(failure(Reasons.Unsupported.make({}), \"undispatched\"));\n entry.execution ??= sanitize(async () => {\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n const targetId = await targets.targetId(entry);\n\n if (closing() || entry.page.isClosed()) throw failure(Reasons.Closed.make({}));\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled: true });\n if (closing() || entry.page.isClosed()) throw failure(Reasons.Closed.make({}));\n\n const control = new PageExecution(entry.id, targetId, suspensionId, {\n readRate: async () =>\n safeDecode(\n Schema.Struct({ playbackRate: Schema.Finite }),\n await cdp.send(\"Animation.getPlaybackRate\"),\n ).playbackRate,\n rate: async (playbackRate) => {\n await cdp.send(\"Animation.setPlaybackRate\", { playbackRate });\n },\n focus: async (enabled) => {\n await cdp.send(\"Emulation.setFocusEmulationEnabled\", { enabled });\n },\n lifecycle: async (state) => {\n await cdp.send(\"Page.setWebLifecycleState\", { state });\n },\n activate: async () => {\n await cdp.send(\"Page.bringToFront\");\n },\n closed: () => closing() || !browser.isConnected() || entry.page.isClosed(),\n detach: async () => {\n if (entry.page.isClosed() || !browser.isConnected()) return;\n try {\n await closeWithin(() => cdp.detach());\n } catch (error) {\n if (!entry.page.isClosed() && browser.isConnected()) throw error;\n }\n },\n frameBarrier: async (ticket) => {\n ticket.check();\n\n const tree = safeDecode(\n Schema.Struct({\n frameTree: Schema.Struct({ frame: Schema.Struct({ id: Identifier }) }),\n }),\n await cdp.send(\"Page.getFrameTree\"),\n );\n\n ticket.check();\n\n const world = await cdp.send(\"Page.createIsolatedWorld\", {\n frameId: tree.frameTree.frame.id,\n worldName: \"effect-browser-page-control\",\n });\n\n ticket.check();\n\n const result = await cdp.send(\"Runtime.evaluate\", {\n expression: \"new Promise(resolve => requestAnimationFrame(() => resolve(true)))\",\n contextId: safeDecode(\n Schema.Int.check(Schema.isGreaterThan(0)),\n world.executionContextId,\n ),\n awaitPromise: true,\n returnByValue: true,\n userGesture: false,\n timeout: Math.min(2000, ticket.remainingMillis()),\n });\n\n ticket.check();\n if (result.exceptionDetails !== undefined || result.result.value !== true)\n throw failure(Reasons.Malformed.make({}));\n },\n });\n\n entry.executionValue = control;\n\n return control;\n } catch (error) {\n await closeWithin(() => cdp.detach()).catch(() => {});\n throw error;\n }\n });\n\n return entry.execution;\n };\n\n const explicit = async (\n target: { readonly pageId: string; readonly targetId: string },\n ticket: Ticket,\n ) => {\n ticket.check();\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.Closed.make({}), \"undispatched\");\n const control = await execution(entry);\n\n ticket.check();\n if (control.targetId !== target.targetId) throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return control;\n };\n\n /** A closed page's execution is invalidated at once and disposed outside the event. */\n const closed = (entry: Entry) => {\n entry.executionValue?.invalidate();\n if (entry.execution !== undefined)\n callbacks.submit(async () => {\n await (await entry.execution)?.dispose();\n });\n };\n\n /** A main-frame navigation invalidates the execution; one that was held faults the session. */\n const navigating = (entry: Entry, frame: Frame) => {\n if (frame === entry.page.mainFrame() && entry.executionValue?.invalidate())\n events.fault({ source: \"native\", reason: \"page-control\", disposition: \"unknown\" });\n };\n\n const operations: NonNullable<Driver[\"pageControl\"]> = {\n state: (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => (await explicit(page, ticket)).state()),\n // Announced before the dispatch, so an unknown outcome still leaves nothing unchecked.\n suspend: (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const control = await explicit(page, ticket);\n\n held(control.pageId);\n\n return control.suspend(ticket);\n }),\n resume: (receipt: PageSuspension, ticket: Ticket) =>\n sanitize(async () => {\n const control = await explicit(receipt, ticket);\n\n held(control.pageId);\n\n return control.resume(receipt, ticket);\n }),\n checkTarget: (target, ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const control = await execution(current(target).entry);\n\n ticket.check();\n control.assertRunning();\n }),\n };\n\n const dispose = () =>\n Promise.allSettled(\n [...entries.values()].map(async (entry) => {\n if (entry.execution !== undefined) await (await entry.execution).dispose();\n }),\n );\n\n return { execution, closed, navigating, operations, dispose };\n};\n","import { Schema } from \"effect\";\nimport type { ElementHandle, Page } from \"playwright-core\";\n\nimport type { ObservedElement } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { makeActions } from \"./Actions.ts\";\nimport type { DriverTarget } from \"./Driver.ts\";\nimport { failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport type { Ticket } from \"./Owner.ts\";\nimport type { Targets } from \"./Targets.ts\";\n\nexport interface NativePoint {\n readonly x: number;\n readonly y: number;\n}\n\n/** What one native pointer command did. The session adds target identity and the host clock. */\nexport interface NativeInput {\n /** The last point this driver commanded on the page, or null if it never placed the pointer. */\n readonly position: NativePoint | null;\n}\n\nconst Reach = Schema.Struct({\n x: Schema.Finite,\n y: Schema.Finite,\n reachable: Schema.Boolean,\n});\n\n/** Runs in each document on the path to the exact node, including cross-origin frames. */\nconst hitPoint = (\n node: Node,\n input: NativePoint & { readonly child: boolean },\n): { readonly x: number; readonly y: number; readonly reachable: boolean } => {\n const refused = { x: input.x, y: input.y, reachable: false };\n\n if (\n !(node instanceof Element) ||\n !node.isConnected ||\n input.x < 0 ||\n input.y < 0 ||\n input.x >= innerWidth ||\n input.y >= innerHeight\n )\n return refused;\n\n let hit = node.ownerDocument.elementFromPoint(input.x, input.y);\n\n for (let depth = 0; hit?.shadowRoot; depth++) {\n if (depth >= 32) return refused;\n const inner = hit.shadowRoot.elementFromPoint(input.x, input.y);\n\n if (inner === null || inner === hit) break;\n hit = inner;\n }\n if (hit === null || (hit !== node && !node.contains(hit))) return refused;\n if (!input.child) return { x: input.x, y: input.y, reachable: true };\n if (!(node instanceof HTMLElement)) return refused;\n\n // Mapping a bounding rectangle through rotation/perspective would guess a point. Admit\n // positive axis-aligned scaling/translation; reject unsupported transforms before input.\n let ancestor: Element | null = node;\n\n for (let depth = 0; ancestor !== null; depth++) {\n if (depth >= 128) return refused;\n const style = getComputedStyle(ancestor);\n const rotation = style.getPropertyValue(\"rotate\");\n const scale = style.getPropertyValue(\"scale\");\n\n if (\n (rotation !== \"\" && rotation !== \"none\" && rotation !== \"0deg\") ||\n (scale !== \"\" &&\n scale !== \"none\" &&\n scale.split(/\\s+/).some((axis) => !(Number.parseFloat(axis) > 0))) ||\n style.perspective !== \"none\" ||\n (style.offsetPath !== \"\" && style.offsetPath !== \"none\")\n )\n return refused;\n if (style.transform !== \"none\") {\n const matrix = new DOMMatrixReadOnly(style.transform);\n\n if (!matrix.is2D || matrix.b !== 0 || matrix.c !== 0 || matrix.a <= 0 || matrix.d <= 0)\n return refused;\n }\n const root = ancestor.getRootNode();\n\n ancestor = ancestor.parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n const rect = node.getBoundingClientRect();\n const scaleX = rect.width / node.offsetWidth;\n const scaleY = rect.height / node.offsetHeight;\n\n if (!Number.isFinite(scaleX) || !Number.isFinite(scaleY) || scaleX <= 0 || scaleY <= 0)\n return refused;\n const style = getComputedStyle(node);\n const left = Number.parseFloat(style.paddingLeft);\n const top = Number.parseFloat(style.paddingTop);\n const right = Number.parseFloat(style.paddingRight);\n const bottom = Number.parseFloat(style.paddingBottom);\n const x = (input.x - rect.left) / scaleX - node.clientLeft - left;\n const y = (input.y - rect.top) / scaleY - node.clientTop - top;\n\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n x < 0 ||\n y < 0 ||\n x >= node.clientWidth - left - right ||\n y >= node.clientHeight - top - bottom\n )\n return refused;\n\n return { x, y, reachable: true };\n};\n\n/**\n * Real pointer input to the selected page. Every command is one the browser would receive from\n * a person, so handlers see trusted events and the browser decides what is under the pointer.\n * Nothing here scrolls, eases or retries: a caller that wants a trajectory sends its points.\n */\nexport const makePointer = (targets: Targets, actions: ReturnType<typeof makeActions>) => {\n const { current } = targets;\n // Chromium keeps a pointer position per page; this is only the last one this driver set.\n const positions = new WeakMap<Page, NativePoint | null>();\n\n const moveTo = async (page: Page, point: NativePoint): Promise<void> => {\n await page.mouse.move(point.x, point.y);\n positions.set(page, point);\n };\n\n const receipt = (page: Page): NativeInput => ({ position: positions.get(page) ?? null });\n\n const invalidate = (page: Page): void => {\n positions.set(page, null);\n };\n\n const pointerMove = (point: NativePoint, ticket: Ticket, target?: DriverTarget) =>\n sanitize(async () => {\n const { page } = current(target).entry;\n\n ticket.dispatch();\n await moveTo(page, point);\n ticket.check();\n\n return receipt(page);\n });\n\n /**\n * The centre of the element's box, in main-frame viewport pixels, and only if the pointer can\n * really be placed there: the box has area, the point is inside the viewport, and the element\n * is what the browser finds at that point. An open shadow root is followed to the node a\n * person would actually be over.\n */\n const reachablePoint = async (\n page: Page,\n element: ElementHandle<Element>,\n ): Promise<NativePoint> => {\n const box = await element.boundingBox();\n\n if (box === null || box.width <= 0 || box.height <= 0)\n throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n const point = { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n\n const ancestors: Array<ElementHandle<Node>> = [];\n\n try {\n let frame = await element.ownerFrame();\n\n if (frame === null || frame.page() !== page)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n while (frame !== page.mainFrame()) {\n if (ancestors.length >= 32)\n throw failure(\n Reasons.Limit.make({\n dimension: \"frame-depth\",\n maximum: 32,\n observed: ancestors.length,\n }),\n \"undispatched\",\n );\n ancestors.push(await frame.frameElement());\n frame = frame.parentFrame();\n if (frame === null) throw failure(Reasons.Stale.make({}), \"undispatched\");\n }\n\n let localPoint = point;\n\n // A visible node in a child can still sit behind an overlay in any ancestor. Check the\n // actual commanded point from the main viewport down, then hit-test the exact node.\n for (const ancestor of ancestors.reverse()) {\n const reached = safeDecode(\n Reach,\n await ancestor.evaluate(hitPoint, { ...localPoint, child: true }),\n );\n\n if (!reached.reachable) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n localPoint = { x: reached.x, y: reached.y };\n }\n\n const reached = safeDecode(\n Reach,\n await element.evaluate(hitPoint, { ...localPoint, child: false }),\n );\n\n if (!reached.reachable) throw failure(Reasons.NotVisible.make({}), \"undispatched\");\n } finally {\n await Promise.all(ancestors.map((ancestor) => ancestor.dispose()));\n }\n\n return point;\n };\n\n const hover = (\n target: string | ObservedElement,\n ticket: Ticket,\n policy?: AdmissionPolicy,\n browserTarget?: DriverTarget,\n ) =>\n sanitize(async () => {\n const { page } = current(browserTarget).entry;\n\n await actions.withAdmittedElement(\n target,\n ticket,\n (element) => reachablePoint(page, element),\n (_element, point) => moveTo(page, point),\n policy,\n browserTarget,\n );\n ticket.check();\n\n return receipt(page);\n });\n\n const wheel = (\n deltaX: number,\n deltaY: number,\n at: NativePoint | undefined,\n ticket: Ticket,\n target?: DriverTarget,\n ) =>\n sanitize(async () => {\n const { page } = current(target).entry;\n\n ticket.dispatch();\n if (at !== undefined) await moveTo(page, at);\n // Dispatched, not awaited: Chromium scrolls afterwards, on its own schedule.\n await page.mouse.wheel(deltaX, deltaY);\n ticket.check();\n\n return receipt(page);\n });\n\n return { pointerMove, hover, wheel, receipt, invalidate };\n};\n","import type { DriverEvents, DriverFault } from \"./Driver.ts\";\n\ntype PolicyReason = Extract<DriverFault, { readonly source: \"policy\" }>[\"reason\"];\n\nexport type CleanupDisposition = \"confirmed\" | \"not-dispatched\" | \"unknown\";\n\ninterface CleanupOptions {\n /** Absent for an ordinary policy close or dismissal within the configured bounds. */\n readonly overflow?: PolicyReason;\n /** A modeled dismissal checks its ticket immediately before the native dispatch. */\n readonly dispatch?: () => void;\n /** Delivers one bounded result, including to the captured before-unload navigation. */\n readonly settled?: (disposition: CleanupDisposition) => void;\n}\n\n/**\n * One connection's policy closes and dismissals. The timer bounds observation, never native\n * capacity: a late native promise still owns its slot. Exact objects share their first result,\n * including an uncertain result, so neither another event nor shutdown resends that command.\n */\nexport class PolicyCleanup {\n private readonly pending = new Set<Promise<void>>();\n private readonly results = new WeakMap<object, Promise<CleanupDisposition>>();\n private readonly timers = new Set<ReturnType<typeof setTimeout>>();\n private readonly retirements = new Set<() => void>();\n private readonly refused = {};\n private stopped = false;\n private connectionRetired = false;\n\n private readonly events: Pick<DriverEvents, \"fault\">;\n\n constructor(events: Pick<DriverEvents, \"fault\">) {\n this.events = events;\n }\n\n run(\n subject: object,\n action: () => Promise<unknown>,\n options: CleanupOptions = {},\n ): Promise<CleanupDisposition> {\n const existing = this.results.get(subject);\n\n if (existing !== undefined) return existing;\n let resolve: (disposition: CleanupDisposition) => void = () => {};\n let completed = false;\n\n const result = new Promise<CleanupDisposition>((done) => {\n resolve = done;\n });\n\n this.results.set(subject, result);\n const token = {};\n\n const record = (\n disposition: CleanupDisposition | \"pending\" | \"dispatched\",\n identity: object = token,\n ) => {\n if (this.connectionRetired) return;\n if (options.overflow !== undefined)\n this.events.fault({\n source: \"policy\",\n reason: options.overflow,\n token: identity,\n disposition,\n });\n else if (disposition === \"unknown\" || disposition === \"not-dispatched\")\n this.events.fault({ source: \"native\", reason: \"callback\", disposition });\n };\n\n const finish = (disposition: CleanupDisposition) => {\n if (completed) return;\n completed = true;\n options.settled?.(disposition);\n resolve(disposition);\n };\n\n if (this.stopped || this.pending.size >= 32) {\n if (!this.stopped) record(\"not-dispatched\", this.refused);\n finish(\"not-dispatched\");\n\n return result;\n }\n let dispatched = false;\n const retire = () => finish(dispatched ? \"unknown\" : \"not-dispatched\");\n\n this.retirements.add(retire);\n\n const execution = async (): Promise<CleanupDisposition> => {\n if (this.stopped) {\n return \"not-dispatched\";\n }\n try {\n options.dispatch?.();\n } catch {\n return \"not-dispatched\";\n }\n dispatched = true;\n record(\"dispatched\");\n\n const timer = setTimeout(() => {\n this.timers.delete(timer);\n record(\"unknown\");\n finish(\"unknown\");\n }, 2000);\n\n this.timers.add(timer);\n try {\n await action();\n\n return \"confirmed\";\n } catch {\n return \"unknown\";\n } finally {\n clearTimeout(timer);\n this.timers.delete(timer);\n }\n };\n\n const task = Promise.resolve()\n .then(execution)\n .then((disposition) => {\n // Release capacity before waking a confirmed waiter that may submit the next cleanup.\n this.pending.delete(task);\n this.retirements.delete(retire);\n // A late acknowledgement is evidence, but cannot change the waiter's unknown result.\n if (!completed || disposition === \"confirmed\") record(disposition);\n finish(disposition);\n });\n\n this.pending.add(task);\n record(\"pending\");\n\n return result;\n }\n\n /** Stop admission before native disconnection; accepted promises remain observed. */\n stop(): void {\n this.stopped = true;\n }\n\n /** Only confirmed connection retirement may forget deadline observers of unresolved work. */\n retired(): void {\n this.stop();\n this.connectionRetired = true;\n for (const timer of this.timers) clearTimeout(timer);\n this.timers.clear();\n for (const retire of this.retirements) retire();\n this.retirements.clear();\n this.pending.clear();\n }\n\n async settle(): Promise<void> {\n await Promise.all(this.pending);\n }\n}\n","import { Schema } from \"effect\";\nimport type { Browser, BrowserContext, Dialog, Frame, Page } from \"playwright-core\";\n\nimport { FrameInfo, PageInfo, Identifier } from \"../../BrowserData.ts\";\nimport { Reasons } from \"../../Errors.ts\";\nimport type { DriverOptions, DriverTarget } from \"./Driver.ts\";\nimport { closeWithin, failure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport type { ObservationScope, Ticket } from \"./Owner.ts\";\nimport type { PageExecution } from \"./PageExecution.ts\";\n\nconst TargetInfo = Schema.Struct({\n targetInfo: Schema.Struct({ targetId: Identifier, type: Schema.Literal(\"page\") }),\n});\n\nconst URLText = Schema.String.check(Schema.isMaxLength(8192));\n\nexport interface Entry {\n readonly id: string;\n readonly page: Page;\n targetId?: string;\n readonly off: Array<() => void>;\n execution?: Promise<PageExecution>;\n executionValue?: PageExecution;\n}\n\n/** The selected page and frame. Only the registry and the connection's own setup assign it. */\nexport interface Selection {\n entry?: Entry;\n frame?: Frame;\n}\n\n/**\n * What the other driver seams do when a registered page changes. The registry calls each at one\n * fixed point of its own event handling, so their order relative to its state never moves.\n */\nexport interface TargetHooks {\n /** A tracked page was registered; `created` while this driver is opening the page itself. */\n readonly opened: (entry: Entry, created: boolean) => void;\n /** An excess page is never admitted to this registry; its configured policy owns cleanup. */\n readonly overflow: (entry: Entry) => void;\n /** Before a closed page leaves the registry. */\n readonly closed: (entry: Entry) => void;\n /** Before a navigated frame's document epoch advances. */\n readonly navigating: (entry: Entry, frame: Frame) => void;\n /** After a navigated frame's document epoch advances. */\n readonly navigated: (entry: Entry, frame: Frame) => void;\n /** A URL changed inside the current document; no observation or document epoch is retired. */\n readonly sameDocumentNavigated: (entry: Entry, frame: Frame) => void;\n /** A frame navigated or detached, before any consequence for the selection. */\n readonly frameChanged: (entry: Entry, frame: Frame) => void;\n readonly dialog: (entry: Entry, dialog: Dialog) => void;\n /** Selection changes notify the owner without retiring another page's retained nodes. */\n readonly changed: (reason: \"target-changed\", scope: ObservationScope) => void;\n}\n\ninterface ClientFrameNavigation {\n readonly newDocument?: unknown;\n readonly error?: unknown;\n}\n\ninterface ClientFrame {\n readonly _eventEmitter: {\n readonly on: (event: \"navigated\", listener: (event: ClientFrameNavigation) => void) => void;\n readonly off: (event: \"navigated\", listener: (event: ClientFrameNavigation) => void) => void;\n };\n}\n\n/**\n * Playwright 1.63.0's client Frame emits this synchronous private event before the public Page\n * `framenavigated` event. Its `newDocument` field distinguishes document commits from URL-only\n * changes. A missing emitter is an unsupported runtime, never a reason to guess from the URL.\n */\nconst clientNavigationEmitter = (frame: Frame): ClientFrame[\"_eventEmitter\"] => {\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- accesses the exact pinned client seam described above\n const emitter = (frame as unknown as ClientFrame)._eventEmitter;\n\n if (typeof emitter?.on !== \"function\" || typeof emitter.off !== \"function\")\n throw new Error(\"Playwright 1.63.0 client Frame navigation event is unavailable\");\n\n return emitter;\n};\n\n/**\n * The connection's pages, frames and document epochs, and the one selected target every other\n * seam acts on. A page beyond the configured bound is handed to policy recovery, never tracked.\n */\nexport const makeTargets = (\n browser: Browser,\n context: BrowserContext,\n options: DriverOptions,\n /**\n * FrameInfo is connection-local public metadata. A new driver after reconnect must never\n * regenerate an old frame id for a different frame, even when serial order happens to match.\n */\n connectionNamespace: string,\n closing: () => boolean,\n hooks: TargetHooks,\n) => {\n const entries = new Map<string, Entry>();\n const byPage = new WeakMap<Page, Entry>();\n const frameIds = new WeakMap<Frame, string>();\n // A frame object outlives its documents, so readiness is keyed by frame *and* epoch.\n const documentEpochs = new WeakMap<Frame, number>();\n const selection: Selection = {};\n // Pages whose navigation this driver began and has not seen settle.\n const navigating = new Set<string>();\n\n let serial = 0,\n frameSerial = 0;\n\n let creatingPage = false;\n\n const epochOf = (frame: Frame): number => documentEpochs.get(frame) ?? 0;\n\n const frameId = (frame: Frame): string => {\n let id = frameIds.get(frame);\n\n if (id === undefined) {\n id = `frame-${connectionNamespace}-${++frameSerial}`;\n frameIds.set(frame, id);\n }\n\n return id;\n };\n\n const register = (page: Page): Entry => {\n const existing = byPage.get(page);\n\n if (existing !== undefined) return existing;\n const entry: Entry = { id: `page-${connectionNamespace}-${++serial}`, page, off: [] };\n\n byPage.set(page, entry);\n if (entries.size >= options.maxPages) {\n hooks.overflow(entry);\n\n return entry;\n }\n entries.set(entry.id, entry);\n const sameDocumentNavigations = new WeakSet<Frame>();\n const frameNavigationOff = new WeakMap<Frame, () => void>();\n\n const watchFrameNavigation = (frame: Frame): void => {\n if (frameNavigationOff.has(frame)) return;\n const emitter = clientNavigationEmitter(frame);\n\n const onNavigated = (event: ClientFrameNavigation) => {\n if (event.error !== undefined || event.newDocument !== undefined) return;\n sameDocumentNavigations.add(frame);\n hooks.sameDocumentNavigated(entry, frame);\n };\n\n emitter.on(\"navigated\", onNavigated);\n const off = () => emitter.off(\"navigated\", onNavigated);\n\n frameNavigationOff.set(frame, off);\n entry.off.push(off);\n };\n\n for (const frame of page.frames()) {\n frameId(frame);\n watchFrameNavigation(frame);\n }\n\n const onClose = () => {\n hooks.closed(entry);\n entries.delete(entry.id);\n for (const off of entry.off.splice(0)) off();\n if (selection.entry === entry) {\n selection.entry = undefined;\n selection.frame = undefined;\n hooks.changed(\"target-changed\", { pageId: entry.id });\n }\n };\n\n const onNavigation = (frame: Frame) => {\n // The private client event above runs synchronously before this public event.\n if (sameDocumentNavigations.delete(frame)) return;\n hooks.navigating(entry, frame);\n documentEpochs.set(frame, epochOf(frame) + 1);\n hooks.navigated(entry, frame);\n frameId(frame);\n hooks.frameChanged(entry, frame);\n if (selection.entry === entry && (selection.frame === frame || frame === page.mainFrame()))\n hooks.changed(\"target-changed\", { pageId: entry.id });\n };\n\n const onDetached = (frame: Frame) => {\n const off = frameNavigationOff.get(frame);\n\n off?.();\n const cleanupIndex = off === undefined ? -1 : entry.off.indexOf(off);\n\n if (cleanupIndex !== -1) entry.off.splice(cleanupIndex, 1);\n frameNavigationOff.delete(frame);\n hooks.frameChanged(entry, frame);\n if (selection.frame === frame) {\n selection.frame = undefined;\n hooks.changed(\"target-changed\", { pageId: entry.id });\n }\n };\n\n const onDialog = (dialog: Dialog) => {\n hooks.dialog(entry, dialog);\n };\n\n const onFrameAttached = (frame: Frame) => {\n frameId(frame);\n watchFrameNavigation(frame);\n };\n\n page.on(\"close\", onClose);\n page.on(\"frameattached\", onFrameAttached);\n page.on(\"framenavigated\", onNavigation);\n page.on(\"framedetached\", onDetached);\n page.on(\"dialog\", onDialog);\n entry.off.push(\n () => page.off(\"close\", onClose),\n () => page.off(\"frameattached\", onFrameAttached),\n () => page.off(\"framenavigated\", onNavigation),\n () => page.off(\"framedetached\", onDetached),\n () => page.off(\"dialog\", onDialog),\n );\n hooks.opened(entry, creatingPage);\n\n return entry;\n };\n\n const selectedCurrent = () => {\n if (\n closing() ||\n !browser.isConnected() ||\n selection.entry === undefined ||\n selection.entry.page.isClosed() ||\n selection.frame === undefined ||\n selection.frame.isDetached()\n )\n throw failure(Reasons.Closed.make({}), \"undispatched\");\n\n return { entry: selection.entry, frame: selection.frame };\n };\n\n const explicitCurrent = (target: DriverTarget) => {\n if (closing() || !browser.isConnected()) throw failure(Reasons.Closed.make({}), \"undispatched\");\n const entry = entries.get(target.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n const frame = entry.page.frames().find((candidate) => frameId(candidate) === target.frameId);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return { entry, frame };\n };\n\n const current = (target?: DriverTarget) =>\n target === undefined ? selectedCurrent() : explicitCurrent(target);\n\n const targetId = async (entry: Entry, ticket?: Ticket): Promise<string> => {\n ticket?.check();\n if (entry.targetId !== undefined) return entry.targetId;\n const cdp = await context.newCDPSession(entry.page);\n\n try {\n ticket?.check();\n const info: unknown = await cdp.send(\"Target.getTargetInfo\");\n\n ticket?.check();\n entry.targetId = safeDecode(TargetInfo, info).targetInfo.targetId;\n\n return entry.targetId;\n } finally {\n await closeWithin(() => cdp.detach()).catch(() => {});\n }\n };\n\n const urlOf = (frame: Frame) => safeDecode(URLText, frame.url());\n\n const selectedUrl = () => urlOf(selectedCurrent().frame);\n const url = (target?: DriverTarget) => urlOf(current(target).frame);\n\n /**\n * Chooses the connection's first target: a page it opens itself, the one the caller named, or\n * the only page present. Assignments land on the live selection as they happen.\n */\n const selectInitial = async (): Promise<void> => {\n if (options.newPage || entries.size === 0) {\n creatingPage = true;\n try {\n selection.entry = register(await context.newPage());\n } finally {\n creatingPage = false;\n }\n } else if (options.initialTargetId !== undefined) {\n for (const entry of entries.values())\n if ((await targetId(entry)) === options.initialTargetId) selection.entry = entry;\n if (selection.entry === undefined) throw failure(Reasons.NotFound.make({}));\n } else {\n if (entries.size !== 1) throw failure(Reasons.Ambiguous.make({}));\n selection.entry = entries.values().next().value;\n }\n };\n\n const clear = () => {\n entries.clear();\n selection.entry = undefined;\n selection.frame = undefined;\n };\n\n const selected = () => {\n const { entry, frame } = current();\n\n return { pageId: entry.id, frameId: frameId(frame) };\n };\n\n const selectedTargetId = () => sanitize(() => targetId(current().entry));\n\n /** Describe this exact entry, including when creation has already dispatched. */\n const pageInfo = async (entry: Entry, ticket: Ticket): Promise<PageInfo> => {\n const id = await targetId(entry, ticket);\n\n ticket.check();\n const title: unknown = await entry.page.title();\n\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), ticket.dispatched ? \"unknown\" : \"undispatched\");\n if (typeof title !== \"string\") throw failure(Reasons.Malformed.make({ path: \"page.title\" }));\n\n return safeDecode(PageInfo, {\n pageId: entry.id,\n targetId: id,\n title: title.slice(0, 512),\n url: entry.page.url(),\n selected: selection.entry === entry,\n });\n };\n\n const listPages = (ticket: Ticket) =>\n sanitize(async () => {\n ticket.check();\n const output: PageInfo[] = [];\n\n for (const entry of entries.values()) output.push(await pageInfo(entry, ticket));\n\n return output;\n });\n\n const explicitPage = async (page: PageInfo, ticket: Ticket): Promise<Entry> => {\n ticket.check();\n const entry = entries.get(page.pageId);\n\n if (entry === undefined || entry.page.isClosed())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n if ((await targetId(entry, ticket)) !== page.targetId)\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n\n return entry;\n };\n\n const resolvePage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n return { pageId: entry.id, frameId: frameId(entry.page.mainFrame()) };\n });\n\n const selectPage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n ticket.check();\n if (entries.get(entry.id) !== entry || entry.page.isClosed())\n throw failure(Reasons.Stale.make({}), \"undispatched\");\n selection.entry = entry;\n selection.frame = entry.page.mainFrame();\n hooks.changed(\"target-changed\", \"none\");\n });\n\n const newPage = (ticket: Ticket) =>\n sanitize(async () => {\n if (entries.size >= options.maxPages)\n throw failure(\n Reasons.Limit.make({\n dimension: \"pages\",\n maximum: options.maxPages,\n observed: entries.size,\n }),\n \"undispatched\",\n );\n ticket.dispatch();\n creatingPage = true;\n let entry: Entry;\n\n try {\n const page = await context.newPage();\n\n if (ticket.signal.aborted) {\n await closeWithin(() => page.close()).catch(() => {});\n ticket.check();\n }\n\n entry = register(page);\n } finally {\n creatingPage = false;\n }\n\n // Creation never selects or relists. A failed metadata read cannot repeat the creation.\n return pageInfo(entry, ticket);\n });\n\n const closePage = (page: PageInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n ticket.dispatch();\n await entry.page.close({ runBeforeUnload: false });\n ticket.check();\n });\n\n const listFrames = (ticket: Ticket, page?: PageInfo) =>\n sanitize(async () => {\n ticket.check();\n const entry = page === undefined ? selectedCurrent().entry : await explicitPage(page, ticket);\n const frames = entry.page.frames();\n\n if (frames.length > 128)\n throw failure(\n Reasons.Limit.make({ dimension: \"frames\", maximum: 128, observed: frames.length }),\n );\n\n return frames.map((frame) => {\n const parent = frame.parentFrame();\n\n return safeDecode(FrameInfo, {\n frameId: frameId(frame),\n parentFrameId: parent === null ? null : frameId(parent),\n url: frame.url(),\n name: frame.name().slice(0, 256),\n });\n });\n });\n\n const resolveFrame = (page: PageInfo, requested: FrameInfo, ticket: Ticket) =>\n sanitize(async () => {\n const entry = await explicitPage(page, ticket);\n\n const frame = entry.page\n .frames()\n .find((candidate) => frameId(candidate) === requested.frameId);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n\n return { pageId: entry.id, frameId: frameId(frame) };\n });\n\n const selectFrame = (id: string, ticket: Ticket) =>\n sanitize(async () => {\n const entry = selection.entry;\n\n if (entry === undefined) throw failure(Reasons.Closed.make({}));\n const frame = entry.page.frames().find((f) => frameId(f) === id);\n\n if (frame === undefined || frame.isDetached())\n throw failure(Reasons.NotFound.make({}), \"undispatched\");\n ticket.check();\n selection.frame = frame;\n hooks.changed(\"target-changed\", \"none\");\n });\n\n return {\n entries: entries as ReadonlyMap<string, Entry>,\n selection,\n epochOf,\n frameId,\n register,\n current,\n targetId,\n urlOf,\n /** A navigation this driver began on the page is still in flight. */\n navigating: {\n begin: (pageId: string) => void navigating.add(pageId),\n end: (pageId: string) => void navigating.delete(pageId),\n has: (pageId: string) => navigating.has(pageId),\n },\n selectedUrl,\n url,\n selectInitial,\n clear,\n selected,\n selectedTargetId,\n listPages,\n resolvePage,\n selectPage,\n newPage,\n closePage,\n listFrames,\n resolveFrame,\n selectFrame,\n };\n};\n\nexport type Targets = ReturnType<typeof makeTargets>;\n","import { Schema } from \"effect\";\nimport type { Browser, CDPSession, Dialog, Frame, Page } from \"playwright-core\";\n\nimport { Reasons, BrowserError, InitializationError } from \"../../Errors.ts\";\nimport { makeActions } from \"./Actions.ts\";\nimport type { ConnectionIdentity } from \"./Binding.ts\";\nimport { CallbackTasks } from \"./CallbackTasks.ts\";\nimport { makeCaptureSources } from \"./CaptureSource.ts\";\nimport type { Driver, DriverEvents, DriverOptions } from \"./Driver.ts\";\nimport { makeInitialization } from \"./Initialization.ts\";\nimport { makeKeyboard } from \"./Keyboard.ts\";\nimport { closeWithin, failure, NativeFailure, safeDecode, sanitize } from \"./NativeCalls.ts\";\nimport { makePageControl } from \"./NativePageControl.ts\";\nimport { makeObservation } from \"./Observation.ts\";\nimport { makePointer } from \"./Pointer.ts\";\nimport { PolicyCleanup } from \"./PolicyCleanup.ts\";\nimport { type Entry, makeTargets } from \"./Targets.ts\";\n\nconst NativeWindow = Schema.Struct({ windowId: Schema.Natural });\n\n/**\n * Connects to an already validated or host-resolved CDP endpoint and builds the one driver. The\n * import is lazy, so constructing any Layer cannot load Playwright or allocate a browser. A\n * trusted observer sees the engine's browser before the driver exists and never replaces it.\n */\nexport const connectPlaywrightEndpoint = async (\n endpoint: string,\n signal: AbortSignal,\n identity: ConnectionIdentity,\n options: DriverOptions,\n events: DriverEvents,\n observe?: (browser: Browser) => void,\n): Promise<Driver> => {\n if (signal.aborted) throw failure(Reasons.Interrupted.make({}));\n const { chromium } = await import(\"playwright-core\");\n\n const browser = await sanitize(() =>\n chromium.connectOverCDP(endpoint, {\n timeout: 15000,\n ...(options.pageControl ? { noDefaults: true } : {}),\n }),\n );\n\n if (signal.aborted) {\n await closeWithin(() => browser.close()).catch(() => {});\n throw failure(Reasons.Interrupted.make({}));\n }\n try {\n observe?.(browser);\n const driver = await makePlaywrightDriver(browser, identity, options, events);\n\n if (signal.aborted) {\n await driver.disconnect().catch(() => {});\n throw failure(Reasons.Interrupted.make({}));\n }\n\n return driver;\n } catch (error) {\n await closeWithin(() => browser.close()).catch(() => {});\n throw Schema.is(BrowserError)(error) ||\n Schema.is(InitializationError)(error) ||\n Schema.is(NativeFailure)(error)\n ? error\n : failure(Reasons.Provider.make({}));\n }\n};\n\n/** Tests may supply a real already-connected browser. This is deliberately not an exported subpath. */\nexport const makePlaywrightDriver = async (\n browser: Browser,\n identity: ConnectionIdentity,\n options: DriverOptions,\n events: DriverEvents,\n): Promise<Driver> => {\n // This constructor is reached only after native acquisition, including in driver tests.\n const { errors } = await import(\"playwright-core\");\n const contexts = browser.contexts();\n const [context] = contexts;\n\n if (contexts.length !== 1 || context === undefined) throw failure(Reasons.Ambiguous.make({}));\n\n const dialogs = new Map<\n Dialog,\n { readonly dismissed: (confirmed: boolean) => void } | undefined\n >();\n\n const callbacks = new CallbackTasks(32, (disposition) =>\n events.fault({ source: \"native\", reason: \"callback\", disposition }),\n );\n\n const policyCleanup = new PolicyCleanup(events);\n const blockedPopup = {};\n\n let closing = false;\n let initialized = false;\n let browserCdp: CDPSession | undefined;\n let sameDocumentCapture: (entry: Entry, frame: Frame) => void = () => {};\n\n const targets = makeTargets(browser, context, options, identity.namespace, () => closing, {\n opened: (entry, created) => {\n if (initialized && !created && options.popupPolicy === \"close\") {\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }));\n\n return;\n }\n if (initialized && options.pageControl)\n callbacks.submit(async () => {\n await pageControl.execution(entry);\n });\n if (initialized) initialization.attachPage(entry.page);\n if (initialized && !created && options.popupPolicy === \"pause\") events.pause(\"popup\");\n },\n overflow: (entry) => {\n if (options.popupPolicy === \"close\")\n void policyCleanup.run(entry.page, () => entry.page.close({ runBeforeUnload: false }), {\n overflow: \"popup-overflow\",\n });\n else\n events.fault({\n source: \"policy\",\n reason: \"popup-overflow\",\n token: blockedPopup,\n disposition: \"not-dispatched\",\n });\n },\n closed: (entry) => {\n actions.waitChanged(entry);\n for (const [dialog, beforeUnload] of dialogs)\n if (dialog.page() === entry.page) {\n beforeUnload?.dismissed(false);\n dialogs.delete(dialog);\n }\n observation.invalidate({ pageId: entry.id });\n pageControl.closed(entry);\n captures.forget(entry);\n },\n navigating: (entry, frame) => pageControl.navigating(entry, frame),\n navigated: (entry, frame) => {\n if (initialized) initialization.attachFrame(frame, entry.page);\n },\n sameDocumentNavigated: (entry, frame) => sameDocumentCapture(entry, frame),\n frameChanged: (entry, frame) => {\n actions.waitChanged(entry, frame);\n // Only the frame an observation read can change what it names.\n observation.invalidate({ pageId: entry.id, frameId: targets.frameId(frame) });\n captures.invalidate(entry, \"target-changed\", frame);\n },\n dialog: (entry, dialog) => {\n // Capture the exact navigation now. A page lookup after acknowledgement could name its successor.\n const beforeUnload =\n dialog.type() === \"beforeunload\" ? actions.beforeUnload(entry.id) : undefined;\n\n const overflow = dialogs.size >= 8;\n\n if (options.dialogPolicy === \"dismiss\" || overflow)\n void policyCleanup.run(dialog, () => dialog.dismiss(), {\n ...(overflow ? { overflow: \"dialog-overflow\" } : {}),\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n else {\n dialogs.set(dialog, beforeUnload);\n observation.invalidate();\n events.pause(\"dialog\");\n }\n },\n changed: (reason, scope) => observation.changed(reason, scope),\n });\n\n const { current, entries, register } = targets;\n\n const initialization = makeInitialization(\n context,\n options,\n identity.bindings,\n targets,\n callbacks,\n events,\n () => closing,\n );\n\n const observation = makeObservation(targets, identity.namespace, events);\n\n const actions = makeActions(\n context,\n targets,\n observation,\n (error) => error instanceof errors.TimeoutError,\n );\n\n const pointer = makePointer(targets, actions);\n\n actions.setPointerInvalidator(pointer.invalidate);\n const keyboard = makeKeyboard(targets, actions, pointer.receipt);\n const captures = makeCaptureSources(targets);\n\n sameDocumentCapture = captures.sameDocumentNavigated;\n\n const pageControl = makePageControl(\n browser,\n context,\n options,\n identity.namespace,\n targets,\n callbacks,\n events,\n () => closing,\n (pageId) => observation.held(pageId),\n );\n\n const onPage = (page: Page) => {\n register(page);\n };\n\n const retired = () => {\n policyCleanup.retired();\n actions.retireWait();\n observation.retireConnection();\n events.retired?.();\n };\n\n const onDisconnected = () => {\n retired();\n if (!closing) {\n observation.invalidate();\n events.disconnected();\n }\n };\n\n context.on(\"page\", onPage);\n browser.on(\"disconnected\", onDisconnected);\n\n const sizeNativeContents = async (entry: Entry): Promise<void> => {\n if (browserCdp === undefined) throw failure(Reasons.Closed.make({}), \"undispatched\");\n const targetId = await targets.targetId(entry);\n const current: unknown = await browserCdp.send(\"Browser.getWindowForTarget\", { targetId });\n const native = safeDecode(NativeWindow, current);\n\n await browserCdp.send(\"Browser.setContentsSize\", {\n windowId: native.windowId,\n width: options.viewport.width,\n height: options.viewport.height,\n });\n };\n\n const driver: Driver = {\n ...(options.pageControl\n ? {\n pageControl: pageControl.operations,\n }\n : {}),\n selected: targets.selected,\n selectedTargetId: targets.selectedTargetId,\n listPages: targets.listPages,\n resolvePage: targets.resolvePage,\n selectPage: targets.selectPage,\n newPage: targets.newPage,\n closePage: targets.closePage,\n listFrames: targets.listFrames,\n resolveFrame: targets.resolveFrame,\n selectFrame: targets.selectFrame,\n beginNavigation: actions.beginNavigation,\n readText: observation.readText,\n observe: observation.observe,\n checkpoint: observation.checkpoint,\n controlFacts: observation.controlFacts,\n revalidate: observation.revalidate,\n click: actions.click,\n fill: actions.fill,\n formStep: actions.formStep,\n formState: observation.formState,\n formSubmit: actions.formSubmit,\n selectOption: actions.selectOption,\n scroll: actions.scroll,\n pointerMove: pointer.pointerMove,\n hover: pointer.hover,\n wheel: pointer.wheel,\n press: keyboard.press,\n type: keyboard.type,\n screenshot: observation.screenshot,\n resize: (viewport, ticket) =>\n sanitize(async () => {\n const page = current().entry.page;\n const entry = current().entry;\n\n ticket.dispatch();\n captures.invalidate(entry, \"resized\");\n observation.changed(\"resized\", { pageId: entry.id });\n await page.setViewportSize(viewport);\n ticket.check();\n }),\n waitFor: actions.waitFor,\n waitForElement: actions.waitForElement,\n clickAndWait: actions.clickAndWait,\n clickForDownload: actions.clickForDownload,\n selectFiles: actions.selectFiles,\n clickForFileSelection: actions.clickForFileSelection,\n documentReadiness: initialization.documentReadiness,\n dismissDialogs: (ticket) =>\n sanitize(async () => {\n for (const [dialog, beforeUnload] of dialogs) {\n const disposition = await policyCleanup.run(dialog, () => dialog.dismiss(), {\n dispatch: () => ticket.dispatch(),\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n\n ticket.check();\n if (disposition !== \"confirmed\")\n throw failure(\n disposition === \"not-dispatched\" ? Reasons.Busy.make({}) : Reasons.Provider.make({}),\n disposition === \"not-dispatched\" ? \"undispatched\" : \"unknown\",\n );\n dialogs.delete(dialog);\n }\n }),\n capture: captures.capture,\n invalidateObservation: observation.invalidate,\n fenceInitialization: initialization.fence,\n disposeInitialization: initialization.dispose,\n disconnect: () =>\n sanitize(async () => {\n closing = true;\n initialization.fence();\n callbacks.stop();\n observation.invalidate();\n context.off(\"page\", onPage);\n // Explicit cleanup owns its close result. Preserve the established ordering by removing\n // the ordinary disconnect listener first; positive retirement is recorded only after the\n // close below actually settles. Natural disconnects still retire through onDisconnected.\n browser.off(\"disconnected\", onDisconnected);\n for (const entry of entries.values()) for (const off of entry.off.splice(0)) off();\n // Retained dialogs share their one dismissal with explicit resume. A timed-out dismissal\n // stays in the pool and is never sent a second time by connection cleanup.\n for (const [dialog, beforeUnload] of dialogs)\n void policyCleanup.run(dialog, () => dialog.dismiss(), {\n settled: (disposition) => beforeUnload?.dismissed(disposition === \"confirmed\"),\n });\n captures.clear();\n await closeWithin(initialization.dispose).catch(() => {});\n await observation.dispose().catch(() => {});\n await closeWithin(() => policyCleanup.settle()).catch(() => {});\n policyCleanup.stop();\n dialogs.clear();\n await closeWithin(() => callbacks.settle()).catch(() => {});\n await closeWithin(() => pageControl.dispose()).catch(() => {});\n await closeWithin(() => browserCdp?.detach() ?? Promise.resolve()).catch(() => {});\n await closeWithin(() => browser.close());\n retired();\n targets.clear();\n }),\n };\n\n try {\n for (const page of context.pages()) register(page);\n browserCdp = await browser.newBrowserCDPSession();\n await browserCdp.send(\"Browser.setDownloadBehavior\", {\n behavior: \"allow\",\n downloadPath: \"downloads\",\n eventsEnabled: true,\n });\n // Registrations precede the first document this connection creates, and precede any\n // navigation the caller makes, without this setup navigating anything itself.\n await initialization.install();\n for (const entry of entries.values()) await initialization.attach(entry.page);\n await targets.selectInitial();\n const { selection } = targets;\n\n if (selection.entry === undefined) throw failure(Reasons.NotFound.make({}));\n await initialization.attach(selection.entry.page);\n selection.frame = selection.entry.page.mainFrame();\n if (!options.preserveViewport) {\n await sizeNativeContents(selection.entry);\n await selection.entry.page.setViewportSize(options.viewport);\n }\n await targets.targetId(selection.entry);\n if (options.pageControl)\n for (const entry of entries.values()) await pageControl.execution(entry);\n initialized = true;\n\n return driver;\n } catch (error) {\n await driver.disconnect().catch(() => {});\n throw error;\n }\n};\n","import type { Schema, SchemaIssue } from \"effect\";\n\n/** Report only a top-level key declared by the failed schema, never an input key or value. */\nexport const schemaPath = (error: Schema.SchemaError): { readonly path?: string } => {\n let issue: SchemaIssue.Issue = error.issue;\n let remaining = 32;\n\n while (remaining-- > 0 && (issue._tag === \"Encoding\" || issue._tag === \"Filter\")) {\n issue = issue.issue;\n }\n if (issue._tag !== \"Composite\" || issue.ast._tag !== \"Objects\") return {};\n const first = issue.issues[0];\n\n if (first._tag !== \"Pointer\" || first.path.length === 0) return {};\n const key = first.path[0];\n\n if (typeof key !== \"string\" || key.length > 512) return {};\n const declared = issue.ast.propertySignatures.find((property) => property.name === key);\n\n return declared === undefined ? {} : { path: key };\n};\n","import { Effect, Schema } from \"effect\";\n\nimport type * as Bootstrap from \"../../Bootstrap.ts\";\nimport type { BrowserSession, TargetOperations, PinnedTarget } from \"../../Browser.ts\";\nimport {\n ActionResult,\n Checkpoint,\n CheckpointOptions,\n ClickRequest,\n FillFormOptions,\n FillFormRequest,\n FillFormResult,\n FillRequest,\n FrameInfo,\n HoverRequest,\n InputReceipt,\n KeyStroke,\n NavigateRequest,\n NavigationResult,\n ObservationOptions,\n ObservedElement,\n PageInfo,\n PointerMoveRequest,\n PressRequest,\n ReadTextRequest,\n ScreenshotRequest,\n ScreenshotResult,\n ScrollRequest,\n SelectOptions,\n StartNavigationRequest,\n Target,\n TextResult,\n TypeRequest,\n Viewport,\n WaitForElementRequest,\n WheelRequest,\n Identifier,\n} from \"../../BrowserData.ts\";\nimport {\n BrowserError,\n Reasons,\n type BrowserOperation,\n type BrowserOutcome,\n InitializationError,\n} from \"../../Errors.ts\";\nimport { associate } from \"./Association.ts\";\nimport type { Bindings } from \"./Bindings.ts\";\nimport { associatePageControl } from \"./PageControlAssociation.ts\";\nimport { schemaPath } from \"./SchemaPath.ts\";\nimport type { TargetControls, SessionControls, SessionLease } from \"./Session.ts\";\n\nexport const checked = <A>(\n schema: Schema.Codec<A, unknown, never, never>,\n value: unknown,\n operation: BrowserOperation,\n) =>\n Schema.decodeUnknownEffect(schema)(value, { onExcessProperty: \"error\" }).pipe(\n Effect.mapError((error) =>\n BrowserError.make({\n operation,\n reason: Reasons.Configuration.make(schemaPath(error)),\n outcome: \"undispatched\",\n }),\n ),\n );\n\nexport const decoded =\n <A>(\n schema: Schema.Codec<A, unknown, never, never>,\n operation: BrowserOperation,\n outcome: BrowserOutcome,\n ) =>\n (value: unknown) =>\n Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError((error) =>\n BrowserError.make({\n operation,\n reason: Reasons.Malformed.make(schemaPath(error)),\n outcome,\n }),\n ),\n );\n\nconst action = decoded(ActionResult, \"action-result\", \"unknown\");\nconst pointerMoved = decoded(InputReceipt, \"pointer-move\", \"unknown\");\nconst hovered = decoded(InputReceipt, \"hover\", \"unknown\");\nconst wheeled = decoded(InputReceipt, \"wheel\", \"unknown\");\nconst pressed = decoded(InputReceipt, \"press\", \"unknown\");\nconst typed = decoded(InputReceipt, \"type\", \"unknown\");\nconst formed = decoded(FillFormResult, \"fill-form\", \"unknown\");\n\nconst makeTarget = (bound: TargetControls): TargetOperations => ({\n navigate: (request) =>\n checked(NavigateRequest, request, \"navigate\").pipe(\n Effect.flatMap((value) => bound.navigate(value.url, value.timeoutMillis)),\n Effect.flatMap((url) => decoded(NavigationResult, \"navigate\", \"unknown\")({ url })),\n ),\n startNavigation: (request) =>\n checked(StartNavigationRequest, request, \"navigate\").pipe(\n Effect.flatMap((value) => bound.startNavigation(value.url, value.timeoutMillis)),\n Effect.map((operation) => ({\n target: operation.target,\n completed: operation.completed.pipe(\n Effect.flatMap((url) => decoded(NavigationResult, \"navigate\", \"unknown\")({ url })),\n ),\n stop: operation.stop,\n })),\n ),\n readText: (request) =>\n checked(ReadTextRequest, request, \"read-text\").pipe(\n Effect.flatMap((value) => bound.readText(value.selector)),\n Effect.flatMap((text) => decoded(TextResult, \"read-text\", \"undispatched\")({ text })),\n ),\n click: (request) =>\n checked(ClickRequest, request, \"click\").pipe(\n Effect.flatMap((value) => bound.click(value.selector)),\n Effect.flatMap(({ url, input }) => action({ url, input })),\n ),\n fill: (request) =>\n checked(FillRequest, request, \"fill\").pipe(\n Effect.flatMap((value) => bound.fill(value.selector, value.value)),\n Effect.flatMap((url) => action({ url })),\n ),\n scroll: (request) =>\n checked(ScrollRequest, request, \"scroll\").pipe(\n Effect.flatMap((value) => bound.scroll(value.deltaX, value.deltaY)),\n Effect.flatMap((url) => action({ url })),\n ),\n pointerMove: (request) =>\n checked(PointerMoveRequest, request, \"pointer-move\").pipe(\n Effect.flatMap((value) => bound.pointerMove(value.to)),\n Effect.flatMap((input) => pointerMoved({ ...input, kind: \"pointer-move\" })),\n ),\n hover: (request) =>\n checked(HoverRequest, request, \"hover\").pipe(\n Effect.flatMap((value) => bound.hover(value.selector)),\n Effect.flatMap((input) => hovered({ ...input, kind: \"hover\" })),\n ),\n wheel: (request) =>\n checked(WheelRequest, request, \"wheel\").pipe(\n Effect.flatMap((value) =>\n bound\n .wheel(value.deltaX, value.deltaY, value.at)\n .pipe(\n Effect.flatMap((input) =>\n wheeled({ ...input, kind: \"wheel\", delta: { x: value.deltaX, y: value.deltaY } }),\n ),\n ),\n ),\n ),\n press: (request) =>\n checked(PressRequest, request, \"press\").pipe(\n Effect.flatMap((value) => bound.press(value.key, value.modifiers ?? [], value.into)),\n Effect.flatMap((input) => pressed({ ...input, kind: \"press\" })),\n ),\n type: (request) =>\n checked(TypeRequest, request, \"type\").pipe(\n Effect.flatMap((value) => bound.type(value.text, value.into)),\n Effect.flatMap((input) => typed({ ...input, kind: \"type\" })),\n ),\n screenshot: (request) =>\n checked(ScreenshotRequest, request, \"screenshot\").pipe(\n Effect.flatMap((value) => bound.screenshot(value.fullPage)),\n Effect.flatMap((bytes) =>\n decoded(\n ScreenshotResult,\n \"screenshot\",\n \"undispatched\",\n )({ mediaType: \"image/png\", bytes: new Uint8Array(bytes) }),\n ),\n ),\n});\n\nconst makePinnedTarget = (value: {\n readonly target: Target;\n readonly operations: TargetControls;\n}): PinnedTarget =>\n Object.freeze({\n ...makeTarget(value.operations),\n target: Object.freeze(Target.make({ ...value.target })),\n });\n\n/** A browser-operation failure keeps its meaning when it is reported as an initialization one. */\nconst initialization = (reason: BrowserError[\"reason\"]): InitializationError[\"reason\"] =>\n reason._tag === \"Busy\"\n ? \"busy\"\n : reason._tag === \"Closed\" || reason._tag === \"Disconnected\"\n ? \"closed\"\n : reason._tag === \"Timeout\"\n ? \"timeout\"\n : reason._tag === \"Stale\"\n ? \"stale\"\n : reason._tag === \"Unsupported\"\n ? \"unsupported\"\n : reason._tag === \"Configuration\"\n ? \"configuration\"\n : \"native\";\n\nexport const makeSession = <E>(\n controls: SessionControls<SessionLease>,\n bindings: Bindings<E>,\n): BrowserSession<E> => {\n const Wait = Schema.Struct({\n selector: ClickRequest.fields.selector,\n state: Schema.Literals([\"visible\", \"hidden\", \"attached\", \"detached\"]),\n });\n\n const navigate = (url: string) => action({ url });\n\n const session: BrowserSession<E> = {\n ...makeTarget(controls.operations),\n implementation: controls.implementation,\n status: controls.status,\n diagnostics: controls.diagnostics,\n closeChecked: controls.closeChecked,\n failure: bindings.failure,\n bindingDiagnostics: bindings.diagnostics,\n retain: controls.retain.pipe(Effect.map(makeTarget)),\n target: controls.target,\n observe: (options = {}) =>\n checked(ObservationOptions, options, \"observe\").pipe(\n Effect.flatMap((value) => controls.observe({ ...value, scope: value.scope ?? \"document\" })),\n ),\n checkpoint: (options = {}) =>\n checked(CheckpointOptions, options, \"checkpoint\").pipe(\n Effect.flatMap((value) =>\n controls.checkpoint({ ...value, picture: value.picture ?? false }),\n ),\n Effect.flatMap(({ picture, ...sampled }) =>\n decoded(\n Checkpoint,\n \"checkpoint\",\n \"undispatched\",\n )({\n ...sampled,\n ...(picture === undefined\n ? {}\n : { picture: { mediaType: \"image/png\", bytes: new Uint8Array(picture) } }),\n }),\n ),\n ),\n controlFacts: (reference) =>\n checked(ObservedElement, reference, \"control-facts\").pipe(\n Effect.flatMap(controls.controlFacts),\n ),\n revalidateElement: (reference) =>\n checked(ObservedElement, reference, \"revalidate\").pipe(\n Effect.flatMap((value) => controls.revalidate(value).pipe(Effect.as(value))),\n ),\n clickElement: (reference, admission) =>\n checked(ObservedElement, reference, \"click\").pipe(\n Effect.flatMap((value) => controls.operations.click(value, admission?.admit)),\n Effect.flatMap(({ url, input }) => action({ url, input })),\n ),\n fillElement: (reference, value, admission) =>\n checked(ObservedElement, reference, \"fill\").pipe(\n Effect.flatMap((element) =>\n checked(FillRequest.fields.value, value, \"fill\").pipe(\n Effect.flatMap((text) => controls.operations.fill(element, text, admission?.admit)),\n ),\n ),\n Effect.flatMap(navigate),\n ),\n selectOption: (reference, options, admission) =>\n checked(ObservedElement, reference, \"select-option\").pipe(\n Effect.flatMap((element) =>\n checked(SelectOptions, options, \"select-option\").pipe(\n Effect.flatMap((ids) => controls.selectOption(element, ids, admission?.admit)),\n ),\n ),\n Effect.flatMap(navigate),\n ),\n fillForm: (request, admission, options = {}) =>\n checked(FillFormRequest, request, \"fill-form\").pipe(\n Effect.flatMap((form) =>\n checked(FillFormOptions, options, \"fill-form\").pipe(\n Effect.flatMap((settings) =>\n controls.fillForm(form, admission?.admit, {\n verify: settings.verify ?? true,\n settleMillis: settings.settleMillis ?? 50,\n }),\n ),\n ),\n ),\n Effect.flatMap(formed),\n ),\n hoverElement: (reference, admission) =>\n checked(ObservedElement, reference, \"hover\").pipe(\n Effect.flatMap((value) => controls.operations.hover(value, admission?.admit)),\n Effect.flatMap((input) => hovered({ ...input, kind: \"hover\" })),\n ),\n pressElement: (reference, stroke, admission) =>\n checked(ObservedElement, reference, \"press\").pipe(\n Effect.flatMap((element) =>\n checked(KeyStroke, stroke, \"press\").pipe(\n Effect.flatMap((value) =>\n controls.operations.press(\n value.key,\n value.modifiers ?? [],\n element,\n admission?.admit,\n ),\n ),\n ),\n ),\n Effect.flatMap((input) => pressed({ ...input, kind: \"press\" })),\n ),\n typeElement: (reference, text, admission) =>\n checked(ObservedElement, reference, \"type\").pipe(\n Effect.flatMap((element) =>\n checked(TypeRequest.fields.text, text, \"type\").pipe(\n Effect.flatMap((value) => controls.operations.type(value, element, admission?.admit)),\n ),\n ),\n Effect.flatMap((input) => typed({ ...input, kind: \"type\" })),\n ),\n pages: controls.pages,\n frames: controls.frames,\n framesOf: (page) =>\n checked(PageInfo, page, \"list-frames\").pipe(Effect.flatMap(controls.framesOf)),\n pinPage: (page) =>\n checked(PageInfo, page, \"target\").pipe(\n Effect.flatMap(controls.pinPage),\n Effect.map(makePinnedTarget),\n ),\n pinFrame: (page, frame) =>\n checked(PageInfo, page, \"target\").pipe(\n Effect.flatMap((checkedPage) =>\n checked(FrameInfo, frame, \"target\").pipe(\n Effect.flatMap((checkedFrame) => controls.pinFrame(checkedPage, checkedFrame)),\n ),\n ),\n Effect.map(makePinnedTarget),\n ),\n selectPage: (page) =>\n checked(PageInfo, page, \"select-page\").pipe(Effect.flatMap(controls.selectPage)),\n selectFrame: (id) =>\n checked(Identifier, id, \"select-frame\").pipe(Effect.flatMap(controls.selectFrame)),\n createPage: controls.createPage(),\n closePage: (page) =>\n checked(PageInfo, page, \"close-page\").pipe(Effect.flatMap(controls.closePage)),\n resizeViewport: (viewport) =>\n checked(Viewport, viewport, \"resize\").pipe(Effect.flatMap(controls.resize)),\n waitFor: (request) =>\n checked(Wait, request, \"wait\").pipe(\n Effect.flatMap((value) => controls.waitFor(value.selector, value.state)),\n ),\n waitForElement: (request) =>\n checked(WaitForElementRequest, request, \"wait\").pipe(Effect.flatMap(controls.waitForElement)),\n clickAndWait: (request) =>\n checked(ClickRequest, request, \"click-and-wait\").pipe(\n Effect.flatMap((value) => controls.clickAndWait(value.selector)),\n Effect.flatMap(({ url, input }) => action({ url, input })),\n ),\n ready: controls.readiness.pipe(\n Effect.mapError((error) =>\n InitializationError.make({\n operation: \"ready\",\n step: \"session\",\n reason: initialization(error.reason),\n }),\n ),\n Effect.flatMap((state) =>\n state._tag === \"NotReady\"\n ? Effect.fail(\n InitializationError.make({\n operation: \"ready\",\n step: state.step,\n reason: state.reason === \"failed\" ? \"output\" : state.reason,\n }),\n )\n : Effect.succeed<Bootstrap.ReadinessOutcome>({ _tag: state._tag }),\n ),\n ),\n };\n\n associate(session, controls.capture);\n associatePageControl(session, controls.pageControl);\n\n return session;\n};\n","import { Cause, Effect, Exit, Option } from \"effect\";\n\nimport type { BrowserError, InitializationError } from \"../../Errors.ts\";\n\n/** Evidence about this connection, independent of the lifetime of its browser process. */\nexport type ConnectionState = \"closed\" | \"failed\" | \"not-connected\" | \"pending\";\n\n/** Captured teardown operations supplied to the lifetime which owns this connection. */\nexport interface ConnectionCleanup {\n readonly fence: Effect.Effect<void>;\n readonly capture: Effect.Effect<void, BrowserError>;\n readonly initialization: Effect.Effect<void, BrowserError | InitializationError>;\n readonly disconnect: Effect.Effect<ConnectionState, BrowserError>;\n}\n\nexport const noConnection: ConnectionCleanup = {\n fence: Effect.void,\n capture: Effect.void,\n initialization: Effect.void,\n disconnect: Effect.succeed(\"not-connected\"),\n};\n\nexport type CleanupStep<A> =\n | { readonly _tag: \"Success\"; readonly value: A }\n | { readonly _tag: \"Failure\"; readonly reason: \"timeout\" | \"interrupted\" | \"failed\" };\n\nconst timedOut = Symbol(\"BrowserCleanupTimeout\");\n\n/** Every step settles independently, so one failure never suppresses subsequent teardown. */\nexport const cleanupStep = <A, E, R>(\n action: Effect.Effect<A, E, R>,\n timeoutMillis: number,\n): Effect.Effect<CleanupStep<A>, never, R> =>\n action.pipe(\n Effect.interruptible,\n Effect.timeoutOrElse({ duration: timeoutMillis, orElse: () => Effect.fail(timedOut) }),\n Effect.exit,\n Effect.map((exit): CleanupStep<A> => {\n if (Exit.isSuccess(exit)) return { _tag: \"Success\", value: exit.value };\n const error = Cause.findErrorOption(exit.cause);\n\n return {\n _tag: \"Failure\",\n reason:\n Option.isSome(error) && error.value === timedOut\n ? \"timeout\"\n : Cause.hasInterrupts(exit.cause)\n ? \"interrupted\"\n : \"failed\",\n };\n }),\n );\n\n/** Bounded host notification; reporting cannot change the cleanup evidence it describes. */\nexport const reported = <A, E>(effect: Effect.Effect<A, E>): Effect.Effect<void> =>\n cleanupStep(effect, 2000).pipe(Effect.asVoid);\n","import { Clock, Deferred, Duration, Effect, Schema, Semaphore } from \"effect\";\n\nimport {\n BrowserDiagnostic,\n BrowserDiagnostics,\n SessionStatus,\n type SessionReason,\n type SessionPhase,\n} from \"../../BrowserData.ts\";\nimport { BrowserError, Reasons, type BrowserOperation } from \"../../Errors.ts\";\nimport type { DriverFault, DriverTarget } from \"./Driver.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\n\n/** The browser domain's bounded step: one deadline, one declared BrowserError timeout. */\nexport const within = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n deadline: number,\n onTimeout: () => BrowserError,\n): Effect.Effect<A, E | BrowserError, R> =>\n Effect.gen(function* () {\n const now = Number(yield* Clock.monotonicTimeNanos) / 1_000_000;\n\n return yield* deadline <= now\n ? Effect.fail(onTimeout())\n : effect.pipe(\n Effect.timeoutOrElse({\n duration: Duration.millis(deadline - now),\n orElse: () => Effect.fail(onTimeout()),\n }),\n );\n });\n\nexport type Phase = SessionPhase;\n\nexport type Invalidation =\n | \"observation\"\n | \"target-changed\"\n | \"resized\"\n | \"paused\"\n | \"disconnected\"\n | \"uncertain\"\n | \"closed\";\n\n/**\n * Observation retirement is independent of the owner's revision and connection fences. A frame\n * narrows a page: an observation holds nodes of the one frame it read, so another frame of the\n * page navigating or detaching (an advertisement reloading, say) changes nothing it names.\n */\nexport type ObservationScope =\n | \"all\"\n | \"none\"\n | { readonly pageId: string; readonly frameId?: string };\n\n/** A bounded native reading has no mutation dispatch authority. */\nexport interface ReadTicket {\n readonly signal: AbortSignal;\n readonly deadline: number;\n readonly generation: number;\n readonly remainingMillis: () => number;\n check(): void;\n}\n\n/** One admitted native operation; checks at dispatch also fence late Promise continuations. */\nexport interface Ticket extends ReadTicket {\n readonly dispatched: boolean;\n dispatch(): void;\n}\n\n/** The driver retires native capacity only after its wait and required handle disposal settle. */\nexport interface WaitTicket extends ReadTicket {\n invalidate(): void;\n retire(): void;\n}\n\nexport interface OwnedWait {\n readonly ticket: WaitTicket;\n readonly completed: Effect.Effect<void, BrowserError>;\n readonly start: (body: () => Promise<void>) => void;\n readonly cancel: (reason?: BrowserError[\"reason\"]) => void;\n}\n\n/**\n * A dispatched mutation the browser is still performing after its permit was released: an\n * in-flight navigation. It keeps other mutations off that page while reads, holds and other\n * pages proceed. Like a permit it cannot be dropped silently: only a known outcome releases it.\n */\nexport interface Reservation {\n /** Aborted by any fence, so work that outlives its connection is never treated as current. */\n readonly signal: AbortSignal;\n /** `unknown` fences the owner, exactly as a mutation interrupted after dispatch does. */\n readonly settle: (outcome: \"known\" | \"unknown\") => void;\n}\n\nexport interface Limits {\n readonly maxActions: number;\n readonly maxHostReads: number;\n readonly maxElapsedMillis: number;\n readonly actionTimeoutMillis: number;\n}\n\nexport const makeOwner = Effect.fnUntraced(function* (limits: Limits) {\n const semaphore = yield* Semaphore.make(1);\n const clock = yield* Clock.Clock;\n\n const lifetimeDeadline =\n Number(yield* Clock.monotonicTimeNanos) / 1_000_000 + limits.maxElapsedMillis;\n\n const hooks = new Set<(reason: Invalidation, scope: ObservationScope) => void>();\n\n const state = {\n phase: \"acquiring\" as Phase,\n generation: 0,\n revision: 0,\n selection: 0,\n actions: 0,\n hostReads: 0,\n };\n\n let active: AbortController | undefined;\n let holdingPermit = false;\n\n let waiting:\n | {\n readonly connection: object;\n readonly target: DriverTarget;\n readonly cancel: OwnedWait[\"cancel\"];\n readonly retire: () => void;\n pending: boolean;\n }\n | undefined;\n\n const reservations = new Map<string, AbortController>();\n // These facts outlive the tickets which produced them. Aborting admission is not retirement.\n const unresolved = new Set<object>();\n let nativeUncertainty = false;\n let terminalReason: SessionReason | null = null;\n let pauseReason: SessionReason | null = null;\n const policies = new Map<object, Extract<DriverFault, { readonly source: \"policy\" }>>();\n const records: Array<BrowserDiagnostics[\"records\"][number]> = [];\n let total = 0;\n let dropped = 0;\n\n const record = (\n reason: SessionReason,\n disposition: BrowserDiagnostics[\"records\"][number][\"disposition\"],\n generation = state.generation,\n ) => {\n total = Math.min(Number.MAX_SAFE_INTEGER, total + 1);\n if (records.length === 32) {\n records.shift();\n dropped = Math.min(Number.MAX_SAFE_INTEGER, dropped + 1);\n }\n records.push(\n Object.freeze(\n BrowserDiagnostic.make({\n reason,\n disposition,\n generation,\n monotonicNanos: clock.monotonicTimeNanosUnsafe(),\n }),\n ),\n );\n };\n\n const transition = (phase: Phase) => {\n if (\n (terminalReason !== null || state.phase === \"closed\" || state.phase === \"closing\") &&\n phase !== \"closing\" &&\n phase !== \"closed\"\n )\n return;\n state.phase = phase;\n if (phase === \"open\") pauseReason = null;\n };\n\n const invalidate = (reason: Invalidation, scope: ObservationScope = \"all\") => {\n if (scope === \"all\" || (scope !== \"none\" && scope.pageId === waiting?.target.pageId))\n waiting?.cancel(Reasons.Stale.make({}));\n state.revision++;\n for (const hook of hooks) hook(reason, scope);\n };\n\n const fence = (phase: Phase, reason: Invalidation, trigger?: SessionReason) => {\n if (\n state.phase === \"closed\" ||\n (state.phase === \"closing\" && phase !== \"closed\" && phase !== \"closing\")\n )\n return;\n if (phase === \"uncertain\" || phase === \"faulted\" || phase === \"closing\" || phase === \"closed\")\n terminalReason ??= trigger ?? (phase === \"uncertain\" ? \"native-failure\" : \"closed\");\n else if (trigger !== undefined) pauseReason = trigger;\n // A known trigger is retained even when the abort below interrupts dispatched work.\n if (!(state.phase === \"faulted\" && phase === \"uncertain\")) state.phase = phase;\n state.generation++;\n const pending = [...reservations.values()];\n\n reservations.clear();\n active?.abort();\n waiting?.cancel(\n terminalReason === \"expired\" ? Reasons.Expired.make({}) : Reasons.Stale.make({}),\n );\n for (const reservation of pending) reservation.abort();\n invalidate(reason);\n };\n\n const terminate = (\n reason: SessionReason,\n disposition: \"known\" | \"not-dispatched\" | \"unknown\",\n generation = state.generation,\n ) => {\n if (disposition === \"unknown\") nativeUncertainty = true;\n record(reason, disposition === \"known\" ? \"confirmed\" : disposition, generation);\n fence(\n disposition === \"unknown\" ? \"uncertain\" : \"faulted\",\n disposition === \"unknown\" ? \"uncertain\" : \"closed\",\n reason,\n );\n };\n\n const expire = () => {\n if (terminalReason !== null || state.phase === \"closing\" || state.phase === \"closed\") return;\n terminate(\"expired\", \"known\");\n };\n\n /** Quarantine changes admission only; an originating click keeps its own valid ticket. */\n const policy = (\n event: Extract<DriverFault, { readonly source: \"policy\" }>,\n generation: number,\n ) => {\n if (event.disposition !== \"dispatched\") record(event.reason, event.disposition, generation);\n const previous = policies.get(event.token);\n\n switch (event.disposition) {\n case \"pending\":\n if (previous === undefined && terminalReason === null) policies.set(event.token, event);\n break;\n case \"dispatched\":\n unresolved.add(event.token);\n if (previous !== undefined) policies.set(event.token, event);\n break;\n case \"confirmed\":\n unresolved.delete(event.token);\n policies.delete(event.token);\n break;\n case \"unknown\":\n // Keep the token so a late acknowledgement may retire it, but never reopen admission.\n unresolved.add(event.token);\n fence(\"uncertain\", \"uncertain\", event.reason);\n break;\n case \"not-dispatched\":\n policies.delete(event.token);\n fence(\"faulted\", \"closed\", event.reason);\n break;\n }\n };\n\n /** Taken under the permit that dispatched the work, so nothing can interleave before it. */\n const reserve = (key: string): Reservation => {\n // Outlives the fiber that dispatched it, and must be abortable by a fence from outside it.\n const controller = new AbortController();\n\n reservations.set(key, controller);\n unresolved.add(controller);\n\n return {\n signal: controller.signal,\n settle: (outcome) => {\n // Navigation recovery is bounded by the lifetime, so it can give up at the same instant\n // as the independent lifetime timer. As for an action's timer, that instant is expiry.\n if (\n outcome === \"unknown\" &&\n reservations.get(key) === controller &&\n Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline\n )\n expire();\n // A fence already cleared it, and decided the outcome for everything it aborted.\n if (reservations.get(key) !== controller) return;\n reservations.delete(key);\n if (outcome === \"known\") unresolved.delete(controller);\n else fence(\"uncertain\", \"uncertain\");\n },\n };\n };\n\n /**\n * Admission transfers a pure wait to an independent deadline and cancellation record. Its\n * logical barrier may end before uncancellable native work; neither is a mutation reservation.\n */\n const beginWait = (admission: Ticket, target: DriverTarget, connection: object): OwnedWait => {\n admission.check();\n if (waiting !== undefined)\n throw BrowserError.make({\n operation: \"wait\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n });\n const controller = new AbortController();\n const result = Deferred.makeUnsafe<void, BrowserError>();\n const generation = admission.generation;\n const deadline = admission.deadline;\n let retired = false;\n let started = false;\n let canceled: BrowserError | undefined;\n\n const error = (reason: BrowserError[\"reason\"]) =>\n BrowserError.make({ operation: \"wait\", reason, outcome: \"undispatched\" });\n\n const release = () => {\n if (retired && !record.pending && waiting === record) waiting = undefined;\n };\n\n const complete = (exit: Effect.Effect<void, BrowserError>) => {\n if (!record.pending) return;\n record.pending = false;\n release();\n Deferred.doneUnsafe(result, exit);\n };\n\n const cancel: OwnedWait[\"cancel\"] = (reason = Reasons.Interrupted.make({})) => {\n if (record.pending) {\n canceled = error(reason);\n complete(Effect.fail(canceled));\n }\n controller.abort();\n };\n\n const record = {\n connection,\n target: { ...target },\n pending: true,\n cancel,\n retire: () => {\n retired = true;\n release();\n },\n };\n\n waiting = record;\n\n const check = () => {\n const now = Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000;\n\n if (now >= lifetimeDeadline) expire();\n if (canceled !== undefined) throw canceled;\n if (controller.signal.aborted || state.generation !== generation || state.phase !== \"open\")\n throw error(Reasons.Stale.make({}));\n if (now >= deadline) throw error(Reasons.Timeout.make({}));\n };\n\n const ticket: WaitTicket = {\n signal: controller.signal,\n deadline,\n generation,\n remainingMillis: () =>\n Math.max(1, deadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n check,\n invalidate: () => cancel(Reasons.Stale.make({})),\n retire: record.retire,\n };\n\n const fail = (cause: unknown) => {\n let failure = publicError(cause, \"wait\", {\n reason: Reasons.Provider.make({}),\n outcome: \"undispatched\",\n });\n\n try {\n check();\n } catch (current) {\n failure = publicError(current, \"wait\", failure);\n }\n complete(Effect.fail(failure));\n };\n\n return {\n ticket,\n cancel,\n completed: within(Deferred.await(result), deadline, () => {\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline) expire();\n cancel(Reasons.Timeout.make({}));\n\n return canceled ?? error(Reasons.Timeout.make({}));\n }).pipe(\n Effect.tap(() =>\n Effect.try({\n try: check,\n catch: (cause) =>\n publicError(cause, \"wait\", {\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n }),\n }),\n ),\n ),\n start: (body) => {\n if (started) return;\n started = true;\n try {\n check();\n // Observe settlement after cancellation too; the native retire callback owns capacity.\n void body().then(() => {\n try {\n check();\n complete(Effect.void);\n } catch (cause) {\n fail(cause);\n }\n }, fail);\n } catch (cause) {\n record.retire();\n fail(cause);\n }\n },\n };\n };\n\n const guard = <A, E, R>(\n operation: BrowserOperation,\n body: (ticket: Ticket) => Effect.Effect<A, E, R>,\n options: {\n readonly charge?: boolean | \"host-read\";\n readonly mutation?: boolean;\n readonly mutationScope?: () => ObservationScope;\n readonly phases?: ReadonlyArray<Phase>;\n readonly verifyAfter?: boolean;\n readonly preflight?: Effect.Effect<void, BrowserError>;\n /** A request can shorten this operation's policy deadline, never extend it. */\n readonly timeoutMillis?: number;\n /** Private recovery admission: one absolute deadline also bounds waiting for this permit. */\n readonly waitUntil?: number;\n } = {},\n ): Effect.Effect<A, E | BrowserError, R> =>\n Effect.suspend(() => {\n let admitted: Ticket | undefined;\n\n const work = Effect.gen(function* () {\n holdingPermit = true;\n if (!(options.phases ?? [\"open\"]).includes(state.phase) || policies.size > 0) {\n return yield* BrowserError.make({\n operation,\n reason:\n terminalReason === \"expired\"\n ? Reasons.Expired.make({})\n : state.phase === \"paused\" || (terminalReason === null && policies.size > 0)\n ? Reasons.Busy.make({})\n : Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n }\n yield* options.preflight ?? Effect.void;\n const now = Number(yield* Clock.monotonicTimeNanos) / 1_000_000;\n\n if (now >= lifetimeDeadline) {\n expire();\n\n return yield* BrowserError.make({\n operation,\n reason: Reasons.Expired.make({}),\n outcome: \"undispatched\",\n });\n }\n\n const deadline = Math.min(\n options.waitUntil ?? now + limits.actionTimeoutMillis,\n options.timeoutMillis === undefined\n ? Number.POSITIVE_INFINITY\n : now + options.timeoutMillis,\n lifetimeDeadline,\n );\n\n if (now >= deadline)\n return yield* BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: \"undispatched\",\n });\n if (options.charge !== false) {\n const hostRead = options.charge === \"host-read\";\n const maximum = hostRead ? limits.maxHostReads : limits.maxActions;\n const observed = hostRead ? state.hostReads : state.actions;\n\n if (observed >= maximum)\n return yield* BrowserError.make({\n operation,\n reason: Reasons.Limit.make({\n dimension: hostRead ? \"host-reads\" : \"actions\",\n maximum,\n observed,\n }),\n outcome: \"undispatched\",\n });\n if (hostRead) state.hostReads++;\n else state.actions++;\n }\n // The lifecycle fence must actively abort admitted native work outside the current fiber.\n // @effect-diagnostics-next-line abortControllerInEffect:off\n const controller = new AbortController();\n\n active = controller;\n let dispatched = false;\n const generation = state.generation;\n const allowed = options.phases ?? [\"open\"];\n\n const check = () => {\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline) expire();\n if (\n controller.signal.aborted ||\n state.generation !== generation ||\n !allowed.includes(state.phase)\n ) {\n throw BrowserError.make({\n operation,\n reason: Reasons.Stale.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n }\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= deadline)\n throw BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n };\n\n const ticket: Ticket = {\n signal: controller.signal,\n deadline,\n generation,\n remainingMillis: () =>\n Math.max(1, deadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n get dispatched() {\n return dispatched;\n },\n check,\n dispatch() {\n check();\n if (!dispatched && options.mutation)\n invalidate(\"observation\", options.mutationScope?.() ?? \"all\");\n dispatched = true;\n unresolved.add(controller);\n },\n };\n\n admitted = ticket;\n\n const uncertain = () => {\n // The action timer can win the same instant as the independent lifetime timer.\n if (Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000 >= lifetimeDeadline) expire();\n const fenced = controller.signal.aborted;\n\n controller.abort();\n if (dispatched && !fenced && state.phase !== \"closing\" && state.phase !== \"closed\")\n fence(\"uncertain\", \"uncertain\");\n };\n\n return yield* within(body(ticket), ticket.deadline, () => {\n uncertain();\n\n return BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n });\n }).pipe(\n Effect.tap(() =>\n options.verifyAfter === false\n ? Effect.void\n : Effect.try({\n try: check,\n catch: () =>\n BrowserError.make({\n operation,\n reason: Reasons.Stale.make({}),\n outcome: dispatched ? \"unknown\" : \"undispatched\",\n }),\n }),\n ),\n Effect.catch((error): Effect.Effect<never, E | BrowserError> => {\n if (dispatched) uncertain();\n // The permit adds dispatch evidence only to browser-operation errors. Typed\n // initialization/consumer failures retain their identity and original family.\n if (!Schema.is(BrowserError)(error)) return Effect.fail(error);\n\n return Effect.fail(\n BrowserError.make({\n operation,\n reason: error.reason,\n outcome: error.outcome,\n }),\n );\n }),\n Effect.onInterrupt(() => Effect.sync(uncertain)),\n Effect.tap(() => Effect.sync(() => unresolved.delete(controller))),\n Effect.ensuring(\n Effect.sync(() => {\n controller.abort();\n if (active === controller) active = undefined;\n }),\n ),\n );\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n holdingPermit = false;\n }),\n ),\n );\n\n if (options.waitUntil !== undefined)\n return within(\n semaphore.withPermits(1)(work),\n Math.min(options.waitUntil, lifetimeDeadline),\n () =>\n BrowserError.make({\n operation,\n reason: Reasons.Timeout.make({}),\n outcome: admitted?.dispatched === true ? \"unknown\" : \"undispatched\",\n }),\n );\n\n return semaphore\n .withPermitsIfAvailable(1)(work)\n .pipe(\n Effect.flatMap(\n Effect.fromOption(() =>\n BrowserError.make({\n operation,\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n ),\n ),\n );\n });\n\n /** Lifecycle transitions are performed while holding guard's permit; close alone preempts it. */\n return {\n state,\n lifetimeDeadline,\n guard,\n reserve,\n reserved: (key: string): boolean => reservations.has(key),\n beginWait,\n waitAvailable: () => waiting === undefined,\n waitPending: (pageId?: string) =>\n waiting?.pending === true && (pageId === undefined || waiting.target.pageId === pageId),\n /** Positive retirement is specific to a connection, including a late retired predecessor. */\n retireWait: (connection: object) => {\n const previous = waiting;\n\n if (previous?.connection !== connection) return;\n previous.cancel(Reasons.Stale.make({}));\n previous.retire();\n },\n invalidate,\n fence,\n transition,\n expire,\n terminate,\n policy,\n record,\n /** Only positive lifetime-source evidence may retire control lost to a connection fence. */\n retireControl: () => {\n const previous = waiting;\n\n previous?.cancel(Reasons.Stale.make({}));\n previous?.retire();\n unresolved.clear();\n nativeUncertainty = false;\n policies.clear();\n },\n status: Effect.sync(() => {\n const status = SessionStatus.make({\n phase: state.phase,\n reason: terminalReason ?? pauseReason ?? policies.values().next().value?.reason ?? null,\n generation: state.generation,\n busy: holdingPermit || policies.size > 0 || waiting !== undefined,\n unresolvedDispatch: nativeUncertainty || unresolved.size > 0,\n actions: { used: state.actions, maximum: limits.maxActions },\n });\n\n // Schema construction owns the nested record; freeze the produced snapshot, not its input.\n Object.freeze(status.actions);\n\n return Object.freeze(status);\n }),\n diagnostics: Effect.sync(() => {\n const snapshot = BrowserDiagnostics.make({\n records: [...records],\n total,\n dropped,\n truncated: dropped > 0,\n });\n\n // Schema construction owns its array; freeze the produced snapshot, not merely its input.\n for (const record of snapshot.records) Object.freeze(record);\n Object.freeze(snapshot.records);\n\n return Object.freeze(snapshot);\n }),\n onInvalidate(hook: (reason: Invalidation, scope: ObservationScope) => void): () => void {\n hooks.add(hook);\n\n return () => {\n hooks.delete(hook);\n };\n },\n };\n});\n\nexport type Owner = Effect.Success<ReturnType<typeof makeOwner>>;\n\n/** Without a native answer, whether the step was sent is all the owner knows about it. */\nconst unsettled = (ticket: Ticket): Pick<BrowserError, \"reason\" | \"outcome\"> => ({\n reason: Reasons.Provider.make({}),\n outcome: ticket.dispatched ? \"unknown\" : \"undispatched\",\n});\n\n/**\n * The one place a native step becomes a public error: whatever the driver raised, the caller\n * sees the operation it asked for.\n */\nexport const native = <A>(operation: BrowserOperation, ticket: Ticket, body: () => Promise<A>) =>\n Effect.callback<A, BrowserError>((resume) => {\n let done = false;\n\n const cleanup = () => {\n done = true;\n ticket.signal.removeEventListener(\"abort\", abort);\n };\n\n const abort = () => {\n if (done) return;\n cleanup();\n resume(\n Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Stale.make({}),\n outcome: ticket.dispatched ? \"unknown\" : \"undispatched\",\n }),\n ),\n );\n };\n\n ticket.signal.addEventListener(\"abort\", abort, { once: true });\n try {\n ticket.check();\n // Observe both branches even after the waiter exits. Cancellation does not undo native work.\n void body().then(\n (value) => {\n if (!done) {\n cleanup();\n resume(Effect.succeed(value));\n }\n },\n (error: unknown) => {\n if (!done) {\n cleanup();\n resume(Effect.fail(publicError(error, operation, unsettled(ticket))));\n }\n },\n );\n } catch (error) {\n cleanup();\n resume(Effect.fail(publicError(error, operation, unsettled(ticket))));\n }\n\n return Effect.sync(cleanup);\n });\n","import { type Crypto, Effect } from \"effect\";\n\n/**\n * A fresh UUIDv4 from the consumer's `Crypto` service. Without secure random bytes no browser can\n * be owned safely, so a failure here is a defect rather than a typed browser error.\n */\nexport const randomUuid = (crypto: Crypto.Crypto): Effect.Effect<string> =>\n Effect.orDie(crypto.randomUUIDv4);\n","import {\n Cause,\n Clock,\n Crypto,\n Deferred,\n Effect,\n Exit,\n Option,\n Redacted,\n Schema,\n Scope,\n} from \"effect\";\n\nimport {\n type FillFormRequest,\n type FrameInfo,\n type InputReceipt,\n type KeyModifier,\n Observation,\n type ObservedElement,\n type PageInfo,\n type PageSuspension,\n type SelectOptions,\n Target,\n type Viewport,\n type WaitForElementRequest,\n} from \"../../BrowserData.ts\";\nimport type { Lifetime, Source } from \"../../BrowserRuntime.ts\";\nimport { BrowserError, Reasons, type BrowserOperation } from \"../../Errors.ts\";\nimport { type CaptureParent } from \"./Association.ts\";\nimport type { BindingImplementation, ConnectionIdentity } from \"./Binding.ts\";\nimport type { ConnectionBindings } from \"./Bindings.ts\";\nimport { cleanupStep, type ConnectionCleanup, type ConnectionState } from \"./ConnectionCleanup.ts\";\nimport type {\n Driver,\n DriverEvents,\n DriverFault,\n DriverOptions,\n DriverTarget,\n InputCapture,\n NativeFileSelection,\n NavigationControl,\n} from \"./Driver.ts\";\nimport { publicError } from \"./NativeCalls.ts\";\nimport type { AdmissionPolicy } from \"./Observation.ts\";\nimport {\n makeOwner,\n native,\n within,\n type Limits,\n type ObservationScope,\n type OwnedWait,\n type Ticket,\n type WaitTicket,\n} from \"./Owner.ts\";\nimport type { NativeInput, NativePoint } from \"./Pointer.ts\";\nimport { randomUuid } from \"./Random.ts\";\n\nexport type SessionLease = Lifetime;\nexport type RemoteSource<L extends SessionLease, E, R = never> = Source<L, E, R>;\n\n/** Bounds a reading of the selected document. Already validated at the public boundary. */\nexport interface Reading {\n readonly scope: \"document\" | \"viewport\";\n readonly match?: string;\n readonly maxTextBytes?: number;\n readonly maxControls?: number;\n}\n\n/** How a form proceeds. Already validated and defaulted at the public boundary. */\nexport interface FormSettings {\n readonly verify: boolean;\n readonly settleMillis: number;\n}\n\n/** What a form did; the public boundary decodes it. */\nexport interface FormOutcome {\n readonly fields: ReadonlyArray<{\n readonly elementId: string;\n readonly status: \"set\" | \"unchanged\";\n readonly input?: InputReceipt;\n }>;\n readonly submitted: boolean;\n readonly url: string;\n readonly submitInput?: InputReceipt;\n readonly stopped?: {\n readonly stage: \"field\" | \"verify\" | \"submit\";\n readonly elementId?: string;\n readonly error: BrowserError;\n };\n}\n\ninterface NavigationStopAttempt<E> {\n readonly result: Deferred.Deferred<void, E>;\n readonly retired: Deferred.Deferred<void>;\n running: boolean;\n committed: boolean;\n setupPending: boolean;\n}\n\n/**\n * Callers share the active attempt. Its owner may cancel it, but a committed Exit is permanent.\n * Before commitment, retry waits for actual native setup and port retirement, not the waiter.\n */\nconst makeNavigationStopCoordinator = <E, R>(\n done: () => boolean,\n attempt: (\n onDispatch: () => void,\n retainSetup: () => () => void,\n deadline?: number,\n ) => Effect.Effect<\"dispatched\" | \"settled\", E, R>,\n confirmed: () => void,\n) =>\n Effect.sync(() => {\n let current: NavigationStopAttempt<E | BrowserError> | undefined;\n\n const request = (deadline?: number): Effect.Effect<void, E | BrowserError, R> =>\n Effect.uninterruptibleMask((restore) =>\n Effect.suspend(() => {\n // Fencing may complete the navigation while a committed stop is still failing.\n if (current !== undefined && (current.running || current.committed)) {\n const joined = current;\n\n if (deadline === undefined || joined.committed)\n return restore(Deferred.await(joined.result));\n\n return restore(Effect.exit(Deferred.await(joined.result))).pipe(\n Effect.flatMap((exit) =>\n Exit.isSuccess(exit) || joined.committed\n ? exit\n : restore(Deferred.await(joined.retired)).pipe(Effect.andThen(request(deadline))),\n ),\n );\n }\n if (done()) return Effect.void;\n if (current !== undefined) {\n if (deadline !== undefined)\n return restore(Deferred.await(current.retired)).pipe(\n Effect.andThen(request(deadline)),\n );\n\n return Effect.fail(\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n );\n }\n\n const active: NavigationStopAttempt<E | BrowserError> = {\n result: Deferred.makeUnsafe(),\n retired: Deferred.makeUnsafe(),\n running: true,\n committed: false,\n setupPending: false,\n };\n\n current = active;\n\n const retire = () => {\n active.setupPending = false;\n if (!active.running) {\n if (!active.committed && current === active) current = undefined;\n Deferred.doneUnsafe(active.retired, Effect.void);\n }\n };\n\n return restore(\n Effect.suspend(() =>\n attempt(\n () => {\n active.committed = true;\n },\n () => {\n active.setupPending = true;\n\n return retire;\n },\n deadline,\n ),\n ),\n ).pipe(\n Effect.tap((result) =>\n result === \"dispatched\" ? Effect.sync(confirmed) : Effect.void,\n ),\n Effect.asVoid,\n Effect.onExit((exit) =>\n Effect.sync(() => {\n active.running = false;\n if (!active.committed && !active.setupPending) current = undefined;\n if (!active.setupPending) Deferred.doneUnsafe(active.retired, Effect.void);\n Deferred.doneUnsafe(active.result, exit);\n }),\n ),\n );\n }),\n );\n\n return {\n stop: request(),\n recover: (deadline: number) =>\n within(request(deadline), deadline, () =>\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Timeout.make({}),\n outcome: current?.committed === true ? \"unknown\" : \"undispatched\",\n }),\n ),\n };\n });\n\n/** Explicit callers retain the original cancellation and fail-fast admission contract. */\nexport const makeNavigationStop = <E, R>(\n done: () => boolean,\n attempt: (\n onDispatch: () => void,\n retainSetup: () => () => void,\n ) => Effect.Effect<\"dispatched\" | \"settled\", E, R>,\n confirmed: () => void,\n) =>\n makeNavigationStopCoordinator(done, attempt, confirmed).pipe(\n Effect.map((coordinator) => coordinator.stop),\n );\n\nexport interface SessionOptions<L extends SessionLease, E, R = never> {\n readonly implementation: string;\n readonly remote: RemoteSource<L, E, R>;\n /** The constructor resolves an issued binding before acquiring the lifetime. */\n readonly engine: BindingImplementation;\n /** Only a keep-alive session may detach and reattach inside this owner. */\n readonly keepAlive: boolean;\n readonly driver: DriverOptions;\n readonly maxReturnedBytes: number;\n /** Consumer E/R stays with the typed public supervisor; this installs its captured runtime. */\n readonly connectBindings?: (\n onFault: (event: DriverFault) => void,\n isActive: () => boolean,\n isCurrent: () => boolean,\n ) => Effect.Effect<ConnectionBindings, never, Scope.Scope>;\n}\n\n/**\n * One owner for page operations, bootstrap, capture and connection cleanup. The lifetime source\n * decides whether release also terminates a browser and how that termination is observed.\n */\nexport const acquireSession = Effect.fnUntraced(function* <L extends SessionLease, E, R>(\n limits: Limits,\n options: SessionOptions<L, E, R>,\n) {\n // The engine is resolved before anything is allocated, so an unissued binding costs nothing.\n const engine = options.engine;\n\n if (engine === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Configuration.make({}),\n outcome: \"undispatched\",\n });\n const parentScope = yield* Scope.Scope;\n // Register the binding lifetime BEFORE the remote cleanup finalizer. On natural Scope\n // shutdown that finalizer must fence the owner before any callback finalizer can reenter it.\n const bindingLifetime = yield* Scope.fork(parentScope, \"sequential\");\n const ended = yield* Deferred.make<void>();\n const owner = yield* makeOwner(limits);\n const clock = yield* Clock.Clock;\n const uuid = randomUuid(yield* Crypto.Crypto);\n\n let driver: Driver | undefined;\n let connectPending = false;\n // Native listeners can outlive disconnect. Authority belongs to this connection\n // lease, not merely to the current session phase or selected browser target.\n let activeConnection: object | undefined;\n let handoffToken: string | undefined;\n let reconnectTarget: string | undefined;\n let activeBindings: ConnectionBindings | undefined;\n // A canceled setup may outlive its operation and connection. Keep one slot across the owner\n // until that native setup and its port actually retire; a new operation cannot evade the bound.\n let stopSetupPending: Deferred.Deferred<void> | undefined;\n\n const fenceBindings = () => {\n activeBindings?.close();\n driver?.fenceInitialization?.();\n };\n\n const disposeBindings = Effect.gen(function* () {\n const connection = activeBindings;\n\n activeBindings = undefined;\n const callbacks = yield* Effect.exit(connection?.dispose ?? Effect.void);\n\n const registrations = yield* Effect.tryPromise({\n try: () => driver?.disposeInitialization?.() ?? Promise.resolve(),\n catch: () =>\n BrowserError.make({\n operation: \"close\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.exit);\n\n if (Exit.isFailure(callbacks)) return yield* Effect.failCause(callbacks.cause);\n if (Exit.isFailure(registrations)) return yield* Effect.failCause(registrations.cause);\n });\n\n const capture: CaptureParent = {\n owner,\n target: () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"target\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n\n return Target.make({ generation: owner.state.generation, ...driver.selected() });\n },\n resolve: (ticket, requested) =>\n native(\"capture-start\", ticket, async () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"capture\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n const binding = await driver.capture(requested);\n\n return {\n key: binding.targetId,\n target: Target.make({\n generation: owner.state.generation,\n pageId: binding.pageId,\n frameId: binding.frameId,\n }),\n source: binding.source,\n };\n }),\n captureLeases: new Map(),\n captureReservedBytes: 0,\n };\n\n owner.onInvalidate((reason, scope) => {\n driver?.invalidateObservation(scope);\n if ([\"disconnected\", \"uncertain\", \"closed\"].includes(reason)) fenceBindings();\n if ([\"paused\", \"disconnected\", \"uncertain\", \"closed\"].includes(reason))\n for (const lease of capture.captureLeases.values()) lease.invalidate(reason);\n });\n\n /**\n * The local half of cleanup. Each step is an independent fact for the canonical\n * coordinator, which owns the release request and the terminal status observation.\n */\n const local: ConnectionCleanup = {\n fence: Effect.sync(() => {\n owner.fence(\"closing\", \"closed\");\n handoffToken = undefined;\n activeConnection = undefined;\n Deferred.doneUnsafe(ended, Effect.void);\n }),\n capture: Effect.suspend(() =>\n Effect.forEach([...capture.captureLeases.values()], (lease) => lease.stop, {\n discard: true,\n }),\n ),\n initialization: disposeBindings,\n disconnect: Effect.suspend(() => {\n const acquired = driver;\n\n driver = undefined;\n if (acquired === undefined)\n return Effect.succeed<ConnectionState>(connectPending ? \"pending\" : \"not-connected\");\n\n return Effect.tryPromise({\n try: () => acquired.disconnect(),\n catch: () =>\n BrowserError.make({\n operation: \"disconnect\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.as<ConnectionState>(\"closed\"));\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n owner.transition(\"closed\");\n }),\n ),\n ),\n };\n\n // Registered before the source so natural scope closure observes its completed release first.\n let retireControl: Effect.Effect<void> = Effect.void;\n\n yield* Effect.addFinalizer(() => Effect.suspend(() => retireControl));\n\n const acquired = yield* options.remote(local, owner.lifetimeDeadline);\n\n retireControl = cleanupStep(\n Effect.suspend(() => acquired.controlRetired ?? Effect.succeed(false)),\n 2000,\n ).pipe(\n Effect.tap((result) =>\n result._tag === \"Success\" && result.value ? Effect.sync(owner.retireControl) : Effect.void,\n ),\n Effect.asVoid,\n Effect.ignoreCause,\n );\n\n const ref: L[\"reference\"] = acquired.reference;\n // Effect.tap preserves the exact supplying lifetime's success; the generic constraint alone\n // would infer unknown here. No receipt value is decoded, constructed or coerced by this owner.\n // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- restates L's own release type\n const release = acquired.release as Effect.Effect<Effect.Success<L[\"release\"]>>;\n const cleanupResult: L[\"cleanupResult\"] = acquired.cleanupResult;\n\n const closeScope = acquired.release.pipe(\n Effect.tap(() => retireControl),\n Effect.ensuring(Deferred.succeed(ended, undefined)),\n Effect.asVoid,\n );\n\n const connectionEvents = (connectionLease: object, generation: number): DriverEvents => ({\n retired: () => owner.retireWait(connectionLease),\n invalidate: (reason, scope) => {\n if (activeConnection === connectionLease) owner.invalidate(reason, scope);\n },\n disconnected: () => {\n owner.retireWait(connectionLease);\n if (activeConnection !== connectionLease) return;\n if (\n owner.state.phase !== \"closing\" &&\n owner.state.phase !== \"closed\" &&\n owner.state.phase !== \"detached\"\n ) {\n owner.terminate(\"disconnected\", \"unknown\", generation);\n }\n },\n pause: (reason = \"dialog\") => {\n if (activeConnection !== connectionLease) return;\n const trigger = reason === \"popup\" ? \"popup-policy\" : \"dialog-policy\";\n\n owner.record(trigger, \"confirmed\", generation);\n if (owner.state.phase === \"open\") owner.fence(\"paused\", \"paused\", trigger);\n // An unsolicited popup/dialog during setup cannot be silently admitted by\n // the later connect commit. No usable handle has been exposed: fail closed.\n else if (owner.state.phase === \"acquiring\") owner.terminate(trigger, \"known\", generation);\n },\n fault: (event) => {\n if (activeConnection !== connectionLease) return;\n if (event.source === \"policy\") {\n owner.policy(event, generation);\n\n return;\n }\n if (owner.state.phase === \"closing\" || owner.state.phase === \"closed\") return;\n owner.terminate(\n event.source === \"binding\"\n ? \"callback-failure\"\n : event.disposition === \"not-dispatched\"\n ? \"cleanup-capacity\"\n : event.reason === \"registration\"\n ? \"registration-failure\"\n : event.reason === \"connection\"\n ? \"disconnected\"\n : \"native-failure\",\n event.disposition,\n generation,\n );\n },\n });\n\n const connectNative = (url: Redacted.Redacted<unknown>, nativeOptions: DriverOptions) =>\n Effect.uninterruptibleMask((restore) =>\n Effect.gen(function* () {\n // Drawn before this attempt claims the connection, so a failed draw leaves nothing to undo.\n const identity: ConnectionIdentity = { namespace: yield* uuid, bindings: yield* uuid };\n const connectionLease = {};\n\n activeConnection = connectionLease;\n connectPending = true;\n const events = connectionEvents(connectionLease, owner.state.generation);\n\n const bindings =\n options.connectBindings === undefined\n ? undefined\n : yield* options\n .connectBindings(\n events.fault,\n () =>\n activeConnection === connectionLease &&\n (owner.state.phase === \"acquiring\" || owner.state.phase === \"open\"),\n () =>\n activeConnection === connectionLease &&\n [\"acquiring\", \"open\", \"paused\"].includes(owner.state.phase),\n )\n .pipe(Scope.provide(bindingLifetime));\n\n activeBindings = bindings;\n\n const retired = () =>\n activeConnection !== connectionLease ||\n [\"closing\", \"closed\", \"uncertain\", \"faulted\"].includes(owner.state.phase);\n\n if (retired()) {\n bindings?.close();\n yield* bindings?.dispose ?? Effect.void;\n\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n }\n\n const acquired = yield* restore(\n engine.connect({\n connection: Redacted.value(url),\n identity,\n options: {\n ...nativeOptions,\n ...(bindings === undefined\n ? {}\n : {\n bindings: bindings.bindings,\n onBindingFault: bindings.reportFailure,\n }),\n },\n events,\n onAbandoned: () => bindings?.close(),\n onSettled: () => {\n if (activeConnection === connectionLease) connectPending = false;\n },\n }),\n );\n\n driver = acquired;\n if (\n activeConnection !== connectionLease ||\n owner.state.phase === \"closed\" ||\n owner.state.phase === \"closing\" ||\n owner.state.phase === \"uncertain\" ||\n owner.state.phase === \"faulted\"\n ) {\n yield* Effect.tryPromise({\n try: () => acquired.disconnect(),\n catch: () =>\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.ignore);\n driver = undefined;\n\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"unknown\",\n });\n }\n\n return acquired;\n }),\n );\n\n const getDriver = () => {\n if (driver === undefined)\n throw BrowserError.make({\n operation: \"target\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n\n return driver;\n };\n\n /**\n * Work that depends on an initialized document waits for the current document's readiness.\n * Navigation, selection and page management deliberately do not: initialization must never\n * deadlock the navigation that produces the document it is waiting for.\n */\n const dependent = [\n \"read-text\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n \"click\",\n \"fill\",\n \"fill-form\",\n \"scroll\",\n \"pointer-move\",\n \"hover\",\n \"wheel\",\n \"press\",\n \"type\",\n \"screenshot\",\n \"observe\",\n \"wait\",\n \"click-and-wait\",\n \"download-action\",\n \"select-files\",\n \"file-chooser\",\n ];\n\n const requireReady = async (\n operation: BrowserOperation,\n ticket: Ticket,\n target?: DriverTarget,\n ) => {\n if (!dependent.includes(operation)) return;\n const state = await getDriver().documentReadiness(ticket, target);\n\n if (state._tag === \"Ready\" || state._tag === \"NotApplicable\") return;\n throw BrowserError.make({\n operation,\n reason:\n state._tag === \"RequiresNavigation\" || state.reason === \"stale\"\n ? Reasons.Stale.make({})\n : state.reason === \"timeout\"\n ? Reasons.Timeout.make({})\n : Reasons.Failed.make({}),\n outcome: \"undispatched\",\n });\n };\n\n /**\n * `dependent` is false for lifecycle observations, which report what is actually on the\n * reattached page. Readiness governs work that depends on initialization, not the reading\n * that tells a caller whether this document was initialized at all.\n */\n const observeInside = (\n ticket: Ticket,\n maximumBytes = Math.min(options.maxReturnedBytes, 16384),\n controls = 32,\n dependent = true,\n scope: \"document\" | \"viewport\" = \"document\",\n match?: string,\n ) =>\n Effect.suspend(() => {\n const revision = owner.state.revision;\n\n return native(\"observe\", ticket, async () => {\n await getDriver().pageControl?.checkTarget(undefined, ticket);\n if (dependent) await requireReady(\"observe\", ticket);\n\n return getDriver().observe(scope, maximumBytes, controls, ticket, match);\n }).pipe(\n Effect.flatMap((raw) =>\n Effect.gen(function* () {\n if (owner.state.revision !== revision)\n return yield* BrowserError.make({\n operation: \"observe\",\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n });\n\n const result = yield* Effect.try({\n try: () => Observation.make({ ...raw, target: capture.target(), revision }),\n catch: (error) =>\n publicError(error, \"observe\", {\n reason: Reasons.Malformed.make({}),\n outcome: \"undispatched\",\n }),\n });\n\n const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(Observation))(\n result,\n ).pipe(\n Effect.mapError(() =>\n BrowserError.make({\n operation: \"observe\",\n reason: Reasons.Malformed.make({}),\n outcome: \"undispatched\",\n }),\n ),\n );\n\n const bytes = new TextEncoder().encode(encoded).length;\n\n if (bytes > options.maxReturnedBytes) {\n return yield* BrowserError.make({\n operation: \"observe\",\n reason: Reasons.Limit.make({\n dimension: \"returned-bytes\",\n maximum: options.maxReturnedBytes,\n observed: bytes,\n }),\n outcome: \"undispatched\",\n });\n }\n\n return result;\n }),\n ),\n );\n });\n\n /** A requested text bound may narrow the policy's bound, never widen it. */\n const textBudget = (\n operation: BrowserOperation,\n requested: number | undefined,\n ): Effect.Effect<number, BrowserError> => {\n const bytes = requested ?? Math.min(options.maxReturnedBytes, 16384);\n\n return bytes > options.maxReturnedBytes\n ? Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Configuration.make({ path: \"maxTextBytes\" }),\n outcome: \"undispatched\",\n }),\n )\n : Effect.succeed(bytes);\n };\n\n // Reading a target is an ownership operation too. A native mutation that times out\n // after dispatch fences the owner as uncertain; retaining the last native target\n // must not manufacture a fresh usable handle in that state.\n const readSelected = owner.guard(\n \"target\",\n () =>\n Effect.try({\n try: capture.target,\n catch: () =>\n BrowserError.make({\n operation: \"target\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n }),\n { charge: false },\n );\n\n /**\n * While a navigation is in flight on the selected page, nothing else may change that page.\n * Reads, checkpoints, holds and every other page proceed.\n */\n const unreserved = (operation: BrowserOperation, target?: DriverTarget) =>\n Effect.suspend(() => {\n let pageId = target?.pageId;\n\n if (pageId === undefined)\n try {\n pageId = driver?.selected().pageId;\n } catch {\n // No selected target: the operation itself reports that, with its own reason.\n }\n\n return pageId !== undefined && (owner.reserved(pageId) || owner.waitPending(pageId))\n ? Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n )\n : Effect.void;\n });\n\n const waitFree = (operation: BrowserOperation, pageId?: string) =>\n Effect.suspend(() =>\n owner.waitPending(pageId)\n ? Effect.fail(\n BrowserError.make({\n operation,\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n )\n : Effect.void,\n );\n\n const nativeOperation = <A>(\n operation: BrowserOperation,\n action: (driver: Driver, ticket: Ticket) => Promise<A>,\n options: {\n readonly mutation?: boolean;\n readonly charge?: boolean | \"host-read\";\n /** Opening or closing a tab is independent of the selected page's document. */\n readonly anyPage?: boolean;\n readonly mutationScope?: () => ObservationScope;\n readonly preflight?: Effect.Effect<void, BrowserError>;\n } = {},\n ) =>\n owner.guard(\n operation,\n (ticket) =>\n native(operation, ticket, async () => {\n // A held page is refused, never woken: none of these may run against one.\n if (\n [\n \"resize\",\n \"wait\",\n \"click-and-wait\",\n \"download-action\",\n \"select-files\",\n \"select-option\",\n \"fill-form\",\n \"file-chooser\",\n \"checkpoint\",\n \"control-facts\",\n \"revalidate\",\n ].includes(operation)\n )\n await getDriver().pageControl?.checkTarget(undefined, ticket);\n await requireReady(operation, ticket);\n\n return action(getDriver(), ticket);\n }),\n {\n ...options,\n mutationScope: options.mutationScope ?? (() => ({ pageId: getDriver().selected().pageId })),\n preflight: (options.mutation === true && options.anyPage !== true\n ? unreserved(operation)\n : Effect.void\n ).pipe(Effect.andThen(options.preflight ?? Effect.void)),\n },\n );\n\n const wait = (\n start: (driver: Driver, ticket: WaitTicket, target: DriverTarget) => Promise<void>,\n timeoutMillis?: number,\n ): Effect.Effect<void, BrowserError> =>\n Effect.suspend(() => {\n let owned: OwnedWait | undefined;\n\n return owner\n .guard(\n \"wait\",\n (ticket) =>\n native(\"wait\", ticket, async () => {\n const driver = getDriver();\n const connection = activeConnection;\n\n if (connection === undefined)\n throw BrowserError.make({\n operation: \"wait\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n });\n const target = driver.selected();\n const admitted = owner.beginWait(ticket, target, connection);\n\n owned = admitted;\n let started = false;\n\n try {\n await driver.pageControl?.checkTarget(target, ticket);\n ticket.check();\n await requireReady(\"wait\", ticket, target);\n ticket.check();\n admitted.start(() => start(driver, admitted.ticket, target));\n started = true;\n\n return admitted;\n } finally {\n // Canceled readiness may still be native work: retire only when its raw task exits.\n if (!started) admitted.ticket.retire();\n }\n }),\n {\n ...(timeoutMillis === undefined ? {} : { timeoutMillis }),\n preflight: Effect.suspend(() =>\n owner.waitAvailable()\n ? unreserved(\"wait\")\n : Effect.fail(\n BrowserError.make({\n operation: \"wait\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n }),\n ),\n ),\n },\n )\n .pipe(\n Effect.flatMap((operation) => operation.completed),\n Effect.ensuring(Effect.sync(() => owned?.cancel())),\n );\n });\n\n /**\n * Direct operations resolve selection under admission. Retained operations capture selection\n * and generation; pinned operations capture generation and their explicit page/frame only.\n */\n const captureClickAt =\n (target: Target): InputCapture =>\n async (dispatch, dispatched) => {\n const startedMonotonicNanos = clock.monotonicTimeNanosUnsafe();\n\n await dispatch();\n\n return {\n ...dispatched,\n target,\n kind: \"click\",\n startedMonotonicNanos,\n completedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n };\n };\n\n const makeOperations = (retained?: {\n readonly generation: number;\n readonly selection?: number;\n readonly target?: DriverTarget;\n }) => {\n const browserTarget = retained?.target;\n\n const check = () => {\n if (\n retained !== undefined &&\n (owner.state.generation !== retained.generation ||\n (retained.selection !== undefined && owner.state.selection !== retained.selection))\n ) {\n return Effect.fail(\n BrowserError.make({\n operation: \"handle\",\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n }),\n );\n }\n\n return Effect.void;\n };\n\n const run = <A>(\n operation: BrowserOperation,\n action: (driver: Driver, ticket: Ticket) => Promise<A>,\n mutation = false,\n ) =>\n owner.guard(\n operation,\n (ticket) =>\n native(operation, ticket, async () => {\n await getDriver().pageControl?.checkTarget(browserTarget, ticket);\n await requireReady(operation, ticket, browserTarget);\n\n return action(getDriver(), ticket);\n }),\n {\n mutation,\n mutationScope: () => ({ pageId: browserTarget?.pageId ?? getDriver().selected().pageId }),\n preflight: mutation\n ? Effect.suspend(check).pipe(Effect.andThen(unreserved(operation, browserTarget)))\n : Effect.suspend(check),\n },\n );\n\n const operationTarget = () =>\n retained?.target === undefined\n ? capture.target()\n : Target.make({\n generation: retained.generation,\n pageId: retained.target.pageId,\n frameId: retained.target.frameId,\n });\n\n /**\n * Native input, stamped on the host monotonic clock that stamps captured frames, around\n * the native command alone: admission and readiness are over before the clock is read.\n */\n const input = (\n operation: BrowserOperation,\n action: (driver: Driver, ticket: Ticket) => Promise<NativeInput>,\n ) =>\n run(\n operation,\n async (driver, ticket) => {\n // What the input is sent to, read first: input may replace the document it reaches.\n const target = operationTarget();\n const startedMonotonicNanos = clock.monotonicTimeNanosUnsafe();\n const dispatched = await action(driver, ticket);\n\n return {\n ...dispatched,\n target,\n startedMonotonicNanos,\n completedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n };\n },\n true,\n );\n\n /**\n * Dispatches under a short permit and leaves the browser loading outside it. The reservation\n * is taken under that same permit, so no other mutation can reach the page in between, and\n * it is released only on a known outcome: an unsettled operation whose scope closes, or a\n * navigation that fails after dispatch, fences the owner exactly as an interrupted mutation\n * always has. Interrupting a waiter on `completed` stops nothing; `stop` is the one way to.\n */\n const startNavigation = Effect.fnUntraced(function* (\n url: string,\n timeoutMillis: number = limits.actionTimeoutMillis,\n ) {\n let active = true;\n let dismissals = 0;\n let beforeUnload = false;\n let dismissalUnknown = false;\n let rejected: BrowserError | undefined;\n let reconsider = () => {};\n\n const control: NavigationControl = {\n identity: {},\n beforeUnload: () => {\n if (!active) return { dismissed: () => {} };\n beforeUnload = true;\n dismissals++;\n let settled = false;\n\n return {\n dismissed: (confirmed) => {\n if (settled || !active) return;\n settled = true;\n dismissals--;\n if (!confirmed) dismissalUnknown = true;\n reconsider();\n },\n };\n },\n };\n\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n active = false;\n }),\n );\n\n const begun = yield* run(\n \"navigate\",\n async (driver, ticket) => {\n const target = operationTarget();\n\n const loadingStarted = Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000;\n const remainingLifetime = owner.lifetimeDeadline - loadingStarted;\n\n if (remainingLifetime <= 0)\n throw BrowserError.make({\n operation: \"navigate\",\n reason: Reasons.Expired.make({}),\n outcome: \"undispatched\",\n });\n\n const loadingTimeout = Math.min(timeoutMillis, remainingLifetime);\n\n const navigation = await driver.beginNavigation(\n url,\n loadingTimeout,\n ticket,\n browserTarget,\n control,\n );\n\n return {\n target,\n navigation,\n reservation: owner.reserve(navigation.pageId),\n recoveryDeadline: Math.min(\n loadingStarted + loadingTimeout + 3000,\n owner.lifetimeDeadline,\n ),\n };\n },\n true,\n );\n\n const { navigation, reservation } = begun;\n const outcome = yield* Deferred.make<string, BrowserError>();\n const timeoutRecovery = yield* Deferred.make<boolean>();\n let stopDispatched = false;\n let timedOut = false;\n let deciding = false;\n\n const failed = (reason: BrowserError[\"reason\"]) =>\n Effect.fail(BrowserError.make({ operation: \"navigate\", reason, outcome: \"unknown\" }));\n\n /**\n * A navigation has exactly one outcome, and whoever decides it first settles the\n * reservation. It is released before anyone waiting is told, so the operation a waiter\n * runs next is admitted rather than finding its own page still reserved.\n */\n const decide = (result: Effect.Effect<string, BrowserError>, known: boolean) => {\n if (deciding || Deferred.isDoneUnsafe(outcome)) return;\n deciding = true;\n active = false;\n reservation.settle(known ? \"known\" : \"unknown\");\n Deferred.doneUnsafe(outcome, result);\n Deferred.doneUnsafe(timeoutRecovery, Effect.succeed(false));\n deciding = false;\n };\n\n reconsider = () => {\n if (!active || rejected === undefined || dismissals !== 0 || stopDispatched) return;\n if (beforeUnload) {\n // Both facts are required: this goto rejected and its exact dialog was dismissed.\n decide(\n dismissalUnknown ? Effect.fail(rejected) : failed(Reasons.Interrupted.make({})),\n !dismissalUnknown,\n );\n } else if (navigation.mainFrame === true && rejected.reason._tag === \"Timeout\") {\n timedOut = true;\n Deferred.doneUnsafe(timeoutRecovery, Effect.succeed(true));\n } else {\n decide(Effect.fail(rejected), false);\n }\n };\n\n navigation.settled.then(\n (url) => {\n if (!stopDispatched) decide(Effect.succeed(url), true);\n },\n (error: unknown) => {\n if (stopDispatched || Deferred.isDoneUnsafe(outcome)) return;\n\n rejected = publicError(error, \"navigate\", {\n reason: Reasons.Provider.make({}),\n outcome: \"unknown\",\n });\n reconsider();\n },\n );\n\n // A fence already cleared the reservation; this only releases anyone still waiting.\n const aborted = () =>\n decide(failed(timedOut ? Reasons.Timeout.make({}) : Reasons.Stale.make({})), true);\n\n reservation.signal.addEventListener(\"abort\", aborted, {\n once: true,\n });\n // Left unsettled, nothing knows what the browser did with it.\n yield* Effect.addFinalizer(() =>\n Effect.sync(() => {\n decide(failed(timedOut ? Reasons.Timeout.make({}) : Reasons.Stale.make({})), false);\n reservation.signal.removeEventListener(\"abort\", aborted);\n }),\n );\n\n const stop = yield* makeNavigationStopCoordinator(\n () => Deferred.isDoneUnsafe(outcome),\n (onDispatch, retainSetup, deadline) =>\n owner.guard(\n \"navigate-stop\",\n (ticket) =>\n Effect.suspend(() =>\n deadline !== undefined && stopSetupPending !== undefined\n ? Deferred.await(stopSetupPending)\n : Effect.void,\n ).pipe(\n Effect.andThen(\n native(\"navigate-stop\", ticket, () =>\n navigation.stop(\n ticket,\n () => !Deferred.isDoneUnsafe(outcome),\n () => {\n onDispatch();\n stopDispatched = true;\n },\n () => {\n if (stopSetupPending !== undefined)\n throw BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Busy.make({}),\n outcome: \"undispatched\",\n });\n const setup = Deferred.makeUnsafe<void>();\n\n stopSetupPending = setup;\n const retired = retainSetup();\n\n return () => {\n if (stopSetupPending === setup) stopSetupPending = undefined;\n Deferred.doneUnsafe(setup, Effect.void);\n retired();\n };\n },\n ),\n ),\n ),\n Effect.timeoutOrElse({\n duration: Math.min(3000, ticket.remainingMillis()),\n orElse: () =>\n Effect.fail(\n BrowserError.make({\n operation: \"navigate-stop\",\n reason: Reasons.Timeout.make({}),\n outcome: ticket.dispatched ? \"unknown\" : \"undispatched\",\n }),\n ),\n }),\n ),\n {\n mutation: true,\n mutationScope: () => ({ pageId: navigation.pageId }),\n charge: false,\n ...(deadline === undefined ? {} : { waitUntil: deadline }),\n },\n ),\n () =>\n decide(failed(timedOut ? Reasons.Timeout.make({}) : Reasons.Interrupted.make({})), true),\n );\n\n // One operation-scoped supervisor, signalled only by the exact native timeout classifier.\n // Its absolute deadline bounds joined public stops, permit wait and late setup retirement too.\n yield* Deferred.await(timeoutRecovery).pipe(\n Effect.flatMap((recover) =>\n recover\n ? stop.recover(begun.recoveryDeadline).pipe(\n Effect.onExit((exit) =>\n Effect.sync(() => {\n if (Exit.isFailure(exit)) decide(failed(Reasons.Timeout.make({})), false);\n }),\n ),\n )\n : Effect.void,\n ),\n Effect.ignoreCause,\n Effect.forkScoped,\n );\n\n return {\n target: begun.target,\n completed: Deferred.await(outcome),\n /**\n * The browser's acknowledgement is the known outcome. Playwright's own promise is not\n * waited for: an aborted parse fires no DOMContentLoaded, so it only ever times out.\n */\n stop: stop.stop,\n };\n });\n\n return {\n startNavigation,\n // The same machinery, scoped to the call: leaving it unsettled fences, as it always has.\n navigate: (url: string, timeoutMillis?: number) =>\n Effect.scoped(\n startNavigation(url, timeoutMillis).pipe(\n Effect.flatMap((operation) => operation.completed),\n ),\n ),\n readText: (selector?: string) =>\n run(\"read-text\", (driver, ticket) =>\n driver.readText(selector, options.maxReturnedBytes, ticket, browserTarget),\n ),\n click: (target: string | ObservedElement, policy?: AdmissionPolicy) =>\n run(\n \"click\",\n (driver, ticket) =>\n driver.click(target, ticket, captureClickAt(operationTarget()), policy, browserTarget),\n true,\n ),\n fill: (target: string | ObservedElement, value: string, policy?: AdmissionPolicy) =>\n run(\n \"fill\",\n (driver, ticket) => driver.fill(target, value, ticket, policy, browserTarget),\n true,\n ),\n scroll: (x: number, y: number) =>\n run(\"scroll\", (driver, ticket) => driver.scroll(x, y, ticket, browserTarget), true),\n pointerMove: (to: NativePoint) =>\n input(\"pointer-move\", (driver, ticket) => driver.pointerMove(to, ticket, browserTarget)),\n hover: (target: string | ObservedElement, policy?: AdmissionPolicy) =>\n input(\"hover\", (driver, ticket) => driver.hover(target, ticket, policy, browserTarget)),\n wheel: (deltaX: number, deltaY: number, at?: NativePoint) =>\n input(\"wheel\", (driver, ticket) => driver.wheel(deltaX, deltaY, at, ticket, browserTarget)),\n press: (\n key: string,\n modifiers: ReadonlyArray<KeyModifier>,\n into?: string | ObservedElement,\n policy?: AdmissionPolicy,\n ) =>\n input(\"press\", (driver, ticket) =>\n driver.press(key, modifiers, into, ticket, policy, browserTarget),\n ),\n type: (text: string, into?: string | ObservedElement, policy?: AdmissionPolicy) =>\n input(\"type\", (driver, ticket) => driver.type(text, into, ticket, policy, browserTarget)),\n screenshot: (full: boolean) =>\n run(\"screenshot\", (driver, ticket) =>\n driver.screenshot(full, options.maxReturnedBytes, ticket, browserTarget),\n ),\n };\n };\n\n /** The runtime supplies its remaining budget; endpoint sources apply their own wait limits. */\n const remainingMillis = () =>\n Math.max(\n 1,\n Math.ceil(owner.lifetimeDeadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000),\n );\n\n const connectionUrl = (operation: BrowserOperation) =>\n Effect.suspend(() => acquired.connection(remainingMillis())).pipe(\n Effect.mapError((error) =>\n BrowserError.make({ operation, reason: error.reason, outcome: error.outcome }),\n ),\n );\n\n const connected = yield* Effect.cached(\n owner\n .guard(\n \"connect\",\n (ticket) =>\n connectionUrl(\"connect\").pipe(\n Effect.flatMap((url) => connectNative(url, options.driver)),\n Effect.andThen(\n native(\"connect\", ticket, async () => {\n getDriver().selected();\n }),\n ),\n Effect.tap(() =>\n Effect.sync(() => {\n owner.transition(\"open\");\n }),\n ),\n ),\n { phases: [\"acquiring\"], charge: false, verifyAfter: false },\n )\n .pipe(\n Effect.onError(() => closeScope),\n Effect.onInterrupt(() => closeScope),\n ),\n );\n\n const execution = () => {\n const port = getDriver().pageControl;\n\n if (port === undefined)\n throw BrowserError.make({\n operation: \"page-control\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n\n return port;\n };\n\n const pinned = (resolve: (driver: Driver, ticket: Ticket) => Promise<DriverTarget>) =>\n owner.guard(\n \"target\",\n (ticket) =>\n native(\"target\", ticket, async () => {\n const value = await resolve(getDriver(), ticket);\n\n ticket.check();\n\n return {\n target: Target.make({ generation: ticket.generation, ...value }),\n operations: makeOperations({ generation: ticket.generation, target: value }),\n };\n }),\n { charge: false },\n );\n\n const retain = owner.guard(\n \"target\",\n () =>\n Effect.try({\n try: () => {\n const target = capture.target();\n\n return makeOperations({\n generation: target.generation,\n selection: owner.state.selection,\n });\n },\n catch: (error) =>\n publicError(error, \"target\", {\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n }),\n { charge: false },\n );\n\n const controls = {\n implementation: options.implementation,\n status: owner.status,\n diagnostics: owner.diagnostics,\n pageControl: {\n state: (page: PageInfo) =>\n nativeOperation(\"page-state\", (_driver, ticket) => execution().state(page, ticket), {\n charge: false,\n }),\n suspend: (page: PageInfo) =>\n nativeOperation(\"page-suspend\", (_driver, ticket) => execution().suspend(page, ticket), {\n charge: false,\n preflight: waitFree(\"page-suspend\", page.pageId),\n }),\n resume: (receipt: PageSuspension) =>\n nativeOperation(\"page-resume\", (_driver, ticket) => execution().resume(receipt, ticket), {\n charge: false,\n preflight: waitFree(\"page-resume\", receipt.pageId),\n }),\n },\n reference: ref,\n capture,\n operations: makeOperations(),\n retain,\n target: readSelected,\n cleanupResult,\n close: release.pipe(Effect.tap(() => retireControl)),\n closeChecked: acquired.closeChecked.pipe(Effect.onExit(() => retireControl)),\n observe: (reading: Reading = { scope: \"document\" }) =>\n textBudget(\"observe\", reading.maxTextBytes).pipe(\n Effect.flatMap((bytes) =>\n owner.guard(\n \"observe\",\n (ticket) =>\n observeInside(\n ticket,\n bytes,\n reading.maxControls ?? 32,\n true,\n reading.scope,\n reading.match,\n ),\n { preflight: waitFree(\"observe\") },\n ),\n ),\n ),\n /**\n * Passive: not a mutation, so the action observation and the selection are left exactly as\n * they were. A held page is refused rather than woken to be read.\n */\n checkpoint: (reading: Omit<Reading, \"scope\"> & { readonly picture: boolean }) =>\n textBudget(\"checkpoint\", reading.maxTextBytes).pipe(\n Effect.flatMap((bytes) =>\n nativeOperation(\n \"checkpoint\",\n async (driver, ticket) => {\n const target = capture.target();\n const revision = owner.state.revision;\n const startedMonotonicNanos = clock.monotonicTimeNanosUnsafe();\n\n const sampled = await driver.checkpoint(\n bytes,\n reading.maxControls ?? 32,\n reading.picture ? options.maxReturnedBytes : undefined,\n ticket,\n );\n\n return {\n ...sampled,\n target,\n revision,\n startedMonotonicNanos,\n completedMonotonicNanos: clock.monotonicTimeNanosUnsafe(),\n };\n },\n { charge: \"host-read\" },\n ),\n ),\n ),\n controlFacts: (reference: ObservedElement) =>\n nativeOperation(\"control-facts\", (driver, ticket) => driver.controlFacts(reference, ticket), {\n charge: \"host-read\",\n }),\n selectOption: (reference: ObservedElement, options: SelectOptions, policy?: AdmissionPolicy) =>\n nativeOperation(\n \"select-option\",\n (driver, ticket) => driver.selectOption(reference, options, ticket, policy),\n { mutation: true },\n ),\n /**\n * Each step is its own admitted, charged mutation that leaves the observation usable for the\n * next one; anything else that changes the page still retires it. The form ends at the first\n * refusal, and whatever it dispatched retires the observation when it ends, however it ends.\n */\n fillForm: (request: FillFormRequest, policy: AdmissionPolicy | undefined, form: FormSettings) =>\n Effect.suspend(() => {\n // The page whose observation the steps kept usable, known once one of them dispatched.\n let pageId: string | undefined;\n\n const reference = (elementId: string): ObservedElement => ({\n observationId: request.observationId,\n elementId,\n });\n\n const kept = (): ObservationScope => {\n pageId ??= getDriver().selected().pageId;\n\n return \"none\";\n };\n\n const body = Effect.gen(function* () {\n const fields: Array<{\n elementId: string;\n status: \"set\" | \"unchanged\";\n input?: InputReceipt;\n }> = [];\n\n const states: Array<string | undefined> = [];\n let url = \"\";\n\n const finish = (submitted: boolean): FormOutcome => ({ fields, submitted, url });\n\n const stop = (\n stage: \"field\" | \"verify\" | \"submit\",\n error: BrowserError,\n elementId?: string,\n ): FormOutcome => ({\n ...finish(false),\n stopped: { stage, error, ...(elementId === undefined ? {} : { elementId }) },\n });\n\n for (const field of request.fields) {\n const exit = yield* Effect.exit(\n nativeOperation(\n \"fill-form\",\n (driver, ticket) =>\n driver.formStep(\n reference(field.elementId),\n field,\n ticket,\n policy,\n form.settleMillis,\n captureClickAt(capture.target()),\n ),\n { mutation: true, mutationScope: kept },\n ),\n );\n\n if (Exit.isFailure(exit)) {\n const error = Cause.findErrorOption(exit.cause);\n\n // Interruption and defects keep their own meaning. A form that has completed no\n // step fails exactly as its first step did.\n if (Option.isNone(error) || fields.length === 0)\n return yield* Effect.failCause(exit.cause);\n\n return stop(\"field\", error.value, field.elementId);\n }\n const step = exit.value;\n\n fields.push({\n elementId: field.elementId,\n status: step.status,\n ...(step.input === undefined ? {} : { input: step.input }),\n });\n states.push(step.state);\n url = step.url;\n if (!step.reached)\n return stop(\n \"field\",\n BrowserError.make({\n operation: \"fill-form\",\n reason: Reasons.Failed.make({}),\n outcome: \"rejected\",\n }),\n field.elementId,\n );\n }\n\n if (form.verify) {\n // Not charged, like revalidation: it sends no input and reads nodes already issued.\n const exit = yield* Effect.exit(\n nativeOperation(\n \"fill-form\",\n (driver, ticket) =>\n driver.formState(\n request.fields.map((field) => reference(field.elementId)),\n ticket,\n ),\n { charge: false },\n ),\n );\n\n if (Exit.isFailure(exit)) {\n const error = Cause.findErrorOption(exit.cause);\n\n if (Option.isNone(error)) return yield* Effect.failCause(exit.cause);\n\n return stop(\"verify\", error.value);\n }\n for (const [index, field] of request.fields.entries()) {\n const expected = states[index];\n\n if (expected === undefined || exit.value[index] !== expected)\n return stop(\n \"verify\",\n BrowserError.make({\n operation: \"fill-form\",\n reason: Reasons.Stale.make({}),\n outcome: \"undispatched\",\n }),\n field.elementId,\n );\n }\n }\n\n if (request.submit === undefined) return finish(false);\n const submit = request.submit;\n\n const exit = yield* Effect.exit(\n nativeOperation(\n \"fill-form\",\n (driver, ticket) =>\n driver.formSubmit(\n reference(submit),\n ticket,\n captureClickAt(capture.target()),\n policy,\n ),\n { mutation: true },\n ),\n );\n\n if (Exit.isFailure(exit)) {\n const error = Cause.findErrorOption(exit.cause);\n\n if (Option.isNone(error)) return yield* Effect.failCause(exit.cause);\n\n return stop(\"submit\", error.value, submit);\n }\n url = exit.value.url;\n\n return { ...finish(true), submitInput: exit.value.input };\n });\n\n // The steps kept the observation usable for each other only. A submit that dispatched\n // has already retired it, as every other mutation does.\n return body.pipe(\n Effect.ensuring(\n Effect.sync(() => {\n if (pageId !== undefined) owner.invalidate(\"observation\", { pageId });\n }),\n ),\n );\n }),\n /** Not charged: it sends no input and reads one node the caller was already given. */\n revalidate: (reference: ObservedElement) =>\n nativeOperation(\"revalidate\", (driver, ticket) => driver.revalidate(reference, ticket), {\n charge: false,\n }),\n // Inspecting readiness is not an action: it charges nothing and mutates nothing.\n readiness: owner.guard(\n \"ready\",\n (ticket) => native(\"ready\", ticket, () => getDriver().documentReadiness(ticket)),\n { charge: false },\n ),\n pages: nativeOperation(\"list-pages\", (driver, ticket) => driver.listPages(ticket), {\n charge: false,\n }),\n frames: nativeOperation(\"list-frames\", (driver, ticket) => driver.listFrames(ticket), {\n charge: false,\n }),\n framesOf: (page: PageInfo) =>\n nativeOperation(\"list-frames\", (driver, ticket) => driver.listFrames(ticket, page), {\n charge: false,\n }),\n pinPage: (page: PageInfo) => pinned((driver, ticket) => driver.resolvePage(page, ticket)),\n pinFrame: (page: PageInfo, frame: FrameInfo) =>\n pinned((driver, ticket) => driver.resolveFrame(page, frame, ticket)),\n selectPage: (page: PageInfo) =>\n nativeOperation(\n \"select-page\",\n async (driver, ticket) => {\n await driver.selectPage(page, ticket);\n owner.state.selection++;\n },\n { charge: false },\n ),\n selectFrame: (id: string) =>\n nativeOperation(\n \"select-frame\",\n async (driver, ticket) => {\n await driver.selectFrame(id, ticket);\n owner.state.selection++;\n },\n { charge: false },\n ),\n createPage: () =>\n nativeOperation(\"new-page\", (driver, ticket) => driver.newPage(ticket), {\n mutation: true,\n mutationScope: () => \"none\",\n charge: false,\n anyPage: true,\n }),\n closePage: (page: PageInfo) =>\n nativeOperation(\"close-page\", (driver, ticket) => driver.closePage(page, ticket), {\n mutation: true,\n mutationScope: () => ({ pageId: page.pageId }),\n charge: false,\n anyPage: true,\n }),\n resize: (viewport: Viewport) =>\n nativeOperation(\"resize\", (driver, ticket) => driver.resize(viewport, ticket), {\n mutation: true,\n charge: false,\n }),\n waitFor: (selector: string, state: \"visible\" | \"hidden\" | \"attached\" | \"detached\") =>\n wait((driver, ticket, target) => driver.waitFor(selector, state, ticket, target)),\n waitForElement: (request: WaitForElementRequest) =>\n wait(\n (driver, ticket, target) =>\n driver.waitForElement(request.reference, request.state, ticket, target),\n request.timeoutMillis,\n ),\n clickAndWait: (target: string | ObservedElement) =>\n nativeOperation(\n \"click-and-wait\",\n (driver, ticket) => driver.clickAndWait(target, ticket, captureClickAt(capture.target())),\n { mutation: true },\n ),\n clickForDownload: (target: string | ObservedElement) =>\n nativeOperation(\n \"download-action\",\n (driver, ticket) => driver.clickForDownload(target, ticket),\n { mutation: true },\n ),\n selectFiles: (target: string | ObservedElement, files: ReadonlyArray<NativeFileSelection>) =>\n nativeOperation(\n \"select-files\",\n (driver, ticket) => driver.selectFiles(target, files, ticket),\n { mutation: true },\n ),\n clickForFileSelection: (\n target: string | ObservedElement,\n files: ReadonlyArray<NativeFileSelection>,\n ) =>\n nativeOperation(\n \"file-chooser\",\n (driver, ticket) => driver.clickForFileSelection(target, files, ticket),\n { mutation: true },\n ),\n liveView: <A>(issue: Effect.Effect<A, BrowserError>) =>\n owner.guard(\"live-view\", () => issue, { charge: false, phases: [\"open\", \"paused\"] }),\n beginHandoff: <A>(issue: Effect.Effect<A, BrowserError>) =>\n owner.guard(\n \"handoff\",\n () =>\n Effect.gen(function* () {\n if (options.driver.pageControl)\n return yield* BrowserError.make({\n operation: \"handoff\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n // Drawn before the fence, so the pause and the token that ends it commit together.\n const token = handoffToken ?? (yield* uuid);\n\n if (owner.state.phase === \"open\") owner.fence(\"paused\", \"paused\", \"handoff\");\n handoffToken ??= token;\n // A refused authorization leaves automation paused until explicit operator release.\n const view = yield* issue;\n\n return { token: Redacted.make(handoffToken), view };\n }),\n { charge: false, phases: [\"open\", \"paused\"], verifyAfter: false },\n ),\n resume: (token: Redacted.Redacted<string>, operatorReleasedControl: boolean) =>\n owner.guard(\n \"resume\",\n (ticket) =>\n Effect.gen(function* () {\n if (\n !operatorReleasedControl ||\n handoffToken === undefined ||\n Redacted.value(token) !== handoffToken\n ) {\n return yield* BrowserError.make({\n operation: \"resume\",\n reason: Reasons.Authorization.make({}),\n outcome: \"undispatched\",\n });\n }\n yield* native(\"resume\", ticket, () => getDriver().dismissDialogs(ticket));\n const observation = yield* observeInside(ticket, undefined, undefined, false);\n\n // This synchronous commit remains under the same permit as the fresh observation.\n owner.transition(\"open\");\n handoffToken = undefined;\n\n return observation;\n }),\n { charge: false, phases: [\"paused\"], verifyAfter: false },\n ),\n detach: owner\n .guard(\n \"detach\",\n (ticket) =>\n Effect.gen(function* () {\n if (!options.keepAlive)\n return yield* BrowserError.make({\n operation: \"detach\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n reconnectTarget = yield* native(\"detach\", ticket, () => getDriver().selectedTargetId());\n const attached = getDriver();\n\n activeConnection = undefined;\n owner.fence(\"detached\", \"disconnected\", \"detached\");\n const initialization = yield* Effect.exit(disposeBindings);\n\n const disconnected = yield* Effect.tryPromise({\n try: () => attached.disconnect(),\n catch: () =>\n BrowserError.make({\n operation: \"detach\",\n reason: Reasons.Disconnected.make({}),\n outcome: \"unknown\",\n }),\n }).pipe(Effect.exit);\n\n driver = undefined;\n if (Exit.isFailure(initialization))\n return yield* Effect.failCause(initialization.cause);\n if (Exit.isFailure(disconnected)) return yield* Effect.failCause(disconnected.cause);\n\n return { reference: ref, targetId: reconnectTarget };\n }),\n { charge: false, verifyAfter: false },\n )\n .pipe(Effect.onError(() => Effect.sync(() => owner.fence(\"uncertain\", \"uncertain\")))),\n reconnect: (operatorReleasedControl: boolean) =>\n owner\n .guard(\n \"reconnect\",\n (ticket) =>\n Effect.gen(function* () {\n if (\n !options.keepAlive ||\n reconnectTarget === undefined ||\n !operatorReleasedControl ||\n acquired.verifyReconnect === undefined\n ) {\n return yield* BrowserError.make({\n operation: \"reconnect\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n }\n\n yield* acquired.verifyReconnect;\n owner.transition(\"acquiring\");\n const endpoint = yield* connectionUrl(\"reconnect\");\n\n yield* connectNative(endpoint, {\n ...options.driver,\n initialTargetId: reconnectTarget,\n newPage: false,\n preserveViewport: true,\n });\n const observation = yield* observeInside(ticket, undefined, undefined, false);\n\n owner.transition(\"open\");\n\n return observation;\n }),\n { charge: false, phases: [\"detached\", \"acquiring\"], verifyAfter: false },\n )\n .pipe(\n Effect.onError(() => closeScope),\n Effect.onInterrupt(() => closeScope),\n ),\n };\n\n // One timer belongs to the enclosing execution, never to an individual Tool call.\n const remaining = Math.max(\n 0,\n owner.lifetimeDeadline - Number(clock.monotonicTimeNanosUnsafe()) / 1_000_000,\n );\n\n // The execution lifetime distinguishes expiry from natural completion before\n // running the shared close path; this race has the required proven semantics.\n // @effect-diagnostics-next-line raceFirstWithSleepToTimeout:off\n yield* Effect.raceFirst(\n Effect.sleep(remaining).pipe(Effect.as(true)),\n Deferred.await(ended).pipe(Effect.as(false)),\n ).pipe(\n Effect.flatMap((expired) =>\n expired ? Effect.sync(owner.expire).pipe(Effect.andThen(closeScope)) : Effect.void,\n ),\n Effect.forkIn(parentScope),\n );\n\n return {\n reference: ref,\n /** The caller keeps its own lease type, including whether an allocation attempt exists. */\n lease: acquired,\n close: controls.close,\n connect: Effect.suspend(() =>\n owner.state.phase === \"closed\" || owner.state.phase === \"closing\"\n ? Effect.fail(\n BrowserError.make({\n operation: \"connect\",\n reason: Reasons.Closed.make({}),\n outcome: \"undispatched\",\n }),\n )\n : connected.pipe(Effect.as(controls)),\n ),\n };\n});\n\nexport type SessionControls<L extends SessionLease = SessionLease> =\n Effect.Success<ReturnType<typeof acquireSession<L, never, never>>> extends {\n connect: Effect.Effect<infer A, infer _E, infer _R>;\n }\n ? A\n : never;\n\nexport type TargetControls = SessionControls[\"operations\"];\n","import { Crypto, Effect, type Option, Redacted, Schema, Scope } from \"effect\";\n\nimport * as Bootstrap from \"./Bootstrap.ts\";\nimport type { BrowserSession, OpenOptions } from \"./Browser.ts\";\nimport {\n ActionResult,\n AutomationOptions,\n BrowserPolicy,\n ClickRequest,\n Identifier,\n InlineFiles,\n type InlineFile,\n type Observation,\n SafeFilename,\n Selector,\n Viewport,\n} from \"./BrowserData.ts\";\nimport {\n BrowserError,\n Reasons,\n type BrowserOperation,\n type InitializationError,\n} from \"./Errors.ts\";\nimport {\n bindingImplementation,\n fromNativeAttempt,\n issueBinding,\n} from \"./internal/browser/Binding.ts\";\nimport { makeBindings, preparePlan } from \"./internal/browser/Bindings.ts\";\nimport { compileBootstrap } from \"./internal/browser/Bootstrap.ts\";\nimport type { ConnectionCleanup } from \"./internal/browser/ConnectionCleanup.ts\";\nimport type { DriverOptions, NativeFileSelection } from \"./internal/browser/Driver.ts\";\nimport { connectPlaywrightEndpoint } from \"./internal/browser/Playwright.ts\";\nimport { checked, decoded, makeSession } from \"./internal/browser/PublicSession.ts\";\nimport { acquireSession } from \"./internal/browser/Session.ts\";\n\nexport {\n cleanupStep,\n noConnection,\n reported,\n type CleanupStep,\n type ConnectionCleanup,\n type ConnectionState,\n} from \"./internal/browser/ConnectionCleanup.ts\";\n\n/** Opaque engine configuration. Only this constructor's issued values can acquire a runtime. */\nexport interface BrowserBinding {\n readonly _tag: \"BrowserBinding\";\n}\n\nexport interface PlaywrightOptions {\n /** A trusted integration validates its own endpoint authority before routing the connection. */\n readonly resolveEndpoint?: (connection: {\n readonly url: Redacted.Redacted<string>;\n }) => Effect.Effect<string, BrowserError>;\n /** Trusted instrumentation of the existing native connection, before the owner starts using it. */\n readonly onConnected?: (connection: {\n readonly native: unknown;\n readonly endpoint: string;\n }) => void;\n}\n\n/** A maintained Playwright connection, loaded lazily. No driver or protocol capability is returned. */\nexport const playwright = (options: PlaywrightOptions = {}): BrowserBinding => {\n const { resolveEndpoint, onConnected } = options;\n\n return issueBinding(\n { _tag: \"BrowserBinding\" as const },\n {\n connect: (request) =>\n Effect.gen(function* () {\n const address = yield* decoded(\n Schema.NonEmptyString.check(Schema.isMaxLength(16384)),\n \"connect\",\n \"undispatched\",\n )(request.connection);\n\n const endpoint =\n resolveEndpoint === undefined\n ? address\n : yield* resolveEndpoint({ url: Redacted.make(address) });\n\n return yield* fromNativeAttempt((attempt, signal) =>\n connectPlaywrightEndpoint(\n endpoint,\n signal,\n attempt.identity,\n attempt.options,\n attempt.events,\n onConnected === undefined ? undefined : (native) => onConnected({ native, endpoint }),\n ),\n ).connect(request);\n }),\n },\n );\n};\n\nconst defaultBinding = playwright();\n\n/**\n * An integration owns endpoint authority and the meaning of release. Its source must register\n * release in the supplied Scope before returning; the runtime owns only the connection below it.\n */\nexport interface Lifetime {\n readonly reference: unknown;\n readonly connection: (\n remainingMillis: number,\n ) => Effect.Effect<Redacted.Redacted<string>, BrowserError>;\n readonly release: Effect.Effect<unknown>;\n readonly cleanupResult: Effect.Effect<Option.Option<unknown>>;\n readonly closeChecked: Effect.Effect<void, BrowserError>;\n /**\n * Memory-only evidence that canonical owned cleanup terminated native browser control.\n * Omission is unknown. Borrowed disconnection alone never establishes this fact.\n */\n readonly controlRetired?: Effect.Effect<boolean>;\n readonly verifyReconnect?: Effect.Effect<void, BrowserError>;\n}\n\nexport type Source<L extends Lifetime, E, R = never> = (\n cleanup: ConnectionCleanup,\n lifetimeDeadline: number,\n) => Effect.Effect<L, E, R | Scope.Scope>;\n\nexport interface RuntimeOptions {\n readonly implementation: string;\n readonly binding?: BrowserBinding;\n readonly automation?: AutomationOptions;\n readonly viewport?: Viewport;\n readonly preserveViewport?: boolean;\n readonly keepAlive?: boolean;\n}\n\nexport interface AcquireOptions<E = never, R = never> extends OpenOptions<E, R> {\n /** Attach to an existing page without creating a tab or changing its viewport. */\n readonly existingTarget?: { readonly targetId?: string };\n}\n\n/**\n * Resolved host input for an integration constructing its own runtime. Stored paths must already\n * have been authorized by that integration; a session cannot recover these operations afterwards.\n */\nexport type ResolvedFileSelection =\n | { readonly _tag: \"Inline\"; readonly files: ReadonlyArray<InlineFile> }\n | { readonly _tag: \"Stored\"; readonly paths: ReadonlyArray<string> };\n\nexport interface FileRequest {\n readonly selector: string;\n readonly selection: ResolvedFileSelection;\n}\n\nexport class DownloadEvent extends Schema.Class<DownloadEvent>(\"BrowserDownloadEvent\")({\n downloadId: Identifier,\n filename: SafeFilename,\n state: Schema.Literals([\"completed\", \"failed\"]),\n}) {}\n\n/**\n * Modeled host operations for the integration creating this connection. Native authority stays\n * inside the owner; the integration adds only the capabilities its public session supports.\n */\nexport interface Integration<Reference> {\n readonly clickForDownload: (request: ClickRequest) => Effect.Effect<DownloadEvent, BrowserError>;\n readonly selectFiles: (request: FileRequest) => Effect.Effect<ActionResult, BrowserError>;\n readonly clickForFileSelection: (\n request: FileRequest,\n ) => Effect.Effect<ActionResult, BrowserError>;\n readonly liveView: <A>(issue: Effect.Effect<A, BrowserError>) => Effect.Effect<A, BrowserError>;\n readonly beginHandoff: <A>(\n issue: Effect.Effect<A, BrowserError>,\n ) => Effect.Effect<{ readonly token: Redacted.Redacted<string>; readonly view: A }, BrowserError>;\n readonly resume: (\n token: Redacted.Redacted<string>,\n operatorReleasedControl: boolean,\n ) => Effect.Effect<Observation, BrowserError>;\n readonly detach: Effect.Effect<\n { readonly reference: Reference; readonly targetId: string },\n BrowserError\n >;\n readonly reconnect: (\n operatorReleasedControl: boolean,\n ) => Effect.Effect<Observation, BrowserError | InitializationError>;\n}\n\nexport interface Connection<Reference, E = never> {\n /** Preserve this object's identity when adding an integration's public capabilities. */\n readonly session: BrowserSession<E>;\n readonly operations: Integration<Reference>;\n}\n\nexport interface Acquisition<L extends Lifetime, E = never> {\n readonly reference: L[\"reference\"];\n readonly lifetime: L;\n readonly failure: Effect.Effect<never, E | InitializationError>;\n readonly close: L[\"release\"];\n readonly connect: Effect.Effect<\n Connection<L[\"reference\"], E>,\n BrowserError | InitializationError | E\n >;\n}\n\nexport interface Runtime {\n readonly acquire: <L extends Lifetime, AE, AR, E = never, R = never>(\n policy: BrowserPolicy,\n source: Source<L, AE, AR>,\n request?: AcquireOptions<E, R>,\n ) => Effect.Effect<\n Acquisition<L, E>,\n AE | BrowserError,\n Scope.Scope | AR | Exclude<R, Scope.Scope>\n >;\n}\n\nconst StoredPath = Schema.NonEmptyString.check(\n Schema.isMaxLength(4096),\n Schema.makeFilter(\n (value) =>\n value.startsWith(\"/\") &&\n !value.includes(\"\\\\\") &&\n !value.includes(\"//\") &&\n ![...value].some((character) => character < \" \" || character === \"\\x7f\") &&\n value.split(\"/\").every((segment) => segment !== \".\" && segment !== \"..\"),\n ),\n);\n\nconst Selection = Schema.Union([\n Schema.TaggedStruct(\"Inline\", { files: InlineFiles }),\n Schema.TaggedStruct(\"Stored\", {\n paths: Schema.Array(StoredPath).check(Schema.isMinLength(1), Schema.isMaxLength(8)),\n }),\n]);\n\nconst resolveFiles = (\n selection: ResolvedFileSelection,\n operation: BrowserOperation,\n): Effect.Effect<ReadonlyArray<NativeFileSelection>, BrowserError> =>\n checked(Selection, selection, operation).pipe(\n Effect.map((value) =>\n value._tag === \"Inline\"\n ? value.files.map((file) => ({\n _tag: \"Inline\" as const,\n name: file.name,\n mediaType: file.mediaType,\n bytes: new Uint8Array(file.bytes),\n }))\n : value.paths.map((path) => ({ _tag: \"Remote\" as const, path })),\n ),\n );\n\n/**\n * Validate immutable connection configuration without loading a peer or acquiring a lifetime.\n * Connection ids and handoff tokens come from the `Crypto` service captured here, so a Layer\n * built on this runtime requires `Crypto` once and its operations never do.\n */\nexport const make = Effect.fnUntraced(function* (\n options: RuntimeOptions,\n): Effect.fn.Return<Runtime, BrowserError, Crypto.Crypto> {\n const implementation = yield* checked(\n Schema.NonEmptyString.check(Schema.isMaxLength(128)),\n options.implementation,\n \"configure\",\n );\n\n const automation = yield* checked(AutomationOptions, options.automation ?? {}, \"configure\");\n\n const viewport = yield* checked(\n Viewport,\n options.viewport ?? { width: 1280, height: 720 },\n \"configure\",\n );\n\n const preserveViewport = yield* checked(\n Schema.Boolean,\n options.preserveViewport ?? false,\n \"configure\",\n );\n\n const keepAlive = yield* checked(Schema.Boolean, options.keepAlive ?? false, \"configure\");\n const engine = bindingImplementation(options.binding ?? defaultBinding);\n\n if (engine === undefined)\n return yield* BrowserError.make({\n operation: \"connect\",\n reason: Reasons.UnregisteredSession.make({}),\n outcome: \"undispatched\",\n });\n\n const pageControl = automation.pageControl ?? false;\n const popupPolicy = automation.popupPolicy ?? \"retain\";\n const dialogPolicy = automation.dialogPolicy ?? \"dismiss\";\n\n if (pageControl && (keepAlive || popupPolicy === \"pause\" || dialogPolicy === \"pause\"))\n return yield* BrowserError.make({\n operation: \"configure\",\n reason: Reasons.Unsupported.make({}),\n outcome: \"undispatched\",\n });\n\n const driver: DriverOptions = {\n viewport,\n pageControl,\n maxPages: automation.maxPages ?? 10,\n popupPolicy,\n dialogPolicy,\n preserveViewport,\n ...(automation.initialPage === undefined\n ? {}\n : \"targetId\" in automation.initialPage\n ? { initialTargetId: automation.initialPage.targetId }\n : { newPage: true }),\n };\n\n const crypto = yield* Crypto.Crypto;\n\n const acquire = Effect.fnUntraced(function* <L extends Lifetime, AE, AR, E = never, R = never>(\n policy: BrowserPolicy,\n source: Source<L, AE, AR>,\n request: AcquireOptions<E, R> = {},\n ) {\n const fixed = yield* checked(BrowserPolicy, policy, \"configure\");\n const plan = yield* preparePlan<E, R>(request.bootstrap ?? Bootstrap.empty);\n\n const existing =\n request.existingTarget === undefined\n ? undefined\n : yield* checked(\n Schema.Struct({ targetId: Schema.optionalKey(Identifier) }),\n request.existingTarget,\n \"configure\",\n );\n\n // Even a parent with parallel finalizers closes this connection before callback scopes end.\n const scope = yield* Scope.fork(yield* Scope.Scope, \"sequential\");\n const bindings = yield* makeBindings(plan).pipe(Scope.provide(scope));\n const bootstrap = compileBootstrap(plan);\n\n const connectionDriver: DriverOptions =\n existing === undefined\n ? driver\n : {\n viewport,\n pageControl,\n maxPages: driver.maxPages,\n popupPolicy,\n dialogPolicy,\n newPage: false,\n preserveViewport: true,\n ...(existing.targetId === undefined ? {} : { initialTargetId: existing.targetId }),\n };\n\n const acquired = yield* acquireSession(\n {\n maxActions: fixed.maxActions,\n maxElapsedMillis: fixed.maxElapsedMillis,\n actionTimeoutMillis: automation.actionTimeoutMillis ?? 10_000,\n maxHostReads: automation.maxHostReads ?? 10_000,\n },\n {\n implementation,\n remote: source,\n engine,\n keepAlive: existing === undefined && keepAlive,\n driver: { ...connectionDriver, ...(bootstrap === undefined ? {} : { bootstrap }) },\n connectBindings: bindings.connect,\n maxReturnedBytes: fixed.maxReturnedBytes,\n },\n ).pipe(Scope.provide(scope), Effect.provideService(Crypto.Crypto, crypto));\n\n const connected = yield* Effect.cached(\n acquired.connect.pipe(\n Effect.map((controls): Connection<L[\"reference\"], E> => {\n const fileOperation = (\n operation: \"select-files\" | \"file-chooser\",\n request: FileRequest,\n ) =>\n checked(Selector, request.selector, operation).pipe(\n Effect.flatMap((selector) =>\n resolveFiles(request.selection, operation).pipe(\n Effect.flatMap((files) =>\n operation === \"select-files\"\n ? controls.selectFiles(selector, files)\n : controls.clickForFileSelection(selector, files),\n ),\n ),\n ),\n Effect.flatMap((url) => decoded(ActionResult, \"action-result\", \"unknown\")({ url })),\n );\n\n return {\n session: makeSession(controls, bindings),\n operations: {\n clickForDownload: (request) =>\n checked(ClickRequest, request, \"download-action\").pipe(\n Effect.flatMap((value) => controls.clickForDownload(value.selector)),\n Effect.flatMap(decoded(DownloadEvent, \"download-action\", \"unknown\")),\n ),\n selectFiles: (request) => fileOperation(\"select-files\", request),\n clickForFileSelection: (request) => fileOperation(\"file-chooser\", request),\n liveView: controls.liveView,\n beginHandoff: controls.beginHandoff,\n resume: controls.resume,\n detach: controls.detach,\n reconnect: controls.reconnect,\n },\n };\n }),\n ),\n );\n\n return {\n reference: acquired.reference,\n lifetime: acquired.lease,\n failure: bindings.failure,\n close: acquired.close,\n connect: Effect.raceFirst(\n bindings.failure,\n acquired.connect.pipe(Effect.andThen(connected)),\n ).pipe(Effect.onError(() => acquired.close.pipe(Effect.asVoid))),\n } satisfies Acquisition<L, E>;\n });\n\n return { acquire } satisfies Runtime;\n});\n"],"mappings":";;;;;;;AA2CA,MAAa,qBAAqB,aAAmD,EACnF,UAAU,YACR,OAAO,WAAW;CAChB,MAAM,WAAW;EACf,MAAM,UAAU,QAAQ,SAAS,MAAM,CAAC,CAAC,KAAK,OAAO,WAAW;GAC9D,IAAI,OAAO,SAAS;IAClB,QAAQ,YAAY;IACpB,OAAO,sBAAsB;IAC7B,MAAM,OAAO,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,aAAa,KAAK;KACtB,WAAW;KACX,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC;KACnC,SAAS;IACX,CAAC;GACH;GAEA,OAAO;EACT,CAAC;EAED,QAAa,KAAK,QAAQ,WAAW,QAAQ,SAAS;EAEtD,OAAO;CACT;CACA,QAAQ,UACN,OAAO,GAAG,mBAAmB,CAAC,CAAC,KAAK,IAChC,QACA,YAAY,OAAO,WAAW;EAC5B,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;EAChC,SAAS;CACX,CAAC;AACT,CAAC,EACL;;;;;AAMA,MAAM,yBAAS,IAAI,QAAuC;AAE1D,MAAa,gBACX,SACA,mBACG;CACH,OAAO,IAAI,SAAS,cAAc;CAElC,OAAO,OAAO,OAAO,OAAO;AAC9B;AAEA,MAAa,yBAAyB,YACpC,OAAO,IAAI,OAAO;;;ACpEpB,MAAa,qBACX,UACA,QACA,YACkE;CAClE,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,GAChD,MAAM,IAAI,WAAW,mCAAmC;CAE1D,OAAO,OAAO,IAAI,aAAa;EAC7B,MAAM,SAAS,OAAO,MAAM;EAG5B,MAAM,eAAe,OAAO,MAAM,KAAK,QAAQ,YAAY;EAE3D,MAAM,SAAS,OAAO,SAAS,KAA6B,CAAC,CAAC,KAAK,MAAM,QAAQ,YAAY,CAAC;EAC9F,MAAM,MAAM,OAAO,SAAS,eAAe,MAAM,CAAC,CAAI;EAEtD,IAAI,YAAY;EAChB,IAAI,UAAU;EACd,IAAI,WAAW;EAEf,MAAM,cAAc;GAClB,YAAY;EACd;EAEA,MAAM,kBAAkB;GACtB,MAAM;GAEN,KAAK,MAAM,SAAS,QAAQ,MAAM,gBAAgB;EACpD;EAEA,MAAM,cAAc;GAClB,IAAI,CAAC,aAAa,SAAS;GAC3B,UAAU;GACV,QAAQ;IAAE,QAAQ;IAAW,QAAQ;IAAoB,aAAa;GAAQ,CAAC;EACjF;EAIA,OAAO,MAAM,aAAa,cAAc,OAAO,KAAK,KAAK,CAAC;EAE1D,MAAM,UACJ,OACA,cAAmC,mBACR;GAC3B,IAAI,CAAC,aAAa,SAAS,OAAO;IAAE,MAAM;IAAY,QAAQ;GAAS;GACvE,IAAI,YAAY,UAAU;IACxB,IAAI,gBAAgB,gBAAgB,MAAM;IAE1C,OAAO;KAAE,MAAM;KAAY,QAAQ;IAAW;GAChD;GAEA;GAKA,MAAM,SAFY,IAAI,OAAO,KAAK,OAAO,cAAc,OAAO,KAAK,CAAC,CAAC,CAE9C,CAAC,CACrB,MACE,SAAS;IACR,IAAI,gBAAgB,kBAAkB,KAAK,UAAU,IAAI,GAAG,MAAM;IAElE,OAAO;GACT,IACC,UAAmB;IAClB,IAAI,gBAAgB,gBAAgB,MAAM;IAC1C,MAAM;GACR,CACF,CAAC,CACA,cAAc;IACb;GACF,CAAC;GAIH,OAAY,YAAY,CAAC,CAAC;GAE1B,OAAO;IAAE,MAAM;IAAY;GAAO;EACpC;EAEA,OAAO;GAAE;GAAO;GAAW;EAAO;CACpC,CAAC;AACH;;;ACtFA,MAAM,WAAW,SAAiB,YAChC,YAAY,KAAA,IACR,aAAa,QAAQ,WACrB,6BAA6B,KAAK,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE,wFAAwF,QAAQ;;;;;;AAOhK,MAAa,oBACX,SACkC;CAClC,IAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,YAAY,WAAW,GAAG,OAAO,KAAA;CAEvE,MAAM,SACJ,KAAK,QAAQ,WAAW,IACpB,KAAA,IACA,KAAK,QAAQ,KAAK,WAAW,QAAQ,OAAO,SAAS,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;CAErF,MAAM,YAAY,KAAK,QAAQ,SAAS,WACtC,OAAO,cAAc,KAAA,IACjB,CAAC,IACD,CACE;EACE,MAAM,OAAO;EACb,YAAY,OAAO,UAAU;EAC7B,eAAe,OAAO,UAAU;EAChC,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;CACpE,CACF,CACN;CAIA,MAAM,oBAAoB,KAAK,QAAQ,MACpC,WAAW,OAAO,WAAW,sBAAsB,wBACtD,IACI,2BACA;CAEJ,OAAO;EACL,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;EACzC,aAAa,KAAK,YAAY,KAAK,WAAW;GAC5C,QAAQ,MAAM;GACd,aAAa,CAAC,GAAG,MAAM,WAAW;EACpC,EAAE;EACF;EACA;CACF;AACF;;AAGA,MAAa,iBAAiB,SAC5B,IAAI,IAAI,KAAK,QAAQ,KAAK,WAAW,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,UACvE,IAAI,IAAI,KAAK,YAAY,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,UACjF,IAAI,KAAK,KAAK,YAAY,CAAC,EAAA,CAAG,KAAK,iBAAiB,aAAa,IAAI,CAAC,CAAC,CAAC,UACrE,KAAK,UAAU,UAAU;;;AC9B9B,MAAM,oBACJ,aAAa,KAAK;CAChB,WAAW;CACX,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC;CACrC,SAAS;AACX,CAAC;AAEH,MAAM,gBAAgB,OAAO,OAAO;CAClC,GAAA,KAAkB;CAClB,UAAU,OAAO,YAAY,OAAO,MAAM,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC,CAAC;AACzF,CAAC;;AAGD,MAAa,cAAc,OAAO,WAAW,WAC3C,MACsD;CACtD,MAAM,SAAS,OAAO,OAAO,IAAI;EAC/B,YAAY,EAAE,GAAG,KAAK;EACtB,OAAO;CACT,CAAC;CAED,MAAM,OAAO,OAAO,OAAO,aAAa,eAAe,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CACnF,MACF,CAAC,CAAC,KAAK,OAAO,SAAS,WAAW,CAAC;CAEnC,IAAI,cAAc;EAAE,SAAS,KAAK;EAAS,aAAa,KAAK;CAAY,CAAC,GACxE,OAAO,OAAO,YAAY;CAC5B,MAAM,aAAa,OAAO,aAAa,KAAA,IAAY,CAAC,IAAI,OAAO;CAE/D,MAAM,WAAW,OAAO,OAAO,QAAQ,CAAC,GAAG,UAAU,IAAI,iBACvDA,SAAsB,YAAY,CACpC;CAEA,IAAI,IAAI,IAAI,SAAS,KAAK,iBAAiB,aAAa,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,QAC/E,OAAO,OAAO,YAAY;CAG5B,OAAO,OAAO,OAAO;EACnB,SAAS,OAAO,OACd,KAAK,QAAQ,KAAK,WAChB,OAAO,OAAO;GACZ,GAAG;GACH,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,OAAO,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;GACtF,GAAI,OAAO,cAAc,KAAA,IACrB,CAAC,IACD,EAAE,WAAW,OAAO,OAAO,EAAE,GAAG,OAAO,UAAU,CAAC,EAAE;EAC1D,CAAC,CACH,CACF;EACA,aAAa,OAAO,OAClB,KAAK,YAAY,KAAK,UACpB,OAAO,OAAO;GACZ,GAAG;GACH,aAAa,OAAO,OAAO,CAAC,GAAG,MAAM,WAAW,CAAC;EACnD,CAAC,CACH,CACF;EACA,GAAI,SAAS,WAAW,IAAI,CAAC,IAAI,EAAE,UAAU,OAAO,OAAO,QAAQ,EAAE;CACvE,CAAC;AACH,CAAC;AAED,MAAM,iBAAiC;CACrC,MAAM,wBAAQ,IAAI,MAAM,+BAA+B;CAEvD,MAAM,OAAO;CACb,MAAM,QAAQ;CACd,MAAM,SAAS,QAAQ,OAAO,KAAK;CAEnC,OAAY,YAAY,CAAC,CAAC;CAE1B,OAAO;AACT;AAEA,MAAM,aAAa,UAAkB,KAAK,IAAI,OAAO,kBAAkB,QAAQ,CAAC;;AAGhF,MAAa,eAAe,OAAO,WAAW,WAC5C,MAC6E;CAG7E,MAAM,WAAW,OAAO,OAAO,QAAiC;CAChE,MAAM,aAAa,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,YAAY;CACrE,MAAM,UAAU,OAAO,SAAS,KAAqC;CACrE,MAAM,8BAAc,IAAI,IAAwB;CAChD,MAAM,WAA+C,CAAC;CACtD,IAAI,kBAAkB;CACtB,IAAI,UAAU;CACd,IAAI,cAAc;CAElB,MAAM,WAAW,KAAK,YAAY,CAAC,EAAA,CAAG,KAAK,kBAAkB;EAC3D;EACA,OAAO;GACL,MAAM,aAAa;GACnB,UAAU;GACV,eAAe;GACf,SAAS;GACT,UAAU;GACV,WAAW;GACX,UAAU;EACZ;CACF,EAAE;CAEF,OAAO,MAAM,aACX,YACA,OAAO,cAAc;EACnB,cAAc;EACd,MAAM,QAAQ,CAAC,GAAG,WAAW;EAE7B,KAAK,MAAM,cAAc,OAAO,WAAW,MAAM;EAEjD,OAAO,OAAO,QAAQ,QAAQ,eAAe,WAAW,SAAS,EAAE,SAAS,KAAK,CAAC;CACpF,CAAC,CACH;CAEA,MAAM,UAAU,OAAO,WAAW,WAChC,SACA,UACA,YAA2B,UAC+B;EAC1D,MAAM,kBAAkB,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,YAAY;EAC1E,IAAI,SAAS,eAAe;EAC5B,MAAM,SAA4B,CAAC;EACnC,MAAM,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,UAAU;EACvE,MAAM,eAAe,QAAQ,KAAK,SAAS;EAE3C,MAAM,cAAc;GAClB,SAAS;GACT,KAAK,MAAM,SAAS,QAAQ,MAAM;EACpC;EAEA,MAAM,UACJ,cACA,OACA,QAAqB;GAAE,QAAQ;GAAW,QAAQ;GAAoB,aAAa;EAAQ,MACxF;GACH,IAAI,SAAS,WAAW,IAAI;IAC1B,SAAS,MAAM;IACf,kBAAkB,UAAU,eAAe;GAC7C;GACA,SAAS,KACP,OAAO,OAAO;IAAE,MAAM,aAAa;IAAM,MAAM,aAAa;IAAa;GAAM,CAAC,CAClF;GACA,IAAI,aAAa,gBAAgB,kBAAkB,QAAQ,GAAG;IAC5D,UAAU;IAEV,SAAS,WAAW,SAAS,OAAO,UAAU,KAAK,CAAC;IAEpD,QAAQ,KAAK;IACb,KAAK,MAAM,cAAc,aAAa,WAAW,MAAM;GACzD;EACF;EAEA,MAAM,WAAW,OAAO,OAAO,QAAQ,UAAU,EAAE,cAAc,YAC/D,OAAO,IAAI,aAAa;GACtB,MAAM,SACJ,QACA,YAA8C,eAC3C,oBAAoB,KAAK;IAAE;IAAW,MAAM,aAAa;IAAM;GAAO,CAAC;GAU5E,MAAM,WAAW,SAAe;IAC9B,IAAI,CAAC,KAAK,YAAY,KAAK,YAAY,KAAK,KAAK,UAAU;IAC3D,KAAK,WAAW;IAChB,MAAM;IACN,MAAM;GACR;GAEA,MAAM,SAAY,MAAY,YAAoC;IAChE,KAAK;IACL,MAAM;IAEN,MAAM,gBAAgB;KACpB,KAAK;KACL,MAAM;KACN,QAAQ,IAAI;IACd;IAEA,QAAa,KAAK,SAAS,OAAO;IAElC,OAAO;GACT;GAEA,MAAM,UAAU,SAAe;IAC7B,IAAI,KAAK,UAAU;IACnB,KAAK,WAAW;IAChB,MAAM;IAGN,MAAM,YAAY,QAAQ,QAAQ,CAAC,CAChC,WAAW,KAAK,KAAK,QAAQ,CAAC,CAAC,CAC/B,YAAY;KACX,OAAO,cAAc,MAAM,KAAK,MAAM,UAAU,SAAS,CAAC,GAAG;MAC3D,QAAQ;MACR,QAAQ;MACR,aAAa;KACf,CAAC;IACH,CAAC;IAEH,MAAW,MAAM,SAAS;GAC5B;GAEA,MAAM,UAAa,MAAY,WAC7B,OAAO,WAAW;IAChB,MAAM,WAAW,MAAM,MAAM,OAAO,MAAM,CAAC;IAC3C,QAAQ,UAAU;KAChB,KAAK,cAAc;MAAE,QAAQ;MAAU,QAAQ;MAAY,aAAa;KAAU;KAElF,OAAO,OAAO,GAAG,mBAAmB,CAAC,CAAC,KAAK,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,QAAQ;IACrF;GACF,CAAC;GAEH,MAAM,UAAU,OAAO,WAAW,WAAW,MAAY;IACvD,MAAM,QAAQ,OAAO,cACnB,OAAO,IAAI,OAAO,MAAM,KAAK,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,CAAC,CACxE;IAEA,IAAI,CAAC,OAAO,GAAG,OAAO,OAAO,MAAM,QAAQ;IAC3C,MAAM,OAAO,OAAO,OAAO,MAAM,KAAK,KAAK,IAAI;IAC/C,MAAM,SAAS,OAAOC,OAAoB,cAAc,MAAM,KAAK;IAEnE,OAAO;IAEP,OAAO;GACT,CAAC;GAED,MAAM,SAAS,OAAO,kBACpB,aAAa,gBACZ,SACC,OAAO,OAAO,QAAQ,IAAI,CAAC,CAAC,CAAC,KAC3B,OAAO,cAAc;IACnB,UAAU,aAAa;IACvB,cAAc,OAAO,KAAK,MAAM,SAAS,CAAC;GAC5C,CAAC,GACD,OAAO,eAAe,QAAQ,CAChC,SACI,CAAC,CACT,CAAC,CAAC,KAAK,MAAM,QAAQ,eAAe,CAAC;GAErC,OAAO,KAAK,OAAO,SAAS;GAE5B,MAAMC,YAAU,SAA6C;IAC3D,IAAI,CAAC,OAAO,GAAG;KACb,MAAM,WAAW,UAAU,MAAM,QAAQ;KAEzC,OAAO,SAAS;IAClB;IACA,IAAI,MAAM,YAAY,aAAa,eAAe;KAChD,MAAM,WAAW,UAAU,MAAM,QAAQ;KACzC,OAAO,cAAc,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC;KAE9C,OAAO,SAAS;IAClB;IAGA,MAAM;IACN,MAAM,WAAW,UAAU,MAAM,QAAQ;IACzC,MAAM,OAAa;KAAE;KAAM,SAAS;KAAG,UAAU;KAAO,UAAU;IAAM;IACxE,MAAM,YAAY,OAAO,OAAO,MAAM,aAAa;IAEnD,IAAI,UAAU,SAAS,YAAY;KACjC,MAAM,WAAW,UAAU,MAAM,QAAQ;KACzC,OAAO,IAAI;KAEX,OAAO,SAAS;IAClB;IAEA,MAAM,SAAS,UAAU,OACtB,MACE,SAAS;KACR,IAAI,KAAK,UAAU,IAAI,GAAG;MACxB,MAAM,WAAW,UAAU,MAAM,QAAQ;MACzC,OAAO,cAAc,KAAK,OAAO,KAAK,WAAW;MAEjD,OAAO,SAAS;KAClB;KACA,IAAI,CAAC,OAAO,GAAG;MACb,MAAM,WAAW,UAAU,MAAM,QAAQ;MAEzC,OAAO,SAAS;KAClB;KACA,MAAM,YAAY,UAAU,MAAM,SAAS;KAE3C,OAAO,KAAK;IACd,SACM;KACJ,MAAM,WAAW,UAAU,MAAM,QAAQ;KACzC,IAAI,OAAO,GACT,OAAO,cAAc,MAAM,KAAK,MAAM,QAAQ,CAAC,GAAG;MAChD,QAAQ;MACR,QAAQ;MACR,aAAa;KACf,CAAC;KAEH,OAAO,SAAS;IAClB,CACF,CAAC,CACA,cAAc,OAAO,IAAI,CAAC;IAE7B,OAAY,YAAY,CAAC,CAAC;IAE1B,OAAO;GACT;GAEA,OAAO,OAAO,OAAO;IACnB,MAAM,aAAa;IACnB,SAAS,aAAa;IACtB,eAAe,aAAa;IAC5B,eAAe,aAAa;IAC5B,eAAe,aAAa;IAC5B,QAAA;GACF,CAAC;EACH,CAAC,CACH;EAEA,MAAM,aAAiC;GACrC,UAAU,OAAO,OAAO,QAAQ;GAChC;GACA,gBAAgB,UAAU;IACxB,IAAI,CAAC,QAAQ,GAAG;IAChB,OAAO;KAAE,MAAM,MAAM;KAAM,aAAa;IAAe,GAAG,MAAM,KAAK,KAAK,GAAG;KAC3E,QAAQ;KACR,QAAQ;KACR,aAAa;IACf,CAAC;GACH;GACA,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,MAAM,iBAAiB,KAAK,IAAI,CAAC,CAAC;EAC1F;EAEA,YAAY,IAAI,UAAU;EAC1B,OAAO,MAAM,aACX,iBACA,OAAO,WAAW;GAChB,MAAM;GACN,YAAY,OAAO,UAAU;EAC/B,CAAC,CACH;EAEA,OAAO;CACT,GAAG,OAAO,eAAe;CAEzB,OAAO;EACL,SAAS,SAAS,MAAM,OAAO;EAC/B,aAAa,OAAO,WAClB,OAAO,OAAO;GACZ;GACA,UAAU,OAAO,OAAO,QAAQ,KAAK,EAAE,YAAY,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;GAC/E,UAAU,OAAO,OAAO,CAAC,GAAG,QAAQ,CAAC;GACrC;EACF,CAAC,CACH;EACA;CACF;AACF,CAAC;;;ACnZD,MAAM,eAAe,OAAO,QAAQ,MAAM,OAAO,oBAAoB,EAAE,CAAC;;;;;AAMxE,MAAa,iBAAiB,OAAO,OAAO;CAC1C,MAAM,OAAO,OAAO,MAAM,OAAO,YAAY,MAAM,CAAC;CACpD,eAAe,OAAO;CACtB,mBAAmB,OAAO;CAC1B,UAAU,OAAO,MAAM,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC;;CAEjE,SAAS,OAAO,YACd,OAAO,MACL,OAAO,OAAO;EACZ,OAAO;EACP,kBAAkB,OAAO;EACzB,SAAS,OAAO,MACd,OAAO,OAAO;GACZ,OAAO;GACP,OAAO,OAAO,OAAO,MAAM,OAAO,YAAY,KAAK,CAAC;EACtD,CAAC,CACH,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC;CAChC,CAAC,CACH,CAAC,CAAC,MACA,OAAO,YAAY,EAAE,GACrB,OAAO,YACJ,YAAY,QAAQ,QAAQ,MAAM,WAAW,OAAO,OAAO,QAAQ,QAAQ,CAAC,KAAK,EACpF,CACF,CACF;CACA,UAAU,OAAO,OAAO;EACtB,OAAO,OAAO;EACd,QAAQ,OAAO;EACf,aAAa,OAAO;EACpB,aAAa,OAAO;EACpB,eAAe,OAAO;EACtB,qBAAqB,OAAO;EAC5B,WAAW,OAAO;CACpB,CAAC;;;;;CAKD,SAAS,OAAO,YACd,OAAO,OAAO;EACZ,QAAQ,OAAO,MAAM,OAAO,MAAM,CAAC,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAC3D,OAAO,YAAY,CAAC,GACpB,OAAO,YAAY,GAAG,CACxB;EACA,SAAS,OAAO;EAChB,SAAS,OAAO;CAClB,CAAC,CACH;AACF,CAAC;;;;;;AASD,MAAa,eAAe,OAAO,SAAS;CAAC;CAAQ;CAAW;AAAO,CAAC;;AAgCxE,MAAa,cAAc,UACzB,KAAK,UAAU;CACb,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM,WAAW;CACjB,MAAM,YAAY;CAClB,MAAM,YAAY;CAClB,MAAM,YAAY;CAClB,MAAM;CACN,MAAM,aAAa;CACnB,MAAM,gBAAgB;CACtB,MAAM,eAAe;CACrB,MAAM,cAAc;AACtB,CAAC;;;;;;AAOH,MAAa,oBAAoB,UAC/B,KAAK,UAAU;CACb,MAAM;CACN,MAAM;CACN,MAAM,WAAW;CACjB,MAAM,YAAY;CAClB,MAAM,YAAY;CAClB,MAAM,YAAY;CAClB,MAAM,aAAa;CACnB,MAAM,gBAAgB;CACtB,MAAM,eAAe;CACrB,MAAM,cAAc;AACtB,CAAC;;AAGH,MAAa,mBACX,OACA,WACA,YAAwF,CAAC,MAEzF,gBAAgB,KAAK;CACnB;CACA,MAAM,MAAM;CACZ,OAAO,MAAM;CACb,UAAU,MAAM;CAChB,GAAI,MAAM,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,MAAM,QAAQ;CAChE,GAAI,MAAM,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;CACnE,GAAI,MAAM,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;CACtE,GAAI,MAAM,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;CACnE,GAAI,MAAM,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;CACnE,GAAG;AACL,CAAC;;;;;;;;;;;;;;;;AAiBH,MAAa,YACX,SACA,QAC+D;CAC/D,MAAM,EAAE,OAAO,cAAc,cAAc,YAAY,SAAS;CAChE,MAAM,QAAQ,OAAO;CACrB,MAAM,SAAS,OAAO;CACtB,MAAM,SAAS,QAAQ,OAAO,YAAY;CAE1C,MAAM,WAAW,UACf,WAAW,KAAA,KAAa,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM;CAE7D,MAAM,WAAW;EACf;EACA;EACA,aAAa;EACb,aAAa;EACb,eAAe;EACf,qBAAqB;EACrB,WAAW;CACb;CAIA,MAAM,cAAc,SAClB,KAAK,QAAQ,KACb,KAAK,SAAS,KACd,KAAK,SAAS,KACd,KAAK,QAAQ,KACb,KAAK,MAAM,UACX,KAAK,OAAO;CAEd,MAAM,UAAU,SACd,KAAK,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,UAAU,UAAU,KAAK,SAAS;CAE5E,MAAM,YAAY,MAAW,GAAW,MACtC,KAAK,KAAK,QAAQ,IAAI,KAAK,SAAS,KAAK,KAAK,OAAO,IAAI,KAAK;;CAGhE,MAAM,YAAY,SAA4B;EAC5C,MAAM,SAAS,KAAK;EAEpB,OAAO,kBAAkB,aAAa,OAAO,OAAO;CACtD;;CAGA,MAAM,SAAS,OAAa,UAAyB;EACnD,KAAK,IAAI,OAAoB,OAAO,SAAS,MAAM,OAAO,SAAS,IAAI,GACrE,IAAI,SAAS,OAAO,OAAO;EAE7B,OAAO;CACT;CAEA,MAAM,WAAW,MAAY,UAAyB,MAAM,MAAM,KAAK,KAAK,MAAM,OAAO,IAAI;;CAG7F,MAAM,WAAW,UAA0B;EACzC,IAAI,UAAU,eAAe,OAAO;EACpC,MAAM,SAAS,cAAc,KAAK,KAAK,CAAC,GAAG;EAE3C,IAAI,WAAW,KAAA,GAAW,OAAO;EACjC,MAAM,QAAQ,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,MAAM,GAAG,CAAC,CAAC;EAE9E,IAAI,UAAU,KAAA,GAAW,OAAO;EAChC,MAAM,QAAQ,OAAO,WAAW,KAAK;EAErC,IAAI,OAAO,MAAM,KAAK,GAAG,OAAO;EAEhC,OAAO,MAAM,KAAK,CAAC,CAAC,SAAS,GAAG,IAAI,QAAQ,MAAM;CACpD;;CAGA,MAAM,SAAS,UACb,QAAQ,MAAM,eAAe,IAAI,KACjC,MAAM,oBAAoB,UAC1B;EAAC;EAAO;EAAS;EAAU;CAAM,CAAC,CAAC,MAChC,SACC,OAAO,WAAW,MAAM,iBAAiB,UAAU,KAAK,OAAO,CAAC,IAAI,KACpE,CAAC,CAAC,QAAQ,QAAQ,CAAC,CAAC,SAAS,MAAM,iBAAiB,UAAU,KAAK,OAAO,CAAC,KAC3E,QAAQ,MAAM,iBAAiB,UAAU,KAAK,OAAO,CAAC,IAAI,CAC9D,KACA,MAAM,cAAc,UACnB,MAAM,iBAAiB,UAAU,OAAO,WAAW,MAAM,YAAY,IAAI,KAC1E,MAAM,WAAW,WAChB,MAAM,iBAAiB,iBAAiB,KAAK,YAAY,UAC1D,MAAM,iBAAiB;CAGzB,MAAM,2BAAW,IAAI,IAAI;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,eAAe,SAAkB,SAA0C;EAC/E,MAAM,QAAQ,iBAAiB,SAAS,IAAI;EAE5C,OACE,MAAM,YAAY,UAClB,MAAM,YAAY,YAClB,MAAM,YAAY,WACjB,MAAM,KAAK,KAAK,CAAC,YAAY,KAAK,MAAM,OAAO;CAEpD;;CAGA,MAAM,UAAU,SAAkB,GAAW,MAAuB;EAClE,MAAM,QAAQ,SAAS,YAAY;EAEnC,KAAK,MAAM,SAAS,QAAQ,YAAY;GACtC,IAAI,EAAE,iBAAiB,SAAS,MAAM,KAAK,KAAK,MAAM,IAAI;GAC1D,MAAM,mBAAmB,KAAK;GAC9B,KAAK,MAAM,QAAQ,MAAM,eAAe,GAAG,IAAI,SAAS,MAAM,GAAG,CAAC,GAAG,OAAO;EAC9E;EAEA,OAAO;CACT;;CAGA,MAAM,YAAY,SAAkB,GAAW,MAC7C,QAAQ,kBAAkB;EAAE,iBAAiB;EAAM,oBAAoB;CAAK,CAAC,MAAM,UAClF,SAAS,IAAI,QAAQ,OAAO,KAC3B,mBAAmB,cACnB,MAAM,iBAAiB,OAAO,CAAC,KAC/B,OAAO,SAAS,GAAG,CAAC;;CAGxB,MAAM,aAAa,GAAW,MAA8B;EAC1D,IAAI,MAAM,SAAS,iBAAiB,GAAG,CAAC;EAExC,OAAO,KAAK,YAAY;GACtB,MAAM,QAAQ,IAAI,WAAW,iBAAiB,GAAG,CAAC;GAElD,IAAI,UAAU,QAAQ,UAAU,KAAK;GACrC,MAAM;EACR;EAEA,OAAO;CACT;CAEA,IAAI,QAAQ,aAAa,KAAA,GAAW;EAElC,MAAM,SACJ,eAAe,QAAQ,OAAO,QAAQ,YAAY,QAAQ,OACtD,KAAA,IACC;EAEP,MAAM,SACJ,eAAe,UACX,MACA,QAAQ,mBAAmB,UACzB,OAAO,UACP,KAAA;EAER,MAAM,aAAa,CAAC,GAAG,OAA0C;GAC/D,MAAM,MAAM,UAAU,GAAG,CAAC;GAE1B,IAAI,QAAQ,QAAQ,WAAW,KAAA,GAAW,OAAO;GACjD,IAAI,WAAW,KAAA,GACT;QAAA,QAAQ,QAAQ,GAAG,GAAG,OAAO;GAAA,OAC5B;IAEL,IAAI,MAAM,KAAK,MAAM,GAAG,OAAO;IAC/B,IAAI,YAAY,QAAQ,OAAO,SAAS,YAAY,YAAY,UAAU,GACxE,OAAO;GACX;GAGA,KACE,IAAI,OAAoB,QACxB,SAAS,QAAQ,CAAC,MAAM,MAAM,GAAG,GACjC,OAAO,SAAS,IAAI,GAEpB,IACE,gBAAgB,WAChB,SAAS,KAAK,sBAAsB,GAAG,GAAG,CAAC,KAC3C,SAAS,MAAM,GAAG,CAAC,GAEnB,OAAO;GAEX,OAAO;EACT;EAEA,OAAO;GAAE,OAAO,CAAC;GAAG,MAAM,QAAQ,SAAS,IAAI,SAAS;EAAE;CAC5D;CAMA,MAAM,QAAkE,CAAC;CACzE,MAAM,WAAqE,CAAC;CAC5E,IAAI,UAAU;CACd,IAAI,eAAe;CAEnB,IAAI,SAAS,KAAA,KAAa,UAAU,cAAc,SAAS,SAAS,MAAM;EACxE,MAAM,QAA2B,CAAC,SAAS,IAAI;EAE/C,KAAK,IAAI,OAAO,MAAM,IAAI,GAAG,SAAS,KAAA,KAAa,cAAc,OAAO,MAAM,IAAI,GAAG;GACnF,MAAM,MAAM,KAAK,iBAAiB,GAAG;GAErC,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;IACnC,MAAM,UAAU,IAAI;IAEpB,IAAI,EAAE,UAAU,cAAc,MAAM,UAAU,OAAO,SAAS,UAAU,KAAK;KAC3E,eAAe;KACf;IACF;IACA,IAAI,YAAY,KAAA,GAAW;IAC3B,IAAI,QAAQ,eAAe,MAAM,MAAM,KAAK,QAAQ,UAAU;IAC9D,MAAM,QAAQ,iBAAiB,OAAO;IAEtC,IAAI,MAAM,kBAAkB,UAAU,MAAM,eAAe,UAAU;IACrE,IAAI,OAAO,MAAM,OAAO,KAAK,GAAG;IAChC,MAAM,OAAO,QAAQ,sBAAsB;IAE3C,IAAI,WAAW,IAAI,GAAG;KACpB,MAAM,KAAK;MAAE;MAAS;KAAK,CAAC;KAC5B,IACE,SAAS,IAAI,QAAQ,OAAO,KAC5B,mBAAmB,cACnB,MAAM,KAAK,KACX,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC,MACrB,UAAU,iBAAiB,QAAQ,MAAM,KAAK,KAAK,MAAM,EAC5D,GAEA,SAAS,KAAK;MAAE;MAAS;KAAK,CAAC;IACnC;IACA,KAAK,MAAM,QAAQ,CAAC,YAAY,SAAS,GAAY;KACnD,IAAI,CAAC,YAAY,SAAS,IAAI,GAAG;KACjC,MAAM,YAAY,iBAAiB,SAAS,IAAI;KAChD,IAAI,OAAY;KAGhB,KACG,UAAU,aAAa,cAAc,UAAU,aAAa,YAC7D,MAAM,aAAa,UACnB;MACA,MAAM,OAAO,KAAK,QAAQ,OAAO,WAAW,UAAU,IAAI,KAAK;MAC/D,MAAM,MAAM,KAAK,OAAO,OAAO,WAAW,UAAU,GAAG,KAAK;MAC5D,MAAM,SAAS,OAAO,WAAW,UAAU,KAAK,KAAK;MACrD,MAAM,OAAO,OAAO,WAAW,UAAU,MAAM,KAAK;MAEpD,OAAO;OACL;OACA;OACA,OAAO,OAAO;OACd,QAAQ,MAAM;OACd,OAAO;OACP,QAAQ;MACV;KACF;KACA,IAAI,WAAW,IAAI,GAAG;MACpB,MAAM,KAAK;OAAE;OAAS,MAAM;MAAK,CAAC;MAClC,SAAS,KAAK;OAAE;OAAS,MAAM;MAAK,CAAC;KACvC;IACF;GACF;EACF;EACA,IAAI,CAAC,cAAc,SAAS,YAAY;CAC1C;CAEA,MAAM,UAA4C,CAAC;CACnD,MAAM,8BAAc,IAAI,IAAY;CACpC,IAAI,UAAU;;CAGd,MAAM,WAAW,OAAgB,SAAoD;EACnF,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC;EACjF,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC;EAClF,MAAM,MAAM,UAAU,GAAG,CAAC;EAE1B,IAAI,QAAQ,MAAM,OAAO;EACzB,IAAI,QAAQ,SAAS,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,SAAS,KAAK,GAAG,OAAO;EAE1E,MAAM,QAAQ,WACZ,OAAO,MAAM,UAAU,CAAC,QAAQ,MAAM,SAAS,KAAK,KAAK,SAAS,MAAM,MAAM,GAAG,CAAC,CAAC;EAErF,IAAI,gBAAgB,CAAC,KAAK,KAAK,GAAG,OAAO;EACzC,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC;EACpC,MAAM,UAAU,QAAQ,WAAW;EAEnC,IAAI,YAAY,QAAQ,OAAO;EAC/B,IAAI,YAAY,WAAW,OAAO;EAElC,IAAI,YAAY,SAAS,OAAO,KAAK,QAAQ,IAAI,cAAc;EAC/D,IAAI,QAAQ,aAAa,KAAA,KAAa,CAAC,YAAY,IAAI,GAAG,KAAK,QAAQ,SAAS,KAAK;GACnF,YAAY,IAAI,GAAG;GACnB,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC;EACrB;EAEA,OAAO;CACT;CAEA,MAAM,WAAW,SAAkB;EACjC,MAAM,MAAM,KAAK,QAAQ,YAAY;EACrC,MAAM,OAAO,KAAK,aAAa,MAAM;EAErC,MAAM,oBAAoB,SAAsC;GAC9D,MAAM,QAAQ,KAAK,aAAa,IAAI;GAEpC,OAAO,UAAU,SAAS,OAAO,UAAU,UAAU,QAAQ,KAAA;EAC/D;EAKA,MAAM,UAFJ,gBAAgB,qBAAqB,KAAK,SAAS,cAAc,KAAK,SAAS,WAG7E,KAAK,SAAS,cAAc,KAAK,gBAC/B,KAAA,IACA,KAAK,UACP,SAAS,QACP;GAAC;GAAY;GAAS;GAAU;GAAoB;EAAe,CAAC,CAAC,SAAS,IAAI,IAClF,iBAAiB,cAAc,IAC/B,KAAA;EAEN,MAAM,WACJ,gBAAgB,oBACZ,KAAK,WACL,EAAE,gBAAgB,sBAChB,SAAS,QACT;GAAC;GAAU;GAAO;GAAY;GAAO;EAAU,CAAC,CAAC,SAAS,IAAI,IAC9D,iBAAiB,eAAe,IAChC,KAAA;EAER,MAAM,WACJ,gBAAgB,qBAChB,gBAAgB,uBACf,gBAAgB,oBACf,CAAC;GAAC;GAAU;GAAU;GAAU;GAAS;GAAS;GAAS;EAAO,CAAC,CAAC,SAAS,KAAK,IAAI,IACpF,KAAK,WACL,SAAS,QACP;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,SAAS,IAAI,IACf,iBAAiB,eAAe,IAChC,KAAA;EAER,MAAM,QACJ,gBAAgB,oBAChB,gBAAgB,qBAChB,gBAAgB,qBAChB,gBAAgB,sBACZ,OACA,KAAA;EAQN,MAAM,OALH,gBAAgB,qBAAqB,KAAK,SAAS,YACnD,gBAAgB,qBAAqB,KAAK,SAAS,YAAY,KAAK,SAAS,WAIzD,OAAO,OAAO,KAAA;EAErC,MAAM,SACJ,gBAAgB,qBAAqB,gBAAgB,kBACjD,KAAK,OACL,SAAS,KAAA,KAAa,SAAS,OAC7B,KAAA,IACA,KAAK,aAAa,YAAY,KAAK,UAAU,KAAA,KAAa,gBAAgB,QACxE,MAAM,aACN,KAAK;EAEf,MAAM,SACJ,SAAS,KAAA,KAAa,SAAS,OAC3B,KAAA,KACC,KAAK,aAAa,YAAY,KAAK,UAAU,KAAA,KAAa,gBAAgB,QACvE,MAAM,aACN,KAAK,OAAA,CACP,YAAY;EAEpB,MAAM,WAAW,KAAK,QAAQ,WAAW,KAAK,KAAK,aAAa,eAAe,MAAM;EACrF,MAAM,OAAO,KAAK,sBAAsB;EACxC,MAAM,YAAY,CAAC,WAAW,IAAI,IAAI,YAAY,OAAO,IAAI,IAAI,WAAW;EAE5E,MAAM,eACJ,gBAAgB,oBAChB,gBAAgB,qBAChB,gBAAgB,sBACZ,KAAK,eACL;EAEN,OAAO;GACL,MACE,QAAQ,MACJ,SACA;IAAC;IAAU;IAAS;IAAU;GAAU,CAAC,CAAC,SAAS,GAAG,IACpD,MACA;GACR,QACE,KAAK,aAAa,YAAY,KAC9B,KAAK,aAAa,aAAa,MAC9B,gBAAgB,mBACb,KAAK,SAAS,EAAE,EAAE,cAClB,gBAAgB,oBACd,KAAK,QACL,KAAK,gBACX,GAAA,CACA,MAAM,GAAG,GAAG;GACd;GACA,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;GAC3C,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;GAC7C,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;GAC7C,GAAI,gBAAgB,oBAAoB,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,UACE,CAAC,aACA,gBAAgB,oBAAoB,gBAAgB,sBACjD,CAAC,KAAK,WACN,gBAAgB;GACtB,GAAI,gBAAgB,oBAAoB,gBAAgB,oBACpD,EAAE,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE,EAAE,IACpC,CAAC;GACL,GAAI,iBAAiB,KAAK,CAAC,IAAI,EAAE,cAAc,aAAa,MAAM,GAAG,GAAG,EAAE;GAE1E,GAAI,WAAW,KAAA,KAAa,OAAO,SAAS,OAAO,CAAC,IAAI,EAAE,aAAa,OAAO;GAC9E,GAAI,WAAW,SAAS,WAAW,UAAU,WAAW,WACpD,EAAE,YAAY,OAAO,IACrB,CAAC;GACL,KAAK;IAAE,GAAG,KAAK;IAAM,GAAG,KAAK;IAAK,OAAO,KAAK;IAAO,QAAQ,KAAK;GAAO;GACzE;GACA,SAAS,cAAc,YAAY,cAAc,QAAQ,MAAM,IAAI;GACnE,WAAW,OAAO,QAAQ;EAC5B;CACF;CAEA,IAAI,SAAS,KAAA,GACX,OAAO;EACL,OAAO,CAAC,IAAI;EACZ,MAAM;GACJ,OAAO,QAAQ,IAAI;GACnB,GAAI,QAAQ,YAAY,KAAA,IACpB,CAAC,IACD;IACE,UAAU,KAAK,eAAe,KAAK,kBAAkB;IACrD,SAAS,QAAQ,QAAQ,KAAK,EAAE,MAAM,aAAa;KACjD,OAAO,QAAQ,IAAI;KACnB,QACE,gBAAgB,qBAChB,gBAAgB,qBAChB,KAAK,eACL,KAAK,kBAAkB,YACvB,KAAK,QAAQ,QAAQ,MAAM,QAC3B,KAAK,QAAQ,KAAK,KAAK,KAAK,MAAM;KACpC,cAAc,gBAAgB,qBAAqB,KAAK,UAAU;IACpE,EAAE;GACJ;EACN;CACF;CAEF,MAAM,QAAwB,CAAC;CAC/B,MAAM,WAA8C,CAAC;CACrD,MAAM,gCAAgB,IAAI,IAA+B;CAEzD,MAAM,aAAa,SAAS,iBAC1B,qTACF;CAEA,IAAI,oBAAoB;CAExB,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,IAAI,EAAE,UAAU,YAAY;GAC1B,SAAS,YAAY;GACrB,oBAAoB;GACpB;EACF;EACA,MAAM,OAAO,WAAW;EAExB,IAAI,SAAS,KAAA,GAAW;EACxB,MAAM,QAAQ,QAAQ,IAAI;EAE1B,MAAM,eAAe,gBAAgB,oBAAoB,KAAK,QAAQ,QAAQ,IAAI;EAElF,MAAM,SACJ,QAAQ,YAAY,QAAQ,iBAAiB,QAAQ,cAAc,IAAI,YAAY;EAIrF,IAAI,WAAW,KAAA,GAQT;OAAA,EANF,gBAAgB,oBACZ,iBAAiB,QAAQ,cAAc,IAAI,YAAY,IACvD,QAAQ,MAAM,KAAK,KAClB,gBAAgB,qBACf,MAAM,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,WAAW,QAAQ,OAAO,KAAK,CAAC,IAE5D;EAAA;EAKb,IAAI,UAAU,cAAc,CAAC,UAAU,MAAM,YAAY,QAAQ;GAC/D,IAAI,MAAM,cAAc,WAAW,SAAS;GAC5C;EACF;EACA,IAAI,MAAM,UAAU,cAAc;GAChC,oBAAoB;GACpB;EACF;EACA,MAAM,KAAK,IAAI;EACf,SAAS,KAAK,KAAK;EACnB,IAAI,gBAAgB,mBAAmB,cAAc,IAAI,MAAM,MAAM,SAAS,CAAC;CACjF;CAEA,MAAM,UACJ,QAAQ,YAAY,OAChB,CAAC,GAAG,aAAa,CAAC,CAAC,KAAK,CAAC,QAAQ,WAAW;EAC1C,MAAM,UAAqE,CAAC;EAE5E,MAAM,SAAS,MAAM,gBAAgB;GACnC,IACE,gBAAgB,qBAChB,KAAK,QAAQ,QAAQ,MAAM,UAC3B,OAAO,QAAQ,KAAK,KAAK,KAAK,MAAM,MACpC;IACA,MAAM,QAAQ,KAAK;IAEnB,IAAI,MAAM,UAAU,OAAO,QAAQ,KAAK;KAAE,OAAO;KAAa;IAAM,CAAC;GACvE;EACF,CAAC;EAED,OAAO;GAAE;GAAO;GAAS,kBAAkB,QAAQ,WAAW,OAAO,QAAQ;EAAO;CACtF,CAAC,IACD,KAAA;CAEN,MAAM,UAAU,IAAI,YAAY;CAChC,IAAI,OAAO;CACX,IAAI,gBAAgB;CAEpB,IAAI,UAAU,YAAY;EACxB,MAAM,QAAQ,SAAS,MAAM,aAAa;EAE1C,MAAM,UAAU,QAAQ,OACtB,WAAW,KAAA,IACP,QACA,MACG,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,QAAQ,SAAS,SAAS,MAAM,QAAQ,IAAI,CAAC,CAAC,CAC9C,KAAK,IAAI,CAClB;EAEA,IAAI,MAAM,KAAK,IAAI,QAAQ,QAAQ,YAAY;EAG/C,OAAO,MAAM,KAAK,MAAM,QAAQ,YAAY,QAAQ,QAAQ,KAAK,SAAS,KAAK;EAC/E,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,QAAQ,SAAS,GAAG,GAAG,CAAC;EACxD,gBAAgB,MAAM,QAAQ;CAChC,OAAO,IAAI,SAAS,SAAS,MAAM;EACjC,MAAM,SAAS,SAAS,iBAAiB,SAAS,MAAM,WAAW,SAAS;EAC5E,MAAM,QAAQ,SAAS,YAAY;EACnC,IAAI,QAAQ;EACZ,IAAI,aAAa,OAAO;EAGxB,MAAM,SAAS,MAAY,UAAuC;GAChE,MAAM,SAAS,KAAK,KAAK;GAEzB,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC,GAAG,KAAK;IACxD,MAAM,SAAS,MAAM,CAAC;IACtB,MAAM,OAAO,MAAM,IAAI,CAAC;IACxB,MAAM,OAAO,MAAM,eAAe,CAAC,CAAC;IAEpC,IAAI,SAAS,KAAA,KAAa,KAAK,QAAQ,KAAK,SAAS,GAAG,OAAO;GACjE;EAGF;EAEA,KAAK,IAAI,OAAO,OAAO,SAAS,GAAG,SAAS,MAAM,OAAO,OAAO,SAAS,GAAG;GAC1E,IAAI,EAAE,UAAU,YAAY;IAC1B,SAAS,YAAY;IACrB,gBAAgB;IAChB;GACF;GACA,MAAM,QAAQ,KAAK;GAEnB,IAAI,EAAE,gBAAgB,SAAS,UAAU,QAAQ,KAAK,KAAK,KAAK,MAAM,IAAI;GAC1E,IAAI;IAAC;IAAU;IAAS;IAAY;GAAU,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG;GACzE,IAAI,MAAM,kBAAkB;IAAE,iBAAiB;IAAM,oBAAoB;GAAK,CAAC,MAAM,OACnF;GACF,MAAM,mBAAmB,IAAI;GAE7B,MAAM,QADQ,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,OAAO,UAC/B,CAAC,CAAC;GAGpB,IAAI,UAAU,KAAA,GAAW;GACzB,MAAM,UAAU,QAAQ,OAAO,KAAK;GAEpC,IAAI,YAAY,QAAQ;IACtB,IAAI,YAAY,WAAW,SAAS;SAC/B,SAAS;IACd;GACF;GACA,MAAM,mBAAmB,IAAI;GAC7B,IAAI,UAAU,KAAK;GAEnB,IAAI,CAAC,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,MAAM,MAAM,GAAG;IAG9C,MAAM,SAAS,KAAK,KAAK;IACzB,IAAI,MAAM;IACV,IAAI,OAAO;IAEX,OAAO,MAAM,MAAM;KACjB,MAAM,SAAU,MAAM,QAAS;KAC/B,MAAM,OAAO,MAAM,MAAM,MAAM;KAE/B,IAAI,SAAS,KAAA,KAAa,KAAK,UAAU,GAAG,MAAM,SAAS;UACtD,OAAO;IACd;IACA,MAAM,QAAQ;IAEd,OAAO;IACP,OAAO,MAAM,MAAM;KACjB,MAAM,SAAU,MAAM,QAAS;KAC/B,MAAM,OAAO,MAAM,MAAM,MAAM;KAE/B,IAAI,SAAS,KAAA,KAAa,KAAK,OAAO,QAAQ,OAAO;UAChD,MAAM,SAAS;IACtB;IACA,UAAU,KAAK,KAAK,MAAM,OAAO,GAAG;IACpC,SAAS;GACX;GACA,MAAM,WAAW,QAAQ,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;GAEnD,IAAI,aAAa,MAAM,CAAC,QAAQ,QAAQ,GAAG;GAC3C,MAAM,UAAU,SAAS,KAAK,KAAK,MAAM,OAAO,aAAa,IAAI,OAAO,OAAO;GAC/E,MAAM,OAAO,QAAQ,OAAO,MAAM,CAAC,CAAC;GAEpC,IAAI,QAAQ,OAAO,cAAc;IAC/B,gBAAgB;IAChB;GACF;GACA,QAAQ;GACR,SAAS;GACT,aAAa,KAAK,IAAI,YAAY,MAAM,MAAM;EAChD;CACF;CAEA,OAAO;EACL;EACA,MAAM;GACJ;GACA;GACA;GACA;GACA,UAAU;GACV,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;GAC3C,GAAI,QAAQ,WAAW,IACnB,CAAC,IACD,EAAE,SAAS;IAAE,QAAQ;IAAS,SAAS,OAAO;IAAS,SAAS,OAAO;GAAQ,EAAE;EACvF;CACF;AACF;;;AC3yBA,MAAM,aAAa,OAAO,OAAO;CAC/B,MAAM,OAAO;CACb,SAAS,OAAO;CAChB,YAAY,OAAO;AACrB,CAAC;AAED,MAAM,WAAW,OAAO,OAAO;CAAE,OAAO,OAAO;CAAS,QAAQ,OAAO;AAAQ,CAAC;AAEhF,MAAM,2BAA2B,aAAmC;CAClE,IAAI,SAAS,QAAQ,GAAG,MAAM,QAAQ,QAAQ,UAAU,KAAK,EAAE,MAAM,mBAAmB,CAAC,CAAC;CAC1F,IAAI,SAAS,SAAS,GAAG,MAAM,QAAQ,QAAQ,UAAU,KAAK,EAAE,MAAM,oBAAoB,CAAC,CAAC;CAC5F,IAAI,SAAS,QAAQ,OACnB,MAAM,QACJ,QAAQ,MAAM,KAAK;EAAE,WAAW;EAAS,SAAS;EAAO,UAAU,SAAS;CAAM,CAAC,CACrF;CACF,IAAI,SAAS,SAAS,OACpB,MAAM,QACJ,QAAQ,MAAM,KAAK;EAAE,WAAW;EAAU,SAAS;EAAO,UAAU,SAAS;CAAO,CAAC,CACvF;CACF,MAAM,SAAS,SAAS,QAAQ,SAAS;CAEzC,IAAI,SAAS,UACX,MAAM,QACJ,QAAQ,MAAM,KAAK;EAAE,WAAW;EAAU,SAAS;EAAY,UAAU;CAAO,CAAC,CACnF;AACJ;AAEA,MAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO,oBAAoB,GAAO,CAAC;AAEtE,MAAM,QAAQ,OAAO,OAAO,EAAE,OAAO,aAAa,CAAC;AAEnD,MAAM,iBAAiB,OAAO,OAAO;CACnC,OAAO;CACP,UAAU,OAAO;CACjB,SAAS,OAAO,MACd,OAAO,OAAO;EACZ,OAAO;EACP,QAAQ,OAAO;EACf,cAAc,OAAO;CACvB,CAAC,CACH,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC;AAChC,CAAC;;AAGD,MAAM,aAAa;;AAGnB,MAAM,gBAAgB;AAEtB,MAAM,YAAY,OAAO,OAAO,EAC9B,WAAW,OAAO,OAAO,EAAE,OAAO,OAAO,OAAO,EAAE,IAAI,OAAO,OAAO,CAAC,EAAE,CAAC,EAC1E,CAAC;AAED,MAAM,UAAU,OAAO,OAAO;CAAE,eAAe,OAAO;CAAK,SAAS,OAAO;AAAO,CAAC;AAEnF,MAAM,WAAW,OAAO,OAAO,EAAE,QAAQ,OAAO,OAAO,EAAE,UAAU,OAAO,OAAO,CAAC,EAAE,CAAC;AAErF,MAAM,aAAa,OAAO,OAAO,EAC/B,QAAQ,OAAO,OAAO,EACpB,OAAO,OAAO,OAAO,EACnB,MAAM,OAAO,MAAM,OAAO,MAAM,CAAC,cAAc,OAAO,QAAQ,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAC1E,OAAO,YAAY,GAAG,CACxB,EACF,CAAC,EACH,CAAC,EACH,CAAC;;;;;;;;AASD,MAAM,iBAAiB,OACrB,MACA,SACA,UAC0C;CAC1C,MAAM,MAAM,MAAM,KAAK,QAAQ,CAAC,CAAC,cAAc,IAAI;CACnD,MAAM,QAAQ;CAEd,IAAI;EACF,MAAM;EAEN,MAAM,CAAC,MAAM,GAAG,WAAW,MAAM,QAAQ,IAAI,CAC3C,IAAI,KAAK,mBAAmB,GAC5B,GAAG,QAAQ,OAAO,KAAK,CAAC,GAAG,OACzB,IACG,KAAK,0BAA0B;GAC9B,GAAG,IAAI,KAAK,MAAM,QAAQ,OAAO;GACjC,GAAG,IAAI,KAAK,MAAM,QAAQ,OAAO;GACjC,yBAAyB;EAC3B,CAAC,CAAC,CACD,MAAM,QAAQ,WAAW,SAAS,GAAG,CAAC,CAAC,CACvC,YAAY,KAAA,CAAS,CAC1B,CACF,CAAC;EAED,MAAM;EACN,MAAM,YAAY,WAAW,WAAW,IAAI,CAAC,CAAC,UAAU,MAAM;EAC9D,MAAM,yBAAS,IAAI,IAA8C;EAEjE,QAAQ,OAAO,SAAS,OAAO,UAAU;GACvC,MAAM,MAAM,QAAQ;GAEpB,IAAI,QAAQ,KAAA,KAAa,IAAI,YAAY,WAAW;GACpD,OAAO,IAAI,IAAI,eAAe,CAAC,GAAI,OAAO,IAAI,IAAI,aAAa,KAAK,CAAC,GAAI,KAAK,CAAC;EACjF,CAAC;EAED,MAAM,UAAU,MAAM,QAAQ,IAC5B,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,eAAe,YAAY;GACjD,IAAI;IACF,MAAM,EAAE,WAAW,WACjB,UACA,MAAM,IAAI,KAAK,mBAAmB;KAAE;KAAe,aAAa;IAAM,CAAC,CACzE;IAEA,MAAM;IAEN,MAAM,EAAE,WAAW,WACjB,YACA,MAAM,IAAI,KAAK,0BAA0B;KACvC,qBAAqB,OAAO,QAAQ;KACpC,UAAU,OAAO;KACjB,WAAW,CACT,EACE,OAAO;MACL,OAAO;MACP,cAAc;MACd,cAAc;MACd,YAAY;MACZ,UAAU;KACZ,EACF,GACA,EAAE,UAAU,OAAO,SAAS,CAC9B;KACA,eAAe;IACjB,CAAC,CACH;IAEA,OAAO,OAAO,KAAK,OAAO,UAAU,CAAC,OAAO,OAAO,MAAM,KAAK,MAAM,CAAU;GAChF,QAAQ;IACN,OAAO,CAAC;GACV;EACF,CAAC,CACH;EAEA,MAAM;EACN,MAAM,WAAyC,CAAC;EAEhD,KAAK,MAAM,CAAC,CAAC,GAAG,IAAI,YAAY,QAAQ,KAAK,GAC3C,IAAI,YAAY,KAAA,KAAa,YAAY,WACvC,SAAS,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO;EAE5C,OAAO;CACT,UAAU;EACR,MAAM,kBAAkB,IAAI,KAAK,8BAA8B,EAAE,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC,YAChF,CAAC,CACT;EACA,MAAM,kBAAkB,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CACtD;AACF;;;;;AASA,MAAM,gBAAgB,SAAiC;CACrD,IAAI,CAAC,KAAK,eAAe,KAAK,kBAAkB,UAAU,OAAO;CACjE,MAAM,OAAO,KAAK,aAAa,MAAM;CAErC,IAAI,gBAAgB,qBAAqB,KAAK,SAAS,cAAc,KAAK,SAAS,UACjF,OAAO,KAAK,UAAU,CAAC,WAAW,KAAK,OAAO,CAAC;CACjD,IAAI,gBAAgB,oBAAoB,gBAAgB,qBACtD,OAAO,KAAK,UAAU,CAAC,SAAS,KAAK,KAAK,CAAC;CAC7C,IAAI,gBAAgB,mBAClB,OAAO,KAAK,UAAU,CAAC,WAAW,MAAM,KAAK,KAAK,kBAAkB,WAAW,OAAO,KAAK,CAAC,CAAC;CAC/F,IACE,SAAS,QACT;EAAC;EAAY;EAAS;EAAU;EAAoB;CAAe,CAAC,CAAC,SAAS,IAAI,GAElF,OAAO,KAAK,UAAU,CAAC,WAAW,KAAK,aAAa,cAAc,MAAM,MAAM,CAAC;CACjF,IAAI,gBAAgB,eAAe,KAAK,mBACtC,OAAO,KAAK,UAAU,CAAC,QAAQ,KAAK,eAAe,EAAE,CAAC;CAExD,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC;AACjC;;;;;AAMA,MAAa,iBAAiB,OAC5B,YACgC;CAChC,IAAI;EACF,MAAM,QAAiB,MAAM,QAAQ,SAAS,YAAY;EAE1D,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;CAC7C,QAAQ;EACN;CACF;AACF;;AAGA,MAAa,gBAAgB,OAA2B,YACtD,UAAU,KAAK,UAAU,CAAC,WAAW,OAAO,CAAC;;;;;AAkC/C,MAAa,mBACX,SAEA,qBACA,WACG;CACH,MAAM,EAAE,YAAY;CACpB,IAAI;CACJ,IAAI,oBAAoB;CACxB,IAAI,oBAAoB;CAExB,MAAM,cAAc,QAA0B,UAAU;EACtD,IACE,gBAAgB,KAAA,KAChB,UAAU,WACT,UAAU,SACR,MAAM,WAAW,YAAY,OAAO,WAClC,MAAM,YAAY,KAAA,KAAa,MAAM,YAAY,YAAY,OAAO,WAEzE,YAAY,WAAW;CAC3B;;;;;;;CAQA,MAAM,UAAU,OAAU,MAAwB,WAAsC;EACtF,MAAM,EAAE,OAAO,UAAU,QAAQ,MAAM;EACvC,MAAM,QAAQ,QAAQ,QAAQ,KAAK;EAEnC,IAAI;GACF,OAAO,MAAM,KAAK;EACpB,SAAS,OAAO;GAOd,IAHE,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,KAAK,MAC7B,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,SAAS,gBAEzC,QAAQ,QAAQ,KAAK,MAAM,SAAS,QAAQ,WAAW,IAAI,MAAM,EAAE,IACrF,MAAM,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC,GAAG,cAAc;GAC9D,MAAM;EACR;CACF;CAEA,MAAM,WACJ,QACA,QAA0B,UACvB;EACH,WAAW,KAAK;EAChB,OAAO,WAAW,QAAQ,KAAK;CACjC;;;;;;CAOA,MAAM,QAAQ,WAAmB;EAC/B,IAAI,aAAa,OAAO,WAAW,QAAQ;GACzC,IAAI,YAAY,aAAa,WAAW,YAAY,WAAW;QAC1D,IAAI,YAAY,aAAa,SAAS;IACzC,YAAY,WAAW;IACvB,YAAY,YAAY,MAAM;GAChC;EACF;CACF;CAEA,MAAM,eAAe,SACnB,oBACI,QAAQ,QAAQ,IACf,KAAK,aAAa,QAAQ,QAAQ,CAAC,CAAC,WACnC,oBAAoB,KAAA,IAAY,KAAK,OAAO,QAAQ,CACtD;CAEN,MAAM,cAAc,SAAkC;EACpD,KAAK,UAAU;EAEf,OAAO,KAAK,WAAW,IAAI,YAAY,IAAI,IAAI,QAAQ,QAAQ;CACjE;CAEA,MAAM,UAAU,YAAY;EAC1B,MAAM,MAAM;EAEZ,cAAc,KAAA;EACd,IAAI,QAAQ,KAAA,GAAW;GACrB,IAAI,WAAW;GACf,MAAM,kBAAkB,QAAQ,WAAW,CAAC,GAAG,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC;EACrF;CACF;CAEA,MAAM,eAAe,OACnB,UACA,QACA,WACoC;EACpC,OAAO,MAAM;EAEb,MAAM,SAAS,MAAM,QAAQ,MAAM,CAAC,CAAC,MAAM,gBAAgB,cAAc;GACvE,IAAI;IACF,MAAM,UAAU,SAAS,iBAAiB,SAAS;IAEnD,OAAO;KAAE,OAAO,QAAQ;KAAQ,MAAM,QAAQ,WAAW,IAAI,QAAQ,KAAK;IAAK;GACjF,QAAQ;IACN,OAAO;KAAE,OAAO;KAAG,MAAM;IAAK;GAChC;EACF,GAAG,QAAQ;EAEX,IAAI;EAEJ,IAAI;GACF,MAAM,cAAc,MAAM,OAAO,YAAY,OAAO;GACpD,IAAI;GAEJ,IAAI;IACF,QAAQ,WAAW,OAAO,MAAM,YAAY,UAAU,CAAC;GACzD,UAAU;IACR,MAAM,YAAY,QAAQ;GAC5B;GACA,OAAO,MAAM;GACb,IAAI,UAAU,GACZ,MAAM,QACJ,UAAU,IAAI,QAAQ,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,UAAU,KAAK,CAAC,CAAC,GACnE,cACF;GACF,OAAO,MAAM,OAAO,YAAY,MAAM;GACtC,MAAM,UAAU,KAAK,UAAU;GAE/B,IAAI,YAAY,MAAM,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;GAC7E,OAAO,MAAM;GAEb,OAAO;EACT,SAAS,OAAO;GACd,MAAM,MAAM,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;GACpC,MAAM;EACR,UAAU;GACR,MAAM,OAAO,QAAQ;EACvB;CACF;;CAGA,MAAM,iBAAiB,UAAoB,WAA6B;EACtE,OAAO,MAAM;EACb,IACE,gBAAgB,YAChB,SAAS,eAAe,OAAO,cAC/B,SAAS,aAAa,WAEtB,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAEtD,MAAM,WAAW,QAAQ,SAAS;EAElC,IACE,SAAS,WAAW,SAAS,OAAO,UACpC,SAAS,YAAY,SAAS,OAAO,WACrC,QAAQ,QAAQ,QAAQ,SAAS,MAAM,CAAC,CAAC,KAAK,MAAM,SAAS,eAE7D,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;CACxD;;CAGA,MAAM,YAAY,QAAyB,QAAoB,iBAAiB,UAAU;EACxF,MAAM,WAAW;EAEjB,IAAI,aAAa,KAAA,KAAa,SAAS,OAAO,OAAO,eACnD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACtD,MAAM,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS;EAEhD,IAAI,SAAS,KAAA,GAAW,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAE5E,MAAM,cAAoB;GACxB,cAAc,UAAU,MAAM;GAO9B,IAAI,EAJF,SAAS,aAAa,WACrB,SAAS,aAAa,gBACpB,kBAAkB,SAAS,YAAY,IAAI,OAAO,SAAS,OAEjD,SAAS,MAAM,IAAI,OAAO,SAAS,MAAM,MACtD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACxD;EAEA,MAAM;EAEN,OAAO;GAAE;GAAM;GAAU;EAAM;CACjC;;;;;CAMA,MAAM,SAAS,WAA4B,WAAuB;EAChE,MAAM,EAAE,MAAM,aAAa,SAAS,WAAW,MAAM;EAErD,KAAK;EACL,IAAI;EAEJ,OAAO;GACL,SAAS,KAAK;GACd,aAAa;IACX,OAAO,MAAM;IACb,IACE,qBACA,gBAAgB,YAChB,SAAS,aAAa,aACtB,QAAQ,QAAQ,QAAQ,SAAS,MAAM,CAAC,CAAC,KAAK,MAAM,SAAS,eAE7D,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GACxD;GACA,eAA8B;IAC5B,cAAc,YAAY;KACxB,KAAK;KACL,IAAI,KAAK,WAAW,KAAK,WAAW,GAAG,MAAM,YAAY,IAAI;IAC/D,EAAA,CAAG;IAEH,OAAO;GACT;EACF;CACF;;;;;CAMA,MAAM,cAAc,OAClB,SACA,OACA,QACA,YACqB;EACrB,MAAM;EAEN,MAAM,SAAS,MAAM,QAAQ,MAAM,CAAC,CAAC,MAAM,eAAe,UAAU;GAClE,OAAO;GACP,cAAc;GACd,cAAc;GACd,YAAY;GACZ,MAAM;GACN,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;EAC7C,CAAC;EAED,IAAI;GACF,MAAM;GACN,MAAM,MAAM,MAAM,OAAO,UAAU,SAAS,KAAK,IAAI;GAErD,MAAM;GAEN,OAAO;EACT,UAAU;GACR,MAAM,OAAO,QAAQ;EACvB;CACF;;;;;;;;;CAUA,MAAM,UAAU,OACd,QACA,QACA,QACA,iBAAiB,OACjB,eACA,aAAa,UAMT;EACJ,MAAM,OAAO,OAAO,WAAW;EAE/B,MAAM,eACJ,OAAO,WAAW,WAAW,KAAA,IAAY,SAAS,QAAQ,QAAQ,cAAc;EAElF,MAAM,OAAO,cAAc;EAC3B,MAAM,iBAAiB,cAAc,SAAS,UAAU;EACxD,MAAM,QAAQ,cAAc,gBAAgB,OAAO,MAAM;EAEzD,MAAM,UACJ,OAAO,WAAW,WAAW,MAAM,aAAa,QAAQ,QAAQ,aAAa,IAAI,MAAM;EAEzF,IAAI,YAAY,KAAA,GAAW,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAC/E,IAAI;EAEJ,IAAI;GACF,MAAM;GAEN,MAAM,SACJ,MAAM,WAAW,KAAA,IACb,KAAA,IACA,cAAc,SAAS,MAAM,IAAI,KAAK,OAAO,eAAe,CAAC,EAAE;GAErE,MAAM,WAAoB,MAAM,QAAQ,UACrC,WAAW,EAAE,UAAU,gBAAgB;IACtC,IAAI,CAAC,UAAU,eAAe,UAAU,kBAAkB,UAAU,OAAO;IAC3E,IACE,cAAc,KAAA,MACb,EAAE,qBAAqB,sBACtB,EAAE,UAAU,kBAAkB,sBAC9B,CAAC,UAAU,OAAO,eAClB,UAAU,QAAQ,QAAQ,MAAM,UAAU,UAC1C,UAAU,OAAO,QAAQ,KAAK,UAAU,KAAK,MAAM,aACnD,UAAU,UAAU,UAAU,QAEhC,OAAO;IACT,IAAI,aAAa,KAAA,GAAW,OAAO;IACnC,MAAM,UAAU,UAAU,cAAc,iBAAiB,QAAQ;IAEjE,OAAO,QAAQ,WAAW,KAAK,QAAQ,OAAO;GAChD,GACA;IACE,UAAU,OAAO,WAAW,WAAW,SAAS,KAAA;IAChD,WACE,WAAW,KAAA,KAAa,MAAM,WAAW,KAAA,IACrC,KAAA,IACA;KAAE;KAAQ,OAAO,KAAK,OAAO;IAAM;GAC3C,CACF;GAEA,MAAM;GACN,IAAI,aAAa,MAAM,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GAC3E,IAAI,SAAS,KAAA,KAAa,WAAW,KAAA,GAAW;IAC9C,QAAQ,WAAW,OAAO,MAAM,YAAY,SAAS,OAAO,cAAc,CAAC,CAAC,CAAC;IAE7E,MAAM;IACN,IACE,SAAS,KAAA,MACR,aACG,iBAAiB,KAAK,MAAM,KAAK,SACjC,WAAW,KAAK,MAAM,KAAK,WAE/B,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;IACtD,IAAI,cAAc,MAAM,UAAU,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;IACzF,IAAI,WAAW,KAAA,GAAW;KACxB,IAAI,WAAW;KAEf,IAAI;MACF,WAAW,OAAO,KAAK,MAAM;KAC/B,QAAQ;MACN,WAAW;KACb;KACA,IAAI,CAAC,UAAU,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,cAAc;IACtE;GACF;GACA,MAAM;GAEN,OAAO;IAAE;IAAS;IAAM;IAAO;GAAM;EACvC,SAAS,OAAO;GACd,IAAI,CAAC,MAAM,MAAM,kBAAkB,QAAQ,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACpE,MAAM;GACN,MAAM;EACR;CACF;;CAGA,MAAM,gBAAgB,OACpB,QACA,KACA,SACA,QACA,aAAa,UACV;EACH,MAAM,QAAQ,OAAqB,SACjC,aAAa,iBAAiB,KAAK,MAAM,KAAK,SAAS,WAAW,KAAK,MAAM,KAAK;EAEpF,MAAM,SAAS,SAAS,QAAQ,MAAM;EAEtC,IAAI,OAAO,KAAK,WAAW,SAAS,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACxF,IAAI,OAAO,KAAK,aAAa,KAAA,GAC3B,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;EAE5D,MAAM,UAAU,IAAI,KAAK,cAAc;GACrC,MAAM,SAAS,SAAS;IAAE,eAAe,OAAO;IAAe;GAAU,GAAG,MAAM;GAClF,MAAM,WAAW,OAAO,KAAK;GAE7B,IAAI,aAAa,KAAA,KAAa,SAAS,oBAAoB,OAAO,WAChE,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GAEtD,OAAO;IAAE,GAAG;IAAQ,OAAO,SAAS;GAAM;EAC5C,CAAC;EAED,MAAM,cAAc;GAClB,OAAO,MAAM;GACb,KAAK,MAAM,UAAU,SAAS,OAAO,MAAM;EAC7C;EAEA,MAAM,QAAQ,WACZ,gBACA,MAAM,YACJ,SACA,OACA,OAAO,SAAS,QAChB,QAAQ,KAAK,YAAY;GAAE,MAAM,OAAO,KAAK;GAAQ,OAAO,OAAO;EAAM,EAAE,CAC7E,CACF;EAEA,MAAM;EACN,IAAI,CAAC,MAAM,YAAY,CAAC,KAAK,MAAM,OAAO,OAAO,IAAI,GACnD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACtD,IAAI,MAAM,QAAQ,WAAW,QAAQ,QACnC,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,GAAG,cAAc;EAC1D,KAAK,MAAM,CAAC,OAAO,YAAY,MAAM,QAAQ,QAAQ,GAAG;GACtD,MAAM,SAAS,QAAQ;GAEvB,IACE,WAAW,KAAA,KACX,CAAC,QAAQ,UACT,CAAC,QAAQ,gBACT,CAAC,KAAK,QAAQ,OAAO,OAAO,IAAI,GAEhC,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACxD;EACA,IAAI,MAAM,MAAM,YAAY,MAAM,QAAQ,MAAM,WAAW,OAAO,MAAM,QAAQ,GAC9E,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;EACzD,IAAI,MAAM,MAAM,aAAa,QAAQ,IAAI,SAAS,GAChD,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;EAC5D,MAAM;EAEN,OAAO;GACL,SAAS,QAAQ,KAAK,WAAW,OAAO,KAAK,MAAM;GACnD,QAAQ,QAAQ,KAAK,WAAW,OAAO,KAAK;EAC9C;CACF;CAEA,MAAM,gBAAgB,QAAyB,WAC7C,SAAS,YAAY;EACnB,MAAM,EAAE,OAAO,UAAU,MAAM,QAAQ,QAAQ,MAAM;EAErD,MAAM;EACN,IAAI,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,GAAG,cAAc;EAEjF,OAAO;CACT,CAAC;;;;;;CAOH,MAAM,aAAa,YAA4C,WAC7D,SAAS,YAAY;EACnB,MAAM,SAAoC,CAAC;EAE3C,KAAK,MAAM,aAAa,YAAY;GAClC,MAAM,SAAS,MAAM,WAAW,MAAM;GAEtC,IAAI;IACF,OAAO,MAAM;IACb,OAAO,KAAK,MAAM,eAAe,OAAO,OAAO,CAAC;IAChD,OAAO,MAAM;GACf,UAAU;IACR,MAAM,OAAO,QAAQ;GACvB;EACF;EAEA,OAAO;CACT,CAAC;;CAGH,MAAM,cAAc,QAAyB,WAC3C,SAAS,YAAY;EACnB,MAAM,WAAW;EACjB,MAAM,EAAE,UAAU,MAAM,QAAQ,QAAQ,QAAQ,KAAA,GAAW,IAAI;EAE/D,MAAM;EACN,IAAI,aAAa,KAAA,KAAa,aAAa,aACzC,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACtD,SAAS,YAAY,IAAI,OAAO,SAAS;CAC3C,CAAC;CAEH,MAAM,YACJ,UACA,cACA,QACA,WAEA,SAAS,YAAY;EACnB,OAAO,MAAM;EAEb,MAAM,MAAe,MAAM,cAEvB,QAAQ,MAAM,CAAC,CAAC,MAAM,UACnB,EAAE,UAAU,mBAAmB;GAC9B,MAAM,UACJ,aAAa,KAAA,IAAY,SAAS,OAAO,SAAS,cAAc,QAAQ;GAE1E,IAAI,YAAY,MAAM,OAAO;IAAE,MAAM;IAAI,SAAS;IAAM,YAAY;GAAE;GAEtE,MAAM,OACJ,mBAAmB,cAAc,QAAQ,YAAa,QAAQ,eAAe;GAE/E,MAAM,aAAa,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;GAElD,OAAO;IAAE,MAAM,aAAa,eAAe,KAAK;IAAM,SAAS;IAAO;GAAW;EACnF,GACA;GAAE;GAAU;EAAa,CAC3B,GACF,MACF;EAEA,OAAO,MAAM;EACb,MAAM,QAAQ,WAAW,YAAY,GAAG;EAExC,IAAI,MAAM,SAAS,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC;EAC1D,MAAM,gBAAgB,KAAK,IAAI,MAAM,YAAY,IAAI,YAAY,CAAC,CAAC,OAAO,MAAM,IAAI,CAAC,CAAC,MAAM;EAE5F,IAAI,gBAAgB,cAClB,MAAM,QACJ,QAAQ,MAAM,KAAK;GAAE,WAAW;GAAQ,SAAS;GAAc,UAAU;EAAc,CAAC,CAC1F;EAEF,OAAO,MAAM;CACf,CAAC;;CAGH,MAAM,WAAW,OACf,OACA,cACA,cACA,OACA,WACA,QACA,OACA,aACG;EACH,MAAM;EAEN,MAAM,SAAS,MAAM,QAAQ,MAAM,CAAC,CAAC,MAAM,eAAe,UAAU;GAClE;GACA;GACA;GACA,YAAY;GACZ,SAAS;GACT,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;GACvC,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;EAC/C,CAAC;EAED,MAAM,UAAyC,CAAC;EAChD,IAAI;EAGJ,IAAI,QAAyB,CAAC;EAE9B,IAAI;GACF,IAAI;GAEJ,IAAI;IACF,MAAM;IACN,MAAM,MAAM,MAAM,OAAO,UAAU,SAAS,KAAK,IAAI;IAErD,MAAM;IACN,OAAO,WAAW,gBAAgB,GAAG;IACrC,MAAM;IACN,MAAM,YAAY,IAAI,YAAY,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IAEtD,IAAI,YAAY,cACd,MAAM,QACJ,QAAQ,MAAM,KAAK;KAAE,WAAW;KAAQ,SAAS;KAAc,UAAU;IAAU,CAAC,CACtF;IACF,IAAI,KAAK,SAAS,SAAS,cACzB,MAAM,QACJ,QAAQ,MAAM,KAAK;KACjB,WAAW;KACX,SAAS;KACT,UAAU,KAAK,SAAS;IAC1B,CAAC,CACH;IACF,IAAI,WAAW;KACb,cAAc,MAAM,OAAO,gBAAgB,SAAS,KAAK,KAAK;KAC9D,MAAM;KACN,MAAM,QAAQ,MAAM,YAAY,cAAc;KAE9C,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC;KAC1B,MAAM;KACN,MAAM,SAAwC,CAAC;KAE/C,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;MAC7C,MAAM,UAAU,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK;MAErD,IAAI,YAAY,MAAM,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;MAI9D,OAAO,KAAK,OAAO;KACrB;KACA,MAAM,OAAO,IAAI,IAAc,MAAM;KAErC,QAAQ,MAAM,QAAQ,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;KAC9C,QAAQ,KAAK,GAAG,MAAM;IACxB;GACF,UAAU;IACR,MAAM,kBAAkB,QAAQ,WAAW,MAAM,KAAK,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YACzE,CAAC,CACT;IACA,MAAM,aAAa,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;IAC3C,MAAM,OAAO,QAAQ;GACvB;GACA,MAAM;GAEN,OAAO;IAAE;IAAM;GAAQ;EACzB,SAAS,OAAO;GAEd,MAAM,kBAAkB,QAAQ,WAAW,QAAQ,KAAK,WAAW,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAC/E,CAAC,CACT;GACA,MAAM;GACN,MAAM;EACR;CACF;;;;;;CAOA,MAAM,OAAO,OACX,OACA,cACA,cACA,OACA,WACA,QACA,UACG;EACH,MAAM,QAAQ,MAAM,SAClB,OACA,cACA,cACA,OACA,WACA,QACA,OACA,KAAA,CACF;EAEA,MAAM,UAAU,MAAM,KAAK;EAC3B,MAAM,EAAE,OAAO,UAAU,QAAQ,MAAM;EAEvC,IAAI,YAAY,KAAA,KAAa,UAAU,MAAM,KAAK,UAAU,GAAG,OAAO;EACtE,IAAI;EAEJ,MAAM,YAAY,YAAY;GAC5B,WAAW,MAAM,eAAe,MAAM,MAAM,SAAS,KAAK;EAC5D,GAAG,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC;EAChC,MAAM;EACN,IAAI,aAAa,KAAA,KAAa,OAAO,KAAK,QAAQ,CAAC,CAAC,WAAW,GAAG,OAAO;EACzE,MAAM,kBACJ,QAAQ,WAAW,MAAM,QAAQ,KAAK,WAAW,OAAO,QAAQ,CAAC,CAAC,CACpE,CAAC,CAAC,YAAY,CAAC,CAAC;EAEhB,OAAO,SAAS,OAAO,cAAc,cAAc,OAAO,WAAW,QAAQ,OAAO,QAAQ;CAC9F;CAEA,MAAM,WACJ,OACA,cACA,cACA,QACA,UAEA,SAAS,YAAY;EACnB,OAAO,MAAM;EACb,MAAM,QAAQ;EACd,OAAO,MAAM;EACb,MAAM,SAAS,QAAQ,SAAS;EAEhC,MAAM,WAAqB;GACzB,IAAI,eAAe,oBAAoB,GAAG,EAAE;GAC5C;GACA,eAAe,QAAQ,QAAQ,QAAQ,MAAM,CAAC,CAAC,KAAK;GACpD,YAAY,OAAO;GACnB,UAAU;GACV,uBAAO,IAAI,IAAI;GACf,6BAAa,IAAI,IAAI;EACvB;EAGA,cAAc;EACd,IAAI,UAAyC,CAAC;EAE9C,IAAI;GACF,MAAM,UAAU,MAAM,cAElB,KACE,OACA,cACA,oBACM,cAAc,UAAU,MAAM,GACpC,MACA,QACA,KACF,GACF,MACF;GAEA,UAAU,QAAQ;GAClB,cAAc,UAAU,MAAM;GAC9B,MAAM,EAAE,SAAS;GACjB,MAAM,0BAAU,IAAI,IAAqB;GACzC,MAAM,0BAAU,IAAI,IAA6C;GAEjE,KAAK,MAAM,UAAU,KAAK,WAAW,CAAC,GAAG;IACvC,IAAI,QAAQ,IAAI,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,MAAM,EAAE,aAAa,KAAA,GACzE,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;IAC1C,QAAQ,IAAI,OAAO,OAAO,OAAO,gBAAgB;IACjD,KAAK,MAAM,UAAU,OAAO,SAAS;KACnC,IAAI,QAAQ,IAAI,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,MAAM,EAAE,aAAa,KAAA,GACzE,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;KAC1C,QAAQ,IAAI,OAAO,OAAO;MACxB,iBAAiB,WAAW,OAAO;MACnC,OAAO,OAAO;KAChB,CAAC;IACH;GACF;GAGA,QAAQ,SAAS,QAAQ,MAAM;IAC7B,MAAM,QAAQ,KAAK,SAAS;IAE5B,IAAI,UAAU,KAAA,GAAW;KACvB,MAAM,SAAS,QAAQ,IAAI,CAAC;KAE5B,SAAS,MAAM,IAAI,WAAW,KAAK;MACjC;MACA,UAAU,WAAW,KAAK;MAC1B,QAAQ,iBAAiB,KAAK;MAC9B,QAAQ;MACR,SAAS;MACT,GAAI,MAAM,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,MAAM,SAAS;MACnE,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;KAC3C,CAAC;IACH;GACF,CAAC;GACD,IAAI,SAAS,MAAM,SAAS,KAAK,SAAS,QAAQ,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;GAE1F,MAAM,SAA4B;IAChC,eAAe,SAAS;IACxB;IACA,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;IACvC,KAAK,QAAQ,IAAI,MAAM;IACvB,MAAM,KAAK;IACX,eAAe,KAAK;IACpB,mBAAmB,KAAK;IACxB,UAAU,KAAK,SAAS,KAAK,OAAO,MAAM;KACxC,MAAM,SAAS,QAAQ,IAAI,CAAC;KAC5B,MAAM,mBAAmB,QAAQ,IAAI,CAAC;KAEtC,OAAO,gBAAgB,OAAO,WAAW,KAAK;MAC5C,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,OAAO,gBAAgB;MAC1E,GAAI,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB;KAC/D,CAAC;IACH,CAAC;IACD,UAAU,KAAK;GACjB;GAEA,cAAc,UAAU,MAAM;GAC9B,SAAS,WAAW;GAEpB,OAAO;EACT,SAAS,OAAO;GACd,SAAS,WAAW;GACpB,IAAI,gBAAgB,UAAU,cAAc,KAAA;GAC5C,MAAM,kBACJ,QAAQ,WAAW,QAAQ,KAAK,WAAW,OAAO,QAAQ,CAAC,CAAC,CAC9D,CAAC,CAAC,YAAY,CAAC,CAAC;GAChB,MAAM;EACR;CACF,CAAC;CAEH,MAAM,cACJ,UACA,cACA,QACA,WAEA,eACE,QAAQ,YAAY;EAClB,MAAM,OAAO,QAAQ,MAAM,CAAC,CAAC,MAAM;EAEnC,OAAO,MAAM;EAEb,MAAM,MAAe,MAAM,KAAK,UAC7B,UAAU;GACT,OAAO,OACH,KAAK,IAAI,SAAS,gBAAgB,aAAa,OAAO,UAAU,IAChE,OAAO;GACX,QAAQ,OACJ,KAAK,IAAI,SAAS,gBAAgB,cAAc,OAAO,WAAW,IAClE,OAAO;EACb,IACA,QACF;EAEA,MAAM,WAAW,WAAW,UAAU,GAAG;EAEzC,wBAAwB,QAAQ;EAChC,OAAO,MAAM;EAEb,MAAM,QAAiB,MAAM,KAAK,WAAW;GAC3C,MAAM;GACN;GACA,OAAO;GACP,SAAS,QAAQ,MAAM;EACzB,CAAC;EAED,IAAI,EAAE,iBAAiB,aAAa,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;EAC5E,IAAI,MAAM,SAAS,cACjB,MAAM,QACJ,QAAQ,MAAM,KAAK;GACjB,WAAW;GACX,SAAS;GACT,UAAU,MAAM;EAClB,CAAC,CACH;EACF,MAAM,SAAS,YAAY,KAAK;EAEhC,wBAAwB,MAAM;EAC9B,OAAO,MAAM;EAEb,OAAO,IAAI,WAAW,KAAK;CAC7B,GAAG,MAAM,CACX;;;;;;CAOF,MAAM,cACJ,cACA,cACA,cACA,WAEA,SAAS,YAAY;EACnB,OAAO,MAAM;EACb,MAAM,EAAE,UAAU,QAAQ;EAC1B,MAAM,QAAQ,QAAQ,QAAQ,KAAK;EAEnC,MAAM,EAAE,SAAS,MAAM,cACrB,KAAK,YAAY,cAAc,oBAAoB,OAAO,MAAM,GAAG,KAAK,CAC1E;EAEA,MAAM,UACJ,iBAAiB,KAAA,IAAY,KAAA,IAAY,MAAM,WAAW,OAAO,cAAc,MAAM;EAavF,OAAO;GAVL,KAAK,QAAQ,YAAY;GACzB,MAAM,KAAK;GACX,eAAe,KAAK;GACpB,UAAU,KAAK;GACf,mBAAmB,KAAK;GACxB,UAAU,KAAK;GACf,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;GAC3C,iBAAiB,QAAQ,QAAQ,KAAK,MAAM;EAGlC;CACd,CAAC;CAEH,OAAO;EACL;EACA;EACA;EACA;EACA;EACA,wBAAwB;GACtB,oBAAoB;GACpB,MAAM,MAAM;GAEZ,cAAc,KAAA;GACd,IAAI,QAAQ,KAAA,GAAW;IACrB,IAAI,WAAW;IACf,KAAK,MAAM,QAAQ,IAAI,MAAM,OAAO,GAAG,KAAK,UAAU;GACxD;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;;;;;;;AC3lCA,MAAM,gBACJ,MACA,SACsD;CACtD,MAAM,QAAQ,iBAAiB,IAAI;CAEnC,IAAI,MAAM,YAAY,YAAY;EAChC,MAAM,OAAO,KAAK,sBAAsB;EAExC,IACG,qBAAqB,QAAQ,CAAC,KAAK,gBAAgB,KACpD,MAAM,eAAe,aACrB,EAAE,KAAK,QAAQ,KAAK,KAAK,SAAS,IAElC,OAAO;CACX;CACA,IAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,aAAa,eAAe,MAAM,QAAQ,OAAO;CACvF,IAAI,SAAS,KAAA,GAAW,OAAO;CAC/B,IAAI,gBAAgB,kBAAkB;EACpC,MAAM,OAAO,KAAK,KAAK,YAAY;EACnC,MAAM,WAAW;GAAC;GAAS;GAAQ;GAAQ;GAAkB;GAAS;GAAS;EAAM;EAGrF,IAAI,KAAK,YAAa,CAAC;GAFR;GAAI;GAAS;GAAU;GAAY;GAAU;GAAO;GAAQ;EAEhD,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,IAAI,GAAI,OAAO;EACjF,IAAI,SAAS,YAAY,OAAO,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,GAAG,OAAO;EACnE,IAAI,SAAS,SAAS,IAAI,GAAG;GAG3B,MAAM,QAAQ,SAAS,cAAc,OAAO;GAC5C,MAAM,QAAQ,SAAS,UAAU,KAAK,KAAK,CAAC,CAAC,YAAY,IAAI,KAAK,KAAK;GAEvE,MAAM,OAAO;GACb,KAAK,MAAM,QAAQ;IAAC;IAAO;IAAO;GAAM,GAAG;IACzC,MAAM,aAAa,KAAK,aAAa,IAAI;IAEzC,IAAI,eAAe,MAAM,MAAM,aAAa,MAAM,UAAU;GAC9D;GACA,MAAM,QAAQ;GACd,IAAI,MAAM,UAAU,OAAO,OAAO;EACpC;EAEA,OAAO;CACT;CACA,IAAI,gBAAgB,qBAAqB,OAAO,KAAK,WAAW,gBAAgB;CAEhF,OAAO,gBAAgB,eAAe,KAAK,oBAAoB,OAAO;AACxE;;;;;;AAOA,MAAM,gBAAgB,OAAgB,WACpC,IAAI,SAAe,YAAY;CAC7B,IAAI,WAAW;CACf,IAAI,UAAU;CAEd,MAAM,eAAe;EACnB,IAAI,YAAY,SAAS,QAAQ;CACnC;CAEA,4BACE,4BAA4B;EAC1B,WAAW;EACX,OAAO;CACT,CAAC,CACH;CACA,iBAAiB;EACf,UAAU;EACV,OAAO;CACT,GAAG,MAAM;AACX,CAAC;;AAGH,MAAM,UAAU,OAAU,MAAkB,QAAgB,aAA4B;CACtF,IAAI;CAEJ,KAAU,YAAY,CAAC,CAAC;CAExB,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK,CACxB,KAAK,YAAY,QAAQ,GACzB,IAAI,SAAY,YAAY;GAC1B,QAAQ,iBAAiB,QAAQ,QAAQ,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;EACjE,CAAC,CACH,CAAC;CACH,UAAU;EACR,aAAa,KAAK;CACpB;AACF;AAEA,MAAa,aACX,KACA,QACA,QACA,gBAAuC,SACpC;CACH,IAAI,OAAO;CACX,IAAI,gBAAoC,CAAC;CACzC,IAAI,eAA+C,CAAC;CAEpD,MAAM,UAAU,IAAI,SAAY,KAAK,OAAO;EAC1C,UAAU;EACV,SAAS;CACX,CAAC;CAGD,QAAa,YAAY,CAAC,CAAC;CAE3B,MAAM,gBAAgB;EACpB,OAAO,QAAQ;EACf,OAAO,OAAO,oBAAoB,SAAS,KAAK;EAChD,aAAa,KAAK;CACpB;CAEA,MAAM,cAAc;EAClB,IAAI,CAAC,MAAM;GACT,OAAO;GACP,QAAQ;GACR,OAAO,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC;EAC9C;CACF;CAEA,MAAM,YAAY,UAAa;EAC7B,IAAI,CAAC,QAAQ,QAAQ,KAAK,GAAG;GAC3B,OAAO;GACP,QAAQ;GACR,QAAQ,KAAK;EACf;CACF;CAEA,MAAM,QAAQ,iBAAiB;EAC7B,IAAI,CAAC,MAAM;GACT,OAAO;GACP,QAAQ;GACR,OAAO,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC;EAC1C;CACF,GAAG,OAAO,gBAAgB,CAAC;CAE3B,IAAI,QAAQ;CACZ,OAAO,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;CAC7D,IAAI,OAAO,OAAO,SAAS,MAAM;CAEjC,OAAO;EAAE;EAAS,QAAQ;CAAM;AAClC;;;;;AAWA,MAAa,yBAAyB,OACpC,QACA,SACA,YACA,MACA,gBACsC;CACtC,OAAO,MAAM;CACb,MAAM,UAAU,YAAY;CAC5B,IAAI;CAEJ,IAAI;EACF,OAAO,MAAM,KAAK;EAClB,OAAO,MAAM;EACb,IAAI,CAAC,QAAQ,GAAG,OAAO;EAEvB,OAAO,MAAM;EACb,OAAO,SAAS;EAChB,WAAW;EACX,MAAM,KAAK,KAAK;EAChB,OAAO,MAAM;EAEb,OAAO;CACT,UAAU;EAGR,IAAI,SAAS,KAAA,GAAW,MAAM,KAAK,MAAM;EACzC,QAAQ;CACV;AACF;;;;;;AAOA,MAAa,mBACX,UAMgE;CAChE,IAAI,MAAM,WAAW,GAAG,MAAM,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC,GAAG,cAAc;CACpF,MAAM,SAAS,MAAM,QAAQ,SAAS,KAAK,SAAS,QAAQ;CAC5D,MAAM,SAAS,MAAM,QAAQ,SAAS,KAAK,SAAS,QAAQ;CAI5D,IAAI,OAAO,WAAW,MAAM,QAC1B,OAAO;EACL,MAAM;EACN,SAAS,OAAO,KAAK,UAAU;GAC7B,MAAM,KAAK;GACX,UAAU,KAAK;GACf,QAAQ,OAAO,KAAK,KAAK,KAAK;EAChC,EAAE;CACJ;CAEF,IAAI,OAAO,WAAW,MAAM,QAC1B,OAAO;EAAE,MAAM;EAAU,OAAO,OAAO,KAAK,SAAS,KAAK,IAAI;CAAE;CAClE,MAAM,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC,GAAG,cAAc;AAC9D;;;;;AAMA,MAAa,eACX,SACA,SACA,aACA,mBACG;CACH,MAAM,EAAE,YAAY;CACpB,IAAI,qBAAqB,UAAsB,CAAC;CAEhD,MAAM,yBAAyB,eAAqC;EAClE,oBAAoB;CACtB;CAEA,MAAM,qCAAqB,IAAI,IAM7B;CAEF,IAAI,iBAAiB;;CAGrB,MAAM,WAAW,UAAkB;EACjC,IAAI;EAEJ,IAAI;GACF,MAAM,IAAI,IAAI,KAAK;EACrB,QAAQ;GACN,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;EAC1C;EACA,IAAI,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI,UACrE,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;EAE1C,OAAO;CACT;CAEA,MAAM,WAAW,WAA0B,QAAQ,QAAQ,IAAI,MAAM,CAAC;;;;;;;;CAStE,MAAM,sBAAsB,OAC1B,QACA,QACA,OACA,QACA,QACA,eACA,aAAa,UACE;EACf,MAAM,EAAE,SAAS,MAAM,OAAO,UAAU,MAAM,YAAY,QACxD,QACA,QACA,QACA,OACA,eACA,UACF;EAEA,IAAI;GACF,MAAM;GACN,MAAM,WAAW,MAAM,MAAM,SAAS,KAAK;GAE3C,MAAM;GACN,OAAO,MAAM;GAEb,OAAO,SAAS;GAEhB,OAAO,MAAM,OAAO,SAAS,QAAQ;EACvC,UAAU;GACR,IAAI,CAAC,MAAM,MAAM,kBAAkB,QAAQ,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;EACtE;CACF;CAEA,MAAM,eACJ,QACA,QACA,QACA,QACA,kBAEA,oBAAoB,QAAQ,QAAQ,YAAY,CAAC,GAAG,QAAQ,QAAQ,aAAa;;CAGnF,MAAM,cAAc,OAAO,SAAiC,SAAkB;EAC5E,MAAM,UAAmB,MAAM,QAAQ,SAAS,cAAc,IAAI;EAElE,IAAI,YAAY,eAAe,MAAM,QAAQ,QAAQ,WAAW,KAAK,CAAC,CAAC,GAAG,cAAc;EACxF,IAAI,YAAY,YAAY,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;EACnF,IAAI,YAAY,eAAe,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;EACzF,IAAI,YAAY,MAAM,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,GAAG,cAAc;CAChF;;CAGA,MAAM,YAAY,QAAgB,WAChC,KAAK,IAAI,QAAQ,KAAK,IAAI,GAAG,OAAO,gBAAgB,IAAI,GAAG,CAAC;CAE9D,MAAM,gBACJ,MACA,SACA,QACA,YACsC;EACtC,MAAM,WAAW,YAAY;GAC3B,kBAAkB,IAAI;GACtB,MAAM,QAAQ,MAAM,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;EAClD;EAEA,OAAO,YAAY,KAAA,IACf,SAAS,CAAC,CAAC,WAAW,KAAA,CAAS,IAC/B,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;CAC1C;CAEA,MAAM,SAA0B,QAAQ,QAAQ,SAAS,QAAQ,kBAC/D,SAAS,YAAY;EACnB,MAAM,EAAE,SAAS,QAAQ,aAAa,CAAC,CAAC;EAExC,MAAM,QAAQ,MAAM,YAClB,QACA,SACC,YAAY,aAAa,MAAM,SAAS,QAAQ,OAAO,GACxD,QACA,aACF;EAEA,OAAO,MAAM;EAEb,IAAI,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,GAAG,SAAS;EAE5E,OAAO;GAAE,KAAK,QAAQ,aAAa;GAAG;EAAM;CAC9C,CAAC;CAEH,MAAM,sBAAsB,OAC1B,QACA,WACoB;EACpB,MAAM,EAAE,SAAS,QAAQ,CAAC,CAAC;EAE3B,MAAM,YAAY,QAAQ,SAAS,YAAY,aAAa,MAAM,SAAS,MAAM,CAAC;EAClF,OAAO,MAAM;EAEb,OAAO,QAAQ;CACjB;;;;;;CAOA,MAAM,oBAAoB,OACxB,QACA,OACA,WACG;EACH,IAAI,OAAO,WAAW,UAAU,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;EAC1F,MAAM,EAAE,OAAO,UAAU,QAAQ;EAEjC,IAAI,UAAU,MAAM,KAAK,UAAU,GACjC,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;EAC5D,MAAM,MAAM,MAAM,QAAQ,cAAc,MAAM,IAAI;EAElD,IAAI;GACF,OAAO,MAAM;GAEb,MAAM,OAAO,WACX,OAAO,OAAO,EAAE,MAAM,OAAO,OAAO,EAAE,QAAQ,OAAO,IAAI,CAAC,EAAE,CAAC,GAC7D,MAAM,IAAI,KAAK,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAChD;GAEA,MAAM,UAAU,WACd,OAAO,OAAO,EAAE,SAAS,OAAO,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,OAAO,YAAY,EAAE,CAAC,EAAE,CAAC,GACjF,MAAM,IAAI,KAAK,wBAAwB;IAAE,QAAQ,KAAK,KAAK;IAAQ,UAAU;GAAO,CAAC,CACvF;GAEA,OAAO,MAAM;GACb,MAAM,SAAS,QAAQ,QAAQ;GAE/B,IAAI,QAAQ,QAAQ,WAAW,KAAK,WAAW,KAAA,GAC7C,MAAM,QACJ,QAAQ,QAAQ,WAAW,IAAI,QAAQ,SAAS,KAAK,CAAC,CAAC,IAAI,QAAQ,UAAU,KAAK,CAAC,CAAC,GACpF,cACF;GACF,OAAO,SAAS;GAChB,MAAM,IAAI,KAAK,yBAAyB;IAAE,OAAO,CAAC,GAAG,KAAK;IAAG;GAAO,CAAC;EACvE,UAAU;GACR,MAAM,kBAAkB,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;EACtD;CACF;CAEA,MAAM,mBACJ,KACA,eACA,QACA,QACA,YAEA,SAAS,YAAY;EACnB,MAAM,EAAE,OAAO,UAAU,QAAQ,MAAM;EACvC,MAAM,SAAS;GAAE;GAAS,WAAW,UAAU,MAAM,KAAK,UAAU;EAAE;EAEtE,OAAO,SAAS;EAChB,mBAAmB,IAAI,MAAM,IAAI,MAAM;EACvC,QAAQ,WAAW,MAAM,MAAM,EAAE;EAGjC,MAAM,UAAU,SAAS,YAAY;GACnC,IAAI;IACF,MAAM,MAAM,KAAK,KAAK;KAAE,WAAW;KAAoB,SAAS;IAAc,CAAC;GACjF,SAAS,OAAO;IAEd,IAAI,eAAe,KAAK,GAAG,MAAM,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,GAAG,SAAS;IAC5E,MAAM;GACR,UAAU;IAER,IAAI,mBAAmB,IAAI,MAAM,EAAE,MAAM,QAAQ;KAC/C,mBAAmB,OAAO,MAAM,EAAE;KAClC,QAAQ,WAAW,IAAI,MAAM,EAAE;IACjC;GACF;GAGA,OAAO,QAAQ,QAAQ,MAAM,KAAK,CAAC;EACrC,CAAC;EAGD,QAAa,YAAY,CAAC,CAAC;EAE3B,OAAO;GACL,QAAQ,MAAM;GACd,WAAW,OAAO;GAClB;GACA,OAAO,YAAY,SAAS,YAAY,gBACtC,SAAS,YAAY;IACnB,OAAO,uBACL,YACA,SACA,YACA,YAAY;KACV,MAAM,MAAM,MAAM,QAAQ,cAAc,MAAM,IAAI;KAElD,OAAO;MACL,MAAM,YAAY;OAChB,MAAM,IAAI,KAAK,kBAAkB;MACnC;MACA,aAAa,IAAI,OAAO;KAC1B;IACF,GACA,WACF;GACF,CAAC;EACL;CACF,CAAC;CAEH,MAAM,QAAwB,QAAQ,OAAO,QAAQ,QAAQ,kBAC3D,SAAS,YAAY;EACnB,MAAM,oBACJ,QACA,SACC,YAAY,YAAY,SAAS,KAAK,IACtC,YAAY,QAAQ,KAAK,OAAO,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC,GAC7D,QACA,aACF;EACA,OAAO,MAAM;EAEb,OAAO,QAAQ,aAAa;CAC9B,CAAC;;;;;;;;CASH,MAAM,YAAgC,QAAQ,OAAO,QAAQ,QAAQ,cAAc,YACjF,SAAS,YAAY;EACnB,MAAM,EAAE,SAAS,OAAO,UAAU,MAAM,YAAY,QAClD,QACA,QACA,QACA,OACA,KAAA,GACA,IACF;EAEA,MAAM;EACN,IAAI,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,GAAG,cAAc;EACjF,IAAI;EACJ,IAAI;EAEJ,IAAI,MAAM,YAAY,KAAA,GAAW;GAC/B,MAAM,WAAW,MAAM,YAAY,cACjC,QACA,MAAM,SACN,SACA,QACA,IACF;GAEA,MAAM,YAAY;IAChB,MAAM,SAAS,MAAM,QAAQ,aAAa,SAAS,SAAS,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;IACxF,MAAM,WAAW,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC,KAAK;IAE3C,IACE,OAAO,WAAW,SAAS,UAC3B,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,MAAM,UAAU,SAAS,EAAE,GAEtD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,SAAS;GACnD;EACF,OAAO,IAAI,MAAM,YAAY,KAAA,GAAW;GACtC,IAAI,MAAM,YAAY,KAAA,GACpB,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;GAC5D,IAAI,MAAM,YAAY,MAAM,SAAS;IACnC,IAAI,CAAC,MAAM,WAAW,MAAM,cAAc,SACxC,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;IAC5D,MAAM,YAAY,OAAO;IACzB,MAAM,YAAY;KAChB,QAAQ,MAAM,aAAa,QAAQ,CAAC,CAAC,MAAM,MAAM,SAAS,QAAQ,OAAO;IAC3E;GACF;EACF,OAAO;GACL,MAAM,OAAO,MAAM,SAAS;GAE5B,MAAM,YAAY,SAAS,IAAI;GAC/B,MAAM,YAAY;IAChB,MAAM,QAAQ,KAAK,MAAM,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;IACrD,MAAM,QACJ,QAAQ,UAAU,SAAS;KACzB,IAAI,gBAAgB,eAAe,KAAK,cAAc,kBAAkB,MACtE,KAAK,KAAK;IACd,CAAC,GACD,SAAS,QAAQ,GAAI,GACrB,KAAA,CACF;GACF;EACF;EACA,MAAM;EACN,OAAO,MAAM;EACb,IAAI,QAAQ,KAAA,GAAW;GAErB,OAAO,SAAS;GAChB,MAAM,IAAI;GACV,IAAI,eAAe,GACjB,MAAM,QACJ,QAAQ,SAAS,cAAc,YAAY,GAC3C,SAAS,QAAQ,eAAe,GAAG,GACnC,KAAA,CACF;EACJ;EACA,MAAM,QAAQ,MAAM,QAAQ,eAAe,OAAO,GAAG,SAAS,QAAQ,GAAI,GAAG,KAAA,CAAS;EAEtF,OAAO,MAAM;EAEb,OAAO;GACL,QAAQ,QAAQ,KAAA,IAAY,cAAc;GAC1C,SACE,MAAM,YAAY,KAAA,KAAa,UAAU,KAAA,KAAa,aAAa,OAAO,MAAM,OAAO;GACzF;GACA,KAAK,QAAQ;GACb,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;EACzC;CACF,CAAC;;CAGH,MAAM,cAAoC,QAAQ,QAAQ,SAAS,WACjE,SAAS,YAAY;EACnB,MAAM,EAAE,SAAS,QAAQ,CAAC,CAAC;EAE3B,MAAM,QAAQ,MAAM,oBAClB,QACA,SACC,YAAY,YAAY,OAAO,IAC/B,YAAY,aAAa,MAAM,SAAS,QAAQ,OAAO,GACxD,QACA,KAAA,GACA,IACF;EAEA,OAAO,MAAM;EAEb,IAAI,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,GAAG,SAAS;EAE5E,OAAO;GAAE,KAAK,QAAQ;GAAG;EAAM;CACjC,CAAC;CAEH,MAAM,gBAAwC,QAAQ,SAAS,QAAQ,WACrE,SAAS,YAAY;EACnB,MAAM,oBACJ,QACA,SACC,YAAY,YAAY,cAAc,QAAQ,SAAS,SAAS,MAAM,GACvE,OAAO,SAAS,aAAa;GAE3B,MAAM,SAAS,MAAM,QAAQ,aAAa,SAAS,SAAS,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;GACxF,MAAM,WAAW,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC,KAAK;GAE3C,IACE,OAAO,WAAW,SAAS,UAC3B,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,MAAM,UAAU,SAAS,EAAE,GAEtD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,SAAS;EACnD,GACA,MACF;EACA,OAAO,MAAM;EAEb,OAAO,QAAQ;CACjB,CAAC;CAEH,MAAM,UAA4B,QAAQ,QAAQ,QAAQ,WACxD,SAAS,YAAY;EACnB,MAAM,EAAE,UAAU,QAAQ,MAAM;EAEhC,OAAO,SAAS;EAChB,MAAM,MAAM,UACT,EAAE,GAAG,QAAQ,OAAO,SAAS;GAAE,MAAM;GAAG,KAAK;GAAG,UAAU;EAAU,CAAC,GACtE;GAAE,GAAG;GAAQ,GAAG;EAAO,CACzB;EACA,OAAO,MAAM;EAEb,OAAO,QAAQ,MAAM;CACvB,CAAC;CAEH,IAAI,wBAAwB;CAE5B,IAAI;;CAKJ,MAAM,UACJ,QACA,QACA,YAKkB;EAClB,OAAO,MAAM;EACb,MAAM,EAAE,OAAO,UAAU,QAAQ,MAAM;EACvC,MAAM,QAAQ,QAAQ,QAAQ,KAAK;EACnC,MAAM,WAAW,QAAQ;EACzB,MAAM,UAAU;GAAE;GAAO;GAAO;EAAO;EAEvC,cAAc;EAEd,MAAM,cAAc;GAClB,OAAO,MAAM;GACb,MAAM,WAAW,QAAQ,MAAM;GAE/B,IACE,yBACA,SAAS,UAAU,SACnB,SAAS,UAAU,SACnB,QAAQ,QAAQ,KAAK,MAAM,OAE3B,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GACtD,SAAS,QAAQ;EACnB;EAEA,OAAO,SAAS,YAAY;GAC1B,IAAI;IACF,IAAI;KACF,MAAM;KACN,MAAM,SAAS,KAAK;KACpB,MAAM;IACR,SAAS,OAAO;KAEd,MAAM;KACN,IAAI,eAAe,KAAK,GAAG,MAAM,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,GAAG,cAAc;KACjF,MAAM;IACR;GACF,UAAU;IACR,IAAI;KAEF,MAAM,SAAS,QAAQ;KACvB,OAAO,OAAO;IAChB,UAAU;KACR,IAAI,gBAAgB,SAAS,cAAc,KAAA;IAC7C;GACF;GACA,MAAM;EACR,CAAC;CACH;CAEA,MAAM,WAA8B,UAAU,OAAO,QAAQ,WAC3D,OAAO,QAAQ,cAAc;EAC3B,MAAM,EAAE,UAAU,QAAQ,MAAM;EAChC,IAAI;EAEJ,OAAO;GACL,MAAM,YAAY;IAChB,OAAO,MAAM,MAAM,gBAAgB,UAAU;KAC3C;KACA,QAAQ;KACR,SAAS,QAAQ,MAAM;KACvB,QAAQ,OAAO;IACjB,CAAC;GACH;GACA,SAAS,YAAY;IACnB,IAAI,CAAC,uBAAuB,MAAM,MAAM,QAAQ;GAClD;EACF;CACF,CAAC;CAEH,MAAM,kBAA4C,WAAW,OAAO,QAAQ,WAC1E,OAAO,QAAQ,cAAc;EAC3B,MAAM,SAAS,YAAY,MAAM,WAAW,MAAM;;EAGlD,MAAM,WAAW,YAAY;GAC3B,OAAO,MAAM;GAEb,MAAM,UAAU,MAAM,OAAO,QAC1B,UAAU,SAAS,KAAK,eAAe,KAAK,kBAAkB,QAAQ,CAAC,CACvE,YAAY,KAAK;GAEpB,OAAO,MAAM;GACb,IAAI,YAAY,MAAM,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAC5E;EAEA,OAAO;GACL,OAAO,OAAO;GACd,MAAM,YAAY;IAChB,IAAI;KACF,MAAM,OAAO,QAAQ,oBAAoB,OAAO;MAC9C,SAAS,QAAQ,MAAM;MACvB,QAAQ,OAAO;KACjB,CAAC;IACH,SAAS,OAAO;KAId,IAAI,UAAU,YAAY,EAAE,eAAe,KAAK,KAAK,OAAO,OAAO,UACjE,MAAM,SAAS;KACjB,MAAM;IACR;IAEA,IAAI,UAAU,UAAU,MAAM,SAAS;GACzC;GACA,SAAS,OAAO;EAClB;CACF,CAAC;CAEH,MAAM,gBAAwC,QAAQ,QAAQ,YAC5D,SAAS,YAAY;EACnB,MAAM,EAAE,OAAO,UAAU,QAAQ;EAEjC,MAAM,WAAW,WACd,OAAO,MAAM,KAAK,GAAG,kBAAkB,EAAE,IACzC,QAAQ,MAAM,KAAK,IAAI,kBAAkB,GAAG,GAC7C,SACC,iBAAiB,iBAAiB,KACrC;EAEA,IAAI;GACF,MAAM,UAAU,MAAM,MAAM,QAAQ,QAAQ,OAAO;GAEnD,MAAM,SAAS;GACf,MAAM,MAAM,iBAAiB,oBAAoB,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;GAC7E,OAAO,MAAM;GAEb,OAAO;IAAE,KAAK,QAAQ;IAAG,OAAO,QAAQ;GAAM;EAChD,UAAU;GACR,SAAS,OAAO;EAClB;CACF,CAAC;CAEH,MAAM,oBAAgD,QAAQ,WAC5D,SAAS,YAAY;EACnB,MAAM,OAAO,QAAQ,CAAC,CAAC,MAAM;EAE7B,MAAM,WAAW,WACd,OAAO,KAAK,GAAG,YAAY,EAAE,IAC7B,QAAQ,KAAK,IAAI,YAAY,GAAG,GACjC,MACF;EAEA,IAAI;GACF,MAAM,oBAAoB,QAAQ,MAAM;GACxC,MAAM,WAAW,MAAM,SAAS;GAEhC,MAAM,WAAW,WAAW,cAAc,SAAS,kBAAkB,CAAC;GAEtE,MAAM,QAAQ,MAAM,SAAS,QAAQ;GAErC,OAAO,MAAM;GAEb,OAAO;IACL,YAAY,mBAAmB,EAAE;IACjC;IACA,OAAO,UAAU,OAAO,cAAc;GACxC;EACF,UAAU;GACR,SAAS,OAAO;EAClB;CACF,CAAC;CAEH,MAAM,eAAsC,QAAQ,OAAO,WACzD,SAAS,YAAY;EACnB,MAAM,YAAY,gBAAgB,KAAK;EAEvC,IAAI,UAAU,SAAS,UAAU,MAAM,kBAAkB,QAAQ,UAAU,OAAO,MAAM;OAEtF,MAAM,YAAY,QAAQ,SAAS,YACjC,QAAQ,cAAc,UAAU,SAAS,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC,CACvE;EACF,OAAO,MAAM;EAEb,OAAO,QAAQ;CACjB,CAAC;CAEH,MAAM,yBAA0D,QAAQ,OAAO,WAC7E,SAAS,YAAY;EACnB,MAAM,YAAY,gBAAgB,KAAK;EAIvC,IAAI,UAAU,SAAS,UAAU,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc;EAC3F,MAAM,OAAO,QAAQ,CAAC,CAAC,MAAM;EAE7B,MAAM,WAAW,WACd,OAAO,KAAK,GAAG,eAAe,EAAE,IAChC,QAAQ,KAAK,IAAI,eAAe,GAAG,GACpC,MACF;EAEA,IAAI;GACF,MAAM,oBAAoB,QAAQ,MAAM;GACxC,MAAM,UAAU,MAAM,SAAS;GAE/B,OAAO,MAAM;GACb,IAAI,CAAC,QAAQ,WAAW,KAAK,UAAU,QAAQ,SAAS,GACtD,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC;GAE5C,MAAM,QAAQ,SAAS,UAAU,SAAS,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;GACtE,OAAO,MAAM;GAEb,OAAO,QAAQ;EACjB,UAAU;GACR,SAAS,OAAO;EAClB;CACF,CAAC;CAEH,OAAO;EACL;EACA;EACA;;EAEA,eAAe,WAAmB;GAChC,MAAM,SAAS,mBAAmB,IAAI,MAAM;GAE5C,OAAO,QAAQ,cAAc,OAAO,OAAO,SAAS,aAAa,IAAI,KAAA;EACvE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc,OAAc,UAAkB;GAC5C,MAAM,UAAU;GAEhB,IACE,SAAS,UAAU,UAClB,UAAU,KAAA,KAAa,UAAU,QAAQ,SAAS,UAAU,MAAM,KAAK,UAAU,IAElF,QAAQ,OAAO,WAAW;EAC9B;EACA,kBAAkB;GAChB,wBAAwB;GACxB,aAAa,OAAO,WAAW;GAC/B,aAAa,OAAO,OAAO;GAC3B,cAAc,KAAA;EAChB;EACA;EACA;EACA;EACA;CACF;AACF;;;;;;;;;ACz7BA,IAAa,gBAAb,MAA2B;CACzB,0BAA2B,IAAI,IAAmB;CAClD,UAAkB;CAClB,UAAkB;CAElB;CACA;CAEA,YAAY,UAAkB,SAAqD;EACjF,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,GAChD,MAAM,IAAI,WAAW,2BAA2B;EAClD,KAAK,WAAW;EAChB,KAAK,UAAU;CACjB;CAEA,MAAc,aAAwC;EACpD,IAAI,KAAK,WAAW,KAAK,SAAS;EAClC,KAAK,UAAU;EACf,KAAK,QAAQ,WAAW;CAC1B;CAEA,OACE,QACA,cAAmC,gBAC1B;EACT,IAAI,KAAK,WAAW,KAAK,SAAS,OAAO;EACzC,IAAI,KAAK,QAAQ,QAAQ,KAAK,UAAU;GACtC,IAAI,gBAAgB,gBAAgB,KAAK,MAAM,gBAAgB;GAE/D,OAAO;EACT;EAEA,MAAM,OAAO,QAAQ,QAAQ,CAAC,CAC3B,KAAK,MAAM,CAAC,CACZ,WACO,CAAC,SACD;GACJ,IAAI,gBAAgB,gBAAgB,KAAK,MAAM,SAAS;EAC1D,CACF,CAAC,CACA,cAAc,KAAK,QAAQ,OAAO,IAAI,CAAC;EAE1C,KAAK,QAAQ,IAAI,IAAI;EAErB,OAAO;CACT;CAEA,OAAa;EACX,KAAK,UAAU;CACjB;CAEA,MAAM,SAAwB;EAC5B,MAAM,QAAQ,IAAI,KAAK,OAAO;CAChC;AACF;;;;;;;ACzCA,MAAa,sBAAsB,YAAqB;CACtD,MAAM,EAAE,SAAS,SAAS,YAAY;CACtC,MAAM,kCAAkB,IAAI,IAAiC;CAE7D,MAAM,cAAc,OAAc,QAA6B,UAAwB;EACrF,MAAM,WAAW,gBAAgB,IAAI,MAAM,EAAE;EAE7C,IAAI,aAAa,KAAA,GAAW;EAC5B,MAAM,iBAAiB,UAAU,KAAA,IAAY,KAAA,IAAY,QAAQ,KAAK;EACtE,MAAM,cAAc,QAAQ,MAAM,KAAK,UAAU,CAAC;EAGlD,KAAK,MAAM,WAAW,CAAC,GAAG,QAAQ,GAAG;GACnC,IACE,UAAU,KAAA,KACV,mBAAmB,eACnB,mBAAmB,QAAQ,SAE3B;GAGF,IACE,UAAU,KAAA,KACV,QAAQ,aAAa,KAAA,KACrB,WAAW,oBACX,mBAAmB,eACnB,QAAQ,YAAY,aAGpB,QAAQ,SAAS,MAAM,IAAI,GAAG,KAAK;QAChC,QAAQ,WAAW,MAAM;EAChC;CACF;CAEA,MAAM,yBAAyB,OAAc,UAAuB;EAClE,MAAM,WAAW,gBAAgB,IAAI,MAAM,EAAE;EAE7C,IAAI,aAAa,KAAA,KAAa,UAAU,MAAM,KAAK,UAAU,GAAG;EAChE,KAAK,MAAM,WAAW,UACpB,IAAI,QAAQ,YAAY,QAAQ,KAAK,GAAG,QAAQ,WAAW,MAAM,IAAI,GAAG,IAAI;CAChF;CAEA,MAAM,UAAU,UAAiB;EAC/B,MAAM,WAAW,gBAAgB,IAAI,MAAM,EAAE;EAE7C,IAAI,aAAa,KAAA,GAEf,KAAK,MAAM,WAAW,CAAC,GAAG,QAAQ,GAAG,QAAQ,WAAW,eAAe;EACzE,gBAAgB,OAAO,MAAM,EAAE;CACjC;CAEA,MAAM,cAAc;EAClB,gBAAgB,MAAM;CACxB;CAEA,MAAM,WAAW,WACf,SAAS,YAAY;EACnB,IAAI;EACJ,IAAI;EAEJ,IAAI,WAAW,KAAA,GAAW;GACxB,MAAM,iBAAiB,QAAQ;GAE/B,QAAQ,eAAe;GACvB,eAAe,eAAe;EAChC,OAAO;GACL,MAAM,YAAY,QAAQ,IAAI,OAAO,MAAM;GAE3C,IAAI,cAAc,KAAA,KAAa,UAAU,KAAK,SAAS,GACrD,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;GACzD,IAAK,MAAM,QAAQ,SAAS,SAAS,MAAO,OAAO,UACjD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GACtD,QAAQ;GACR,eAAe,MAAM,KAAK,UAAU;EACtC;EACA,MAAM,OAAO,MAAM;EACnB,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK;EAC7C,MAAM,iBAAiB,QAAQ,YAAY;EAG3C,IAAI,KAAK,eAAe,KAAA,GAAW,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC;EAC7E,IAAI;EACJ,IAAI;EA2CJ,OAAO;GAAE,QAAQ,MAAM;GAAI;GAAU,SAAS;GAAgB,QAAA;IAxC5D,QAAQ,EAAE,SAAS,SAAS,MAAM,YAAY,QAAQ,eACpD,SAAS,YAAY;KACnB,aAAa,gBAAgB,IAAI,MAAM,EAAE,qBAAK,IAAI,IAAoB;KACtE,gBAAgB,IAAI,MAAM,IAAI,UAAU;KACxC,UAAU;MACR,SAAS;MACT;MACA,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;KAC/C;KACA,WAAW,IAAI,OAAO;KAEtB,SAAS,aAAa,IAAI,CAAC;KAC3B,MAAM,KAAK,WAAW,MAAM;MAC1B;MACA,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;MACrC,UAAU,UAAuB;OAC/B,QAAQ,KAAK;MACf;KACF,CAAC;IACH,CAAC;IACH,YACE,SAAS,YAAY;KAEnB,IAAI,KAAK,SAAS,GAAG;KACrB,IAAI;MACF,MAAM,KAAK,WAAW,KAAK;KAC7B,SAAS,OAAO;MAEd,IAAI,CAAC,KAAK,SAAS,GAAG,MAAM;KAC9B;IACF,CAAC;IACH,eAAe;KACb,IAAI,YAAY,KAAA,KAAa,eAAe,KAAA,GAAW;MACrD,WAAW,OAAO,OAAO;MACzB,UAAU,KAAA;MACV,IAAI,WAAW,SAAS,GAAG,gBAAgB,OAAO,MAAM,EAAE;KAC5D;IACF;GAGiE;EAAE;CACvE,CAAC;CAEH,OAAO;EAAE;EAAY;EAAuB;EAAQ;EAAO;CAAQ;AACrE;;;AChJA,MAAM,iBAAiB,OAAO,OAAO,EACnC,SAAS,OAAO,OAAO;CACrB,IAAI,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC;CAC5C,UAAU,OAAO,eAAe,MAAM,OAAO,YAAY,GAAG,CAAC;CAC7D,QAAQ,OAAO,OAAO,MAAM,OAAO,YAAY,IAAI,CAAC;CACpD,SAAS,OAAO,YAAY,OAAO,OAAO;EAAE,WAAW,OAAO;EAAS,SAAS;CAAW,CAAC,CAAC;AAC/F,CAAC,EACH,CAAC;AAED,MAAM,mBAAmB,OAAO,OAAO,EAAE,oBAAoB,OAAO,IAAI,CAAC;AACzE,MAAM,iBAAiB,OAAO,OAAO,EAAE,YAAY,OAAO,OAAO,EAAE,UAAU,WAAW,CAAC,EAAE,CAAC;AAE5F,MAAM,OAAO,OAAO,OAAO;CACzB,MAAM;CACN,UAAU,OAAO,IAAI,MAAM,OAAO,UAAU;EAAE,SAAS;EAAG,SAAS,OAAO;CAAiB,CAAC,CAAC;CAC7F,OAAO,OAAO,OAAO,MAAM,OAAO,YAAY,OAAW,CAAC;AAC5D,CAAC;AAeD,MAAM,SAAS,MAAc,WAC3B,oBAAoB,KAAK;CAAE,WAAW;CAAY;CAAM;AAAO,CAAC;;;;;;AAOlE,MAAM,cACJ,YACA,gBACA,aACW;uBACU,KAAK,UAAU,UAAU,EAAE;2BACvB,KAAK,UAAU,cAAc,EAAE;;wBAElC,KAAK,UACzB,SAAS,KAAK,EAAE,MAAM,eAAe,eAAe,qBAAqB;CACvE;CACA,SAAS,gBAAgB;CACzB;CACA;AACF,EAAE,CACJ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0HJ,MAAa,sBACX,SAEA,iBACA,UACA,UACG;CACH,MAAM,WAAW,gBAAgB,WAAW,KAAK,EAAE;CACnD,MAAM,aAAa,0BAA0B;CAC7C,MAAM,iBAAiB,2BAA2B;CAClD,MAAM,SAAS,WAAW,YAAY,gBAAgB,QAAQ;CAC9D,MAAM,SAAS,IAAI,IAAI,SAAS,KAAK,YAAY,CAAC,QAAQ,MAAM,OAAO,CAAC,CAAC;CACzE,MAAM,0BAAU,IAAI,IAAgC;CACpD,MAAM,mCAAmB,IAAI,IAA8B;CAC3D,MAAM,4BAAY,IAAI,QAAsB;CAE5C,MAAM,iBAAiB,KAAK,SAAS,QAAQ,KAAK,YAAY,MAAM,QAAQ,eAAe,CAAC;CAC5F,IAAI,UAAU;CACd,IAAI,UAAU;CACd,IAAI;CAEJ,MAAM,cAAc;EAClB,UAAU;CACZ;CAEA,MAAM,SAAS,OAAO,SAAuB,SAA8B;EACzE,IAAI,WAAW,KAAK,SAAS,KAAK,UAAU,IAAI,OAAO,GAAG;EAC1D,UAAU,IAAI,OAAO;EACrB,IAAI;EACJ,IAAI,WAAW;EAEf,IAAI;GACF,IAAI;IACF,MAAM,MAAM,QAAQ,cAAc,OAAO;GAC3C,SAAS,OAAO;IAId,IACE,YAAY,QACZ,iBAAiB,SACjB,MAAM,QAAQ,SAAS,iDAAiD,GAExE;IACF,IACE,KAAK,SAAS,KACb,YAAY,QAAQ,gBAAgB,WAAW,QAAQ,WAAW,GAEnE;IACF,MAAM;GACR;GACA,MAAM,SAAS;GAEf,MAAM,WAAW,WAAW,gBAAgB,MAAM,OAAO,KAAK,sBAAsB,CAAC,CAAC,CACnF,WAAW;GAEd,IAAI,WAAW,KAAK,SAAS,KAAK,QAAQ,IAAI,QAAQ,GAAG;GACzD,IAAI,QAAQ,QAAQ,KAAK,MAAM,MAAM,YAAY,MAAM;GACvD,MAAM,4BAAY,IAAI,IAA8B;GAEpD,MAAM,WAAW,QAAiB;IAChC,MAAM,SAAS,OAAO,oBAAoB,cAAc,CAAC,CAAC,GAAG;IAE7D,IAAI,OAAO,SAAS,QAAQ;IAC5B,MAAM,QAAQ,OAAO,MAAM;IAE3B,IAAI,WAAW,MAAM,SAAS,cAAc,MAAM;IAGlD,IAFc,UAAU,IAAI,MAAM,EAE1B,CAAC,EAAE,aAAa,MAAM,UAAU;IACxC,MAAM,WAAW,iBAAiB,IAAI,MAAM,QAAQ,OAAO;IAE3D,IAAI,aAAa,KAAA,GAAW;KAC1B,MAAM,oBAAoB,QAAQ,IAAI,SAAS,QAAQ,CAAC,EAAE;KAE1D,IAAI,mBAAmB,IAAI,SAAS,EAAE,MAAM,UAC1C,kBAAkB,OAAO,SAAS,EAAE;KACtC,iBAAiB,OAAO,MAAM,QAAQ,OAAO;IAC/C;IACA,IAAI,UAAU,QAAQ,OAAO,CAAC,UAAU,IAAI,MAAM,EAAE,GAAG;KACrD,MAAM;KAEN;IACF;IACA,MAAM,WAAW;KAAE,GAAG;KAAO,UAAU;KAAG;IAAS;IAInD,iBAAiB,IAAI,MAAM,QAAQ,SAAS,QAAQ;IACpD,UAAU,IAAI,MAAM,IAAI,QAAQ;GAClC;GAEA,MAAM,aAAa,QAAiB;IAClC,MAAM,SAAS,OAAO,oBAAoB,gBAAgB,CAAC,CAAC,GAAG;IAE/D,IAAI,OAAO,SAAS,QAAQ;KAC1B,MAAM,WAAW,UAAU,IAAI,OAAO,MAAM,kBAAkB;KAC9D,MAAM,UAAU,UAAU,SAAS;KAEnC,IAAI,YAAY,KAAA,KAAa,iBAAiB,IAAI,OAAO,MAAM,UAC7D,iBAAiB,OAAO,OAAO;KACjC,UAAU,OAAO,OAAO,MAAM,kBAAkB;IAClD;GACF;GAEA,MAAM,gBAAgB;IACpB,KAAK,MAAM,YAAY,UAAU,OAAO,GAAG;KACzC,MAAM,UAAU,SAAS,SAAS;KAElC,IAAI,YAAY,KAAA,KAAa,iBAAiB,IAAI,OAAO,MAAM,UAC7D,iBAAiB,OAAO,OAAO;IACnC;IACA,UAAU,MAAM;GAClB;GAEA,MAAM,UAAU,UAIV;IACJ,IAAI,WAAW,MAAM,SAAS,cAAc,WAAW,gBAAgB;IACvE,MAAM,WAAW,UAAU,IAAI,MAAM,kBAAkB;IAEvD,IAAI,aAAa,KAAA,KAAa,MAAM,QAAQ,SAAS,SAAuB;IAC5E,MAAM,SAAS,OAAO,aAAa,OAAO,eAAe,IAAI,CAAC,CAAC,CAAC,MAAM,OAAO;IAE7E,IAAI,OAAO,SAAS,QAAQ;IAC5B,MAAM,OAAO,OAAO;IACpB,MAAM,UAAU,OAAO,IAAI,KAAK,IAAI;IAEpC,IAAI,YAAY,KAAA,KAAa,KAAK,YAAY,SAAS,UAAU;IACjE,SAAS,WAAW,KAAK;IACzB;IACA,IAAI,UAAU;IAEd,MAAM,QAAQ,OAAO,WAAwB;KAC3C,MAAM,gBAAgB;MACpB,IAAI,WAAW,WAAW,OAAO,WAAW,KAAK,SAAS,GACxD,MAAM,MAAM,QAAQ,MAAM,QAAQ;MACpC,IACE,UAAU,IAAI,SAAS,EAAE,MAAM,YAC/B,iBAAiB,IAAI,SAAS,SAAS,WAAW,EAAE,MAAM,UAE1D,MAAM,MAAM,QAAQ,MAAM,OAAO;MACnC,IAAI,CAAC,QAAQ,QAAQ,SAAS,SAAS,MAAM,GAAG,MAAM,MAAM,QAAQ,MAAM,QAAQ;KACpF;KAEA,QAAQ;KAER,MAAM,SAAS,MAAM,OAAO,KAAK,oBAAoB;MACnD,YAAY;MACZ,iBAAiB,SAAS;MAC1B,eAAe;MACf,QAAQ;MACR,SAAS,QAAQ;KACnB,CAAC;KAED,QAAQ;KACR,IAAI,OAAO,qBAAqB,KAAA,KAAa,OAAO,OAAO,UAAU,MACnE,MAAM,MAAM,QAAQ,MAAM,OAAO;IACrC;IAEA,MAAM,QAAQ,OACZ,WACG;KACH,IACE,WACA,KAAK,SAAS,KACd,UAAU,IAAI,SAAS,EAAE,MAAM,YAC/B,iBAAiB,IAAI,SAAS,SAAS,WAAW,EAAE,MAAM,UAE1D;KACF,MAAM,OAAO,KAAK,oBAAoB;MACpC,YAAY,cAAc,KAAK,UAAU,cAAc,EAAE,aAAa,KAAK,SAAS,GAAG,KAAK,UAAU,MAAM,EAAE;MAC9G,iBAAiB,SAAS;MAC1B,eAAe;MACf,QAAQ;MACR,SAAS,QAAQ;KACnB,CAAC;IACH;IAIA,QACG,OAAO;KACN,MAAM,OAAO,WAAW;MAGtB,MAAM,MAAM,MAAM;MAElB,OAAO,KAAK;KACd;KACA;KACA,SAAS,YAAY;MACnB,UAAU;KACZ;IACF,CAAC,CAAC,CACD,MACE,SAAS,MAAM;KAAE,IAAI;KAAM;IAAK,CAAC,SAC5B,MAAM,EAAE,IAAI,MAAM,CAAC,CAC3B,CAAC,CACA,YAAY,CAAC,CAAC,CAAC,CACf,cAAc;KACb;IACF,CAAC;GACL;GAEA,MAAM,YAAY;IAChB,OAAO,IAAI,mCAAmC,OAAO;IACrD,OAAO,IAAI,qCAAqC,SAAS;IACzD,OAAO,IAAI,oCAAoC,OAAO;IACtD,OAAO,IAAI,yBAAyB,MAAM;IAC1C,QAAQ;GACV;GAEA,MAAM,SAA6B;IAAE,KAAK;IAAQ;IAAW;IAAM;IAAK,QAAQ;GAAM;GAEtF,MAAM,iBAAiB;IACrB,OAAO,SAAS;IAChB,IAAI;IACJ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,QAAQ,OAAO,QAAQ;IAC7D,OAAO,IAAI,SAAS,QAAQ;GAC9B;GAEA,OAAO,GAAG,SAAS,QAAQ;GAC3B,QAAQ,IAAI,UAAU,MAAM;GAC5B,WAAW;GACX,OAAO,GAAG,mCAAmC,OAAO;GACpD,OAAO,GAAG,qCAAqC,SAAS;GACxD,OAAO,GAAG,oCAAoC,OAAO;GACrD,OAAO,GAAG,yBAAyB,MAAM;GACzC,MAAM,OAAO,KAAK,gBAAgB;GAClC,IAAI,SAAS;GACb,MAAM,OAAO,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAC;GAC5D,IAAI,SAAS;IACX,MAAM,OAAO,KAAK,yBAAyB,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAE/E;GACF;GAEA,KAAK,MAAM,YAAY,UAAU,OAAO,GAAG;IACzC,IAAI,SAAS;IAEb,MAAM,YAAY,MAAM,OAAO,KAAK,oBAAoB;KACtD,YAAY,GAAG,OAAO,eAAe,KAAK,UAAU,cAAc,EAAE;KACpE,iBAAiB,SAAS;KAC1B,eAAe;KACf,QAAQ;KACR,SAAS;IACX,CAAC;IAED,IACE,UAAU,IAAI,SAAS,EAAE,MAAM,YAC/B,iBAAiB,IAAI,SAAS,SAAS,WAAW,EAAE,MAAM,UAE1D;IACF,IAAI,UAAU,qBAAqB,KAAA,KAAa,UAAU,OAAO,UAAU,SACzE,MAAM,oBAAoB,KAAK;KAC7B,WAAW;KACX,MAAM;KACN,QAAQ;IACV,CAAC;GACL;EACF,UAAU;GACR,UAAU,OAAO,OAAO;GACxB,IAAI,QAAQ,KAAA,MAAc,CAAC,YAAY,UAAU,MAAM,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;EACpF;CACF;CAEA,MAAM,gBAA+B;EACnC,MAAM;EACN,cAAc,YAAY;GACxB,MAAM,UAAU,MAAM,QAAQ,WAC5B,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,WAAW;IAC1C,MAAM,YAAY,CAAC,GAAG,OAAO,UAAU,OAAO,CAAC;IAE/C,OAAO,IAAI;IAEX,MAAM,UAAU,MAAM,QAAQ,WAAW,EACtC,YAAY;KACX,IAAI,CAAC,OAAO,UAAU,CAAC,OAAO,KAAK,SAAS,GAAG;MAC7C,KAAK,MAAM,YAAY,WACrB,MAAM,OAAO,IACV,KAAK,oBAAoB;OACxB,YAAY,cAAc,KAAK,UAAU,cAAc,EAAE;OACzD,iBAAiB,SAAS;OAC1B,eAAe;OACf,QAAQ;OACR,SAAS;MACX,CAAC,CAAC,CACD,YAAY,CAAC,CAAC;MAEnB,IAAI,CAAC,OAAO,QACV,MAAM,OAAO,IAAI,KAAK,yBAAyB,EAAE,MAAM,WAAW,CAAC;KACvE;IACF,EAAA,CAAG,CACL,CAAC;IAID,MAAM,YAAY,OAAO,UAAU,OAAO,KAAK,SAAS;IAExD,MAAM,aAAa,MAAM,QAAQ,WAAW,CAC1C,OAAO,SAAS,QAAQ,QAAQ,IAAI,OAAO,IAAI,OAAO,CACxD,CAAC;IAED,IAAI,CAAC,aAAa,QAAQ,MAAM,WAAW,OAAO,WAAW,UAAU,GACrE,MAAM,oBAAoB,KAAK;KAC7B,WAAW;KACX,MAAM;KACN,QAAQ;IACV,CAAC;IACH,IACE,CAAC,OAAO,UACR,CAAC,OAAO,KAAK,SAAS,KACtB,WAAW,MAAM,WAAW,OAAO,WAAW,UAAU,GAExD,MAAM,oBAAoB,KAAK;KAC7B,WAAW;KACX,MAAM;KACN,QAAQ;IACV,CAAC;GACL,CAAC,CACH;GAEA,QAAQ,MAAM;GACd,iBAAiB,MAAM;GACvB,IAAI,QAAQ,MAAM,WAAW,OAAO,WAAW,UAAU,GACvD,MAAM,oBAAoB,KAAK;IAC7B,WAAW;IACX,MAAM;IACN,QAAQ;GACV,CAAC;EACL,EAAA,CAAG;EAEH,OAAO;CACT;CAEA,OAAO;EAAE;EAAQ;EAAQ;EAAO;CAAQ;AAC1C;;;;;;;ACrfA,MAAa,sBACX,SACA,SACA,iBACA,SACA,WACA,QACA,YACG;CACH,MAAM,EAAE,SAAS,SAAS,YAAY;CACtC,MAAM,mCAAmB,IAAI,QAAuB;CACpD,MAAM,iCAAiB,IAAI,QAAuB;CAClD,MAAM,gBAA8B,CAAC;CACrC,IAAI,uBAAuB;CAC3B,IAAI;CAEJ,MAAM,uBAAuB,UAA+B;EAC1D,IAAI,QAAQ,KAAK,sBAAsB;EACvC,IAAI,QAAQ,mBAAmB,KAAA,GAC7B,OAAO,MAAM;GACX,QAAQ;GACR,QAAQ;GACR,aAAa,MAAM,WAAW,SAAS,mBAAmB;EAC5D,CAAC;OACE,QAAQ,eAAe,KAAK;CACnC;CAEA,MAAM,eAAe,WAAgC;EAiBnD,IAAI,CAhBa,UAAU,OAAO,YAAY;GAC5C,IAAI;IACF,MAAM,OAAO;GACf,SAAS,OAAO;IACd,oBACE,OAAO,GAAG,mBAAmB,CAAC,CAAC,KAAK,IAChC,QACA,oBAAoB,KAAK;KACvB,WAAW;KACX,MAAM;KACN,QAAQ;IACV,CAAC,CACP;GACF;EACF,GAAG,aAES,GACV,oBACE,oBAAoB,KAAK;GAAE,WAAW;GAAY,MAAM;GAAY,QAAQ;EAAO,CAAC,CACtF;CACJ;CAEA,MAAM,WACJ,QAAQ,aAAa,KAAA,KAAa,QAAQ,SAAS,WAAW,IAC1D,KAAA,IACA,mBAAmB,SAAS,iBAAiB,QAAQ,gBACnD,oBACE,oBAAoB,KAAK;EAAE,WAAW;EAAY,MAAM;EAAY,QAAQ;CAAO,CAAC,CACtF,CACF;CAEN,MAAM,SAAS,OAAO,SAAe;EACnC,IAAI,aAAa,KAAA,GAAW;EAC5B,MAAM,SAAS,OAAO,MAAM,IAAI;EAChC,KAAK,MAAM,SAAS,KAAK,OAAO,GAC9B,IAAI,UAAU,KAAK,UAAU,GAAG,MAAM,SAAS,OAAO,OAAO,IAAI;CACrE;CAEA,MAAM,cAAc;EAClB,uBAAuB;EACvB,UAAU,MAAM;CAClB;CAEA,MAAM,gBAA+B;EACnC,MAAM;EACN,cAAc,YAAY;GAMxB,KAAI,MALmB,QAAQ,WAAW,CACxC,GAAG,cAAc,OAAO,CAAC,CAAC,CAAC,KAAK,iBAAiB,aAAa,QAAQ,CAAC,GACvE,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,CACvD,CAAC,EAAA,CAEY,MAAM,WAAW,OAAO,WAAW,UAAU,GACxD,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC;EAC3C,EAAA,CAAG;EAEH,OAAO;CACT;;CAGA,MAAM,cAAc,SAAe;EACjC,IAAI,aAAa,KAAA,GAAW,kBAAkB,OAAO,IAAI,CAAC;CAC5D;;CAGA,MAAM,eAAe,OAAc,SAAe;EAChD,IAAI,aAAa,KAAA,GAAW,kBAAkB,SAAS,OAAO,OAAO,IAAI,CAAC;CAC5E;;;;;;CAOA,MAAM,UAAU,YAAY;EAC1B,MAAM,YAAY,QAAQ;EAE1B,IAAI,cAAc,KAAA,KAAa,aAAa,KAAA,GAAW;EACvD,KAAK,MAAM,SAAS,QAAQ,OAAO,GACjC,KAAK,MAAM,SAAS,MAAM,KAAK,OAAO,GAAG,iBAAiB,IAAI,OAAO,QAAQ,KAAK,CAAC;EAErF,KAAK,MAAM,SAAS,WAAW,eAAe,CAAC,GAC7C,MAAM,QAAQ,iBAAiB,CAAC,GAAG,MAAM,WAAW,GAAG,EAAE,QAAQ,MAAM,OAAO,CAAC;EAIjF,MAAM,UAAU,CAAC,UAAU,QAAQ,WAAW,MAAM,CAAC,CAClD,QAAQ,SAAS,SAAS,KAAA,CAAS,CAAC,CACpC,KAAK,IAAI;EAEZ,IAAI,QAAQ,SAAS,GAAG;GACtB,MAAM,eAAe,MAAM,QAAQ,cAAc,EAAE,QAAQ,CAAC;GAE5D,IAAI,sBAAsB,MAAM,aAAa,QAAQ;QAChD,cAAc,KAAK,YAAY;EACtC;CACF;CAEA,MAAM,kBAAkB,UAAyB;EAC/C,IAAI;GACF,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC;GAE/B,OAAO,CAAC,SAAS,QAAQ,CAAC,CAAC,SAAS,IAAI,QAAQ,IAAI,IAAI,SAAS;EACnE,QAAQ;GACN,OAAO;EACT;CACF;;CAGA,MAAM,iBAAiB,OACrB,OACA,YACA,iBACqB;EACrB,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,QAAQ,KAAK,CACxB,MAAM,SAAS,UAAU,GACzB,IAAI,SAAgB,GAAG,WAAW;IAChC,QAAQ,iBAAiB,OAAO,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY;GAClF,CAAC,CACH,CAAC;EACH,UAAU;GACR,aAAa,KAAK;EACpB;CACF;CAEA,MAAM,YAAY,OAChB,WACA,QACA,WAC4B;EAC5B,MAAM,EAAE,UAAU,QAAQ,MAAM;EAChC,MAAM,QAAQ,QAAQ,KAAK;EAE3B,IAAI,eAAe,IAAI,KAAK,MAAM,OAAO,OAAO,EAAE,MAAM,QAAQ;EAChE,OAAO,MAAM;EAEb,IAAI,UAAU,iBAAiB,IAAI,KAAK,KAAK,KACvC;OAAA,UAAU,sBAAsB,0BAClC,OAAO,EAAE,MAAM,qBAAqB;EAAA;EAExC,MAAM,SAAS,eAAe,KAAK;EAEnC,MAAM,aAAa,UAAU,UAAU,QACpC,gBAAgB,YAAY,YAAY,KAAA,KAAa,YAAY,QAAQ,SAAS,MAAM,CAC3F;EAEA,IAAI,WAAW,WAAW,GAAG;GAC3B,eAAe,IAAI,OAAO,KAAK;GAE/B,OAAO,EAAE,MAAM,gBAAgB;EACjC;EAEA,KAAK,MAAM,eAAe,YAAY;GACpC,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,eAAe,OAAO,gBAAgB,CAAC,CAAC;GACxF,IAAI;GAEJ,IAAI;IACF,QAAQ,MAAM,eAAe,OAAO,YAAY,YAAY,MAAM;GACpE,SAAS,OAAO;IACd,IAAI,QAAQ,KAAK,MAAM,SAAS,MAAM,WAAW,GAC/C,OAAO;KAAE,MAAM;KAAY,MAAM,YAAY;KAAM,QAAQ;IAAQ;IAErE,OAAO;KACL,MAAM;KACN,MAAM,YAAY;KAClB,QACE,OAAO,GAAG,aAAa,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,SAAS,YACrD,YACA;IACR;GACF;GACA,OAAO,MAAM;GAEb,IAAI,QAAQ,KAAK,MAAM,OACrB,OAAO;IAAE,MAAM;IAAY,MAAM,YAAY;IAAM,QAAQ;GAAQ;GACrE,IAAI,UAAU,MAAM,OAAO;IAAE,MAAM;IAAY,MAAM,YAAY;IAAM,QAAQ;GAAS;EAC1F;EACA,eAAe,IAAI,OAAO,KAAK;EAE/B,OAAO,EAAE,MAAM,QAAQ;CACzB;CAEA,MAAM,qBAAkD,QAAQ,WAC9D,SAAS,YAAY;EACnB,MAAM,YAAY,QAAQ;EAE1B,OAAO,cAAc,KAAA,KAAa,UAAU,UAAU,WAAW,IAC7D,EAAE,MAAM,QAAiB,IACzB,UAAU,WAAW,QAAQ,MAAM;CACzC,CAAC;CAEH,OAAO;EAAE;EAAQ;EAAY;EAAa;EAAO;EAAS;EAAS;CAAkB;AACvF;;;;;;;;ACnOA,MAAa,gBACX,SACA,SACA,YACG;CACH,MAAM,EAAE,YAAY;;;;;;;;;CAUpB,MAAM,eAAe,OAAO,YAAmD;EAe7E,IAAI,MAd2B,QAAQ,UAAU,SAAS;GACxD,IAAI,CAAC,KAAK,cAAc,SAAS,GAAG,OAAO;GAC3C,IAAI,SAAS,KAAK,cAAc;GAEhC,OAAO,QAAQ,YAAY,eAAe,SAAS,OAAO,WAAW;GAErE,KAAK,IAAI,KAAkB,QAAQ,OAAO,OAAO;IAC/C,IAAI,OAAO,MAAM,OAAO;IACxB,KAAK,GAAG,eAAe,cAAc,aAAa,GAAG,OAAO;GAC9D;GAEA,OAAO;EACT,CAAC,MAEe,MAAM,MAAM,QAAQ,QAAQ,WAAW,KAAK,CAAC,CAAC,GAAG,cAAc;CACjF;;CAGA,MAAM,OAAO,OACX,MACA,QACA,QACA,MACA,kBACyB;EACzB,MAAM,EAAE,SAAS,QAAQ,aAAa,CAAC,CAAC;EAExC,IAAI,SAAS,KAAA,GAAW;GACtB,OAAO,SAAS;GAChB,MAAM,KAAK,IAAI;EACjB,OACE,MAAM,QAAQ,oBACZ,MACA,QACA,oBACM,KAAK,IAAI,GACf,QACA,aACF;EACF,OAAO,MAAM;EAEb,OAAO,QAAQ,IAAI;CACrB;CAEA,MAAM,SACJ,KACA,WACA,MACA,QACA,QACA,kBAEA,eAEE,KACE,MACA,QACA,SACC,SAAS,KAAK,SAAS,MAAM,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,GAC3D,aACF,CACF;CAEF,MAAM,QACJ,MACA,MACA,QACA,QACA,kBAEA,eACE,KACE,MACA,QACA,QACA,OAAO,SAAS;EACd,KAAK,MAAM,aAAa,MAAM;GAE5B,OAAO,MAAM;GACb,MAAM,KAAK,SAAS,KAAK,SAAS;EACpC;CACF,GACA,aACF,CACF;CAEF,OAAO;EAAE;EAAO;CAAK;AACvB;;;ACzGA,MAAM,QACJ,QACA,UAAsC,mBACnC,aAAa,KAAK;CAAE,WAAW;CAAgB;CAAQ;AAAQ,CAAC;;AAGrE,IAAa,gBAAb,MAA2B;CACzB,QAA6C;CAC7C,WAAmB;CACnB;CACA;CACA,WAAmB;CACnB;CACA;CACA;CACA;CACA,YACE,QACA,UAEA,SACA,MACA;EACA,KAAK,SAAS;EACd,KAAK,WAAW;EAChB,KAAK,OAAO;EACZ,KAAK,UAAU;CACjB;CACA,QAA4B;EAC1B,IAAI,KAAK,YAAY,KAAK,KAAK,OAAO,GAAG,MAAM,KAAK,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;EAE3E,OAAO,mBAAmB,KAAK;GAC7B,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,KAAK,QAAQ,aAAa;EAClF,CAAC;CACH;CACA,gBAAsB;EACpB,IAAI,KAAK,YAAY,KAAK,KAAK,OAAO,GAAG,MAAM,KAAK,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;EAC3E,IAAI,KAAK,UAAU,WAAW,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC;CAChE;CACA,aAAsB;EACpB,MAAM,OAAO,KAAK,UAAU;EAE5B,KAAK;EACL,KAAK,UAAU,KAAA;EACf,IAAI,MAAM,KAAK,QAAQ;EAEvB,OAAO;CACT;CACA,MAAc,QAAgB,UAAwB;EACpD,OAAO,MAAM;EACb,MAAM,UAAU,OAAO,aAAa,YAAY;EAEhD,IAAI,KAAK,YAAY,KAAK,KAAK,OAAO,GAAG,MAAM,KAAK,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,OAAO;EACpF,IAAI,KAAK,aAAa,UAAU,MAAM,KAAK,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO;CAC5E;CACA,MAAc,MACZ,QACA,UACA,SACe;EACf,KAAK,MAAM,QAAQ,QAAQ;EAC3B,OAAO,SAAS;EAChB,MAAM,QAAQ;EACd,KAAK,MAAM,QAAQ,QAAQ;CAC7B;CACA,MAAM,QAAQ,QAAyC;EACrD,KAAK,cAAc;EACnB,MAAM,WAAW,KAAK;EAEtB,KAAK,MAAM,QAAQ,QAAQ;EAC3B,MAAM,OAAO,MAAM,KAAK,KAAK,SAAS;EAEtC,KAAK,MAAM,QAAQ,QAAQ;EAC3B,IAAI,CAAC,OAAO,SAAS,IAAI,GAAG,MAAM,KAAK,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;EACjE,KAAK,QAAQ;EACb,KAAK,YAAY;EACjB,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,KAAK,CAAC,CAAC;EAC1D,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,MAAM,KAAK,CAAC;EAC/D,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,UAAU,QAAQ,CAAC;EAEtE,MAAM,UAAU,OAAO,OACrB,eAAe,KAAK;GAClB,QAAQ,KAAK;GACb,UAAU,KAAK;GACf,cAAc,KAAK,QAAQ;EAC7B,CAAC,CACH;EAEA,KAAK,MAAM,QAAQ,QAAQ;EAC3B,KAAK,UAAU;EACf,KAAK,QAAQ;EAEb,OAAO;CACT;CACA,MAAM,OAAO,SAAyB,QAA+B;EACnE,KAAK,MAAM,QAAQ,KAAK,QAAQ;EAChC,IACE,KAAK,UAAU,eACf,KAAK,YAAY,KAAA,KACjB,QAAQ,WAAW,KAAK,UACxB,QAAQ,aAAa,KAAK,YAC1B,QAAQ,iBAAiB,KAAK,QAAQ,gBACtC,KAAK,cAAc,KAAA,GAEnB,MAAM,KAAK,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;EACnC,MAAM,WAAW,KAAK;EACtB,MAAM,OAAO,KAAK;EAElB,KAAK,UAAU,KAAA;EACf,KAAK,QAAQ;EACb,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,UAAU,QAAQ,CAAC;EACtE,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,SAAS,CAAC;EAC7D,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,MAAM,IAAI,CAAC;EAE9D,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,aAAa,MAAM,CAAC;EACvE,MAAM,KAAK,MAAM,QAAQ,gBAAgB,KAAK,KAAK,KAAK,IAAI,CAAC;EAC7D,KAAK,YAAY,KAAA;EACjB,KAAK,QAAQ;CACf;CACA,MAAM,UAAyB;EAC7B,IAAI,KAAK,UAAU;EACnB,KAAK,WAAW;EAChB,KAAK,QAAQ;EACb,KAAK,UAAU,KAAA;EACf,KAAK;EACL,MAAM,KAAK,KAAK,OAAO;CACzB;AACF;;;;;;;;AChIA,MAAa,mBACX,SACA,SACA,SAEA,qBACA,SACA,WACA,QACA,SAEA,SACG;CACH,MAAM,EAAE,SAAS,YAAY;CAC7B,IAAI,cAAc;CAElB,MAAM,qBAAqB,cAAc,oBAAoB,GAAG,EAAE;CAElE,MAAM,aAAa,UAAyC;EAC1D,IAAI,CAAC,QAAQ,aACX,OAAO,QAAQ,OAAO,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,GAAG,cAAc,CAAC;EAC7E,MAAM,cAAc,SAAS,YAAY;GACvC,MAAM,MAAM,MAAM,QAAQ,cAAc,MAAM,IAAI;GAElD,IAAI;IACF,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK;IAE7C,IAAI,QAAQ,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,KAAK,sCAAsC,EAAE,SAAS,KAAK,CAAC;IACtE,IAAI,QAAQ,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;IAE7E,MAAM,UAAU,IAAI,cAAc,MAAM,IAAI,UAAU,cAAc;KAClE,UAAU,YACR,WACE,OAAO,OAAO,EAAE,cAAc,OAAO,OAAO,CAAC,GAC7C,MAAM,IAAI,KAAK,2BAA2B,CAC5C,CAAC,CAAC;KACJ,MAAM,OAAO,iBAAiB;MAC5B,MAAM,IAAI,KAAK,6BAA6B,EAAE,aAAa,CAAC;KAC9D;KACA,OAAO,OAAO,YAAY;MACxB,MAAM,IAAI,KAAK,sCAAsC,EAAE,QAAQ,CAAC;KAClE;KACA,WAAW,OAAO,UAAU;MAC1B,MAAM,IAAI,KAAK,6BAA6B,EAAE,MAAM,CAAC;KACvD;KACA,UAAU,YAAY;MACpB,MAAM,IAAI,KAAK,mBAAmB;KACpC;KACA,cAAc,QAAQ,KAAK,CAAC,QAAQ,YAAY,KAAK,MAAM,KAAK,SAAS;KACzE,QAAQ,YAAY;MAClB,IAAI,MAAM,KAAK,SAAS,KAAK,CAAC,QAAQ,YAAY,GAAG;MACrD,IAAI;OACF,MAAM,kBAAkB,IAAI,OAAO,CAAC;MACtC,SAAS,OAAO;OACd,IAAI,CAAC,MAAM,KAAK,SAAS,KAAK,QAAQ,YAAY,GAAG,MAAM;MAC7D;KACF;KACA,cAAc,OAAO,WAAW;MAC9B,OAAO,MAAM;MAEb,MAAM,OAAO,WACX,OAAO,OAAO,EACZ,WAAW,OAAO,OAAO,EAAE,OAAO,OAAO,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC,EACvE,CAAC,GACD,MAAM,IAAI,KAAK,mBAAmB,CACpC;MAEA,OAAO,MAAM;MAEb,MAAM,QAAQ,MAAM,IAAI,KAAK,4BAA4B;OACvD,SAAS,KAAK,UAAU,MAAM;OAC9B,WAAW;MACb,CAAC;MAED,OAAO,MAAM;MAEb,MAAM,SAAS,MAAM,IAAI,KAAK,oBAAoB;OAChD,YAAY;OACZ,WAAW,WACT,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,CAAC,GACxC,MAAM,kBACR;OACA,cAAc;OACd,eAAe;OACf,aAAa;OACb,SAAS,KAAK,IAAI,KAAM,OAAO,gBAAgB,CAAC;MAClD,CAAC;MAED,OAAO,MAAM;MACb,IAAI,OAAO,qBAAqB,KAAA,KAAa,OAAO,OAAO,UAAU,MACnE,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;KAC5C;IACF,CAAC;IAED,MAAM,iBAAiB;IAEvB,OAAO;GACT,SAAS,OAAO;IACd,MAAM,kBAAkB,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM;GACR;EACF,CAAC;EAED,OAAO,MAAM;CACf;CAEA,MAAM,WAAW,OACf,QACA,WACG;EACH,OAAO,MAAM;EACb,MAAM,QAAQ,QAAQ,IAAI,OAAO,MAAM;EAEvC,IAAI,UAAU,KAAA,KAAa,MAAM,KAAK,SAAS,GAC7C,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,cAAc;EACvD,MAAM,UAAU,MAAM,UAAU,KAAK;EAErC,OAAO,MAAM;EACb,IAAI,QAAQ,aAAa,OAAO,UAAU,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAE9F,OAAO;CACT;;CAGA,MAAM,UAAU,UAAiB;EAC/B,MAAM,gBAAgB,WAAW;EACjC,IAAI,MAAM,cAAc,KAAA,GACtB,UAAU,OAAO,YAAY;GAC3B,OAAO,MAAM,MAAM,UAAA,EAAY,QAAQ;EACzC,CAAC;CACL;;CAGA,MAAM,cAAc,OAAc,UAAiB;EACjD,IAAI,UAAU,MAAM,KAAK,UAAU,KAAK,MAAM,gBAAgB,WAAW,GACvE,OAAO,MAAM;GAAE,QAAQ;GAAU,QAAQ;GAAgB,aAAa;EAAU,CAAC;CACrF;CAEA,MAAM,aAAiD;EACrD,QAAQ,MAAgB,WACtB,SAAS,aAAa,MAAM,SAAS,MAAM,MAAM,EAAA,CAAG,MAAM,CAAC;EAE7D,UAAU,MAAgB,WACxB,SAAS,YAAY;GACnB,MAAM,UAAU,MAAM,SAAS,MAAM,MAAM;GAE3C,KAAK,QAAQ,MAAM;GAEnB,OAAO,QAAQ,QAAQ,MAAM;EAC/B,CAAC;EACH,SAAS,SAAyB,WAChC,SAAS,YAAY;GACnB,MAAM,UAAU,MAAM,SAAS,SAAS,MAAM;GAE9C,KAAK,QAAQ,MAAM;GAEnB,OAAO,QAAQ,OAAO,SAAS,MAAM;EACvC,CAAC;EACH,cAAc,QAAQ,WACpB,SAAS,YAAY;GACnB,OAAO,MAAM;GACb,MAAM,UAAU,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC,KAAK;GAErD,OAAO,MAAM;GACb,QAAQ,cAAc;EACxB,CAAC;CACL;CAEA,MAAM,gBACJ,QAAQ,WACN,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,UAAU;EACzC,IAAI,MAAM,cAAc,KAAA,GAAW,OAAO,MAAM,MAAM,UAAA,CAAW,QAAQ;CAC3E,CAAC,CACH;CAEF,OAAO;EAAE;EAAW;EAAQ;EAAY;EAAY;CAAQ;AAC9D;;;AC3KA,MAAM,QAAQ,OAAO,OAAO;CAC1B,GAAG,OAAO;CACV,GAAG,OAAO;CACV,WAAW,OAAO;AACpB,CAAC;;AAGD,MAAM,YACJ,MACA,UAC4E;CAC5E,MAAM,UAAU;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG,WAAW;CAAM;CAE3D,IACE,EAAE,gBAAgB,YAClB,CAAC,KAAK,eACN,MAAM,IAAI,KACV,MAAM,IAAI,KACV,MAAM,KAAK,cACX,MAAM,KAAK,aAEX,OAAO;CAET,IAAI,MAAM,KAAK,cAAc,iBAAiB,MAAM,GAAG,MAAM,CAAC;CAE9D,KAAK,IAAI,QAAQ,GAAG,KAAK,YAAY,SAAS;EAC5C,IAAI,SAAS,IAAI,OAAO;EACxB,MAAM,QAAQ,IAAI,WAAW,iBAAiB,MAAM,GAAG,MAAM,CAAC;EAE9D,IAAI,UAAU,QAAQ,UAAU,KAAK;EACrC,MAAM;CACR;CACA,IAAI,QAAQ,QAAS,QAAQ,QAAQ,CAAC,KAAK,SAAS,GAAG,GAAI,OAAO;CAClE,IAAI,CAAC,MAAM,OAAO,OAAO;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG,WAAW;CAAK;CACnE,IAAI,EAAE,gBAAgB,cAAc,OAAO;CAI3C,IAAI,WAA2B;CAE/B,KAAK,IAAI,QAAQ,GAAG,aAAa,MAAM,SAAS;EAC9C,IAAI,SAAS,KAAK,OAAO;EACzB,MAAM,QAAQ,iBAAiB,QAAQ;EACvC,MAAM,WAAW,MAAM,iBAAiB,QAAQ;EAChD,MAAM,QAAQ,MAAM,iBAAiB,OAAO;EAE5C,IACG,aAAa,MAAM,aAAa,UAAU,aAAa,UACvD,UAAU,MACT,UAAU,UACV,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,SAAS,EAAE,OAAO,WAAW,IAAI,IAAI,EAAE,KAClE,MAAM,gBAAgB,UACrB,MAAM,eAAe,MAAM,MAAM,eAAe,QAEjD,OAAO;EACT,IAAI,MAAM,cAAc,QAAQ;GAC9B,MAAM,SAAS,IAAI,kBAAkB,MAAM,SAAS;GAEpD,IAAI,CAAC,OAAO,QAAQ,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,GACnF,OAAO;EACX;EACA,MAAM,OAAO,SAAS,YAAY;EAElC,WAAW,SAAS,kBAAkB,gBAAgB,aAAa,KAAK,OAAO;CACjF;CAEA,MAAM,OAAO,KAAK,sBAAsB;CACxC,MAAM,SAAS,KAAK,QAAQ,KAAK;CACjC,MAAM,SAAS,KAAK,SAAS,KAAK;CAElC,IAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,KAAK,UAAU,GACnF,OAAO;CACT,MAAM,QAAQ,iBAAiB,IAAI;CACnC,MAAM,OAAO,OAAO,WAAW,MAAM,WAAW;CAChD,MAAM,MAAM,OAAO,WAAW,MAAM,UAAU;CAC9C,MAAM,QAAQ,OAAO,WAAW,MAAM,YAAY;CAClD,MAAM,SAAS,OAAO,WAAW,MAAM,aAAa;CACpD,MAAM,KAAK,MAAM,IAAI,KAAK,QAAQ,SAAS,KAAK,aAAa;CAC7D,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,SAAS,KAAK,YAAY;CAE3D,IACE,CAAC,OAAO,SAAS,CAAC,KAClB,CAAC,OAAO,SAAS,CAAC,KAClB,IAAI,KACJ,IAAI,KACJ,KAAK,KAAK,cAAc,OAAO,SAC/B,KAAK,KAAK,eAAe,MAAM,QAE/B,OAAO;CAET,OAAO;EAAE;EAAG;EAAG,WAAW;CAAK;AACjC;;;;;;AAOA,MAAa,eAAe,SAAkB,YAA4C;CACxF,MAAM,EAAE,YAAY;CAEpB,MAAM,4BAAY,IAAI,QAAkC;CAExD,MAAM,SAAS,OAAO,MAAY,UAAsC;EACtE,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;EACtC,UAAU,IAAI,MAAM,KAAK;CAC3B;CAEA,MAAM,WAAW,UAA6B,EAAE,UAAU,UAAU,IAAI,IAAI,KAAK,KAAK;CAEtF,MAAM,cAAc,SAAqB;EACvC,UAAU,IAAI,MAAM,IAAI;CAC1B;CAEA,MAAM,eAAe,OAAoB,QAAgB,WACvD,SAAS,YAAY;EACnB,MAAM,EAAE,SAAS,QAAQ,MAAM,CAAC,CAAC;EAEjC,OAAO,SAAS;EAChB,MAAM,OAAO,MAAM,KAAK;EACxB,OAAO,MAAM;EAEb,OAAO,QAAQ,IAAI;CACrB,CAAC;;;;;;;CAQH,MAAM,iBAAiB,OACrB,MACA,YACyB;EACzB,MAAM,MAAM,MAAM,QAAQ,YAAY;EAEtC,IAAI,QAAQ,QAAQ,IAAI,SAAS,KAAK,IAAI,UAAU,GAClD,MAAM,QAAQ,QAAQ,WAAW,KAAK,CAAC,CAAC,GAAG,cAAc;EAC3D,MAAM,QAAQ;GAAE,GAAG,IAAI,IAAI,IAAI,QAAQ;GAAG,GAAG,IAAI,IAAI,IAAI,SAAS;EAAE;EAEpE,MAAM,YAAwC,CAAC;EAE/C,IAAI;GACF,IAAI,QAAQ,MAAM,QAAQ,WAAW;GAErC,IAAI,UAAU,QAAQ,MAAM,KAAK,MAAM,MACrC,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GACtD,OAAO,UAAU,KAAK,UAAU,GAAG;IACjC,IAAI,UAAU,UAAU,IACtB,MAAM,QACJ,QAAQ,MAAM,KAAK;KACjB,WAAW;KACX,SAAS;KACT,UAAU,UAAU;IACtB,CAAC,GACD,cACF;IACF,UAAU,KAAK,MAAM,MAAM,aAAa,CAAC;IACzC,QAAQ,MAAM,YAAY;IAC1B,IAAI,UAAU,MAAM,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;GAC1E;GAEA,IAAI,aAAa;GAIjB,KAAK,MAAM,YAAY,UAAU,QAAQ,GAAG;IAC1C,MAAM,UAAU,WACd,OACA,MAAM,SAAS,SAAS,UAAU;KAAE,GAAG;KAAY,OAAO;IAAK,CAAC,CAClE;IAEA,IAAI,CAAC,QAAQ,WAAW,MAAM,QAAQ,QAAQ,WAAW,KAAK,CAAC,CAAC,GAAG,cAAc;IACjF,aAAa;KAAE,GAAG,QAAQ;KAAG,GAAG,QAAQ;IAAE;GAC5C;GAOA,IAAI,CALY,WACd,OACA,MAAM,QAAQ,SAAS,UAAU;IAAE,GAAG;IAAY,OAAO;GAAM,CAAC,CAGvD,CAAC,CAAC,WAAW,MAAM,QAAQ,QAAQ,WAAW,KAAK,CAAC,CAAC,GAAG,cAAc;EACnF,UAAU;GACR,MAAM,QAAQ,IAAI,UAAU,KAAK,aAAa,SAAS,QAAQ,CAAC,CAAC;EACnE;EAEA,OAAO;CACT;CAEA,MAAM,SACJ,QACA,QACA,QACA,kBAEA,SAAS,YAAY;EACnB,MAAM,EAAE,SAAS,QAAQ,aAAa,CAAC,CAAC;EAExC,MAAM,QAAQ,oBACZ,QACA,SACC,YAAY,eAAe,MAAM,OAAO,IACxC,UAAU,UAAU,OAAO,MAAM,KAAK,GACvC,QACA,aACF;EACA,OAAO,MAAM;EAEb,OAAO,QAAQ,IAAI;CACrB,CAAC;CAEH,MAAM,SACJ,QACA,QACA,IACA,QACA,WAEA,SAAS,YAAY;EACnB,MAAM,EAAE,SAAS,QAAQ,MAAM,CAAC,CAAC;EAEjC,OAAO,SAAS;EAChB,IAAI,OAAO,KAAA,GAAW,MAAM,OAAO,MAAM,EAAE;EAE3C,MAAM,KAAK,MAAM,MAAM,QAAQ,MAAM;EACrC,OAAO,MAAM;EAEb,OAAO,QAAQ,IAAI;CACrB,CAAC;CAEH,OAAO;EAAE;EAAa;EAAO;EAAO;EAAS;CAAW;AAC1D;;;;;;;;AC3OA,IAAa,gBAAb,MAA2B;CACzB,0BAA2B,IAAI,IAAmB;CAClD,0BAA2B,IAAI,QAA6C;CAC5E,yBAA0B,IAAI,IAAmC;CACjE,8BAA+B,IAAI,IAAgB;CACnD,UAA2B,CAAC;CAC5B,UAAkB;CAClB,oBAA4B;CAE5B;CAEA,YAAY,QAAqC;EAC/C,KAAK,SAAS;CAChB;CAEA,IACE,SACA,QACA,UAA0B,CAAC,GACE;EAC7B,MAAM,WAAW,KAAK,QAAQ,IAAI,OAAO;EAEzC,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,IAAI,gBAA2D,CAAC;EAChE,IAAI,YAAY;EAEhB,MAAM,SAAS,IAAI,SAA6B,SAAS;GACvD,UAAU;EACZ,CAAC;EAED,KAAK,QAAQ,IAAI,SAAS,MAAM;EAChC,MAAM,QAAQ,CAAC;EAEf,MAAM,UACJ,aACA,WAAmB,UAChB;GACH,IAAI,KAAK,mBAAmB;GAC5B,IAAI,QAAQ,aAAa,KAAA,GACvB,KAAK,OAAO,MAAM;IAChB,QAAQ;IACR,QAAQ,QAAQ;IAChB,OAAO;IACP;GACF,CAAC;QACE,IAAI,gBAAgB,aAAa,gBAAgB,kBACpD,KAAK,OAAO,MAAM;IAAE,QAAQ;IAAU,QAAQ;IAAY;GAAY,CAAC;EAC3E;EAEA,MAAM,UAAU,gBAAoC;GAClD,IAAI,WAAW;GACf,YAAY;GACZ,QAAQ,UAAU,WAAW;GAC7B,QAAQ,WAAW;EACrB;EAEA,IAAI,KAAK,WAAW,KAAK,QAAQ,QAAQ,IAAI;GAC3C,IAAI,CAAC,KAAK,SAAS,OAAO,kBAAkB,KAAK,OAAO;GACxD,OAAO,gBAAgB;GAEvB,OAAO;EACT;EACA,IAAI,aAAa;EACjB,MAAM,eAAe,OAAO,aAAa,YAAY,gBAAgB;EAErE,KAAK,YAAY,IAAI,MAAM;EAE3B,MAAM,YAAY,YAAyC;GACzD,IAAI,KAAK,SACP,OAAO;GAET,IAAI;IACF,QAAQ,WAAW;GACrB,QAAQ;IACN,OAAO;GACT;GACA,aAAa;GACb,OAAO,YAAY;GAEnB,MAAM,QAAQ,iBAAiB;IAC7B,KAAK,OAAO,OAAO,KAAK;IACxB,OAAO,SAAS;IAChB,OAAO,SAAS;GAClB,GAAG,GAAI;GAEP,KAAK,OAAO,IAAI,KAAK;GACrB,IAAI;IACF,MAAM,OAAO;IAEb,OAAO;GACT,QAAQ;IACN,OAAO;GACT,UAAU;IACR,aAAa,KAAK;IAClB,KAAK,OAAO,OAAO,KAAK;GAC1B;EACF;EAEA,MAAM,OAAO,QAAQ,QAAQ,CAAC,CAC3B,KAAK,SAAS,CAAC,CACf,MAAM,gBAAgB;GAErB,KAAK,QAAQ,OAAO,IAAI;GACxB,KAAK,YAAY,OAAO,MAAM;GAE9B,IAAI,CAAC,aAAa,gBAAgB,aAAa,OAAO,WAAW;GACjE,OAAO,WAAW;EACpB,CAAC;EAEH,KAAK,QAAQ,IAAI,IAAI;EACrB,OAAO,SAAS;EAEhB,OAAO;CACT;;CAGA,OAAa;EACX,KAAK,UAAU;CACjB;;CAGA,UAAgB;EACd,KAAK,KAAK;EACV,KAAK,oBAAoB;EACzB,KAAK,MAAM,SAAS,KAAK,QAAQ,aAAa,KAAK;EACnD,KAAK,OAAO,MAAM;EAClB,KAAK,MAAM,UAAU,KAAK,aAAa,OAAO;EAC9C,KAAK,YAAY,MAAM;EACvB,KAAK,QAAQ,MAAM;CACrB;CAEA,MAAM,SAAwB;EAC5B,MAAM,QAAQ,IAAI,KAAK,OAAO;CAChC;AACF;;;AChJA,MAAM,aAAa,OAAO,OAAO,EAC/B,YAAY,OAAO,OAAO;CAAE,UAAU;CAAY,MAAM,OAAO,QAAQ,MAAM;AAAE,CAAC,EAClF,CAAC;AAED,MAAM,UAAU,OAAO,OAAO,MAAM,OAAO,YAAY,IAAI,CAAC;;;;;;AA0D5D,MAAM,2BAA2B,UAA+C;CAE9E,MAAM,UAAW,MAAiC;CAElD,IAAI,OAAO,SAAS,OAAO,cAAc,OAAO,QAAQ,QAAQ,YAC9D,MAAM,IAAI,MAAM,gEAAgE;CAElF,OAAO;AACT;;;;;AAMA,MAAa,eACX,SACA,SACA,SAKA,qBACA,SACA,UACG;CACH,MAAM,0BAAU,IAAI,IAAmB;CACvC,MAAM,yBAAS,IAAI,QAAqB;CACxC,MAAM,2BAAW,IAAI,QAAuB;CAE5C,MAAM,iCAAiB,IAAI,QAAuB;CAClD,MAAM,YAAuB,CAAC;CAE9B,MAAM,6BAAa,IAAI,IAAY;CAEnC,IAAI,SAAS,GACX,cAAc;CAEhB,IAAI,eAAe;CAEnB,MAAM,WAAW,UAAyB,eAAe,IAAI,KAAK,KAAK;CAEvE,MAAM,WAAW,UAAyB;EACxC,IAAI,KAAK,SAAS,IAAI,KAAK;EAE3B,IAAI,OAAO,KAAA,GAAW;GACpB,KAAK,SAAS,oBAAoB,GAAG,EAAE;GACvC,SAAS,IAAI,OAAO,EAAE;EACxB;EAEA,OAAO;CACT;CAEA,MAAM,YAAY,SAAsB;EACtC,MAAM,WAAW,OAAO,IAAI,IAAI;EAEhC,IAAI,aAAa,KAAA,GAAW,OAAO;EACnC,MAAM,QAAe;GAAE,IAAI,QAAQ,oBAAoB,GAAG,EAAE;GAAU;GAAM,KAAK,CAAC;EAAE;EAEpF,OAAO,IAAI,MAAM,KAAK;EACtB,IAAI,QAAQ,QAAQ,QAAQ,UAAU;GACpC,MAAM,SAAS,KAAK;GAEpB,OAAO;EACT;EACA,QAAQ,IAAI,MAAM,IAAI,KAAK;EAC3B,MAAM,0CAA0B,IAAI,QAAe;EACnD,MAAM,qCAAqB,IAAI,QAA2B;EAE1D,MAAM,wBAAwB,UAAuB;GACnD,IAAI,mBAAmB,IAAI,KAAK,GAAG;GACnC,MAAM,UAAU,wBAAwB,KAAK;GAE7C,MAAM,eAAe,UAAiC;IACpD,IAAI,MAAM,UAAU,KAAA,KAAa,MAAM,gBAAgB,KAAA,GAAW;IAClE,wBAAwB,IAAI,KAAK;IACjC,MAAM,sBAAsB,OAAO,KAAK;GAC1C;GAEA,QAAQ,GAAG,aAAa,WAAW;GACnC,MAAM,YAAY,QAAQ,IAAI,aAAa,WAAW;GAEtD,mBAAmB,IAAI,OAAO,GAAG;GACjC,MAAM,IAAI,KAAK,GAAG;EACpB;EAEA,KAAK,MAAM,SAAS,KAAK,OAAO,GAAG;GACjC,QAAQ,KAAK;GACb,qBAAqB,KAAK;EAC5B;EAEA,MAAM,gBAAgB;GACpB,MAAM,OAAO,KAAK;GAClB,QAAQ,OAAO,MAAM,EAAE;GACvB,KAAK,MAAM,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI;GAC3C,IAAI,UAAU,UAAU,OAAO;IAC7B,UAAU,QAAQ,KAAA;IAClB,UAAU,QAAQ,KAAA;IAClB,MAAM,QAAQ,kBAAkB,EAAE,QAAQ,MAAM,GAAG,CAAC;GACtD;EACF;EAEA,MAAM,gBAAgB,UAAiB;GAErC,IAAI,wBAAwB,OAAO,KAAK,GAAG;GAC3C,MAAM,WAAW,OAAO,KAAK;GAC7B,eAAe,IAAI,OAAO,QAAQ,KAAK,IAAI,CAAC;GAC5C,MAAM,UAAU,OAAO,KAAK;GAC5B,QAAQ,KAAK;GACb,MAAM,aAAa,OAAO,KAAK;GAC/B,IAAI,UAAU,UAAU,UAAU,UAAU,UAAU,SAAS,UAAU,KAAK,UAAU,IACtF,MAAM,QAAQ,kBAAkB,EAAE,QAAQ,MAAM,GAAG,CAAC;EACxD;EAEA,MAAM,cAAc,UAAiB;GACnC,MAAM,MAAM,mBAAmB,IAAI,KAAK;GAExC,MAAM;GACN,MAAM,eAAe,QAAQ,KAAA,IAAY,KAAK,MAAM,IAAI,QAAQ,GAAG;GAEnE,IAAI,iBAAiB,IAAI,MAAM,IAAI,OAAO,cAAc,CAAC;GACzD,mBAAmB,OAAO,KAAK;GAC/B,MAAM,aAAa,OAAO,KAAK;GAC/B,IAAI,UAAU,UAAU,OAAO;IAC7B,UAAU,QAAQ,KAAA;IAClB,MAAM,QAAQ,kBAAkB,EAAE,QAAQ,MAAM,GAAG,CAAC;GACtD;EACF;EAEA,MAAM,YAAY,WAAmB;GACnC,MAAM,OAAO,OAAO,MAAM;EAC5B;EAEA,MAAM,mBAAmB,UAAiB;GACxC,QAAQ,KAAK;GACb,qBAAqB,KAAK;EAC5B;EAEA,KAAK,GAAG,SAAS,OAAO;EACxB,KAAK,GAAG,iBAAiB,eAAe;EACxC,KAAK,GAAG,kBAAkB,YAAY;EACtC,KAAK,GAAG,iBAAiB,UAAU;EACnC,KAAK,GAAG,UAAU,QAAQ;EAC1B,MAAM,IAAI,WACF,KAAK,IAAI,SAAS,OAAO,SACzB,KAAK,IAAI,iBAAiB,eAAe,SACzC,KAAK,IAAI,kBAAkB,YAAY,SACvC,KAAK,IAAI,iBAAiB,UAAU,SACpC,KAAK,IAAI,UAAU,QAAQ,CACnC;EACA,MAAM,OAAO,OAAO,YAAY;EAEhC,OAAO;CACT;CAEA,MAAM,wBAAwB;EAC5B,IACE,QAAQ,KACR,CAAC,QAAQ,YAAY,KACrB,UAAU,UAAU,KAAA,KACpB,UAAU,MAAM,KAAK,SAAS,KAC9B,UAAU,UAAU,KAAA,KACpB,UAAU,MAAM,WAAW,GAE3B,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,cAAc;EAEvD,OAAO;GAAE,OAAO,UAAU;GAAO,OAAO,UAAU;EAAM;CAC1D;CAEA,MAAM,mBAAmB,WAAyB;EAChD,IAAI,QAAQ,KAAK,CAAC,QAAQ,YAAY,GAAG,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,cAAc;EAC9F,MAAM,QAAQ,QAAQ,IAAI,OAAO,MAAM;EAEvC,IAAI,UAAU,KAAA,KAAa,MAAM,KAAK,SAAS,GAC7C,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACtD,MAAM,QAAQ,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,cAAc,QAAQ,SAAS,MAAM,OAAO,OAAO;EAE3F,IAAI,UAAU,KAAA,KAAa,MAAM,WAAW,GAC1C,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAEtD,OAAO;GAAE;GAAO;EAAM;CACxB;CAEA,MAAM,WAAW,WACf,WAAW,KAAA,IAAY,gBAAgB,IAAI,gBAAgB,MAAM;CAEnE,MAAM,WAAW,OAAO,OAAc,WAAqC;EACzE,QAAQ,MAAM;EACd,IAAI,MAAM,aAAa,KAAA,GAAW,OAAO,MAAM;EAC/C,MAAM,MAAM,MAAM,QAAQ,cAAc,MAAM,IAAI;EAElD,IAAI;GACF,QAAQ,MAAM;GACd,MAAM,OAAgB,MAAM,IAAI,KAAK,sBAAsB;GAE3D,QAAQ,MAAM;GACd,MAAM,WAAW,WAAW,YAAY,IAAI,CAAC,CAAC,WAAW;GAEzD,OAAO,MAAM;EACf,UAAU;GACR,MAAM,kBAAkB,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;EACtD;CACF;CAEA,MAAM,SAAS,UAAiB,WAAW,SAAS,MAAM,IAAI,CAAC;CAE/D,MAAM,oBAAoB,MAAM,gBAAgB,CAAC,CAAC,KAAK;CACvD,MAAM,OAAO,WAA0B,MAAM,QAAQ,MAAM,CAAC,CAAC,KAAK;;;;;CAMlE,MAAM,gBAAgB,YAA2B;EAC/C,IAAI,QAAQ,WAAW,QAAQ,SAAS,GAAG;GACzC,eAAe;GACf,IAAI;IACF,UAAU,QAAQ,SAAS,MAAM,QAAQ,QAAQ,CAAC;GACpD,UAAU;IACR,eAAe;GACjB;EACF,OAAO,IAAI,QAAQ,oBAAoB,KAAA,GAAW;GAChD,KAAK,MAAM,SAAS,QAAQ,OAAO,GACjC,IAAK,MAAM,SAAS,KAAK,MAAO,QAAQ,iBAAiB,UAAU,QAAQ;GAC7E,IAAI,UAAU,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC;EAC5E,OAAO;GACL,IAAI,QAAQ,SAAS,GAAG,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;GAChE,UAAU,QAAQ,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;EAC5C;CACF;CAEA,MAAM,cAAc;EAClB,QAAQ,MAAM;EACd,UAAU,QAAQ,KAAA;EAClB,UAAU,QAAQ,KAAA;CACpB;CAEA,MAAM,iBAAiB;EACrB,MAAM,EAAE,OAAO,UAAU,QAAQ;EAEjC,OAAO;GAAE,QAAQ,MAAM;GAAI,SAAS,QAAQ,KAAK;EAAE;CACrD;CAEA,MAAM,yBAAyB,eAAe,SAAS,QAAQ,CAAC,CAAC,KAAK,CAAC;;CAGvE,MAAM,WAAW,OAAO,OAAc,WAAsC;EAC1E,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;EAEvC,OAAO,MAAM;EACb,MAAM,QAAiB,MAAM,MAAM,KAAK,MAAM;EAE9C,OAAO,MAAM;EACb,IAAI,QAAQ,IAAI,MAAM,EAAE,MAAM,SAAS,MAAM,KAAK,SAAS,GACzD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,aAAa,YAAY,cAAc;EACtF,IAAI,OAAO,UAAU,UAAU,MAAM,QAAQ,QAAQ,UAAU,KAAK,EAAE,MAAM,aAAa,CAAC,CAAC;EAE3F,OAAO,WAAW,UAAU;GAC1B,QAAQ,MAAM;GACd,UAAU;GACV,OAAO,MAAM,MAAM,GAAG,GAAG;GACzB,KAAK,MAAM,KAAK,IAAI;GACpB,UAAU,UAAU,UAAU;EAChC,CAAC;CACH;CAEA,MAAM,aAAa,WACjB,SAAS,YAAY;EACnB,OAAO,MAAM;EACb,MAAM,SAAqB,CAAC;EAE5B,KAAK,MAAM,SAAS,QAAQ,OAAO,GAAG,OAAO,KAAK,MAAM,SAAS,OAAO,MAAM,CAAC;EAE/E,OAAO;CACT,CAAC;CAEH,MAAM,eAAe,OAAO,MAAgB,WAAmC;EAC7E,OAAO,MAAM;EACb,MAAM,QAAQ,QAAQ,IAAI,KAAK,MAAM;EAErC,IAAI,UAAU,KAAA,KAAa,MAAM,KAAK,SAAS,GAC7C,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;EACzD,IAAK,MAAM,SAAS,OAAO,MAAM,MAAO,KAAK,UAC3C,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACtD,OAAO,MAAM;EACb,IAAI,QAAQ,IAAI,MAAM,EAAE,MAAM,SAAS,MAAM,KAAK,SAAS,GACzD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EAEtD,OAAO;CACT;CAEA,MAAM,eAAe,MAAgB,WACnC,SAAS,YAAY;EACnB,MAAM,QAAQ,MAAM,aAAa,MAAM,MAAM;EAE7C,OAAO;GAAE,QAAQ,MAAM;GAAI,SAAS,QAAQ,MAAM,KAAK,UAAU,CAAC;EAAE;CACtE,CAAC;CAEH,MAAM,cAAc,MAAgB,WAClC,SAAS,YAAY;EACnB,MAAM,QAAQ,MAAM,aAAa,MAAM,MAAM;EAE7C,OAAO,MAAM;EACb,IAAI,QAAQ,IAAI,MAAM,EAAE,MAAM,SAAS,MAAM,KAAK,SAAS,GACzD,MAAM,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,GAAG,cAAc;EACtD,UAAU,QAAQ;EAClB,UAAU,QAAQ,MAAM,KAAK,UAAU;EACvC,MAAM,QAAQ,kBAAkB,MAAM;CACxC,CAAC;CAEH,MAAM,WAAW,WACf,SAAS,YAAY;EACnB,IAAI,QAAQ,QAAQ,QAAQ,UAC1B,MAAM,QACJ,QAAQ,MAAM,KAAK;GACjB,WAAW;GACX,SAAS,QAAQ;GACjB,UAAU,QAAQ;EACpB,CAAC,GACD,cACF;EACF,OAAO,SAAS;EAChB,eAAe;EACf,IAAI;EAEJ,IAAI;GACF,MAAM,OAAO,MAAM,QAAQ,QAAQ;GAEnC,IAAI,OAAO,OAAO,SAAS;IACzB,MAAM,kBAAkB,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACpD,OAAO,MAAM;GACf;GAEA,QAAQ,SAAS,IAAI;EACvB,UAAU;GACR,eAAe;EACjB;EAGA,OAAO,SAAS,OAAO,MAAM;CAC/B,CAAC;CAEH,MAAM,aAAa,MAAgB,WACjC,SAAS,YAAY;EACnB,MAAM,QAAQ,MAAM,aAAa,MAAM,MAAM;EAE7C,OAAO,SAAS;EAChB,MAAM,MAAM,KAAK,MAAM,EAAE,iBAAiB,MAAM,CAAC;EACjD,OAAO,MAAM;CACf,CAAC;CAEH,MAAM,cAAc,QAAgB,SAClC,SAAS,YAAY;EACnB,OAAO,MAAM;EAEb,MAAM,UADQ,SAAS,KAAA,IAAY,gBAAgB,CAAC,CAAC,QAAQ,MAAM,aAAa,MAAM,MAAM,EAAA,CACvE,KAAK,OAAO;EAEjC,IAAI,OAAO,SAAS,KAClB,MAAM,QACJ,QAAQ,MAAM,KAAK;GAAE,WAAW;GAAU,SAAS;GAAK,UAAU,OAAO;EAAO,CAAC,CACnF;EAEF,OAAO,OAAO,KAAK,UAAU;GAC3B,MAAM,SAAS,MAAM,YAAY;GAEjC,OAAO,WAAW,WAAW;IAC3B,SAAS,QAAQ,KAAK;IACtB,eAAe,WAAW,OAAO,OAAO,QAAQ,MAAM;IACtD,KAAK,MAAM,IAAI;IACf,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG;GACjC,CAAC;EACH,CAAC;CACH,CAAC;CAEH,MAAM,gBAAgB,MAAgB,WAAsB,WAC1D,SAAS,YAAY;EACnB,MAAM,QAAQ,MAAM,aAAa,MAAM,MAAM;EAE7C,MAAM,QAAQ,MAAM,KACjB,OAAO,CAAC,CACR,MAAM,cAAc,QAAQ,SAAS,MAAM,UAAU,OAAO;EAE/D,IAAI,UAAU,KAAA,KAAa,MAAM,WAAW,GAC1C,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;EACzD,OAAO,MAAM;EAEb,OAAO;GAAE,QAAQ,MAAM;GAAI,SAAS,QAAQ,KAAK;EAAE;CACrD,CAAC;CAEH,MAAM,eAAe,IAAY,WAC/B,SAAS,YAAY;EACnB,MAAM,QAAQ,UAAU;EAExB,IAAI,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC;EAC9D,MAAM,QAAQ,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE;EAE/D,IAAI,UAAU,KAAA,KAAa,MAAM,WAAW,GAC1C,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc;EACzD,OAAO,MAAM;EACb,UAAU,QAAQ;EAClB,MAAM,QAAQ,kBAAkB,MAAM;CACxC,CAAC;CAEH,OAAO;EACI;EACT;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA,YAAY;GACV,QAAQ,WAAmB,KAAK,WAAW,IAAI,MAAM;GACrD,MAAM,WAAmB,KAAK,WAAW,OAAO,MAAM;GACtD,MAAM,WAAmB,WAAW,IAAI,MAAM;EAChD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;ACveA,MAAM,eAAe,OAAO,OAAO,EAAE,UAAU,OAAO,QAAQ,CAAC;;;;;;AAO/D,MAAa,4BAA4B,OACvC,UACA,QACA,UACA,SACA,QACA,YACoB;CACpB,IAAI,OAAO,SAAS,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC;CAC9D,MAAM,EAAE,aAAa,MAAM,OAAO;CAElC,MAAM,UAAU,MAAM,eACpB,SAAS,eAAe,UAAU;EAChC,SAAS;EACT,GAAI,QAAQ,cAAc,EAAE,YAAY,KAAK,IAAI,CAAC;CACpD,CAAC,CACH;CAEA,IAAI,OAAO,SAAS;EAClB,MAAM,kBAAkB,QAAQ,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;EACvD,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC;CAC5C;CACA,IAAI;EACF,UAAU,OAAO;EACjB,MAAM,SAAS,MAAM,qBAAqB,SAAS,UAAU,SAAS,MAAM;EAE5E,IAAI,OAAO,SAAS;GAClB,MAAM,OAAO,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC;GACxC,MAAM,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC;EAC5C;EAEA,OAAO;CACT,SAAS,OAAO;EACd,MAAM,kBAAkB,QAAQ,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;EACvD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,KAAK,KACjC,OAAO,GAAG,mBAAmB,CAAC,CAAC,KAAK,KACpC,OAAO,GAAG,aAAa,CAAC,CAAC,KAAK,IAC5B,QACA,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC;CACvC;AACF;;AAGA,MAAa,uBAAuB,OAClC,SACA,UACA,SACA,WACoB;CAEpB,MAAM,EAAE,WAAW,MAAM,OAAO;CAChC,MAAM,WAAW,QAAQ,SAAS;CAClC,MAAM,CAAC,WAAW;CAElB,IAAI,SAAS,WAAW,KAAK,YAAY,KAAA,GAAW,MAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC,CAAC;CAE5F,MAAM,0BAAU,IAAI,IAGlB;CAEF,MAAM,YAAY,IAAI,cAAc,KAAK,gBACvC,OAAO,MAAM;EAAE,QAAQ;EAAU,QAAQ;EAAY;CAAY,CAAC,CACpE;CAEA,MAAM,gBAAgB,IAAI,cAAc,MAAM;CAC9C,MAAM,eAAe,CAAC;CAEtB,IAAI,UAAU;CACd,IAAI,cAAc;CAClB,IAAI;CACJ,IAAI,4BAAkE,CAAC;CAEvE,MAAM,UAAU,YAAY,SAAS,SAAS,SAAS,SAAS,iBAAiB,SAAS;EACxF,SAAS,OAAO,YAAY;GAC1B,IAAI,eAAe,CAAC,WAAW,QAAQ,gBAAgB,SAAS;IAC9D,cAAmB,IAAI,MAAM,YAAY,MAAM,KAAK,MAAM,EAAE,iBAAiB,MAAM,CAAC,CAAC;IAErF;GACF;GACA,IAAI,eAAe,QAAQ,aACzB,UAAU,OAAO,YAAY;IAC3B,MAAM,YAAY,UAAU,KAAK;GACnC,CAAC;GACH,IAAI,aAAa,eAAe,WAAW,MAAM,IAAI;GACrD,IAAI,eAAe,CAAC,WAAW,QAAQ,gBAAgB,SAAS,OAAO,MAAM,OAAO;EACtF;EACA,WAAW,UAAU;GACnB,IAAI,QAAQ,gBAAgB,SAC1B,cAAmB,IAAI,MAAM,YAAY,MAAM,KAAK,MAAM,EAAE,iBAAiB,MAAM,CAAC,GAAG,EACrF,UAAU,iBACZ,CAAC;QAED,OAAO,MAAM;IACX,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,aAAa;GACf,CAAC;EACL;EACA,SAAS,UAAU;GACjB,QAAQ,YAAY,KAAK;GACzB,KAAK,MAAM,CAAC,QAAQ,iBAAiB,SACnC,IAAI,OAAO,KAAK,MAAM,MAAM,MAAM;IAChC,cAAc,UAAU,KAAK;IAC7B,QAAQ,OAAO,MAAM;GACvB;GACF,YAAY,WAAW,EAAE,QAAQ,MAAM,GAAG,CAAC;GAC3C,YAAY,OAAO,KAAK;GACxB,SAAS,OAAO,KAAK;EACvB;EACA,aAAa,OAAO,UAAU,YAAY,WAAW,OAAO,KAAK;EACjE,YAAY,OAAO,UAAU;GAC3B,IAAI,aAAa,eAAe,YAAY,OAAO,MAAM,IAAI;EAC/D;EACA,wBAAwB,OAAO,UAAU,oBAAoB,OAAO,KAAK;EACzE,eAAe,OAAO,UAAU;GAC9B,QAAQ,YAAY,OAAO,KAAK;GAEhC,YAAY,WAAW;IAAE,QAAQ,MAAM;IAAI,SAAS,QAAQ,QAAQ,KAAK;GAAE,CAAC;GAC5E,SAAS,WAAW,OAAO,kBAAkB,KAAK;EACpD;EACA,SAAS,OAAO,WAAW;GAEzB,MAAM,eACJ,OAAO,KAAK,MAAM,iBAAiB,QAAQ,aAAa,MAAM,EAAE,IAAI,KAAA;GAEtE,MAAM,WAAW,QAAQ,QAAQ;GAEjC,IAAI,QAAQ,iBAAiB,aAAa,UACxC,cAAmB,IAAI,cAAc,OAAO,QAAQ,GAAG;IACrD,GAAI,WAAW,EAAE,UAAU,kBAAkB,IAAI,CAAC;IAClD,UAAU,gBAAgB,cAAc,UAAU,gBAAgB,WAAW;GAC/E,CAAC;QACE;IACH,QAAQ,IAAI,QAAQ,YAAY;IAChC,YAAY,WAAW;IACvB,OAAO,MAAM,QAAQ;GACvB;EACF;EACA,UAAU,QAAQ,UAAU,YAAY,QAAQ,QAAQ,KAAK;CAC/D,CAAC;CAED,MAAM,EAAE,SAAS,SAAS,aAAa;CAEvC,MAAM,iBAAiB,mBACrB,SACA,SACA,SAAS,UACT,SACA,WACA,cACM,OACR;CAEA,MAAM,cAAc,gBAAgB,SAAS,SAAS,WAAW,MAAM;CAEvE,MAAM,UAAU,YACd,SACA,SACA,cACC,UAAU,iBAAiB,OAAO,YACrC;CAEA,MAAM,UAAU,YAAY,SAAS,OAAO;CAE5C,QAAQ,sBAAsB,QAAQ,UAAU;CAChD,MAAM,WAAW,aAAa,SAAS,SAAS,QAAQ,OAAO;CAC/D,MAAM,WAAW,mBAAmB,OAAO;CAE3C,sBAAsB,SAAS;CAE/B,MAAM,cAAc,gBAClB,SACA,SACA,SACA,SAAS,WACT,SACA,WACA,cACM,UACL,WAAW,YAAY,KAAK,MAAM,CACrC;CAEA,MAAM,UAAU,SAAe;EAC7B,SAAS,IAAI;CACf;CAEA,MAAM,gBAAgB;EACpB,cAAc,QAAQ;EACtB,QAAQ,WAAW;EACnB,YAAY,iBAAiB;EAC7B,OAAO,UAAU;CACnB;CAEA,MAAM,uBAAuB;EAC3B,QAAQ;EACR,IAAI,CAAC,SAAS;GACZ,YAAY,WAAW;GACvB,OAAO,aAAa;EACtB;CACF;CAEA,QAAQ,GAAG,QAAQ,MAAM;CACzB,QAAQ,GAAG,gBAAgB,cAAc;CAEzC,MAAM,qBAAqB,OAAO,UAAgC;EAChE,IAAI,eAAe,KAAA,GAAW,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,GAAG,cAAc;EACnF,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK;EAC7C,MAAM,UAAmB,MAAM,WAAW,KAAK,8BAA8B,EAAE,SAAS,CAAC;EACzF,MAAM,SAAS,WAAW,cAAc,OAAO;EAE/C,MAAM,WAAW,KAAK,2BAA2B;GAC/C,UAAU,OAAO;GACjB,OAAO,QAAQ,SAAS;GACxB,QAAQ,QAAQ,SAAS;EAC3B,CAAC;CACH;CAEA,MAAM,SAAiB;EACrB,GAAI,QAAQ,cACR,EACE,aAAa,YAAY,WAC3B,IACA,CAAC;EACL,UAAU,QAAQ;EAClB,kBAAkB,QAAQ;EAC1B,WAAW,QAAQ;EACnB,aAAa,QAAQ;EACrB,YAAY,QAAQ;EACpB,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,aAAa,QAAQ;EACrB,iBAAiB,QAAQ;EACzB,UAAU,YAAY;EACtB,SAAS,YAAY;EACrB,YAAY,YAAY;EACxB,cAAc,YAAY;EAC1B,YAAY,YAAY;EACxB,OAAO,QAAQ;EACf,MAAM,QAAQ;EACd,UAAU,QAAQ;EAClB,WAAW,YAAY;EACvB,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,QAAQ,QAAQ;EAChB,aAAa,QAAQ;EACrB,OAAO,QAAQ;EACf,OAAO,QAAQ;EACf,OAAO,SAAS;EAChB,MAAM,SAAS;EACf,YAAY,YAAY;EACxB,SAAS,UAAU,WACjB,SAAS,YAAY;GACnB,MAAM,OAAO,QAAQ,CAAC,CAAC,MAAM;GAC7B,MAAM,QAAQ,QAAQ,CAAC,CAAC;GAExB,OAAO,SAAS;GAChB,SAAS,WAAW,OAAO,SAAS;GACpC,YAAY,QAAQ,WAAW,EAAE,QAAQ,MAAM,GAAG,CAAC;GACnD,MAAM,KAAK,gBAAgB,QAAQ;GACnC,OAAO,MAAM;EACf,CAAC;EACH,SAAS,QAAQ;EACjB,gBAAgB,QAAQ;EACxB,cAAc,QAAQ;EACtB,kBAAkB,QAAQ;EAC1B,aAAa,QAAQ;EACrB,uBAAuB,QAAQ;EAC/B,mBAAmB,eAAe;EAClC,iBAAiB,WACf,SAAS,YAAY;GACnB,KAAK,MAAM,CAAC,QAAQ,iBAAiB,SAAS;IAC5C,MAAM,cAAc,MAAM,cAAc,IAAI,cAAc,OAAO,QAAQ,GAAG;KAC1E,gBAAgB,OAAO,SAAS;KAChC,UAAU,gBAAgB,cAAc,UAAU,gBAAgB,WAAW;IAC/E,CAAC;IAED,OAAO,MAAM;IACb,IAAI,gBAAgB,aAClB,MAAM,QACJ,gBAAgB,mBAAmB,QAAQ,KAAK,KAAK,CAAC,CAAC,IAAI,QAAQ,SAAS,KAAK,CAAC,CAAC,GACnF,gBAAgB,mBAAmB,iBAAiB,SACtD;IACF,QAAQ,OAAO,MAAM;GACvB;EACF,CAAC;EACH,SAAS,SAAS;EAClB,uBAAuB,YAAY;EACnC,qBAAqB,eAAe;EACpC,uBAAuB,eAAe;EACtC,kBACE,SAAS,YAAY;GACnB,UAAU;GACV,eAAe,MAAM;GACrB,UAAU,KAAK;GACf,YAAY,WAAW;GACvB,QAAQ,IAAI,QAAQ,MAAM;GAI1B,QAAQ,IAAI,gBAAgB,cAAc;GAC1C,KAAK,MAAM,SAAS,QAAQ,OAAO,GAAG,KAAK,MAAM,OAAO,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI;GAGjF,KAAK,MAAM,CAAC,QAAQ,iBAAiB,SACnC,cAAmB,IAAI,cAAc,OAAO,QAAQ,GAAG,EACrD,UAAU,gBAAgB,cAAc,UAAU,gBAAgB,WAAW,EAC/E,CAAC;GACH,SAAS,MAAM;GACf,MAAM,YAAY,eAAe,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;GACxD,MAAM,YAAY,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;GAC1C,MAAM,kBAAkB,cAAc,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GAC9D,cAAc,KAAK;GACnB,QAAQ,MAAM;GACd,MAAM,kBAAkB,UAAU,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GAC1D,MAAM,kBAAkB,YAAY,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GAC7D,MAAM,kBAAkB,YAAY,OAAO,KAAK,QAAQ,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACjF,MAAM,kBAAkB,QAAQ,MAAM,CAAC;GACvC,QAAQ;GACR,QAAQ,MAAM;EAChB,CAAC;CACL;CAEA,IAAI;EACF,KAAK,MAAM,QAAQ,QAAQ,MAAM,GAAG,SAAS,IAAI;EACjD,aAAa,MAAM,QAAQ,qBAAqB;EAChD,MAAM,WAAW,KAAK,+BAA+B;GACnD,UAAU;GACV,cAAc;GACd,eAAe;EACjB,CAAC;EAGD,MAAM,eAAe,QAAQ;EAC7B,KAAK,MAAM,SAAS,QAAQ,OAAO,GAAG,MAAM,eAAe,OAAO,MAAM,IAAI;EAC5E,MAAM,QAAQ,cAAc;EAC5B,MAAM,EAAE,cAAc;EAEtB,IAAI,UAAU,UAAU,KAAA,GAAW,MAAM,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC;EAC1E,MAAM,eAAe,OAAO,UAAU,MAAM,IAAI;EAChD,UAAU,QAAQ,UAAU,MAAM,KAAK,UAAU;EACjD,IAAI,CAAC,QAAQ,kBAAkB;GAC7B,MAAM,mBAAmB,UAAU,KAAK;GACxC,MAAM,UAAU,MAAM,KAAK,gBAAgB,QAAQ,QAAQ;EAC7D;EACA,MAAM,QAAQ,SAAS,UAAU,KAAK;EACtC,IAAI,QAAQ,aACV,KAAK,MAAM,SAAS,QAAQ,OAAO,GAAG,MAAM,YAAY,UAAU,KAAK;EACzE,cAAc;EAEd,OAAO;CACT,SAAS,OAAO;EACd,MAAM,OAAO,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC;EACxC,MAAM;CACR;AACF;;;;AC5XA,MAAa,cAAc,UAA0D;CACnF,IAAI,QAA2B,MAAM;CACrC,IAAI,YAAY;CAEhB,OAAO,cAAc,MAAM,MAAM,SAAS,cAAc,MAAM,SAAS,WACrE,QAAQ,MAAM;CAEhB,IAAI,MAAM,SAAS,eAAe,MAAM,IAAI,SAAS,WAAW,OAAO,CAAC;CACxE,MAAM,QAAQ,MAAM,OAAO;CAE3B,IAAI,MAAM,SAAS,aAAa,MAAM,KAAK,WAAW,GAAG,OAAO,CAAC;CACjE,MAAM,MAAM,MAAM,KAAK;CAEvB,IAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,KAAK,OAAO,CAAC;CAGzD,OAFiB,MAAM,IAAI,mBAAmB,MAAM,aAAa,SAAS,SAAS,GAErE,MAAM,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,IAAI;AACnD;;;AC+BA,MAAa,WACX,QACA,OACA,cAEA,OAAO,oBAAoB,MAAM,CAAC,CAAC,OAAO,EAAE,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KACvE,OAAO,UAAU,UACf,aAAa,KAAK;CAChB;CACA,QAAQ,QAAQ,cAAc,KAAK,WAAW,KAAK,CAAC;CACpD,SAAS;AACX,CAAC,CACH,CACF;AAEF,MAAa,WAET,QACA,WACA,aAED,UACC,OAAO,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KACxC,OAAO,UAAU,UACf,aAAa,KAAK;CAChB;CACA,QAAQ,QAAQ,UAAU,KAAK,WAAW,KAAK,CAAC;CAChD;AACF,CAAC,CACH,CACF;AAEJ,MAAM,SAAS,QAAQ,cAAc,iBAAiB,SAAS;AAC/D,MAAM,eAAe,QAAQ,cAAc,gBAAgB,SAAS;AACpE,MAAM,UAAU,QAAQ,cAAc,SAAS,SAAS;AACxD,MAAM,UAAU,QAAQ,cAAc,SAAS,SAAS;AACxD,MAAM,UAAU,QAAQ,cAAc,SAAS,SAAS;AACxD,MAAM,QAAQ,QAAQ,cAAc,QAAQ,SAAS;AACrD,MAAM,SAAS,QAAQ,gBAAgB,aAAa,SAAS;AAE7D,MAAM,cAAc,WAA6C;CAC/D,WAAW,YACT,QAAQ,iBAAiB,SAAS,UAAU,CAAC,CAAC,KAC5C,OAAO,SAAS,UAAU,MAAM,SAAS,MAAM,KAAK,MAAM,aAAa,CAAC,GACxE,OAAO,SAAS,QAAQ,QAAQ,kBAAkB,YAAY,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACnF;CACF,kBAAkB,YAChB,QAAQ,wBAAwB,SAAS,UAAU,CAAC,CAAC,KACnD,OAAO,SAAS,UAAU,MAAM,gBAAgB,MAAM,KAAK,MAAM,aAAa,CAAC,GAC/E,OAAO,KAAK,eAAe;EACzB,QAAQ,UAAU;EAClB,WAAW,UAAU,UAAU,KAC7B,OAAO,SAAS,QAAQ,QAAQ,kBAAkB,YAAY,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACnF;EACA,MAAM,UAAU;CAClB,EAAE,CACJ;CACF,WAAW,YACT,QAAQ,iBAAiB,SAAS,WAAW,CAAC,CAAC,KAC7C,OAAO,SAAS,UAAU,MAAM,SAAS,MAAM,QAAQ,CAAC,GACxD,OAAO,SAAS,SAAS,QAAQC,cAAY,aAAa,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CACrF;CACF,QAAQ,YACN,QAAQ,cAAc,SAAS,OAAO,CAAC,CAAC,KACtC,OAAO,SAAS,UAAU,MAAM,MAAM,MAAM,QAAQ,CAAC,GACrD,OAAO,SAAS,EAAE,KAAK,YAAY,OAAO;EAAE;EAAK;CAAM,CAAC,CAAC,CAC3D;CACF,OAAO,YACL,QAAQ,aAAa,SAAS,MAAM,CAAC,CAAC,KACpC,OAAO,SAAS,UAAU,MAAM,KAAK,MAAM,UAAU,MAAM,KAAK,CAAC,GACjE,OAAO,SAAS,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,CACzC;CACF,SAAS,YACP,QAAQ,eAAe,SAAS,QAAQ,CAAC,CAAC,KACxC,OAAO,SAAS,UAAU,MAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,CAAC,GAClE,OAAO,SAAS,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,CACzC;CACF,cAAc,YACZ,QAAQ,oBAAoB,SAAS,cAAc,CAAC,CAAC,KACnD,OAAO,SAAS,UAAU,MAAM,YAAY,MAAM,EAAE,CAAC,GACrD,OAAO,SAAS,UAAU,aAAa;EAAE,GAAG;EAAO,MAAM;CAAe,CAAC,CAAC,CAC5E;CACF,QAAQ,YACN,QAAQ,cAAc,SAAS,OAAO,CAAC,CAAC,KACtC,OAAO,SAAS,UAAU,MAAM,MAAM,MAAM,QAAQ,CAAC,GACrD,OAAO,SAAS,UAAU,QAAQ;EAAE,GAAG;EAAO,MAAM;CAAQ,CAAC,CAAC,CAChE;CACF,QAAQ,YACN,QAAQ,cAAc,SAAS,OAAO,CAAC,CAAC,KACtC,OAAO,SAAS,UACd,MACG,MAAM,MAAM,QAAQ,MAAM,QAAQ,MAAM,EAAE,CAAC,CAC3C,KACC,OAAO,SAAS,UACd,QAAQ;EAAE,GAAG;EAAO,MAAM;EAAS,OAAO;GAAE,GAAG,MAAM;GAAQ,GAAG,MAAM;EAAO;CAAE,CAAC,CAClF,CACF,CACJ,CACF;CACF,QAAQ,YACN,QAAQ,cAAc,SAAS,OAAO,CAAC,CAAC,KACtC,OAAO,SAAS,UAAU,MAAM,MAAM,MAAM,KAAK,MAAM,aAAa,CAAC,GAAG,MAAM,IAAI,CAAC,GACnF,OAAO,SAAS,UAAU,QAAQ;EAAE,GAAG;EAAO,MAAM;CAAQ,CAAC,CAAC,CAChE;CACF,OAAO,YACL,QAAQ,aAAa,SAAS,MAAM,CAAC,CAAC,KACpC,OAAO,SAAS,UAAU,MAAM,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC,GAC5D,OAAO,SAAS,UAAU,MAAM;EAAE,GAAG;EAAO,MAAM;CAAO,CAAC,CAAC,CAC7D;CACF,aAAa,YACX,QAAQ,mBAAmB,SAAS,YAAY,CAAC,CAAC,KAChD,OAAO,SAAS,UAAU,MAAM,WAAW,MAAM,QAAQ,CAAC,GAC1D,OAAO,SAAS,UACd,QACE,kBACA,cACA,cACF,CAAC,CAAC;EAAE,WAAW;EAAa,OAAO,IAAI,WAAW,KAAK;CAAE,CAAC,CAC5D,CACF;AACJ;AAEA,MAAM,oBAAoB,UAIxB,OAAO,OAAO;CACZ,GAAG,WAAW,MAAM,UAAU;CAC9B,QAAQ,OAAO,OAAO,OAAO,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;AACxD,CAAC;;AAGH,MAAM,kBAAkB,WACtB,OAAO,SAAS,SACZ,SACA,OAAO,SAAS,YAAY,OAAO,SAAS,iBAC1C,WACA,OAAO,SAAS,YACd,YACA,OAAO,SAAS,UACd,UACA,OAAO,SAAS,gBACd,gBACA,OAAO,SAAS,kBACd,kBACA;AAEhB,MAAa,eACX,UACA,aACsB;CACtB,MAAM,OAAO,OAAO,OAAO;EACzB,UAAU,aAAa,OAAO;EAC9B,OAAO,OAAO,SAAS;GAAC;GAAW;GAAU;GAAY;EAAU,CAAC;CACtE,CAAC;CAED,MAAM,YAAY,QAAgB,OAAO,EAAE,IAAI,CAAC;CAEhD,MAAM,UAA6B;EACjC,GAAG,WAAW,SAAS,UAAU;EACjC,gBAAgB,SAAS;EACzB,QAAQ,SAAS;EACjB,aAAa,SAAS;EACtB,cAAc,SAAS;EACvB,SAAS,SAAS;EAClB,oBAAoB,SAAS;EAC7B,QAAQ,SAAS,OAAO,KAAK,OAAO,IAAI,UAAU,CAAC;EACnD,QAAQ,SAAS;EACjB,UAAU,UAAU,CAAC,MACnB,QAAQ,oBAAoB,SAAS,SAAS,CAAC,CAAC,KAC9C,OAAO,SAAS,UAAU,SAAS,QAAQ;GAAE,GAAG;GAAO,OAAO,MAAM,SAAS;EAAW,CAAC,CAAC,CAC5F;EACF,aAAa,UAAU,CAAC,MACtB,QAAQ,mBAAmB,SAAS,YAAY,CAAC,CAAC,KAChD,OAAO,SAAS,UACd,SAAS,WAAW;GAAE,GAAG;GAAO,SAAS,MAAM,WAAW;EAAM,CAAC,CACnE,GACA,OAAO,SAAS,EAAE,SAAS,GAAG,cAC5B,QACE,YACA,cACA,cACF,CAAC,CAAC;GACA,GAAG;GACH,GAAI,YAAY,KAAA,IACZ,CAAC,IACD,EAAE,SAAS;IAAE,WAAW;IAAa,OAAO,IAAI,WAAW,OAAO;GAAE,EAAE;EAC5E,CAAC,CACH,CACF;EACF,eAAe,cACb,QAAQ,iBAAiB,WAAW,eAAe,CAAC,CAAC,KACnD,OAAO,QAAQ,SAAS,YAAY,CACtC;EACF,oBAAoB,cAClB,QAAQ,iBAAiB,WAAW,YAAY,CAAC,CAAC,KAChD,OAAO,SAAS,UAAU,SAAS,WAAW,KAAK,CAAC,CAAC,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC,CAC7E;EACF,eAAe,WAAW,cACxB,QAAQ,iBAAiB,WAAW,OAAO,CAAC,CAAC,KAC3C,OAAO,SAAS,UAAU,SAAS,WAAW,MAAM,OAAO,WAAW,KAAK,CAAC,GAC5E,OAAO,SAAS,EAAE,KAAK,YAAY,OAAO;GAAE;GAAK;EAAM,CAAC,CAAC,CAC3D;EACF,cAAc,WAAW,OAAO,cAC9B,QAAQ,iBAAiB,WAAW,MAAM,CAAC,CAAC,KAC1C,OAAO,SAAS,YACd,QAAQ,YAAY,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,KAC/C,OAAO,SAAS,SAAS,SAAS,WAAW,KAAK,SAAS,MAAM,WAAW,KAAK,CAAC,CACpF,CACF,GACA,OAAO,QAAQ,QAAQ,CACzB;EACF,eAAe,WAAW,SAAS,cACjC,QAAQ,iBAAiB,WAAW,eAAe,CAAC,CAAC,KACnD,OAAO,SAAS,YACd,QAAQ,eAAe,SAAS,eAAe,CAAC,CAAC,KAC/C,OAAO,SAAS,QAAQ,SAAS,aAAa,SAAS,KAAK,WAAW,KAAK,CAAC,CAC/E,CACF,GACA,OAAO,QAAQ,QAAQ,CACzB;EACF,WAAW,SAAS,WAAW,UAAU,CAAC,MACxC,QAAQ,iBAAiB,SAAS,WAAW,CAAC,CAAC,KAC7C,OAAO,SAAS,SACd,QAAQ,iBAAiB,SAAS,WAAW,CAAC,CAAC,KAC7C,OAAO,SAAS,aACd,SAAS,SAAS,MAAM,WAAW,OAAO;GACxC,QAAQ,SAAS,UAAU;GAC3B,cAAc,SAAS,gBAAgB;EACzC,CAAC,CACH,CACF,CACF,GACA,OAAO,QAAQ,MAAM,CACvB;EACF,eAAe,WAAW,cACxB,QAAQ,iBAAiB,WAAW,OAAO,CAAC,CAAC,KAC3C,OAAO,SAAS,UAAU,SAAS,WAAW,MAAM,OAAO,WAAW,KAAK,CAAC,GAC5E,OAAO,SAAS,UAAU,QAAQ;GAAE,GAAG;GAAO,MAAM;EAAQ,CAAC,CAAC,CAChE;EACF,eAAe,WAAW,QAAQ,cAChC,QAAQ,iBAAiB,WAAW,OAAO,CAAC,CAAC,KAC3C,OAAO,SAAS,YACd,QAAQ,WAAW,QAAQ,OAAO,CAAC,CAAC,KAClC,OAAO,SAAS,UACd,SAAS,WAAW,MAClB,MAAM,KACN,MAAM,aAAa,CAAC,GACpB,SACA,WAAW,KACb,CACF,CACF,CACF,GACA,OAAO,SAAS,UAAU,QAAQ;GAAE,GAAG;GAAO,MAAM;EAAQ,CAAC,CAAC,CAChE;EACF,cAAc,WAAW,MAAM,cAC7B,QAAQ,iBAAiB,WAAW,MAAM,CAAC,CAAC,KAC1C,OAAO,SAAS,YACd,QAAQ,YAAY,OAAO,MAAM,MAAM,MAAM,CAAC,CAAC,KAC7C,OAAO,SAAS,UAAU,SAAS,WAAW,KAAK,OAAO,SAAS,WAAW,KAAK,CAAC,CACtF,CACF,GACA,OAAO,SAAS,UAAU,MAAM;GAAE,GAAG;GAAO,MAAM;EAAO,CAAC,CAAC,CAC7D;EACF,OAAO,SAAS;EAChB,QAAQ,SAAS;EACjB,WAAW,SACT,QAAQ,UAAU,MAAM,aAAa,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,QAAQ,CAAC;EAC/E,UAAU,SACR,QAAQ,UAAU,MAAM,QAAQ,CAAC,CAAC,KAChC,OAAO,QAAQ,SAAS,OAAO,GAC/B,OAAO,IAAI,gBAAgB,CAC7B;EACF,WAAW,MAAM,UACf,QAAQ,UAAU,MAAM,QAAQ,CAAC,CAAC,KAChC,OAAO,SAAS,gBACd,QAAQ,WAAW,OAAO,QAAQ,CAAC,CAAC,KAClC,OAAO,SAAS,iBAAiB,SAAS,SAAS,aAAa,YAAY,CAAC,CAC/E,CACF,GACA,OAAO,IAAI,gBAAgB,CAC7B;EACF,aAAa,SACX,QAAQ,UAAU,MAAM,aAAa,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,UAAU,CAAC;EACjF,cAAc,OACZ,QAAQ,YAAY,IAAI,cAAc,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,WAAW,CAAC;EACnF,YAAY,SAAS,WAAW;EAChC,YAAY,SACV,QAAQ,UAAU,MAAM,YAAY,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,SAAS,CAAC;EAC/E,iBAAiB,aACf,QAAQ,UAAU,UAAU,QAAQ,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,MAAM,CAAC;EAC5E,UAAU,YACR,QAAQ,MAAM,SAAS,MAAM,CAAC,CAAC,KAC7B,OAAO,SAAS,UAAU,SAAS,QAAQ,MAAM,UAAU,MAAM,KAAK,CAAC,CACzE;EACF,iBAAiB,YACf,QAAQ,uBAAuB,SAAS,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,SAAS,cAAc,CAAC;EAC9F,eAAe,YACb,QAAQ,cAAc,SAAS,gBAAgB,CAAC,CAAC,KAC/C,OAAO,SAAS,UAAU,SAAS,aAAa,MAAM,QAAQ,CAAC,GAC/D,OAAO,SAAS,EAAE,KAAK,YAAY,OAAO;GAAE;GAAK;EAAM,CAAC,CAAC,CAC3D;EACF,OAAO,SAAS,UAAU,KACxB,OAAO,UAAU,UACf,oBAAoB,KAAK;GACvB,WAAW;GACX,MAAM;GACN,QAAQ,eAAe,MAAM,MAAM;EACrC,CAAC,CACH,GACA,OAAO,SAAS,UACd,MAAM,SAAS,aACX,OAAO,KACL,oBAAoB,KAAK;GACvB,WAAW;GACX,MAAM,MAAM;GACZ,QAAQ,MAAM,WAAW,WAAW,WAAW,MAAM;EACvD,CAAC,CACH,IACA,OAAO,QAAoC,EAAE,MAAM,MAAM,KAAK,CAAC,CACrE,CACF;CACF;CAEA,UAAU,SAAS,SAAS,OAAO;CACnC,qBAAqB,SAAS,SAAS,WAAW;CAElD,OAAO;AACT;;;AC7WA,MAAa,eAAkC;CAC7C,OAAO,OAAO;CACd,SAAS,OAAO;CAChB,gBAAgB,OAAO;CACvB,YAAY,OAAO,QAAQ,eAAe;AAC5C;AAMA,MAAM,WAAW,OAAO,uBAAuB;;AAG/C,MAAa,eACX,QACA,kBAEA,OAAO,KACL,OAAO,eACP,OAAO,cAAc;CAAE,UAAU;CAAe,cAAc,OAAO,KAAK,QAAQ;AAAE,CAAC,GACrF,OAAO,MACP,OAAO,KAAK,SAAyB;CACnC,IAAI,KAAK,UAAU,IAAI,GAAG,OAAO;EAAE,MAAM;EAAW,OAAO,KAAK;CAAM;CACtE,MAAM,QAAQ,MAAM,gBAAgB,KAAK,KAAK;CAE9C,OAAO;EACL,MAAM;EACN,QACE,OAAO,OAAO,KAAK,KAAK,MAAM,UAAU,WACpC,YACA,MAAM,cAAc,KAAK,KAAK,IAC5B,gBACA;CACV;AACF,CAAC,CACH;;AAGF,MAAa,YAAkB,WAC7B,YAAY,QAAQ,GAAI,CAAC,CAAC,KAAK,OAAO,MAAM;;;;ACzC9C,MAAa,UACX,QACA,UACA,cAEA,OAAO,IAAI,aAAa;CACtB,MAAM,MAAM,OAAO,OAAO,MAAM,kBAAkB,IAAI;CAEtD,OAAO,OAAO,YAAY,MACtB,OAAO,KAAK,UAAU,CAAC,IACvB,OAAO,KACL,OAAO,cAAc;EACnB,UAAU,SAAS,OAAO,WAAW,GAAG;EACxC,cAAc,OAAO,KAAK,UAAU,CAAC;CACvC,CAAC,CACH;AACN,CAAC;AAsEH,MAAa,YAAY,OAAO,WAAW,WAAW,QAAgB;CACpE,MAAM,YAAY,OAAO,UAAU,KAAK,CAAC;CACzC,MAAM,QAAQ,OAAO,MAAM;CAE3B,MAAM,mBACJ,OAAO,OAAO,MAAM,kBAAkB,IAAI,MAAY,OAAO;CAE/D,MAAM,wBAAQ,IAAI,IAA6D;CAE/E,MAAM,QAAQ;EACZ,OAAO;EACP,YAAY;EACZ,UAAU;EACV,WAAW;EACX,SAAS;EACT,WAAW;CACb;CAEA,IAAI;CACJ,IAAI,gBAAgB;CAEpB,IAAI;CAUJ,MAAM,+BAAe,IAAI,IAA6B;CAEtD,MAAM,6BAAa,IAAI,IAAY;CACnC,IAAI,oBAAoB;CACxB,IAAI,iBAAuC;CAC3C,IAAI,cAAoC;CACxC,MAAM,2BAAW,IAAI,IAAiE;CACtF,MAAM,UAAwD,CAAC;CAC/D,IAAI,QAAQ;CACZ,IAAI,UAAU;CAEd,MAAM,UACJ,QACA,aACA,aAAa,MAAM,eAChB;EACH,QAAQ,KAAK,IAAI,OAAO,kBAAkB,QAAQ,CAAC;EACnD,IAAI,QAAQ,WAAW,IAAI;GACzB,QAAQ,MAAM;GACd,UAAU,KAAK,IAAI,OAAO,kBAAkB,UAAU,CAAC;EACzD;EACA,QAAQ,KACN,OAAO,OACL,kBAAkB,KAAK;GACrB;GACA;GACA;GACA,gBAAgB,MAAM,yBAAyB;EACjD,CAAC,CACH,CACF;CACF;CAEA,MAAM,cAAc,UAAiB;EACnC,KACG,mBAAmB,QAAQ,MAAM,UAAU,YAAY,MAAM,UAAU,cACxE,UAAU,aACV,UAAU,UAEV;EACF,MAAM,QAAQ;EACd,IAAI,UAAU,QAAQ,cAAc;CACtC;CAEA,MAAM,cAAc,QAAsB,QAA0B,UAAU;EAC5E,IAAI,UAAU,SAAU,UAAU,UAAU,MAAM,WAAW,SAAS,OAAO,QAC3E,SAAS,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;EACxC,MAAM;EACN,KAAK,MAAM,QAAQ,OAAO,KAAK,QAAQ,KAAK;CAC9C;CAEA,MAAM,SAAS,OAAc,QAAsB,YAA4B;EAC7E,IACE,MAAM,UAAU,YACf,MAAM,UAAU,aAAa,UAAU,YAAY,UAAU,WAE9D;EACF,IAAI,UAAU,eAAe,UAAU,aAAa,UAAU,aAAa,UAAU,UACnF,mBAAmB,YAAY,UAAU,cAAc,mBAAmB;OACvE,IAAI,YAAY,KAAA,GAAW,cAAc;EAE9C,IAAI,EAAE,MAAM,UAAU,aAAa,UAAU,cAAc,MAAM,QAAQ;EACzE,MAAM;EACN,MAAM,UAAU,CAAC,GAAG,aAAa,OAAO,CAAC;EAEzC,aAAa,MAAM;EACnB,QAAQ,MAAM;EACd,SAAS,OACP,mBAAmB,YAAY,QAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,MAAM,KAAK,CAAC,CAAC,CACjF;EACA,KAAK,MAAM,eAAe,SAAS,YAAY,MAAM;EACrD,WAAW,MAAM;CACnB;CAEA,MAAM,aACJ,QACA,aACA,aAAa,MAAM,eAChB;EACH,IAAI,gBAAgB,WAAW,oBAAoB;EACnD,OAAO,QAAQ,gBAAgB,UAAU,cAAc,aAAa,UAAU;EAC9E,MACE,gBAAgB,YAAY,cAAc,WAC1C,gBAAgB,YAAY,cAAc,UAC1C,MACF;CACF;CAEA,MAAM,eAAe;EACnB,IAAI,mBAAmB,QAAQ,MAAM,UAAU,aAAa,MAAM,UAAU,UAAU;EACtF,UAAU,WAAW,OAAO;CAC9B;;CAGA,MAAM,UACJ,OACA,eACG;EACH,IAAI,MAAM,gBAAgB,cAAc,OAAO,MAAM,QAAQ,MAAM,aAAa,UAAU;EAC1F,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;EAEzC,QAAQ,MAAM,aAAd;GACE,KAAK;IACH,IAAI,aAAa,KAAA,KAAa,mBAAmB,MAAM,SAAS,IAAI,MAAM,OAAO,KAAK;IACtF;GACF,KAAK;IACH,WAAW,IAAI,MAAM,KAAK;IAC1B,IAAI,aAAa,KAAA,GAAW,SAAS,IAAI,MAAM,OAAO,KAAK;IAC3D;GACF,KAAK;IACH,WAAW,OAAO,MAAM,KAAK;IAC7B,SAAS,OAAO,MAAM,KAAK;IAC3B;GACF,KAAK;IAEH,WAAW,IAAI,MAAM,KAAK;IAC1B,MAAM,aAAa,aAAa,MAAM,MAAM;IAC5C;GACF,KAAK;IACH,SAAS,OAAO,MAAM,KAAK;IAC3B,MAAM,WAAW,UAAU,MAAM,MAAM;EAE3C;CACF;;CAGA,MAAM,WAAW,QAA6B;EAE5C,MAAM,aAAa,IAAI,gBAAgB;EAEvC,aAAa,IAAI,KAAK,UAAU;EAChC,WAAW,IAAI,UAAU;EAEzB,OAAO;GACL,QAAQ,WAAW;GACnB,SAAS,YAAY;IAGnB,IACE,YAAY,aACZ,aAAa,IAAI,GAAG,MAAM,cAC1B,OAAO,MAAM,yBAAyB,CAAC,IAAI,OAAa,kBAExD,OAAO;IAET,IAAI,aAAa,IAAI,GAAG,MAAM,YAAY;IAC1C,aAAa,OAAO,GAAG;IACvB,IAAI,YAAY,SAAS,WAAW,OAAO,UAAU;SAChD,MAAM,aAAa,WAAW;GACrC;EACF;CACF;;;;;CAMA,MAAM,aAAa,WAAmB,QAAsB,eAAkC;EAC5F,UAAU,MAAM;EAChB,IAAI,YAAY,KAAA,GACd,MAAM,aAAa,KAAK;GACtB,WAAW;GACX,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;GAC5B,SAAS;EACX,CAAC;EACH,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,SAAS,SAAS,WAA+B;EACvD,MAAM,aAAa,UAAU;EAC7B,MAAM,WAAW,UAAU;EAC3B,IAAI,UAAU;EACd,IAAI,UAAU;EACd,IAAI;EAEJ,MAAM,SAAS,WACb,aAAa,KAAK;GAAE,WAAW;GAAQ;GAAQ,SAAS;EAAe,CAAC;EAE1E,MAAM,gBAAgB;GACpB,IAAI,WAAW,CAAC,OAAO,WAAW,YAAY,QAAQ,UAAU,KAAA;EAClE;EAEA,MAAM,YAAY,SAA4C;GAC5D,IAAI,CAAC,OAAO,SAAS;GACrB,OAAO,UAAU;GACjB,QAAQ;GACR,SAAS,WAAW,QAAQ,IAAI;EAClC;EAEA,MAAM,UAA+B,SAAS,QAAQ,YAAY,KAAK,CAAC,CAAC,MAAM;GAC7E,IAAI,OAAO,SAAS;IAClB,WAAW,MAAM,MAAM;IACvB,SAAS,OAAO,KAAK,QAAQ,CAAC;GAChC;GACA,WAAW,MAAM;EACnB;EAEA,MAAM,SAAS;GACb;GACA,QAAQ,EAAE,GAAG,OAAO;GACpB,SAAS;GACT;GACA,cAAc;IACZ,UAAU;IACV,QAAQ;GACV;EACF;EAEA,UAAU;EAEV,MAAM,cAAc;GAClB,MAAM,MAAM,OAAO,MAAM,yBAAyB,CAAC,IAAI;GAEvD,IAAI,OAAO,kBAAkB,OAAO;GACpC,IAAI,aAAa,KAAA,GAAW,MAAM;GAClC,IAAI,WAAW,OAAO,WAAW,MAAM,eAAe,cAAc,MAAM,UAAU,QAClF,MAAM,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;GACpC,IAAI,OAAO,UAAU,MAAM,MAAM,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC;EAC3D;EAEA,MAAM,SAAqB;GACzB,QAAQ,WAAW;GACnB;GACA;GACA,uBACE,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM,yBAAyB,CAAC,IAAI,GAAS;GAC7E;GACA,kBAAkB,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;GAC/C,QAAQ,OAAO;EACjB;EAEA,MAAM,QAAQ,UAAmB;GAC/B,IAAI,UAAU,YAAY,OAAO,QAAQ;IACvC,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;IAChC,SAAS;GACX,CAAC;GAED,IAAI;IACF,MAAM;GACR,SAAS,SAAS;IAChB,UAAU,YAAY,SAAS,QAAQ,OAAO;GAChD;GACA,SAAS,OAAO,KAAK,OAAO,CAAC;EAC/B;EAEA,OAAO;GACL;GACA;GACA,WAAW,OAAO,SAAS,MAAM,MAAM,GAAG,gBAAgB;IACxD,IAAI,OAAO,MAAM,yBAAyB,CAAC,IAAI,OAAa,kBAAkB,OAAO;IACrF,OAAO,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC;IAE/B,OAAO,YAAY,MAAM,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC;GACnD,CAAC,CAAC,CAAC,KACD,OAAO,UACL,OAAO,IAAI;IACT,KAAK;IACL,QAAQ,UACN,YAAY,OAAO,QAAQ;KACzB,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;KAC7B,SAAS;IACX,CAAC;GACL,CAAC,CACH,CACF;GACA,QAAQ,SAAS;IACf,IAAI,SAAS;IACb,UAAU;IACV,IAAI;KACF,MAAM;KAEN,KAAU,CAAC,CAAC,WAAW;MACrB,IAAI;OACF,MAAM;OACN,SAAS,OAAO,IAAI;MACtB,SAAS,OAAO;OACd,KAAK,KAAK;MACZ;KACF,GAAG,IAAI;IACT,SAAS,OAAO;KACd,OAAO,OAAO;KACd,KAAK,KAAK;IACZ;GACF;EACF;CACF;CAEA,MAAM,SACJ,WACA,MACA,UAWI,CAAC,MAEL,OAAO,cAAc;EACnB,IAAI;EAEJ,MAAM,OAAO,OAAO,IAAI,aAAa;GACnC,gBAAgB;GAChB,IAAI,EAAE,QAAQ,UAAU,CAAC,MAAM,EAAA,CAAG,SAAS,MAAM,KAAK,KAAK,SAAS,OAAO,GACzE,OAAO,OAAO,aAAa,KAAK;IAC9B;IACA,QACE,mBAAmB,YACf,QAAQ,QAAQ,KAAK,CAAC,CAAC,IACvB,MAAM,UAAU,YAAa,mBAAmB,QAAQ,SAAS,OAAO,IACtE,QAAQ,KAAK,KAAK,CAAC,CAAC,IACpB,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC;GAEH,OAAO,QAAQ,aAAa,OAAO;GACnC,MAAM,MAAM,OAAO,OAAO,MAAM,kBAAkB,IAAI;GAEtD,IAAI,OAAO,kBAAkB;IAC3B,OAAO;IAEP,OAAO,OAAO,aAAa,KAAK;KAC9B;KACA,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;KAC/B,SAAS;IACX,CAAC;GACH;GAEA,MAAM,WAAW,KAAK,IACpB,QAAQ,aAAa,MAAM,OAAO,qBAClC,QAAQ,kBAAkB,KAAA,IACtB,OAAO,oBACP,MAAM,QAAQ,eAClB,gBACF;GAEA,IAAI,OAAO,UACT,OAAO,OAAO,aAAa,KAAK;IAC9B;IACA,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;IAC/B,SAAS;GACX,CAAC;GACH,IAAI,QAAQ,WAAW,OAAO;IAC5B,MAAM,WAAW,QAAQ,WAAW;IACpC,MAAM,UAAU,WAAW,OAAO,eAAe,OAAO;IACxD,MAAM,WAAW,WAAW,MAAM,YAAY,MAAM;IAEpD,IAAI,YAAY,SACd,OAAO,OAAO,aAAa,KAAK;KAC9B;KACA,QAAQ,QAAQ,MAAM,KAAK;MACzB,WAAW,WAAW,eAAe;MACrC;MACA;KACF,CAAC;KACD,SAAS;IACX,CAAC;IACH,IAAI,UAAU,MAAM;SACf,MAAM;GACb;GAGA,MAAM,aAAa,IAAI,gBAAgB;GAEvC,SAAS;GACT,IAAI,aAAa;GACjB,MAAM,aAAa,MAAM;GACzB,MAAM,UAAU,QAAQ,UAAU,CAAC,MAAM;GAEzC,MAAM,cAAc;IAClB,IAAI,OAAO,MAAM,yBAAyB,CAAC,IAAI,OAAa,kBAAkB,OAAO;IACrF,IACE,WAAW,OAAO,WAClB,MAAM,eAAe,cACrB,CAAC,QAAQ,SAAS,MAAM,KAAK,GAE7B,MAAM,aAAa,KAAK;KACtB;KACA,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;KAC7B,SAAS,aAAa,YAAY;IACpC,CAAC;IAEH,IAAI,OAAO,MAAM,yBAAyB,CAAC,IAAI,OAAa,UAC1D,MAAM,aAAa,KAAK;KACtB;KACA,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;KAC/B,SAAS,aAAa,YAAY;IACpC,CAAC;GACL;GAEA,MAAM,SAAiB;IACrB,QAAQ,WAAW;IACnB;IACA;IACA,uBACE,KAAK,IAAI,GAAG,WAAW,OAAO,MAAM,yBAAyB,CAAC,IAAI,GAAS;IAC7E,IAAI,aAAa;KACf,OAAO;IACT;IACA;IACA,WAAW;KACT,MAAM;KACN,IAAI,CAAC,cAAc,QAAQ,UACzB,WAAW,eAAe,QAAQ,gBAAgB,KAAK,KAAK;KAC9D,aAAa;KACb,WAAW,IAAI,UAAU;IAC3B;GACF;GAEA,WAAW;GAEX,MAAM,kBAAkB;IAEtB,IAAI,OAAO,MAAM,yBAAyB,CAAC,IAAI,OAAa,kBAAkB,OAAO;IACrF,MAAM,SAAS,WAAW,OAAO;IAEjC,WAAW,MAAM;IACjB,IAAI,cAAc,CAAC,UAAU,MAAM,UAAU,aAAa,MAAM,UAAU,UACxE,MAAM,aAAa,WAAW;GAClC;GAEA,OAAO,OAAO,OAAO,KAAK,MAAM,GAAG,OAAO,gBAAgB;IACxD,UAAU;IAEV,OAAO,aAAa,KAAK;KACvB;KACA,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;KAC/B,SAAS,aAAa,YAAY;IACpC,CAAC;GACH,CAAC,CAAC,CAAC,KACD,OAAO,UACL,QAAQ,gBAAgB,QACpB,OAAO,OACP,OAAO,IAAI;IACT,KAAK;IACL,aACE,aAAa,KAAK;KAChB;KACA,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;KAC7B,SAAS,aAAa,YAAY;IACpC,CAAC;GACL,CAAC,CACP,GACA,OAAO,OAAO,UAAkD;IAC9D,IAAI,YAAY,UAAU;IAG1B,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,KAAK,GAAG,OAAO,OAAO,KAAK,KAAK;IAE7D,OAAO,OAAO,KACZ,aAAa,KAAK;KAChB;KACA,QAAQ,MAAM;KACd,SAAS,MAAM;IACjB,CAAC,CACH;GACF,CAAC,GACD,OAAO,kBAAkB,OAAO,KAAK,SAAS,CAAC,GAC/C,OAAO,UAAU,OAAO,WAAW,WAAW,OAAO,UAAU,CAAC,CAAC,GACjE,OAAO,SACL,OAAO,WAAW;IAChB,WAAW,MAAM;IACjB,IAAI,WAAW,YAAY,SAAS,KAAA;GACtC,CAAC,CACH,CACF;EACF,CAAC,CAAC,CAAC,KACD,OAAO,SACL,OAAO,WAAW;GAChB,gBAAgB;EAClB,CAAC,CACH,CACF;EAEA,IAAI,QAAQ,cAAc,KAAA,GACxB,OAAO,OACL,UAAU,YAAY,CAAC,CAAC,CAAC,IAAI,GAC7B,KAAK,IAAI,QAAQ,WAAW,gBAAgB,SAE1C,aAAa,KAAK;GAChB;GACA,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;GAC/B,SAAS,UAAU,eAAe,OAAO,YAAY;EACvD,CAAC,CACL;EAEF,OAAO,UACJ,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,CAC/B,KACC,OAAO,QACL,OAAO,iBACL,aAAa,KAAK;GAChB;GACA,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;GAC5B,SAAS;EACX,CAAC,CACH,CACF,CACF;CACJ,CAAC;;CAGH,OAAO;EACL;EACA;EACA;EACA;EACA,WAAW,QAAyB,aAAa,IAAI,GAAG;EACxD;EACA,qBAAqB,YAAY,KAAA;EACjC,cAAc,WACZ,SAAS,YAAY,SAAS,WAAW,KAAA,KAAa,QAAQ,OAAO,WAAW;;EAElF,aAAa,eAAuB;GAClC,MAAM,WAAW;GAEjB,IAAI,UAAU,eAAe,YAAY;GACzC,SAAS,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;GACtC,SAAS,OAAO;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA,qBAAqB;GACnB,MAAM,WAAW;GAEjB,UAAU,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;GACvC,UAAU,OAAO;GACjB,WAAW,MAAM;GACjB,oBAAoB;GACpB,SAAS,MAAM;EACjB;EACA,QAAQ,OAAO,WAAW;GACxB,MAAM,SAAS,cAAc,KAAK;IAChC,OAAO,MAAM;IACb,QAAQ,kBAAkB,eAAe,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,UAAU;IACnF,YAAY,MAAM;IAClB,MAAM,iBAAiB,SAAS,OAAO,KAAK,YAAY,KAAA;IACxD,oBAAoB,qBAAqB,WAAW,OAAO;IAC3D,SAAS;KAAE,MAAM,MAAM;KAAS,SAAS,OAAO;IAAW;GAC7D,CAAC;GAGD,OAAO,OAAO,OAAO,OAAO;GAE5B,OAAO,OAAO,OAAO,MAAM;EAC7B,CAAC;EACD,aAAa,OAAO,WAAW;GAC7B,MAAM,WAAW,mBAAmB,KAAK;IACvC,SAAS,CAAC,GAAG,OAAO;IACpB;IACA;IACA,WAAW,UAAU;GACvB,CAAC;GAGD,KAAK,MAAM,UAAU,SAAS,SAAS,OAAO,OAAO,MAAM;GAC3D,OAAO,OAAO,SAAS,OAAO;GAE9B,OAAO,OAAO,OAAO,QAAQ;EAC/B,CAAC;EACD,aAAa,MAA2E;GACtF,MAAM,IAAI,IAAI;GAEd,aAAa;IACX,MAAM,OAAO,IAAI;GACnB;EACF;CACF;AACF,CAAC;;AAKD,MAAM,aAAa,YAA8D;CAC/E,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;CAChC,SAAS,OAAO,aAAa,YAAY;AAC3C;;;;;AAMA,MAAa,UAAa,WAA6B,QAAgB,SACrE,OAAO,UAA2B,WAAW;CAC3C,IAAI,OAAO;CAEX,MAAM,gBAAgB;EACpB,OAAO;EACP,OAAO,OAAO,oBAAoB,SAAS,KAAK;CAClD;CAEA,MAAM,cAAc;EAClB,IAAI,MAAM;EACV,QAAQ;EACR,OACE,OAAO,KACL,aAAa,KAAK;GAChB;GACA,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;GAC7B,SAAS,OAAO,aAAa,YAAY;EAC3C,CAAC,CACH,CACF;CACF;CAEA,OAAO,OAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;CAC7D,IAAI;EACF,OAAO,MAAM;EAEb,KAAU,CAAC,CAAC,MACT,UAAU;GACT,IAAI,CAAC,MAAM;IACT,QAAQ;IACR,OAAO,OAAO,QAAQ,KAAK,CAAC;GAC9B;EACF,IACC,UAAmB;GAClB,IAAI,CAAC,MAAM;IACT,QAAQ;IACR,OAAO,OAAO,KAAK,YAAY,OAAO,WAAW,UAAU,MAAM,CAAC,CAAC,CAAC;GACtE;EACF,CACF;CACF,SAAS,OAAO;EACd,QAAQ;EACR,OAAO,OAAO,KAAK,YAAY,OAAO,WAAW,UAAU,MAAM,CAAC,CAAC,CAAC;CACtE;CAEA,OAAO,OAAO,KAAK,OAAO;AAC5B,CAAC;;;;;;;AC3vBH,MAAa,cAAc,WACzB,OAAO,MAAM,OAAO,YAAY;;;;;;;ACiGlC,MAAM,iCACJ,MACA,SAKA,cAEA,OAAO,WAAW;CAChB,IAAI;CAEJ,MAAM,WAAW,aACf,OAAO,qBAAqB,YAC1B,OAAO,cAAc;EAEnB,IAAI,YAAY,KAAA,MAAc,QAAQ,WAAW,QAAQ,YAAY;GACnE,MAAM,SAAS;GAEf,IAAI,aAAa,KAAA,KAAa,OAAO,WACnC,OAAO,QAAQ,SAAS,MAAM,OAAO,MAAM,CAAC;GAE9C,OAAO,QAAQ,OAAO,KAAK,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,KACzD,OAAO,SAAS,SACd,KAAK,UAAU,IAAI,KAAK,OAAO,YAC3B,OACA,QAAQ,SAAS,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAAC,CACpF,CACF;EACF;EACA,IAAI,KAAK,GAAG,OAAO,OAAO;EAC1B,IAAI,YAAY,KAAA,GAAW;GACzB,IAAI,aAAa,KAAA,GACf,OAAO,QAAQ,SAAS,MAAM,QAAQ,OAAO,CAAC,CAAC,CAAC,KAC9C,OAAO,QAAQ,QAAQ,QAAQ,CAAC,CAClC;GAEF,OAAO,OAAO,KACZ,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;IAC5B,SAAS;GACX,CAAC,CACH;EACF;EAEA,MAAM,SAAkD;GACtD,QAAQ,SAAS,WAAW;GAC5B,SAAS,SAAS,WAAW;GAC7B,SAAS;GACT,WAAW;GACX,cAAc;EAChB;EAEA,UAAU;EAEV,MAAM,eAAe;GACnB,OAAO,eAAe;GACtB,IAAI,CAAC,OAAO,SAAS;IACnB,IAAI,CAAC,OAAO,aAAa,YAAY,QAAQ,UAAU,KAAA;IACvD,SAAS,WAAW,OAAO,SAAS,OAAO,IAAI;GACjD;EACF;EAEA,OAAO,QACL,OAAO,cACL,cACQ;GACJ,OAAO,YAAY;EACrB,SACM;GACJ,OAAO,eAAe;GAEtB,OAAO;EACT,GACA,QACF,CACF,CACF,CAAC,CAAC,KACA,OAAO,KAAK,WACV,WAAW,eAAe,OAAO,KAAK,SAAS,IAAI,OAAO,IAC5D,GACA,OAAO,QACP,OAAO,QAAQ,SACb,OAAO,WAAW;GAChB,OAAO,UAAU;GACjB,IAAI,CAAC,OAAO,aAAa,CAAC,OAAO,cAAc,UAAU,KAAA;GACzD,IAAI,CAAC,OAAO,cAAc,SAAS,WAAW,OAAO,SAAS,OAAO,IAAI;GACzE,SAAS,WAAW,OAAO,QAAQ,IAAI;EACzC,CAAC,CACH,CACF;CACF,CAAC,CACH;CAEF,OAAO;EACL,MAAM,QAAQ;EACd,UAAU,aACR,OAAO,QAAQ,QAAQ,GAAG,gBACxB,aAAa,KAAK;GAChB,WAAW;GACX,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;GAC/B,SAAS,SAAS,cAAc,OAAO,YAAY;EACrD,CAAC,CACH;CACJ;AACF,CAAC;;;;;AAoCH,MAAa,iBAAiB,OAAO,WAAW,WAC9C,QACA,SACA;CAEA,MAAM,SAAS,QAAQ;CAEvB,IAAI,WAAW,KAAA,GACb,OAAO,OAAO,aAAa,KAAK;EAC9B,WAAW;EACX,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC;EACrC,SAAS;CACX,CAAC;CACH,MAAM,cAAc,OAAO,MAAM;CAGjC,MAAM,kBAAkB,OAAO,MAAM,KAAK,aAAa,YAAY;CACnE,MAAM,QAAQ,OAAO,SAAS,KAAW;CACzC,MAAM,QAAQ,OAAO,UAAU,MAAM;CACrC,MAAM,QAAQ,OAAO,MAAM;CAC3B,MAAM,OAAO,WAAW,OAAO,OAAO,MAAM;CAE5C,IAAI;CACJ,IAAI,iBAAiB;CAGrB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAGJ,IAAI;CAEJ,MAAM,sBAAsB;EAC1B,gBAAgB,MAAM;EACtB,QAAQ,sBAAsB;CAChC;CAEA,MAAM,kBAAkB,OAAO,IAAI,aAAa;EAC9C,MAAM,aAAa;EAEnB,iBAAiB,KAAA;EACjB,MAAM,YAAY,OAAO,OAAO,KAAK,YAAY,WAAW,OAAO,IAAI;EAEvE,MAAM,gBAAgB,OAAO,OAAO,WAAW;GAC7C,WAAW,QAAQ,wBAAwB,KAAK,QAAQ,QAAQ;GAChE,aACE,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;IAChC,SAAS;GACX,CAAC;EACL,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI;EAEnB,IAAI,KAAK,UAAU,SAAS,GAAG,OAAO,OAAO,OAAO,UAAU,UAAU,KAAK;EAC7E,IAAI,KAAK,UAAU,aAAa,GAAG,OAAO,OAAO,OAAO,UAAU,cAAc,KAAK;CACvF,CAAC;CAED,MAAM,UAAyB;EAC7B;EACA,cAAc;GACZ,IAAI,WAAW,KAAA,GACb,MAAM,aAAa,KAAK;IACtB,WAAW;IACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC;GAEH,OAAO,OAAO,KAAK;IAAE,YAAY,MAAM,MAAM;IAAY,GAAG,OAAO,SAAS;GAAE,CAAC;EACjF;EACA,UAAU,QAAQ,cAChB,OAAO,iBAAiB,QAAQ,YAAY;GAC1C,IAAI,WAAW,KAAA,GACb,MAAM,aAAa,KAAK;IACtB,WAAW;IACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC;GACH,MAAM,UAAU,MAAM,OAAO,QAAQ,SAAS;GAE9C,OAAO;IACL,KAAK,QAAQ;IACb,QAAQ,OAAO,KAAK;KAClB,YAAY,MAAM,MAAM;KACxB,QAAQ,QAAQ;KAChB,SAAS,QAAQ;IACnB,CAAC;IACD,QAAQ,QAAQ;GAClB;EACF,CAAC;EACH,+BAAe,IAAI,IAAI;EACvB,sBAAsB;CACxB;CAEA,MAAM,cAAc,QAAQ,UAAU;EACpC,QAAQ,sBAAsB,KAAK;EACnC,IAAI;GAAC;GAAgB;GAAa;EAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,cAAc;EAC5E,IAAI;GAAC;GAAU;GAAgB;GAAa;EAAQ,CAAC,CAAC,SAAS,MAAM,GACnE,KAAK,MAAM,SAAS,QAAQ,cAAc,OAAO,GAAG,MAAM,WAAW,MAAM;CAC/E,CAAC;;;;;CAMD,MAAM,QAA2B;EAC/B,OAAO,OAAO,WAAW;GACvB,MAAM,MAAM,WAAW,QAAQ;GAC/B,eAAe,KAAA;GACf,mBAAmB,KAAA;GACnB,SAAS,WAAW,OAAO,OAAO,IAAI;EACxC,CAAC;EACD,SAAS,OAAO,cACd,OAAO,QAAQ,CAAC,GAAG,QAAQ,cAAc,OAAO,CAAC,IAAI,UAAU,MAAM,MAAM,EACzE,SAAS,KACX,CAAC,CACH;EACA,gBAAgB;EAChB,YAAY,OAAO,cAAc;GAC/B,MAAM,WAAW;GAEjB,SAAS,KAAA;GACT,IAAI,aAAa,KAAA,GACf,OAAO,OAAO,QAAyB,iBAAiB,YAAY,eAAe;GAErF,OAAO,OAAO,WAAW;IACvB,WAAW,SAAS,WAAW;IAC/B,aACE,aAAa,KAAK;KAChB,WAAW;KACX,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;KAChC,SAAS;IACX,CAAC;GACL,CAAC,CAAC,CAAC,KAAK,OAAO,GAAoB,QAAQ,CAAC;EAC9C,CAAC,CAAC,CAAC,KACD,OAAO,SACL,OAAO,WAAW;GAChB,MAAM,WAAW,QAAQ;EAC3B,CAAC,CACH,CACF;CACF;CAGA,IAAI,gBAAqC,OAAO;CAEhD,OAAO,OAAO,mBAAmB,OAAO,cAAc,aAAa,CAAC;CAEpE,MAAM,WAAW,OAAO,QAAQ,OAAO,OAAO,MAAM,gBAAgB;CAEpE,gBAAgB,YACd,OAAO,cAAc,SAAS,kBAAkB,OAAO,QAAQ,KAAK,CAAC,GACrE,GACF,CAAC,CAAC,KACA,OAAO,KAAK,WACV,OAAO,SAAS,aAAa,OAAO,QAAQ,OAAO,KAAK,MAAM,aAAa,IAAI,OAAO,IACxF,GACA,OAAO,QACP,OAAO,WACT;CAEA,MAAM,MAAsB,SAAS;CAIrC,MAAM,UAAU,SAAS;CACzB,MAAM,gBAAoC,SAAS;CAEnD,MAAM,aAAa,SAAS,QAAQ,KAClC,OAAO,UAAU,aAAa,GAC9B,OAAO,SAAS,SAAS,QAAQ,OAAO,KAAA,CAAS,CAAC,GAClD,OAAO,MACT;CAEA,MAAM,oBAAoB,iBAAyB,gBAAsC;EACvF,eAAe,MAAM,WAAW,eAAe;EAC/C,aAAa,QAAQ,UAAU;GAC7B,IAAI,qBAAqB,iBAAiB,MAAM,WAAW,QAAQ,KAAK;EAC1E;EACA,oBAAoB;GAClB,MAAM,WAAW,eAAe;GAChC,IAAI,qBAAqB,iBAAiB;GAC1C,IACE,MAAM,MAAM,UAAU,aACtB,MAAM,MAAM,UAAU,YACtB,MAAM,MAAM,UAAU,YAEtB,MAAM,UAAU,gBAAgB,WAAW,UAAU;EAEzD;EACA,QAAQ,SAAS,aAAa;GAC5B,IAAI,qBAAqB,iBAAiB;GAC1C,MAAM,UAAU,WAAW,UAAU,iBAAiB;GAEtD,MAAM,OAAO,SAAS,aAAa,UAAU;GAC7C,IAAI,MAAM,MAAM,UAAU,QAAQ,MAAM,MAAM,UAAU,UAAU,OAAO;QAGpE,IAAI,MAAM,MAAM,UAAU,aAAa,MAAM,UAAU,SAAS,SAAS,UAAU;EAC1F;EACA,QAAQ,UAAU;GAChB,IAAI,qBAAqB,iBAAiB;GAC1C,IAAI,MAAM,WAAW,UAAU;IAC7B,MAAM,OAAO,OAAO,UAAU;IAE9B;GACF;GACA,IAAI,MAAM,MAAM,UAAU,aAAa,MAAM,MAAM,UAAU,UAAU;GACvE,MAAM,UACJ,MAAM,WAAW,YACb,qBACA,MAAM,gBAAgB,mBACpB,qBACA,MAAM,WAAW,iBACf,yBACA,MAAM,WAAW,eACf,iBACA,kBACV,MAAM,aACN,UACF;EACF;CACF;CAEA,MAAM,iBAAiB,KAAiC,kBACtD,OAAO,qBAAqB,YAC1B,OAAO,IAAI,aAAa;EAEtB,MAAM,WAA+B;GAAE,WAAW,OAAO;GAAM,UAAU,OAAO;EAAK;EACrF,MAAM,kBAAkB,CAAC;EAEzB,mBAAmB;EACnB,iBAAiB;EACjB,MAAM,SAAS,iBAAiB,iBAAiB,MAAM,MAAM,UAAU;EAEvE,MAAM,WACJ,QAAQ,oBAAoB,KAAA,IACxB,KAAA,IACA,OAAO,QACJ,gBACC,OAAO,aAEL,qBAAqB,oBACpB,MAAM,MAAM,UAAU,eAAe,MAAM,MAAM,UAAU,eAE5D,qBAAqB,mBACrB;GAAC;GAAa;GAAQ;EAAQ,CAAC,CAAC,SAAS,MAAM,MAAM,KAAK,CAC9D,CAAC,CACA,KAAK,MAAM,QAAQ,eAAe,CAAC;EAE5C,iBAAiB;EAEjB,MAAM,gBACJ,qBAAqB,mBACrB;GAAC;GAAW;GAAU;GAAa;EAAS,CAAC,CAAC,SAAS,MAAM,MAAM,KAAK;EAE1E,IAAI,QAAQ,GAAG;GACb,UAAU,MAAM;GAChB,OAAO,UAAU,WAAW,OAAO;GAEnC,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC;EACH;EAEA,MAAM,WAAW,OAAO,QACtB,OAAO,QAAQ;GACb,YAAY,SAAS,MAAM,GAAG;GAC9B;GACA,SAAS;IACP,GAAG;IACH,GAAI,aAAa,KAAA,IACb,CAAC,IACD;KACE,UAAU,SAAS;KACnB,gBAAgB,SAAS;IAC3B;GACN;GACA;GACA,mBAAmB,UAAU,MAAM;GACnC,iBAAiB;IACf,IAAI,qBAAqB,iBAAiB,iBAAiB;GAC7D;EACF,CAAC,CACH;EAEA,SAAS;EACT,IACE,qBAAqB,mBACrB,MAAM,MAAM,UAAU,YACtB,MAAM,MAAM,UAAU,aACtB,MAAM,MAAM,UAAU,eACtB,MAAM,MAAM,UAAU,WACtB;GACA,OAAO,OAAO,WAAW;IACvB,WAAW,SAAS,WAAW;IAC/B,aACE,aAAa,KAAK;KAChB,WAAW;KACX,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;KAChC,SAAS;IACX,CAAC;GACL,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;GACrB,SAAS,KAAA;GAET,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC;EACH;EAEA,OAAO;CACT,CAAC,CACH;CAEF,MAAM,kBAAkB;EACtB,IAAI,WAAW,KAAA,GACb,MAAM,aAAa,KAAK;GACtB,WAAW;GACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;GAC9B,SAAS;EACX,CAAC;EAEH,OAAO;CACT;;;;;;CAOA,MAAM,YAAY;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,MAAM,eAAe,OACnB,WACA,QACA,WACG;EACH,IAAI,CAAC,UAAU,SAAS,SAAS,GAAG;EACpC,MAAM,QAAQ,MAAM,UAAU,CAAC,CAAC,kBAAkB,QAAQ,MAAM;EAEhE,IAAI,MAAM,SAAS,WAAW,MAAM,SAAS,iBAAiB;EAC9D,MAAM,aAAa,KAAK;GACtB;GACA,QACE,MAAM,SAAS,wBAAwB,MAAM,WAAW,UACpD,QAAQ,MAAM,KAAK,CAAC,CAAC,IACrB,MAAM,WAAW,YACf,QAAQ,QAAQ,KAAK,CAAC,CAAC,IACvB,QAAQ,OAAO,KAAK,CAAC,CAAC;GAC9B,SAAS;EACX,CAAC;CACH;;;;;;CAOA,MAAM,iBACJ,QACA,eAAe,KAAK,IAAI,QAAQ,kBAAkB,KAAK,GACvD,WAAW,IACX,YAAY,MACZ,QAAiC,YACjC,UAEA,OAAO,cAAc;EACnB,MAAM,WAAW,MAAM,MAAM;EAE7B,OAAO,OAAO,WAAW,QAAQ,YAAY;GAC3C,MAAM,UAAU,CAAC,CAAC,aAAa,YAAY,KAAA,GAAW,MAAM;GAC5D,IAAI,WAAW,MAAM,aAAa,WAAW,MAAM;GAEnD,OAAO,UAAU,CAAC,CAAC,QAAQ,OAAO,cAAc,UAAU,QAAQ,KAAK;EACzE,CAAC,CAAC,CAAC,KACD,OAAO,SAAS,QACd,OAAO,IAAI,aAAa;GACtB,IAAI,MAAM,MAAM,aAAa,UAC3B,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;IAC7B,SAAS;GACX,CAAC;GAEH,MAAM,SAAS,OAAO,OAAO,IAAI;IAC/B,WAAW,YAAY,KAAK;KAAE,GAAG;KAAK,QAAQ,QAAQ,OAAO;KAAG;IAAS,CAAC;IAC1E,QAAQ,UACN,YAAY,OAAO,WAAW;KAC5B,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC;KACjC,SAAS;IACX,CAAC;GACL,CAAC;GAED,MAAM,UAAU,OAAO,OAAO,aAAa,OAAO,eAAe,WAAW,CAAC,CAAC,CAC5E,MACF,CAAC,CAAC,KACA,OAAO,eACL,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,UAAU,KAAK,CAAC,CAAC;IACjC,SAAS;GACX,CAAC,CACH,CACF;GAEA,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;GAEhD,IAAI,QAAQ,QAAQ,kBAClB,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,MAAM,KAAK;KACzB,WAAW;KACX,SAAS,QAAQ;KACjB,UAAU;IACZ,CAAC;IACD,SAAS;GACX,CAAC;GAGH,OAAO;EACT,CAAC,CACH,CACF;CACF,CAAC;;CAGH,MAAM,cACJ,WACA,cACwC;EACxC,MAAM,QAAQ,aAAa,KAAK,IAAI,QAAQ,kBAAkB,KAAK;EAEnE,OAAO,QAAQ,QAAQ,mBACnB,OAAO,KACL,aAAa,KAAK;GAChB;GACA,QAAQ,QAAQ,cAAc,KAAK,EAAE,MAAM,eAAe,CAAC;GAC3D,SAAS;EACX,CAAC,CACH,IACA,OAAO,QAAQ,KAAK;CAC1B;CAKA,MAAM,eAAe,MAAM,MACzB,gBAEE,OAAO,IAAI;EACT,KAAK,QAAQ;EACb,aACE,aAAa,KAAK;GAChB,WAAW;GACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;GAC9B,SAAS;EACX,CAAC;CACL,CAAC,GACH,EAAE,QAAQ,MAAM,CAClB;;;;;CAMA,MAAM,cAAc,WAA6B,WAC/C,OAAO,cAAc;EACnB,IAAI,SAAS,QAAQ;EAErB,IAAI,WAAW,KAAA,GACb,IAAI;GACF,SAAS,QAAQ,SAAS,CAAC,CAAC;EAC9B,QAAQ,CAER;EAEF,OAAO,WAAW,KAAA,MAAc,MAAM,SAAS,MAAM,KAAK,MAAM,YAAY,MAAM,KAC9E,OAAO,KACL,aAAa,KAAK;GAChB;GACA,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;GAC5B,SAAS;EACX,CAAC,CACH,IACA,OAAO;CACb,CAAC;CAEH,MAAM,YAAY,WAA6B,WAC7C,OAAO,cACL,MAAM,YAAY,MAAM,IACpB,OAAO,KACL,aAAa,KAAK;EAChB;EACA,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;EAC5B,SAAS;CACX,CAAC,CACH,IACA,OAAO,IACb;CAEF,MAAM,mBACJ,WACA,QACA,UAOI,CAAC,MAEL,MAAM,MACJ,YACC,WACC,OAAO,WAAW,QAAQ,YAAY;EAEpC,IACE;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,SAAS,SAAS,GAEpB,MAAM,UAAU,CAAC,CAAC,aAAa,YAAY,KAAA,GAAW,MAAM;EAC9D,MAAM,aAAa,WAAW,MAAM;EAEpC,OAAO,OAAO,UAAU,GAAG,MAAM;CACnC,CAAC,GACH;EACE,GAAG;EACH,eAAe,QAAQ,yBAAyB,EAAE,QAAQ,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;EACxF,YAAY,QAAQ,aAAa,QAAQ,QAAQ,YAAY,OACzD,WAAW,SAAS,IACpB,OAAO,KAAA,CACT,KAAK,OAAO,QAAQ,QAAQ,aAAa,OAAO,IAAI,CAAC;CACzD,CACF;CAEF,MAAM,QACJ,OACA,kBAEA,OAAO,cAAc;EACnB,IAAI;EAEJ,OAAO,MACJ,MACC,SACC,WACC,OAAO,QAAQ,QAAQ,YAAY;GACjC,MAAM,SAAS,UAAU;GACzB,MAAM,aAAa;GAEnB,IAAI,eAAe,KAAA,GACjB,MAAM,aAAa,KAAK;IACtB,WAAW;IACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;IAC9B,SAAS;GACX,CAAC;GACH,MAAM,SAAS,OAAO,SAAS;GAC/B,MAAM,WAAW,MAAM,UAAU,QAAQ,QAAQ,UAAU;GAE3D,QAAQ;GACR,IAAI,UAAU;GAEd,IAAI;IACF,MAAM,OAAO,aAAa,YAAY,QAAQ,MAAM;IACpD,OAAO,MAAM;IACb,MAAM,aAAa,QAAQ,QAAQ,MAAM;IACzC,OAAO,MAAM;IACb,SAAS,YAAY,MAAM,QAAQ,SAAS,QAAQ,MAAM,CAAC;IAC3D,UAAU;IAEV,OAAO;GACT,UAAU;IAER,IAAI,CAAC,SAAS,SAAS,OAAO,OAAO;GACvC;EACF,CAAC,GACH;GACE,GAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc;GACvD,WAAW,OAAO,cAChB,MAAM,cAAc,IAChB,WAAW,MAAM,IACjB,OAAO,KACL,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;IAC5B,SAAS;GACX,CAAC,CACH,CACN;EACF,CACF,CAAC,CACA,KACC,OAAO,SAAS,cAAc,UAAU,SAAS,GACjD,OAAO,SAAS,OAAO,WAAW,OAAO,OAAO,CAAC,CAAC,CACpD;CACJ,CAAC;;;;;CAMH,MAAM,kBACH,WACD,OAAO,UAAU,eAAe;EAC9B,MAAM,wBAAwB,MAAM,yBAAyB;EAE7D,MAAM,SAAS;EAEf,OAAO;GACL,GAAG;GACH;GACA,MAAM;GACN;GACA,yBAAyB,MAAM,yBAAyB;EAC1D;CACF;CAEF,MAAM,kBAAkB,aAIlB;EACJ,MAAM,gBAAgB,UAAU;EAEhC,MAAM,cAAc;GAClB,IACE,aAAa,KAAA,MACZ,MAAM,MAAM,eAAe,SAAS,cAClC,SAAS,cAAc,KAAA,KAAa,MAAM,MAAM,cAAc,SAAS,YAE1E,OAAO,OAAO,KACZ,aAAa,KAAK;IAChB,WAAW;IACX,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;IAC7B,SAAS;GACX,CAAC,CACH;GAGF,OAAO,OAAO;EAChB;EAEA,MAAM,OACJ,WACA,QACA,WAAW,UAEX,MAAM,MACJ,YACC,WACC,OAAO,WAAW,QAAQ,YAAY;GACpC,MAAM,UAAU,CAAC,CAAC,aAAa,YAAY,eAAe,MAAM;GAChE,MAAM,aAAa,WAAW,QAAQ,aAAa;GAEnD,OAAO,OAAO,UAAU,GAAG,MAAM;EACnC,CAAC,GACH;GACE;GACA,sBAAsB,EAAE,QAAQ,eAAe,UAAU,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;GACvF,WAAW,WACP,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,WAAW,aAAa,CAAC,CAAC,IAC/E,OAAO,QAAQ,KAAK;EAC1B,CACF;EAEF,MAAM,wBACJ,UAAU,WAAW,KAAA,IACjB,QAAQ,OAAO,IACf,OAAO,KAAK;GACV,YAAY,SAAS;GACrB,QAAQ,SAAS,OAAO;GACxB,SAAS,SAAS,OAAO;EAC3B,CAAC;;;;;EAMP,MAAM,SACJ,WACA,WAEA,IACE,WACA,OAAO,QAAQ,WAAW;GAExB,MAAM,SAAS,gBAAgB;GAC/B,MAAM,wBAAwB,MAAM,yBAAyB;GAG7D,OAAO;IACL,GAAG,MAHoB,OAAO,QAAQ,MAAM;IAI5C;IACA;IACA,yBAAyB,MAAM,yBAAyB;GAC1D;EACF,GACA,IACF;;;;;;;;EASF,MAAM,kBAAkB,OAAO,WAAW,WACxC,KACA,gBAAwB,OAAO,qBAC/B;GACA,IAAI,SAAS;GACb,IAAI,aAAa;GACjB,IAAI,eAAe;GACnB,IAAI,mBAAmB;GACvB,IAAI;GACJ,IAAI,mBAAmB,CAAC;GAExB,MAAM,UAA6B;IACjC,UAAU,CAAC;IACX,oBAAoB;KAClB,IAAI,CAAC,QAAQ,OAAO,EAAE,iBAAiB,CAAC,EAAE;KAC1C,eAAe;KACf;KACA,IAAI,UAAU;KAEd,OAAO,EACL,YAAY,cAAc;MACxB,IAAI,WAAW,CAAC,QAAQ;MACxB,UAAU;MACV;MACA,IAAI,CAAC,WAAW,mBAAmB;MACnC,WAAW;KACb,EACF;IACF;GACF;GAEA,OAAO,OAAO,mBACZ,OAAO,WAAW;IAChB,SAAS;GACX,CAAC,CACH;GAEA,MAAM,QAAQ,OAAO,IACnB,YACA,OAAO,QAAQ,WAAW;IACxB,MAAM,SAAS,gBAAgB;IAE/B,MAAM,iBAAiB,OAAO,MAAM,yBAAyB,CAAC,IAAI;IAClE,MAAM,oBAAoB,MAAM,mBAAmB;IAEnD,IAAI,qBAAqB,GACvB,MAAM,aAAa,KAAK;KACtB,WAAW;KACX,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;KAC/B,SAAS;IACX,CAAC;IAEH,MAAM,iBAAiB,KAAK,IAAI,eAAe,iBAAiB;IAEhE,MAAM,aAAa,MAAM,OAAO,gBAC9B,KACA,gBACA,QACA,eACA,OACF;IAEA,OAAO;KACL;KACA;KACA,aAAa,MAAM,QAAQ,WAAW,MAAM;KAC5C,kBAAkB,KAAK,IACrB,iBAAiB,iBAAiB,KAClC,MAAM,gBACR;IACF;GACF,GACA,IACF;GAEA,MAAM,EAAE,YAAY,gBAAgB;GACpC,MAAM,UAAU,OAAO,SAAS,KAA2B;GAC3D,MAAM,kBAAkB,OAAO,SAAS,KAAc;GACtD,IAAI,iBAAiB;GACrB,IAAI,WAAW;GACf,IAAI,WAAW;GAEf,MAAM,UAAU,WACd,OAAO,KAAK,aAAa,KAAK;IAAE,WAAW;IAAY;IAAQ,SAAS;GAAU,CAAC,CAAC;;;;;;GAOtF,MAAM,UAAU,QAA6C,UAAmB;IAC9E,IAAI,YAAY,SAAS,aAAa,OAAO,GAAG;IAChD,WAAW;IACX,SAAS;IACT,YAAY,OAAO,QAAQ,UAAU,SAAS;IAC9C,SAAS,WAAW,SAAS,MAAM;IACnC,SAAS,WAAW,iBAAiB,OAAO,QAAQ,KAAK,CAAC;IAC1D,WAAW;GACb;GAEA,mBAAmB;IACjB,IAAI,CAAC,UAAU,aAAa,KAAA,KAAa,eAAe,KAAK,gBAAgB;IAC7E,IAAI,cAEF,OACE,mBAAmB,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,GAC9E,CAAC,gBACH;SACK,IAAI,WAAW,cAAc,QAAQ,SAAS,OAAO,SAAS,WAAW;KAC9E,WAAW;KACX,SAAS,WAAW,iBAAiB,OAAO,QAAQ,IAAI,CAAC;IAC3D,OACE,OAAO,OAAO,KAAK,QAAQ,GAAG,KAAK;GAEvC;GAEA,WAAW,QAAQ,MAChB,QAAQ;IACP,IAAI,CAAC,gBAAgB,OAAO,OAAO,QAAQ,GAAG,GAAG,IAAI;GACvD,IACC,UAAmB;IAClB,IAAI,kBAAkB,SAAS,aAAa,OAAO,GAAG;IAEtD,WAAW,YAAY,OAAO,YAAY;KACxC,QAAQ,QAAQ,SAAS,KAAK,CAAC,CAAC;KAChC,SAAS;IACX,CAAC;IACD,WAAW;GACb,CACF;GAGA,MAAM,gBACJ,OAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI;GAEnF,YAAY,OAAO,iBAAiB,SAAS,SAAS,EACpD,MAAM,KACR,CAAC;GAED,OAAO,OAAO,mBACZ,OAAO,WAAW;IAChB,OAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK;IAClF,YAAY,OAAO,oBAAoB,SAAS,OAAO;GACzD,CAAC,CACH;GAEA,MAAM,OAAO,OAAO,oCACZ,SAAS,aAAa,OAAO,IAClC,YAAY,aAAa,aACxB,MAAM,MACJ,kBACC,WACC,OAAO,cACL,aAAa,KAAA,KAAa,qBAAqB,KAAA,IAC3C,SAAS,MAAM,gBAAgB,IAC/B,OAAO,IACb,CAAC,CAAC,KACA,OAAO,QACL,OAAO,iBAAiB,cACtB,WAAW,KACT,cACM,CAAC,SAAS,aAAa,OAAO,SAC9B;IACJ,WAAW;IACX,iBAAiB;GACnB,SACM;IACJ,IAAI,qBAAqB,KAAA,GACvB,MAAM,aAAa,KAAK;KACtB,WAAW;KACX,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC;KAC5B,SAAS;IACX,CAAC;IACH,MAAM,QAAQ,SAAS,WAAiB;IAExC,mBAAmB;IACnB,MAAM,UAAU,YAAY;IAE5B,aAAa;KACX,IAAI,qBAAqB,OAAO,mBAAmB,KAAA;KACnD,SAAS,WAAW,OAAO,OAAO,IAAI;KACtC,QAAQ;IACV;GACF,CACF,CACF,CACF,GACA,OAAO,cAAc;IACnB,UAAU,KAAK,IAAI,KAAM,OAAO,gBAAgB,CAAC;IACjD,cACE,OAAO,KACL,aAAa,KAAK;KAChB,WAAW;KACX,QAAQ,QAAQ,QAAQ,KAAK,CAAC,CAAC;KAC/B,SAAS,OAAO,aAAa,YAAY;IAC3C,CAAC,CACH;GACJ,CAAC,CACH,GACF;IACE,UAAU;IACV,sBAAsB,EAAE,QAAQ,WAAW,OAAO;IAClD,QAAQ;IACR,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,SAAS;GAC1D,CACF,SAEA,OAAO,OAAO,WAAW,QAAQ,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAC3F;GAIA,OAAO,SAAS,MAAM,eAAe,CAAC,CAAC,KACrC,OAAO,SAAS,YACd,UACI,KAAK,QAAQ,MAAM,gBAAgB,CAAC,CAAC,KACnC,OAAO,QAAQ,SACb,OAAO,WAAW;IAChB,IAAI,KAAK,UAAU,IAAI,GAAG,OAAO,OAAO,QAAQ,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK;GAC1E,CAAC,CACH,CACF,IACA,OAAO,IACb,GACA,OAAO,aACP,OAAO,UACT;GAEA,OAAO;IACL,QAAQ,MAAM;IACd,WAAW,SAAS,MAAM,OAAO;;;;;IAKjC,MAAM,KAAK;GACb;EACF,CAAC;EAED,OAAO;GACL;GAEA,WAAW,KAAa,kBACtB,OAAO,OACL,gBAAgB,KAAK,aAAa,CAAC,CAAC,KAClC,OAAO,SAAS,cAAc,UAAU,SAAS,CACnD,CACF;GACF,WAAW,aACT,IAAI,cAAc,QAAQ,WACxB,OAAO,SAAS,UAAU,QAAQ,kBAAkB,QAAQ,aAAa,CAC3E;GACF,QAAQ,QAAkC,WACxC,IACE,UACC,QAAQ,WACP,OAAO,MAAM,QAAQ,QAAQ,eAAe,gBAAgB,CAAC,GAAG,QAAQ,aAAa,GACvF,IACF;GACF,OAAO,QAAkC,OAAe,WACtD,IACE,SACC,QAAQ,WAAW,OAAO,KAAK,QAAQ,OAAO,QAAQ,QAAQ,aAAa,GAC5E,IACF;GACF,SAAS,GAAW,MAClB,IAAI,WAAW,QAAQ,WAAW,OAAO,OAAO,GAAG,GAAG,QAAQ,aAAa,GAAG,IAAI;GACpF,cAAc,OACZ,MAAM,iBAAiB,QAAQ,WAAW,OAAO,YAAY,IAAI,QAAQ,aAAa,CAAC;GACzF,QAAQ,QAAkC,WACxC,MAAM,UAAU,QAAQ,WAAW,OAAO,MAAM,QAAQ,QAAQ,QAAQ,aAAa,CAAC;GACxF,QAAQ,QAAgB,QAAgB,OACtC,MAAM,UAAU,QAAQ,WAAW,OAAO,MAAM,QAAQ,QAAQ,IAAI,QAAQ,aAAa,CAAC;GAC5F,QACE,KACA,WACA,MACA,WAEA,MAAM,UAAU,QAAQ,WACtB,OAAO,MAAM,KAAK,WAAW,MAAM,QAAQ,QAAQ,aAAa,CAClE;GACF,OAAO,MAAc,MAAiC,WACpD,MAAM,SAAS,QAAQ,WAAW,OAAO,KAAK,MAAM,MAAM,QAAQ,QAAQ,aAAa,CAAC;GAC1F,aAAa,SACX,IAAI,eAAe,QAAQ,WACzB,OAAO,WAAW,MAAM,QAAQ,kBAAkB,QAAQ,aAAa,CACzE;EACJ;CACF;;CAGA,MAAM,wBACJ,KAAK,IACH,GACA,KAAK,KAAK,MAAM,mBAAmB,OAAO,MAAM,yBAAyB,CAAC,IAAI,GAAS,CACzF;CAEF,MAAM,iBAAiB,cACrB,OAAO,cAAc,SAAS,WAAW,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAC3D,OAAO,UAAU,UACf,aAAa,KAAK;EAAE;EAAW,QAAQ,MAAM;EAAQ,SAAS,MAAM;CAAQ,CAAC,CAC/E,CACF;CAEF,MAAM,YAAY,OAAO,OAAO,OAC9B,MACG,MACC,YACC,WACC,cAAc,SAAS,CAAC,CAAC,KACvB,OAAO,SAAS,QAAQ,cAAc,KAAK,QAAQ,MAAM,CAAC,GAC1D,OAAO,QACL,OAAO,WAAW,QAAQ,YAAY;EACpC,UAAU,CAAC,CAAC,SAAS;CACvB,CAAC,CACH,GACA,OAAO,UACL,OAAO,WAAW;EAChB,MAAM,WAAW,MAAM;CACzB,CAAC,CACH,CACF,GACF;EAAE,QAAQ,CAAC,WAAW;EAAG,QAAQ;EAAO,aAAa;CAAM,CAC7D,CAAC,CACA,KACC,OAAO,cAAc,UAAU,GAC/B,OAAO,kBAAkB,UAAU,CACrC,CACJ;CAEA,MAAM,kBAAkB;EACtB,MAAM,OAAO,UAAU,CAAC,CAAC;EAEzB,IAAI,SAAS,KAAA,GACX,MAAM,aAAa,KAAK;GACtB,WAAW;GACX,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC;GACnC,SAAS;EACX,CAAC;EAEH,OAAO;CACT;CAEA,MAAM,UAAU,YACd,MAAM,MACJ,WACC,WACC,OAAO,UAAU,QAAQ,YAAY;EACnC,MAAM,QAAQ,MAAM,QAAQ,UAAU,GAAG,MAAM;EAE/C,OAAO,MAAM;EAEb,OAAO;GACL,QAAQ,OAAO,KAAK;IAAE,YAAY,OAAO;IAAY,GAAG;GAAM,CAAC;GAC/D,YAAY,eAAe;IAAE,YAAY,OAAO;IAAY,QAAQ;GAAM,CAAC;EAC7E;CACF,CAAC,GACH,EAAE,QAAQ,MAAM,CAClB;CAEF,MAAM,SAAS,MAAM,MACnB,gBAEE,OAAO,IAAI;EACT,WAAW;GACT,MAAM,SAAS,QAAQ,OAAO;GAE9B,OAAO,eAAe;IACpB,YAAY,OAAO;IACnB,WAAW,MAAM,MAAM;GACzB,CAAC;EACH;EACA,QAAQ,UACN,YAAY,OAAO,UAAU;GAC3B,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;GAC9B,SAAS;EACX,CAAC;CACL,CAAC,GACH,EAAE,QAAQ,MAAM,CAClB;CAEA,MAAM,WAAW;EACf,gBAAgB,QAAQ;EACxB,QAAQ,MAAM;EACd,aAAa,MAAM;EACnB,aAAa;GACX,QAAQ,SACN,gBAAgB,eAAe,SAAS,WAAW,UAAU,CAAC,CAAC,MAAM,MAAM,MAAM,GAAG,EAClF,QAAQ,MACV,CAAC;GACH,UAAU,SACR,gBAAgB,iBAAiB,SAAS,WAAW,UAAU,CAAC,CAAC,QAAQ,MAAM,MAAM,GAAG;IACtF,QAAQ;IACR,WAAW,SAAS,gBAAgB,KAAK,MAAM;GACjD,CAAC;GACH,SAAS,YACP,gBAAgB,gBAAgB,SAAS,WAAW,UAAU,CAAC,CAAC,OAAO,SAAS,MAAM,GAAG;IACvF,QAAQ;IACR,WAAW,SAAS,eAAe,QAAQ,MAAM;GACnD,CAAC;EACL;EACA,WAAW;EACX;EACA,YAAY,eAAe;EAC3B;EACA,QAAQ;EACR;EACA,OAAO,QAAQ,KAAK,OAAO,UAAU,aAAa,CAAC;EACnD,cAAc,SAAS,aAAa,KAAK,OAAO,aAAa,aAAa,CAAC;EAC3E,UAAU,UAAmB,EAAE,OAAO,WAAW,MAC/C,WAAW,WAAW,QAAQ,YAAY,CAAC,CAAC,KAC1C,OAAO,SAAS,UACd,MAAM,MACJ,YACC,WACC,cACE,QACA,OACA,QAAQ,eAAe,IACvB,MACA,QAAQ,OACR,QAAQ,KACV,GACF,EAAE,WAAW,SAAS,SAAS,EAAE,CACnC,CACF,CACF;;;;;EAKF,aAAa,YACX,WAAW,cAAc,QAAQ,YAAY,CAAC,CAAC,KAC7C,OAAO,SAAS,UACd,gBACE,cACA,OAAO,QAAQ,WAAW;GACxB,MAAM,SAAS,QAAQ,OAAO;GAC9B,MAAM,WAAW,MAAM,MAAM;GAC7B,MAAM,wBAAwB,MAAM,yBAAyB;GAS7D,OAAO;IACL,GAAG,MARiB,OAAO,WAC3B,OACA,QAAQ,eAAe,IACvB,QAAQ,UAAU,QAAQ,mBAAmB,KAAA,GAC7C,MACF;IAIE;IACA;IACA;IACA,yBAAyB,MAAM,yBAAyB;GAC1D;EACF,GACA,EAAE,QAAQ,YAAY,CACxB,CACF,CACF;EACF,eAAe,cACb,gBAAgB,kBAAkB,QAAQ,WAAW,OAAO,aAAa,WAAW,MAAM,GAAG,EAC3F,QAAQ,YACV,CAAC;EACH,eAAe,WAA4B,SAAwB,WACjE,gBACE,kBACC,QAAQ,WAAW,OAAO,aAAa,WAAW,SAAS,QAAQ,MAAM,GAC1E,EAAE,UAAU,KAAK,CACnB;;;;;;EAMF,WAAW,SAA0B,QAAqC,SACxE,OAAO,cAAc;GAEnB,IAAI;GAEJ,MAAM,aAAa,eAAwC;IACzD,eAAe,QAAQ;IACvB;GACF;GAEA,MAAM,aAA+B;IACnC,WAAW,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC;IAElC,OAAO;GACT;GA2IA,OAzIa,OAAO,IAAI,aAAa;IACnC,MAAM,SAID,CAAC;IAEN,MAAM,SAAoC,CAAC;IAC3C,IAAI,MAAM;IAEV,MAAM,UAAU,eAAqC;KAAE;KAAQ;KAAW;IAAI;IAE9E,MAAM,QACJ,OACA,OACA,eACiB;KACjB,GAAG,OAAO,KAAK;KACf,SAAS;MAAE;MAAO;MAAO,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;KAAG;IAC7E;IAEA,KAAK,MAAM,SAAS,QAAQ,QAAQ;KAClC,MAAM,OAAO,OAAO,OAAO,KACzB,gBACE,cACC,QAAQ,WACP,OAAO,SACL,UAAU,MAAM,SAAS,GACzB,OACA,QACA,QACA,KAAK,cACL,eAAe,QAAQ,OAAO,CAAC,CACjC,GACF;MAAE,UAAU;MAAM,eAAe;KAAK,CACxC,CACF;KAEA,IAAI,KAAK,UAAU,IAAI,GAAG;MACxB,MAAM,QAAQ,MAAM,gBAAgB,KAAK,KAAK;MAI9C,IAAI,OAAO,OAAO,KAAK,KAAK,OAAO,WAAW,GAC5C,OAAO,OAAO,OAAO,UAAU,KAAK,KAAK;MAE3C,OAAO,KAAK,SAAS,MAAM,OAAO,MAAM,SAAS;KACnD;KACA,MAAM,OAAO,KAAK;KAElB,OAAO,KAAK;MACV,WAAW,MAAM;MACjB,QAAQ,KAAK;MACb,GAAI,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM;KAC1D,CAAC;KACD,OAAO,KAAK,KAAK,KAAK;KACtB,MAAM,KAAK;KACX,IAAI,CAAC,KAAK,SACR,OAAO,KACL,SACA,aAAa,KAAK;MAChB,WAAW;MACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;MAC9B,SAAS;KACX,CAAC,GACD,MAAM,SACR;IACJ;IAEA,IAAI,KAAK,QAAQ;KAEf,MAAM,OAAO,OAAO,OAAO,KACzB,gBACE,cACC,QAAQ,WACP,OAAO,UACL,QAAQ,OAAO,KAAK,UAAU,UAAU,MAAM,SAAS,CAAC,GACxD,MACF,GACF,EAAE,QAAQ,MAAM,CAClB,CACF;KAEA,IAAI,KAAK,UAAU,IAAI,GAAG;MACxB,MAAM,QAAQ,MAAM,gBAAgB,KAAK,KAAK;MAE9C,IAAI,OAAO,OAAO,KAAK,GAAG,OAAO,OAAO,OAAO,UAAU,KAAK,KAAK;MAEnE,OAAO,KAAK,UAAU,MAAM,KAAK;KACnC;KACA,KAAK,MAAM,CAAC,OAAO,UAAU,QAAQ,OAAO,QAAQ,GAAG;MACrD,MAAM,WAAW,OAAO;MAExB,IAAI,aAAa,KAAA,KAAa,KAAK,MAAM,WAAW,UAClD,OAAO,KACL,UACA,aAAa,KAAK;OAChB,WAAW;OACX,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC;OAC7B,SAAS;MACX,CAAC,GACD,MAAM,SACR;KACJ;IACF;IAEA,IAAI,QAAQ,WAAW,KAAA,GAAW,OAAO,OAAO,KAAK;IACrD,MAAM,SAAS,QAAQ;IAEvB,MAAM,OAAO,OAAO,OAAO,KACzB,gBACE,cACC,QAAQ,WACP,OAAO,WACL,UAAU,MAAM,GAChB,QACA,eAAe,QAAQ,OAAO,CAAC,GAC/B,MACF,GACF,EAAE,UAAU,KAAK,CACnB,CACF;IAEA,IAAI,KAAK,UAAU,IAAI,GAAG;KACxB,MAAM,QAAQ,MAAM,gBAAgB,KAAK,KAAK;KAE9C,IAAI,OAAO,OAAO,KAAK,GAAG,OAAO,OAAO,OAAO,UAAU,KAAK,KAAK;KAEnE,OAAO,KAAK,UAAU,MAAM,OAAO,MAAM;IAC3C;IACA,MAAM,KAAK,MAAM;IAEjB,OAAO;KAAE,GAAG,OAAO,IAAI;KAAG,aAAa,KAAK,MAAM;IAAM;GAC1D,CAIU,CAAC,CAAC,KACV,OAAO,SACL,OAAO,WAAW;IAChB,IAAI,WAAW,KAAA,GAAW,MAAM,WAAW,eAAe,EAAE,OAAO,CAAC;GACtE,CAAC,CACH,CACF;EACF,CAAC;;EAEH,aAAa,cACX,gBAAgB,eAAe,QAAQ,WAAW,OAAO,WAAW,WAAW,MAAM,GAAG,EACtF,QAAQ,MACV,CAAC;EAEH,WAAW,MAAM,MACf,UACC,WAAW,OAAO,SAAS,cAAc,UAAU,CAAC,CAAC,kBAAkB,MAAM,CAAC,GAC/E,EAAE,QAAQ,MAAM,CAClB;EACA,OAAO,gBAAgB,eAAe,QAAQ,WAAW,OAAO,UAAU,MAAM,GAAG,EACjF,QAAQ,MACV,CAAC;EACD,QAAQ,gBAAgB,gBAAgB,QAAQ,WAAW,OAAO,WAAW,MAAM,GAAG,EACpF,QAAQ,MACV,CAAC;EACD,WAAW,SACT,gBAAgB,gBAAgB,QAAQ,WAAW,OAAO,WAAW,QAAQ,IAAI,GAAG,EAClF,QAAQ,MACV,CAAC;EACH,UAAU,SAAmB,QAAQ,QAAQ,WAAW,OAAO,YAAY,MAAM,MAAM,CAAC;EACxF,WAAW,MAAgB,UACzB,QAAQ,QAAQ,WAAW,OAAO,aAAa,MAAM,OAAO,MAAM,CAAC;EACrE,aAAa,SACX,gBACE,eACA,OAAO,QAAQ,WAAW;GACxB,MAAM,OAAO,WAAW,MAAM,MAAM;GACpC,MAAM,MAAM;EACd,GACA,EAAE,QAAQ,MAAM,CAClB;EACF,cAAc,OACZ,gBACE,gBACA,OAAO,QAAQ,WAAW;GACxB,MAAM,OAAO,YAAY,IAAI,MAAM;GACnC,MAAM,MAAM;EACd,GACA,EAAE,QAAQ,MAAM,CAClB;EACF,kBACE,gBAAgB,aAAa,QAAQ,WAAW,OAAO,QAAQ,MAAM,GAAG;GACtE,UAAU;GACV,qBAAqB;GACrB,QAAQ;GACR,SAAS;EACX,CAAC;EACH,YAAY,SACV,gBAAgB,eAAe,QAAQ,WAAW,OAAO,UAAU,MAAM,MAAM,GAAG;GAChF,UAAU;GACV,sBAAsB,EAAE,QAAQ,KAAK,OAAO;GAC5C,QAAQ;GACR,SAAS;EACX,CAAC;EACH,SAAS,aACP,gBAAgB,WAAW,QAAQ,WAAW,OAAO,OAAO,UAAU,MAAM,GAAG;GAC7E,UAAU;GACV,QAAQ;EACV,CAAC;EACH,UAAU,UAAkB,UAC1B,MAAM,QAAQ,QAAQ,WAAW,OAAO,QAAQ,UAAU,OAAO,QAAQ,MAAM,CAAC;EAClF,iBAAiB,YACf,MACG,QAAQ,QAAQ,WACf,OAAO,eAAe,QAAQ,WAAW,QAAQ,OAAO,QAAQ,MAAM,GACxE,QAAQ,aACV;EACF,eAAe,WACb,gBACE,mBACC,QAAQ,WAAW,OAAO,aAAa,QAAQ,QAAQ,eAAe,QAAQ,OAAO,CAAC,CAAC,GACxF,EAAE,UAAU,KAAK,CACnB;EACF,mBAAmB,WACjB,gBACE,oBACC,QAAQ,WAAW,OAAO,iBAAiB,QAAQ,MAAM,GAC1D,EAAE,UAAU,KAAK,CACnB;EACF,cAAc,QAAkC,UAC9C,gBACE,iBACC,QAAQ,WAAW,OAAO,YAAY,QAAQ,OAAO,MAAM,GAC5D,EAAE,UAAU,KAAK,CACnB;EACF,wBACE,QACA,UAEA,gBACE,iBACC,QAAQ,WAAW,OAAO,sBAAsB,QAAQ,OAAO,MAAM,GACtE,EAAE,UAAU,KAAK,CACnB;EACF,WAAc,UACZ,MAAM,MAAM,mBAAmB,OAAO;GAAE,QAAQ;GAAO,QAAQ,CAAC,QAAQ,QAAQ;EAAE,CAAC;EACrF,eAAkB,UAChB,MAAM,MACJ,iBAEE,OAAO,IAAI,aAAa;GACtB,IAAI,QAAQ,OAAO,aACjB,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC;IACnC,SAAS;GACX,CAAC;GAEH,MAAM,QAAQ,iBAAiB,OAAO;GAEtC,IAAI,MAAM,MAAM,UAAU,QAAQ,MAAM,MAAM,UAAU,UAAU,SAAS;GAC3E,iBAAiB;GAEjB,MAAM,OAAO,OAAO;GAEpB,OAAO;IAAE,OAAO,SAAS,KAAK,YAAY;IAAG;GAAK;EACpD,CAAC,GACH;GAAE,QAAQ;GAAO,QAAQ,CAAC,QAAQ,QAAQ;GAAG,aAAa;EAAM,CAClE;EACF,SAAS,OAAkC,4BACzC,MAAM,MACJ,WACC,WACC,OAAO,IAAI,aAAa;GACtB,IACE,CAAC,2BACD,iBAAiB,KAAA,KACjB,SAAS,MAAM,KAAK,MAAM,cAE1B,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,cAAc,KAAK,CAAC,CAAC;IACrC,SAAS;GACX,CAAC;GAEH,OAAO,OAAO,UAAU,cAAc,UAAU,CAAC,CAAC,eAAe,MAAM,CAAC;GACxE,MAAM,cAAc,OAAO,cAAc,QAAQ,KAAA,GAAW,KAAA,GAAW,KAAK;GAG5E,MAAM,WAAW,MAAM;GACvB,eAAe,KAAA;GAEf,OAAO;EACT,CAAC,GACH;GAAE,QAAQ;GAAO,QAAQ,CAAC,QAAQ;GAAG,aAAa;EAAM,CAC1D;EACF,QAAQ,MACL,MACC,WACC,WACC,OAAO,IAAI,aAAa;GACtB,IAAI,CAAC,QAAQ,WACX,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC;IACnC,SAAS;GACX,CAAC;GACH,kBAAkB,OAAO,OAAO,UAAU,cAAc,UAAU,CAAC,CAAC,iBAAiB,CAAC;GACtF,MAAM,WAAW,UAAU;GAE3B,mBAAmB,KAAA;GACnB,MAAM,MAAM,YAAY,gBAAgB,UAAU;GAClD,MAAM,iBAAiB,OAAO,OAAO,KAAK,eAAe;GAEzD,MAAM,eAAe,OAAO,OAAO,WAAW;IAC5C,WAAW,SAAS,WAAW;IAC/B,aACE,aAAa,KAAK;KAChB,WAAW;KACX,QAAQ,QAAQ,aAAa,KAAK,CAAC,CAAC;KACpC,SAAS;IACX,CAAC;GACL,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI;GAEnB,SAAS,KAAA;GACT,IAAI,KAAK,UAAU,cAAc,GAC/B,OAAO,OAAO,OAAO,UAAU,eAAe,KAAK;GACrD,IAAI,KAAK,UAAU,YAAY,GAAG,OAAO,OAAO,OAAO,UAAU,aAAa,KAAK;GAEnF,OAAO;IAAE,WAAW;IAAK,UAAU;GAAgB;EACrD,CAAC,GACH;GAAE,QAAQ;GAAO,aAAa;EAAM,CACtC,CAAC,CACA,KAAK,OAAO,cAAc,OAAO,WAAW,MAAM,MAAM,aAAa,WAAW,CAAC,CAAC,CAAC;EACtF,YAAY,4BACV,MACG,MACC,cACC,WACC,OAAO,IAAI,aAAa;GACtB,IACE,CAAC,QAAQ,aACT,oBAAoB,KAAA,KACpB,CAAC,2BACD,SAAS,oBAAoB,KAAA,GAE7B,OAAO,OAAO,aAAa,KAAK;IAC9B,WAAW;IACX,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC;IACnC,SAAS;GACX,CAAC;GAGH,OAAO,SAAS;GAChB,MAAM,WAAW,WAAW;GAC5B,MAAM,WAAW,OAAO,cAAc,WAAW;GAEjD,OAAO,cAAc,UAAU;IAC7B,GAAG,QAAQ;IACX,iBAAiB;IACjB,SAAS;IACT,kBAAkB;GACpB,CAAC;GACD,MAAM,cAAc,OAAO,cAAc,QAAQ,KAAA,GAAW,KAAA,GAAW,KAAK;GAE5E,MAAM,WAAW,MAAM;GAEvB,OAAO;EACT,CAAC,GACH;GAAE,QAAQ;GAAO,QAAQ,CAAC,YAAY,WAAW;GAAG,aAAa;EAAM,CACzE,CAAC,CACA,KACC,OAAO,cAAc,UAAU,GAC/B,OAAO,kBAAkB,UAAU,CACrC;CACN;CAGA,MAAM,YAAY,KAAK,IACrB,GACA,MAAM,mBAAmB,OAAO,MAAM,yBAAyB,CAAC,IAAI,GACtE;CAKA,OAAO,OAAO,UACZ,OAAO,MAAM,SAAS,CAAC,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC,GAC5C,SAAS,MAAM,KAAK,CAAC,CAAC,KAAK,OAAO,GAAG,KAAK,CAAC,CAC7C,CAAC,CAAC,KACA,OAAO,SAAS,YACd,UAAU,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,KAAK,OAAO,QAAQ,UAAU,CAAC,IAAI,OAAO,IAChF,GACA,OAAO,OAAO,WAAW,CAC3B;CAEA,OAAO;EACL,WAAW;;EAEX,OAAO;EACP,OAAO,SAAS;EAChB,SAAS,OAAO,cACd,MAAM,MAAM,UAAU,YAAY,MAAM,MAAM,UAAU,YACpD,OAAO,KACL,aAAa,KAAK;GAChB,WAAW;GACX,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC;GAC9B,SAAS;EACX,CAAC,CACH,IACA,UAAU,KAAK,OAAO,GAAG,QAAQ,CAAC,CACxC;CACF;AACF,CAAC;;;;ACtyDD,MAAa,cAAc,UAA6B,CAAC,MAAsB;CAC7E,MAAM,EAAE,iBAAiB,gBAAgB;CAEzC,OAAO,aACL,EAAE,MAAM,iBAA0B,GAClC,EACE,UAAU,YACR,OAAO,IAAI,aAAa;EACtB,MAAM,UAAU,OAAO,QACrB,OAAO,eAAe,MAAM,OAAO,YAAY,KAAK,CAAC,GACrD,WACA,cACF,CAAC,CAAC,QAAQ,UAAU;EAEpB,MAAM,WACJ,oBAAoB,KAAA,IAChB,UACA,OAAO,gBAAgB,EAAE,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC;EAE5D,OAAO,OAAO,mBAAmB,SAAS,WACxC,0BACE,UACA,QACA,QAAQ,UACR,QAAQ,SACR,QAAQ,QACR,gBAAgB,KAAA,IAAY,KAAA,KAAa,WAAW,YAAY;GAAE;GAAQ;EAAS,CAAC,CACtF,CACF,CAAC,CAAC,QAAQ,OAAO;CACnB,CAAC,EACL,CACF;AACF;AAEA,MAAM,iBAAiB,WAAW;AAsDlC,IAAa,gBAAb,cAAmC,OAAO,MAAqB,sBAAsB,CAAC,CAAC;CACrF,YAAY;CACZ,UAAU;CACV,OAAO,OAAO,SAAS,CAAC,aAAa,QAAQ,CAAC;AAChD,CAAC,CAAC,CAAC,CAAC;AA0DJ,MAAM,aAAa,OAAO,eAAe,MACvC,OAAO,YAAY,IAAI,GACvB,OAAO,YACJ,UACC,MAAM,WAAW,GAAG,KACpB,CAAC,MAAM,SAAS,IAAI,KACpB,CAAC,MAAM,SAAS,IAAI,KACpB,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,cAAc,YAAY,OAAO,cAAc,GAAM,KACvE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,YAAY,YAAY,OAAO,YAAY,IAAI,CAC3E,CACF;AAEA,MAAM,YAAY,OAAO,MAAM,CAC7B,OAAO,aAAa,UAAU,EAAE,OAAO,YAAY,CAAC,GACpD,OAAO,aAAa,UAAU,EAC5B,OAAO,OAAO,MAAM,UAAU,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,GAAG,OAAO,YAAY,CAAC,CAAC,EACpF,CAAC,CACH,CAAC;AAED,MAAM,gBACJ,WACA,cAEA,QAAQ,WAAW,WAAW,SAAS,CAAC,CAAC,KACvC,OAAO,KAAK,UACV,MAAM,SAAS,WACX,MAAM,MAAM,KAAK,UAAU;CACzB,MAAM;CACN,MAAM,KAAK;CACX,WAAW,KAAK;CAChB,OAAO,IAAI,WAAW,KAAK,KAAK;AAClC,EAAE,IACF,MAAM,MAAM,KAAK,UAAU;CAAE,MAAM;CAAmB;AAAK,EAAE,CACnE,CACF;;;;;;AAOF,MAAa,OAAO,OAAO,WAAW,WACpC,SACwD;CACxD,MAAM,iBAAiB,OAAO,QAC5B,OAAO,eAAe,MAAM,OAAO,YAAY,GAAG,CAAC,GACnD,QAAQ,gBACR,WACF;CAEA,MAAM,aAAa,OAAO,QAAQ,mBAAmB,QAAQ,cAAc,CAAC,GAAG,WAAW;CAE1F,MAAM,WAAW,OAAO,QACtB,UACA,QAAQ,YAAY;EAAE,OAAO;EAAM,QAAQ;CAAI,GAC/C,WACF;CAEA,MAAM,mBAAmB,OAAO,QAC9B,OAAO,SACP,QAAQ,oBAAoB,OAC5B,WACF;CAEA,MAAM,YAAY,OAAO,QAAQ,OAAO,SAAS,QAAQ,aAAa,OAAO,WAAW;CACxF,MAAM,SAAS,sBAAsB,QAAQ,WAAW,cAAc;CAEtE,IAAI,WAAW,KAAA,GACb,OAAO,OAAO,aAAa,KAAK;EAC9B,WAAW;EACX,QAAQ,QAAQ,oBAAoB,KAAK,CAAC,CAAC;EAC3C,SAAS;CACX,CAAC;CAEH,MAAM,cAAc,WAAW,eAAe;CAC9C,MAAM,cAAc,WAAW,eAAe;CAC9C,MAAM,eAAe,WAAW,gBAAgB;CAEhD,IAAI,gBAAgB,aAAa,gBAAgB,WAAW,iBAAiB,UAC3E,OAAO,OAAO,aAAa,KAAK;EAC9B,WAAW;EACX,QAAQ,QAAQ,YAAY,KAAK,CAAC,CAAC;EACnC,SAAS;CACX,CAAC;CAEH,MAAM,SAAwB;EAC5B;EACA;EACA,UAAU,WAAW,YAAY;EACjC;EACA;EACA;EACA,GAAI,WAAW,gBAAgB,KAAA,IAC3B,CAAC,IACD,cAAc,WAAW,cACvB,EAAE,iBAAiB,WAAW,YAAY,SAAS,IACnD,EAAE,SAAS,KAAK;CACxB;CAEA,MAAM,SAAS,OAAO,OAAO;CA6G7B,OAAO,EAAE,SA3GO,OAAO,WAAW,WAChC,QACA,QACA,UAAgC,CAAC,GACjC;EACA,MAAM,QAAQ,OAAO,QAAQ,eAAe,QAAQ,WAAW;EAC/D,MAAM,OAAO,OAAO,YAAkB,QAAQ,aAAaC,KAAe;EAE1E,MAAM,WACJ,QAAQ,mBAAmB,KAAA,IACvB,KAAA,IACA,OAAO,QACL,OAAO,OAAO,EAAE,UAAU,OAAO,YAAY,UAAU,EAAE,CAAC,GAC1D,QAAQ,gBACR,WACF;EAGN,MAAM,QAAQ,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,YAAY;EAChE,MAAM,WAAW,OAAO,aAAa,IAAI,CAAC,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC;EACpE,MAAM,YAAY,iBAAiB,IAAI;EAEvC,MAAM,mBACJ,aAAa,KAAA,IACT,SACA;GACE;GACA;GACA,UAAU,OAAO;GACjB;GACA;GACA,SAAS;GACT,kBAAkB;GAClB,GAAI,SAAS,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,SAAS,SAAS;EAClF;EAEN,MAAM,WAAW,OAAO,eACtB;GACE,YAAY,MAAM;GAClB,kBAAkB,MAAM;GACxB,qBAAqB,WAAW,uBAAuB;GACvD,cAAc,WAAW,gBAAgB;EAC3C,GACA;GACE;GACA,QAAQ;GACR;GACA,WAAW,aAAa,KAAA,KAAa;GACrC,QAAQ;IAAE,GAAG;IAAkB,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;GAAG;GACjF,iBAAiB,SAAS;GAC1B,kBAAkB,MAAM;EAC1B,CACF,CAAC,CAAC,KAAK,MAAM,QAAQ,KAAK,GAAG,OAAO,eAAe,OAAO,QAAQ,MAAM,CAAC;EAEzE,MAAM,YAAY,OAAO,OAAO,OAC9B,SAAS,QAAQ,KACf,OAAO,KAAK,aAA4C;GACtD,MAAM,iBACJ,WACA,YAEA,QAAQ,UAAU,QAAQ,UAAU,SAAS,CAAC,CAAC,KAC7C,OAAO,SAAS,aACd,aAAa,QAAQ,WAAW,SAAS,CAAC,CAAC,KACzC,OAAO,SAAS,UACd,cAAc,iBACV,SAAS,YAAY,UAAU,KAAK,IACpC,SAAS,sBAAsB,UAAU,KAAK,CACpD,CACF,CACF,GACA,OAAO,SAAS,QAAQ,QAAQ,cAAc,iBAAiB,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CACpF;GAEF,OAAO;IACL,SAAS,YAAY,UAAU,QAAQ;IACvC,YAAY;KACV,mBAAmB,YACjB,QAAQ,cAAc,SAAS,iBAAiB,CAAC,CAAC,KAChD,OAAO,SAAS,UAAU,SAAS,iBAAiB,MAAM,QAAQ,CAAC,GACnE,OAAO,QAAQ,QAAQ,eAAe,mBAAmB,SAAS,CAAC,CACrE;KACF,cAAc,YAAY,cAAc,gBAAgB,OAAO;KAC/D,wBAAwB,YAAY,cAAc,gBAAgB,OAAO;KACzE,UAAU,SAAS;KACnB,cAAc,SAAS;KACvB,QAAQ,SAAS;KACjB,QAAQ,SAAS;KACjB,WAAW,SAAS;IACtB;GACF;EACF,CAAC,CACH,CACF;EAEA,OAAO;GACL,WAAW,SAAS;GACpB,UAAU,SAAS;GACnB,SAAS,SAAS;GAClB,OAAO,SAAS;GAChB,SAAS,OAAO,UACd,SAAS,SACT,SAAS,QAAQ,KAAK,OAAO,QAAQ,SAAS,CAAC,CACjD,CAAC,CAAC,KAAK,OAAO,cAAc,SAAS,MAAM,KAAK,OAAO,MAAM,CAAC,CAAC;EACjE;CACF,CAEe,EAAE;AACnB,CAAC"}