@invisible-labs/sdk 0.6.0-devnet.3 → 0.6.0-devnet.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -10
- package/dist/.invisible-sdk-build-target.json +7 -0
- package/dist/{chunk-BWCGNTN5.js → chunk-5NNEO7IK.js} +31 -34
- package/dist/chunk-5NNEO7IK.js.map +1 -0
- package/dist/chunk-BRDLLGCZ.js +59 -0
- package/dist/chunk-BRDLLGCZ.js.map +1 -0
- package/dist/{chunk-NKRVQXRP.js → chunk-E4DCEDAG.js} +121 -11
- package/dist/chunk-E4DCEDAG.js.map +1 -0
- package/dist/{chunk-QQSI3ZD7.js → chunk-UADJCUPK.js} +106 -15
- package/dist/chunk-UADJCUPK.js.map +1 -0
- package/dist/{coordinator-VVJ33WF2.js → coordinator-ZNLGAYXD.js} +3 -3
- package/dist/{coordinator-VVJ33WF2.js.map → coordinator-ZNLGAYXD.js.map} +1 -1
- package/dist/events.js +1 -1
- package/dist/index.d.ts +59 -353
- package/dist/index.js +94 -39
- package/dist/index.js.map +1 -1
- package/dist/lp.d.ts +44 -10
- package/dist/lp.js +211 -71
- package/dist/lp.js.map +1 -1
- package/dist/presets.d.ts +5 -42
- package/dist/presets.js +10 -68
- package/dist/presets.js.map +1 -1
- package/dist/{errors-N2touVm4.d.ts → types.generated-DJBTjLpP.d.ts} +37 -1
- package/dist/user.d.ts +107 -8
- package/dist/user.js +613 -224
- package/dist/user.js.map +1 -1
- package/package.json +2 -31
- package/dist/chunk-BWCGNTN5.js.map +0 -1
- package/dist/chunk-NKRVQXRP.js.map +0 -1
- package/dist/chunk-QQSI3ZD7.js.map +0 -1
- package/dist/types.generated-BSEBz4jR.d.ts +0 -68
package/dist/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/validation/payoutPolicy.ts","../src/user/recoveryCode.ts","../src/user/coordinatorSession.ts","../src/user/index.ts"],"names":["closeProtocolRuntime"],"mappings":"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","file":"user.js","sourcesContent":["/**\n * Payout policy validation (spec sections 4.3.1 and 10.1).\n *\n * A two-stage check: AJV enforces the structural shape, then the semantic rules\n * that JSON Schema cannot express are applied. Any failure throws a\n * `PolicyValidationError` and the policy never reaches the wire. Pure and\n * synchronous; no transport, no I/O.\n */\n\nimport { PolicyValidationError } from \"../core/errors.js\";\nimport { publicKey } from \"../core/brands.js\";\nimport { scheduledPayoutWindowSeconds } from \"protocol/coordinator\";\nimport type { PayoutPolicy } from \"../schemas/types.generated.js\";\nimport { formatAjvErrors, validatePayoutPolicyShape } from \"./ajv.js\";\n\n/**\n * Conversion factor used by the public payout-window selector.\n */\nexport const PAYOUT_WINDOW_MILLISECONDS_PER_SECOND = 1_000;\n\n/** `totalDeadlineMs` value that selects the coordinator's instant payout mode. */\nexport const INSTANT_PAYOUT_WINDOW_MS = 0;\n\n/** Scheduled payout-window durations currently published by the coordinator. */\nconst SCHEDULED_PAYOUT_WINDOW_DURATIONS_MS = Object.freeze(\n scheduledPayoutWindowSeconds().map(\n (windowSeconds) => windowSeconds * PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n ),\n);\n\n/**\n * `totalDeadlineMs` values accepted by the current normal-user SDK surface.\n * Zero selects instant payout; positive values select a scheduled window.\n */\nexport const SUPPORTED_TOTAL_DEADLINE_MS = Object.freeze([\n INSTANT_PAYOUT_WINDOW_MS,\n ...SCHEDULED_PAYOUT_WINDOW_DURATIONS_MS,\n]);\n\nconst SUPPORTED_TOTAL_DEADLINE_MS_SET = new Set(SUPPORTED_TOTAL_DEADLINE_MS);\n\n/** Largest currently supported scheduled payout-window duration. */\nexport const MAX_TOTAL_DEADLINE_MS = Math.max(...SUPPORTED_TOTAL_DEADLINE_MS);\n\n/** Tolerance, in percentage points, for the destination shares summing to 100. */\nexport const SHARE_SUM_TOLERANCE = 0.01;\n\n/** Current normal-user policy/liquidity runtime limit for payout destinations. */\nexport const CURRENT_USER_PAYOUT_DESTINATION_LIMIT = 1;\n\nexport const CURRENT_USER_PAYOUT_DESTINATION_LIMIT_MESSAGE =\n \"current V0 normal-user SDK and coordinator support exactly one payout destination; multi-address receive is not supported yet\";\n\n/** V0 normal-user policy field that remains reserved for the V1 batch contract. */\nexport const CURRENT_USER_BATCH_EXCLUSION_ID_UNSUPPORTED_MESSAGE =\n \"batchExclusionId is not supported in V0 normal-user payout requests; V1 defines it as campaign-scoped batch exclusion, never a stable actor identity\";\n\n/** V0 normal-user policy field that is retained in the forward-compatible schema. */\nexport const CURRENT_USER_MIN_DELAY_UNSUPPORTED_MESSAGE =\n \"destinations[*].minDelayMs is not supported in V0 normal-user payout requests\";\n\n/** V0 normal-user policy field that is retained in the forward-compatible schema. */\nexport const CURRENT_USER_MAX_DELAY_UNSUPPORTED_MESSAGE =\n \"destinations[*].maxDelayMs is not supported in V0 normal-user payout requests\";\n\n/** Current normal-user policy/liquidity runtime limit for scheduled fragments. */\nexport const CURRENT_USER_PAYOUT_FRAGMENT_LIMIT = 1;\n\nexport const CURRENT_USER_PAYOUT_FRAGMENT_LIMIT_MESSAGE =\n \"current SDK and coordinator support exactly one scheduled payout fragment; multi-fragment receive is not supported yet\";\n\n/** Optional context that tightens validation when the caller knows more. */\nexport interface PayoutPolicyContext {\n /** The deposit origin; payout destinations must never equal it (rule 3). */\n readonly originAddress?: string;\n /** Total payable lamports; bounds each `minLamports` to its share (rule 6). */\n readonly totalLamports?: number;\n}\n\n/**\n * Validate an untrusted payout policy and return it typed.\n *\n * @throws PolicyValidationError on any structural or semantic violation.\n */\nexport function validatePayoutPolicy(input: unknown, ctx: PayoutPolicyContext = {}): PayoutPolicy {\n if (!validatePayoutPolicyShape(input)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `payout policy shape invalid: ${formatAjvErrors(validatePayoutPolicyShape.errors)}`,\n );\n }\n const policy = input as PayoutPolicy;\n const { destinations } = policy;\n\n assertCurrentUserUnsupportedPayoutFeatures(policy);\n assertCurrentUserPayoutDestinationLimit(destinations.length);\n\n // Rule 2: every address is a valid base58 Solana key.\n for (const { address } of destinations) {\n publicKey(address); // throws PolicyValidationError(INVALID_DESTINATION_ADDRESS)\n }\n\n // Rule 4: no repeated destination.\n const seen = new Set<string>();\n for (const { address } of destinations) {\n if (seen.has(address)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `duplicate payout destination: ${address}`,\n );\n }\n seen.add(address);\n }\n\n // Rule 3: no destination is the deposit origin.\n if (ctx.originAddress !== undefined && seen.has(ctx.originAddress)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n \"a payout destination must not be the deposit origin\",\n );\n }\n\n // Rule 1: shares sum to 100 within tolerance.\n const shareSum = destinations.reduce((acc, d) => acc + d.sharePercent, 0);\n if (Math.abs(shareSum - 100) > SHARE_SUM_TOLERANCE) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `destination shares must sum to 100, got ${shareSum}`,\n );\n }\n\n // Rule 6: per-destination floor bounds.\n for (const d of destinations) {\n if (d.minLamports !== undefined && ctx.totalLamports !== undefined) {\n const shareFloor = Math.floor((ctx.totalLamports * d.sharePercent) / 100);\n if (d.minLamports > shareFloor) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `minLamports (${d.minLamports}) exceeds the implied share floor (${shareFloor}) for ${d.address}`,\n );\n }\n }\n }\n\n // Rule 7: total deadline selects one of the coordinator's payout windows.\n if (policy.totalDeadlineMs !== undefined) {\n if (!SUPPORTED_TOTAL_DEADLINE_MS_SET.has(policy.totalDeadlineMs)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `totalDeadlineMs (${policy.totalDeadlineMs}) must be one of [${SUPPORTED_TOTAL_DEADLINE_MS.join(\", \")}] milliseconds; 0 selects instant payout`,\n );\n }\n }\n\n return policy;\n}\n\nfunction assertCurrentUserUnsupportedPayoutFeatures(policy: PayoutPolicy): void {\n if (policy.batchExclusionId !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_BATCH_EXCLUSION_ID_UNSUPPORTED_MESSAGE,\n );\n }\n\n for (const destination of policy.destinations) {\n if (destination.minDelayMs !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_MIN_DELAY_UNSUPPORTED_MESSAGE,\n );\n }\n if (destination.maxDelayMs !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_MAX_DELAY_UNSUPPORTED_MESSAGE,\n );\n }\n }\n}\n\nexport function assertCurrentUserPayoutDestinationLimit(destinationCount: number): void {\n if (destinationCount !== CURRENT_USER_PAYOUT_DESTINATION_LIMIT) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `${CURRENT_USER_PAYOUT_DESTINATION_LIMIT_MESSAGE}; got ${destinationCount}`,\n );\n }\n}\n\nexport function assertCurrentUserPayoutFragmentLimit(fragmentCount: number): void {\n if (fragmentCount !== CURRENT_USER_PAYOUT_FRAGMENT_LIMIT) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `${CURRENT_USER_PAYOUT_FRAGMENT_LIMIT_MESSAGE}; got ${fragmentCount}`,\n );\n }\n}\n","import { PolicyValidationError } from \"../core/errors.js\";\n\n/** Byte length of the Recovery Code preimage used by normal-user withdrawals. */\nexport const RECOVERY_CODE_BYTE_LENGTH = 32;\n\n/** Validate the Recovery Code preimage before it reaches the coordinator wire. */\nexport function assertRecoveryCode(code: Uint8Array): void {\n if (code.byteLength !== RECOVERY_CODE_BYTE_LENGTH) {\n throw new PolicyValidationError(\n \"INVALID_WITHDRAWAL_PLAN\",\n `recoveryCode must be ${RECOVERY_CODE_BYTE_LENGTH} bytes`,\n );\n }\n}\n\nexport async function generateRecoveryCode(): Promise<{\n code: Uint8Array;\n commitment: Uint8Array;\n}> {\n const code = crypto.getRandomValues(new Uint8Array(RECOVERY_CODE_BYTE_LENGTH));\n const commitment = await commitmentFromCode(code);\n return { code, commitment };\n}\n\nexport async function commitmentFromCode(code: Uint8Array): Promise<Uint8Array> {\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", new Uint8Array(code));\n return new Uint8Array(hashBuffer);\n}\n\nexport function recoveryCodeToHex(code: Uint8Array): string {\n return Array.from(code)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function recoveryCodeFromHex(hex: string): Uint8Array {\n const expectedHexLength = RECOVERY_CODE_BYTE_LENGTH * 2;\n if (!new RegExp(`^[0-9a-fA-F]{${expectedHexLength}}$`).test(hex)) {\n throw new Error(\n `recovery code must be exactly ${expectedHexLength} hex characters (${RECOVERY_CODE_BYTE_LENGTH} bytes)`,\n );\n }\n const bytes = new Uint8Array(RECOVERY_CODE_BYTE_LENGTH);\n for (let i = 0; i < RECOVERY_CODE_BYTE_LENGTH; i += 1) {\n bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\nexport function recoveryCodeFromUserInput(input: string): Uint8Array {\n return recoveryCodeFromHex(input.replace(/\\s+/g, \"\"));\n}\n","import type { DkgKeyPackageHandle } from \"frost\";\nimport { scheduledPayoutWindowSeconds } from \"protocol/coordinator\";\nimport type { CoordinatorPoolConfig } from \"../schemas/types.generated.js\";\nimport { publicKey } from \"../core/brands.js\";\nimport { solanaAddressFromPublicKeyBytes } from \"../core/solanaAddress.js\";\nimport type { Session } from \"../core/session.js\";\nimport type { AcceptanceReceipt } from \"../commands/receipts.js\";\nimport {\n AttestationError,\n CommandError,\n InvalidDepositAmountError,\n PolicyValidationError,\n RoutingError,\n TransportError,\n normalizeError,\n} from \"../core/errors.js\";\nimport { createExponentialBackoff } from \"../core/exponentialBackoff.js\";\nimport { createSession, type CreateSessionOptions } from \"../session/createSession.js\";\nimport { getSessionState } from \"../session/state.js\";\nimport {\n assertCurrentUserPayoutDestinationLimit,\n assertCurrentUserPayoutFragmentLimit,\n} from \"../validation/payoutPolicy.js\";\nimport {\n CoordinatorMessageType,\n EnvelopeKind,\n closeProtocolRuntime as closeSessionProtocolRuntime,\n onEnvelope,\n requestEnvelope,\n type Envelope,\n} from \"../coordinator/protocolClient.js\";\nimport { assertRecoveryCode, generateRecoveryCode, recoveryCodeToHex } from \"./recoveryCode.js\";\n\nexport type ClientSwapState =\n | \"new\"\n | \"awaiting_dkg\"\n | \"awaiting_deposit\"\n | \"awaiting_delegation\"\n | \"awaiting_delegate_ack\"\n | \"awaiting_delegate_ack_after_deposit\"\n | \"ready_for_settlement\"\n | \"settling\"\n | \"completed\"\n | \"refunded\"\n | \"failed\";\n\nexport type PayoutSpec =\n | {\n readonly mode: \"instant\";\n readonly destination_address: string;\n }\n | {\n readonly mode: \"scheduled\";\n readonly num_fragments: number;\n readonly window_seconds: number;\n readonly destination_addresses: readonly string[];\n };\n\nexport type SpendingPolicySnapshot = {\n readonly asset: \"SOL\";\n readonly entry_amount_lamports: number;\n readonly total_committed_lamports: number;\n readonly payout_deadline_ms: number;\n readonly payout_window_ms?: number;\n readonly payout_schedule: readonly { readonly destination_address: string }[];\n readonly fragment_count: number;\n readonly payout_mode: \"instant\" | \"scheduled\";\n readonly matching_mode: \"exact_1_to_1\";\n readonly fragmentation_allowed: \"payout_side_only\";\n readonly min_fee_bps: number;\n readonly fee_bps: number;\n readonly fee_lamports: number;\n readonly net_payout_lamports: number;\n};\n\nexport type PayoutExecutedPayload = {\n readonly index: number;\n readonly amount_lamports: number;\n readonly destination_address: string;\n readonly tx_signature: string;\n readonly executed_at_ms: number;\n readonly final: boolean;\n};\n\nexport type WithdrawExecutedPayload = {\n readonly tx_signature: string;\n readonly amount_lamports: number;\n readonly withdrawn_at_ms: number;\n readonly trigger: \"user_request\" | \"auto_deadline\";\n readonly destination_address: string;\n};\nexport type RefundExecutedPayload = WithdrawExecutedPayload;\n\ntype SyncRetryInstruction = {\n readonly should_retry: boolean;\n readonly poll_after_ms: number | null;\n};\n\ntype PayoutWindowSyncSnapshot = {\n readonly starts_at_ms: number;\n readonly deadline_ms: number | null;\n};\n\ntype NormalUserContractStatus =\n | \"deposit\"\n | \"activating\"\n | \"active\"\n | \"settling\"\n | \"completed\"\n | \"refunded\"\n | \"expired\";\n\nexport type NormalUserSettlementPhase =\n | \"awaiting_deposit\"\n | \"activating\"\n | \"waiting_for_liquidity\"\n | \"matched_scheduled\"\n | \"locked_pending_payout\"\n | \"submitted\"\n | \"confirming\"\n | \"completed\"\n | \"refund_pending\"\n | \"refunded\"\n | \"expired\";\n\nexport type NormalUserRefundability =\n | \"available_now\"\n | \"request_pending\"\n | \"blocked_by_lock\"\n | \"stale\"\n | \"unavailable\";\n\nexport type SourceLiquidityUse =\n | \"not_materialized\"\n | \"available\"\n | \"locked_for_payout\"\n | \"pending_finality\"\n | \"spent\"\n | \"released\";\n\ntype NormalUserContractSyncSnapshot = {\n readonly contract_id: string;\n readonly status: NormalUserContractStatus;\n readonly settlement_phase: NormalUserSettlementPhase;\n readonly refundability: NormalUserRefundability;\n readonly source_liquidity_use: SourceLiquidityUse;\n readonly destination_wallet: string | null;\n readonly deposit_amount_lamports: number;\n readonly deposit_expires_at_ms: number;\n readonly payout_window: PayoutWindowSyncSnapshot;\n readonly settlement_tx_hashes: readonly string[];\n readonly settled_amount_lamports: number;\n readonly protocol_fee_lamports: number;\n readonly network_fee_lost_lamports: readonly number[];\n readonly withdrawal_requested_lamports: number;\n readonly withdrawal_landed_lamports: number;\n readonly withdrawal_landed_fee_lamports: number;\n readonly withdrawal_canceled_lamports: number;\n readonly withdrawal_network_fee_loss_lamports: number;\n readonly withdrawal_tx_hashes: readonly string[];\n readonly retry: SyncRetryInstruction;\n readonly state_version: number;\n readonly updated_at_ms: number;\n};\n\nexport type NormalUserActorSyncSnapshot = {\n readonly actor: \"normal_user\";\n readonly snapshot: NormalUserContractSyncSnapshot;\n};\n\nexport type SyncUserResponsePayload = {\n readonly state: ClientSwapState;\n readonly fragments_executed: readonly PayoutExecutedPayload[];\n readonly withdraw_execution?: RefundExecutedPayload;\n readonly actor_sync?: NormalUserActorSyncSnapshot;\n};\n\n/**\n * Actor-scoped sync response plus the coordinator clock used to produce it.\n * The timestamp is envelope metadata, not part of the wire payload.\n */\nexport type SyncUserResponse = SyncUserResponsePayload & {\n readonly coordinatorTimestampMs: number;\n};\n\nexport type WithdrawAcceptedPayload = {\n readonly status: \"accepted\";\n readonly amount_lamports: number;\n readonly destination_address: string;\n readonly accepted_at_ms: number;\n};\n\n/**\n * Acceptance receipt for a normal-user refund, including the coordinator's\n * authoritative amount claim. The timestamp is absent when the coordinator\n * reports that the request already executed before the client received it.\n */\nexport type RefundAcceptanceReceipt = AcceptanceReceipt & {\n readonly amountLamports: number;\n readonly acceptedAtMs?: number;\n};\n\nexport type RunSwapParams = {\n amountLamports: number;\n payoutSpec: PayoutSpec;\n payoutDeadlineMs?: number;\n onPolicySnapshot?: (policy: SpendingPolicySnapshot) => void;\n recoveryCommitment?: Uint8Array;\n syncSecret?: Uint8Array;\n onSyncSecretReady?: (info: { secretHex: string }) => void | Promise<void>;\n onRecoveryCodeReady?: (info: { codeHex: string }) => void | Promise<void>;\n delegateShare?: Uint8Array;\n onDepositAddressReady?: (info: {\n swapId: string;\n jointPublicKey: Uint8Array;\n amountLamports: number;\n depositExpiresAtMs: number;\n coordinatorTimestampMs: number;\n }) => void | Promise<void>;\n onDepositConfirmed?: (info: { originAddress: string | undefined }) => void | Promise<void>;\n payoutWindowMs?: number;\n};\n\n/** Parameters for the pre-deposit portion of a normal-user contract flow. */\nexport type ContractRequestParams = Omit<RunSwapParams, \"onDepositConfirmed\">;\n\n/**\n * Details returned once the coordinator has accepted, initialized, and\n * durably delegated a contract, but before the user's deposit is observed.\n */\nexport type ContractRequestResult = {\n readonly accepted: true;\n /** V0 has no separate durable request id, so this aliases `swapId`. */\n readonly requestId: string;\n readonly state: \"awaiting_deposit\";\n readonly swapId: string;\n readonly depositAddress: string;\n readonly jointPublicKey: Uint8Array;\n readonly amountLamports: number;\n readonly depositExpiresAtMs: number;\n readonly coordinatorTimestampMs: number;\n readonly delegatedAtMs: number;\n /** The read-only status secret. The caller must persist it if it needs sync. */\n readonly syncSecret: Uint8Array;\n readonly syncSecretHex: string;\n /** Present when the SDK generated the Recovery Code for this request. */\n readonly recoveryCodeHex?: string;\n readonly policySnapshot: SpendingPolicySnapshot;\n readonly delegatePolicySnapshot: SpendingPolicySnapshot;\n};\n\nexport type SwapResult = {\n swapId: string;\n jointPublicKey: Uint8Array;\n depositTxSignature: string;\n depositObservedAtMs: number;\n delegatedAtMs: number;\n recoveryCodeHex?: string;\n policySnapshot: SpendingPolicySnapshot;\n delegatePolicySnapshot: SpendingPolicySnapshot;\n};\n\nexport type RefundIntentResult =\n | { readonly kind: \"executed\"; readonly refund: RefundExecutedPayload }\n | { readonly kind: \"accepted\"; readonly accepted: WithdrawAcceptedPayload };\n\nexport type SessionStatus = \"idle\" | \"connecting\" | \"running\" | \"done\" | \"failed\";\n\nexport type CoordinatorSessionOptions = {\n coordinator: CoordinatorPoolConfig;\n createSession?: (options: CreateSessionOptions) => Promise<Session>;\n};\n\ntype StateChangeListener = (swapState: ClientSwapState, sessionStatus: SessionStatus) => void;\ntype LogListener = (msg: string, direction: \"in\" | \"out\" | \"info\") => void;\ntype PayoutExecutedListener = (payload: PayoutExecutedPayload, swapId: string) => void;\ntype RefundExecutedListener = (payload: RefundExecutedPayload, swapId: string) => void;\ntype NormalUserActorSyncListener = (\n payload: NormalUserActorSyncSnapshot,\n coordinatorTimestampMs: number,\n) => void;\nexport type CoordinatorProtocolError = Error & {\n readonly code: string;\n readonly failedReqId?: number;\n};\ntype CoordinatorErrorListener = (err: CoordinatorProtocolError) => void;\n\nexport type CoordinatorSessionHandle = {\n onStateChange(listener: StateChangeListener): () => void;\n onLog(listener: LogListener): () => void;\n onPayoutExecuted(listener: PayoutExecutedListener): () => void;\n onRefundExecuted(listener: RefundExecutedListener): () => void;\n onNormalUserActorSync(listener: NormalUserActorSyncListener): () => void;\n onCoordinatorError(listener: CoordinatorErrorListener): () => void;\n readonly currentSwapState: ClientSwapState;\n readonly currentSessionStatus: SessionStatus;\n runSwap(params: RunSwapParams): Promise<SwapResult>;\n contractRequest(params: ContractRequestParams): Promise<ContractRequestResult>;\n close(): void;\n restoreSwapContext(params: { swapId: string; syncSecret?: Uint8Array }): void;\n requestSwapStatus(timeoutMs?: number): Promise<SyncUserResponsePayload>;\n startSwapStatusReconciliation(intervalMs?: number): () => void;\n requestRefund(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundExecutedPayload>;\n requestRefundIntent(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundIntentResult>;\n};\n\ntype PushListener = {\n resolve: (env: Envelope) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout> | null;\n};\n\ntype ProtocolModule = {\n INITIAL_STATE: ClientSwapState;\n nextState(\n state: ClientSwapState,\n kind: EnvelopeKind,\n type: CoordinatorMessageType,\n context?: { payoutFinal?: boolean },\n ): ClientSwapState | null;\n asDkgRound1ResponsePayload(env: Envelope): {\n package: Uint8Array;\n round2_for_alice: Uint8Array;\n };\n asDkgCompletePayload(env: Envelope): {\n joint_pubkey: Uint8Array;\n deposit_expires_at_ms: number;\n };\n asDelegateShareResponsePayload(env: Envelope): { delegated_at_ms: number };\n asDepositConfirmedPayload(env: Envelope): {\n amount_lamports: number;\n tx_signature: string;\n observed_at_ms: number;\n origin_address?: string;\n };\n asDelegateAckPayload(env: Envelope): {\n delegated_at_ms: number;\n spending_policy: SpendingPolicySnapshot;\n };\n asPayoutExecutedPayload(env: Envelope): PayoutExecutedPayload;\n asSwapRequestResponsePayload(env: Envelope): {\n swap_id: string;\n policy_snapshot: SpendingPolicySnapshot;\n };\n asWithdrawAcceptedPayload(env: Envelope): WithdrawAcceptedPayload;\n asWithdrawExecutedPayload(env: Envelope): WithdrawExecutedPayload;\n asSyncUserResponsePayload(env: Envelope): SyncUserResponsePayload;\n asErrorPayload(env: Envelope): {\n code: string;\n message: string;\n failed_req_id?: number;\n };\n};\n\ntype PreparedContract = {\n readonly requestId: string;\n readonly swapId: string;\n readonly amountLamports: number;\n readonly jointPublicKey: Uint8Array;\n readonly depositExpiresAtMs: number;\n readonly coordinatorTimestampMs: number;\n readonly delegatedAtMs: number;\n readonly syncSecret: Uint8Array;\n readonly syncSecretHex: string;\n readonly recoveryCodeHex?: string;\n readonly policySnapshot: SpendingPolicySnapshot;\n readonly delegatePolicySnapshot: SpendingPolicySnapshot;\n readonly depositConfirmedPromise: Promise<Envelope>;\n};\n\nlet protocolPromise: Promise<ProtocolModule> | null = null;\nlet frostRuntimePromise: Promise<typeof import(\"../frost/frostRuntime.js\")> | null = null;\n\nfunction loadProtocol(): Promise<ProtocolModule> {\n protocolPromise ??= import(\"protocol/coordinator\") as Promise<ProtocolModule>;\n return protocolPromise;\n}\n\n// @INFO Behind a dynamic import so the inlined FROST wasm stays in its own lazy\n// chunk, fetched only when a swap actually needs DKG.\nfunction loadFrostRuntime(): Promise<typeof import(\"../frost/frostRuntime.js\")> {\n frostRuntimePromise ??= import(\"../frost/frostRuntime.js\");\n return frostRuntimePromise;\n}\n\nfunction loadFrost(): Promise<typeof import(\"frost\")> {\n return loadFrostRuntime().then((runtime) => runtime.loadFrost());\n}\n\nconst BENIGN_TRANSPORT_DROP = Symbol(\"benignTransportDrop\");\nconst ALICE_ID = 1;\nconst COORDINATOR_ID = 2;\nconst SYNC_SECRET_BYTE_LENGTH = 32;\nconst SYNC_CONTRACT_ID_MISMATCH_MESSAGE =\n \"sync response contract id does not match requested contract\";\nconst ACTIVE_CONTRACT_REQUEST_MESSAGE = \"coordinator session already has an active contract\";\nconst DEFAULT_SWAP_STATUS_RECONCILE_INTERVAL_MS = 5_000;\nconst MAX_SWAP_STATUS_RETRY_DELAY_MS = 30_000;\nconst SWAP_STATUS_RETRY_MULTIPLIER = 2;\nconst SWAP_STATUS_RETRY_JITTER_RATIO = 0.2;\nconst DEFAULT_REFUND_OUTCOME_POLL_BUDGET_MS = 5 * 60 * 1000;\nconst REFUND_OUTCOME_POLL_INTERVAL_MS = 3_000;\nconst REFUND_OUTCOME_PER_POLL_TIMEOUT_MS = 5_000;\nconst REQUEST_TIMEOUT_MESSAGE = \"coordinator request timed out\";\nconst CURRENT_SCHEDULED_PAYOUT_WINDOW_SECONDS = new Set(scheduledPayoutWindowSeconds());\nconst CURRENT_SCHEDULED_PAYOUT_WINDOW_MESSAGE = `scheduled payout_spec.window_seconds must be one of [${scheduledPayoutWindowSeconds().join(\", \")}]`;\nconst TERMINAL_SWAP_STATES = new Set<ClientSwapState>([\"completed\", \"refunded\", \"failed\"]);\nconst activeFunctionalContractRequests = new WeakSet<Session>();\n\nexport function createCoordinatorSession(\n options: CoordinatorSessionOptions,\n): CoordinatorSessionHandle {\n return new UserCoordinatorSession(options);\n}\n\nexport function isBenignTransportDrop(err: unknown): boolean {\n return (\n typeof err === \"object\" &&\n err !== null &&\n (err as Record<symbol, unknown>)[BENIGN_TRANSPORT_DROP] === true\n );\n}\n\nexport function readDkgComplete(\n protocol: Pick<ProtocolModule, \"asDkgCompletePayload\">,\n envelope: Envelope,\n): {\n jointPublicKey: Uint8Array;\n depositExpiresAtMs: number;\n coordinatorTimestampMs: number;\n} {\n const payload = protocol.asDkgCompletePayload(envelope);\n return {\n jointPublicKey: payload.joint_pubkey,\n depositExpiresAtMs: payload.deposit_expires_at_ms,\n coordinatorTimestampMs: envelope.timestamp_ms,\n };\n}\n\nfunction tagBenignTransportDrop<T extends Error>(err: T): T {\n (err as unknown as Record<symbol, boolean>)[BENIGN_TRANSPORT_DROP] = true;\n return err;\n}\n\nfunction isBenignTransportDropCandidate(err: Error): boolean {\n return err instanceof TransportError && err.code === \"CONNECTION_LOST\";\n}\n\nclass UserCoordinatorSession implements CoordinatorSessionHandle {\n private readonly coordinator: CoordinatorPoolConfig;\n private readonly createSessionImpl: (options: CreateSessionOptions) => Promise<Session>;\n private readonly closeSessionAfterRefund: boolean;\n private protocol: ProtocolModule | null = null;\n private session: Session | null = null;\n private unsubscribeEnvelope: (() => void) | null = null;\n private unsubscribeTransportState: (() => void) | null = null;\n private swapState: ClientSwapState = \"new\";\n private sessionStatus: SessionStatus = \"idle\";\n private swapId: string | null = null;\n private syncSecret: Uint8Array | null = null;\n private attested = false;\n private readonly pushListeners = new Map<CoordinatorMessageType, PushListener>();\n private readonly stateListeners = new Set<StateChangeListener>();\n private readonly logListeners = new Set<LogListener>();\n private readonly payoutExecutedListeners = new Set<PayoutExecutedListener>();\n private readonly refundExecutedListeners = new Set<RefundExecutedListener>();\n private readonly normalUserActorSyncListeners = new Set<NormalUserActorSyncListener>();\n private readonly coordinatorErrorListeners = new Set<CoordinatorErrorListener>();\n private readonly emittedPayoutKeys = new Set<string>();\n private readonly emittedRefundKeys = new Set<string>();\n private stopStatusReconciliation: (() => void) | null = null;\n private bufferDepositConfirmedUntilDelegateAck = false;\n private bufferedDepositConfirmed: Envelope | null = null;\n\n constructor(options: CoordinatorSessionOptions, closeSessionAfterRefund = true) {\n this.coordinator = options.coordinator;\n this.createSessionImpl = options.createSession ?? createSession;\n this.closeSessionAfterRefund = closeSessionAfterRefund;\n }\n\n onStateChange(listener: StateChangeListener): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n onLog(listener: LogListener): () => void {\n this.logListeners.add(listener);\n return () => this.logListeners.delete(listener);\n }\n\n onPayoutExecuted(listener: PayoutExecutedListener): () => void {\n this.payoutExecutedListeners.add(listener);\n return () => this.payoutExecutedListeners.delete(listener);\n }\n\n onRefundExecuted(listener: RefundExecutedListener): () => void {\n this.refundExecutedListeners.add(listener);\n return () => this.refundExecutedListeners.delete(listener);\n }\n\n onNormalUserActorSync(listener: NormalUserActorSyncListener): () => void {\n this.normalUserActorSyncListeners.add(listener);\n return () => this.normalUserActorSyncListeners.delete(listener);\n }\n\n onCoordinatorError(listener: CoordinatorErrorListener): () => void {\n this.coordinatorErrorListeners.add(listener);\n return () => this.coordinatorErrorListeners.delete(listener);\n }\n\n get currentSwapState(): ClientSwapState {\n return this.swapState;\n }\n\n get currentSessionStatus(): SessionStatus {\n return this.sessionStatus;\n }\n\n /** @internal The resolved contract id used as the V0 refund request id. */\n get currentSwapId(): string | null {\n return this.swapId;\n }\n\n async runSwap(params: RunSwapParams): Promise<SwapResult> {\n assertCurrentUserPayoutSpecRuntimeLimits(params.payoutSpec);\n this.assertNoActiveContract();\n this.setSessionStatus(\"connecting\");\n\n let completed = false;\n try {\n await ensureFrostWasm();\n await this.openSession();\n this.setSessionStatus(\"running\");\n const result = await this.runProtocol(params);\n completed = true;\n this.setSessionStatus(\"done\");\n return result;\n } catch (err) {\n const error = this.normalizeSessionError(err);\n if (!isBenignTransportDrop(error)) {\n this.setSessionStatus(\"failed\");\n }\n throw error;\n } finally {\n if (!completed) {\n this.close();\n }\n }\n }\n\n async contractRequest(params: ContractRequestParams): Promise<ContractRequestResult> {\n assertCurrentUserPayoutSpecRuntimeLimits(params.payoutSpec);\n this.assertNoActiveContract();\n this.setSessionStatus(\"connecting\");\n\n try {\n await ensureFrostWasm();\n await this.openSession();\n this.setSessionStatus(\"running\");\n const prepared = await this.prepareContract(params);\n return toContractRequestResult(prepared);\n } catch (err) {\n const error = this.normalizeSessionError(err);\n this.setSessionStatus(\"failed\");\n throw error;\n }\n }\n\n /** @internal Used by the functional Session API without closing its caller-owned session. */\n releaseWithoutClosing(): void {\n this.stopStatusReconciliation?.();\n this.stopStatusReconciliation = null;\n this.detachSession(\n new TransportError(\"CONNECTION_LOST\", \"coordinator session operation released\"),\n false,\n false,\n );\n }\n\n close(): void {\n this.stopStatusReconciliation?.();\n this.stopStatusReconciliation = null;\n this.detachSession(new TransportError(\"CONNECTION_LOST\", \"coordinator session closed\"), true);\n }\n\n restoreSwapContext(params: { swapId: string; syncSecret?: Uint8Array }): void {\n this.swapId = params.swapId;\n if (params.syncSecret !== undefined) {\n if (params.syncSecret.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `syncSecret must be ${SYNC_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n this.syncSecret = new Uint8Array(params.syncSecret);\n }\n }\n\n async requestSwapStatus(timeoutMs?: number): Promise<SyncUserResponsePayload> {\n if (!this.swapId) {\n throw new CommandError(\"REJECTED_STATE\", \"Sync requires swapId\");\n }\n await this.openSession();\n\n const env = await this.request(\n CoordinatorMessageType.Sync,\n {\n actor: \"user\",\n ...(this.syncSecret ? { sync_secret: this.syncSecret } : {}),\n },\n timeoutMs,\n );\n const status = this.requireProtocol().asSyncUserResponsePayload(env);\n this.applySwapStatus(status, env.timestamp_ms);\n return status;\n }\n\n startSwapStatusReconciliation(\n intervalMs = DEFAULT_SWAP_STATUS_RECONCILE_INTERVAL_MS,\n ): () => void {\n this.stopStatusReconciliation?.();\n\n let stopped = false;\n let reconciling = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const browserWindow = typeof window === \"undefined\" ? null : window;\n const browserDocument = typeof document === \"undefined\" ? null : document;\n const retryBackoff = createExponentialBackoff({\n initialDelayMs: intervalMs,\n maxDelayMs: Math.max(MAX_SWAP_STATUS_RETRY_DELAY_MS, intervalMs),\n multiplier: SWAP_STATUS_RETRY_MULTIPLIER,\n jitterRatio: SWAP_STATUS_RETRY_JITTER_RATIO,\n });\n\n const isVisible = () =>\n browserDocument === null || browserDocument.visibilityState === \"visible\";\n\n const schedule = (delayMs: number) => {\n if (stopped || !isVisible()) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n void reconcile();\n }, delayMs);\n };\n\n const reconcile = async () => {\n if (stopped || reconciling || !isVisible()) return;\n reconciling = true;\n try {\n const status = await this.requestSwapStatus();\n retryBackoff.reset();\n if (\n status.state === \"completed\" ||\n status.state === \"refunded\" ||\n status.state === \"failed\"\n ) {\n stopped = true;\n if (timer) clearTimeout(timer);\n } else {\n schedule(intervalMs);\n }\n } catch (err) {\n this.log(`SwapStatus reconcile failed: ${normalizeError(err)}`, \"info\");\n if (!isRetryableSwapStatusReconciliationError(err)) {\n stopped = true;\n if (timer) clearTimeout(timer);\n this.close();\n return;\n }\n schedule(retryBackoff.nextDelayMs());\n } finally {\n reconciling = false;\n }\n };\n\n const reconcileWhenVisible = () => {\n if (!isVisible()) return;\n if (timer) clearTimeout(timer);\n timer = null;\n void reconcile();\n };\n\n const pauseWhileInactive = () => {\n if (timer) clearTimeout(timer);\n timer = null;\n };\n\n const handleVisibilityChange = () => {\n if (!isVisible()) {\n pauseWhileInactive();\n return;\n }\n reconcileWhenVisible();\n };\n\n const handleFreeze = () => {\n pauseWhileInactive();\n this.detachSession(new TransportError(\"CONNECTION_LOST\", \"coordinator page frozen\"), true);\n };\n\n browserWindow?.addEventListener(\"focus\", reconcileWhenVisible);\n browserWindow?.addEventListener(\"online\", reconcileWhenVisible);\n browserWindow?.addEventListener(\"pageshow\", reconcileWhenVisible);\n browserDocument?.addEventListener(\"visibilitychange\", handleVisibilityChange);\n browserDocument?.addEventListener(\"freeze\", handleFreeze);\n browserDocument?.addEventListener(\"resume\", reconcileWhenVisible);\n reconcileWhenVisible();\n\n this.stopStatusReconciliation = () => {\n stopped = true;\n if (timer) clearTimeout(timer);\n browserWindow?.removeEventListener(\"focus\", reconcileWhenVisible);\n browserWindow?.removeEventListener(\"online\", reconcileWhenVisible);\n browserWindow?.removeEventListener(\"pageshow\", reconcileWhenVisible);\n browserDocument?.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n browserDocument?.removeEventListener(\"freeze\", handleFreeze);\n browserDocument?.removeEventListener(\"resume\", reconcileWhenVisible);\n };\n return this.stopStatusReconciliation;\n }\n\n async requestRefund(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundExecutedPayload> {\n const result = await this.requestRefundIntentInternal(params, { waitForFinality: true });\n if (result.kind === \"executed\") return result.refund;\n throw new CommandError(\"REJECTED_STALE_JOB\", \"refund accepted without final execution\");\n }\n\n requestRefundIntent(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundIntentResult> {\n return this.requestRefundIntentInternal(params, { waitForFinality: false });\n }\n\n private async requestRefundIntentInternal(\n params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n },\n options: { waitForFinality: boolean },\n ): Promise<RefundIntentResult> {\n assertRecoveryCode(params.recoveryCode);\n const recoveryCode = new Uint8Array(params.recoveryCode);\n const ackTimeout = params.timeoutMs ?? 30_000;\n let ackTimer: ReturnType<typeof setTimeout> | undefined;\n let openedForRefund = false;\n try {\n if (params.syncSecret !== undefined) {\n const swapId = params.swapId ?? this.swapId;\n if (!swapId) {\n throw new CommandError(\"REJECTED_STATE\", \"syncSecret requires swapId\");\n }\n this.restoreSwapContext({ swapId, syncSecret: params.syncSecret });\n } else if (params.swapId) {\n const swapId = params.swapId;\n this.restoreSwapContext({ swapId });\n }\n\n openedForRefund = !this.hasUsableSession();\n await this.openSession();\n\n const env = await Promise.race([\n this.request(CoordinatorMessageType.WithdrawRequest, {\n recovery_code: recoveryCode,\n }),\n new Promise<never>((_, reject) => {\n ackTimer = setTimeout(\n () =>\n reject(\n new CommandError(\n \"REJECTED_STALE_JOB\",\n `WithdrawRequest acknowledgement timed out after ${ackTimeout}ms`,\n ),\n ),\n ackTimeout,\n );\n }),\n ]);\n if (ackTimer) clearTimeout(ackTimer);\n if (env.type === CoordinatorMessageType.WithdrawExecuted) {\n if (env.swap_id && !this.swapId) {\n this.swapId = env.swap_id;\n }\n return { kind: \"executed\", refund: this.requireProtocol().asWithdrawExecutedPayload(env) };\n }\n if (env.type !== CoordinatorMessageType.WithdrawAccepted) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `Expected WithdrawAccepted or WithdrawExecuted response, got ${env.type}`,\n );\n }\n if (env.swap_id && !this.swapId) {\n this.swapId = env.swap_id;\n }\n const accepted = this.requireProtocol().asWithdrawAcceptedPayload(env);\n if (!options.waitForFinality) {\n return { kind: \"accepted\", accepted };\n }\n if (!this.swapId) {\n throw new CommandError(\n \"REJECTED_STALE_JOB\",\n \"refund accepted and pending finalization; check status again shortly\",\n );\n }\n return { kind: \"executed\", refund: await this.awaitRefundOutcomeFromSwapStatus() };\n } finally {\n if (ackTimer) clearTimeout(ackTimer);\n recoveryCode.fill(0);\n if (openedForRefund && this.closeSessionAfterRefund) {\n this.close();\n }\n }\n }\n\n private async awaitRefundOutcomeFromSwapStatus(): Promise<RefundExecutedPayload> {\n const deadline = Date.now() + DEFAULT_REFUND_OUTCOME_POLL_BUDGET_MS;\n for (;;) {\n const perPollTimeout = Math.min(\n REFUND_OUTCOME_PER_POLL_TIMEOUT_MS,\n Math.max(0, deadline - Date.now()),\n );\n try {\n const status = await this.requestSwapStatus(perPollTimeout);\n if (status.withdraw_execution) {\n return status.withdraw_execution;\n }\n } catch (err) {\n if (!isRequestTimeoutError(err)) {\n throw err;\n }\n }\n if (Date.now() >= deadline) {\n throw new CommandError(\n \"REJECTED_STALE_JOB\",\n \"refund accepted and pending finalization; check status again shortly\",\n );\n }\n await delay(REFUND_OUTCOME_POLL_INTERVAL_MS);\n }\n }\n\n private async runProtocol(params: RunSwapParams): Promise<SwapResult> {\n const protocol = this.requireProtocol();\n const prepared = await this.prepareContract(params);\n const depositEnv = await prepared.depositConfirmedPromise;\n const depositPayload = protocol.asDepositConfirmedPayload(depositEnv);\n if (depositPayload.amount_lamports !== params.amountLamports) {\n throw new InvalidDepositAmountError(\n BigInt(depositPayload.amount_lamports),\n BigInt(params.amountLamports),\n );\n }\n this.log(\n `deposit confirmed tx=${depositPayload.tx_signature} amount=${depositPayload.amount_lamports}`,\n \"in\",\n );\n\n await params.onDepositConfirmed?.({ originAddress: depositPayload.origin_address });\n await this.requestSwapStatus();\n\n return {\n swapId: prepared.swapId,\n jointPublicKey: prepared.jointPublicKey,\n depositTxSignature: depositPayload.tx_signature,\n depositObservedAtMs: depositPayload.observed_at_ms,\n delegatedAtMs: prepared.delegatedAtMs,\n recoveryCodeHex: prepared.recoveryCodeHex,\n policySnapshot: prepared.policySnapshot,\n delegatePolicySnapshot: prepared.delegatePolicySnapshot,\n };\n }\n\n private async prepareContract(params: ContractRequestParams): Promise<PreparedContract> {\n const protocol = this.requireProtocol();\n const requestedPayoutWindowMs =\n params.payoutWindowMs ?? payoutWindowMsFromSpec(params.payoutSpec);\n const payoutDeadlineMs =\n requestedPayoutWindowMs !== undefined ? Date.now() + requestedPayoutWindowMs : undefined;\n let generatedSyncSecret: Uint8Array | null = null;\n const syncSecret = params.syncSecret\n ? new Uint8Array(params.syncSecret)\n : (() => {\n generatedSyncSecret = randomSecret32();\n return generatedSyncSecret;\n })();\n if (syncSecret.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `syncSecret must be ${SYNC_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n this.syncSecret = new Uint8Array(syncSecret);\n const syncSecretHex = bytesToHex(syncSecret);\n const syncCommitment = await sha256Commitment(syncSecret);\n if (generatedSyncSecret) {\n await params.onSyncSecretReady?.({ secretHex: syncSecretHex });\n }\n\n const swapResp = await this.request(CoordinatorMessageType.ContractRequest, {\n actor: \"user\",\n amount_lamports: params.amountLamports,\n payout_spec: params.payoutSpec,\n sync_commitment: syncCommitment,\n ...((params.payoutDeadlineMs !== undefined || payoutDeadlineMs !== undefined) && {\n payout_deadline_ms: params.payoutDeadlineMs ?? payoutDeadlineMs,\n }),\n });\n const swapPayload = protocol.asSwapRequestResponsePayload(swapResp);\n const swapId = swapPayload.swap_id;\n this.swapId = swapId;\n params.onPolicySnapshot?.(swapPayload.policy_snapshot);\n this.log(`swap accepted - id=${swapId}`, \"in\");\n\n this.bufferDepositConfirmedUntilDelegateAck = true;\n this.bufferedDepositConfirmed = null;\n const depositConfirmedPromise = this.awaitPush(CoordinatorMessageType.DepositConfirmed, null);\n void depositConfirmedPromise.catch(() => undefined);\n const { jointPublicKey, keyHandle, depositExpiresAtMs, coordinatorTimestampMs } =\n await this.runDkg();\n\n let recoveryCommitment = params.recoveryCommitment;\n let recoveryCodeHex: string | undefined;\n if (!recoveryCommitment) {\n const generated = await generateRecoveryCode();\n recoveryCommitment = generated.commitment;\n try {\n recoveryCodeHex = recoveryCodeToHex(generated.code);\n await params.onRecoveryCodeReady?.({ codeHex: recoveryCodeHex });\n } finally {\n generated.code.fill(0);\n }\n }\n\n const delegateAckPromise = this.awaitPush(CoordinatorMessageType.DelegateAck);\n const share = params.delegateShare ?? keyHandle.secretShareBytes();\n let delegateResp: Envelope;\n try {\n delegateResp = await this.request(CoordinatorMessageType.DelegateShare, {\n share,\n recovery_commitment: recoveryCommitment,\n });\n } catch (err) {\n void delegateAckPromise.catch(() => undefined);\n throw err;\n }\n const delegatePayload = protocol.asDelegateShareResponsePayload(delegateResp);\n const delegateAck = protocol.asDelegateAckPayload(await delegateAckPromise);\n\n if (delegateAck.delegated_at_ms !== delegatePayload.delegated_at_ms) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DelegateAck delegated_at_ms does not match DelegateShare response\",\n );\n }\n if (!spendingPoliciesEqual(delegateAck.spending_policy, swapPayload.policy_snapshot)) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DelegateAck spending_policy does not match ContractRequest policy_snapshot\",\n );\n }\n\n this.log(`delegated at ${delegateAck.delegated_at_ms}`, \"in\");\n this.releaseDepositConfirmedGate();\n\n await params.onDepositAddressReady?.({\n swapId,\n jointPublicKey,\n amountLamports: params.amountLamports,\n depositExpiresAtMs,\n coordinatorTimestampMs,\n });\n\n return {\n requestId: swapId,\n swapId,\n amountLamports: params.amountLamports,\n jointPublicKey,\n depositExpiresAtMs,\n coordinatorTimestampMs,\n delegatedAtMs: delegateAck.delegated_at_ms,\n syncSecret,\n syncSecretHex,\n recoveryCodeHex,\n policySnapshot: swapPayload.policy_snapshot,\n delegatePolicySnapshot: delegateAck.spending_policy,\n depositConfirmedPromise,\n };\n }\n\n private async runDkg(): Promise<{\n jointPublicKey: Uint8Array;\n keyHandle: DkgKeyPackageHandle;\n depositExpiresAtMs: number;\n coordinatorTimestampMs: number;\n }> {\n await ensureFrostWasm();\n const protocol = this.requireProtocol();\n const { dkgRound1 } = await loadFrost();\n await this.request(CoordinatorMessageType.DkgInit, {});\n this.log(\"DKG initialised\", \"info\");\n\n const aliceRound1State = dkgRound1(ALICE_ID);\n const aliceRound1Bytes = aliceRound1State.round1PackageBytes();\n const round1Resp = await this.request(CoordinatorMessageType.DkgRound1, {\n package: aliceRound1Bytes,\n });\n const round1Payload = protocol.asDkgRound1ResponsePayload(round1Resp);\n this.log(`DKG round1 complete - coord pkg ${round1Payload.package.byteLength}B`, \"in\");\n\n const aliceRound2State = aliceRound1State.intoRound2(COORDINATOR_ID, round1Payload.package);\n const aliceRound2Bytes = aliceRound2State.round2PackageBytesFor(COORDINATOR_ID);\n let aliceKeyHandle: DkgKeyPackageHandle;\n try {\n aliceKeyHandle = aliceRound2State.intoRound3(\n COORDINATOR_ID,\n round1Payload.package,\n round1Payload.round2_for_alice,\n );\n } catch (err) {\n throw new CommandError(\"REJECTED_GUARD\", `Alice DKG finalize failed: ${normalizeError(err)}`);\n }\n\n const dkgCompletePromise = this.awaitPush(CoordinatorMessageType.DkgComplete);\n await this.request(CoordinatorMessageType.DkgRound2, {\n package: aliceRound2Bytes,\n });\n const completeEnvelope = await dkgCompletePromise;\n const complete = readDkgComplete(protocol, completeEnvelope);\n const alicePubkey = aliceKeyHandle.groupPublicKeyBytes();\n if (!bytesEqual(alicePubkey, complete.jointPublicKey)) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DKG joint public key mismatch between Alice and coordinator\",\n );\n }\n\n const pubkeyHexPrefix = Array.from(alicePubkey.slice(0, 8))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n this.log(`DKG complete - joint pubkey ${pubkeyHexPrefix}`, \"info\");\n\n return {\n jointPublicKey: alicePubkey,\n keyHandle: aliceKeyHandle,\n depositExpiresAtMs: complete.depositExpiresAtMs,\n coordinatorTimestampMs: complete.coordinatorTimestampMs,\n };\n }\n\n private async openSession(): Promise<void> {\n if (this.hasUsableSession()) return;\n if (this.session !== null) {\n this.detachSession(\n new TransportError(\"CONNECTION_LOST\", \"cached coordinator session is not usable\"),\n true,\n );\n }\n this.protocol = await loadProtocol();\n const session = await this.createSessionImpl({ coordinator: this.coordinator });\n this.session = session;\n this.attested = true;\n this.unsubscribeEnvelope = onEnvelope(session, (envelope) => this.handleEnvelope(envelope));\n this.unsubscribeTransportState = getSessionState(session).transport.onStateChange((state) => {\n if (this.session !== session) return;\n if (state === \"closing\" || state === \"closed\") {\n const fatalError = getSessionState(session).lastFatalError;\n this.detachSession(\n fatalError ?? new TransportError(\"CONNECTION_LOST\", \"coordinator transport closed\"),\n false,\n );\n }\n });\n this.log(`connected to ${this.coordinator.endpoints[0]?.wsUrl ?? \"coordinator\"}`, \"info\");\n this.log(\"attestation verified\", \"info\");\n }\n\n private assertNoActiveContract(): void {\n if (\n this.swapId !== null ||\n this.sessionStatus === \"connecting\" ||\n this.sessionStatus === \"running\"\n ) {\n throw new CommandError(\"REJECTED_STATE\", ACTIVE_CONTRACT_REQUEST_MESSAGE);\n }\n }\n\n private hasUsableSession(): boolean {\n if (this.session === null) return false;\n const state = getSessionState(this.session);\n return state.attested && state.channel !== null && state.transport.state() === \"open\";\n }\n\n private detachSession(error: Error, closeTransport: boolean, closeProtocolRuntime = true): void {\n const rejectionError =\n this.attested && !closeTransport && isBenignTransportDropCandidate(error)\n ? tagBenignTransportDrop(error)\n : error;\n this.unsubscribeEnvelope?.();\n this.unsubscribeEnvelope = null;\n this.unsubscribeTransportState?.();\n this.unsubscribeTransportState = null;\n\n const session = this.session;\n this.session = null;\n this.attested = false;\n\n if (session !== null) {\n if (closeProtocolRuntime) closeSessionProtocolRuntime(session);\n if (closeTransport) {\n getSessionState(session).close();\n }\n }\n\n this.rejectAllPushListeners(rejectionError);\n }\n\n private handleEnvelope(env: Envelope): void {\n const protocol = this.requireProtocol();\n this.log(`<- ${env.type} kind=${env.kind}`, \"in\");\n const payoutExecuted =\n env.kind === EnvelopeKind.PUSH && env.type === CoordinatorMessageType.PayoutExecuted\n ? protocol.asPayoutExecutedPayload(env)\n : null;\n const payoutMatchesCurrentSwap =\n payoutExecuted !== null && (env.swap_id === null || env.swap_id === this.swapId);\n const refundExecuted =\n env.kind === EnvelopeKind.PUSH && env.type === CoordinatorMessageType.WithdrawExecuted\n ? protocol.asWithdrawExecutedPayload(env)\n : null;\n\n if (this.shouldBufferDepositConfirmed(env)) {\n this.bufferDepositConfirmed(env);\n return;\n }\n\n const foreignPayout = payoutExecuted !== null && !payoutMatchesCurrentSwap;\n const next = foreignPayout\n ? null\n : protocol.nextState(\n this.swapState,\n env.kind,\n env.type,\n payoutExecuted ? { payoutFinal: payoutExecuted.final } : undefined,\n );\n\n if (env.kind === EnvelopeKind.PUSH && next === null) {\n this.log(\n foreignPayout\n ? `ignored ${env.type} for swap ${env.swap_id ?? \"null\"} while current swap is ${\n this.swapId ?? \"none\"\n }`\n : `ignored invalid push ${env.type} in state ${this.swapState}`,\n \"info\",\n );\n return;\n }\n\n if (next !== null) {\n this.swapState = next;\n this.emitStateChange();\n }\n\n if (env.kind === EnvelopeKind.ERROR) {\n const coordinatorError = coordinatorErrorFromEnvelope(protocol, env);\n if (env.req_id === 0) {\n for (const listener of this.coordinatorErrorListeners) {\n listener(coordinatorError);\n }\n }\n return;\n }\n\n if (env.kind === EnvelopeKind.PUSH) {\n if (payoutExecuted && payoutMatchesCurrentSwap) {\n this.emitPayoutExecuted(payoutExecuted, env.swap_id ?? this.swapId);\n }\n if (refundExecuted) {\n this.emitRefundExecuted(refundExecuted, env.swap_id ?? this.swapId);\n }\n this.resolvePushListener(env);\n }\n }\n\n private applySwapStatus(status: SyncUserResponsePayload, coordinatorTimestampMs: number): void {\n const keepTerminalState =\n TERMINAL_SWAP_STATES.has(this.swapState) && status.state !== this.swapState;\n if (!keepTerminalState && this.swapState !== status.state) {\n this.swapState = status.state;\n this.emitStateChange();\n }\n for (const fragment of status.fragments_executed) {\n this.emitPayoutExecuted(fragment, this.swapId);\n }\n if (status.withdraw_execution) {\n this.emitRefundExecuted(status.withdraw_execution, this.swapId);\n }\n if (status.actor_sync !== undefined) {\n for (const listener of this.normalUserActorSyncListeners) {\n listener(status.actor_sync, coordinatorTimestampMs);\n }\n }\n }\n\n private emitPayoutExecuted(payload: PayoutExecutedPayload, swapId: string | null): void {\n if (!swapId) return;\n const key = `${swapId}:${payload.index}:${payload.tx_signature}`;\n if (this.emittedPayoutKeys.has(key)) return;\n this.emittedPayoutKeys.add(key);\n\n this.log(\n `payout executed tx=${payload.tx_signature} amount=${payload.amount_lamports} final=${payload.final}`,\n \"in\",\n );\n for (const listener of this.payoutExecutedListeners) {\n listener(payload, swapId);\n }\n }\n\n private emitRefundExecuted(payload: RefundExecutedPayload, swapId: string | null): void {\n if (!swapId) return;\n const key = `${swapId}:${payload.tx_signature}`;\n if (this.emittedRefundKeys.has(key)) return;\n this.emittedRefundKeys.add(key);\n\n this.log(`refund executed tx=${payload.tx_signature} amount=${payload.amount_lamports}`, \"in\");\n for (const listener of this.refundExecutedListeners) {\n listener(payload, swapId);\n }\n }\n\n private request(\n type: CoordinatorMessageType,\n payload: unknown,\n timeoutMs?: number,\n ): Promise<Envelope> {\n if (this.session === null) {\n throw new TransportError(\"CONNECTION_LOST\", \"coordinator session is not connected\");\n }\n return requestEnvelope(this.session, type, payload, {\n swapId: this.swapId,\n timeoutMs,\n onLog: (message, direction) => this.log(message, direction),\n });\n }\n\n private awaitPush(\n type: CoordinatorMessageType,\n timeoutMs: number | null = 30_000,\n ): Promise<Envelope> {\n return new Promise((resolve, reject) => {\n const timer =\n timeoutMs === null\n ? null\n : setTimeout(() => {\n this.pushListeners.delete(type);\n reject(new CommandError(\"REJECTED_STALE_JOB\", `timed out waiting for ${type} push`));\n }, timeoutMs);\n this.pushListeners.set(type, { resolve, reject, timer });\n });\n }\n\n private rejectAllPushListeners(err: Error): void {\n for (const listener of this.pushListeners.values()) {\n if (listener.timer) clearTimeout(listener.timer);\n listener.reject(err);\n }\n this.pushListeners.clear();\n this.bufferDepositConfirmedUntilDelegateAck = false;\n this.bufferedDepositConfirmed = null;\n }\n\n private shouldBufferDepositConfirmed(env: Envelope): boolean {\n return (\n env.kind === EnvelopeKind.PUSH &&\n env.type === CoordinatorMessageType.DepositConfirmed &&\n this.bufferDepositConfirmedUntilDelegateAck\n );\n }\n\n private bufferDepositConfirmed(env: Envelope): void {\n if (!this.bufferedDepositConfirmed) {\n this.bufferedDepositConfirmed = env;\n this.clearPushListenerTimer(CoordinatorMessageType.DepositConfirmed);\n this.log(\"buffered DepositConfirmed until DelegateAck is verified\", \"info\");\n return;\n }\n this.log(\"ignored duplicate DepositConfirmed while waiting for DelegateAck\", \"info\");\n }\n\n private releaseDepositConfirmedGate(): void {\n const protocol = this.requireProtocol();\n this.bufferDepositConfirmedUntilDelegateAck = false;\n const buffered = this.bufferedDepositConfirmed;\n if (!buffered) return;\n\n this.bufferedDepositConfirmed = null;\n const next = protocol.nextState(this.swapState, buffered.kind, buffered.type);\n if (next === null) {\n this.log(`ignored buffered DepositConfirmed in state ${this.swapState}`, \"info\");\n return;\n }\n\n this.swapState = next;\n this.emitStateChange();\n this.resolvePushListener(buffered);\n }\n\n private resolvePushListener(env: Envelope): void {\n const listener = this.pushListeners.get(env.type);\n if (!listener) return;\n this.pushListeners.delete(env.type);\n if (listener.timer) clearTimeout(listener.timer);\n listener.resolve(env);\n }\n\n private clearPushListenerTimer(type: CoordinatorMessageType): void {\n const listener = this.pushListeners.get(type);\n if (!listener?.timer) return;\n clearTimeout(listener.timer);\n listener.timer = null;\n }\n\n private setSessionStatus(status: SessionStatus): void {\n this.sessionStatus = status;\n this.emitStateChange();\n }\n\n private emitStateChange(): void {\n for (const listener of this.stateListeners) {\n listener(this.swapState, this.sessionStatus);\n }\n }\n\n private log(msg: string, direction: \"in\" | \"out\" | \"info\"): void {\n for (const listener of this.logListeners) {\n listener(msg, direction);\n }\n }\n\n private normalizeSessionError(err: unknown): Error {\n if (err instanceof Error) {\n if (this.attested && isBenignTransportDropCandidate(err)) return tagBenignTransportDrop(err);\n return err;\n }\n return new Error(String(err));\n }\n\n private requireProtocol(): ProtocolModule {\n if (this.protocol === null) {\n throw new CommandError(\"REJECTED_STATE\", \"coordinator protocol is not loaded\");\n }\n return this.protocol;\n }\n}\n\nfunction toContractRequestResult(prepared: PreparedContract): ContractRequestResult {\n return {\n accepted: true,\n requestId: prepared.requestId,\n state: \"awaiting_deposit\",\n swapId: prepared.swapId,\n depositAddress: solanaAddressFromPublicKeyBytes(prepared.jointPublicKey),\n jointPublicKey: new Uint8Array(prepared.jointPublicKey),\n amountLamports: prepared.amountLamports,\n depositExpiresAtMs: prepared.depositExpiresAtMs,\n coordinatorTimestampMs: prepared.coordinatorTimestampMs,\n delegatedAtMs: prepared.delegatedAtMs,\n syncSecret: new Uint8Array(prepared.syncSecret),\n syncSecretHex: prepared.syncSecretHex,\n recoveryCodeHex: prepared.recoveryCodeHex,\n policySnapshot: prepared.policySnapshot,\n delegatePolicySnapshot: prepared.delegatePolicySnapshot,\n };\n}\n\n/** Execute the functional pre-deposit API on an already-attested Session. */\nexport async function contractRequestOnSession(\n session: Session,\n params: ContractRequestParams,\n): Promise<ContractRequestResult> {\n if (activeFunctionalContractRequests.has(session)) {\n throw new CommandError(\"REJECTED_STATE\", ACTIVE_CONTRACT_REQUEST_MESSAGE);\n }\n activeFunctionalContractRequests.add(session);\n let client: UserCoordinatorSession | null = null;\n try {\n client = new UserCoordinatorSession({\n coordinator: getSessionState(session).pool,\n createSession: async () => session,\n });\n return await client.contractRequest(params);\n } finally {\n activeFunctionalContractRequests.delete(session);\n client?.releaseWithoutClosing();\n }\n}\n\n/** Execute the functional normal-user refund command on a caller-owned session. */\nexport async function requestRefundOnSession(\n session: Session,\n params: { readonly recoveryCode: Uint8Array; readonly timeoutMs?: number },\n): Promise<RefundAcceptanceReceipt> {\n const client = new UserCoordinatorSession(\n {\n coordinator: getSessionState(session).pool,\n createSession: async () => session,\n },\n false,\n );\n try {\n const result = await client.requestRefundIntent(params);\n const requestId = client.currentSwapId;\n if (!requestId) {\n throw new CommandError(\n \"REJECTED_STALE_JOB\",\n \"refund response did not include the resolved contract id\",\n );\n }\n if (result.kind === \"accepted\") {\n return {\n accepted: true,\n requestId,\n amountLamports: result.accepted.amount_lamports,\n acceptedAtMs: result.accepted.accepted_at_ms,\n };\n }\n return {\n accepted: true,\n requestId,\n amountLamports: result.refund.amount_lamports,\n };\n } finally {\n client.releaseWithoutClosing();\n }\n}\n\n/** Read the actor-scoped normal-user projection for a contract. */\nexport async function requestUserSync(\n session: Session,\n swapId: string,\n syncSecret: Uint8Array,\n timeoutMs?: number,\n): Promise<SyncUserResponse> {\n if (swapId.trim().length === 0) {\n throw new CommandError(\"REJECTED_STATE\", \"sync requires a non-empty swapId\");\n }\n if (syncSecret.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\"REJECTED_GUARD\", `syncSecret must be ${SYNC_SECRET_BYTE_LENGTH} bytes`);\n }\n const env = await requestEnvelope(\n session,\n CoordinatorMessageType.Sync,\n {\n actor: \"user\",\n sync_secret: new Uint8Array(syncSecret),\n },\n { swapId, timeoutMs, rejectMatchingOutOfBandErrors: true },\n );\n const payload = (await loadProtocol()).asSyncUserResponsePayload(env);\n assertSyncResponseContractId(env, payload, swapId);\n return {\n ...payload,\n coordinatorTimestampMs: env.timestamp_ms,\n };\n}\n\nfunction assertSyncResponseContractId(\n envelope: Pick<Envelope, \"swap_id\">,\n payload: SyncUserResponsePayload,\n requestedSwapId: string,\n): void {\n const actorSyncContractId = payload.actor_sync?.snapshot.contract_id;\n if (\n envelope.swap_id !== requestedSwapId ||\n (actorSyncContractId !== undefined && actorSyncContractId !== requestedSwapId)\n ) {\n throw new CommandError(\"REJECTED_STATE\", SYNC_CONTRACT_ID_MISMATCH_MESSAGE);\n }\n}\n\nasync function ensureFrostWasm(): Promise<void> {\n await (await loadFrostRuntime()).ensureFrostWasm();\n}\n\nfunction randomSecret32(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(SYNC_SECRET_BYTE_LENGTH));\n}\n\nasync function sha256Commitment(secret: Uint8Array): Promise<Uint8Array> {\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", new Uint8Array(secret));\n return new Uint8Array(hashBuffer);\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction payoutWindowMsFromSpec(payoutSpec: PayoutSpec): number | undefined {\n if (payoutSpec.mode === \"instant\") return undefined;\n return payoutSpec.window_seconds * 1000;\n}\n\nfunction assertCurrentUserPayoutSpecRuntimeLimits(payoutSpec: PayoutSpec): void {\n if (payoutSpec.mode === \"instant\") {\n if (typeof payoutSpec.destination_address !== \"string\") {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n \"instant payout_spec.destination_address must be a string\",\n );\n }\n publicKey(payoutSpec.destination_address);\n return;\n }\n if (!Array.isArray(payoutSpec.destination_addresses)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n \"scheduled payout_spec.destination_addresses must be an array\",\n );\n }\n assertCurrentUserPayoutDestinationLimit(payoutSpec.destination_addresses.length);\n for (const address of payoutSpec.destination_addresses) {\n publicKey(address);\n }\n assertCurrentUserPayoutFragmentLimit(payoutSpec.num_fragments);\n if (!CURRENT_SCHEDULED_PAYOUT_WINDOW_SECONDS.has(payoutSpec.window_seconds)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `${CURRENT_SCHEDULED_PAYOUT_WINDOW_MESSAGE}; got ${payoutSpec.window_seconds}`,\n );\n }\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) return false;\n let diff = 0;\n for (let index = 0; index < a.byteLength; index += 1) {\n diff |= a[index]! ^ b[index]!;\n }\n return diff === 0;\n}\n\nfunction spendingPoliciesEqual(a: SpendingPolicySnapshot, b: SpendingPolicySnapshot): boolean {\n return (\n a.asset === b.asset &&\n a.entry_amount_lamports === b.entry_amount_lamports &&\n a.total_committed_lamports === b.total_committed_lamports &&\n a.payout_deadline_ms === b.payout_deadline_ms &&\n a.payout_window_ms === b.payout_window_ms &&\n a.fragment_count === b.fragment_count &&\n a.payout_mode === b.payout_mode &&\n a.matching_mode === b.matching_mode &&\n a.fragmentation_allowed === b.fragmentation_allowed &&\n a.min_fee_bps === b.min_fee_bps &&\n a.fee_bps === b.fee_bps &&\n a.fee_lamports === b.fee_lamports &&\n a.net_payout_lamports === b.net_payout_lamports &&\n payoutSchedulesEqual(a.payout_schedule, b.payout_schedule)\n );\n}\n\nfunction payoutSchedulesEqual(\n a: SpendingPolicySnapshot[\"payout_schedule\"],\n b: SpendingPolicySnapshot[\"payout_schedule\"],\n): boolean {\n if (a.length !== b.length) return false;\n return a.every((entry, index) => entry.destination_address === b[index]?.destination_address);\n}\n\nfunction isRequestTimeoutError(err: unknown): boolean {\n return err instanceof CommandError && err.message.includes(REQUEST_TIMEOUT_MESSAGE);\n}\n\nfunction isRetryableSwapStatusReconciliationError(err: unknown): boolean {\n if (err instanceof TransportError || err instanceof RoutingError) return true;\n if (err instanceof AttestationError) return false;\n return err instanceof CommandError && err.code === \"REJECTED_STALE_JOB\";\n}\n\nfunction coordinatorErrorFromEnvelope(\n protocol: ProtocolModule,\n env: Envelope,\n): CoordinatorProtocolError {\n try {\n const payload = protocol.asErrorPayload(env);\n return coordinatorProtocolError(payload.code, payload.message, payload.failed_req_id);\n } catch (err) {\n return coordinatorProtocolError(\n \"ERR_INTERNAL\",\n err instanceof Error ? err.message : \"coordinator sent an invalid error payload\",\n );\n }\n}\n\nfunction coordinatorProtocolError(\n code: string,\n message: string,\n failedReqId?: number,\n): CoordinatorProtocolError {\n const error = new Error(message) as CoordinatorProtocolError & {\n code: string;\n failedReqId?: number;\n };\n error.name = \"CoordinatorProtocolError\";\n error.code = code;\n if (failedReqId !== undefined) error.failedReqId = failedReqId;\n return error;\n}\n","/**\n * `@invisible-labs/sdk/user` - normal-user (private transfer) commands (spec 4.3).\n *\n * The normal-user API is functional and operates on the caller-owned attested\n * Session. Importing this module must not pull in `/lp`, `/stats`, or `/events`.\n */\n\nimport { PRODUCT_MAX_ENTRY_LAMPORTS, PRODUCT_MIN_ENTRY_LAMPORTS } from \"@invisible/shared\";\nimport { PolicyValidationError } from \"../core/errors.js\";\nexport { InvalidDepositAmountError } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\nimport type { PayoutPolicy } from \"../schemas/types.generated.js\";\nimport {\n CURRENT_USER_PAYOUT_FRAGMENT_LIMIT,\n INSTANT_PAYOUT_WINDOW_MS,\n PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n validatePayoutPolicy,\n} from \"../validation/payoutPolicy.js\";\nimport { assertAttested } from \"../session/guards.js\";\nimport {\n contractRequestOnSession,\n requestRefundOnSession,\n requestUserSync,\n type ContractRequestResult,\n type RefundAcceptanceReceipt,\n type SyncUserResponse,\n} from \"./coordinatorSession.js\";\nimport { assertRecoveryCode } from \"./recoveryCode.js\";\nexport type {\n ContractRequestResult,\n NormalUserActorSyncSnapshot,\n NormalUserRefundability,\n NormalUserSettlementPhase,\n RefundAcceptanceReceipt,\n PayoutExecutedPayload,\n RefundExecutedPayload,\n SourceLiquidityUse,\n SpendingPolicySnapshot,\n SyncUserResponse,\n SyncUserResponsePayload,\n WithdrawExecutedPayload,\n} from \"./coordinatorSession.js\";\nexport {\n INSTANT_PAYOUT_WINDOW_MS,\n PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n SUPPORTED_TOTAL_DEADLINE_MS,\n} from \"../validation/payoutPolicy.js\";\nexport {\n commitmentFromCode,\n generateRecoveryCode,\n RECOVERY_CODE_BYTE_LENGTH,\n recoveryCodeFromHex,\n recoveryCodeFromUserInput,\n recoveryCodeToHex,\n} from \"./recoveryCode.js\";\n\n/** Inclusive minimum private-transfer entry amount in lamports. */\nexport const MIN_ENTRY_AMOUNT_LAMPORTS = PRODUCT_MIN_ENTRY_LAMPORTS;\n\n/** Inclusive maximum private-transfer entry amount in lamports. */\nexport const MAX_ENTRY_AMOUNT_LAMPORTS = PRODUCT_MAX_ENTRY_LAMPORTS;\n\nconst CURRENT_USER_MIN_LAMPORTS_UNSUPPORTED_MESSAGE =\n \"destinations[*].minLamports is not supported in the current normal-user wire contract\";\n\n/** Arguments to start a new private-transfer pool entry. */\nexport interface ContractRequestArgs {\n /**\n * Gross private-transfer amount in lamports.\n *\n * At the contract boundary, this is the exact amount the coordinator expects\n * to observe at the fundable deposit address and hold in the joint wallet.\n * It is the custody-side amount before protocol and network-fee accounting,\n * not the net amount a payout destination receives.\n * The value must be a safe integer between {@link MIN_ENTRY_AMOUNT_LAMPORTS}\n * and {@link MAX_ENTRY_AMOUNT_LAMPORTS}, inclusive.\n */\n readonly amountLamports: number;\n /**\n * Where and how the output is delivered. V0 normal-user requests support\n * exactly one payout destination and validate the policy locally before\n * submission. `batchExclusionId` is rejected in V0; its planned V1 meaning\n * is campaign-scoped batch exclusion, never a stable actor identity.\n * `destinations[*].minDelayMs` and `destinations[*].maxDelayMs` are also\n * rejected in V0 because the current runtime does not honor them.\n * `totalDeadlineMs` selects the payout window: use `0` for instant payout,\n * or one of the coordinator-supported scheduled durations exposed by\n * `SUPPORTED_TOTAL_DEADLINE_MS`.\n */\n readonly payoutPolicy: PayoutPolicy;\n /** Optional caller-owned status secret, copied before it reaches the wire. */\n readonly syncSecret?: Uint8Array;\n /** Called before ContractRequest so the caller can persist the status secret. */\n readonly onSyncSecretReady?: (info: { secretHex: string }) => void | Promise<void>;\n /** Optional precomputed Recovery Code commitment for caller-managed recovery. */\n readonly recoveryCommitment?: Uint8Array;\n /** Called before DelegateShare so the caller can persist the generated code. */\n readonly onRecoveryCodeReady?: (info: { codeHex: string }) => void | Promise<void>;\n}\n\n/**\n * Start a new pool entry through the current normal-user coordinator flow.\n * Resolves after DKG and durable share delegation, before the user's deposit\n * is observed. The returned `depositAddress` is the joint-wallet address.\n * `payoutPolicy.totalDeadlineMs` selects the payout window: omitted or `0`\n * selects instant payout; the supported positive millisecond values select\n * the corresponding scheduled coordinator window.\n *\n * @throws PolicyValidationError if the payout policy is invalid (never hits the wire).\n * @throws AttestationError if the session is not attested.\n * @throws CommandError if the coordinator rejects the request or the local\n * session cannot complete the DKG/delegation boundary.\n */\nexport async function contractRequest(\n session: Session,\n args: ContractRequestArgs,\n): Promise<ContractRequestResult> {\n const payoutPolicy = validatePayoutPolicy(args.payoutPolicy, {\n totalLamports: args.amountLamports,\n });\n assertEntryAmount(args.amountLamports);\n assertCurrentUserContractPolicy(payoutPolicy);\n assertAttested(session);\n const destination = payoutPolicy.destinations[0]!;\n const wirePayoutSpec = wirePayoutSpecFromPolicy(payoutPolicy, destination.address);\n\n return contractRequestOnSession(session, {\n amountLamports: args.amountLamports,\n payoutSpec: wirePayoutSpec,\n ...(args.syncSecret !== undefined && { syncSecret: args.syncSecret }),\n ...(args.recoveryCommitment !== undefined && {\n recoveryCommitment: args.recoveryCommitment,\n }),\n ...(args.onSyncSecretReady !== undefined && {\n onSyncSecretReady: args.onSyncSecretReady,\n }),\n ...(args.onRecoveryCodeReady !== undefined && {\n onRecoveryCodeReady: args.onRecoveryCodeReady,\n }),\n });\n}\n\n/** Read the actor-scoped lifecycle projection for a normal-user contract. */\nexport async function sync(\n session: Session,\n contractId: string,\n syncSecret: Uint8Array,\n timeoutMs?: number,\n): Promise<SyncUserResponse> {\n assertAttested(session);\n return requestUserSync(session, contractId, syncSecret, timeoutMs);\n}\n\nfunction assertEntryAmount(amountLamports: number): void {\n if (\n !Number.isSafeInteger(amountLamports) ||\n amountLamports < MIN_ENTRY_AMOUNT_LAMPORTS ||\n amountLamports > MAX_ENTRY_AMOUNT_LAMPORTS\n ) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `amountLamports must be an integer between ${MIN_ENTRY_AMOUNT_LAMPORTS} and ${MAX_ENTRY_AMOUNT_LAMPORTS} lamports`,\n );\n }\n}\n\nfunction assertCurrentUserContractPolicy(policy: PayoutPolicy): void {\n for (const destination of policy.destinations) {\n if (destination.minLamports !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_MIN_LAMPORTS_UNSUPPORTED_MESSAGE,\n );\n }\n }\n}\n\nfunction wirePayoutSpecFromPolicy(\n policy: PayoutPolicy,\n destinationAddress: string,\n):\n | {\n readonly mode: \"instant\";\n readonly destination_address: string;\n }\n | {\n readonly mode: \"scheduled\";\n readonly num_fragments: typeof CURRENT_USER_PAYOUT_FRAGMENT_LIMIT;\n readonly window_seconds: number;\n readonly destination_addresses: readonly string[];\n } {\n const totalDeadlineMs = policy.totalDeadlineMs;\n if (totalDeadlineMs === undefined || totalDeadlineMs === INSTANT_PAYOUT_WINDOW_MS) {\n return {\n mode: \"instant\",\n destination_address: destinationAddress,\n };\n }\n\n return {\n mode: \"scheduled\",\n num_fragments: CURRENT_USER_PAYOUT_FRAGMENT_LIMIT,\n window_seconds: totalDeadlineMs / PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n destination_addresses: [destinationAddress],\n };\n}\n\n/** Arguments to refund a pool entry with the Recovery Code preimage. */\nexport interface RequestRefundArgs {\n /** The 32-byte Recovery Code preimage. */\n readonly recoveryCode: Uint8Array;\n}\n\n/**\n * Submit a normal-user `withdraw_request` with only the Recovery Code preimage\n * (`{ recovery_code }`). The coordinator queues a durable origin-bound\n * withdrawal intent and terminal outcome is recovered through sync/status\n * reads. No caller-supplied destination is accepted.\n *\n * @returns An acceptance receipt keyed by the resolved V0 `swapId`, including\n * the coordinator-authoritative amount accepted for withdrawal. The\n * coordinator's durable execution result is read later through `sync`.\n * @throws AttestationError if the session is not attested.\n * @throws PolicyValidationError if `recoveryCode` is not exactly 32 bytes.\n * @throws CommandError if the coordinator rejects the withdrawal request.\n */\nexport async function requestRefund(\n session: Session,\n args: RequestRefundArgs,\n): Promise<RefundAcceptanceReceipt> {\n assertAttested(session);\n assertRecoveryCode(args.recoveryCode);\n return requestRefundOnSession(session, {\n recoveryCode: new Uint8Array(args.recoveryCode),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/validation/payoutPolicy.ts","../src/user/recoveryCode.ts","../src/user/coordinatorSession.ts","../src/user/index.ts"],"names":["resolvedSwapId","resolvedContext","closeProtocolRuntime"],"mappings":";;;;;;;;;;;;AAkBO,IAAM,qCAAA,GAAwC;AAG9C,IAAM,wBAAA,GAA2B;AAGxC,IAAM,uCAAuC,MAAA,CAAO,MAAA;AAAA,EAClD,8BAA6B,CAAE,GAAA;AAAA,IAC7B,CAAC,kBAAkB,aAAA,GAAgB;AAAA;AAEvC,CAAA;AAMO,IAAM,2BAAA,GAA8B,OAAO,MAAA,CAAO;AAAA,EACvD,wBAAA;AAAA,EACA,GAAG;AACL,CAAC;AAED,IAAM,+BAAA,GAAkC,IAAI,GAAA,CAAI,2BAA2B,CAAA;AAGtC,IAAA,CAAK,GAAA,CAAI,GAAG,2BAA2B;AAGrE,IAAM,mBAAA,GAAsB,IAAA;AAG5B,IAAM,qCAAA,GAAwC,CAAA;AAE9C,IAAM,6CAAA,GACX,+HAAA;AAGK,IAAM,mDAAA,GACX,sJAAA;AAGK,IAAM,0CAAA,GACX,+EAAA;AAGK,IAAM,0CAAA,GACX,+EAAA;AAGK,IAAM,kCAAA,GAAqC,CAAA;AAE3C,IAAM,0CAAA,GACX,wHAAA;AAeK,SAAS,oBAAA,CAAqB,KAAA,EAAgB,GAAA,GAA2B,EAAC,EAAiB;AAChG,EAAA,IAAI,CAAC,yBAAA,CAA0B,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA,CAAA,6BAAA,EAAgC,eAAA,CAAgB,yBAAA,CAA0B,MAAM,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,EAAE,cAAa,GAAI,MAAA;AAEzB,EAAA,0CAAA,CAA2C,MAAM,CAAA;AACjD,EAAA,uCAAA,CAAwC,aAAa,MAAM,CAAA;AAG3D,EAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,YAAA,EAAc;AACtC,IAAA,SAAA,CAAU,OAAO,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,EAAE,OAAA,EAAQ,IAAK,YAAA,EAAc;AACtC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,qBAAA;AAAA,QACA,iCAAiC,OAAO,CAAA;AAAA,OAC1C;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EAClB;AAGA,EAAA,IAAI,IAAI,aAAA,KAAkB,MAAA,IAAa,KAAK,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,EAAG;AAClE,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,aAAa,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,YAAA,EAAc,CAAC,CAAA;AACxE,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,GAAG,IAAI,mBAAA,EAAqB;AAClD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA,2CAA2C,QAAQ,CAAA;AAAA,KACrD;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,IAAa,GAAA,CAAI,kBAAkB,MAAA,EAAW;AAClE,MAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAO,IAAI,aAAA,GAAgB,CAAA,CAAE,eAAgB,GAAG,CAAA;AACxE,MAAA,IAAI,CAAA,CAAE,cAAc,UAAA,EAAY;AAC9B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,gBAAA;AAAA,UACA,gBAAgB,CAAA,CAAE,WAAW,sCAAsC,UAAU,CAAA,MAAA,EAAS,EAAE,OAAO,CAAA;AAAA,SACjG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,oBAAoB,MAAA,EAAW;AACxC,IAAA,IAAI,CAAC,+BAAA,CAAgC,GAAA,CAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAChE,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,qBAAA;AAAA,QACA,oBAAoB,MAAA,CAAO,eAAe,qBAAqB,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAC,CAAA,wCAAA;AAAA,OACvG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,2CAA2C,MAAA,EAA4B;AAC9E,EAAA,IAAI,MAAA,CAAO,qBAAqB,MAAA,EAAW;AACzC,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,WAAA,IAAe,OAAO,YAAA,EAAc;AAC7C,IAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW;AACxC,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW;AACxC,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wCAAwC,gBAAA,EAAgC;AACtF,EAAA,IAAI,qBAAqB,qCAAA,EAAuC;AAC9D,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA,CAAA,EAAG,6CAA6C,CAAA,MAAA,EAAS,gBAAgB,CAAA;AAAA,KAC3E;AAAA,EACF;AACF;AAEO,SAAS,qCAAqC,aAAA,EAA6B;AAChF,EAAA,IAAI,kBAAkB,kCAAA,EAAoC;AACxD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA,CAAA,EAAG,0CAA0C,CAAA,MAAA,EAAS,aAAa,CAAA;AAAA,KACrE;AAAA,EACF;AACF;;;AClMO,IAAM,yBAAA,GAA4B;AAGlC,SAAS,mBAAmB,IAAA,EAAwB;AACzD,EAAA,IAAI,IAAA,CAAK,eAAe,yBAAA,EAA2B;AACjD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,yBAAA;AAAA,MACA,wBAAwB,yBAAyB,CAAA,MAAA;AAAA,KACnD;AAAA,EACF;AACF;AAEA,eAAsB,oBAAA,GAGnB;AACD,EAAA,MAAM,OAAO,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,yBAAyB,CAAC,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAChD,EAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAC5B;AAEA,eAAsB,mBAAmB,IAAA,EAAuC;AAC9E,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,SAAA,EAAW,IAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AAC7E,EAAA,OAAO,IAAI,WAAW,UAAU,CAAA;AAClC;AAEO,SAAS,kBAAkB,IAAA,EAA0B;AAC1D,EAAA,OAAO,MAAM,IAAA,CAAK,IAAI,CAAA,CACnB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ;AAEO,SAAS,oBAAoB,GAAA,EAAyB;AAC3D,EAAA,MAAM,oBAAoB,yBAAA,GAA4B,CAAA;AACtD,EAAA,IAAI,CAAC,IAAI,MAAA,CAAO,CAAA,aAAA,EAAgB,iBAAiB,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG;AAChE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,iBAAiB,CAAA,iBAAA,EAAoB,yBAAyB,CAAA,OAAA;AAAA,KACjG;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,yBAAyB,CAAA;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,yBAAA,EAA2B,KAAK,CAAA,EAAG;AACrD,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,0BAA0B,KAAA,EAA2B;AACnE,EAAA,OAAO,mBAAA,CAAoB,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AACtD;;;ACmZA,IAAI,eAAA,GAAkD,IAAA;AACtD,IAAI,mBAAA,GAAiF,IAAA;AAErF,SAAS,YAAA,GAAwC;AAC/C,EAAA,eAAA,KAAoB,OAAO,2BAAsB,CAAA;AACjD,EAAA,OAAO,eAAA;AACT;AAIA,SAAS,gBAAA,GAAuE;AAC9E,EAAA,mBAAA,KAAwB,OAAO,4BAA0B,CAAA;AACzD,EAAA,OAAO,mBAAA;AACT;AAEA,SAAS,SAAA,GAA6C;AACpD,EAAA,OAAO,kBAAiB,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,WAAW,CAAA;AACjE;AAEA,IAAM,qBAAA,0BAA+B,qBAAqB,CAAA;AAC1D,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,uBAAA,GAA0B,EAAA;AAChC,IAAM,yBAAA,GAA4B,uBAAA;AAClC,IAAM,iCAAA,GACJ,6DAAA;AACF,IAAM,yCAAA,GAA4C,GAAA;AAClD,IAAM,8BAAA,GAAiC,GAAA;AACvC,IAAM,4BAAA,GAA+B,CAAA;AACrC,IAAM,gCAAA,GAAmC,IAAA;AACzC,IAAM,8BAAA,GAAiC,GAAA;AACvC,IAAM,qCAAA,GAAwC,IAAI,EAAA,GAAK,GAAA;AACvD,IAAM,+BAAA,GAAkC,GAAA;AACxC,IAAM,kCAAA,GAAqC,GAAA;AAC3C,IAAM,0BAAA,GAA6B,aAAA;AACnC,IAAM,uBAAA,GAA0B,+BAAA;AAChC,IAAM,mCAAA,GACJ,sEAAA;AACF,IAAM,uCAAA,GAA0C,IAAI,GAAA,CAAI,4BAAA,EAA8B,CAAA;AACtF,IAAM,0CAA0C,CAAA,qDAAA,EAAwD,4BAAA,EAA6B,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AACjJ,IAAM,uCAAuB,IAAI,GAAA,CAAqB,CAAC,WAAA,EAAa,UAAA,EAAY,QAAQ,CAAC,CAAA;AAQlF,SAAS,sBAAsB,GAAA,EAAuB;AAC3D,EAAA,OACE,OAAO,GAAA,KAAQ,QAAA,IACf,QAAQ,IAAA,IACP,GAAA,CAAgC,qBAAqB,CAAA,KAAM,IAAA;AAEhE;AAEO,SAAS,eAAA,CACd,UACA,QAAA,EAKA;AACA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,oBAAA,CAAqB,QAAQ,CAAA;AACtD,EAAA,OAAO;AAAA,IACL,gBAAgB,OAAA,CAAQ,YAAA;AAAA,IACxB,oBAAoB,OAAA,CAAQ,qBAAA;AAAA,IAC5B,wBAAwB,QAAA,CAAS;AAAA,GACnC;AACF;AAEA,SAAS,uBAAwC,GAAA,EAAW;AAC1D,EAAC,GAAA,CAA2C,qBAAqB,CAAA,GAAI,IAAA;AACrE,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,+BAA+B,GAAA,EAAqB;AAC3D,EAAA,OAAO,GAAA,YAAe,cAAA,IAAkB,GAAA,CAAI,IAAA,KAAS,iBAAA;AACvD;AAEA,IAAM,yBAAN,MAAiE;AAAA,EA4B/D,WAAA,CAAY,OAAA,EAAoC,uBAAA,GAA0B,IAAA,EAAM;AAxBhF,IAAA,IAAA,CAAQ,QAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,mBAAA,GAA2C,IAAA;AACnD,IAAA,IAAA,CAAQ,yBAAA,GAAiD,IAAA;AACzD,IAAA,IAAA,CAAQ,SAAA,GAA6B,KAAA;AACrC,IAAA,IAAA,CAAQ,aAAA,GAA+B,MAAA;AACvC,IAAA,IAAA,CAAQ,MAAA,GAAwB,IAAA;AAChC,IAAA,IAAA,CAAQ,UAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,YAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AACnB,IAAA,IAAA,CAAiB,aAAA,uBAAoB,GAAA,EAA4C;AACjF,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAA+B;AACnE,IAAA,IAAA,CAAQ,cAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAAyB;AAC/D,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAAiB;AACrD,IAAA,IAAA,CAAiB,uBAAA,uBAA8B,GAAA,EAA4B;AAC3E,IAAA,IAAA,CAAiB,uBAAA,uBAA8B,GAAA,EAA4B;AAC3E,IAAA,IAAA,CAAiB,4BAAA,uBAAmC,GAAA,EAAiC;AACrF,IAAA,IAAA,CAAiB,yBAAA,uBAAgC,GAAA,EAA8B;AAC/E,IAAA,IAAA,CAAiB,iBAAA,uBAAwB,GAAA,EAAY;AACrD,IAAA,IAAA,CAAiB,iBAAA,uBAAwB,GAAA,EAAY;AACrD,IAAA,IAAA,CAAiB,yBAAA,uBAAgC,GAAA,EAAwB;AAGvE,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,aAAA,IAAiB,aAAA;AAClD,IAAA,IAAA,CAAK,iCAAA,GAAoC,uBAAA;AAAA,EAC3C;AAAA,EAEA,cAAc,QAAA,EAA2C;AACvD,IAAA,IAAA,CAAK,cAAA,CAAe,IAAI,QAAQ,CAAA;AAChC,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,MAAM,QAAA,EAAmC;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,QAAQ,CAAA;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA;AAAA,EAChD;AAAA,EAEA,iBAAiB,QAAA,EAA8C;AAC7D,IAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,QAAQ,CAAA;AACzC,IAAA,OAAO,MAAM,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC3D;AAAA,EAEA,iBAAiB,QAAA,EAA8C;AAC7D,IAAA,IAAA,CAAK,uBAAA,CAAwB,IAAI,QAAQ,CAAA;AACzC,IAAA,OAAO,MAAM,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC3D;AAAA,EAEA,sBAAsB,QAAA,EAAmD;AACvE,IAAA,IAAA,CAAK,4BAAA,CAA6B,IAAI,QAAQ,CAAA;AAC9C,IAAA,OAAO,MAAM,IAAA,CAAK,4BAAA,CAA6B,MAAA,CAAO,QAAQ,CAAA;AAAA,EAChE;AAAA,EAEA,mBAAmB,QAAA,EAAgD;AACjE,IAAA,IAAA,CAAK,yBAAA,CAA0B,IAAI,QAAQ,CAAA;AAC3C,IAAA,OAAO,MAAM,IAAA,CAAK,yBAAA,CAA0B,MAAA,CAAO,QAAQ,CAAA;AAAA,EAC7D;AAAA,EAEA,IAAI,gBAAA,GAAoC;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,IAAI,oBAAA,GAAsC;AACxC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,aAAA,GAA+B;AACjC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,gBAAA,IAAoB,CAAA;AACzB,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,CAAA,EAAG,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAAA,EACrE;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC7D,IAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAK,IAAA,CAAK,kBAAkB,YAAA,EAAc;AACtE,MAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,iBAAA,CACN,MAAA,EACA,UAAA,EACA,YAAA,EACmB;AACnB,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU;AAAA,QACR,MAAA;AAAA,QACA,SAAA,EAAW,IAAA,CAAK,MAAA,KAAW,MAAA,GAAS,KAAK,SAAA,GAAY,KAAA;AAAA,QACrD,UAAA,EACE,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA;AAAA,QAChF,YAAA,EACE,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,eAAe,IAAI,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA;AAAA,QACpF,sCAAA,EAAwC,KAAA;AAAA,QACxC,wBAAA,EAA0B;AAAA,OAC5B;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,IACvC;AACA,IAAA,IAAI,eAAe,MAAA,EAAW,OAAA,CAAQ,UAAA,GAAa,IAAI,WAAW,UAAU,CAAA;AAC5E,IAAA,IAAI,iBAAiB,MAAA,EAAW,OAAA,CAAQ,YAAA,GAAe,IAAI,WAAW,YAAY,CAAA;AAClF,IAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAC9B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,OAAA,EAAkC;AAC1D,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA,GAAa,IAAI,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,GAAI,IAAA;AAC5E,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA,GAAe,IAAI,UAAA,CAAW,OAAA,CAAQ,YAAY,CAAA,GAAI,IAAA;AAAA,EACpF;AAAA,EAEQ,kBAAA,CAAmB,SAA4B,KAAA,EAA8B;AACnF,IAAA,OAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ;AAClC,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA;AAC1C,IAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAA,EAAsB;AAC7C,IAAA,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,MAAM,CAAA,IAAI;AAC7C,IAAA,IAAA,CAAK,yBAAA,CAA0B,OAAO,MAAM,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC5C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAC,CAAA;AAC1B,MAAA,OAAA,CAAQ,YAAA,EAAc,KAAK,CAAC,CAAA;AAC5B,MAAA,OAAA,CAAQ,wBAAA,GAA2B,IAAA;AACnC,MAAA,OAAA,CAAQ,sCAAA,GAAyC,KAAA;AACjD,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,UAAA,EAAY,KAAK,CAAC,CAAA;AACvB,MAAA,IAAA,CAAK,YAAA,EAAc,KAAK,CAAC,CAAA;AACzB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,KAAA,MAAW,UAAU,IAAA,CAAK,YAAA,CAAa,MAAK,EAAG,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAC3E,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAAA,EAC/B;AAAA,EAEA,MAAM,QAAQ,MAAA,EAA4C;AACxD,IAAA,wCAAA,CAAyC,OAAO,UAAU,CAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAAA,GAA2C,IAAA;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,KAAK,WAAA,EAAY;AACvB,MAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC5C,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,GAAG,CAAA;AAC5C,MAAA,IAAI,CAAC,qBAAA,CAAsB,KAAK,CAAA,EAAG;AACjC,QAAA,cAAA,GAAiB,QAAA;AAAA,MACnB;AACA,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAK,cAAA,KAAmB,IAAA,EAAM;AAC1D,QAAA,IAAA,CAAK,iBAAiB,cAAc,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAC,SAAA,IAAa,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAK,KAAK,iCAAA,EAAmC;AACvF,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAA+D;AACnF,IAAA,wCAAA,CAAyC,OAAO,UAAU,CAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAAA,GAA2C,IAAA;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,KAAK,WAAA,EAAY;AACvB,MAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAC/B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAClD,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA,OAAO,wBAAwB,QAAQ,CAAA;AAAA,IACzC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,GAAG,CAAA;AAC5C,MAAA,cAAA,GAAiB,QAAA;AACjB,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAK,cAAA,KAAmB,IAAA,EAAM;AAC1D,QAAA,IAAA,CAAK,iBAAiB,cAAc,CAAA;AAAA,MACtC;AACA,MAAA,IAAI,CAAC,SAAA,IAAa,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAK,KAAK,iCAAA,EAAmC;AACvF,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAuE;AAC/F,IAAA,IAAI,CAAC,OAAO,cAAA,EAAgB;AAC1B,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,gBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,kBAAA,CAAmB,MAAA,KAAW,uBAAA,EAAyB;AAChE,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,gBAAA;AAAA,QACA,8BAA8B,uBAAuB,CAAA,MAAA;AAAA,OACvD;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAAA,GAA2C,IAAA;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA,IAAA,CAAK,kBAAA,CAAmB;AAAA,QACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,cAAc,MAAA,CAAO;AAAA,OACtB,CAAA;AACD,MAAA,MAAM,KAAK,WAAA,EAAY;AACvB,MAAA,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAA;AACpD,MAAA,OAAA,CAAQ,SAAA,GAAY,MAAA,CAAO,aAAA,GAAgB,kBAAA,GAAqB,cAAA;AAChE,MAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAC9B,MAAA,IAAI,cAAA;AACJ,MAAA,IAAI,kBAAA;AACJ,MAAA,IAAI,sBAAA;AACJ,MAAA,IAAI,gBAAyD,MAAA,CAAO,aAAA,GAChE,IAAI,UAAA,CAAW,MAAA,CAAO,aAAa,CAAA,GACnC,KAAA,CAAA;AACJ,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,MAAM,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,OAAO,oBAAoB,CAAA;AAClE,QAAA,cAAA,GAAiB,GAAA,CAAI,cAAA;AACrB,QAAA,kBAAA,GAAqB,GAAA,CAAI,kBAAA;AACzB,QAAA,sBAAA,GAAyB,GAAA,CAAI,sBAAA;AAC7B,QAAA,aAAA,GAAgB,GAAA,CAAI,UAAU,gBAAA,EAAiB;AAC/C,QAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,kBAAkB,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,qBAAqB,IAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,WAAA,EAAa,QAAQ,MAAM,CAAA;AAC5F,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA;AAAA,UACxB,sBAAA,CAAuB,aAAA;AAAA,UACvB;AAAA,YACE,KAAA,EAAO,aAAA;AAAA,YACP,mBAAA,EAAqB,IAAI,UAAA,CAAW,MAAA,CAAO,kBAAkB,CAAA;AAAA,YAC7D,eAAe,OAAA,CAAQ;AAAA,WACzB;AAAA,UACA,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,SAC3B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,KAAK,kBAAA,CAAmB,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AAC7C,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,gBACJ,IAAA,CAAK,eAAA,EAAgB,CAAE,8BAAA,CAA+B,YAAY,CAAA,CAAE,eAAA;AACtE,MAAA,MAAM,cAAc,IAAA,CAAK,eAAA,EAAgB,CAAE,oBAAA,CAAqB,MAAM,kBAAkB,CAAA;AACxF,MAAA,IAAI,WAAA,CAAY,oBAAoB,aAAA,EAAe;AACjD,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,qBAAA,CAAsB,WAAA,CAAY,eAAA,EAAiB,MAAA,CAAO,cAAc,CAAA,EAAG;AAC9E,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,sCAAA,GAAyC,KAAA;AACjD,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,kBAAkB,CAAA;AACnD,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA,OAAO;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,cAAA;AAAA,QACA,kBAAA;AAAA,QACA,sBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,GAAiB,QAAA;AACjB,MAAA,MAAM,IAAA,CAAK,sBAAsB,GAAG,CAAA;AAAA,IACtC,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,SAAA,EAAW,IAAA,CAAK,wBAAA,CAAyB,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAK,cAAA,KAAmB,IAAA,EAAM;AAC1D,QAAA,IAAA,CAAK,iBAAiB,cAAc,CAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,qBAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,aAAA;AAAA,MACH,IAAI,cAAA,CAAe,iBAAA,EAAmB,wCAAwC,CAAA;AAAA,MAC9E,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,4BAAA,EAA6B;AAClC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,cAAc,IAAI,cAAA,CAAe,iBAAA,EAAmB,4BAA4B,GAAG,IAAI,CAAA;AAAA,EAC9F;AAAA,EAEQ,4BAAA,GAAqC;AAC3C,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,IAAA,CAAK,0BAA0B,MAAA,EAAQ,GAAG,IAAA,EAAK;AACtE,IAAA,IAAA,CAAK,0BAA0B,KAAA,EAAM;AAAA,EACvC;AAAA,EAEA,mBAAmB,MAAA,EAIV;AACP,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,MAAA,KAAW,uBAAA,EAAyB;AACxD,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA,sBAAsB,uBAAuB,CAAA,MAAA;AAAA,SAC/C;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,MAAA,IAAI,MAAA,CAAO,YAAA,CAAa,MAAA,KAAW,yBAAA,EAA2B;AAC5D,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA,wBAAwB,yBAAyB,CAAA,MAAA;AAAA,SACnD;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,UAAA,EAAY,OAAO,YAAY,CAAA;AAAA,EAC9E;AAAA,EAEA,MAAM,kBAAkB,SAAA,EAAsD;AAC5E,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,sBAAsB,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,UAAU,IAAA,CAAK,iBAAA,CAAkB,KAAK,MAAA,EAAQ,IAAA,CAAK,cAAc,MAAS,CAAA;AAChF,IAAA,OAAO,IAAA,CAAK,2BAAA,CAA4B,OAAA,EAAS,SAAS,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAc,2BAAA,CACZ,OAAA,EACA,SAAA,EACkC;AAClC,IAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA;AAAA,MACrB,sBAAA,CAAuB,IAAA;AAAA,MACvB;AAAA,QACE,KAAA,EAAO,MAAA;AAAA,QACP,GAAI,QAAQ,UAAA,GAAa,EAAE,aAAa,OAAA,CAAQ,UAAA,KAAe;AAAC,OAClE;AAAA,MACA;AAAA,QACE,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,SAAA;AAAA,QACA,6BAAA,EAA+B;AAAA;AACjC,KACF;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,EAAgB,CAAE,0BAA0B,GAAG,CAAA;AACnE,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,MAAA,EAAQ,GAAA,CAAI,YAAY,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,6BAAA,CACE,aAAa,yCAAA,EACD;AACZ,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,MAAA,GAC/B,IAAA,CAAK,iBAAA,CAAkB,KAAK,MAAA,EAAQ,IAAA,CAAK,UAAA,IAAc,MAAS,CAAA,GAChE,IAAA;AACJ,IAAA,MAAM,iBAAA,GAAoB,uBAAuB,MAAA,IAAU,0BAAA;AAC3D,IAAA,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,iBAAiB,CAAA,IAAI;AAExD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,KAAW,WAAA,GAAc,IAAA,GAAO,MAAA;AAC7D,IAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,KAAa,WAAA,GAAc,IAAA,GAAO,QAAA;AACjE,IAAA,MAAM,eAAe,wBAAA,CAAyB;AAAA,MAC5C,cAAA,EAAgB,UAAA;AAAA,MAChB,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,8BAAA,EAAgC,UAAU,CAAA;AAAA,MAC/D,UAAA,EAAY,4BAAA;AAAA,MACZ,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,MAChB,eAAA,KAAoB,IAAA,IAAQ,gBAAgB,eAAA,KAAoB,SAAA;AAElE,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAAoB;AACpC,MAAA,IAAI,OAAA,IAAW,CAAC,SAAA,EAAU,EAAG;AAC7B,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,KAAK,SAAA,EAAU;AAAA,MACjB,GAAG,OAAO,CAAA;AAAA,IACZ,CAAA;AAEA,IAAA,MAAM,YAAY,YAAY;AAC5B,MAAA,IAAI,OAAA,IAAW,WAAA,IAAe,CAAC,SAAA,EAAU,EAAG;AAC5C,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,wBACX,MAAM,IAAA,CAAK,4BAA4B,qBAAqB,CAAA,GAC5D,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACjC,QAAA,YAAA,CAAa,KAAA,EAAM;AACnB,QAAA,IACE,MAAA,CAAO,UAAU,WAAA,IACjB,MAAA,CAAO,UAAU,UAAA,IACjB,MAAA,CAAO,UAAU,QAAA,EACjB;AACA,UAAA,kBAAA,EAAmB;AAAA,QACrB,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,UAAU,CAAA;AAAA,QACrB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,IAAI,CAAA,6BAAA,EAAgC,cAAA,CAAe,GAAG,CAAC,IAAI,MAAM,CAAA;AACtE,QAAA,IAAI,CAAC,wCAAA,CAAyC,GAAG,CAAA,EAAG;AAClD,UAAA,kBAAA,EAAmB;AAKnB,UAAA,IAAI,GAAA,YAAe,gBAAA,EAAkB,IAAA,CAAK,KAAA,EAAM;AAChD,UAAA;AAAA,QACF;AACA,QAAA,QAAA,CAAS,YAAA,CAAa,aAAa,CAAA;AAAA,MACrC,CAAA,SAAE;AACA,QAAA,WAAA,GAAc,KAAA;AAAA,MAChB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,uBAAuB,MAAM;AACjC,MAAA,IAAI,CAAC,WAAU,EAAG;AAClB,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,KAAK,SAAA,EAAU;AAAA,IACjB,CAAA;AAEA,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV,CAAA;AAEA,IAAA,MAAM,yBAAyB,MAAM;AACnC,MAAA,IAAI,CAAC,WAAU,EAAG;AAChB,QAAA,kBAAA,EAAmB;AACnB,QAAA;AAAA,MACF;AACA,MAAA,oBAAA,EAAqB;AAAA,IACvB,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,kBAAA,EAAmB;AACnB,MAAA,IAAA,CAAK,cAAc,IAAI,cAAA,CAAe,iBAAA,EAAmB,yBAAyB,GAAG,IAAI,CAAA;AAAA,IAC3F,CAAA;AAEA,IAAA,aAAA,EAAe,gBAAA,CAAiB,SAAS,oBAAoB,CAAA;AAC7D,IAAA,aAAA,EAAe,gBAAA,CAAiB,UAAU,oBAAoB,CAAA;AAC9D,IAAA,aAAA,EAAe,gBAAA,CAAiB,YAAY,oBAAoB,CAAA;AAChE,IAAA,eAAA,EAAiB,gBAAA,CAAiB,oBAAoB,sBAAsB,CAAA;AAC5E,IAAA,eAAA,EAAiB,gBAAA,CAAiB,UAAU,YAAY,CAAA;AACxD,IAAA,eAAA,EAAiB,gBAAA,CAAiB,UAAU,oBAAoB,CAAA;AAChE,IAAA,oBAAA,EAAqB;AAErB,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,aAAA,EAAe,mBAAA,CAAoB,SAAS,oBAAoB,CAAA;AAChE,MAAA,aAAA,EAAe,mBAAA,CAAoB,UAAU,oBAAoB,CAAA;AACjE,MAAA,aAAA,EAAe,mBAAA,CAAoB,YAAY,oBAAoB,CAAA;AACnE,MAAA,eAAA,EAAiB,mBAAA,CAAoB,oBAAoB,sBAAsB,CAAA;AAC/E,MAAA,eAAA,EAAiB,mBAAA,CAAoB,UAAU,YAAY,CAAA;AAC3D,MAAA,eAAA,EAAiB,mBAAA,CAAoB,UAAU,oBAAoB,CAAA;AACnE,MAAA,IAAI,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,iBAAiB,MAAM,kBAAA,EAAoB;AAChF,QAAA,IAAA,CAAK,yBAAA,CAA0B,OAAO,iBAAiB,CAAA;AAAA,MACzD;AAAA,IACF,CAAA;AACA,IAAA,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,iBAAA,EAAmB,kBAAkB,CAAA;AACxE,IAAA,OAAO,kBAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,MAAA,EAKe;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,2BAAA,CAA4B,QAAQ,EAAE,eAAA,EAAiB,MAAM,CAAA;AACvF,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY,OAAO,MAAA,CAAO,MAAA;AAC9C,IAAA,MAAM,IAAI,YAAA,CAAa,oBAAA,EAAsB,yCAAyC,CAAA;AAAA,EACxF;AAAA,EAEA,oBAAoB,MAAA,EAKY;AAC9B,IAAA,OAAO,KAAK,2BAAA,CAA4B,MAAA,EAAQ,EAAE,eAAA,EAAiB,OAAO,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAc,2BAAA,CACZ,MAAA,EAMA,OAAA,EAC6B;AAC7B,IAAA,kBAAA,CAAmB,OAAO,YAAY,CAAA;AACtC,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AACvD,IAAA,MAAM,UAAA,GAAa,OAAO,SAAA,IAAa,GAAA;AACvC,IAAA,IAAI,aAAA,GAA+B,OAAO,MAAA,IAAU,IAAA;AACpD,IAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,IAAA,IAAI;AACF,MAAA,IAAI,MAAA,CAAO,eAAe,KAAA,CAAA,EAAW;AACnC,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,MAAA;AACrC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,4BAA4B,CAAA;AAAA,QACvE;AACA,QAAA,IAAA,CAAK,mBAAmB,EAAE,MAAA,EAAQ,UAAA,EAAY,MAAA,CAAO,YAAY,CAAA;AACjE,QAAA,aAAA,GAAgB,MAAA;AAAA,MAClB,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AACxB,QAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,QAAA,IAAA,CAAK,kBAAA,CAAmB,EAAE,MAAA,EAAQ,CAAA;AAClC,QAAA,aAAA,GAAgB,MAAA;AAAA,MAClB;AAEA,MAAA,eAAA,GAAkB,CAAC,KAAK,gBAAA,EAAiB;AACzC,MAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA;AAAA,UACf,sBAAA,CAAuB,eAAA;AAAA,UACvB;AAAA,YACE,aAAA,EAAe;AAAA,WACjB;AAAA,UACA,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAA,EAAW,UAAA;AAAW,SACjD;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,qBAAA,CAAsB,GAAG,CAAA,EAAG;AAC9B,UAAA,MAAM,IAAI,YAAA;AAAA,YACR,oBAAA;AAAA,YACA,mDAAmD,UAAU,CAAA,EAAA;AAAA,WAC/D;AAAA,QACF;AACA,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,sBAAA,CAAuB,gBAAA,EAAkB;AACxD,QAAA,MAAMA,eAAAA,GAAiB,IAAI,OAAA,IAAW,aAAA;AACtC,QAAA,MAAMC,gBAAAA,GAAkBD,eAAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkBA,eAAc,CAAA,GAAI,IAAA;AAClF,QAAA,IAAIC,gBAAAA,EAAiB,IAAA,CAAK,iBAAA,CAAkBA,gBAAe,CAAA;AAC3D,QAAA,OAAO,EAAE,MAAM,UAAA,EAAY,MAAA,EAAQ,KAAK,eAAA,EAAgB,CAAE,yBAAA,CAA0B,GAAG,CAAA,EAAE;AAAA,MAC3F;AACA,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,sBAAA,CAAuB,gBAAA,EAAkB;AACxD,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA,CAAA,4DAAA,EAA+D,IAAI,IAAI,CAAA;AAAA,SACzE;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,EAAgB,CAAE,0BAA0B,GAAG,CAAA;AACrE,MAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,IAAW,aAAA;AACtC,MAAA,MAAM,eAAA,GAAkB,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,cAAc,CAAA,GAAI,IAAA;AAClF,MAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,QAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS;AAAA,MACtC;AACA,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,MAAM,IAAI,YAAA,CAAa,oBAAA,EAAsB,mCAAmC,CAAA;AAAA,MAClF;AACA,MAAA,IAAI,CAAC,gBAAgB,UAAA,EAAY;AAC/B,QAAA,MAAM,IAAI,YAAA,CAAa,oBAAA,EAAsB,mCAAmC,CAAA;AAAA,MAClF;AACA,MAAA,IAAA,CAAK,kBAAkB,eAAe,CAAA;AACtC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,MAAM,IAAA,CAAK,gCAAA,CAAiC,eAAe;AAAA,OACrE;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAC,CAAA;AACnB,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IACE,eAAA,IACA,IAAA,CAAK,iCAAA,IACL,IAAA,CAAK,qBAAqB,CAAA,EAC1B;AACA,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iCACZ,OAAA,EACgC;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,qCAAA;AAC9B,IAAA,WAAS;AACP,MAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA;AAAA,QAC1B,kCAAA;AAAA,QACA,KAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,IAAA,CAAK,KAAK;AAAA,OACnC;AACA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,2BAAA,CAA4B,SAAS,cAAc,CAAA;AAC7E,QAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,UAAA,OAAO,MAAA,CAAO,kBAAA;AAAA,QAChB;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,qBAAA,CAAsB,GAAG,CAAA,EAAG;AAC/B,UAAA,MAAM,GAAA;AAAA,QACR;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,IAAK,QAAA,EAAU;AAC1B,QAAA,MAAM,IAAI,YAAA,CAAa,oBAAA,EAAsB,mCAAmC,CAAA;AAAA,MAClF;AACA,MAAA,MAAM,MAAM,+BAA+B,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,MAAA,EAA4C;AACpE,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,EAAgB;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,uBAAA;AAClC,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,yBAAA,CAA0B,UAAU,CAAA;AACpE,IAAA,IAAI,cAAA,CAAe,eAAA,KAAoB,MAAA,CAAO,cAAA,EAAgB;AAC5D,MAAA,MAAM,IAAI,yBAAA;AAAA,QACR,MAAA,CAAO,eAAe,eAAe,CAAA;AAAA,QACrC,MAAA,CAAO,OAAO,cAAc;AAAA,OAC9B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,CAAA,qBAAA,EAAwB,cAAA,CAAe,YAAY,CAAA,QAAA,EAAW,eAAe,eAAe,CAAA,CAAA;AAAA,MAC5F;AAAA,KACF;AAEA,IAAA,MAAM,OAAO,kBAAA,GAAqB,EAAE,aAAA,EAAe,cAAA,CAAe,gBAAgB,CAAA;AAClF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1F;AACA,IAAA,MAAM,IAAA,CAAK,4BAA4B,OAAO,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,gBAAgB,QAAA,CAAS,cAAA;AAAA,MACzB,oBAAoB,cAAA,CAAe,YAAA;AAAA,MACnC,qBAAqB,cAAA,CAAe,cAAA;AAAA,MACpC,eAAe,QAAA,CAAS,aAAA;AAAA,MACxB,YAAA,EAAc,IAAI,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA;AAAA,MAClD,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,gBAAgB,QAAA,CAAS,cAAA;AAAA,MACzB,wBAAwB,QAAA,CAAS;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,MAAA,EAA0D;AACtF,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,EAAgB;AACtC,IAAA,MAAM,uBAAA,GACJ,MAAA,CAAO,cAAA,IAAkB,sBAAA,CAAuB,OAAO,UAAU,CAAA;AACnE,IAAA,MAAM,mBACJ,uBAAA,KAA4B,MAAA,GAAY,IAAA,CAAK,GAAA,KAAQ,uBAAA,GAA0B,MAAA;AACjF,IAAA,IAAI,mBAAA,GAAyC,IAAA;AAC7C,IAAA,IAAI,qBAAA,GAA2C,IAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,GACtB,IAAI,WAAW,MAAA,CAAO,UAAU,KAC/B,MAAM;AACL,MAAA,mBAAA,GAAsB,cAAA,EAAe;AACrC,MAAA,OAAO,mBAAA;AAAA,IACT,CAAA,GAAG;AACP,IAAA,IAAI,UAAA,CAAW,WAAW,uBAAA,EAAyB;AACjD,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,gBAAA;AAAA,QACA,sBAAsB,uBAAuB,CAAA,MAAA;AAAA,OAC/C;AAAA,IACF;AACA,IAAA,MAAM,aAAA,GAAgB,WAAW,UAAU,CAAA;AAC3C,IAAA,MAAM,cAAA,GAAiB,MAAM,gBAAA,CAAiB,UAAU,CAAA;AACxD,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,MAAM,MAAA,CAAO,iBAAA,GAAoB,EAAE,SAAA,EAAW,eAAe,CAAA;AAAA,IAC/D;AACA,IAAA,MAAM,YAAA,GAAe,OAAO,YAAA,GACxB,IAAI,WAAW,MAAA,CAAO,YAAY,KACjC,MAAM;AACL,MAAA,qBAAA,GAAwB,cAAA,EAAe;AACvC,MAAA,OAAO,qBAAA;AAAA,IACT,CAAA,GAAG;AACP,IAAA,IAAI,YAAA,CAAa,WAAW,yBAAA,EAA2B;AACrD,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,gBAAA;AAAA,QACA,wBAAwB,yBAAyB,CAAA,MAAA;AAAA,OACnD;AAAA,IACF;AACA,IAAA,MAAM,eAAA,GAAkB,WAAW,YAAY,CAAA;AAC/C,IAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,YAAY,CAAA;AAC5D,IAAA,IAAI,qBAAA,EAAuB;AACzB,MAAA,MAAM,MAAA,CAAO,mBAAA,GAAsB,EAAE,SAAA,EAAW,iBAAiB,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA;AAAA,MAC1B,sBAAA,CAAuB,eAAA;AAAA,MACvB;AAAA,QACE,KAAA,EAAO,MAAA;AAAA,QACP,iBAAiB,MAAA,CAAO,cAAA;AAAA,QACxB,aAAa,MAAA,CAAO,UAAA;AAAA,QACpB,eAAA,EAAiB,cAAA;AAAA,QACjB,iBAAA,EAAmB,gBAAA;AAAA,QACnB,GAAA,CAAK,MAAA,CAAO,gBAAA,KAAqB,MAAA,IAAa,qBAAqB,MAAA,KAAc;AAAA,UAC/E,kBAAA,EAAoB,OAAO,gBAAA,IAAoB;AAAA;AACjD,OACF;AAAA,MACA,EAAE,MAAA,EAAQ,IAAA,EAAM,4BAAA,EAA8B,IAAA;AAAK,KACrD;AACA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,4BAAA,CAA6B,QAAQ,CAAA;AAClE,IAAA,MAAM,SAAS,WAAA,CAAY,OAAA;AAC3B,IAAA,MAAM,OAAA,GAA6B;AAAA,MACjC,MAAA;AAAA,MACA,SAAA,EAAW,cAAA;AAAA,MACX,UAAA,EAAY,IAAI,UAAA,CAAW,UAAU,CAAA;AAAA,MACrC,YAAA,EAAc,IAAI,UAAA,CAAW,YAAY,CAAA;AAAA,MACzC,sCAAA,EAAwC,IAAA;AAAA,MACxC,wBAAA,EAA0B;AAAA,KAC5B;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AACrC,IAAA,IAAA,CAAK,kBAAkB,OAAO,CAAA;AAC9B,IAAA,MAAM,OAAO,eAAA,GAAkB;AAAA,MAC7B,MAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,GAAmB,YAAY,eAAe,CAAA;AACrD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA;AAE7C,IAAA,IAAI,oBAAA,GAAuB,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,0BAA0B,IAAA,CAAK,SAAA;AAAA,QACnC,sBAAA,CAAuB,gBAAA;AAAA,QACvB,OAAA,CAAQ,MAAA;AAAA,QACR;AAAA,OACF;AACA,MAAA,KAAK,uBAAA,CAAwB,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AAClD,MAAA,MAAM,EAAE,cAAA,EAAgB,SAAA,EAAW,kBAAA,EAAoB,wBAAuB,GAC5E,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,aAAA,GAAgB,KAAA,CAAA,GAAY,OAAO,oBAAoB,CAAA;AAC3F,MAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,kBAAkB,CAAA;AAEnD,MAAA,IAAI,qBAAqB,MAAA,CAAO,kBAAA;AAChC,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,QAAA,MAAM,SAAA,GAAY,MAAM,oBAAA,EAAqB;AAC7C,QAAA,kBAAA,GAAqB,SAAA,CAAU,UAAA;AAC/B,QAAA,IAAI;AACF,UAAA,eAAA,GAAkB,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAClD,UAAA,MAAM,MAAA,CAAO,mBAAA,GAAsB,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAAA,QACjE,CAAA,SAAE;AACA,UAAA,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,MAAM,qBAAqB,IAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,WAAA,EAAa,QAAQ,MAAM,CAAA;AAC5F,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,aAAA,IAAiB,SAAA,CAAU,gBAAA,EAAiB;AACjE,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA;AAAA,UACxB,sBAAA,CAAuB,aAAA;AAAA,UACvB;AAAA,YACE,KAAA;AAAA,YACA,mBAAA,EAAqB,kBAAA;AAAA,YACrB,eAAe,OAAA,CAAQ;AAAA,WACzB;AAAA,UACA,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,SAC3B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,KAAK,kBAAA,CAAmB,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AAC7C,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,8BAAA,CAA+B,YAAY,CAAA;AAC5E,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,oBAAA,CAAqB,MAAM,kBAAkB,CAAA;AAE1E,MAAA,IAAI,WAAA,CAAY,eAAA,KAAoB,eAAA,CAAgB,eAAA,EAAiB;AACnE,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,qBAAA,CAAsB,WAAA,CAAY,eAAA,EAAiB,WAAA,CAAY,eAAe,CAAA,EAAG;AACpF,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,gBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAA,EAAgB,WAAA,CAAY,eAAe,IAAI,IAAI,CAAA;AAC5D,MAAA,IAAA,CAAK,4BAA4B,OAAO,CAAA;AAExC,MAAA,MAAM,OAAO,qBAAA,GAAwB;AAAA,QACnC,MAAA;AAAA,QACA,cAAA;AAAA,QACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB,kBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,oBAAA,GAAuB,IAAA;AACvB,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,MAAA;AAAA,QACX,MAAA;AAAA,QACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB,cAAA;AAAA,QACA,kBAAA;AAAA,QACA,sBAAA;AAAA,QACA,eAAe,WAAA,CAAY,eAAA;AAAA,QAC3B,UAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAgB,WAAA,CAAY,eAAA;AAAA,QAC5B,wBAAwB,WAAA,CAAY,eAAA;AAAA,QACpC;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,QAAA,IAAA,CAAK,wBAAA,CAAyB,QAAQ,MAAM,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,MAAA,CACZ,OAAA,EACA,oBAAA,EAMC;AACD,IAAA,MAAM,eAAA,EAAgB;AACtB,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,EAAgB;AACtC,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,SAAA,EAAU;AACtC,IAAA,MAAM,IAAA,CAAK,OAAA;AAAA,MACT,sBAAA,CAAuB,OAAA;AAAA,MACvB,EAAE,aAAA,EAAe,OAAA,CAAQ,YAAA,EAAa;AAAA,MACtC,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,KAC3B;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,mBAAmB,MAAM,CAAA;AAElC,IAAA,MAAM,gBAAA,GAAmB,UAAU,QAAQ,CAAA;AAC3C,IAAA,MAAM,gBAAA,GAAmB,iBAAiB,kBAAA,EAAmB;AAC7D,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA;AAAA,MAC5B,sBAAA,CAAuB,SAAA;AAAA,MACvB;AAAA,QACE,OAAA,EAAS,gBAAA;AAAA,QACT,eAAe,OAAA,CAAQ;AAAA,OACzB;AAAA,MACA,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,KAC3B;AACA,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,0BAAA,CAA2B,UAAU,CAAA;AACpE,IAAA,IAAA,CAAK,IAAI,CAAA,gCAAA,EAAmC,aAAA,CAAc,OAAA,CAAQ,UAAU,KAAK,IAAI,CAAA;AAErF,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,UAAA,CAAW,cAAA,EAAgB,cAAc,OAAO,CAAA;AAC1F,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,qBAAA,CAAsB,cAAc,CAAA;AAC9E,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI;AACF,MAAA,cAAA,GAAiB,gBAAA,CAAiB,UAAA;AAAA,QAChC,cAAA;AAAA,QACA,aAAA,CAAc,OAAA;AAAA,QACd,aAAA,CAAc;AAAA,OAChB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,8BAA8B,cAAA,CAAe,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9F;AAEA,IAAA,MAAM,oBAAA,GAAuB;AAAA,MAC3B,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,aAAA,EAAe,IAAI,UAAA,CAAW,cAAA,CAAe,kBAAkB;AAAA,KAChE,CAAA;AAED,IAAA,MAAM,qBAAqB,IAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,WAAA,EAAa,QAAQ,MAAM,CAAA;AAC5F,IAAA,KAAK,kBAAA,CAAmB,KAAA,CAAM,MAAM,MAAS,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,OAAA;AAAA,MACT,sBAAA,CAAuB,SAAA;AAAA,MACvB;AAAA,QACE,OAAA,EAAS,gBAAA;AAAA,QACT,eAAe,OAAA,CAAQ;AAAA,OACzB;AAAA,MACA,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA;AAAO,KAC3B;AACA,IAAA,MAAM,mBAAmB,MAAM,kBAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,QAAA,EAAU,gBAAgB,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,eAAe,mBAAA,EAAoB;AACvD,IAAA,IAAI,CAAC,UAAA,CAAW,WAAA,EAAa,QAAA,CAAS,cAAc,CAAA,EAAG;AACrD,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,gBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CACvD,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,4BAAA,EAA+B,eAAe,CAAA,CAAA,EAAI,MAAM,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,WAAA;AAAA,MAChB,SAAA,EAAW,cAAA;AAAA,MACX,oBAAoB,QAAA,CAAS,kBAAA;AAAA,MAC7B,wBAAwB,QAAA,CAAS;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,IAAA,CAAK,kBAAiB,EAAG;AAC7B,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAChC,MAAA,MAAM,IAAA,CAAK,cAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AACrC,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,OAAA,EAAS,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,IAAI,IAAA,CAAK,kBAAiB,EAAG;AAC7B,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,MAAA,IAAA,CAAK,aAAA;AAAA,QACH,IAAI,cAAA,CAAe,iBAAA,EAAmB,0CAA0C,CAAA;AAAA,QAChF;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,MAAM,YAAA,EAAa;AACnC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,EAAE,WAAA,EAAa,IAAA,CAAK,aAAa,CAAA;AAC9E,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,mBAAA,GAAsB,WAAW,OAAA,EAAS,CAAC,aAAa,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAC,CAAA;AAC1F,IAAA,IAAA,CAAK,4BAA4B,eAAA,CAAgB,OAAO,EAAE,SAAA,CAAU,aAAA,CAAc,CAAC,KAAA,KAAU;AAC3F,MAAA,IAAI,IAAA,CAAK,YAAY,OAAA,EAAS;AAC9B,MAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,QAAA,EAAU;AAC7C,QAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,OAAO,CAAA,CAAE,cAAA;AAC5C,QAAA,IAAA,CAAK,aAAA;AAAA,UACH,UAAA,IAAc,IAAI,cAAA,CAAe,iBAAA,EAAmB,8BAA8B,CAAA;AAAA,UAClF;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,CAAC,CAAA,EAAG,KAAA,IAAS,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA;AACxF,IAAA,IAAA,CAAK,GAAA,CAAI,wBAAwB,MAAM,CAAA;AAAA,EACzC;AAAA,EAEQ,gBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,OAAA,KAAY,IAAA,EAAM,OAAO,KAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAC1C,IAAA,OAAO,KAAA,CAAM,YAAY,KAAA,CAAM,OAAA,KAAY,QAAQ,KAAA,CAAM,SAAA,CAAU,OAAM,KAAM,MAAA;AAAA,EACjF;AAAA,EAEQ,aAAA,CAAc,KAAA,EAAc,cAAA,EAAyBC,qBAAAA,GAAuB,IAAA,EAAY;AAC9F,IAAA,MAAM,cAAA,GACJ,IAAA,CAAK,QAAA,IAAY,CAAC,cAAA,IAAkB,+BAA+B,KAAK,CAAA,GACpE,sBAAA,CAAuB,KAAK,CAAA,GAC5B,KAAA;AACN,IAAA,IAAA,CAAK,mBAAA,IAAsB;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,yBAAA,IAA4B;AACjC,IAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AAEjC,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAEhB,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,IAAIA,qBAAAA,uBAAkD,OAAO,CAAA;AAC7D,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,eAAA,CAAgB,OAAO,EAAE,KAAA,EAAM;AAAA,MACjC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,uBAAuB,cAAc,CAAA;AAAA,EAC5C;AAAA,EAEQ,eAAe,GAAA,EAAqB;AAC1C,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,EAAgB;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAM,GAAA,CAAI,IAAI,SAAS,GAAA,CAAI,IAAI,IAAI,IAAI,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,GAAW,IAAA,CAAK,aAAa,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA,GAAQ,IAAA;AAC7E,IAAA,IAAI,IAAI,OAAA,KAAY,IAAA,IAAQ,GAAA,CAAI,IAAA,KAAS,aAAa,KAAA,EAAO;AAC3D,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,gCAAgC,MAAM,CAAA;AAClE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,IAAA,EAAM;AAC5C,MAAA,IAAA,CAAK,GAAA,CAAI,WAAW,GAAA,CAAI,IAAI,qBAAqB,GAAA,CAAI,OAAO,IAAI,MAAM,CAAA;AACtE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,cAAA,GACJ,GAAA,CAAI,IAAA,KAAS,YAAA,CAAa,IAAA,IAAQ,GAAA,CAAI,IAAA,KAAS,sBAAA,CAAuB,cAAA,GAClE,QAAA,CAAS,uBAAA,CAAwB,GAAG,CAAA,GACpC,IAAA;AACN,IAAA,MAAM,wBAAA,GAA2B,cAAA,KAAmB,IAAA,IAAQ,OAAA,KAAY,IAAA;AACxE,IAAA,MAAM,cAAA,GACJ,GAAA,CAAI,IAAA,KAAS,YAAA,CAAa,IAAA,IAAQ,GAAA,CAAI,IAAA,KAAS,sBAAA,CAAuB,gBAAA,GAClE,QAAA,CAAS,yBAAA,CAA0B,GAAG,CAAA,GACtC,IAAA;AAEN,IAAA,IAAI,IAAA,CAAK,4BAAA,CAA6B,GAAG,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,uBAAuB,GAAG,CAAA;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,SAAA;AACpD,IAAA,MAAM,OACJ,cAAA,KAAmB,IAAA,IAAQ,CAAC,wBAAA,GACxB,OACA,QAAA,CAAS,SAAA;AAAA,MACP,gBAAA;AAAA,MACA,GAAA,CAAI,IAAA;AAAA,MACJ,GAAA,CAAI,IAAA;AAAA,MACJ,cAAA,GAAiB,EAAE,WAAA,EAAa,cAAA,CAAe,OAAM,GAAI;AAAA,KAC3D;AAEN,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,CAAa,IAAA,IAAQ,SAAS,IAAA,EAAM;AACnD,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,CAAA,QAAA,EAAW,GAAA,CAAI,IAAI,CAAA,UAAA,EAAa,GAAA,CAAI,OAAA,IAAW,MAAM,CAAA,yBAAA,EACnD,OAAA,EAAS,MAAA,IAAU,MACrB,CAAA,UAAA,EAAa,gBAAgB,CAAA,CAAA;AAAA,QAC7B;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,IAAI,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,CAAa,KAAA,EAAO;AACnC,MAAA,MAAM,gBAAA,GAAmB,4BAAA,CAA6B,QAAA,EAAU,GAAG,CAAA;AACnE,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,QAAA,KAAA,MAAW,QAAA,IAAY,KAAK,yBAAA,EAA2B;AACrD,UAAA,QAAA,CAAS,gBAAgB,CAAA;AAAA,QAC3B;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,CAAa,IAAA,EAAM;AAClC,MAAA,IAAI,cAAA,IAAkB,4BAA4B,OAAA,EAAS;AACzD,QAAA,IAAA,CAAK,kBAAA,CAAmB,cAAA,EAAgB,OAAA,CAAQ,MAAM,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,QAAA,IAAA,CAAK,kBAAA,CAAmB,cAAA,EAAgB,OAAA,CAAQ,MAAM,CAAA;AAAA,MACxD;AACA,MAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,eAAA,CACN,OAAA,EACA,MAAA,EACA,sBAAA,EACM;AACN,IAAA,MAAM,iBAAA,GACJ,qBAAqB,GAAA,CAAI,OAAA,CAAQ,SAAS,CAAA,IAAK,MAAA,CAAO,UAAU,OAAA,CAAQ,SAAA;AAC1E,IAAA,IAAI,CAAC,iBAAA,IAAqB,OAAA,CAAQ,SAAA,KAAc,OAAO,KAAA,EAAO;AAC5D,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,IAC/C;AACA,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,kBAAA,EAAoB;AAChD,MAAA,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,MAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,kBAAA,EAAoB,OAAA,CAAQ,MAAM,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,4BAAA,EAA8B;AACxD,QAAA,QAAA,CAAS,MAAA,CAAO,YAAY,sBAAsB,CAAA;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAA,CAAmB,SAAgC,MAAA,EAA6B;AACtF,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,KAAK,CAAA,CAAA,EAAI,QAAQ,YAAY,CAAA,CAAA;AAC9D,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,iBAAA,EAAmB,GAAG,CAAA,EAAG;AAEzD,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,CAAA,mBAAA,EAAsB,QAAQ,YAAY,CAAA,QAAA,EAAW,QAAQ,eAAe,CAAA,OAAA,EAAU,QAAQ,KAAK,CAAA,CAAA;AAAA,MACnG;AAAA,KACF;AACA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,uBAAA,EAAyB;AACnD,MAAA,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,kBAAA,CAAmB,SAAgC,MAAA,EAA6B;AACtF,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,YAAY,CAAA,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,iBAAA,EAAmB,GAAG,CAAA,EAAG;AAEzD,IAAA,IAAA,CAAK,GAAA,CAAI,sBAAsB,OAAA,CAAQ,YAAY,WAAW,OAAA,CAAQ,eAAe,IAAI,IAAI,CAAA;AAC7F,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,uBAAA,EAAyB;AACnD,MAAA,QAAA,CAAS,SAAS,MAAM,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,gBAAA,CAAiB,MAAmB,GAAA,EAAsB;AAChE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,KAAA;AAC1B,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,IAAI,IAAA,CAAK,OAAO,gCAAA,EAAkC;AAChD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACpC,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,CACN,IAAA,EACA,OAAA,EACA,OAAA,GAKI,EAAC,EACc;AACnB,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,cAAA,CAAe,iBAAA,EAAmB,sCAAsC,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS;AAAA,MAClD,QAAQ,OAAA,CAAQ,MAAA,KAAW,MAAA,GAAY,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA,MAC7D,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,+BAA+B,OAAA,CAAQ,6BAAA;AAAA,MACvC,8BAA8B,OAAA,CAAQ,4BAAA;AAAA,MACtC,OAAO,CAAC,OAAA,EAAS,cAAc,IAAA,CAAK,GAAA,CAAI,SAAS,SAAS;AAAA,KAC3D,CAAA;AAAA,EACH;AAAA,EAEQ,SAAA,CACN,IAAA,EACA,MAAA,EACA,SAAA,GAA2B,GAAA,EACR;AACnB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAA,GACJ,SAAA,KAAc,IAAA,GACV,IAAA,GACA,WAAW,MAAM;AACf,QAAA,IAAA,CAAK,kBAAA,CAAmB,MAAM,QAAQ,CAAA;AACtC,QAAA,MAAA,CAAO,IAAI,YAAA,CAAa,oBAAA,EAAsB,CAAA,sBAAA,EAAyB,IAAI,OAAO,CAAC,CAAA;AAAA,MACrF,GAAG,SAAS,CAAA;AAClB,MAAA,MAAM,QAAA,GAAyB,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAQ,KAAA,EAAM;AAChE,MAAA,MAAM,YAAY,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,KAAK,EAAC;AACnD,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AACvB,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,uBAAuB,GAAA,EAAkB;AAC/C,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,EAAG;AACnD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI,QAAA,CAAS,KAAA,EAAO,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC/C,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO,EAAG;AAChD,MAAA,OAAA,CAAQ,sCAAA,GAAyC,KAAA;AACjD,MAAA,OAAA,CAAQ,wBAAA,GAA2B,IAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,6BAA6B,GAAA,EAAwB;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,GAAU,IAAA,CAAK,aAAa,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AACnE,IAAA,OACE,GAAA,CAAI,SAAS,YAAA,CAAa,IAAA,IAC1B,IAAI,IAAA,KAAS,sBAAA,CAAuB,gBAAA,IACpC,OAAA,EAAS,sCAAA,KAA2C,IAAA;AAAA,EAExD;AAAA,EAEQ,uBAAuB,GAAA,EAAqB;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,GAAU,IAAA,CAAK,aAAa,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AACnE,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,CAAC,QAAQ,wBAAA,EAA0B;AACrC,MAAA,OAAA,CAAQ,wBAAA,GAA2B,GAAA;AACnC,MAAA,IAAA,CAAK,sBAAA,CAAuB,sBAAA,CAAuB,gBAAA,EAAkB,OAAA,CAAQ,MAAM,CAAA;AACnF,MAAA,IAAA,CAAK,GAAA,CAAI,2DAA2D,MAAM,CAAA;AAC1E,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,oEAAoE,MAAM,CAAA;AAAA,EACrF;AAAA,EAEQ,4BAA4B,OAAA,EAAkC;AACpE,IAAA,MAAM,QAAA,GAAW,KAAK,eAAA,EAAgB;AACtC,IAAA,OAAA,CAAQ,sCAAA,GAAyC,KAAA;AACjD,IAAA,MAAM,WAAW,OAAA,CAAQ,wBAAA;AACzB,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,OAAA,CAAQ,wBAAA,GAA2B,IAAA;AACnC,IAAA,MAAM,IAAA,GAAO,SAAS,SAAA,CAAU,OAAA,CAAQ,WAAW,QAAA,CAAS,IAAA,EAAM,SAAS,IAAI,CAAA;AAC/E,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,2CAAA,EAA8C,OAAA,CAAQ,SAAS,IAAI,MAAM,CAAA;AAClF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAA,CAAmB,SAAS,IAAI,CAAA;AACrC,IAAA,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,EACnC;AAAA,EAEQ,oBAAoB,GAAA,EAAqB;AAC/C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,QAAQ,SAAA,CAAU,SAAA;AAAA,MACtB,CAAC,SAAA,KAAc,SAAA,CAAU,WAAW,MAAA,IAAa,SAAA,CAAU,WAAW,GAAA,CAAI;AAAA,KAC5E;AACA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACf,IAAA,MAAM,WAAW,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,EAAE,CAAC,CAAA;AAC7C,IAAA,IAAI,UAAU,MAAA,KAAW,CAAA,OAAQ,aAAA,CAAc,MAAA,CAAO,IAAI,IAAI,CAAA;AAC9D,IAAA,IAAI,QAAA,CAAS,KAAA,EAAO,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC/C,IAAA,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,EACtB;AAAA,EAEQ,sBAAA,CAAuB,MAA8B,MAAA,EAA8B;AACzF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CACnB,GAAA,CAAI,IAAI,CAAA,EACP,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,MAAA,KAAW,MAAA,IAAa,SAAA,CAAU,WAAW,MAAM,CAAA;AACrF,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACtB,IAAA,YAAA,CAAa,SAAS,KAAK,CAAA;AAC3B,IAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAAA,EACnB;AAAA,EAEQ,kBAAA,CAAmB,MAA8B,QAAA,EAA8B;AACrF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAC7C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,IAAI,KAAA,IAAS,CAAA,EAAG,SAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAA;AACzC,IAAA,IAAI,UAAU,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,aAAA,CAAc,OAAO,IAAI,CAAA;AAAA,EAC5D;AAAA,EAEQ,yBAAyB,MAAA,EAAsB;AACrD,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,KAAK,IAAA,CAAK,aAAA,CAAc,SAAQ,EAAG;AAC5D,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,MAAA,CAAO,CAAC,QAAA,KAAa;AAC/C,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,MAAA,EAAQ,OAAO,IAAA;AACvC,QAAA,IAAI,QAAA,CAAS,KAAA,EAAO,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAC/C,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,aAAA,CAAc,OAAO,IAAI,CAAA;AAAA,MAChC,CAAA,MAAA,IAAW,SAAA,CAAU,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAChD,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAA,EAA6B;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACvB;AAAA,EAEQ,gBACN,MAAA,GAAwB,IAAA,CAAK,MAAA,EAC7B,SAAA,GAA6B,KAAK,SAAA,EAC5B;AACN,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,cAAA,EAAgB;AAC1C,MAAA,QAAA,CAAS,SAAA,EAAW,IAAA,CAAK,aAAA,EAAe,MAAM,CAAA;AAAA,IAChD;AAAA,EACF;AAAA,EAEQ,GAAA,CAAI,KAAa,SAAA,EAAwC;AAC/D,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,YAAA,EAAc;AACxC,MAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,sBAAsB,GAAA,EAAqB;AACjD,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,IAAI,KAAK,QAAA,IAAY,8BAAA,CAA+B,GAAG,CAAA,EAAG,OAAO,uBAAuB,GAAG,CAAA;AAC3F,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EAC9B;AAAA,EAEQ,eAAA,GAAkC;AACxC,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,MAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,oCAAoC,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AACF,CAAA;AAEA,SAAS,wBAAwB,QAAA,EAAmD;AAClF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA;AAAA,IACV,WAAW,QAAA,CAAS,SAAA;AAAA,IACpB,KAAA,EAAO,kBAAA;AAAA,IACP,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,cAAA,EAAgB,+BAAA,CAAgC,QAAA,CAAS,cAAc,CAAA;AAAA,IACvE,cAAA,EAAgB,IAAI,UAAA,CAAW,QAAA,CAAS,cAAc,CAAA;AAAA,IACtD,gBAAgB,QAAA,CAAS,cAAA;AAAA,IACzB,oBAAoB,QAAA,CAAS,kBAAA;AAAA,IAC7B,wBAAwB,QAAA,CAAS,sBAAA;AAAA,IACjC,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,UAAA,EAAY,IAAI,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA;AAAA,IAC9C,eAAe,QAAA,CAAS,aAAA;AAAA,IACxB,YAAA,EAAc,IAAI,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA;AAAA,IAClD,iBAAiB,QAAA,CAAS,eAAA;AAAA,IAC1B,iBAAiB,QAAA,CAAS,eAAA;AAAA,IAC1B,gBAAgB,QAAA,CAAS,cAAA;AAAA,IACzB,wBAAwB,QAAA,CAAS;AAAA,GACnC;AACF;AAGA,eAAsB,wBAAA,CACpB,SACA,MAAA,EACgC;AAChC,EAAA,IAAI,MAAA,GAAwC,IAAA;AAC5C,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,sBAAA;AAAA,MACX;AAAA,QACE,WAAA,EAAa,eAAA,CAAgB,OAAO,CAAA,CAAE,IAAA;AAAA,QACtC,eAAe,YAAY;AAAA,OAC7B;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,MAAM,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA;AAAA,EAC5C,CAAA,SAAE;AACA,IAAA,MAAA,EAAQ,qBAAA,EAAsB;AAAA,EAChC;AACF;AAGA,eAAsB,4BAAA,CACpB,SACA,MAAA,EACoC;AACpC,EAAA,MAAM,SAAS,IAAI,sBAAA;AAAA,IACjB;AAAA,MACE,WAAA,EAAa,eAAA,CAAgB,OAAO,CAAA,CAAE,IAAA;AAAA,MACtC,eAAe,YAAY;AAAA,KAC7B;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,MAAM,CAAA;AAAA,EAChD,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,qBAAA,EAAsB;AAAA,EAC/B;AACF;AAGA,eAAsB,sBAAA,CACpB,SACA,MAAA,EAMkC;AAClC,EAAA,MAAM,SAAS,IAAI,sBAAA;AAAA,IACjB;AAAA,MACE,WAAA,EAAa,eAAA,CAAgB,OAAO,CAAA,CAAE,IAAA;AAAA,MACtC,eAAe,YAAY;AAAA,KAC7B;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,mBAAA,CAAoB,MAAM,CAAA;AACtD,IAAA,MAAM,YAAY,MAAA,CAAO,aAAA;AACzB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,oBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,SAAA;AAAA,QACA,cAAA,EAAgB,OAAO,QAAA,CAAS,eAAA;AAAA,QAChC,YAAA,EAAc,OAAO,QAAA,CAAS;AAAA,OAChC;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,SAAA;AAAA,MACA,cAAA,EAAgB,OAAO,MAAA,CAAO;AAAA,KAChC;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,qBAAA,EAAsB;AAAA,EAC/B;AACF;AAGA,eAAsB,eAAA,CACpB,OAAA,EACA,MAAA,EACA,UAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,IAAI,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,kCAAkC,CAAA;AAAA,EAC7E;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,uBAAA,EAAyB;AACjD,IAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,CAAA,mBAAA,EAAsB,uBAAuB,CAAA,MAAA,CAAQ,CAAA;AAAA,EAChG;AACA,EAAA,MAAM,MAAM,MAAM,eAAA;AAAA,IAChB,OAAA;AAAA,IACA,sBAAA,CAAuB,IAAA;AAAA,IACvB;AAAA,MACE,KAAA,EAAO,MAAA;AAAA,MACP,WAAA,EAAa,IAAI,UAAA,CAAW,UAAU;AAAA,KACxC;AAAA,IACA,EAAE,MAAA,EAAQ,SAAA,EAAW,6BAAA,EAA+B,IAAA;AAAK,GAC3D;AACA,EAAA,MAAM,OAAA,GAAA,CAAW,MAAM,YAAA,EAAa,EAAG,0BAA0B,GAAG,CAAA;AACpE,EAAA,4BAAA,CAA6B,GAAA,EAAK,SAAS,MAAM,CAAA;AACjD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,wBAAwB,GAAA,CAAI;AAAA,GAC9B;AACF;AAEA,SAAS,4BAAA,CACP,QAAA,EACA,OAAA,EACA,eAAA,EACM;AACN,EAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,UAAA,EAAY,QAAA,CAAS,WAAA;AACzD,EAAA,IACE,SAAS,OAAA,KAAY,eAAA,IACpB,mBAAA,KAAwB,MAAA,IAAa,wBAAwB,eAAA,EAC9D;AACA,IAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,iCAAiC,CAAA;AAAA,EAC5E;AACF;AAEA,eAAe,eAAA,GAAiC;AAC9C,EAAA,MAAA,CAAO,MAAM,gBAAA,EAAiB,EAAG,eAAA,EAAgB;AACnD;AAEA,SAAS,cAAA,GAA6B;AACpC,EAAA,OAAO,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,uBAAuB,CAAC,CAAA;AACvE;AAEA,eAAe,iBAAiB,MAAA,EAAyC;AACvE,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,MAAA,CAAO,OAAO,SAAA,EAAW,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA;AAC/E,EAAA,OAAO,IAAI,WAAW,UAAU,CAAA;AAClC;AAEA,SAAS,WAAW,KAAA,EAA2B;AAC7C,EAAA,OAAO,MAAM,IAAA,CAAK,KAAK,CAAA,CACpB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAC1C,KAAK,EAAE,CAAA;AACZ;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,uBAAuB,UAAA,EAA4C;AAC1E,EAAA,IAAI,UAAA,CAAW,IAAA,KAAS,SAAA,EAAW,OAAO,MAAA;AAC1C,EAAA,OAAO,WAAW,cAAA,GAAiB,GAAA;AACrC;AAEA,SAAS,yCAAyC,UAAA,EAA8B;AAC9E,EAAA,IAAI,UAAA,CAAW,SAAS,SAAA,EAAW;AACjC,IAAA,IAAI,OAAO,UAAA,CAAW,mBAAA,KAAwB,QAAA,EAAU;AACtD,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,SAAA,CAAU,WAAW,mBAAmB,CAAA;AACxC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,qBAAqB,CAAA,EAAG;AACpD,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,uCAAA,CAAwC,UAAA,CAAW,sBAAsB,MAAM,CAAA;AAC/E,EAAA,KAAA,MAAW,OAAA,IAAW,WAAW,qBAAA,EAAuB;AACtD,IAAA,SAAA,CAAU,OAAO,CAAA;AAAA,EACnB;AACA,EAAA,oCAAA,CAAqC,WAAW,aAAa,CAAA;AAC7D,EAAA,IAAI,CAAC,uCAAA,CAAwC,GAAA,CAAI,UAAA,CAAW,cAAc,CAAA,EAAG;AAC3E,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,qBAAA;AAAA,MACA,CAAA,EAAG,uCAAuC,CAAA,MAAA,EAAS,UAAA,CAAW,cAAc,CAAA;AAAA,KAC9E;AAAA,EACF;AACF;AAEA,SAAS,UAAA,CAAW,GAAe,CAAA,EAAwB;AACzD,EAAA,IAAI,CAAA,CAAE,UAAA,KAAe,CAAA,CAAE,UAAA,EAAY,OAAO,KAAA;AAC1C,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,UAAA,EAAY,SAAS,CAAA,EAAG;AACpD,IAAA,IAAA,IAAQ,CAAA,CAAE,KAAK,CAAA,GAAK,CAAA,CAAE,KAAK,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAEA,SAAS,qBAAA,CAAsB,GAA2B,CAAA,EAAoC;AAC5F,EAAA,OACE,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAA,IACd,CAAA,CAAE,qBAAA,KAA0B,CAAA,CAAE,qBAAA,IAC9B,CAAA,CAAE,wBAAA,KAA6B,CAAA,CAAE,wBAAA,IACjC,CAAA,CAAE,uBAAuB,CAAA,CAAE,kBAAA,IAC3B,CAAA,CAAE,gBAAA,KAAqB,CAAA,CAAE,gBAAA,IACzB,CAAA,CAAE,cAAA,KAAmB,CAAA,CAAE,cAAA,IACvB,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,IACpB,EAAE,aAAA,KAAkB,CAAA,CAAE,aAAA,IACtB,CAAA,CAAE,qBAAA,KAA0B,CAAA,CAAE,qBAAA,IAC9B,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,IACpB,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,WAChB,CAAA,CAAE,YAAA,KAAiB,CAAA,CAAE,YAAA,IACrB,CAAA,CAAE,mBAAA,KAAwB,CAAA,CAAE,mBAAA,IAC5B,oBAAA,CAAqB,CAAA,CAAE,eAAA,EAAiB,CAAA,CAAE,eAAe,CAAA;AAE7D;AAEA,SAAS,oBAAA,CACP,GACA,CAAA,EACS;AACT,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,EAAO,KAAA,KAAU,MAAM,mBAAA,KAAwB,CAAA,CAAE,KAAK,CAAA,EAAG,mBAAmB,CAAA;AAC9F;AAEA,SAAS,sBAAsB,GAAA,EAAuB;AACpD,EAAA,OAAO,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,OAAA,CAAQ,SAAS,uBAAuB,CAAA;AACpF;AAEA,SAAS,yCAAyC,GAAA,EAAuB;AACvE,EAAA,IAAI,GAAA,YAAe,cAAA,IAAkB,GAAA,YAAe,YAAA,EAAc,OAAO,IAAA;AACzE,EAAA,IAAI,GAAA,YAAe,kBAAkB,OAAO,KAAA;AAC5C,EAAA,OAAO,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,oBAAA;AACrD;AAEA,SAAS,4BAAA,CACP,UACA,GAAA,EAC0B;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,GAAG,CAAA;AAC3C,IAAA,OAAO,yBAAyB,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,OAAA,EAAS,QAAQ,aAAa,CAAA;AAAA,EACtF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,wBAAA;AAAA,MACL,cAAA;AAAA,MACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,KACvC;AAAA,EACF;AACF;AAEA,SAAS,wBAAA,CACP,IAAA,EACA,OAAA,EACA,WAAA,EAC0B;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAI/B,EAAA,KAAA,CAAM,IAAA,GAAO,0BAAA;AACb,EAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AACb,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAW,KAAA,CAAM,WAAA,GAAc,WAAA;AACnD,EAAA,OAAO,KAAA;AACT;;;AC3hEO,IAAM,yBAAA,GAA4B;AAGlC,IAAM,yBAAA,GAA4B;AAEzC,IAAM,6CAAA,GACJ,uFAAA;AAiEF,eAAsB,eAAA,CACpB,SACA,IAAA,EACgC;AAChC,EAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,IAAA,CAAK,YAAA,EAAc;AAAA,IAC3D,eAAe,IAAA,CAAK;AAAA,GACrB,CAAA;AACD,EAAA,iBAAA,CAAkB,KAAK,cAAc,CAAA;AACrC,EAAA,+BAAA,CAAgC,YAAY,CAAA;AAC5C,EAAA,cAAA,CAAe,OAAO,CAAA;AACtB,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,YAAA,CAAa,CAAC,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,wBAAA,CAAyB,YAAA,EAAc,WAAA,CAAY,OAAO,CAAA;AAEjF,EAAA,OAAO,yBAAyB,OAAA,EAAS;AAAA,IACvC,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,UAAA,EAAY,cAAA;AAAA,IACZ,GAAI,IAAA,CAAK,UAAA,KAAe,UAAa,EAAE,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,IACnE,GAAI,IAAA,CAAK,kBAAA,KAAuB,MAAA,IAAa;AAAA,MAC3C,oBAAoB,IAAA,CAAK;AAAA,KAC3B;AAAA,IACA,GAAI,IAAA,CAAK,iBAAA,KAAsB,MAAA,IAAa;AAAA,MAC1C,mBAAmB,IAAA,CAAK;AAAA,KAC1B;AAAA,IACA,GAAI,IAAA,CAAK,YAAA,KAAiB,UAAa,EAAE,YAAA,EAAc,KAAK,YAAA,EAAa;AAAA,IACzE,GAAI,IAAA,CAAK,mBAAA,KAAwB,MAAA,IAAa;AAAA,MAC5C,qBAAqB,IAAA,CAAK;AAAA,KAC5B;AAAA,IACA,GAAI,IAAA,CAAK,eAAA,KAAoB,MAAA,IAAa;AAAA,MACxC,iBAAiB,IAAA,CAAK;AAAA,KACxB;AAAA,IACA,GAAI,IAAA,CAAK,mBAAA,KAAwB,MAAA,IAAa;AAAA,MAC5C,qBAAqB,IAAA,CAAK;AAAA,KAC5B;AAAA,IACA,GAAI,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAAa;AAAA,MAC7C,sBAAsB,IAAA,CAAK;AAAA;AAC7B,GACD,CAAA;AACH;AAGA,eAAsB,mBAAA,CACpB,SACA,IAAA,EACoC;AACpC,EAAA,cAAA,CAAe,OAAO,CAAA;AACtB,EAAA,OAAO,6BAA6B,OAAA,EAAS;AAAA,IAC3C,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,YAAA,EAAc,IAAI,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA;AAAA,IAC9C,GAAI,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,EAAE,YAAY,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,EAAE;AAAA,IACnF,kBAAA,EAAoB,IAAI,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA;AAAA,IAC1D,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,GAAI,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAAa;AAAA,MAC7C,sBAAsB,IAAA,CAAK;AAAA,KAC7B;AAAA,IACA,GAAI,IAAA,CAAK,aAAA,KAAkB,MAAA,IAAa,EAAE,eAAe,IAAI,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA;AAAE,GAC7F,CAAA;AACH;AAGA,eAAsB,IAAA,CACpB,OAAA,EACA,UAAA,EACA,UAAA,EACA,SAAA,EAC2B;AAC3B,EAAA,cAAA,CAAe,OAAO,CAAA;AACtB,EAAA,OAAO,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,UAAA,EAAY,SAAS,CAAA;AACnE;AAEA,SAAS,kBAAkB,cAAA,EAA8B;AACvD,EAAA,IACE,CAAC,OAAO,aAAA,CAAc,cAAc,KACpC,cAAA,GAAiB,yBAAA,IACjB,iBAAiB,yBAAA,EACjB;AACA,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,gBAAA;AAAA,MACA,CAAA,0CAAA,EAA6C,yBAAyB,CAAA,KAAA,EAAQ,yBAAyB,CAAA,SAAA;AAAA,KACzG;AAAA,EACF;AACF;AAEA,SAAS,gCAAgC,MAAA,EAA4B;AACnE,EAAA,KAAA,MAAW,WAAA,IAAe,OAAO,YAAA,EAAc;AAC7C,IAAA,IAAI,WAAA,CAAY,gBAAgB,MAAA,EAAW;AACzC,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBAAA,CACP,QACA,kBAAA,EAWI;AACJ,EAAA,MAAM,kBAAkB,MAAA,CAAO,eAAA;AAC/B,EAAA,IAAI,eAAA,KAAoB,MAAA,IAAa,eAAA,KAAoB,wBAAA,EAA0B;AACjF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,mBAAA,EAAqB;AAAA,KACvB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,kCAAA;AAAA,IACf,gBAAgB,eAAA,GAAkB,qCAAA;AAAA,IAClC,qBAAA,EAAuB,CAAC,kBAAkB;AAAA,GAC5C;AACF;AA2BA,eAAsB,aAAA,CACpB,SACA,IAAA,EACkC;AAClC,EAAA,cAAA,CAAe,OAAO,CAAA;AACtB,EAAA,kBAAA,CAAmB,KAAK,YAAY,CAAA;AACpC,EAAA,OAAO,uBAAuB,OAAA,EAAS;AAAA,IACrC,GAAI,IAAA,CAAK,MAAA,KAAW,UAAa,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IACvD,GAAI,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,EAAE,YAAY,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,EAAE;AAAA,IACnF,YAAA,EAAc,IAAI,UAAA,CAAW,IAAA,CAAK,YAAY;AAAA,GAC/C,CAAA;AACH","file":"user.js","sourcesContent":["/**\n * Payout policy validation (spec sections 4.3.1 and 10.1).\n *\n * A two-stage check: AJV enforces the structural shape, then the semantic rules\n * that JSON Schema cannot express are applied. Any failure throws a\n * `PolicyValidationError` and the policy never reaches the wire. Pure and\n * synchronous; no transport, no I/O.\n */\n\nimport { PolicyValidationError } from \"../core/errors.js\";\nimport { publicKey } from \"../core/brands.js\";\nimport { scheduledPayoutWindowSeconds } from \"protocol/coordinator\";\nimport type { PayoutPolicy } from \"../schemas/types.generated.js\";\nimport { formatAjvErrors, validatePayoutPolicyShape } from \"./ajv.js\";\n\n/**\n * Conversion factor used by the public payout-window selector.\n */\nexport const PAYOUT_WINDOW_MILLISECONDS_PER_SECOND = 1_000;\n\n/** `totalDeadlineMs` value that selects the coordinator's instant payout mode. */\nexport const INSTANT_PAYOUT_WINDOW_MS = 0;\n\n/** Scheduled payout-window durations currently published by the coordinator. */\nconst SCHEDULED_PAYOUT_WINDOW_DURATIONS_MS = Object.freeze(\n scheduledPayoutWindowSeconds().map(\n (windowSeconds) => windowSeconds * PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n ),\n);\n\n/**\n * `totalDeadlineMs` values accepted by the current normal-user SDK surface.\n * Zero selects instant payout; positive values select a scheduled window.\n */\nexport const SUPPORTED_TOTAL_DEADLINE_MS = Object.freeze([\n INSTANT_PAYOUT_WINDOW_MS,\n ...SCHEDULED_PAYOUT_WINDOW_DURATIONS_MS,\n]);\n\nconst SUPPORTED_TOTAL_DEADLINE_MS_SET = new Set(SUPPORTED_TOTAL_DEADLINE_MS);\n\n/** Largest currently supported scheduled payout-window duration. */\nexport const MAX_TOTAL_DEADLINE_MS = Math.max(...SUPPORTED_TOTAL_DEADLINE_MS);\n\n/** Tolerance, in percentage points, for the destination shares summing to 100. */\nexport const SHARE_SUM_TOLERANCE = 0.01;\n\n/** Current normal-user policy/liquidity runtime limit for payout destinations. */\nexport const CURRENT_USER_PAYOUT_DESTINATION_LIMIT = 1;\n\nexport const CURRENT_USER_PAYOUT_DESTINATION_LIMIT_MESSAGE =\n \"current V0 normal-user SDK and coordinator support exactly one payout destination; multi-address receive is not supported yet\";\n\n/** V0 normal-user policy field that remains reserved for the V1 batch contract. */\nexport const CURRENT_USER_BATCH_EXCLUSION_ID_UNSUPPORTED_MESSAGE =\n \"batchExclusionId is not supported in V0 normal-user payout requests; V1 defines it as campaign-scoped batch exclusion, never a stable actor identity\";\n\n/** V0 normal-user policy field that is retained in the forward-compatible schema. */\nexport const CURRENT_USER_MIN_DELAY_UNSUPPORTED_MESSAGE =\n \"destinations[*].minDelayMs is not supported in V0 normal-user payout requests\";\n\n/** V0 normal-user policy field that is retained in the forward-compatible schema. */\nexport const CURRENT_USER_MAX_DELAY_UNSUPPORTED_MESSAGE =\n \"destinations[*].maxDelayMs is not supported in V0 normal-user payout requests\";\n\n/** Current normal-user policy/liquidity runtime limit for scheduled fragments. */\nexport const CURRENT_USER_PAYOUT_FRAGMENT_LIMIT = 1;\n\nexport const CURRENT_USER_PAYOUT_FRAGMENT_LIMIT_MESSAGE =\n \"current SDK and coordinator support exactly one scheduled payout fragment; multi-fragment receive is not supported yet\";\n\n/** Optional context that tightens validation when the caller knows more. */\nexport interface PayoutPolicyContext {\n /** The deposit origin; payout destinations must never equal it (rule 3). */\n readonly originAddress?: string;\n /** Total payable lamports; bounds each `minLamports` to its share (rule 6). */\n readonly totalLamports?: number;\n}\n\n/**\n * Validate an untrusted payout policy and return it typed.\n *\n * @throws PolicyValidationError on any structural or semantic violation.\n */\nexport function validatePayoutPolicy(input: unknown, ctx: PayoutPolicyContext = {}): PayoutPolicy {\n if (!validatePayoutPolicyShape(input)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `payout policy shape invalid: ${formatAjvErrors(validatePayoutPolicyShape.errors)}`,\n );\n }\n const policy = input as PayoutPolicy;\n const { destinations } = policy;\n\n assertCurrentUserUnsupportedPayoutFeatures(policy);\n assertCurrentUserPayoutDestinationLimit(destinations.length);\n\n // Rule 2: every address is a valid base58 Solana key.\n for (const { address } of destinations) {\n publicKey(address); // throws PolicyValidationError(INVALID_DESTINATION_ADDRESS)\n }\n\n // Rule 4: no repeated destination.\n const seen = new Set<string>();\n for (const { address } of destinations) {\n if (seen.has(address)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `duplicate payout destination: ${address}`,\n );\n }\n seen.add(address);\n }\n\n // Rule 3: no destination is the deposit origin.\n if (ctx.originAddress !== undefined && seen.has(ctx.originAddress)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n \"a payout destination must not be the deposit origin\",\n );\n }\n\n // Rule 1: shares sum to 100 within tolerance.\n const shareSum = destinations.reduce((acc, d) => acc + d.sharePercent, 0);\n if (Math.abs(shareSum - 100) > SHARE_SUM_TOLERANCE) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `destination shares must sum to 100, got ${shareSum}`,\n );\n }\n\n // Rule 6: per-destination floor bounds.\n for (const d of destinations) {\n if (d.minLamports !== undefined && ctx.totalLamports !== undefined) {\n const shareFloor = Math.floor((ctx.totalLamports * d.sharePercent) / 100);\n if (d.minLamports > shareFloor) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `minLamports (${d.minLamports}) exceeds the implied share floor (${shareFloor}) for ${d.address}`,\n );\n }\n }\n }\n\n // Rule 7: total deadline selects one of the coordinator's payout windows.\n if (policy.totalDeadlineMs !== undefined) {\n if (!SUPPORTED_TOTAL_DEADLINE_MS_SET.has(policy.totalDeadlineMs)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `totalDeadlineMs (${policy.totalDeadlineMs}) must be one of [${SUPPORTED_TOTAL_DEADLINE_MS.join(\", \")}] milliseconds; 0 selects instant payout`,\n );\n }\n }\n\n return policy;\n}\n\nfunction assertCurrentUserUnsupportedPayoutFeatures(policy: PayoutPolicy): void {\n if (policy.batchExclusionId !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_BATCH_EXCLUSION_ID_UNSUPPORTED_MESSAGE,\n );\n }\n\n for (const destination of policy.destinations) {\n if (destination.minDelayMs !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_MIN_DELAY_UNSUPPORTED_MESSAGE,\n );\n }\n if (destination.maxDelayMs !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_MAX_DELAY_UNSUPPORTED_MESSAGE,\n );\n }\n }\n}\n\nexport function assertCurrentUserPayoutDestinationLimit(destinationCount: number): void {\n if (destinationCount !== CURRENT_USER_PAYOUT_DESTINATION_LIMIT) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `${CURRENT_USER_PAYOUT_DESTINATION_LIMIT_MESSAGE}; got ${destinationCount}`,\n );\n }\n}\n\nexport function assertCurrentUserPayoutFragmentLimit(fragmentCount: number): void {\n if (fragmentCount !== CURRENT_USER_PAYOUT_FRAGMENT_LIMIT) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `${CURRENT_USER_PAYOUT_FRAGMENT_LIMIT_MESSAGE}; got ${fragmentCount}`,\n );\n }\n}\n","import { PolicyValidationError } from \"../core/errors.js\";\n\n/** Byte length of the Recovery Code preimage used by normal-user withdrawals. */\nexport const RECOVERY_CODE_BYTE_LENGTH = 32;\n\n/** Validate the Recovery Code preimage before it reaches the coordinator wire. */\nexport function assertRecoveryCode(code: Uint8Array): void {\n if (code.byteLength !== RECOVERY_CODE_BYTE_LENGTH) {\n throw new PolicyValidationError(\n \"INVALID_WITHDRAWAL_PLAN\",\n `recoveryCode must be ${RECOVERY_CODE_BYTE_LENGTH} bytes`,\n );\n }\n}\n\nexport async function generateRecoveryCode(): Promise<{\n code: Uint8Array;\n commitment: Uint8Array;\n}> {\n const code = crypto.getRandomValues(new Uint8Array(RECOVERY_CODE_BYTE_LENGTH));\n const commitment = await commitmentFromCode(code);\n return { code, commitment };\n}\n\nexport async function commitmentFromCode(code: Uint8Array): Promise<Uint8Array> {\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", new Uint8Array(code));\n return new Uint8Array(hashBuffer);\n}\n\nexport function recoveryCodeToHex(code: Uint8Array): string {\n return Array.from(code)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function recoveryCodeFromHex(hex: string): Uint8Array {\n const expectedHexLength = RECOVERY_CODE_BYTE_LENGTH * 2;\n if (!new RegExp(`^[0-9a-fA-F]{${expectedHexLength}}$`).test(hex)) {\n throw new Error(\n `recovery code must be exactly ${expectedHexLength} hex characters (${RECOVERY_CODE_BYTE_LENGTH} bytes)`,\n );\n }\n const bytes = new Uint8Array(RECOVERY_CODE_BYTE_LENGTH);\n for (let i = 0; i < RECOVERY_CODE_BYTE_LENGTH; i += 1) {\n bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\nexport function recoveryCodeFromUserInput(input: string): Uint8Array {\n return recoveryCodeFromHex(input.replace(/\\s+/g, \"\"));\n}\n","import type { DkgKeyPackageHandle } from \"frost\";\nimport { scheduledPayoutWindowSeconds } from \"protocol/coordinator\";\nimport type { CoordinatorPoolConfig } from \"../schemas/types.generated.js\";\nimport { publicKey } from \"../core/brands.js\";\nimport { solanaAddressFromPublicKeyBytes } from \"../core/solanaAddress.js\";\nimport type { Session } from \"../core/session.js\";\nimport type { AcceptanceReceipt } from \"../commands/receipts.js\";\nimport {\n AttestationError,\n CommandError,\n InvalidDepositAmountError,\n PolicyValidationError,\n RoutingError,\n TransportError,\n normalizeError,\n} from \"../core/errors.js\";\nimport { createExponentialBackoff } from \"../core/exponentialBackoff.js\";\nimport { createSession, type CreateSessionOptions } from \"../session/createSession.js\";\nimport { getSessionState } from \"../session/state.js\";\nimport {\n assertCurrentUserPayoutDestinationLimit,\n assertCurrentUserPayoutFragmentLimit,\n} from \"../validation/payoutPolicy.js\";\nimport {\n CoordinatorMessageType,\n EnvelopeKind,\n closeProtocolRuntime as closeSessionProtocolRuntime,\n onEnvelope,\n requestEnvelope,\n type Envelope,\n} from \"../coordinator/protocolClient.js\";\nimport { assertRecoveryCode, generateRecoveryCode, recoveryCodeToHex } from \"./recoveryCode.js\";\n\nexport type ClientSwapState =\n | \"new\"\n | \"awaiting_dkg\"\n | \"awaiting_deposit\"\n | \"awaiting_delegation\"\n | \"awaiting_delegate_ack\"\n | \"awaiting_delegate_ack_after_deposit\"\n | \"ready_for_settlement\"\n | \"settling\"\n | \"completed\"\n | \"refunded\"\n | \"failed\";\n\nexport type PayoutSpec =\n | {\n readonly mode: \"instant\";\n readonly destination_address: string;\n }\n | {\n readonly mode: \"scheduled\";\n readonly num_fragments: number;\n readonly window_seconds: number;\n readonly destination_addresses: readonly string[];\n };\n\nexport type SpendingPolicySnapshot = {\n readonly asset: \"SOL\";\n readonly entry_amount_lamports: number;\n readonly total_committed_lamports: number;\n readonly payout_deadline_ms: number;\n readonly payout_window_ms?: number;\n readonly payout_schedule: readonly { readonly destination_address: string }[];\n readonly fragment_count: number;\n readonly payout_mode: \"instant\" | \"scheduled\";\n readonly matching_mode: \"exact_1_to_1\";\n readonly fragmentation_allowed: \"payout_side_only\";\n readonly min_fee_bps: number;\n readonly fee_bps: number;\n readonly fee_lamports: number;\n readonly net_payout_lamports: number;\n};\n\nexport type PayoutExecutedPayload = {\n readonly index: number;\n readonly amount_lamports: number;\n readonly destination_address: string;\n readonly tx_signature: string;\n readonly executed_at_ms: number;\n readonly final: boolean;\n};\n\nexport type WithdrawExecutedPayload = {\n readonly tx_signature: string;\n readonly amount_lamports: number;\n readonly withdrawn_at_ms: number;\n readonly trigger: \"user_request\" | \"auto_deadline\";\n readonly destination_address: string;\n};\nexport type RefundExecutedPayload = WithdrawExecutedPayload;\n\ntype SyncRetryInstruction = {\n readonly should_retry: boolean;\n readonly poll_after_ms: number | null;\n};\n\ntype PayoutWindowSyncSnapshot = {\n readonly starts_at_ms: number;\n readonly deadline_ms: number | null;\n};\n\ntype NormalUserContractStatus =\n | \"deposit\"\n | \"activating\"\n | \"active\"\n | \"settling\"\n | \"completed\"\n | \"refunded\"\n | \"expired\";\n\nexport type NormalUserSettlementPhase =\n | \"awaiting_deposit\"\n | \"activating\"\n | \"waiting_for_liquidity\"\n | \"retry_delayed\"\n | \"recovery_required\"\n | \"matched_scheduled\"\n | \"locked_pending_payout\"\n | \"submitted\"\n | \"confirming\"\n | \"completed\"\n | \"refund_pending\"\n | \"refunded\"\n | \"expired\";\n\nexport type NormalUserRefundability =\n | \"available_now\"\n | \"request_pending\"\n | \"blocked_by_lock\"\n | \"stale\"\n | \"unavailable\";\n\nexport type NormalUserRefundStatus =\n | \"queued\"\n | \"reserved\"\n | \"submitted\"\n | \"confirming\"\n | \"retrying\"\n | \"finalized\"\n | \"failed\"\n | \"partial\"\n | \"canceled\";\n\nexport type SourceLiquidityUse =\n | \"not_materialized\"\n | \"available\"\n | \"locked_for_payout\"\n | \"pending_finality\"\n | \"spent\"\n | \"released\";\n\ntype NormalUserContractSyncSnapshot = {\n readonly contract_id: string;\n readonly status: NormalUserContractStatus;\n readonly settlement_phase: NormalUserSettlementPhase;\n readonly refundability: NormalUserRefundability;\n readonly refund_status: NormalUserRefundStatus | null;\n readonly source_liquidity_use: SourceLiquidityUse;\n readonly destination_wallet: string | null;\n readonly deposit_amount_lamports: number;\n readonly deposit_expires_at_ms: number;\n readonly payout_window: PayoutWindowSyncSnapshot;\n readonly settlement_tx_hashes: readonly string[];\n readonly settled_amount_lamports: number;\n readonly protocol_fee_lamports: number;\n readonly network_fee_lost_lamports: readonly number[];\n readonly recovery_refund_remaining_lamports: number;\n readonly withdrawal_requested_lamports: number;\n readonly withdrawal_landed_lamports: number;\n readonly withdrawal_landed_fee_lamports: number;\n readonly withdrawal_canceled_lamports: number;\n readonly withdrawal_network_fee_loss_lamports: number;\n readonly withdrawal_tx_hashes: readonly string[];\n readonly retry: SyncRetryInstruction;\n readonly state_version: number;\n readonly updated_at_ms: number;\n};\n\nexport type NormalUserActorSyncSnapshot = {\n readonly actor: \"normal_user\";\n readonly snapshot: NormalUserContractSyncSnapshot;\n};\n\nexport type SyncUserResponsePayload = {\n readonly state: ClientSwapState;\n readonly fragments_executed: readonly PayoutExecutedPayload[];\n readonly withdraw_execution?: RefundExecutedPayload;\n readonly actor_sync?: NormalUserActorSyncSnapshot;\n};\n\n/**\n * Actor-scoped sync response plus the coordinator clock used to produce it.\n * The timestamp is envelope metadata, not part of the wire payload.\n */\nexport type SyncUserResponse = SyncUserResponsePayload & {\n readonly coordinatorTimestampMs: number;\n};\n\nexport type WithdrawAcceptedPayload = {\n readonly status: \"accepted\";\n readonly amount_lamports: number;\n readonly destination_address: string;\n readonly accepted_at_ms: number;\n};\n\n/**\n * Acceptance receipt for a normal-user refund, including the coordinator's\n * authoritative amount claim. The timestamp is absent when the coordinator\n * reports that the request already executed before the client received it.\n */\nexport type RefundAcceptanceReceipt = AcceptanceReceipt & {\n readonly amountLamports: number;\n readonly acceptedAtMs?: number;\n};\n\nexport type RunSwapParams = {\n amountLamports: number;\n payoutSpec: PayoutSpec;\n payoutDeadlineMs?: number;\n onPolicySnapshot?: (policy: SpendingPolicySnapshot) => void;\n recoveryCommitment?: Uint8Array;\n syncSecret?: Uint8Array;\n onSyncSecretReady?: (info: { secretHex: string }) => void | Promise<void>;\n resumeSecret?: Uint8Array;\n onResumeSecretReady?: (info: { secretHex: string }) => void | Promise<void>;\n onSwapAllocated?: (info: {\n swapId: string;\n syncSecretHex: string;\n resumeSecretHex: string;\n }) => void | Promise<void>;\n onRecoveryCodeReady?: (info: { codeHex: string }) => void | Promise<void>;\n onDelegateShareReady?: (info: {\n swapId: string;\n delegateShare: Uint8Array;\n }) => void | Promise<void>;\n delegateShare?: Uint8Array;\n onDepositAddressReady?: (info: {\n swapId: string;\n jointPublicKey: Uint8Array;\n amountLamports: number;\n depositExpiresAtMs: number;\n coordinatorTimestampMs: number;\n }) => void | Promise<void>;\n onDepositConfirmed?: (info: { originAddress: string | undefined }) => void | Promise<void>;\n payoutWindowMs?: number;\n};\n\n/** Parameters for the pre-deposit portion of a normal-user contract flow. */\nexport type ContractRequestParams = Omit<RunSwapParams, \"onDepositConfirmed\">;\n\n/**\n * Details returned once the coordinator has accepted, initialized, and\n * durably delegated a contract, but before the user's deposit is observed.\n */\nexport type ContractRequestResult = {\n readonly accepted: true;\n /** V0 has no separate durable request id, so this aliases `swapId`. */\n readonly requestId: string;\n readonly state: \"awaiting_deposit\";\n readonly swapId: string;\n readonly depositAddress: string;\n readonly jointPublicKey: Uint8Array;\n readonly amountLamports: number;\n readonly depositExpiresAtMs: number;\n readonly coordinatorTimestampMs: number;\n readonly delegatedAtMs: number;\n /** The read-only status secret. The caller must persist it if it needs sync. */\n readonly syncSecret: Uint8Array;\n readonly syncSecretHex: string;\n /** The pre-delegation mutation secret. Persist it only for resume/recovery workflows. */\n readonly resumeSecret: Uint8Array;\n readonly resumeSecretHex: string;\n /** Present when the SDK generated the Recovery Code for this request. */\n readonly recoveryCodeHex?: string;\n readonly policySnapshot: SpendingPolicySnapshot;\n readonly delegatePolicySnapshot: SpendingPolicySnapshot;\n};\n\n/** Inputs for resuming an already allocated pre-delegation contract. */\nexport type ResumePreDelegationParams = {\n readonly swapId: string;\n readonly resumeSecret: Uint8Array;\n readonly syncSecret?: Uint8Array;\n readonly recoveryCommitment: Uint8Array;\n /** The policy snapshot persisted when the contract was first allocated. */\n readonly policySnapshot: SpendingPolicySnapshot;\n /** Called before DkgRound2 so recovery can persist the generated Alice share. */\n readonly onDelegateShareReady?: RunSwapParams[\"onDelegateShareReady\"];\n /** Supply the previously generated Alice share when DKG was already sealed. */\n readonly delegateShare?: Uint8Array;\n};\n\nexport type ResumePreDelegationResult = {\n readonly swapId: string;\n readonly jointPublicKey?: Uint8Array;\n readonly depositExpiresAtMs?: number;\n readonly coordinatorTimestampMs?: number;\n readonly delegatedAtMs: number;\n};\n\nexport type SwapResult = {\n swapId: string;\n jointPublicKey: Uint8Array;\n depositTxSignature: string;\n depositObservedAtMs: number;\n delegatedAtMs: number;\n readonly resumeSecret: Uint8Array;\n readonly resumeSecretHex: string;\n recoveryCodeHex?: string;\n policySnapshot: SpendingPolicySnapshot;\n delegatePolicySnapshot: SpendingPolicySnapshot;\n};\n\nexport type RefundIntentResult =\n | { readonly kind: \"executed\"; readonly refund: RefundExecutedPayload }\n | { readonly kind: \"accepted\"; readonly accepted: WithdrawAcceptedPayload };\n\nexport type SessionStatus = \"idle\" | \"connecting\" | \"running\" | \"done\" | \"failed\";\n\nexport type CoordinatorSessionOptions = {\n coordinator: CoordinatorPoolConfig;\n createSession?: (options: CreateSessionOptions) => Promise<Session>;\n};\n\ntype StateChangeListener = (\n swapState: ClientSwapState,\n sessionStatus: SessionStatus,\n swapId: string | null,\n) => void;\ntype LogListener = (msg: string, direction: \"in\" | \"out\" | \"info\") => void;\ntype PayoutExecutedListener = (payload: PayoutExecutedPayload, swapId: string) => void;\ntype RefundExecutedListener = (payload: RefundExecutedPayload, swapId: string) => void;\ntype NormalUserActorSyncListener = (\n payload: NormalUserActorSyncSnapshot,\n coordinatorTimestampMs: number,\n) => void;\nexport type CoordinatorProtocolError = Error & {\n readonly code: string;\n readonly failedReqId?: number;\n};\ntype CoordinatorErrorListener = (err: CoordinatorProtocolError) => void;\n\nexport type CoordinatorSessionHandle = {\n onStateChange(listener: StateChangeListener): () => void;\n onLog(listener: LogListener): () => void;\n onPayoutExecuted(listener: PayoutExecutedListener): () => void;\n onRefundExecuted(listener: RefundExecutedListener): () => void;\n onNormalUserActorSync(listener: NormalUserActorSyncListener): () => void;\n onCoordinatorError(listener: CoordinatorErrorListener): () => void;\n readonly currentSwapState: ClientSwapState;\n readonly currentSessionStatus: SessionStatus;\n runSwap(params: RunSwapParams): Promise<SwapResult>;\n contractRequest(params: ContractRequestParams): Promise<ContractRequestResult>;\n resumePreDelegation(params: ResumePreDelegationParams): Promise<ResumePreDelegationResult>;\n close(): void;\n restoreSwapContext(params: {\n swapId: string;\n syncSecret?: Uint8Array;\n resumeSecret?: Uint8Array;\n }): void;\n requestSwapStatus(timeoutMs?: number): Promise<SyncUserResponsePayload>;\n startSwapStatusReconciliation(intervalMs?: number): () => void;\n requestRefund(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundExecutedPayload>;\n requestRefundIntent(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundIntentResult>;\n};\n\ntype PushListener = {\n readonly swapId?: string | null;\n resolve: (env: Envelope) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout> | null;\n};\n\ntype ClientSwapContext = {\n readonly swapId: string;\n swapState: ClientSwapState;\n syncSecret: Uint8Array | null;\n resumeSecret: Uint8Array | null;\n bufferDepositConfirmedUntilDelegateAck: boolean;\n bufferedDepositConfirmed: Envelope | null;\n};\n\ntype ProtocolModule = {\n INITIAL_STATE: ClientSwapState;\n nextState(\n state: ClientSwapState,\n kind: EnvelopeKind,\n type: CoordinatorMessageType,\n context?: { payoutFinal?: boolean },\n ): ClientSwapState | null;\n asDkgRound1ResponsePayload(env: Envelope): {\n package: Uint8Array;\n round2_for_alice: Uint8Array;\n };\n asDkgCompletePayload(env: Envelope): {\n joint_pubkey: Uint8Array;\n deposit_expires_at_ms: number;\n };\n asDelegateShareResponsePayload(env: Envelope): { delegated_at_ms: number };\n asDepositConfirmedPayload(env: Envelope): {\n amount_lamports: number;\n tx_signature: string;\n observed_at_ms: number;\n origin_address?: string;\n };\n asDelegateAckPayload(env: Envelope): {\n delegated_at_ms: number;\n spending_policy: SpendingPolicySnapshot;\n };\n asPayoutExecutedPayload(env: Envelope): PayoutExecutedPayload;\n asSwapRequestResponsePayload(env: Envelope): {\n swap_id: string;\n policy_snapshot: SpendingPolicySnapshot;\n };\n asWithdrawAcceptedPayload(env: Envelope): WithdrawAcceptedPayload;\n asWithdrawExecutedPayload(env: Envelope): WithdrawExecutedPayload;\n asSyncUserResponsePayload(env: Envelope): SyncUserResponsePayload;\n asErrorPayload(env: Envelope): {\n code: string;\n message: string;\n failed_req_id?: number;\n };\n};\n\ntype PreparedContract = {\n readonly requestId: string;\n readonly swapId: string;\n readonly amountLamports: number;\n readonly jointPublicKey: Uint8Array;\n readonly depositExpiresAtMs: number;\n readonly coordinatorTimestampMs: number;\n readonly delegatedAtMs: number;\n readonly syncSecret: Uint8Array;\n readonly syncSecretHex: string;\n readonly resumeSecret: Uint8Array;\n readonly resumeSecretHex: string;\n readonly recoveryCodeHex?: string;\n readonly policySnapshot: SpendingPolicySnapshot;\n readonly delegatePolicySnapshot: SpendingPolicySnapshot;\n readonly depositConfirmedPromise: Promise<Envelope>;\n};\n\nlet protocolPromise: Promise<ProtocolModule> | null = null;\nlet frostRuntimePromise: Promise<typeof import(\"../frost/frostRuntime.js\")> | null = null;\n\nfunction loadProtocol(): Promise<ProtocolModule> {\n protocolPromise ??= import(\"protocol/coordinator\") as Promise<ProtocolModule>;\n return protocolPromise;\n}\n\n// @INFO Behind a dynamic import so the inlined FROST wasm stays in its own lazy\n// chunk, fetched only when a swap actually needs DKG.\nfunction loadFrostRuntime(): Promise<typeof import(\"../frost/frostRuntime.js\")> {\n frostRuntimePromise ??= import(\"../frost/frostRuntime.js\");\n return frostRuntimePromise;\n}\n\nfunction loadFrost(): Promise<typeof import(\"frost\")> {\n return loadFrostRuntime().then((runtime) => runtime.loadFrost());\n}\n\nconst BENIGN_TRANSPORT_DROP = Symbol(\"benignTransportDrop\");\nconst ALICE_ID = 1;\nconst COORDINATOR_ID = 2;\nconst SYNC_SECRET_BYTE_LENGTH = 32;\nconst RESUME_SECRET_BYTE_LENGTH = SYNC_SECRET_BYTE_LENGTH;\nconst SYNC_CONTRACT_ID_MISMATCH_MESSAGE =\n \"sync response contract id does not match requested contract\";\nconst DEFAULT_SWAP_STATUS_RECONCILE_INTERVAL_MS = 5_000;\nconst MAX_SWAP_STATUS_RETRY_DELAY_MS = 30_000;\nconst SWAP_STATUS_RETRY_MULTIPLIER = 2;\nconst MAX_EVENT_DEDUP_ENTRIES_PER_KIND = 1_024;\nconst SWAP_STATUS_RETRY_JITTER_RATIO = 0.2;\nconst DEFAULT_REFUND_OUTCOME_POLL_BUDGET_MS = 5 * 60 * 1000;\nconst REFUND_OUTCOME_POLL_INTERVAL_MS = 3_000;\nconst REFUND_OUTCOME_PER_POLL_TIMEOUT_MS = 5_000;\nconst UNBOUND_RECONCILIATION_KEY = \"__unbound__\";\nconst REQUEST_TIMEOUT_MESSAGE = \"coordinator request timed out\";\nconst REFUND_PENDING_FINALIZATION_MESSAGE =\n \"refund accepted and pending finalization; check status again shortly\";\nconst CURRENT_SCHEDULED_PAYOUT_WINDOW_SECONDS = new Set(scheduledPayoutWindowSeconds());\nconst CURRENT_SCHEDULED_PAYOUT_WINDOW_MESSAGE = `scheduled payout_spec.window_seconds must be one of [${scheduledPayoutWindowSeconds().join(\", \")}]`;\nconst TERMINAL_SWAP_STATES = new Set<ClientSwapState>([\"completed\", \"refunded\", \"failed\"]);\n\nexport function createCoordinatorSession(\n options: CoordinatorSessionOptions,\n): CoordinatorSessionHandle {\n return new UserCoordinatorSession(options);\n}\n\nexport function isBenignTransportDrop(err: unknown): boolean {\n return (\n typeof err === \"object\" &&\n err !== null &&\n (err as Record<symbol, unknown>)[BENIGN_TRANSPORT_DROP] === true\n );\n}\n\nexport function readDkgComplete(\n protocol: Pick<ProtocolModule, \"asDkgCompletePayload\">,\n envelope: Envelope,\n): {\n jointPublicKey: Uint8Array;\n depositExpiresAtMs: number;\n coordinatorTimestampMs: number;\n} {\n const payload = protocol.asDkgCompletePayload(envelope);\n return {\n jointPublicKey: payload.joint_pubkey,\n depositExpiresAtMs: payload.deposit_expires_at_ms,\n coordinatorTimestampMs: envelope.timestamp_ms,\n };\n}\n\nfunction tagBenignTransportDrop<T extends Error>(err: T): T {\n (err as unknown as Record<symbol, boolean>)[BENIGN_TRANSPORT_DROP] = true;\n return err;\n}\n\nfunction isBenignTransportDropCandidate(err: Error): boolean {\n return err instanceof TransportError && err.code === \"CONNECTION_LOST\";\n}\n\nclass UserCoordinatorSession implements CoordinatorSessionHandle {\n private readonly coordinator: CoordinatorPoolConfig;\n private readonly createSessionImpl: (options: CreateSessionOptions) => Promise<Session>;\n private readonly closeSessionAfterOperationFailure: boolean;\n private protocol: ProtocolModule | null = null;\n private session: Session | null = null;\n private unsubscribeEnvelope: (() => void) | null = null;\n private unsubscribeTransportState: (() => void) | null = null;\n private swapState: ClientSwapState = \"new\";\n private sessionStatus: SessionStatus = \"idle\";\n private swapId: string | null = null;\n private syncSecret: Uint8Array | null = null;\n private resumeSecret: Uint8Array | null = null;\n private attested = false;\n private readonly pushListeners = new Map<CoordinatorMessageType, PushListener[]>();\n private readonly swapContexts = new Map<string, ClientSwapContext>();\n private openingSession: Promise<void> | null = null;\n private activeOperations = 0;\n private readonly stateListeners = new Set<StateChangeListener>();\n private readonly logListeners = new Set<LogListener>();\n private readonly payoutExecutedListeners = new Set<PayoutExecutedListener>();\n private readonly refundExecutedListeners = new Set<RefundExecutedListener>();\n private readonly normalUserActorSyncListeners = new Set<NormalUserActorSyncListener>();\n private readonly coordinatorErrorListeners = new Set<CoordinatorErrorListener>();\n private readonly emittedPayoutKeys = new Set<string>();\n private readonly emittedRefundKeys = new Set<string>();\n private readonly statusReconciliationStops = new Map<string, () => void>();\n\n constructor(options: CoordinatorSessionOptions, closeSessionAfterRefund = true) {\n this.coordinator = options.coordinator;\n this.createSessionImpl = options.createSession ?? createSession;\n this.closeSessionAfterOperationFailure = closeSessionAfterRefund;\n }\n\n onStateChange(listener: StateChangeListener): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n onLog(listener: LogListener): () => void {\n this.logListeners.add(listener);\n return () => this.logListeners.delete(listener);\n }\n\n onPayoutExecuted(listener: PayoutExecutedListener): () => void {\n this.payoutExecutedListeners.add(listener);\n return () => this.payoutExecutedListeners.delete(listener);\n }\n\n onRefundExecuted(listener: RefundExecutedListener): () => void {\n this.refundExecutedListeners.add(listener);\n return () => this.refundExecutedListeners.delete(listener);\n }\n\n onNormalUserActorSync(listener: NormalUserActorSyncListener): () => void {\n this.normalUserActorSyncListeners.add(listener);\n return () => this.normalUserActorSyncListeners.delete(listener);\n }\n\n onCoordinatorError(listener: CoordinatorErrorListener): () => void {\n this.coordinatorErrorListeners.add(listener);\n return () => this.coordinatorErrorListeners.delete(listener);\n }\n\n get currentSwapState(): ClientSwapState {\n return this.swapState;\n }\n\n get currentSessionStatus(): SessionStatus {\n return this.sessionStatus;\n }\n\n /** @internal The resolved contract id used as the V0 refund request id. */\n get currentSwapId(): string | null {\n return this.swapId;\n }\n\n private beginOperation(): void {\n this.activeOperations += 1;\n if (this.activeOperations === 1) this.setSessionStatus(\"connecting\");\n }\n\n private endOperation(): void {\n this.activeOperations = Math.max(0, this.activeOperations - 1);\n if (this.activeOperations === 0 && this.sessionStatus === \"connecting\") {\n this.setSessionStatus(\"idle\");\n }\n }\n\n private ensureSwapContext(\n swapId: string,\n syncSecret?: Uint8Array,\n resumeSecret?: Uint8Array,\n ): ClientSwapContext {\n let context = this.swapContexts.get(swapId);\n if (!context) {\n context = {\n swapId,\n swapState: this.swapId === swapId ? this.swapState : \"new\",\n syncSecret:\n this.swapId === swapId && this.syncSecret ? new Uint8Array(this.syncSecret) : null,\n resumeSecret:\n this.swapId === swapId && this.resumeSecret ? new Uint8Array(this.resumeSecret) : null,\n bufferDepositConfirmedUntilDelegateAck: false,\n bufferedDepositConfirmed: null,\n };\n this.swapContexts.set(swapId, context);\n }\n if (syncSecret !== undefined) context.syncSecret = new Uint8Array(syncSecret);\n if (resumeSecret !== undefined) context.resumeSecret = new Uint8Array(resumeSecret);\n this.setCurrentContext(context);\n return context;\n }\n\n private setCurrentContext(context: ClientSwapContext): void {\n this.swapId = context.swapId;\n this.swapState = context.swapState;\n this.syncSecret = context.syncSecret ? new Uint8Array(context.syncSecret) : null;\n this.resumeSecret = context.resumeSecret ? new Uint8Array(context.resumeSecret) : null;\n }\n\n private updateContextState(context: ClientSwapContext, state: ClientSwapState): void {\n context.swapState = state;\n if (this.swapId === context.swapId) {\n this.swapState = state;\n }\n this.emitStateChange(context.swapId, state);\n if (TERMINAL_SWAP_STATES.has(state)) {\n this.evictSwapContext(context.swapId);\n }\n }\n\n private evictSwapContext(swapId: string): void {\n this.statusReconciliationStops.get(swapId)?.();\n this.statusReconciliationStops.delete(swapId);\n const context = this.swapContexts.get(swapId);\n if (context) {\n context.syncSecret?.fill(0);\n context.resumeSecret?.fill(0);\n context.bufferedDepositConfirmed = null;\n context.bufferDepositConfirmedUntilDelegateAck = false;\n this.swapContexts.delete(swapId);\n }\n if (this.swapId === swapId) {\n this.syncSecret?.fill(0);\n this.resumeSecret?.fill(0);\n this.syncSecret = null;\n this.resumeSecret = null;\n }\n }\n\n private clearSwapContexts(): void {\n for (const swapId of this.swapContexts.keys()) this.evictSwapContext(swapId);\n this.swapContexts.clear();\n this.emittedPayoutKeys.clear();\n this.emittedRefundKeys.clear();\n }\n\n async runSwap(params: RunSwapParams): Promise<SwapResult> {\n assertCurrentUserPayoutSpecRuntimeLimits(params.payoutSpec);\n this.beginOperation();\n\n let completed = false;\n let terminalStatus: \"done\" | \"failed\" | null = null;\n try {\n await ensureFrostWasm();\n await this.openSession();\n this.setSessionStatus(\"running\");\n const result = await this.runProtocol(params);\n completed = true;\n terminalStatus = \"done\";\n return result;\n } catch (err) {\n const error = this.normalizeSessionError(err);\n if (!isBenignTransportDrop(error)) {\n terminalStatus = \"failed\";\n }\n throw error;\n } finally {\n this.endOperation();\n if (this.activeOperations === 0 && terminalStatus !== null) {\n this.setSessionStatus(terminalStatus);\n }\n if (!completed && this.activeOperations === 0 && this.closeSessionAfterOperationFailure) {\n this.close();\n }\n }\n }\n\n async contractRequest(params: ContractRequestParams): Promise<ContractRequestResult> {\n assertCurrentUserPayoutSpecRuntimeLimits(params.payoutSpec);\n this.beginOperation();\n\n let completed = false;\n let terminalStatus: \"done\" | \"failed\" | null = null;\n try {\n await ensureFrostWasm();\n await this.openSession();\n this.setSessionStatus(\"running\");\n const prepared = await this.prepareContract(params);\n completed = true;\n terminalStatus = \"done\";\n return toContractRequestResult(prepared);\n } catch (err) {\n const error = this.normalizeSessionError(err);\n terminalStatus = \"failed\";\n throw error;\n } finally {\n this.endOperation();\n if (this.activeOperations === 0 && terminalStatus !== null) {\n this.setSessionStatus(terminalStatus);\n }\n if (!completed && this.activeOperations === 0 && this.closeSessionAfterOperationFailure) {\n this.close();\n }\n }\n }\n\n async resumePreDelegation(params: ResumePreDelegationParams): Promise<ResumePreDelegationResult> {\n if (!params.policySnapshot) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"policySnapshot is required to resume pre-delegation\",\n );\n }\n if (params.recoveryCommitment.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `recoveryCommitment must be ${SYNC_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n this.beginOperation();\n let completed = false;\n let terminalStatus: \"done\" | \"failed\" | null = null;\n try {\n await ensureFrostWasm();\n this.restoreSwapContext({\n swapId: params.swapId,\n syncSecret: params.syncSecret,\n resumeSecret: params.resumeSecret,\n });\n await this.openSession();\n this.setSessionStatus(\"running\");\n const context = this.ensureSwapContext(params.swapId);\n context.swapState = params.delegateShare ? \"awaiting_deposit\" : \"awaiting_dkg\";\n this.setCurrentContext(context);\n let jointPublicKey: Uint8Array | undefined;\n let depositExpiresAtMs: number | undefined;\n let coordinatorTimestampMs: number | undefined;\n let delegateShare: Uint8Array<ArrayBufferLike> | undefined = params.delegateShare\n ? new Uint8Array(params.delegateShare)\n : undefined;\n if (!delegateShare) {\n const dkg = await this.runDkg(context, params.onDelegateShareReady);\n jointPublicKey = dkg.jointPublicKey;\n depositExpiresAtMs = dkg.depositExpiresAtMs;\n coordinatorTimestampMs = dkg.coordinatorTimestampMs;\n delegateShare = dkg.keyHandle.secretShareBytes();\n this.updateContextState(context, \"awaiting_deposit\");\n }\n const delegateAckPromise = this.awaitPush(CoordinatorMessageType.DelegateAck, context.swapId);\n let delegateResp: Envelope;\n try {\n delegateResp = await this.request(\n CoordinatorMessageType.DelegateShare,\n {\n share: delegateShare,\n recovery_commitment: new Uint8Array(params.recoveryCommitment),\n resume_secret: context.resumeSecret,\n },\n { swapId: context.swapId },\n );\n } catch (err) {\n void delegateAckPromise.catch(() => undefined);\n throw err;\n }\n const delegatedAtMs =\n this.requireProtocol().asDelegateShareResponsePayload(delegateResp).delegated_at_ms;\n const delegateAck = this.requireProtocol().asDelegateAckPayload(await delegateAckPromise);\n if (delegateAck.delegated_at_ms !== delegatedAtMs) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DelegateAck delegated_at_ms does not match DelegateShare response\",\n );\n }\n if (!spendingPoliciesEqual(delegateAck.spending_policy, params.policySnapshot)) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DelegateAck spending_policy does not match persisted policy_snapshot\",\n );\n }\n context.bufferDepositConfirmedUntilDelegateAck = false;\n this.updateContextState(context, \"awaiting_deposit\");\n completed = true;\n terminalStatus = \"done\";\n return {\n swapId: context.swapId,\n jointPublicKey,\n depositExpiresAtMs,\n coordinatorTimestampMs,\n delegatedAtMs,\n };\n } catch (err) {\n terminalStatus = \"failed\";\n throw this.normalizeSessionError(err);\n } finally {\n if (!completed) this.cancelPushWaitersForSwap(params.swapId);\n this.endOperation();\n if (this.activeOperations === 0 && terminalStatus !== null) {\n this.setSessionStatus(terminalStatus);\n }\n }\n }\n\n /** @internal Used by the functional Session API without closing its caller-owned session. */\n releaseWithoutClosing(): void {\n this.stopAllStatusReconciliations();\n this.clearSwapContexts();\n this.detachSession(\n new TransportError(\"CONNECTION_LOST\", \"coordinator session operation released\"),\n false,\n false,\n );\n }\n\n close(): void {\n this.stopAllStatusReconciliations();\n this.clearSwapContexts();\n this.detachSession(new TransportError(\"CONNECTION_LOST\", \"coordinator session closed\"), true);\n }\n\n private stopAllStatusReconciliations(): void {\n for (const stop of [...this.statusReconciliationStops.values()]) stop();\n this.statusReconciliationStops.clear();\n }\n\n restoreSwapContext(params: {\n swapId: string;\n syncSecret?: Uint8Array;\n resumeSecret?: Uint8Array;\n }): void {\n if (params.syncSecret !== undefined) {\n if (params.syncSecret.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `syncSecret must be ${SYNC_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n }\n if (params.resumeSecret !== undefined) {\n if (params.resumeSecret.length !== RESUME_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `resumeSecret must be ${RESUME_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n }\n this.ensureSwapContext(params.swapId, params.syncSecret, params.resumeSecret);\n }\n\n async requestSwapStatus(timeoutMs?: number): Promise<SyncUserResponsePayload> {\n if (!this.swapId) {\n throw new CommandError(\"REJECTED_STATE\", \"Sync requires swapId\");\n }\n const context = this.ensureSwapContext(this.swapId, this.syncSecret ?? undefined);\n return this.requestSwapStatusForContext(context, timeoutMs);\n }\n\n private async requestSwapStatusForContext(\n context: ClientSwapContext,\n timeoutMs?: number,\n ): Promise<SyncUserResponsePayload> {\n await this.openSession();\n\n const env = await this.request(\n CoordinatorMessageType.Sync,\n {\n actor: \"user\",\n ...(context.syncSecret ? { sync_secret: context.syncSecret } : {}),\n },\n {\n swapId: context.swapId,\n timeoutMs,\n rejectMatchingOutOfBandErrors: true,\n },\n );\n const status = this.requireProtocol().asSyncUserResponsePayload(env);\n this.applySwapStatus(context, status, env.timestamp_ms);\n return status;\n }\n\n startSwapStatusReconciliation(\n intervalMs = DEFAULT_SWAP_STATUS_RECONCILE_INTERVAL_MS,\n ): () => void {\n const reconciliationContext = this.swapId\n ? this.ensureSwapContext(this.swapId, this.syncSecret ?? undefined)\n : null;\n const reconciliationKey = reconciliationContext?.swapId ?? UNBOUND_RECONCILIATION_KEY;\n this.statusReconciliationStops.get(reconciliationKey)?.();\n\n let stopped = false;\n let reconciling = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const browserWindow = typeof window === \"undefined\" ? null : window;\n const browserDocument = typeof document === \"undefined\" ? null : document;\n const retryBackoff = createExponentialBackoff({\n initialDelayMs: intervalMs,\n maxDelayMs: Math.max(MAX_SWAP_STATUS_RETRY_DELAY_MS, intervalMs),\n multiplier: SWAP_STATUS_RETRY_MULTIPLIER,\n jitterRatio: SWAP_STATUS_RETRY_JITTER_RATIO,\n });\n\n const isVisible = () =>\n browserDocument === null || browserDocument.visibilityState === \"visible\";\n\n const schedule = (delayMs: number) => {\n if (stopped || !isVisible()) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n void reconcile();\n }, delayMs);\n };\n\n const reconcile = async () => {\n if (stopped || reconciling || !isVisible()) return;\n reconciling = true;\n try {\n const status = reconciliationContext\n ? await this.requestSwapStatusForContext(reconciliationContext)\n : await this.requestSwapStatus();\n retryBackoff.reset();\n if (\n status.state === \"completed\" ||\n status.state === \"refunded\" ||\n status.state === \"failed\"\n ) {\n stopReconciliation();\n } else {\n schedule(intervalMs);\n }\n } catch (err) {\n this.log(`SwapStatus reconcile failed: ${normalizeError(err)}`, \"info\");\n if (!isRetryableSwapStatusReconciliationError(err)) {\n stopReconciliation();\n // A command rejection belongs to this swap. Keep sibling swap\n // reconciliation loops and their shared transport alive. An\n // attestation failure invalidates the shared channel and remains\n // session-wide.\n if (err instanceof AttestationError) this.close();\n return;\n }\n schedule(retryBackoff.nextDelayMs());\n } finally {\n reconciling = false;\n }\n };\n\n const reconcileWhenVisible = () => {\n if (!isVisible()) return;\n if (timer) clearTimeout(timer);\n timer = null;\n void reconcile();\n };\n\n const pauseWhileInactive = () => {\n if (timer) clearTimeout(timer);\n timer = null;\n };\n\n const handleVisibilityChange = () => {\n if (!isVisible()) {\n pauseWhileInactive();\n return;\n }\n reconcileWhenVisible();\n };\n\n const handleFreeze = () => {\n pauseWhileInactive();\n this.detachSession(new TransportError(\"CONNECTION_LOST\", \"coordinator page frozen\"), true);\n };\n\n browserWindow?.addEventListener(\"focus\", reconcileWhenVisible);\n browserWindow?.addEventListener(\"online\", reconcileWhenVisible);\n browserWindow?.addEventListener(\"pageshow\", reconcileWhenVisible);\n browserDocument?.addEventListener(\"visibilitychange\", handleVisibilityChange);\n browserDocument?.addEventListener(\"freeze\", handleFreeze);\n browserDocument?.addEventListener(\"resume\", reconcileWhenVisible);\n reconcileWhenVisible();\n\n const stopReconciliation = () => {\n if (stopped) return;\n stopped = true;\n if (timer) clearTimeout(timer);\n browserWindow?.removeEventListener(\"focus\", reconcileWhenVisible);\n browserWindow?.removeEventListener(\"online\", reconcileWhenVisible);\n browserWindow?.removeEventListener(\"pageshow\", reconcileWhenVisible);\n browserDocument?.removeEventListener(\"visibilitychange\", handleVisibilityChange);\n browserDocument?.removeEventListener(\"freeze\", handleFreeze);\n browserDocument?.removeEventListener(\"resume\", reconcileWhenVisible);\n if (this.statusReconciliationStops.get(reconciliationKey) === stopReconciliation) {\n this.statusReconciliationStops.delete(reconciliationKey);\n }\n };\n this.statusReconciliationStops.set(reconciliationKey, stopReconciliation);\n return stopReconciliation;\n }\n\n async requestRefund(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundExecutedPayload> {\n const result = await this.requestRefundIntentInternal(params, { waitForFinality: true });\n if (result.kind === \"executed\") return result.refund;\n throw new CommandError(\"REJECTED_STALE_JOB\", \"refund accepted without final execution\");\n }\n\n requestRefundIntent(params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n }): Promise<RefundIntentResult> {\n return this.requestRefundIntentInternal(params, { waitForFinality: false });\n }\n\n private async requestRefundIntentInternal(\n params: {\n swapId?: string;\n syncSecret?: Uint8Array;\n recoveryCode: Uint8Array;\n timeoutMs?: number;\n },\n options: { waitForFinality: boolean },\n ): Promise<RefundIntentResult> {\n assertRecoveryCode(params.recoveryCode);\n this.beginOperation();\n const recoveryCode = new Uint8Array(params.recoveryCode);\n const ackTimeout = params.timeoutMs ?? 30_000;\n let requestSwapId: string | null = params.swapId ?? null;\n let openedForRefund = false;\n try {\n if (params.syncSecret !== undefined) {\n const swapId = params.swapId ?? this.swapId;\n if (!swapId) {\n throw new CommandError(\"REJECTED_STATE\", \"syncSecret requires swapId\");\n }\n this.restoreSwapContext({ swapId, syncSecret: params.syncSecret });\n requestSwapId = swapId;\n } else if (params.swapId) {\n const swapId = params.swapId;\n this.restoreSwapContext({ swapId });\n requestSwapId = swapId;\n }\n\n openedForRefund = !this.hasUsableSession();\n await this.openSession();\n\n let env: Envelope;\n try {\n env = await this.request(\n CoordinatorMessageType.WithdrawRequest,\n {\n recovery_code: recoveryCode,\n },\n { swapId: requestSwapId, timeoutMs: ackTimeout },\n );\n } catch (err) {\n if (isRequestTimeoutError(err)) {\n throw new CommandError(\n \"REJECTED_STALE_JOB\",\n `WithdrawRequest acknowledgement timed out after ${ackTimeout}ms`,\n );\n }\n throw err;\n }\n if (env.type === CoordinatorMessageType.WithdrawExecuted) {\n const resolvedSwapId = env.swap_id ?? requestSwapId;\n const resolvedContext = resolvedSwapId ? this.ensureSwapContext(resolvedSwapId) : null;\n if (resolvedContext) this.setCurrentContext(resolvedContext);\n return { kind: \"executed\", refund: this.requireProtocol().asWithdrawExecutedPayload(env) };\n }\n if (env.type !== CoordinatorMessageType.WithdrawAccepted) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `Expected WithdrawAccepted or WithdrawExecuted response, got ${env.type}`,\n );\n }\n const accepted = this.requireProtocol().asWithdrawAcceptedPayload(env);\n const resolvedSwapId = env.swap_id ?? requestSwapId;\n const resolvedContext = resolvedSwapId ? this.ensureSwapContext(resolvedSwapId) : null;\n if (!options.waitForFinality) {\n return { kind: \"accepted\", accepted };\n }\n if (!resolvedContext) {\n throw new CommandError(\"REJECTED_STALE_JOB\", REFUND_PENDING_FINALIZATION_MESSAGE);\n }\n if (!resolvedContext.syncSecret) {\n throw new CommandError(\"REJECTED_STALE_JOB\", REFUND_PENDING_FINALIZATION_MESSAGE);\n }\n this.setCurrentContext(resolvedContext);\n return {\n kind: \"executed\",\n refund: await this.awaitRefundOutcomeFromSwapStatus(resolvedContext),\n };\n } finally {\n recoveryCode.fill(0);\n this.endOperation();\n if (\n openedForRefund &&\n this.closeSessionAfterOperationFailure &&\n this.activeOperations === 0\n ) {\n this.close();\n }\n }\n }\n\n private async awaitRefundOutcomeFromSwapStatus(\n context: ClientSwapContext,\n ): Promise<RefundExecutedPayload> {\n const deadline = Date.now() + DEFAULT_REFUND_OUTCOME_POLL_BUDGET_MS;\n for (;;) {\n const perPollTimeout = Math.min(\n REFUND_OUTCOME_PER_POLL_TIMEOUT_MS,\n Math.max(0, deadline - Date.now()),\n );\n try {\n const status = await this.requestSwapStatusForContext(context, perPollTimeout);\n if (status.withdraw_execution) {\n return status.withdraw_execution;\n }\n } catch (err) {\n if (!isRequestTimeoutError(err)) {\n throw err;\n }\n }\n if (Date.now() >= deadline) {\n throw new CommandError(\"REJECTED_STALE_JOB\", REFUND_PENDING_FINALIZATION_MESSAGE);\n }\n await delay(REFUND_OUTCOME_POLL_INTERVAL_MS);\n }\n }\n\n private async runProtocol(params: RunSwapParams): Promise<SwapResult> {\n const protocol = this.requireProtocol();\n const prepared = await this.prepareContract(params);\n const depositEnv = await prepared.depositConfirmedPromise;\n const depositPayload = protocol.asDepositConfirmedPayload(depositEnv);\n if (depositPayload.amount_lamports !== params.amountLamports) {\n throw new InvalidDepositAmountError(\n BigInt(depositPayload.amount_lamports),\n BigInt(params.amountLamports),\n );\n }\n this.log(\n `deposit confirmed tx=${depositPayload.tx_signature} amount=${depositPayload.amount_lamports}`,\n \"in\",\n );\n\n await params.onDepositConfirmed?.({ originAddress: depositPayload.origin_address });\n const context = this.swapContexts.get(prepared.swapId);\n if (!context) {\n throw new CommandError(\"REJECTED_STATE\", `missing client context for ${prepared.swapId}`);\n }\n await this.requestSwapStatusForContext(context);\n\n return {\n swapId: prepared.swapId,\n jointPublicKey: prepared.jointPublicKey,\n depositTxSignature: depositPayload.tx_signature,\n depositObservedAtMs: depositPayload.observed_at_ms,\n delegatedAtMs: prepared.delegatedAtMs,\n resumeSecret: new Uint8Array(prepared.resumeSecret),\n resumeSecretHex: prepared.resumeSecretHex,\n recoveryCodeHex: prepared.recoveryCodeHex,\n policySnapshot: prepared.policySnapshot,\n delegatePolicySnapshot: prepared.delegatePolicySnapshot,\n };\n }\n\n private async prepareContract(params: ContractRequestParams): Promise<PreparedContract> {\n const protocol = this.requireProtocol();\n const requestedPayoutWindowMs =\n params.payoutWindowMs ?? payoutWindowMsFromSpec(params.payoutSpec);\n const payoutDeadlineMs =\n requestedPayoutWindowMs !== undefined ? Date.now() + requestedPayoutWindowMs : undefined;\n let generatedSyncSecret: Uint8Array | null = null;\n let generatedResumeSecret: Uint8Array | null = null;\n const syncSecret = params.syncSecret\n ? new Uint8Array(params.syncSecret)\n : (() => {\n generatedSyncSecret = randomSecret32();\n return generatedSyncSecret;\n })();\n if (syncSecret.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `syncSecret must be ${SYNC_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n const syncSecretHex = bytesToHex(syncSecret);\n const syncCommitment = await sha256Commitment(syncSecret);\n if (generatedSyncSecret) {\n await params.onSyncSecretReady?.({ secretHex: syncSecretHex });\n }\n const resumeSecret = params.resumeSecret\n ? new Uint8Array(params.resumeSecret)\n : (() => {\n generatedResumeSecret = randomSecret32();\n return generatedResumeSecret;\n })();\n if (resumeSecret.length !== RESUME_SECRET_BYTE_LENGTH) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n `resumeSecret must be ${RESUME_SECRET_BYTE_LENGTH} bytes`,\n );\n }\n const resumeSecretHex = bytesToHex(resumeSecret);\n const resumeCommitment = await sha256Commitment(resumeSecret);\n if (generatedResumeSecret) {\n await params.onResumeSecretReady?.({ secretHex: resumeSecretHex });\n }\n\n const swapResp = await this.request(\n CoordinatorMessageType.ContractRequest,\n {\n actor: \"user\",\n amount_lamports: params.amountLamports,\n payout_spec: params.payoutSpec,\n sync_commitment: syncCommitment,\n resume_commitment: resumeCommitment,\n ...((params.payoutDeadlineMs !== undefined || payoutDeadlineMs !== undefined) && {\n payout_deadline_ms: params.payoutDeadlineMs ?? payoutDeadlineMs,\n }),\n },\n { swapId: null, requireNonNullResponseSwapId: true },\n );\n const swapPayload = protocol.asSwapRequestResponsePayload(swapResp);\n const swapId = swapPayload.swap_id;\n const context: ClientSwapContext = {\n swapId,\n swapState: \"awaiting_dkg\",\n syncSecret: new Uint8Array(syncSecret),\n resumeSecret: new Uint8Array(resumeSecret),\n bufferDepositConfirmedUntilDelegateAck: true,\n bufferedDepositConfirmed: null,\n };\n this.swapContexts.set(swapId, context);\n this.setCurrentContext(context);\n await params.onSwapAllocated?.({\n swapId,\n syncSecretHex,\n resumeSecretHex,\n });\n params.onPolicySnapshot?.(swapPayload.policy_snapshot);\n this.log(`swap accepted - id=${swapId}`, \"in\");\n\n let preparedSuccessfully = false;\n try {\n const depositConfirmedPromise = this.awaitPush(\n CoordinatorMessageType.DepositConfirmed,\n context.swapId,\n null,\n );\n void depositConfirmedPromise.catch(() => undefined);\n const { jointPublicKey, keyHandle, depositExpiresAtMs, coordinatorTimestampMs } =\n await this.runDkg(context, params.delegateShare ? undefined : params.onDelegateShareReady);\n this.updateContextState(context, \"awaiting_deposit\");\n\n let recoveryCommitment = params.recoveryCommitment;\n let recoveryCodeHex: string | undefined;\n if (!recoveryCommitment) {\n const generated = await generateRecoveryCode();\n recoveryCommitment = generated.commitment;\n try {\n recoveryCodeHex = recoveryCodeToHex(generated.code);\n await params.onRecoveryCodeReady?.({ codeHex: recoveryCodeHex });\n } finally {\n generated.code.fill(0);\n }\n }\n\n const delegateAckPromise = this.awaitPush(CoordinatorMessageType.DelegateAck, context.swapId);\n const share = params.delegateShare ?? keyHandle.secretShareBytes();\n let delegateResp: Envelope;\n try {\n delegateResp = await this.request(\n CoordinatorMessageType.DelegateShare,\n {\n share,\n recovery_commitment: recoveryCommitment,\n resume_secret: context.resumeSecret,\n },\n { swapId: context.swapId },\n );\n } catch (err) {\n void delegateAckPromise.catch(() => undefined);\n throw err;\n }\n const delegatePayload = protocol.asDelegateShareResponsePayload(delegateResp);\n const delegateAck = protocol.asDelegateAckPayload(await delegateAckPromise);\n\n if (delegateAck.delegated_at_ms !== delegatePayload.delegated_at_ms) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DelegateAck delegated_at_ms does not match DelegateShare response\",\n );\n }\n if (!spendingPoliciesEqual(delegateAck.spending_policy, swapPayload.policy_snapshot)) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DelegateAck spending_policy does not match ContractRequest policy_snapshot\",\n );\n }\n\n this.log(`delegated at ${delegateAck.delegated_at_ms}`, \"in\");\n this.releaseDepositConfirmedGate(context);\n\n await params.onDepositAddressReady?.({\n swapId,\n jointPublicKey,\n amountLamports: params.amountLamports,\n depositExpiresAtMs,\n coordinatorTimestampMs,\n });\n\n preparedSuccessfully = true;\n return {\n requestId: swapId,\n swapId,\n amountLamports: params.amountLamports,\n jointPublicKey,\n depositExpiresAtMs,\n coordinatorTimestampMs,\n delegatedAtMs: delegateAck.delegated_at_ms,\n syncSecret,\n syncSecretHex,\n resumeSecret,\n resumeSecretHex,\n recoveryCodeHex,\n policySnapshot: swapPayload.policy_snapshot,\n delegatePolicySnapshot: delegateAck.spending_policy,\n depositConfirmedPromise,\n };\n } finally {\n if (!preparedSuccessfully) {\n this.cancelPushWaitersForSwap(context.swapId);\n }\n }\n }\n\n private async runDkg(\n context: ClientSwapContext,\n onDelegateShareReady?: RunSwapParams[\"onDelegateShareReady\"],\n ): Promise<{\n jointPublicKey: Uint8Array;\n keyHandle: DkgKeyPackageHandle;\n depositExpiresAtMs: number;\n coordinatorTimestampMs: number;\n }> {\n await ensureFrostWasm();\n const protocol = this.requireProtocol();\n const { dkgRound1 } = await loadFrost();\n await this.request(\n CoordinatorMessageType.DkgInit,\n { resume_secret: context.resumeSecret },\n { swapId: context.swapId },\n );\n this.log(\"DKG initialised\", \"info\");\n\n const aliceRound1State = dkgRound1(ALICE_ID);\n const aliceRound1Bytes = aliceRound1State.round1PackageBytes();\n const round1Resp = await this.request(\n CoordinatorMessageType.DkgRound1,\n {\n package: aliceRound1Bytes,\n resume_secret: context.resumeSecret,\n },\n { swapId: context.swapId },\n );\n const round1Payload = protocol.asDkgRound1ResponsePayload(round1Resp);\n this.log(`DKG round1 complete - coord pkg ${round1Payload.package.byteLength}B`, \"in\");\n\n const aliceRound2State = aliceRound1State.intoRound2(COORDINATOR_ID, round1Payload.package);\n const aliceRound2Bytes = aliceRound2State.round2PackageBytesFor(COORDINATOR_ID);\n let aliceKeyHandle: DkgKeyPackageHandle;\n try {\n aliceKeyHandle = aliceRound2State.intoRound3(\n COORDINATOR_ID,\n round1Payload.package,\n round1Payload.round2_for_alice,\n );\n } catch (err) {\n throw new CommandError(\"REJECTED_GUARD\", `Alice DKG finalize failed: ${normalizeError(err)}`);\n }\n\n await onDelegateShareReady?.({\n swapId: context.swapId,\n delegateShare: new Uint8Array(aliceKeyHandle.secretShareBytes()),\n });\n\n const dkgCompletePromise = this.awaitPush(CoordinatorMessageType.DkgComplete, context.swapId);\n void dkgCompletePromise.catch(() => undefined);\n await this.request(\n CoordinatorMessageType.DkgRound2,\n {\n package: aliceRound2Bytes,\n resume_secret: context.resumeSecret,\n },\n { swapId: context.swapId },\n );\n const completeEnvelope = await dkgCompletePromise;\n const complete = readDkgComplete(protocol, completeEnvelope);\n const alicePubkey = aliceKeyHandle.groupPublicKeyBytes();\n if (!bytesEqual(alicePubkey, complete.jointPublicKey)) {\n throw new CommandError(\n \"REJECTED_GUARD\",\n \"DKG joint public key mismatch between Alice and coordinator\",\n );\n }\n\n const pubkeyHexPrefix = Array.from(alicePubkey.slice(0, 8))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n this.log(`DKG complete - joint pubkey ${pubkeyHexPrefix}`, \"info\");\n\n return {\n jointPublicKey: alicePubkey,\n keyHandle: aliceKeyHandle,\n depositExpiresAtMs: complete.depositExpiresAtMs,\n coordinatorTimestampMs: complete.coordinatorTimestampMs,\n };\n }\n\n private async openSession(): Promise<void> {\n if (this.hasUsableSession()) return;\n if (this.openingSession !== null) {\n await this.openingSession;\n return;\n }\n const opening = this.openSessionOnce();\n this.openingSession = opening;\n try {\n await opening;\n } finally {\n if (this.openingSession === opening) this.openingSession = null;\n }\n }\n\n private async openSessionOnce(): Promise<void> {\n if (this.hasUsableSession()) return;\n if (this.session !== null) {\n this.detachSession(\n new TransportError(\"CONNECTION_LOST\", \"cached coordinator session is not usable\"),\n true,\n );\n }\n this.protocol = await loadProtocol();\n const session = await this.createSessionImpl({ coordinator: this.coordinator });\n this.session = session;\n this.attested = true;\n this.unsubscribeEnvelope = onEnvelope(session, (envelope) => this.handleEnvelope(envelope));\n this.unsubscribeTransportState = getSessionState(session).transport.onStateChange((state) => {\n if (this.session !== session) return;\n if (state === \"closing\" || state === \"closed\") {\n const fatalError = getSessionState(session).lastFatalError;\n this.detachSession(\n fatalError ?? new TransportError(\"CONNECTION_LOST\", \"coordinator transport closed\"),\n false,\n );\n }\n });\n this.log(`connected to ${this.coordinator.endpoints[0]?.wsUrl ?? \"coordinator\"}`, \"info\");\n this.log(\"attestation verified\", \"info\");\n }\n\n private hasUsableSession(): boolean {\n if (this.session === null) return false;\n const state = getSessionState(this.session);\n return state.attested && state.channel !== null && state.transport.state() === \"open\";\n }\n\n private detachSession(error: Error, closeTransport: boolean, closeProtocolRuntime = true): void {\n const rejectionError =\n this.attested && !closeTransport && isBenignTransportDropCandidate(error)\n ? tagBenignTransportDrop(error)\n : error;\n this.unsubscribeEnvelope?.();\n this.unsubscribeEnvelope = null;\n this.unsubscribeTransportState?.();\n this.unsubscribeTransportState = null;\n\n const session = this.session;\n this.session = null;\n this.attested = false;\n\n if (session !== null) {\n if (closeProtocolRuntime) closeSessionProtocolRuntime(session);\n if (closeTransport) {\n getSessionState(session).close();\n }\n }\n\n this.rejectAllPushListeners(rejectionError);\n }\n\n private handleEnvelope(env: Envelope): void {\n const protocol = this.requireProtocol();\n this.log(`<- ${env.type} kind=${env.kind}`, \"in\");\n const context = env.swap_id ? (this.swapContexts.get(env.swap_id) ?? null) : null;\n if (env.swap_id === null && env.kind !== EnvelopeKind.ERROR) {\n this.log(`ignored ${env.type} without an explicit swap_id`, \"info\");\n return;\n }\n if (env.swap_id !== null && context === null) {\n this.log(`ignored ${env.type} for unknown swap ${env.swap_id}`, \"info\");\n return;\n }\n const payoutExecuted =\n env.kind === EnvelopeKind.PUSH && env.type === CoordinatorMessageType.PayoutExecuted\n ? protocol.asPayoutExecutedPayload(env)\n : null;\n const payoutMatchesCurrentSwap = payoutExecuted !== null && context !== null;\n const refundExecuted =\n env.kind === EnvelopeKind.PUSH && env.type === CoordinatorMessageType.WithdrawExecuted\n ? protocol.asWithdrawExecutedPayload(env)\n : null;\n\n if (this.shouldBufferDepositConfirmed(env)) {\n this.bufferDepositConfirmed(env);\n return;\n }\n\n const stateForEnvelope = context?.swapState ?? this.swapState;\n const next =\n payoutExecuted !== null && !payoutMatchesCurrentSwap\n ? null\n : protocol.nextState(\n stateForEnvelope,\n env.kind,\n env.type,\n payoutExecuted ? { payoutFinal: payoutExecuted.final } : undefined,\n );\n\n if (env.kind === EnvelopeKind.PUSH && next === null) {\n this.log(\n `ignored ${env.type} for swap ${env.swap_id ?? \"null\"} while client context is ${\n context?.swapId ?? \"none\"\n } in state ${stateForEnvelope}`,\n \"info\",\n );\n return;\n }\n\n if (next !== null) {\n if (context) {\n this.updateContextState(context, next);\n } else {\n this.swapState = next;\n this.emitStateChange(this.swapId, next);\n }\n }\n\n if (env.kind === EnvelopeKind.ERROR) {\n const coordinatorError = coordinatorErrorFromEnvelope(protocol, env);\n if (env.req_id === 0) {\n for (const listener of this.coordinatorErrorListeners) {\n listener(coordinatorError);\n }\n }\n return;\n }\n\n if (env.kind === EnvelopeKind.PUSH) {\n if (payoutExecuted && payoutMatchesCurrentSwap && context) {\n this.emitPayoutExecuted(payoutExecuted, context.swapId);\n }\n if (refundExecuted && context) {\n this.emitRefundExecuted(refundExecuted, context.swapId);\n }\n this.resolvePushListener(env);\n }\n }\n\n private applySwapStatus(\n context: ClientSwapContext,\n status: SyncUserResponsePayload,\n coordinatorTimestampMs: number,\n ): void {\n const keepTerminalState =\n TERMINAL_SWAP_STATES.has(context.swapState) && status.state !== context.swapState;\n if (!keepTerminalState && context.swapState !== status.state) {\n this.updateContextState(context, status.state);\n }\n for (const fragment of status.fragments_executed) {\n this.emitPayoutExecuted(fragment, context.swapId);\n }\n if (status.withdraw_execution) {\n this.emitRefundExecuted(status.withdraw_execution, context.swapId);\n }\n if (status.actor_sync !== undefined) {\n for (const listener of this.normalUserActorSyncListeners) {\n listener(status.actor_sync, coordinatorTimestampMs);\n }\n }\n }\n\n private emitPayoutExecuted(payload: PayoutExecutedPayload, swapId: string | null): void {\n if (!swapId) return;\n const key = `${swapId}:${payload.index}:${payload.tx_signature}`;\n if (!this.rememberEventKey(this.emittedPayoutKeys, key)) return;\n\n this.log(\n `payout executed tx=${payload.tx_signature} amount=${payload.amount_lamports} final=${payload.final}`,\n \"in\",\n );\n for (const listener of this.payoutExecutedListeners) {\n listener(payload, swapId);\n }\n }\n\n private emitRefundExecuted(payload: RefundExecutedPayload, swapId: string | null): void {\n if (!swapId) return;\n const key = `${swapId}:${payload.tx_signature}`;\n if (!this.rememberEventKey(this.emittedRefundKeys, key)) return;\n\n this.log(`refund executed tx=${payload.tx_signature} amount=${payload.amount_lamports}`, \"in\");\n for (const listener of this.refundExecutedListeners) {\n listener(payload, swapId);\n }\n }\n\n private rememberEventKey(keys: Set<string>, key: string): boolean {\n if (keys.has(key)) return false;\n keys.add(key);\n if (keys.size > MAX_EVENT_DEDUP_ENTRIES_PER_KIND) {\n const oldest = keys.values().next().value as string | undefined;\n if (oldest !== undefined) keys.delete(oldest);\n }\n return true;\n }\n\n private request(\n type: CoordinatorMessageType,\n payload: unknown,\n options: {\n swapId?: string | null;\n timeoutMs?: number;\n rejectMatchingOutOfBandErrors?: boolean;\n requireNonNullResponseSwapId?: boolean;\n } = {},\n ): Promise<Envelope> {\n if (this.session === null) {\n throw new TransportError(\"CONNECTION_LOST\", \"coordinator session is not connected\");\n }\n return requestEnvelope(this.session, type, payload, {\n swapId: options.swapId === undefined ? this.swapId : options.swapId,\n timeoutMs: options.timeoutMs,\n rejectMatchingOutOfBandErrors: options.rejectMatchingOutOfBandErrors,\n requireNonNullResponseSwapId: options.requireNonNullResponseSwapId,\n onLog: (message, direction) => this.log(message, direction),\n });\n }\n\n private awaitPush(\n type: CoordinatorMessageType,\n swapId?: string | null,\n timeoutMs: number | null = 30_000,\n ): Promise<Envelope> {\n return new Promise((resolve, reject) => {\n const timer =\n timeoutMs === null\n ? null\n : setTimeout(() => {\n this.removePushListener(type, listener);\n reject(new CommandError(\"REJECTED_STALE_JOB\", `timed out waiting for ${type} push`));\n }, timeoutMs);\n const listener: PushListener = { swapId, resolve, reject, timer };\n const listeners = this.pushListeners.get(type) ?? [];\n listeners.push(listener);\n this.pushListeners.set(type, listeners);\n });\n }\n\n private rejectAllPushListeners(err: Error): void {\n for (const listeners of this.pushListeners.values()) {\n for (const listener of listeners) {\n if (listener.timer) clearTimeout(listener.timer);\n listener.reject(err);\n }\n }\n this.pushListeners.clear();\n for (const context of this.swapContexts.values()) {\n context.bufferDepositConfirmedUntilDelegateAck = false;\n context.bufferedDepositConfirmed = null;\n }\n }\n\n private shouldBufferDepositConfirmed(env: Envelope): boolean {\n const context = env.swap_id ? this.swapContexts.get(env.swap_id) : null;\n return (\n env.kind === EnvelopeKind.PUSH &&\n env.type === CoordinatorMessageType.DepositConfirmed &&\n context?.bufferDepositConfirmedUntilDelegateAck === true\n );\n }\n\n private bufferDepositConfirmed(env: Envelope): void {\n const context = env.swap_id ? this.swapContexts.get(env.swap_id) : null;\n if (!context) return;\n if (!context.bufferedDepositConfirmed) {\n context.bufferedDepositConfirmed = env;\n this.clearPushListenerTimer(CoordinatorMessageType.DepositConfirmed, context.swapId);\n this.log(\"buffered DepositConfirmed until DelegateAck is verified\", \"info\");\n return;\n }\n this.log(\"ignored duplicate DepositConfirmed while waiting for DelegateAck\", \"info\");\n }\n\n private releaseDepositConfirmedGate(context: ClientSwapContext): void {\n const protocol = this.requireProtocol();\n context.bufferDepositConfirmedUntilDelegateAck = false;\n const buffered = context.bufferedDepositConfirmed;\n if (!buffered) return;\n\n context.bufferedDepositConfirmed = null;\n const next = protocol.nextState(context.swapState, buffered.kind, buffered.type);\n if (next === null) {\n this.log(`ignored buffered DepositConfirmed in state ${context.swapState}`, \"info\");\n return;\n }\n\n this.updateContextState(context, next);\n this.resolvePushListener(buffered);\n }\n\n private resolvePushListener(env: Envelope): void {\n const listeners = this.pushListeners.get(env.type);\n if (!listeners) return;\n const index = listeners.findIndex(\n (candidate) => candidate.swapId === undefined || candidate.swapId === env.swap_id,\n );\n if (index < 0) return;\n const listener = listeners.splice(index, 1)[0];\n if (listeners.length === 0) this.pushListeners.delete(env.type);\n if (listener.timer) clearTimeout(listener.timer);\n listener.resolve(env);\n }\n\n private clearPushListenerTimer(type: CoordinatorMessageType, swapId?: string | null): void {\n const listener = this.pushListeners\n .get(type)\n ?.find((candidate) => candidate.swapId === undefined || candidate.swapId === swapId);\n if (!listener?.timer) return;\n clearTimeout(listener.timer);\n listener.timer = null;\n }\n\n private removePushListener(type: CoordinatorMessageType, listener: PushListener): void {\n const listeners = this.pushListeners.get(type);\n if (!listeners) return;\n const index = listeners.indexOf(listener);\n if (index >= 0) listeners.splice(index, 1);\n if (listeners.length === 0) this.pushListeners.delete(type);\n }\n\n private cancelPushWaitersForSwap(swapId: string): void {\n for (const [type, listeners] of this.pushListeners.entries()) {\n const remaining = listeners.filter((listener) => {\n if (listener.swapId !== swapId) return true;\n if (listener.timer) clearTimeout(listener.timer);\n return false;\n });\n if (remaining.length === 0) {\n this.pushListeners.delete(type);\n } else if (remaining.length !== listeners.length) {\n this.pushListeners.set(type, remaining);\n }\n }\n }\n\n private setSessionStatus(status: SessionStatus): void {\n this.sessionStatus = status;\n this.emitStateChange();\n }\n\n private emitStateChange(\n swapId: string | null = this.swapId,\n swapState: ClientSwapState = this.swapState,\n ): void {\n for (const listener of this.stateListeners) {\n listener(swapState, this.sessionStatus, swapId);\n }\n }\n\n private log(msg: string, direction: \"in\" | \"out\" | \"info\"): void {\n for (const listener of this.logListeners) {\n listener(msg, direction);\n }\n }\n\n private normalizeSessionError(err: unknown): Error {\n if (err instanceof Error) {\n if (this.attested && isBenignTransportDropCandidate(err)) return tagBenignTransportDrop(err);\n return err;\n }\n return new Error(String(err));\n }\n\n private requireProtocol(): ProtocolModule {\n if (this.protocol === null) {\n throw new CommandError(\"REJECTED_STATE\", \"coordinator protocol is not loaded\");\n }\n return this.protocol;\n }\n}\n\nfunction toContractRequestResult(prepared: PreparedContract): ContractRequestResult {\n return {\n accepted: true,\n requestId: prepared.requestId,\n state: \"awaiting_deposit\",\n swapId: prepared.swapId,\n depositAddress: solanaAddressFromPublicKeyBytes(prepared.jointPublicKey),\n jointPublicKey: new Uint8Array(prepared.jointPublicKey),\n amountLamports: prepared.amountLamports,\n depositExpiresAtMs: prepared.depositExpiresAtMs,\n coordinatorTimestampMs: prepared.coordinatorTimestampMs,\n delegatedAtMs: prepared.delegatedAtMs,\n syncSecret: new Uint8Array(prepared.syncSecret),\n syncSecretHex: prepared.syncSecretHex,\n resumeSecret: new Uint8Array(prepared.resumeSecret),\n resumeSecretHex: prepared.resumeSecretHex,\n recoveryCodeHex: prepared.recoveryCodeHex,\n policySnapshot: prepared.policySnapshot,\n delegatePolicySnapshot: prepared.delegatePolicySnapshot,\n };\n}\n\n/** Execute the functional pre-deposit API on an already-attested Session. */\nexport async function contractRequestOnSession(\n session: Session,\n params: ContractRequestParams,\n): Promise<ContractRequestResult> {\n let client: UserCoordinatorSession | null = null;\n try {\n client = new UserCoordinatorSession(\n {\n coordinator: getSessionState(session).pool,\n createSession: async () => session,\n },\n false,\n );\n return await client.contractRequest(params);\n } finally {\n client?.releaseWithoutClosing();\n }\n}\n\n/** Resume a pre-delegation contract on a caller-owned attested Session. */\nexport async function resumePreDelegationOnSession(\n session: Session,\n params: ResumePreDelegationParams,\n): Promise<ResumePreDelegationResult> {\n const client = new UserCoordinatorSession(\n {\n coordinator: getSessionState(session).pool,\n createSession: async () => session,\n },\n false,\n );\n try {\n return await client.resumePreDelegation(params);\n } finally {\n client.releaseWithoutClosing();\n }\n}\n\n/** Execute the functional normal-user refund command on a caller-owned session. */\nexport async function requestRefundOnSession(\n session: Session,\n params: {\n readonly swapId?: string;\n readonly syncSecret?: Uint8Array;\n readonly recoveryCode: Uint8Array;\n readonly timeoutMs?: number;\n },\n): Promise<RefundAcceptanceReceipt> {\n const client = new UserCoordinatorSession(\n {\n coordinator: getSessionState(session).pool,\n createSession: async () => session,\n },\n false,\n );\n try {\n const result = await client.requestRefundIntent(params);\n const requestId = client.currentSwapId;\n if (!requestId) {\n throw new CommandError(\n \"REJECTED_STALE_JOB\",\n \"refund response did not include the resolved contract id\",\n );\n }\n if (result.kind === \"accepted\") {\n return {\n accepted: true,\n requestId,\n amountLamports: result.accepted.amount_lamports,\n acceptedAtMs: result.accepted.accepted_at_ms,\n };\n }\n return {\n accepted: true,\n requestId,\n amountLamports: result.refund.amount_lamports,\n };\n } finally {\n client.releaseWithoutClosing();\n }\n}\n\n/** Read the actor-scoped normal-user projection for a contract. */\nexport async function requestUserSync(\n session: Session,\n swapId: string,\n syncSecret: Uint8Array,\n timeoutMs?: number,\n): Promise<SyncUserResponse> {\n if (swapId.trim().length === 0) {\n throw new CommandError(\"REJECTED_STATE\", \"sync requires a non-empty swapId\");\n }\n if (syncSecret.length !== SYNC_SECRET_BYTE_LENGTH) {\n throw new CommandError(\"REJECTED_GUARD\", `syncSecret must be ${SYNC_SECRET_BYTE_LENGTH} bytes`);\n }\n const env = await requestEnvelope(\n session,\n CoordinatorMessageType.Sync,\n {\n actor: \"user\",\n sync_secret: new Uint8Array(syncSecret),\n },\n { swapId, timeoutMs, rejectMatchingOutOfBandErrors: true },\n );\n const payload = (await loadProtocol()).asSyncUserResponsePayload(env);\n assertSyncResponseContractId(env, payload, swapId);\n return {\n ...payload,\n coordinatorTimestampMs: env.timestamp_ms,\n };\n}\n\nfunction assertSyncResponseContractId(\n envelope: Pick<Envelope, \"swap_id\">,\n payload: SyncUserResponsePayload,\n requestedSwapId: string,\n): void {\n const actorSyncContractId = payload.actor_sync?.snapshot.contract_id;\n if (\n envelope.swap_id !== requestedSwapId ||\n (actorSyncContractId !== undefined && actorSyncContractId !== requestedSwapId)\n ) {\n throw new CommandError(\"REJECTED_STATE\", SYNC_CONTRACT_ID_MISMATCH_MESSAGE);\n }\n}\n\nasync function ensureFrostWasm(): Promise<void> {\n await (await loadFrostRuntime()).ensureFrostWasm();\n}\n\nfunction randomSecret32(): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(SYNC_SECRET_BYTE_LENGTH));\n}\n\nasync function sha256Commitment(secret: Uint8Array): Promise<Uint8Array> {\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", new Uint8Array(secret));\n return new Uint8Array(hashBuffer);\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction payoutWindowMsFromSpec(payoutSpec: PayoutSpec): number | undefined {\n if (payoutSpec.mode === \"instant\") return undefined;\n return payoutSpec.window_seconds * 1000;\n}\n\nfunction assertCurrentUserPayoutSpecRuntimeLimits(payoutSpec: PayoutSpec): void {\n if (payoutSpec.mode === \"instant\") {\n if (typeof payoutSpec.destination_address !== \"string\") {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n \"instant payout_spec.destination_address must be a string\",\n );\n }\n publicKey(payoutSpec.destination_address);\n return;\n }\n if (!Array.isArray(payoutSpec.destination_addresses)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n \"scheduled payout_spec.destination_addresses must be an array\",\n );\n }\n assertCurrentUserPayoutDestinationLimit(payoutSpec.destination_addresses.length);\n for (const address of payoutSpec.destination_addresses) {\n publicKey(address);\n }\n assertCurrentUserPayoutFragmentLimit(payoutSpec.num_fragments);\n if (!CURRENT_SCHEDULED_PAYOUT_WINDOW_SECONDS.has(payoutSpec.window_seconds)) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n `${CURRENT_SCHEDULED_PAYOUT_WINDOW_MESSAGE}; got ${payoutSpec.window_seconds}`,\n );\n }\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) return false;\n let diff = 0;\n for (let index = 0; index < a.byteLength; index += 1) {\n diff |= a[index]! ^ b[index]!;\n }\n return diff === 0;\n}\n\nfunction spendingPoliciesEqual(a: SpendingPolicySnapshot, b: SpendingPolicySnapshot): boolean {\n return (\n a.asset === b.asset &&\n a.entry_amount_lamports === b.entry_amount_lamports &&\n a.total_committed_lamports === b.total_committed_lamports &&\n a.payout_deadline_ms === b.payout_deadline_ms &&\n a.payout_window_ms === b.payout_window_ms &&\n a.fragment_count === b.fragment_count &&\n a.payout_mode === b.payout_mode &&\n a.matching_mode === b.matching_mode &&\n a.fragmentation_allowed === b.fragmentation_allowed &&\n a.min_fee_bps === b.min_fee_bps &&\n a.fee_bps === b.fee_bps &&\n a.fee_lamports === b.fee_lamports &&\n a.net_payout_lamports === b.net_payout_lamports &&\n payoutSchedulesEqual(a.payout_schedule, b.payout_schedule)\n );\n}\n\nfunction payoutSchedulesEqual(\n a: SpendingPolicySnapshot[\"payout_schedule\"],\n b: SpendingPolicySnapshot[\"payout_schedule\"],\n): boolean {\n if (a.length !== b.length) return false;\n return a.every((entry, index) => entry.destination_address === b[index]?.destination_address);\n}\n\nfunction isRequestTimeoutError(err: unknown): boolean {\n return err instanceof CommandError && err.message.includes(REQUEST_TIMEOUT_MESSAGE);\n}\n\nfunction isRetryableSwapStatusReconciliationError(err: unknown): boolean {\n if (err instanceof TransportError || err instanceof RoutingError) return true;\n if (err instanceof AttestationError) return false;\n return err instanceof CommandError && err.code === \"REJECTED_STALE_JOB\";\n}\n\nfunction coordinatorErrorFromEnvelope(\n protocol: ProtocolModule,\n env: Envelope,\n): CoordinatorProtocolError {\n try {\n const payload = protocol.asErrorPayload(env);\n return coordinatorProtocolError(payload.code, payload.message, payload.failed_req_id);\n } catch (err) {\n return coordinatorProtocolError(\n \"ERR_INTERNAL\",\n err instanceof Error ? err.message : \"coordinator sent an invalid error payload\",\n );\n }\n}\n\nfunction coordinatorProtocolError(\n code: string,\n message: string,\n failedReqId?: number,\n): CoordinatorProtocolError {\n const error = new Error(message) as CoordinatorProtocolError & {\n code: string;\n failedReqId?: number;\n };\n error.name = \"CoordinatorProtocolError\";\n error.code = code;\n if (failedReqId !== undefined) error.failedReqId = failedReqId;\n return error;\n}\n","/**\n * `@invisible-labs/sdk/user` - normal-user (private transfer) commands (spec 4.3).\n *\n * The normal-user API is functional and operates on the caller-owned attested\n * Session. Importing this module must not pull in `/lp`, `/stats`, or `/events`.\n */\n\nimport { PRODUCT_MAX_ENTRY_LAMPORTS, PRODUCT_MIN_ENTRY_LAMPORTS } from \"@invisible/shared\";\nimport { PolicyValidationError } from \"../core/errors.js\";\nexport { InvalidDepositAmountError } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\nimport type { PayoutPolicy } from \"../schemas/types.generated.js\";\nimport {\n CURRENT_USER_PAYOUT_FRAGMENT_LIMIT,\n INSTANT_PAYOUT_WINDOW_MS,\n PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n validatePayoutPolicy,\n} from \"../validation/payoutPolicy.js\";\nimport { assertAttested } from \"../session/guards.js\";\nimport {\n contractRequestOnSession,\n requestRefundOnSession,\n resumePreDelegationOnSession,\n requestUserSync,\n type ContractRequestResult,\n type RefundAcceptanceReceipt,\n type ResumePreDelegationParams,\n type ResumePreDelegationResult,\n type SyncUserResponse,\n} from \"./coordinatorSession.js\";\nimport { assertRecoveryCode } from \"./recoveryCode.js\";\nexport type {\n ContractRequestResult,\n NormalUserActorSyncSnapshot,\n NormalUserRefundability,\n NormalUserSettlementPhase,\n RefundAcceptanceReceipt,\n PayoutExecutedPayload,\n RefundExecutedPayload,\n SourceLiquidityUse,\n SpendingPolicySnapshot,\n SyncUserResponse,\n SyncUserResponsePayload,\n ResumePreDelegationParams,\n ResumePreDelegationResult,\n WithdrawExecutedPayload,\n} from \"./coordinatorSession.js\";\nexport {\n INSTANT_PAYOUT_WINDOW_MS,\n PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n SUPPORTED_TOTAL_DEADLINE_MS,\n} from \"../validation/payoutPolicy.js\";\nexport {\n commitmentFromCode,\n generateRecoveryCode,\n RECOVERY_CODE_BYTE_LENGTH,\n recoveryCodeFromHex,\n recoveryCodeFromUserInput,\n recoveryCodeToHex,\n} from \"./recoveryCode.js\";\n\n/** Inclusive minimum private-transfer entry amount in lamports. */\nexport const MIN_ENTRY_AMOUNT_LAMPORTS = PRODUCT_MIN_ENTRY_LAMPORTS;\n\n/** Inclusive maximum private-transfer entry amount in lamports. */\nexport const MAX_ENTRY_AMOUNT_LAMPORTS = PRODUCT_MAX_ENTRY_LAMPORTS;\n\nconst CURRENT_USER_MIN_LAMPORTS_UNSUPPORTED_MESSAGE =\n \"destinations[*].minLamports is not supported in the current normal-user wire contract\";\n\n/** Arguments to start a new private-transfer pool entry. */\nexport interface ContractRequestArgs {\n /**\n * Gross private-transfer amount in lamports.\n *\n * At the contract boundary, this is the exact amount the coordinator expects\n * to observe at the fundable deposit address and hold in the joint wallet.\n * It is the custody-side amount before protocol and network-fee accounting,\n * not the net amount a payout destination receives.\n * The value must be a safe integer between {@link MIN_ENTRY_AMOUNT_LAMPORTS}\n * and {@link MAX_ENTRY_AMOUNT_LAMPORTS}, inclusive.\n */\n readonly amountLamports: number;\n /**\n * Where and how the output is delivered. V0 normal-user requests support\n * exactly one payout destination and validate the policy locally before\n * submission. `batchExclusionId` is rejected in V0; its planned V1 meaning\n * is campaign-scoped batch exclusion, never a stable actor identity.\n * `destinations[*].minDelayMs` and `destinations[*].maxDelayMs` are also\n * rejected in V0 because the current runtime does not honor them.\n * `totalDeadlineMs` selects the payout window: use `0` for instant payout,\n * or one of the coordinator-supported scheduled durations exposed by\n * `SUPPORTED_TOTAL_DEADLINE_MS`.\n */\n readonly payoutPolicy: PayoutPolicy;\n /** Optional caller-owned status secret, copied before it reaches the wire. */\n readonly syncSecret?: Uint8Array;\n /** Called before ContractRequest so the caller can persist the status secret. */\n readonly onSyncSecretReady?: (info: { secretHex: string }) => void | Promise<void>;\n /** Optional precomputed pre-delegation mutation secret, copied before it reaches the wire. */\n readonly resumeSecret?: Uint8Array;\n /** Called before ContractRequest so the caller can persist the resume secret. */\n readonly onResumeSecretReady?: (info: { secretHex: string }) => void | Promise<void>;\n /** Called after allocation so the caller can persist both secrets with the swap id. */\n readonly onSwapAllocated?: (info: {\n swapId: string;\n syncSecretHex: string;\n resumeSecretHex: string;\n }) => void | Promise<void>;\n /** Optional precomputed Recovery Code commitment for caller-managed recovery. */\n readonly recoveryCommitment?: Uint8Array;\n /** Called before DelegateShare so the caller can persist the generated code. */\n readonly onRecoveryCodeReady?: (info: { codeHex: string }) => void | Promise<void>;\n /** Called before DkgRound2 so the caller can persist the generated Alice share. */\n readonly onDelegateShareReady?: (info: {\n swapId: string;\n delegateShare: Uint8Array;\n }) => void | Promise<void>;\n}\n\n/**\n * Start a new pool entry through the current normal-user coordinator flow.\n * Resolves after DKG and durable share delegation, before the user's deposit\n * is observed. The returned `depositAddress` is the joint-wallet address.\n * `payoutPolicy.totalDeadlineMs` selects the payout window: omitted or `0`\n * selects instant payout; the supported positive millisecond values select\n * the corresponding scheduled coordinator window.\n *\n * @throws PolicyValidationError if the payout policy is invalid (never hits the wire).\n * @throws AttestationError if the session is not attested.\n * @throws CommandError if the coordinator rejects the request or the local\n * session cannot complete the DKG/delegation boundary.\n */\nexport async function contractRequest(\n session: Session,\n args: ContractRequestArgs,\n): Promise<ContractRequestResult> {\n const payoutPolicy = validatePayoutPolicy(args.payoutPolicy, {\n totalLamports: args.amountLamports,\n });\n assertEntryAmount(args.amountLamports);\n assertCurrentUserContractPolicy(payoutPolicy);\n assertAttested(session);\n const destination = payoutPolicy.destinations[0]!;\n const wirePayoutSpec = wirePayoutSpecFromPolicy(payoutPolicy, destination.address);\n\n return contractRequestOnSession(session, {\n amountLamports: args.amountLamports,\n payoutSpec: wirePayoutSpec,\n ...(args.syncSecret !== undefined && { syncSecret: args.syncSecret }),\n ...(args.recoveryCommitment !== undefined && {\n recoveryCommitment: args.recoveryCommitment,\n }),\n ...(args.onSyncSecretReady !== undefined && {\n onSyncSecretReady: args.onSyncSecretReady,\n }),\n ...(args.resumeSecret !== undefined && { resumeSecret: args.resumeSecret }),\n ...(args.onResumeSecretReady !== undefined && {\n onResumeSecretReady: args.onResumeSecretReady,\n }),\n ...(args.onSwapAllocated !== undefined && {\n onSwapAllocated: args.onSwapAllocated,\n }),\n ...(args.onRecoveryCodeReady !== undefined && {\n onRecoveryCodeReady: args.onRecoveryCodeReady,\n }),\n ...(args.onDelegateShareReady !== undefined && {\n onDelegateShareReady: args.onDelegateShareReady,\n }),\n });\n}\n\n/** Resume pre-delegation DKG or delegation on a caller-owned Session. */\nexport async function resumePreDelegation(\n session: Session,\n args: ResumePreDelegationParams,\n): Promise<ResumePreDelegationResult> {\n assertAttested(session);\n return resumePreDelegationOnSession(session, {\n swapId: args.swapId,\n resumeSecret: new Uint8Array(args.resumeSecret),\n ...(args.syncSecret !== undefined && { syncSecret: new Uint8Array(args.syncSecret) }),\n recoveryCommitment: new Uint8Array(args.recoveryCommitment),\n policySnapshot: args.policySnapshot,\n ...(args.onDelegateShareReady !== undefined && {\n onDelegateShareReady: args.onDelegateShareReady,\n }),\n ...(args.delegateShare !== undefined && { delegateShare: new Uint8Array(args.delegateShare) }),\n });\n}\n\n/** Read the actor-scoped lifecycle projection for a normal-user contract. */\nexport async function sync(\n session: Session,\n contractId: string,\n syncSecret: Uint8Array,\n timeoutMs?: number,\n): Promise<SyncUserResponse> {\n assertAttested(session);\n return requestUserSync(session, contractId, syncSecret, timeoutMs);\n}\n\nfunction assertEntryAmount(amountLamports: number): void {\n if (\n !Number.isSafeInteger(amountLamports) ||\n amountLamports < MIN_ENTRY_AMOUNT_LAMPORTS ||\n amountLamports > MAX_ENTRY_AMOUNT_LAMPORTS\n ) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `amountLamports must be an integer between ${MIN_ENTRY_AMOUNT_LAMPORTS} and ${MAX_ENTRY_AMOUNT_LAMPORTS} lamports`,\n );\n }\n}\n\nfunction assertCurrentUserContractPolicy(policy: PayoutPolicy): void {\n for (const destination of policy.destinations) {\n if (destination.minLamports !== undefined) {\n throw new PolicyValidationError(\n \"INVALID_PAYOUT_PLAN\",\n CURRENT_USER_MIN_LAMPORTS_UNSUPPORTED_MESSAGE,\n );\n }\n }\n}\n\nfunction wirePayoutSpecFromPolicy(\n policy: PayoutPolicy,\n destinationAddress: string,\n):\n | {\n readonly mode: \"instant\";\n readonly destination_address: string;\n }\n | {\n readonly mode: \"scheduled\";\n readonly num_fragments: typeof CURRENT_USER_PAYOUT_FRAGMENT_LIMIT;\n readonly window_seconds: number;\n readonly destination_addresses: readonly string[];\n } {\n const totalDeadlineMs = policy.totalDeadlineMs;\n if (totalDeadlineMs === undefined || totalDeadlineMs === INSTANT_PAYOUT_WINDOW_MS) {\n return {\n mode: \"instant\",\n destination_address: destinationAddress,\n };\n }\n\n return {\n mode: \"scheduled\",\n num_fragments: CURRENT_USER_PAYOUT_FRAGMENT_LIMIT,\n window_seconds: totalDeadlineMs / PAYOUT_WINDOW_MILLISECONDS_PER_SECOND,\n destination_addresses: [destinationAddress],\n };\n}\n\n/** Arguments to refund a pool entry with the Recovery Code preimage. */\nexport interface RequestRefundArgs {\n /** Optional contract correlation required when multiple contracts share one Session. */\n readonly swapId?: string;\n /** Optional status secret used to restore the correlated contract context. */\n readonly syncSecret?: Uint8Array;\n /** The 32-byte Recovery Code preimage. */\n readonly recoveryCode: Uint8Array;\n}\n\n/**\n * Submit a normal-user `withdraw_request` with the Recovery Code preimage\n * (`{ recovery_code }`). Pass `swapId` and `syncSecret` when multiple contracts\n * share one Session so the request is correlated to the intended contract.\n * The coordinator queues a durable origin-bound withdrawal intent and terminal\n * outcome is recovered through sync/status reads. No caller-supplied destination\n * is accepted.\n *\n * @returns An acceptance receipt keyed by the resolved V0 `swapId`, including\n * the coordinator-authoritative amount accepted for withdrawal. The\n * coordinator's durable execution result is read later through `sync`.\n * @throws AttestationError if the session is not attested.\n * @throws PolicyValidationError if `recoveryCode` is not exactly 32 bytes.\n * @throws CommandError if the coordinator rejects the withdrawal request.\n */\nexport async function requestRefund(\n session: Session,\n args: RequestRefundArgs,\n): Promise<RefundAcceptanceReceipt> {\n assertAttested(session);\n assertRecoveryCode(args.recoveryCode);\n return requestRefundOnSession(session, {\n ...(args.swapId !== undefined && { swapId: args.swapId }),\n ...(args.syncSecret !== undefined && { syncSecret: new Uint8Array(args.syncSecret) }),\n recoveryCode: new Uint8Array(args.recoveryCode),\n });\n}\n"]}
|