@dreamboard-games/sdk 0.5.0-alpha.2 → 0.5.0-alpha.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.
Files changed (151) hide show
  1. package/README.md +186 -45
  2. package/dist/board-target-B0QG6OYx.d.ts +8 -0
  3. package/dist/chunk-3JXUL4VN.js +139 -0
  4. package/dist/chunk-3JXUL4VN.js.map +1 -0
  5. package/dist/{chunk-S2JEDVWH.js → chunk-C77SYIVT.js} +6102 -6505
  6. package/dist/chunk-C77SYIVT.js.map +1 -0
  7. package/dist/chunk-DMFVAZI2.js +16 -0
  8. package/dist/chunk-DMFVAZI2.js.map +1 -0
  9. package/dist/chunk-OOFMBCFF.js +1338 -0
  10. package/dist/chunk-OOFMBCFF.js.map +1 -0
  11. package/dist/chunk-UG2Q4NLG.js +590 -0
  12. package/dist/chunk-UG2Q4NLG.js.map +1 -0
  13. package/dist/chunk-XU6WJW6K.js +847 -0
  14. package/dist/chunk-XU6WJW6K.js.map +1 -0
  15. package/dist/diagnostics-B8d5aLad.d.ts +65 -0
  16. package/dist/extract-gVKcB8Og.d.ts +4736 -0
  17. package/dist/index.d.ts +3782 -1
  18. package/dist/index.js +1096 -6
  19. package/dist/index.js.map +1 -1
  20. package/dist/model-vdpLHrxh.d.ts +432 -0
  21. package/dist/react.d.ts +60 -0
  22. package/dist/react.js +208 -0
  23. package/dist/react.js.map +1 -0
  24. package/dist/reducer.d.ts +1244 -78
  25. package/dist/reducer.js +4204 -121
  26. package/dist/reducer.js.map +1 -1
  27. package/dist/testing.d.ts +520 -564
  28. package/dist/testing.js +2451 -915
  29. package/dist/testing.js.map +1 -1
  30. package/dist/types-Bj5ZLTUV.d.ts +114 -0
  31. package/package.json +40 -142
  32. package/dist/HandView-Bi2lxzQP.d.ts +0 -79
  33. package/dist/ResourceCounter-BFxJknqp.d.ts +0 -98
  34. package/dist/ThemeProvider-CElaL2ik.d.ts +0 -99
  35. package/dist/attributes-DbvyMbXw.d.ts +0 -68
  36. package/dist/browser-interaction.d.ts +0 -910
  37. package/dist/browser-interaction.js +0 -119
  38. package/dist/browser-interaction.js.map +0 -1
  39. package/dist/chunk-32PFKDV7.js +0 -11705
  40. package/dist/chunk-32PFKDV7.js.map +0 -1
  41. package/dist/chunk-3BAD4VC2.js +0 -263
  42. package/dist/chunk-3BAD4VC2.js.map +0 -1
  43. package/dist/chunk-3SKDNDPG.js +0 -104
  44. package/dist/chunk-3SKDNDPG.js.map +0 -1
  45. package/dist/chunk-5YV2WHJ4.js +0 -25
  46. package/dist/chunk-5YV2WHJ4.js.map +0 -1
  47. package/dist/chunk-ANRB4XKA.js +0 -90
  48. package/dist/chunk-ANRB4XKA.js.map +0 -1
  49. package/dist/chunk-BI4G3PM2.js +0 -1864
  50. package/dist/chunk-BI4G3PM2.js.map +0 -1
  51. package/dist/chunk-EVCLTY4Q.js +0 -935
  52. package/dist/chunk-EVCLTY4Q.js.map +0 -1
  53. package/dist/chunk-GDPKTBUR.js +0 -564
  54. package/dist/chunk-GDPKTBUR.js.map +0 -1
  55. package/dist/chunk-H6VDGFL5.js +0 -2903
  56. package/dist/chunk-H6VDGFL5.js.map +0 -1
  57. package/dist/chunk-LR3ZTWQF.js +0 -5960
  58. package/dist/chunk-LR3ZTWQF.js.map +0 -1
  59. package/dist/chunk-PF7L4BMG.js +0 -117
  60. package/dist/chunk-PF7L4BMG.js.map +0 -1
  61. package/dist/chunk-PN5O6GG2.js +0 -32
  62. package/dist/chunk-PN5O6GG2.js.map +0 -1
  63. package/dist/chunk-PZ5AY32C.js +0 -10
  64. package/dist/chunk-PZ5AY32C.js.map +0 -1
  65. package/dist/chunk-S2JEDVWH.js.map +0 -1
  66. package/dist/chunk-T3ZKNUZ7.js +0 -1
  67. package/dist/chunk-T3ZKNUZ7.js.map +0 -1
  68. package/dist/chunk-UGH54WZ2.js +0 -223
  69. package/dist/chunk-UGH54WZ2.js.map +0 -1
  70. package/dist/chunk-VCDWP5VL.js +0 -746
  71. package/dist/chunk-VCDWP5VL.js.map +0 -1
  72. package/dist/chunk-VDXOF4FW.js +0 -69
  73. package/dist/chunk-VDXOF4FW.js.map +0 -1
  74. package/dist/chunk-WHR5UW3F.js +0 -1988
  75. package/dist/chunk-WHR5UW3F.js.map +0 -1
  76. package/dist/chunk-Y75CFE77.js +0 -17
  77. package/dist/chunk-Y75CFE77.js.map +0 -1
  78. package/dist/chunk-Z7QCREWI.js +0 -3435
  79. package/dist/chunk-Z7QCREWI.js.map +0 -1
  80. package/dist/chunk-ZZGN2ATS.js +0 -1941
  81. package/dist/chunk-ZZGN2ATS.js.map +0 -1
  82. package/dist/components-gAbIz7hK.d.ts +0 -1284
  83. package/dist/definitions-BgmV_GhC.d.ts +0 -300
  84. package/dist/diagnostics-DIi3ina7.d.ts +0 -50
  85. package/dist/digest.d.ts +0 -8
  86. package/dist/game-CsZScpcn.d.ts +0 -763
  87. package/dist/hex-board-view-aKkblDp6.d.ts +0 -1228
  88. package/dist/index-CcT9Q7N7.d.ts +0 -193
  89. package/dist/index.d-DjzoK7zn.d.ts +0 -2101
  90. package/dist/package-set.d.ts +0 -13
  91. package/dist/package-set.js +0 -12
  92. package/dist/package-set.js.map +0 -1
  93. package/dist/player-state-Cqpyeql0.d.ts +0 -371
  94. package/dist/plugin-runtime-contract.d.ts +0 -17
  95. package/dist/plugin-runtime-contract.js +0 -92
  96. package/dist/plugin-runtime-contract.js.map +0 -1
  97. package/dist/primitive-props-BNHDkgd7.d.ts +0 -16
  98. package/dist/protocol-dYgafTYY.d.ts +0 -314
  99. package/dist/reducer/advanced.d.ts +0 -82
  100. package/dist/reducer/advanced.js +0 -51
  101. package/dist/reducer/advanced.js.map +0 -1
  102. package/dist/reducer-contract.d.ts +0 -11
  103. package/dist/reducer-contract.js +0 -16
  104. package/dist/reducer-contract.js.map +0 -1
  105. package/dist/reference-games/index.d.ts +0 -31
  106. package/dist/reference-games/index.js +0 -48
  107. package/dist/reference-games/index.js.map +0 -1
  108. package/dist/runtime/primitives.d.ts +0 -250
  109. package/dist/runtime/primitives.js +0 -189
  110. package/dist/runtime/primitives.js.map +0 -1
  111. package/dist/runtime/runtime-api.d.ts +0 -2
  112. package/dist/runtime/runtime-api.js +0 -1
  113. package/dist/runtime/runtime-api.js.map +0 -1
  114. package/dist/runtime/workspace-contract.d.ts +0 -392
  115. package/dist/runtime/workspace-contract.js +0 -28
  116. package/dist/runtime/workspace-contract.js.map +0 -1
  117. package/dist/runtime-RJ5orDJU.d.ts +0 -1699
  118. package/dist/runtime-api-Bz5pwNU_.d.ts +0 -296
  119. package/dist/runtime-json-CQ9QbLZ5.d.ts +0 -5
  120. package/dist/runtime.d.ts +0 -83
  121. package/dist/runtime.js +0 -242
  122. package/dist/runtime.js.map +0 -1
  123. package/dist/schema.d.ts +0 -379
  124. package/dist/stale-contract-artifact-error-XLaweZtF.d.ts +0 -18
  125. package/dist/testing-compiler.d.ts +0 -37
  126. package/dist/testing-compiler.js +0 -272
  127. package/dist/testing-compiler.js.map +0 -1
  128. package/dist/testing-runtime.d.ts +0 -119
  129. package/dist/testing-runtime.js +0 -212
  130. package/dist/testing-runtime.js.map +0 -1
  131. package/dist/types-DJj5MJkl.d.ts +0 -256
  132. package/dist/types-DR7DoB1x.d.ts +0 -28
  133. package/dist/types-JWCYHmu7.d.ts +0 -122
  134. package/dist/types.d.ts +0 -1958
  135. package/dist/types.js +0 -14
  136. package/dist/types.js.map +0 -1
  137. package/dist/ui/components.d.ts +0 -17
  138. package/dist/ui/components.js +0 -216
  139. package/dist/ui/components.js.map +0 -1
  140. package/dist/ui/defaults.d.ts +0 -19
  141. package/dist/ui/defaults.js +0 -104
  142. package/dist/ui/defaults.js.map +0 -1
  143. package/dist/ui/player-state.d.ts +0 -2
  144. package/dist/ui/player-state.js +0 -1
  145. package/dist/ui/player-state.js.map +0 -1
  146. package/dist/ui/plugin-styles.css +0 -2
  147. package/dist/ui-contract-GTUPkf8z.d.ts +0 -1168
  148. package/dist/ui.d.ts +0 -317
  149. package/dist/ui.js +0 -277
  150. package/dist/ui.js.map +0 -1
  151. package/dist/views-BpuWcOyN.d.ts +0 -1641
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reducer/model/error-codes.ts","../src/reducer/model/manifest.ts","../src/reducer/model/definition.ts","../src/reducer/per-player.ts","../src/shared/worker-contract.ts","../src/reducer/diagnostics.ts","../src/reducer/table/internal.ts","../src/reducer/table/board-queries.ts","../src/reducer/table/card-validation.ts","../src/reducer/table/clone.ts","../src/reducer/table/component-locations.ts","../src/reducer/table/zone-queries.ts","../src/reducer/table/numeric.ts","../src/reducer/table/resource-ops.ts","../src/reducer/table/component-mutations.ts","../src/reducer/table/card-mutations.ts","../src/reducer/table-queries.ts","../src/reducer/definition-index.ts","../src/reducer/ingress/session-codec.ts","../src/reducer/parse-utils.ts","../src/reducer/ingress/runtime-payload.ts","../src/runtime-json.ts","../src/reducer/ingress/input-codec.ts","../src/reducer/ingress/phase-schemas.ts","../src/reducer/transaction-mutations.ts","../src/reducer/transaction.ts","../src/reducer/bundle/trusted/runtime-registry.ts","../src/reducer/bundle/trusted/trusted-runtime-args.ts","../src/reducer/bundle/trusted/trusted-runtime-result.ts","../src/reducer/bundle/trusted/trusted-state-codec.ts","../src/reducer/bundle/trusted/runtime-scope.ts","../src/reducer/bundle/trusted/collector-introspection.ts","../src/reducer/bundle/trusted/interaction-types.ts","../src/reducer/bundle/trusted/collector-params.ts","../src/reducer/bundle/trusted/simultaneous-player.ts","../src/reducer/bundle/trusted/interaction-authorization.ts","../src/reducer/client-param-schemas.ts","../src/reducer/bundle/trusted/step-prefix.ts","../src/reducer/bundle/trusted/collector-input-solver.ts","../src/reducer/bundle/trusted/interaction-domain-metadata.ts","../src/reducer/bundle/trusted/collector-domains.ts","../src/reducer/bundle/trusted/interaction-descriptor.ts","../src/reducer/bundle/trusted/interaction-decision.ts","../src/reducer/bundle/trusted/interaction-resolver.ts","../src/reducer/rng.ts","../src/reducer/bundle/trusted/rng-sampler.ts","../src/reducer/bundle/trusted/lifecycle-runner.ts","../src/reducer/bundle/trusted/reducer-executor.ts","../src/reducer/bundle/trusted/static-projection.ts","../src/reducer/bundle/trusted/projection-context.ts","../src/reducer/bundle/trusted/projection-builder.ts","../src/reducer/bundle/create-reducer-bundle.ts"],"sourcesContent":["export const FrameworkErrorCodes = {\n NOT_YOUR_TURN: \"NOT_YOUR_TURN\",\n WRONG_PHASE: \"WRONG_PHASE\",\n WRONG_STEP: \"WRONG_STEP\",\n NO_LEGAL_INPUT: \"NO_LEGAL_INPUT\",\n INVALID_PARAMS: \"INVALID_PARAMS\",\n UNKNOWN_INTERACTION: \"UNKNOWN_INTERACTION\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type FrameworkErrorCode =\n (typeof FrameworkErrorCodes)[keyof typeof FrameworkErrorCodes];\n","import { RuntimeJsonSchema } from \"../../shared/runtime-json\";\nimport type { RuntimeRecord } from \"./table\";\nimport * as ContractZod from \"../../shared/runtime-schema\";\nimport { z } from \"zod\";\nimport type {\n AnySchema,\n RuntimeHandVisibilityMode,\n RuntimeTableRecord,\n SchemaLike,\n} from \"./table\";\nimport type {\n CardIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n} from \"./extract\";\nimport type { TableQueriesOfState } from \"./queries\";\n\ndeclare const manifestIdSchemaBrand: unique symbol;\n\nexport type ManifestIdFamily = keyof ManifestIds<\n string,\n string,\n string,\n string,\n string\n>;\n\nexport type ManifestIdSchema<\n Output = unknown,\n Family extends ManifestIdFamily | undefined = ManifestIdFamily | undefined,\n> = z.ZodType<Output> & {\n readonly [manifestIdSchemaBrand]: Family;\n};\n\nexport type ManifestLiterals<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerIds: readonly PlayerId[];\n phaseNames: readonly PhaseName[];\n boardLayouts: readonly (\"generic\" | \"hex\" | \"square\")[];\n cardSetIds: readonly string[];\n cardTypes: readonly string[];\n deckIds: readonly DeckId[];\n handIds: readonly HandId[];\n sharedZoneIds: readonly DeckId[];\n playerZoneIds: readonly HandId[];\n zoneIds: readonly (DeckId | HandId)[];\n cardIds: readonly CardId[];\n resourceIds: readonly string[];\n resourcePresentationById?: Record<\n string,\n { label: string; icon?: string | null }\n >;\n /** Resources whose balances are projected only to their holder. */\n ownerResourceIds?: readonly string[];\n pieceTypeIds: readonly string[];\n pieceIds: readonly string[];\n dieTypeIds: readonly string[];\n dieIds: readonly string[];\n boardTemplateIds: readonly string[];\n boardTypeIds: readonly string[];\n boardBaseIds: readonly string[];\n boardIds: readonly string[];\n boardContainerIds: readonly string[];\n relationTypeIds: readonly string[];\n edgeIds: readonly string[];\n edgeTypeIds: readonly string[];\n vertexIds: readonly string[];\n vertexTypeIds: readonly string[];\n spaceIds: readonly string[];\n spaceTypeIds: readonly string[];\n handVisibilityById: Record<HandId, RuntimeHandVisibilityMode>;\n zoneVisibilityById: Record<DeckId | HandId, RuntimeHandVisibilityMode>;\n cardSetIdByCardId: Record<CardId, string>;\n cardTypeByCardId: Record<CardId, string>;\n cardSetIdsBySharedZoneId: Record<DeckId, readonly string[]>;\n cardSetIdsByPlayerZoneId: Record<HandId, readonly string[]>;\n};\n\nexport type ManifestIds<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerId: z.ZodType<PlayerId>;\n phaseName: z.ZodType<PhaseName>;\n boardLayout: AnySchema;\n cardSetId: AnySchema;\n cardType: AnySchema;\n cardId: z.ZodType<CardId>;\n deckId: z.ZodType<DeckId>;\n handId: z.ZodType<HandId>;\n sharedZoneId: AnySchema;\n playerZoneId: AnySchema;\n zoneId: AnySchema;\n resourceId: AnySchema;\n pieceTypeId: AnySchema;\n pieceId: AnySchema;\n dieId: AnySchema;\n dieTypeId: AnySchema;\n boardTypeId: AnySchema;\n boardId: AnySchema;\n boardBaseId: AnySchema;\n boardContainerId: AnySchema;\n relationTypeId: AnySchema;\n edgeId: AnySchema;\n edgeTypeId: AnySchema;\n vertexId: AnySchema;\n vertexTypeId: AnySchema;\n spaceId: AnySchema;\n spaceTypeId: AnySchema;\n};\n\nexport type ManifestDefaults<Table extends RuntimeTableRecord> = {\n zones: (playerIds?: readonly string[]) => Table[\"zones\"];\n decks: (playerIds?: readonly string[]) => Table[\"decks\"];\n hands: (playerIds?: readonly string[]) => Table[\"hands\"];\n handVisibility: (playerIds?: readonly string[]) => Table[\"handVisibility\"];\n ownerOfCard: (playerIds?: readonly string[]) => Table[\"ownerOfCard\"];\n visibility: (playerIds?: readonly string[]) => Table[\"visibility\"];\n resources: (playerIds?: readonly string[]) => Table[\"resources\"];\n};\n\nexport type ManifestNormalSetup<Table extends RuntimeTableRecord> = {\n readonly minPlayers: number;\n readonly maxPlayers: number;\n readonly createInitialTable: (options: {\n readonly playerIds: readonly string[];\n }) => Table;\n};\n\nexport type StaticBoards<Table extends RuntimeTableRecord> = Pick<\n Table[\"boards\"],\n \"byId\" | \"hex\" | \"square\"\n>;\n\nexport type ReducerManifestContract<\n Table extends RuntimeTableRecord,\n PhaseName extends string,\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n> = {\n literals: ManifestLiterals<PlayerId, DeckId, HandId, CardId, PhaseName>;\n ids: ManifestIds<PlayerId, DeckId, HandId, CardId, PhaseName>;\n defaults: ManifestDefaults<Table>;\n /**\n * Normal-session setup capability supplied by the manifest compiler.\n *\n * This remains optional on the structural contract so small handwritten\n * manifests can model focused reducer tests without recreating generated\n * topology metadata. Compiled manifests always provide it.\n */\n normalSetup?: ManifestNormalSetup<Table>;\n staticBoards?: StaticBoards<Table>;\n tableSchema: z.ZodType<Table>;\n runtimeSchema: AnySchema;\n createGameStateSchema: (config: {\n phaseNameSchema: AnySchema;\n publicSchema: AnySchema;\n privateSchema: AnySchema;\n hiddenSchema: AnySchema;\n phasesSchema: AnySchema;\n }) => AnySchema;\n};\n\nexport type ReducerManifestContractLike<\n Table extends RuntimeTableRecord = RuntimeTableRecord,\n PhaseName extends string = string,\n PlayerId extends string = string,\n DeckId extends string = string,\n HandId extends string = string,\n CardId extends string = string,\n> = ReducerManifestContract<Table, PhaseName, PlayerId, DeckId, HandId, CardId>;\n\nexport type ManifestContract<Table extends RuntimeTableRecord> =\n ReducerManifestContract<\n Table,\n string,\n PlayerIdOfTable<Table>,\n DeckIdOfTable<Table>,\n HandIdOfTable<Table>,\n CardIdOfTable<Table>\n >;\n\nfunction toNonEmptyStringTuple<Values extends readonly string[]>(\n values: Values,\n): [Values[number], ...Array<Values[number]>] {\n const [first, ...rest] = Array.from(values);\n if (typeof first === \"undefined\") {\n throw new Error(\"Expected a non-empty literal tuple\");\n }\n return [first as Values[number], ...(rest as Array<Values[number]>)];\n}\n\n/**\n * Registry of Zod schemas produced by `createManifestStringLiteralSchema`.\n *\n * The schemas returned from this helper are the canonical manifest-scoped\n * branded schemas (e.g. `manifest.ids.playerId`). When a manifest has zero\n * members for a given id family the underlying schema falls back to plain\n * `z.string()`, which is indistinguishable from an author-written\n * `z.string()` at runtime. This WeakMap lets `defineGameContract` recognise\n * the manifest-supplied case and lets schema-aware consumers distinguish\n * semantic ID families without inferring them from authored field names. A\n * schema marked without a family remains manifest-scoped for compatibility.\n */\nconst manifestScopedSchemas = new WeakMap<\n object,\n ManifestIdFamily | undefined\n>();\n\nexport function markManifestScopedSchema<\n Schema extends z.ZodTypeAny,\n const Family extends ManifestIdFamily | undefined = undefined,\n>(\n schema: Schema,\n family?: Family,\n): Schema & ManifestIdSchema<z.infer<Schema>, Family> {\n manifestScopedSchemas.set(schema as unknown as object, family);\n return schema as Schema & ManifestIdSchema<z.infer<Schema>, Family>;\n}\n\nexport function isManifestScopedSchema(schema: unknown): boolean {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n manifestScopedSchemas.has(schema as object)\n );\n}\n\nexport function manifestSchemaFamily(\n schema: unknown,\n): ManifestIdFamily | undefined {\n if (typeof schema !== \"object\" || schema === null) {\n return undefined;\n }\n return manifestScopedSchemas.get(schema as object);\n}\n\nexport function createManifestStringLiteralSchema<\n Values extends readonly string[],\n const Family extends ManifestIdFamily | undefined = undefined,\n>(\n values: Values,\n family?: Family,\n): ManifestIdSchema<\n Values[number] extends never ? string : Values[number],\n Family\n> {\n const schema =\n values.length === 0\n ? (z.string() as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >)\n : (z.enum(toNonEmptyStringTuple(values)) as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >);\n return markManifestScopedSchema(schema, family);\n}\n\nexport function assumeManifestSchema<\n Output,\n Family extends ManifestIdFamily | undefined,\n>(schema: ManifestIdSchema<unknown, Family>): ManifestIdSchema<Output, Family>;\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output>;\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output> {\n return schema as z.ZodType<Output>;\n}\n\nexport function cloneManifestDefault<Value>(value: Value): Value {\n if (typeof globalThis.structuredClone === \"function\") {\n return globalThis.structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nexport function resolveManifestPlayerIds<PlayerId extends string>(\n manifestPlayerIds: readonly PlayerId[],\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n if (!playerIds || playerIds.length === 0) {\n return manifestPlayerIds;\n }\n\n const knownPlayerIds = new Set<string>(manifestPlayerIds);\n return playerIds.filter((playerId): playerId is PlayerId =>\n knownPlayerIds.has(playerId),\n );\n}\n\nexport function createManifestRuntimeSchema<\n PhaseNameSchema extends z.ZodTypeAny,\n PlayerId extends string,\n>({\n phaseNameSchema,\n playerIdSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n playerIdSchema: z.ZodType<PlayerId>;\n}) {\n return z.object({\n events: z.array(ContractZod.GameEventSchema).max(32),\n rng: z\n .object({\n seed: z.number().nullable().optional(),\n cursor: z.number().int().default(0),\n trace: z.array(z.string()).default([]),\n draws: z.array(ContractZod.RngDrawSchema).default([]),\n })\n .default({\n seed: null,\n cursor: 0,\n trace: [],\n draws: [],\n }),\n options: z.record(z.string(), RuntimeJsonSchema).default({}),\n simultaneous: z\n .object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: z.unknown(),\n }),\n ),\n })\n .nullable(),\n })\n .default({ current: null }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable()\n .default(null),\n nextInstanceId: z.number().int().default(1),\n });\n}\n\nexport function createManifestGameStateSchema<\n Table extends RuntimeTableRecord,\n PhaseNameSchema extends z.ZodTypeAny,\n PublicSchema extends z.ZodTypeAny,\n PrivateSchema extends z.ZodTypeAny,\n HiddenSchema extends z.ZodTypeAny,\n PhasesSchema extends z.ZodTypeAny,\n PlayerId extends string,\n>({\n tableSchema,\n playerIdSchema,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n tableSchema: z.ZodType<Table>;\n playerIdSchema: z.ZodType<PlayerId>;\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return z.object({\n table: tableSchema,\n public: publicSchema,\n private: z.record(z.string(), privateSchema),\n hidden: hiddenSchema,\n flow: z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n }),\n phase: phasesSchema,\n runtime: createManifestRuntimeSchema({\n phaseNameSchema,\n playerIdSchema,\n }),\n });\n}\n\n// --- State Definition ---\n\nexport type StateDefinition<\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n> = {\n public: PublicSchema;\n private: PrivateSchema;\n hidden: HiddenSchema;\n};\n\nexport type InitContext<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n > = ManifestContract<Table>,\n Options extends RuntimeRecord = RuntimeRecord,\n> = {\n manifest: Manifest;\n table: Table;\n playerIds: PlayerIdOfTable<Table>[];\n rngSeed?: number | null;\n options: Options;\n q: TableQueriesOfState<{ table: Table }>;\n};\n","import type { ViewData } from \"./spec/views\";\nimport type { z } from \"zod\";\nimport type { RuntimeTableRecord, SchemaLike, RuntimeRecord } from \"./table\";\nimport type {\n InitContext,\n ReducerManifestContract,\n StateDefinition,\n} from \"./manifest\";\nimport type {\n ExactManifestContractOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseNameOfContract,\n PhaseStateMapOfContract,\n PlayerIdOfTable,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n OptionsOfContract,\n TableOfManifest,\n} from \"./extract\";\nimport type {\n ReducerGameState,\n ReducerSessionState,\n RuntimePhaseState,\n} from \"./runtime\";\nimport type {\n InputCollector,\n InteractionMap,\n PhaseDefinition,\n ViewDefinition,\n} from \"./spec\";\n\nexport type ReducerGameContract<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n >,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n Phases extends Record<string, SchemaLike<object>>,\n Errors extends Record<string, string> | undefined = undefined,\n OptionsSchema extends SchemaLike<RuntimeRecord> = SchemaLike<\n Record<string, never>\n >,\n> = {\n manifest: Manifest;\n state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;\n phases: Phases;\n errors?: Errors;\n options: OptionsSchema;\n /** Derived from `phases`; retained as an internal runtime convenience. */\n phaseNames: readonly string[];\n};\n\nexport type ReducerStateForConfig<\n Table extends RuntimeTableRecord,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n PhaseName extends string,\n> = ReducerGameState<\n Table,\n z.infer<PublicSchema>,\n z.infer<PrivateSchema>,\n z.infer<HiddenSchema>,\n RuntimePhaseState,\n PhaseName,\n Record<PhaseName, RuntimePhaseState>\n>;\n\nexport type ReducerSessionForConfig<\n Table extends RuntimeTableRecord,\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n PhaseName extends string,\n Options extends RuntimeRecord = RuntimeRecord,\n> = ReducerSessionState<\n ReducerStateForConfig<\n Table,\n PublicSchema,\n PrivateSchema,\n HiddenSchema,\n PhaseName\n >,\n Options\n>;\n\nexport type BaseGameStateOfContract<Contract> = ReducerGameState<\n TableOfManifest<ManifestContractOf<Contract>>,\n z.infer<PublicSchemaOfContract<Contract>>,\n z.infer<PrivateSchemaOfContract<Contract>>,\n z.infer<HiddenSchemaOfContract<Contract>>,\n PhaseStateMapOfContract<Contract>[PhaseNameOfContract<Contract>],\n PhaseNameOfContract<Contract>,\n PhaseStateMapOfContract<Contract>\n>;\n\nexport type BaseGameSessionOfContract<Contract> = ReducerSessionState<\n BaseGameStateOfContract<Contract>,\n OptionsOfContract<Contract>\n>;\n\n/**\n * Heterogeneous phase map for a contract. Each phase carries its own local\n * `PhaseStateSchema` plus authoring-time Actions/Flows/Interactions/\n * interaction and zone maps. The registries are bound to the contract's base state +\n * manifest so the runtime can iterate them through a single index type\n * without reaching for `any`.\n */\nexport type PhaseMapOf<Contract> = {\n [Name in PhaseNameOfContract<Contract>]: PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n OptionsOfContract<Contract>\n >;\n};\n\nexport type AnyPhaseDefinitionForContract<Contract> =\n PhaseMapOf<Contract>[PhaseNameOfContract<Contract>];\n\n/**\n * Helpers below accept heterogeneous phase maps (each phase binds its own\n * `PhaseStateSchema` + per-phase registries). TypeScript requires the\n * constraint to use a shape compatible with contract-bound state types in a\n * contravariant `initialState` position, so we erase the registry-bound\n * state/manifest generics with `any`. The only purpose of the constraint is\n * to guarantee `Definitions[Name]` is a `PhaseDefinition` so the `extends`\n * check below can infer `PhaseStateSchema`.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type PhaseStateMapOfDefinitions<\n Definitions extends Record<\n string,\n PhaseDefinition<\n SchemaLike<object>,\n any,\n any,\n Record<string, InputCollector>,\n InteractionMap<any, any>,\n any\n >\n >,\n> = Partial<{\n [Name in keyof Definitions & string]: Definitions[Name] extends {\n state: infer PhaseStateSchema extends SchemaLike<object>;\n }\n ? z.infer<PhaseStateSchema>\n : never;\n}>;\n\nexport type PhaseStateOfDefinitions<\n Definitions extends Record<\n string,\n PhaseDefinition<\n SchemaLike<object>,\n any,\n any,\n Record<string, InputCollector>,\n InteractionMap<any, any>,\n any\n >\n >,\n> = {\n [Name in keyof Definitions & string]: Definitions[Name] extends {\n state: infer PhaseStateSchema extends SchemaLike<object>;\n }\n ? z.infer<PhaseStateSchema>\n : never;\n}[keyof Definitions & string];\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\nexport type ResolvedGameStateOf<\n Contract,\n Definitions extends PhaseMapOf<Contract>,\n> = {\n [Name in keyof Definitions & string]: ReducerGameState<\n TableOfManifest<ManifestContractOf<Contract>>,\n z.infer<PublicSchemaOfContract<Contract>>,\n z.infer<PrivateSchemaOfContract<Contract>>,\n z.infer<HiddenSchemaOfContract<Contract>>,\n Definitions[Name] extends {\n state: infer PhaseStateSchema extends SchemaLike<object>;\n }\n ? z.infer<PhaseStateSchema>\n : never,\n PhaseNameOfContract<Contract>\n > & {\n flow: ReducerGameState<\n TableOfManifest<ManifestContractOf<Contract>>,\n z.infer<PublicSchemaOfContract<Contract>>,\n z.infer<PrivateSchemaOfContract<Contract>>,\n z.infer<HiddenSchemaOfContract<Contract>>,\n PhaseStateOfDefinitions<Definitions>,\n PhaseNameOfContract<Contract>\n >[\"flow\"] & {\n currentPhase: Name;\n };\n };\n}[keyof Definitions & string];\n\nexport type ResolvedGameSessionOf<\n Contract,\n Definitions extends PhaseMapOf<Contract>,\n> = ReducerSessionState<\n ResolvedGameStateOf<Contract, Definitions>,\n OptionsOfContract<Contract>\n>;\n\nexport type ViewOfContract<\n Contract,\n Projection extends ViewData = ViewData,\n> = ViewDefinition<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Projection\n>;\n\ntype PhasesOfDefinition<Definition> = Definition extends {\n phases: infer Definitions extends Record<string, unknown>;\n}\n ? Definitions\n : never;\n\ntype NonNeverKeys<Registry> = {\n [Key in keyof Registry]-?: [Registry[Key]] extends [never] ? never : Key;\n}[keyof Registry];\n\nexport type ViewOfDefinition<Definition> = Definition extends {\n view: (...args: never[]) => infer Projection;\n}\n ? Projection\n : never;\n\nexport type PhaseNamesOfDefinition<Definition> =\n keyof PhasesOfDefinition<Definition> & string;\n\nexport type PhaseDefinitionByName<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> = PhaseName extends keyof PhasesOfDefinition<Definition> & string\n ? PhasesOfDefinition<Definition>[PhaseName]\n : never;\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type GameStateOf<Source> = Source extends {\n contract: infer Contract extends ReducerGameContractLike;\n phases: infer Definitions;\n}\n ? Definitions extends PhaseMapOf<Contract>\n ? ResolvedGameStateOf<Contract, Definitions>\n : never\n : Source extends ReducerGameContract<any, any, any, any, any, any, any, any>\n ? BaseGameStateOfContract<Source>\n : never;\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n/**\n * Public structural upper bound for a reducer game contract.\n *\n * The `manifest` slot is intentionally erased with `any` because concrete\n * manifests bind per-contract branded literals (e.g. `PlayerId` unions with\n * specific string literals). Using a ground `ManifestContract<...>` type\n * here would prevent assignability from contract-bound manifests in a\n * contravariant position.\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type ReducerGameContractLike = {\n manifest: any;\n options: SchemaLike<RuntimeRecord>;\n state: StateDefinition<\n SchemaLike<object>,\n SchemaLike<object>,\n SchemaLike<object>\n >;\n};\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\ntype InitialStateContextOf<Contract extends ReducerGameContractLike> =\n InitContext<\n TableOfManifest<ManifestOf<Contract>>,\n ExactManifestContractOf<Contract>,\n OptionsOfContract<Contract>\n >;\n\nexport type InitialStateCallbacks<Contract extends ReducerGameContractLike> = {\n public?: (\n ctx: InitialStateContextOf<Contract>,\n ) => z.infer<PublicSchemaOfContract<Contract>>;\n private?: (\n ctx: InitialStateContextOf<Contract> & {\n playerId: PlayerIdOfTable<TableOfManifest<ManifestOf<Contract>>>;\n },\n ) => z.infer<PrivateSchemaOfContract<Contract>>;\n hidden?: (\n ctx: InitialStateContextOf<Contract>,\n ) => z.infer<HiddenSchemaOfContract<Contract>>;\n};\n\nexport const validatedReducerDefinition: unique symbol = Symbol(\n \"validatedReducerDefinition\",\n);\n\n/** Authored input to game.assemble; no runtime contract or validation marker. */\nexport type ReducerGameDefinitionInput<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = {\n initial?: InitialStateCallbacks<Contract>;\n initialPhase?: PhaseNameOfContract<Contract>;\n // The phase map requires declared keys; this also rejects extra keys in variables.\n phases: Definitions &\n Record<Exclude<keyof Definitions, PhaseNameOfContract<Contract>>, never>;\n view: View;\n};\n\n/** Assembled definition accepted by reducer runtime consumers. */\nexport type ReducerGameDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = {\n readonly [validatedReducerDefinition]: true;\n contract: Contract;\n initial?: InitialStateCallbacks<Contract>;\n initialPhase?: PhaseNameOfContract<Contract>;\n phases: Definitions;\n view: View;\n};\n\nexport type AnyReducerGameDefinition = ReducerGameDefinition<\n ReducerGameContractLike,\n PhaseMapOf<ReducerGameContractLike>,\n ViewOfContract<ReducerGameContractLike>\n>;\n\n// --- Interaction / Zone extractors -------------------------------\n\ntype InteractionRegistriesOfDefinition<Definition> =\n PhasesOfDefinition<Definition>[keyof PhasesOfDefinition<Definition> &\n string] extends {\n interactions?: infer Interactions;\n }\n ? NonNullable<Interactions>\n : never;\n\ntype SimultaneousSubmitRegistriesOfDefinition<Definition> =\n PhasesOfDefinition<Definition>[keyof PhasesOfDefinition<Definition> &\n string] extends {\n submit?: infer Submit;\n }\n ? { submit: NonNullable<Submit> }\n : never;\n\nexport type InteractionIdOfDefinition<Definition> =\n | RegistryKeys<InteractionRegistriesOfDefinition<Definition>>\n | RegistryKeys<SimultaneousSubmitRegistriesOfDefinition<Definition>>;\ntype RegistryKeys<Registry> =\n Registry extends Record<string, unknown>\n ? NonNeverKeys<Registry> & string\n : never;\n\ntype InteractionRegistryOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> =\n PhaseDefinitionByName<Definition, PhaseName> extends {\n interactions?: infer Interactions;\n }\n ? NonNullable<Interactions>\n : Record<string, never>;\n\ntype SimultaneousSubmitRegistryOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> =\n PhaseDefinitionByName<Definition, PhaseName> extends {\n submit?: infer Submit;\n }\n ? { submit: NonNullable<Submit> }\n : Record<string, never>;\n\ntype NonNeverRegistryValue<Registry, Key extends string> =\n Registry extends Record<string, unknown>\n ? Key extends keyof Registry\n ? [Registry[Key]] extends [never]\n ? never\n : Registry[Key]\n : never\n : never;\n\nexport type InteractionIdOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n> =\n PhaseDefinitionByName<Definition, PhaseName> extends { kind: \"auto\" }\n ? never\n : InteractionRegistryOfDefinitionPhase<\n Definition,\n PhaseName\n > extends infer Interactions\n ? SimultaneousSubmitRegistryOfDefinitionPhase<\n Definition,\n PhaseName\n > extends infer Submit\n ? RegistryKeys<Interactions> | RegistryKeys<Submit>\n : never\n : never;\n\nexport type InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n | NonNeverRegistryValue<\n InteractionRegistryOfDefinitionPhase<Definition, PhaseName>,\n InteractionId\n >\n | NonNeverRegistryValue<\n SimultaneousSubmitRegistryOfDefinitionPhase<Definition, PhaseName>,\n InteractionId\n >;\n\ntype CollectorKindsOf<Collectors> =\n Collectors extends Record<string, InputCollector>\n ? Collectors[keyof Collectors] extends infer Collector\n ? Collector extends { kind: infer Kind extends string }\n ? Kind\n : never\n : never\n : never;\n\ntype CollectorKeysWithKind<Collectors, Kind extends string> =\n Collectors extends Record<string, InputCollector>\n ? {\n [K in keyof Collectors]: Collectors[K] extends {\n kind: infer CollectorKind;\n }\n ? Extract<CollectorKind, Kind> extends never\n ? never\n : K\n : never;\n }[keyof Collectors]\n : never;\n\ntype CardCollectorZoneIds<Collector> = Collector extends {\n kind: \"card\";\n meta: infer Meta;\n}\n ? Meta extends { readonly zoneIds: infer ZoneIds extends readonly string[] }\n ? ZoneIds[number]\n : Meta extends { readonly zoneId: infer ZoneId extends string }\n ? ZoneId\n : never\n : never;\n\ntype CollectorCardZoneIds<Collectors, Input extends string> =\n Collectors extends Record<string, InputCollector>\n ? Input extends keyof Collectors\n ? CardCollectorZoneIds<Collectors[Input]>\n : never\n : never;\n\ntype CollectorsOfInteractionDefinition<Spec> = Spec extends {\n readonly steps: {\n readonly collectors: infer Collectors extends Record<\n string,\n InputCollector\n >;\n };\n}\n ? Collectors\n : Spec extends {\n readonly inputs?: infer Collectors;\n }\n ? NonNullable<Collectors> extends Record<string, InputCollector>\n ? NonNullable<Collectors>\n : Record<string, never>\n : Record<string, never>;\n\n/** The canonical collector for a named interaction input, including step inputs. */\nexport type InputCollectorOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n Input extends string,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Input extends keyof CollectorsOfInteractionDefinition<Spec>\n ? CollectorsOfInteractionDefinition<Spec>[Input]\n : Input extends \"cardId\"\n ? Spec extends {\n readonly cardType: unknown;\n readonly playFrom: unknown;\n }\n ? { readonly kind: \"card\" }\n : never\n : never\n : never;\n\ntype CollectorKindsOfInteractionDefinition<Spec> =\n | (Spec extends { readonly cardType: unknown; readonly playFrom: unknown }\n ? \"card\"\n : never)\n | CollectorKindsOf<CollectorsOfInteractionDefinition<Spec>>;\n\ntype InputKeysWithCollectorKindOfInteractionDefinition<\n Spec,\n Kind extends string,\n> =\n | (Spec extends { readonly cardType: unknown; readonly playFrom: unknown }\n ? Extract<\"card\", Kind> extends never\n ? never\n : \"cardId\"\n : never)\n | (CollectorKeysWithKind<CollectorsOfInteractionDefinition<Spec>, Kind> &\n string);\n\ntype CardInputZoneIdsOfInteractionDefinition<\n Spec,\n Input extends string,\n> = Input extends \"cardId\"\n ? Spec extends { readonly playFrom: infer PlayFrom extends string }\n ? PlayFrom\n : CollectorCardZoneIds<CollectorsOfInteractionDefinition<Spec>, Input>\n : CollectorCardZoneIds<CollectorsOfInteractionDefinition<Spec>, Input>;\n\ntype ParamsOfCollectors<Collectors> =\n Collectors extends Record<string, InputCollector>\n ? {\n [K in keyof Collectors]: Collectors[K] extends InputCollector<infer S>\n ? S extends SchemaLike<infer V>\n ? V\n : never\n : never;\n }\n : never;\n\ntype ClientParamsOfCollectors<Collectors> =\n Collectors extends Record<string, InputCollector>\n ? {\n [\n K in keyof Collectors as Collectors[K] extends {\n readonly kind: \"rng\";\n }\n ? never\n : K\n ]: Collectors[K] extends InputCollector<infer S>\n ? S extends SchemaLike<infer V>\n ? V\n : never\n : never;\n }\n : never;\n\ntype InteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n Kind extends string,\n> = {\n [\n InteractionId in InteractionIdOfDefinitionPhase<Definition, PhaseName>\n ]: InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Extract<CollectorKindsOfInteractionDefinition<Spec>, Kind> extends never\n ? never\n : InteractionId\n : never;\n}[InteractionIdOfDefinitionPhase<Definition, PhaseName>];\n\ntype QualifiedInteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n Kind extends string,\n> =\n InteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName,\n Kind\n > extends infer InteractionId extends string\n ? `${PhaseName}.${InteractionId}`\n : never;\n\nexport type BoardInteractionKeyOfDefinition<Definition> = {\n [\n PhaseName in PhaseNamesOfDefinition<Definition>\n ]: QualifiedInteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName,\n \"board-edge\" | \"board-space\" | \"board-tile\" | \"board-vertex\"\n >;\n}[PhaseNamesOfDefinition<Definition>];\n\nexport type CardInteractionKeyOfDefinition<Definition> = {\n [\n PhaseName in PhaseNamesOfDefinition<Definition>\n ]: QualifiedInteractionIdsWithCollectorKindOfDefinitionPhase<\n Definition,\n PhaseName,\n \"card\"\n >;\n}[PhaseNamesOfDefinition<Definition>];\n\nexport type InputKeysWithCollectorKindOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n Kind extends string,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? InputKeysWithCollectorKindOfInteractionDefinition<Spec, Kind>\n : never;\n\nexport type CardInputZoneIdsOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n Input extends string,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? CardInputZoneIdsOfInteractionDefinition<Spec, Input>\n : never;\n\nexport type ParamsOfInteractionOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Spec extends { readonly cardType: unknown; readonly playFrom: unknown }\n ? { cardId: string } & ParamsOfCollectors<\n CollectorsOfInteractionDefinition<Spec>\n >\n : ParamsOfCollectors<CollectorsOfInteractionDefinition<Spec>>\n : never;\n\n/**\n * Client-facing params shape for an interaction. Omits engine-sampled\n * collectors (`rngInput.*`) — clients never supply those fields; the\n * trusted reducer bundle fills them during `submitInteraction`.\n *\n * This is the type that drives `submit(playerId, id, params)`,\n * `handle.submit(params)`, and the generated `InteractionParams` surface\n * through `createGameUi(game)`. The `reduce`-input counterpart is\n * {@link ParamsOfInteractionOfDefinition}, which includes every field\n * because the engine has already filled the sampled ones by then.\n */\ntype CurrentStepParams<Collectors extends Record<string, InputCollector>> = {\n [Key in keyof Collectors]: Pick<\n ClientParamsOfCollectors<Collectors>,\n Key & keyof ClientParamsOfCollectors<Collectors>\n > & { [Other in Exclude<keyof Collectors, Key>]?: never };\n}[keyof Collectors];\n\nexport type ClientParamsOfInteractionOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? Spec extends { readonly steps: unknown }\n ? CurrentStepParams<CollectorsOfInteractionDefinition<Spec>>\n : Spec extends { readonly cardType: unknown; readonly playFrom: unknown }\n ? { cardId: string } & ClientParamsOfCollectors<\n CollectorsOfInteractionDefinition<Spec>\n >\n : ClientParamsOfCollectors<CollectorsOfInteractionDefinition<Spec>>\n : never;\n\ntype DefaultedClientCollectorKeys<\n Collectors extends Record<string, InputCollector>,\n> = {\n [K in keyof Collectors]: Collectors[K] extends {\n readonly kind: \"rng\";\n }\n ? never\n : Collectors[K] extends { readonly defaultValue: unknown }\n ? K\n : never;\n}[keyof Collectors];\n\nexport type DefaultedClientParamKeysOfInteractionOfDefinition<\n Definition,\n PhaseName extends PhaseNamesOfDefinition<Definition>,\n InteractionId extends InteractionIdOfDefinitionPhase<Definition, PhaseName>,\n> =\n InteractionSpecByNameOfDefinitionPhase<\n Definition,\n PhaseName,\n InteractionId\n > extends infer Spec\n ? DefaultedClientCollectorKeys<CollectorsOfInteractionDefinition<Spec>> &\n string\n : never;\n\ntype ZoneRegistriesOfDefinition<Definition> =\n PhasesOfDefinition<Definition>[keyof PhasesOfDefinition<Definition> &\n string] extends {\n zones?: infer Zones;\n }\n ? NonNullable<Zones>\n : never;\n\nexport type ZoneIdsOfDefinition<Definition> =\n ZoneRegistriesOfDefinition<Definition> extends infer Zones\n ? Zones extends readonly (infer ZoneId)[]\n ? Extract<ZoneId, string>\n : never\n : never;\n","import { z } from \"zod\";\nimport type { Brand } from \"./model/table\";\n\n/**\n * Opaque brand applied to a runtime player identifier.\n *\n * The reducer owns the branded `PlayerId` identity. Authors\n * obtain `PlayerId` values only through:\n * - `q.player.order()` / `q.player.current()` (reducer queries),\n * - engine-injected interaction and phase callback arguments,\n * - `asPlayerId(raw)` as an explicit escape hatch (e.g. ingress parsing).\n *\n * The brand is a phantom type: at runtime a `PlayerId` is just a string.\n * Do not JSON-serialize the brand marker; it exists purely at the type\n * level to block accidental literal comparisons such as\n * `playerId === \"player-1\"`.\n */\nexport type PlayerId = Brand<string, \"PlayerId\">;\n\n/**\n * Explicit conversion from a raw string to a branded `PlayerId`.\n *\n * Use at trust boundaries only (wire ingress, tests, fixtures). Inside\n * reducer logic, obtain `PlayerId` values from the engine instead of\n * constructing them yourself.\n */\nexport function asPlayerId(raw: string): PlayerId {\n return raw as PlayerId;\n}\n\n/**\n * Type guard that narrows `unknown` to `PlayerId` when the value is a\n * non-empty string. Does not validate against a specific player roster;\n * use manifest/ingress parsing for that.\n */\nexport function isPlayerId(value: unknown): value is PlayerId {\n return typeof value === \"string\" && value.length > 0;\n}\n\n// ---------------------------------------------------------------------------\n// BoardRef: replacement for flat `\"board:player-N\"` literal unions.\n// ---------------------------------------------------------------------------\n\n/**\n * Reference to a board by its authored `baseId`, plus an optional seat\n * for per-player boards.\n *\n * Replaces the old generated `\"ring:player-1\" | \"ring:player-2\" | ...`\n * flat unions whose keys pretended to be static but were actually\n * derived from `maxPlayers` and therefore misaligned with the runtime\n * seat list.\n *\n * The discriminant is the *presence* of `seat`, not a `scope` field, so\n * authors can destructure and pass the ref directly without needing a\n * discriminator check for shared boards.\n */\nexport type BoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> = SharedBoardRef<BaseId> | PerPlayerBoardRef<BaseId, Id>;\n\nexport interface SharedBoardRef<BaseId extends string = string> {\n readonly baseId: BaseId;\n readonly seat?: undefined;\n}\n\nexport interface PerPlayerBoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> {\n readonly baseId: BaseId;\n readonly seat: Id;\n}\n\n/** Construct a shared board ref. */\nexport function sharedBoardRef<BaseId extends string>(\n baseId: BaseId,\n): SharedBoardRef<BaseId> {\n return { baseId };\n}\n\n/** Construct a per-player board ref. */\nexport function perPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat: Id,\n): PerPlayerBoardRef<BaseId, Id> {\n return { baseId, seat };\n}\n\n/**\n * Construct a `BoardRef` without knowing the scope ahead of time. Pass\n * `seat` for per-player boards; omit for shared boards.\n */\nexport function boardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat?: Id,\n): BoardRef<BaseId, Id> {\n if (seat === undefined) {\n return { baseId };\n }\n return { baseId, seat };\n}\n\n/** Stable string key for Maps/Records keyed by a `BoardRef`. */\nexport function boardRefKey(ref: BoardRef): string {\n return ref.seat === undefined ? ref.baseId : `${ref.baseId}:${ref.seat}`;\n}\n\n/**\n * Inverse of `boardRefKey`. Parses `\"base\"` as a shared ref and\n * `\"base:player-N\"` as a per-player ref. Returns `null` for malformed\n * input.\n */\nexport function parseBoardRefKey(key: string): BoardRef | null {\n if (!key.length) {\n return null;\n }\n const colon = key.indexOf(\":\");\n if (colon < 0) {\n return { baseId: key };\n }\n const baseId = key.slice(0, colon);\n const seat = key.slice(colon + 1);\n if (!baseId.length || !seat.length) {\n return null;\n }\n return { baseId, seat: seat as PlayerId };\n}\n\n/**\n * Zod schema for a `BoardRef` with free-form base and seat ids.\n *\n * Feed a manifest-scoped `baseIdSchema` and `playerIdSchema` to bind\n * the ref to a specific workspace.\n */\nexport function boardRefSchema<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n>(\n options: {\n readonly baseIdSchema?: z.ZodType<BaseId>;\n readonly playerIdSchema?: z.ZodType<Id>;\n } = {},\n): z.ZodType<BoardRef<BaseId, Id>> {\n const baseSchema =\n options.baseIdSchema ?? (z.string().min(1) as unknown as z.ZodType<BaseId>);\n const playerSchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n const shared = z.strictObject({ baseId: baseSchema });\n const perPlayer = z.strictObject({ baseId: baseSchema, seat: playerSchema });\n return z.union([perPlayer, shared]) as unknown as z.ZodType<\n BoardRef<BaseId, Id>\n >;\n}\n\n/** True when `ref` targets a shared board (no seat). */\nexport function isSharedBoardRef<BaseId extends string>(\n ref: BoardRef<BaseId, PlayerId>,\n): ref is SharedBoardRef<BaseId> {\n return ref.seat === undefined;\n}\n\n/** True when `ref` targets a per-player board (has a seat). */\nexport function isPerPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n ref: BoardRef<BaseId, Id>,\n): ref is PerPlayerBoardRef<BaseId, Id> {\n return ref.seat !== undefined;\n}\n","import { z } from \"zod\";\nimport type * as Wire from \"./runtime-types.js\";\n\n/** Exact worker ABI version; hosts must reject mismatched bundles. */\nexport const REDUCER_CONTRACT_VERSION = \"0.7.0\" as const;\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface ReducerBundleContract {\n readonly reducerContractVersion: Wire.ReducerContractVersion;\n initialize(\n input: Wire.InitializeRequest,\n ): MaybePromise<Wire.InitializeResult>;\n dispatch(input: Wire.DispatchRequest): MaybePromise<Wire.DispatchResult>;\n boardStatic(): Wire.BoardStaticProjection | null;\n project(input: Wire.ProjectRequest): Wire.SeatProjectionBundle;\n}\n\nconst callable = z.custom<(...args: never[]) => unknown>(\n (value) => typeof value === \"function\",\n);\n// Admission checks identity and callables without wrapping/replacing methods.\nconst bundleSchema = z.object({\n reducerContractVersion: z.literal(REDUCER_CONTRACT_VERSION),\n initialize: callable,\n dispatch: callable,\n boardStatic: callable,\n project: callable,\n});\n\nexport function assertReducerBundleContract(\n value: unknown,\n source: string,\n): asserts value is ReducerBundleContract {\n const result = bundleSchema.safeParse(value);\n if (result.success) return;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`Reducer bundle ${source} did not export an object.`);\n }\n const bundle = value as Record<string, unknown>;\n if (bundle.reducerContractVersion !== REDUCER_CONTRACT_VERSION) {\n throw new Error(\n `Reducer bundle ${source} requires exact contract ${REDUCER_CONTRACT_VERSION}; received ${String(bundle.reducerContractVersion ?? \"missing\")}.`,\n );\n }\n const method = result.error.issues[0]?.path[0];\n throw new Error(`Reducer bundle ${source} is missing ${String(method)}().`);\n}\n","import type { DispatchTraceEntry } from \"./core/types\";\n\nexport type DispatchTraceSummaryEntry =\n | { kind: \"acceptedClientInput\"; interactionId: string; playerId: string }\n | { kind: \"phaseEntered\"; from: string; to: string }\n | {\n kind: \"rngConsumption\";\n version: 2;\n operation: string;\n drawIndex: number;\n };\n\nexport type ReducerDiagnosticEvent =\n | {\n type: \"submitReceived\";\n submissionId: string;\n playerId: string;\n interactionId: string;\n phase: string;\n }\n | {\n type: \"submitRejected\";\n submissionId: string;\n errorCode: string;\n ruleId?: string;\n message?: string;\n }\n | {\n type: \"submitAccepted\";\n submissionId: string;\n trace: readonly DispatchTraceSummaryEntry[];\n }\n | {\n type: \"phaseTransition\";\n from: string;\n to: string;\n reason: \"effect\" | \"lifecycle\";\n }\n | { type: \"authoringWarning\"; code: string; message: string }\n | {\n type: \"internalError\";\n submissionId?: string;\n message: string;\n stack?: string;\n };\n\nexport type ReducerDiagnosticsSink = {\n event(event: ReducerDiagnosticEvent): void;\n};\n\nexport const noopDiagnosticsSink: ReducerDiagnosticsSink = {\n event() {},\n};\n\nexport type ReducerDiagnosticsEmitter = ReducerDiagnosticsSink & {\n readonly disabled: boolean;\n};\n\nfunction messageFromUnknown(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction stackFromUnknown(error: unknown): string | undefined {\n return error instanceof Error ? error.stack : undefined;\n}\n\nexport function createReducerDiagnosticsEmitter(\n sink: ReducerDiagnosticsSink | undefined,\n): ReducerDiagnosticsEmitter {\n const target = sink ?? noopDiagnosticsSink;\n let disabled = false;\n return {\n get disabled() {\n return disabled;\n },\n event(event) {\n if (disabled) return;\n try {\n target.event(event);\n } catch (error) {\n disabled = true;\n try {\n target.event({\n type: \"internalError\",\n submissionId:\n \"submissionId\" in event ? event.submissionId : undefined,\n message: `Reducer diagnostics sink threw: ${messageFromUnknown(\n error,\n )}`,\n stack: stackFromUnknown(error),\n });\n } catch {\n // A diagnostics sink must never break reducer execution.\n }\n }\n },\n };\n}\n\nexport function summarizeDispatchTrace<State, PlayerId extends string>(\n trace: readonly DispatchTraceEntry<State, PlayerId>[],\n): DispatchTraceSummaryEntry[] {\n return trace.map((entry) => {\n switch (entry.type) {\n case \"acceptedClientInput\":\n return {\n kind: \"acceptedClientInput\" as const,\n interactionId:\n entry.input.kind === \"interaction\"\n ? entry.input.interactionId\n : entry.input.kind,\n playerId:\n entry.input.kind === \"interaction\" ? entry.input.playerId : \"\",\n };\n case \"phaseEntered\":\n return {\n kind: \"phaseEntered\" as const,\n from: String(entry.from),\n to: String(entry.to),\n };\n case \"rngConsumption\":\n return {\n kind: \"rngConsumption\" as const,\n version: entry.version,\n operation: entry.operation,\n drawIndex: entry.drawIndex,\n };\n default: {\n const _exhaustive: never = entry;\n return _exhaustive;\n }\n }\n });\n}\n","import type {\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeComponentLocation,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n} from \"../model\";\n\nexport function ensureArray<T>(value: readonly T[] | T[] | undefined): T[] {\n return Array.isArray(value) ? [...value] : [];\n}\n\nfunction locationPosition(location: RuntimeComponentLocation): number {\n return \"position\" in location && typeof location.position === \"number\"\n ? location.position\n : Number.MAX_SAFE_INTEGER;\n}\n\nexport function orderedComponentIdsForLocation(\n table: RuntimeTableRecord,\n predicate: (location: RuntimeComponentLocation) => boolean,\n): string[] {\n return Object.entries(table.componentLocations)\n .filter(([, location]) => predicate(location))\n .sort(\n (left, right) => locationPosition(left[1]) - locationPosition(right[1]),\n )\n .map(([componentId]) => componentId);\n}\n\nfunction hasOwnKey(record: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction isSharedZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.decks, zoneId) || hasOwnKey(table.zones.shared, zoneId)\n );\n}\n\nfunction isPlayerZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.hands, zoneId) ||\n hasOwnKey(table.zones.perPlayer, zoneId) ||\n hasOwnKey(table.handVisibility, zoneId)\n );\n}\n\nfunction zoneScopeForId(\n table: RuntimeTableRecord,\n zoneId: string,\n): \"shared\" | \"perPlayer\" | null {\n if (isPlayerZoneId(table, zoneId)) {\n return \"perPlayer\";\n }\n if (isSharedZoneId(table, zoneId)) {\n return \"shared\";\n }\n return null;\n}\n\nexport function assertZoneScope(\n table: RuntimeTableRecord,\n zoneId: string,\n expectedScope: \"shared\" | \"perPlayer\",\n operation: string,\n argumentName: string,\n): void {\n const actualScope = zoneScopeForId(table, zoneId);\n if (actualScope === expectedScope) {\n return;\n }\n\n if (actualScope === null) {\n throw new Error(\n `Unknown zone '${zoneId}' passed as ${argumentName} to ${operation}.`,\n );\n }\n\n throw new Error(\n `Zone '${zoneId}' has scope '${actualScope}', but ${operation} requires ${argumentName} to be a ${expectedScope === \"shared\" ? \"shared\" : \"perPlayer\"} zone.`,\n );\n}\n\nexport function syncSharedZoneWithDeck<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId, nextCards: readonly string[]): void {\n table.decks[zoneId] = [...nextCards] as Table[\"decks\"][ZoneId];\n table.zones.shared[zoneId] = [\n ...nextCards,\n ] as Table[\"zones\"][\"shared\"][ZoneId];\n}\n\nexport function syncPlayerZoneWithHand<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n playerId: PlayerId,\n nextCards: readonly string[],\n): void {\n table.hands[zoneId] = {\n ...table.hands[zoneId],\n [playerId as string]: [...nextCards],\n } as Table[\"hands\"][ZoneId];\n table.zones.perPlayer[zoneId] = {\n ...table.zones.perPlayer[zoneId],\n [playerId as string]: [...nextCards],\n } as Table[\"zones\"][\"perPlayer\"][ZoneId];\n}\n","import { requireLookup } from \"../../shared/lookup.js\";\nimport { createHexBoardGeometry } from \"../../shared/hex-board\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n ComponentIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n RuntimeHexBoardState,\n RuntimeBoardState,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeStateOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexStateOfTable,\n TiledVertexTypeIdOfTable,\n} from \"../model\";\nimport { orderedComponentIdsForLocation } from \"./internal\";\n\nconst hexGeometries = new WeakMap<\n RuntimeHexBoardState,\n ReturnType<typeof createHexBoardGeometry>\n>();\nfunction geometryOf(board: RuntimeHexBoardState) {\n let geometry = hexGeometries.get(board);\n if (!geometry) {\n geometry = createHexBoardGeometry({\n id: board.baseId ?? board.id,\n orientation: board.orientation,\n spaces: Object.values(board.spaces),\n });\n hexGeometries.set(board, geometry);\n }\n return geometry;\n}\n\nexport function getBoard<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n>(table: Table, boardId: BoardId): Table[\"boards\"][\"byId\"][BoardId] {\n return requireLookup(\n table.boards.byId[boardId],\n \"Board\",\n boardId,\n ) as Table[\"boards\"][\"byId\"][BoardId];\n}\n\nexport function getHexBoard<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >;\n}\n\nexport function getTiledBoard<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" | \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" | \"square\" }\n >;\n}\n\nexport function getSquareBoard<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >;\n}\n\nexport function getSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId] {\n return requireLookup(\n getBoard(table, boardId).spaces[spaceId],\n `Space on board ${boardId}`,\n spaceId,\n ) as Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId];\n}\n\nexport function getHexSpace<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends HexSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n>[\"spaces\"][SpaceId] {\n return getSpace(table, boardId, spaceId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getSquareSpace<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n>[\"spaces\"][SpaceId] {\n return getSpace(table, boardId, spaceId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId] {\n return requireLookup(\n getBoard(table, boardId).containers[containerId],\n `Container on board ${boardId}`,\n containerId,\n ) as Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId];\n}\n\nexport function getEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledEdgeStateOfTable<Table, BoardId, EdgeId> {\n const edge = getTiledBoard(table, boardId).edges.find(\n (candidate) => candidate.id === edgeId,\n );\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n return edge as TiledEdgeStateOfTable<Table, BoardId, EdgeId>;\n}\n\nexport function getVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledVertexStateOfTable<Table, BoardId, VertexId> {\n const vertex = getTiledBoard(table, boardId).vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n return vertex as TiledVertexStateOfTable<Table, BoardId, VertexId>;\n}\n\nexport function getHexSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n q: number,\n r: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getHexBoard(table, boardId).spaces).find(\n (space) => space.q === q && space.r === r,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSquareSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n row: number,\n col: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getSquareBoard(table, boardId).spaces).find(\n (space) => space.row === row && space.col === col,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSpaceEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.spaceIds.includes(spaceId))\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getSpaceVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.spaceIds.includes(spaceId))\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n if (tiledBoard.layout === \"hex\") {\n const geometry = geometryOf(tiledBoard);\n const vertex = geometry.vertices.find((vertex) => vertex.id === vertexId);\n if (!vertex)\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n return vertex.edgeIds as TiledEdgeIdOfTable<Table, BoardId>[];\n }\n\n const vertex = tiledBoard.vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n const vertexSpaceIds = new Set(vertex.spaceIds);\n return tiledBoard.edges\n .filter((edge) =>\n edge.spaceIds.every((spaceId) => vertexSpaceIds.has(spaceId)),\n )\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n if (tiledBoard.layout === \"hex\") {\n const geometry = geometryOf(tiledBoard);\n const edge = geometry.edges.find((edge) => edge.id === edgeId);\n if (!edge)\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n return edge.vertexIds as unknown as TiledVertexIdOfTable<Table, BoardId>[];\n }\n\n const edge = tiledBoard.edges.find((candidate) => candidate.id === edgeId);\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n const edgeSpaceIds = new Set(edge.spaceIds);\n return tiledBoard.vertices\n .filter((vertex) =>\n Array.from(edgeSpaceIds).every((spaceId) =>\n vertex.spaceIds.includes(spaceId),\n ),\n )\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getRelatedSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n TypeId extends RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n): SpaceId[] {\n const board = getBoard(table, boardId);\n const related = new Set<SpaceId>();\n\n for (const relation of board.relations) {\n if (relation.typeId !== relationTypeId) {\n continue;\n }\n if (relation.fromSpaceId === spaceId) {\n related.add(relation.toSpaceId as SpaceId);\n continue;\n }\n if (!relation.directed && relation.toSpaceId === spaceId) {\n related.add(relation.fromSpaceId as SpaceId);\n }\n }\n\n return [...related];\n}\n\nexport function getAdjacentSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): SpaceId[] {\n const board = getBoard(table, boardId);\n if (board.layout === \"hex\")\n return geometryOf(board).neighbors(spaceId) as SpaceId[];\n return getRelatedSpaces(\n table,\n boardId,\n spaceId,\n \"adjacent\" as RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n );\n}\n\nexport function getSpaceDistance<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n): number {\n const board = getBoard(table, boardId);\n if (board.layout === \"hex\")\n return geometryOf(board).distance(fromSpaceId, toSpaceId);\n if (fromSpaceId === toSpaceId) {\n return 0;\n }\n\n const visited = new Set<string>([fromSpaceId]);\n let frontier: string[] = [fromSpaceId];\n let distance = 0;\n\n while (frontier.length > 0) {\n distance += 1;\n const nextFrontier: string[] = [];\n\n for (const currentSpaceId of frontier) {\n for (const neighborId of getAdjacentSpaces(\n table,\n boardId,\n currentSpaceId as SpaceId,\n )) {\n if (neighborId === toSpaceId) {\n return distance;\n }\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n nextFrontier.push(neighborId);\n }\n }\n }\n\n frontier = nextFrontier;\n }\n\n return Number.POSITIVE_INFINITY;\n}\n\nexport function getSquareNeighbors<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n options: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" } = {},\n): SquareSpaceIdOfTable<Table, BoardId>[] {\n const board = getSquareBoard(table, boardId);\n const space = getSquareSpace(table, boardId, spaceId);\n const offsets: ReadonlyArray<readonly [number, number]> =\n options.mode === \"diagonal\"\n ? [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : options.mode === \"all\"\n ? [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n ];\n\n return offsets\n .map(([rowOffset, colOffset]) =>\n Object.values(board.spaces).find(\n (candidate) =>\n candidate.row === space.row + rowOffset &&\n candidate.col === space.col + colOffset,\n ),\n )\n .filter((candidate): candidate is typeof space => candidate !== undefined)\n .map((candidate) => candidate.id as SquareSpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getSquareDistance<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options: { metric?: \"manhattan\" | \"chebyshev\" } = {},\n): number {\n const from = getSquareSpace(table, boardId, fromSpaceId);\n const to = getSquareSpace(table, boardId, toSpaceId);\n const rowDistance = Math.abs(from.row - to.row);\n const colDistance = Math.abs(from.col - to.col);\n\n return options.metric === \"chebyshev\"\n ? Math.max(rowDistance, colDistance)\n : rowDistance + colDistance;\n}\n\nexport function getBoardsByTypeId<\n Table extends RuntimeTableRecord,\n TypeId extends BoardTypeIdOfTable<NoInfer<Table>>,\n>(table: Table, typeId: TypeId): BoardIdOfTable<Table>[] {\n return Object.entries(table.boards.byId)\n .filter(([, board]) => board.typeId === typeId)\n .map(([boardId]) => boardId as BoardIdOfTable<Table>);\n}\n\nexport function getSpacesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n TypeId extends SpaceTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): SpaceIdOfTable<Table, BoardId>[] {\n return Object.entries(getBoard(table, boardId).spaces)\n .filter(([, space]) => space.typeId === typeId)\n .map(([spaceId]) => spaceId as SpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getEdgesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledEdgeTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.typeId === typeId)\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getVerticesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledVertexTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.typeId === typeId)\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getComponentsOnSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getSpace(table, boardId, spaceId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"OnSpace\" &&\n location.boardId === boardId &&\n location.spaceId === spaceId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getContainer(table, boardId, containerId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"InContainer\" &&\n location.boardId === boardId &&\n location.containerId === containerId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function bindBoardQueries<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n>(table: Table, boardId: BoardId) {\n const state = getBoard(table, boardId);\n const common = {\n state,\n space: <SpaceId extends SpaceIdOfTable<Table, BoardId>>(id: SpaceId) => {\n return getSpace(table, boardId, id);\n },\n container: <ContainerId extends BoardContainerIdOfTable<Table, BoardId>>(\n id: ContainerId,\n ) => getContainer(table, boardId, id),\n spacesByType: <TypeId extends SpaceTypeIdOfTable<Table, BoardId>>(\n id: TypeId,\n ) => getSpacesByTypeId(table, boardId, id),\n relatedSpaces: <\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n TypeId extends RelationTypeIdOfTable<Table, BoardId>,\n >(\n id: SpaceId,\n typeId: TypeId,\n ) => getRelatedSpaces(table, boardId, id, typeId),\n neighbors: (id: SpaceIdOfTable<Table, BoardId>) =>\n getAdjacentSpaces(table, boardId, id),\n distance: (\n from: SpaceIdOfTable<Table, BoardId>,\n to: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceDistance(table, boardId, from, to),\n spaceOccupants: (id: SpaceIdOfTable<Table, BoardId>) =>\n getComponentsOnSpace(table, boardId, id),\n containerOccupants: (id: BoardContainerIdOfTable<Table, BoardId>) =>\n getComponentsInContainer(table, boardId, id),\n };\n if (state.layout === \"hex\") {\n const geometry = geometryOf(state);\n const {\n edgesOf: spaceEdges,\n verticesOf: spaceVertices,\n incidentEdges: edgesOf,\n incidentVertices: verticesOf,\n ...queries\n } = geometry;\n return {\n ...common,\n ...queries,\n spaceEdges,\n spaceVertices,\n edgesOf,\n verticesOf,\n } as unknown as BoundBoardQueries<\n Table[\"boards\"][\"byId\"][BoardId],\n ComponentIdOfTable<Table>\n >;\n }\n if (state.layout === \"square\") {\n const tiledId = boardId as unknown as SquareBoardIdOfTable<Table> &\n TiledBoardIdOfTable<Table>;\n return {\n ...common,\n edgesOf: (id: TiledVertexIdOfTable<Table, typeof tiledId>) =>\n getIncidentEdges(table, tiledId, id),\n verticesOf: (id: TiledEdgeIdOfTable<Table, typeof tiledId>) =>\n getIncidentVertices(table, tiledId, id),\n spaceEdges: (id: SpaceIdOfTable<Table, typeof tiledId>) =>\n getSpaceEdges(table, tiledId, id),\n spaceVertices: (id: SpaceIdOfTable<Table, typeof tiledId>) =>\n getSpaceVertices(table, tiledId, id),\n spacesAt: (id: TiledVertexIdOfTable<Table, typeof tiledId>) =>\n state.vertices.find((vertex) => vertex.id === id)!.spaceIds,\n spacesAlong: (id: TiledEdgeIdOfTable<Table, typeof tiledId>) =>\n state.edges.find((edge) => edge.id === id)!.spaceIds,\n neighbors: (\n id: SquareSpaceIdOfTable<Table, typeof tiledId>,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => getSquareNeighbors(table, tiledId, id, options),\n distance: (\n from: SquareSpaceIdOfTable<Table, typeof tiledId>,\n to: SquareSpaceIdOfTable<Table, typeof tiledId>,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, tiledId, from, to, options),\n } as unknown as BoundBoardQueries<\n Table[\"boards\"][\"byId\"][BoardId],\n ComponentIdOfTable<Table>\n >;\n }\n return common as BoundBoardQueries<\n Table[\"boards\"][\"byId\"][BoardId],\n ComponentIdOfTable<Table>\n >;\n}\n\ntype SpaceId<Board extends RuntimeBoardState> = keyof Board[\"spaces\"] & string;\ntype CommonBoardQueries<\n Board extends RuntimeBoardState,\n ComponentId extends string,\n> = {\n state: Board;\n space<Id extends SpaceId<Board>>(id: Id): Board[\"spaces\"][Id];\n container<Id extends keyof Board[\"containers\"] & string>(\n id: Id,\n ): Board[\"containers\"][Id];\n spacesByType(\n id: Extract<Board[\"spaces\"][keyof Board[\"spaces\"]][\"typeId\"], string>,\n ): SpaceId<Board>[];\n relatedSpaces(\n id: SpaceId<Board>,\n typeId: Board[\"relations\"][number][\"typeId\"],\n ): SpaceId<Board>[];\n neighbors(id: SpaceId<Board>): SpaceId<Board>[];\n distance(from: SpaceId<Board>, to: SpaceId<Board>): number;\n spaceOccupants(id: SpaceId<Board>): ComponentId[];\n containerOccupants(id: keyof Board[\"containers\"] & string): ComponentId[];\n};\ntype HexQueries<Board extends RuntimeBoardState> = ReturnType<\n typeof createHexBoardGeometry<\n Extract<Board[\"baseId\"], string>,\n SpaceId<Board>\n >\n>;\nexport type BoundBoardQueries<\n Board extends RuntimeBoardState,\n ComponentId extends string,\n> = CommonBoardQueries<Board, ComponentId> &\n (Board extends { layout: \"hex\" }\n ? Omit<\n HexQueries<Board>,\n \"edgesOf\" | \"verticesOf\" | \"incidentEdges\" | \"incidentVertices\"\n > & {\n spaceEdges: HexQueries<Board>[\"edgesOf\"];\n spaceVertices: HexQueries<Board>[\"verticesOf\"];\n edgesOf: HexQueries<Board>[\"incidentEdges\"];\n verticesOf: HexQueries<Board>[\"incidentVertices\"];\n }\n : Board extends {\n layout: \"square\";\n edges: readonly { id: infer EdgeId extends string }[];\n vertices: readonly { id: infer VertexId extends string }[];\n }\n ? {\n edgesOf(id: VertexId): EdgeId[];\n verticesOf(id: EdgeId): VertexId[];\n spaceEdges(id: SpaceId<Board>): EdgeId[];\n spaceVertices(id: SpaceId<Board>): VertexId[];\n spacesAt(id: VertexId): SpaceId<Board>[];\n spacesAlong(id: EdgeId): SpaceId<Board>[];\n neighbors(\n id: SpaceId<Board>,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ): SpaceId<Board>[];\n distance(\n from: SpaceId<Board>,\n to: SpaceId<Board>,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ): number;\n }\n : unknown);\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n RuntimeTableRecord,\n} from \"../model\";\nimport { getContainer } from \"./board-queries\";\n\nfunction allowedCardSetIdsForZone(\n table: RuntimeTableRecord,\n zoneId: string,\n): readonly string[] {\n return table.zones.cardSetIdsByZoneId?.[zoneId] ?? [];\n}\n\nexport function assertCardAllowedInZone<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds = allowedCardSetIdsForZone(table, zoneId);\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter zone '${zoneId}'.`,\n );\n }\n}\n\nexport function assertCardAllowedInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds =\n getContainer(table, boardId, containerId).allowedCardSetIds ?? [];\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter container '${containerId}' on board '${boardId}'.`,\n );\n }\n}\n","import type { RuntimeBoardState, RuntimeTableRecord } from \"../model\";\n\nlet cloneRuntimeTableCallCount = 0;\n\nexport function resetCloneRuntimeTableCallCount(): void {\n cloneRuntimeTableCallCount = 0;\n}\n\nexport function getCloneRuntimeTableCallCount(): number {\n return cloneRuntimeTableCallCount;\n}\n\nfunction cloneRuntimeBoardState(board: RuntimeBoardState): RuntimeBoardState {\n if (board.layout !== \"generic\") {\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n edges: board.edges.map((edge) => ({\n ...edge,\n spaceIds: [...edge.spaceIds],\n fields: { ...edge.fields },\n })),\n vertices: board.vertices.map((vertex) => ({\n ...vertex,\n spaceIds: [...vertex.spaceIds],\n fields: { ...vertex.fields },\n })),\n };\n }\n\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n };\n}\n\nexport function cloneRuntimeTable<Table extends RuntimeTableRecord>(\n table: Table,\n): Table {\n cloneRuntimeTableCallCount += 1;\n return {\n ...table,\n zones: {\n shared: Object.fromEntries(\n Object.entries(table.zones.shared).map(([zoneId, componentIds]) => [\n zoneId,\n [...componentIds],\n ]),\n ) as Table[\"zones\"][\"shared\"],\n perPlayer: Object.fromEntries(\n Object.entries(table.zones.perPlayer).map(([zoneId, players]) => [\n zoneId,\n Object.fromEntries(\n table.playerOrder.map((playerId) => [\n playerId,\n [...players[playerId]],\n ]),\n ),\n ]),\n ) as Table[\"zones\"][\"perPlayer\"],\n visibility: { ...table.zones.visibility },\n cardSetIdsByZoneId: table.zones.cardSetIdsByZoneId\n ? Object.fromEntries(\n Object.entries(table.zones.cardSetIdsByZoneId).map(\n ([zoneId, cardSetIds]) => [zoneId, [...cardSetIds]],\n ),\n )\n : table.zones.cardSetIdsByZoneId,\n } as Table[\"zones\"],\n decks: Object.fromEntries(\n Object.entries(table.decks).map(([deckId, cards]) => [\n deckId,\n [...cards],\n ]),\n ) as Table[\"decks\"],\n hands: Object.fromEntries(\n Object.entries(table.hands).map(([handId, players]) => [\n handId,\n Object.fromEntries(\n table.playerOrder.map((playerId) => [\n playerId,\n [...players[playerId]],\n ]),\n ),\n ]),\n ) as Table[\"hands\"],\n handVisibility: { ...table.handVisibility },\n pieces: Object.fromEntries(\n Object.entries(table.pieces).map(([pieceId, piece]) => [\n pieceId,\n { ...piece },\n ]),\n ) as Table[\"pieces\"],\n componentLocations: { ...table.componentLocations },\n ownerOfCard: { ...table.ownerOfCard },\n visibility: { ...table.visibility },\n resources: Object.fromEntries(\n table.playerOrder.map((playerId) => [\n playerId,\n { ...table.resources[playerId] },\n ]),\n ) as Table[\"resources\"],\n boards: {\n ...table.boards,\n byId: Object.fromEntries(\n Object.entries(table.boards.byId).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n hex: Object.fromEntries(\n Object.entries(table.boards.hex ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n square: Object.fromEntries(\n Object.entries(table.boards.square ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n } as Table[\"boards\"],\n dice: Object.fromEntries(\n Object.entries(table.dice).map(([dieId, die]) => [dieId, { ...die }]),\n ) as Table[\"dice\"],\n };\n}\n","import { requireLookup } from \"../../shared/lookup.js\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n ComponentLocationOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n ResolvedContainerLocation,\n ResolvedDeckLocation,\n ResolvedEdgeLocation,\n ResolvedHandLocation,\n ResolvedSlotLocation,\n ResolvedSpaceLocation,\n ResolvedVertexLocation,\n ResolvedZoneLocation,\n RuntimeTableRecord,\n SpaceIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"../model\";\nimport {\n getBoard,\n getContainer,\n getEdge,\n getSpace,\n getTiledBoard,\n getVertex,\n} from \"./board-queries\";\n\nexport function getComponentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ComponentLocationOfTable<Table, ComponentId> {\n return requireLookup(\n table.componentLocations[componentId],\n \"Component location\",\n componentId,\n ) as ComponentLocationOfTable<Table, ComponentId>;\n}\n\nexport function getComponentDeckLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedDeckLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"InDeck\") {\n return null;\n }\n\n return {\n componentId,\n deckId: location.deckId as DeckIdOfTable<Table>,\n cards: table.decks[location.deckId as DeckIdOfTable<Table>],\n location,\n } as ResolvedDeckLocation<Table, ComponentId>;\n}\n\nexport function getComponentHandLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedHandLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"InHand\") {\n return null;\n }\n\n return {\n componentId,\n handId: location.handId as HandIdOfTable<Table>,\n playerId: location.playerId as PlayerIdOfTable<Table>,\n cards:\n table.hands[location.handId as HandIdOfTable<Table>]?.[\n location.playerId as string\n ],\n location,\n } as unknown as ResolvedHandLocation<Table, ComponentId>;\n}\n\nexport function getComponentZoneLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedZoneLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"InZone\") {\n return null;\n }\n\n return {\n componentId,\n zoneId: location.zoneId,\n location,\n } as ResolvedZoneLocation<Table, ComponentId>;\n}\n\nexport function getComponentSpaceLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSpaceLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"OnSpace\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const spaceId = location.spaceId as SpaceIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n spaceId,\n space: getSpace(table, boardId, spaceId),\n location,\n } as ResolvedSpaceLocation<Table, ComponentId>;\n}\n\nexport function getComponentContainerLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedContainerLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"InContainer\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const containerId = location.containerId as BoardContainerIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n containerId,\n container: getContainer(table, boardId, containerId),\n location,\n } as ResolvedContainerLocation<Table, ComponentId>;\n}\n\nexport function getComponentEdgeLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedEdgeLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"OnEdge\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const edgeId = location.edgeId as TiledEdgeIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n edgeId,\n edge: getEdge(table, boardId, edgeId),\n location,\n } as ResolvedEdgeLocation<Table, ComponentId>;\n}\n\nexport function getComponentVertexLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedVertexLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"OnVertex\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const vertexId = location.vertexId as TiledVertexIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n vertexId,\n vertex: getVertex(table, boardId, vertexId),\n location,\n } as ResolvedVertexLocation<Table, ComponentId>;\n}\n\nexport function getComponentSlotLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSlotLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location.type !== \"InSlot\") {\n return null;\n }\n\n return {\n componentId,\n host: location.host,\n slotId: location.slotId,\n location,\n } as ResolvedSlotLocation<Table, ComponentId>;\n}\n","import { requireLookup } from \"../../shared/lookup.js\";\nimport type { CardCollection, ViewCard } from \"../../shared/domain/cards.js\";\nimport type { ViewSlotOccupant } from \"../../shared/domain/slots.js\";\nimport type {\n CardIdOfTable,\n ComponentIdOfTable,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandCardsOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeComponentLocation,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SlotHostOfTable,\n SlotIdOfTable,\n} from \"../model\";\nimport {\n assertZoneScope,\n ensureArray,\n orderedComponentIdsForLocation,\n} from \"./internal\";\n\ntype ViewCardForTable<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<Table>,\n> =\n CardId extends CardIdOfTable<Table>\n ? ViewCard<\n CardId & string,\n Table[\"cards\"][CardId][\"cardType\"] & string,\n Extract<Table[\"cards\"][CardId][\"properties\"], Record<string, unknown>>\n >\n : never;\n\ntype ViewSlotOccupantForTable<Table extends RuntimeTableRecord> =\n ViewSlotOccupant<\n ComponentIdOfTable<Table> & string,\n PlayerIdOfTable<Table> & string,\n string,\n Record<string, unknown>\n >;\n\nfunction matchesSlotHost(\n location: RuntimeComponentLocation,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId?: string,\n): location is Extract<RuntimeComponentLocation, { type: \"InSlot\" }> {\n return (\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n (slotId === undefined || location.slotId === slotId)\n );\n}\n\nfunction componentPlayerId<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): (PlayerIdOfTable<Table> & string) | null {\n const piece = table.pieces[componentId];\n if (piece) {\n return (piece.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return (die.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const owner = table.ownerOfCard[componentId];\n if (owner !== undefined) {\n return (owner ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n return null;\n}\n\nfunction componentData<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): Record<string, unknown> | undefined {\n const piece = table.pieces[componentId];\n if (piece) {\n return piece.properties as Record<string, unknown>;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return die.properties as Record<string, unknown>;\n }\n\n const card = table.cards[componentId];\n if (card) {\n return card.properties as Record<string, unknown>;\n }\n\n return undefined;\n}\n\ntype DeckCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends DeckIdOfTable<Table>,\n> = ZoneId extends infer Each extends DeckIdOfTable<Table>\n ? DeckCardsOfTable<Table, Each>\n : never;\n\ntype HandCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends HandIdOfTable<Table>,\n> = ZoneId extends infer Each extends HandIdOfTable<Table>\n ? HandCardsOfTable<Table, Each>\n : never;\n\nexport function getSharedZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId): DeckCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"shared\",\n \"getSharedZoneCards\",\n \"zoneId\",\n );\n return [\n ...ensureArray(table.zones.shared[zoneId] ?? table.decks[zoneId]),\n ] as DeckCardsForZone<Table, ZoneId>;\n}\n\nexport function getPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): HandCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"perPlayer\",\n \"getPlayerZoneCards\",\n \"zoneId\",\n );\n const cards =\n table.zones.perPlayer[zoneId]?.[playerId as string] ??\n table.hands[zoneId]?.[playerId as string];\n return [\n ...ensureArray(cards as readonly string[] | undefined),\n ] as unknown as HandCardsForZone<Table, ZoneId>;\n}\n\nfunction collectZoneIds(\n ...sources: ReadonlyArray<Record<string, unknown> | undefined>\n): string[] {\n const seen = new Set<string>();\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n seen.add(key);\n }\n }\n return [...seen];\n}\n\nexport function getAllSharedZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n): {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n} {\n const zoneIds = collectZoneIds(\n table.zones.shared as Record<string, unknown> | undefined,\n table.decks as Record<string, unknown> | undefined,\n );\n const result: Record<string, readonly unknown[]> = {};\n for (const zoneId of zoneIds) {\n result[zoneId] = getSharedZoneCards(\n table,\n zoneId as SharedZoneIdOfTable<Table>,\n );\n }\n return result as {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n };\n}\n\nexport function getAllPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n} {\n const result: Record<string, readonly unknown[]> = {};\n for (const playerId of table.playerOrder) {\n result[playerId] = getPlayerZoneCards(\n table,\n playerId as PlayerIdOfTable<Table>,\n zoneId,\n );\n }\n return result as {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n };\n}\n\nexport function getCard<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): ViewCardForTable<Table, CardId> {\n const card = requireLookup(\n table.cards[cardId],\n \"Card\",\n cardId,\n ) as Table[\"cards\"][CardId];\n\n return {\n id: card.id,\n cardType: card.cardType,\n name: card.name,\n text: card.text,\n frontImage: card.frontImage,\n backImage: card.backImage,\n properties: card.properties,\n } as ViewCardForTable<Table, CardId>;\n}\n\nexport function getCardsById<\n Table extends RuntimeTableRecord,\n const CardIds extends readonly CardIdOfTable<NoInfer<Table>>[],\n>(\n table: Table,\n cardIds: CardIds,\n): Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id>;\n}> {\n return Object.fromEntries(\n cardIds.map((cardId) => [cardId, getCard(table, cardId)]),\n ) as Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id>;\n }>;\n}\n\nexport function getSharedZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getSharedZoneCards(table, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getPlayerZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getPlayerZoneCards(table, playerId, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getSlotOccupants<\n Table extends RuntimeTableRecord,\n Host extends SlotHostOfTable<Table>,\n>(\n table: Table,\n host: Host,\n slotId: SlotIdOfTable<Table, NoInfer<Host>>,\n): ViewSlotOccupantForTable<Table>[];\nexport function getSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): ViewSlotOccupantForTable<Table>[] {\n return orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host, slotId),\n ).map((componentId) => ({\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n }));\n}\n\nexport function getSlotOccupantsByHost<Table extends RuntimeTableRecord>(\n table: Table,\n host: SlotHostOfTable<Table>,\n): Readonly<Record<string, ViewSlotOccupantForTable<Table>[]>> {\n const occupantsBySlot: Record<string, ViewSlotOccupantForTable<Table>[]> = {};\n\n orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host),\n ).forEach((componentId) => {\n const location = table.componentLocations[componentId];\n if (!location || !matchesSlotHost(location, host)) {\n return;\n }\n\n const slotOccupant: ViewSlotOccupantForTable<Table> = {\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId: location.slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n };\n\n (occupantsBySlot[location.slotId] ??= []).push(slotOccupant);\n });\n\n return occupantsBySlot;\n}\n\nexport function getCardOwner<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"ownerOfCard\"][CardId] {\n return table.ownerOfCard[cardId] as Table[\"ownerOfCard\"][CardId];\n}\n\nexport function getCardVisibility<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"visibility\"][CardId] {\n return table.visibility[cardId] as Table[\"visibility\"][CardId];\n}\n","export function assertNonNegativeSafeInteger(\n value: number,\n label: string,\n): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${label} must be a non-negative safe integer.`);\n }\n}\n","import type {\n PlayerIdOfTable,\n ResourceBalancesOfTable,\n RuntimeRecord,\n RuntimeTableRecord,\n} from \"../model\";\n\nimport { assertNonNegativeSafeInteger } from \"./numeric\";\n\nexport function getPlayerOrder<Table extends RuntimeTableRecord>(\n table: Table,\n): Table[\"playerOrder\"] {\n return table.playerOrder;\n}\n\nexport function getPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: PlayerIdOfTable<NoInfer<Table>>,\n): ResourceBalancesOfTable<Table> {\n return table.resources[playerId] as ResourceBalancesOfTable<Table>;\n}\n\n/**\n * Read the amount a player holds of a single resource. Returns `0` when the\n * player has never accumulated that resource.\n */\nexport function getPlayerResourceAmount<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n): number {\n const playerResources = table.resources[playerId];\n if (!playerResources) return 0;\n const value = (playerResources as Record<string, unknown>)[resourceId];\n if (value === undefined) return 0;\n if (typeof value !== \"number\") {\n throw new Error(\n `Resource '${resourceId}' balance must be a non-negative safe integer.`,\n );\n }\n assertNonNegativeSafeInteger(value, `Resource '${resourceId}' balance`);\n return value;\n}\n\n/**\n * Sum of every resource amount for a player (e.g. \"total cards in hand\"\n * games). Skips omitted keys but rejects malformed stored balances.\n */\nexport function getPlayerResourceTotal<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): number {\n const playerResources = table.resources[playerId];\n if (!playerResources) return 0;\n let total = 0;\n for (const key of Object.keys(playerResources)) {\n const value = (playerResources as Record<string, unknown>)[key];\n if (value === undefined) continue;\n if (typeof value !== \"number\") {\n throw new Error(\n `Resource '${key}' balance must be a non-negative safe integer.`,\n );\n }\n assertNonNegativeSafeInteger(value, `Resource '${key}' balance`);\n const nextTotal = total + value;\n assertNonNegativeSafeInteger(nextTotal, \"Resource total\");\n total = nextTotal;\n }\n return total;\n}\n\n/**\n * Next player in seating order after `playerId`, wrapping around to the\n * first seat. Returns `null` when `playerId` is not in the player order or\n * the order is empty.\n */\nexport function getNextPlayerInOrder<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): PlayerIdOfTable<Table> | null {\n const order = table.playerOrder as unknown as ReadonlyArray<\n PlayerIdOfTable<Table>\n >;\n if (order.length === 0) return null;\n const idx = order.indexOf(playerId as PlayerIdOfTable<Table>);\n if (idx < 0) return null;\n return order[(idx + 1) % order.length] ?? null;\n}\n\n/**\n * Iterate a resource-amounts record, skipping undefined / zero entries.\n * Shared by the resource mutation helpers below.\n */\nfunction resourceEntries(\n amounts: Readonly<Record<string, number | undefined>>,\n): [resourceId: string, amount: number][] {\n const entries: [string, number][] = [];\n for (const resourceId of Object.keys(amounts)) {\n const amount = amounts[resourceId];\n if (amount === undefined || amount === 0) continue;\n if (typeof amount !== \"number\") {\n throw new Error(\n `Resource '${resourceId}' amount must be a non-negative safe integer.`,\n );\n }\n assertNonNegativeSafeInteger(amount, `Resource '${resourceId}' amount`);\n entries.push([resourceId, amount]);\n }\n return entries;\n}\n\n/**\n * Return `true` when `playerId` has at least the requested `amounts` of each\n * resource. Unknown resource ids are treated as zero-balance (i.e. requesting\n * one of them returns `false` unless the requested amount is also zero).\n */\nexport function canAffordResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): boolean {\n for (const [resourceId, required] of resourceEntries(amounts)) {\n if (getPlayerResourceAmount(table, playerId, resourceId) < required) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Return the subset of `amounts` that the player cannot afford. The returned\n * record maps resource id → shortfall. Empty when the player can afford the\n * full cost.\n */\nexport function getMissingResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Record<string, number> {\n const missing: Record<string, number> = {};\n for (const [resourceId, required] of resourceEntries(amounts)) {\n const have = getPlayerResourceAmount(table, playerId, resourceId);\n if (have < required) missing[resourceId] = required - have;\n }\n return missing;\n}\n\nfunction writePlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n nextForPlayer: Record<string, number>,\n): void {\n table.resources = {\n ...table.resources,\n [playerId]: nextForPlayer as RuntimeRecord,\n } as Table[\"resources\"];\n}\n\nexport function addPlayerResourcesInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const prev = (table.resources[playerId] ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n for (const [resourceId, amount] of resourceEntries(amounts)) {\n const nextAmount =\n getPlayerResourceAmount(table, playerId, resourceId) + amount;\n assertNonNegativeSafeInteger(\n nextAmount,\n `Resource '${resourceId}' balance`,\n );\n next[resourceId] = nextAmount;\n }\n writePlayerResources(table, playerId, next);\n}\n\nexport function spendPlayerResourcesInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const entries = resourceEntries(amounts);\n if (!canAffordResources(table, playerId, amounts)) {\n const missing = getMissingResources(table, playerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${playerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n const prev = (table.resources[playerId] ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n for (const [resourceId, amount] of entries) {\n const nextAmount =\n getPlayerResourceAmount(table, playerId, resourceId) - amount;\n assertNonNegativeSafeInteger(\n nextAmount,\n `Resource '${resourceId}' balance`,\n );\n next[resourceId] = nextAmount;\n }\n writePlayerResources(table, playerId, next);\n}\n\nexport function transferPlayerResourcesInPlace<\n Table extends RuntimeTableRecord,\n>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const entries = resourceEntries(amounts);\n if (!canAffordResources(table, fromPlayerId, amounts)) {\n const missing = getMissingResources(table, fromPlayerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${fromPlayerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n if (fromPlayerId === toPlayerId) return;\n\n const fromPrev = (table.resources[fromPlayerId] ?? {}) as Record<\n string,\n number\n >;\n const toPrev = (table.resources[toPlayerId] ?? {}) as Record<string, number>;\n const fromNext: Record<string, number> = { ...fromPrev };\n const toNext: Record<string, number> = { ...toPrev };\n\n for (const [resourceId, amount] of entries) {\n const sourceBalance =\n getPlayerResourceAmount(table, fromPlayerId, resourceId) - amount;\n const destinationBalance =\n getPlayerResourceAmount(table, toPlayerId, resourceId) + amount;\n assertNonNegativeSafeInteger(\n sourceBalance,\n `Resource '${resourceId}' balance`,\n );\n assertNonNegativeSafeInteger(\n destinationBalance,\n `Resource '${resourceId}' balance`,\n );\n fromNext[resourceId] = sourceBalance;\n toNext[resourceId] = destinationBalance;\n }\n\n writePlayerResources(table, fromPlayerId, fromNext);\n writePlayerResources(table, toPlayerId, toNext);\n}\n\nexport function setPlayerResourceInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): void {\n assertNonNegativeSafeInteger(amount, `Resource '${resourceId}' amount`);\n const prev = (table.resources[playerId] ?? {}) as Record<string, number>;\n writePlayerResources(table, playerId, {\n ...prev,\n [resourceId]: amount,\n });\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n ComponentIdOfTable,\n HexBoardIdOfTable,\n HexEdgeIdOfTable,\n HexVertexIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeComponentLocation,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"../model\";\nimport {\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getEdge,\n getVertex,\n} from \"./board-queries\";\nimport { assertCardAllowedInContainer } from \"./card-validation\";\nimport {\n ensureArray,\n orderedComponentIdsForLocation,\n syncPlayerZoneWithHand,\n syncSharedZoneWithDeck,\n} from \"./internal\";\n\nfunction reindexSpaceOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): void {\n getComponentsOnSpace(table, boardId, spaceId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnSpace\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexContainerOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, containerId: ContainerId): void {\n getComponentsInContainer(table, boardId, containerId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InContainer\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexEdgeOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n EdgeId extends HexEdgeIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnEdge\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexVertexOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n VertexId extends HexVertexIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, vertexId: VertexId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnVertex\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n location.slotId === slotId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InSlot\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction removeComponentFromCurrentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n const currentLocation = table.componentLocations[componentId];\n if (!currentLocation) {\n return;\n }\n\n if (currentLocation.type === \"InDeck\") {\n const nextCards = ensureArray(table.decks[currentLocation.deckId]).filter(\n (candidate) => candidate !== componentId,\n );\n syncSharedZoneWithDeck(\n table,\n currentLocation.deckId as SharedZoneIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InDeck\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"InHand\") {\n const nextCards = ensureArray(\n table.hands[currentLocation.handId]?.[currentLocation.playerId],\n ).filter((candidate) => candidate !== componentId);\n syncPlayerZoneWithHand(\n table,\n currentLocation.handId as PlayerZoneIdOfTable<Table>,\n currentLocation.playerId as PlayerIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InHand\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"OnSpace\") {\n delete table.componentLocations[componentId];\n reindexSpaceOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.spaceId as SpaceIdOfTable<Table, BoardIdOfTable<Table>>,\n );\n return;\n }\n\n if (currentLocation.type === \"InZone\") {\n if (currentLocation.zoneId in table.zones.shared) {\n const nextComponents = ensureArray(\n table.zones.shared[currentLocation.zoneId],\n ).filter((candidate) => candidate !== componentId);\n syncSharedZoneWithDeck(\n table,\n currentLocation.zoneId as SharedZoneIdOfTable<Table>,\n nextComponents,\n );\n nextComponents.forEach((currentComponentId, index) => {\n const location = table.componentLocations[currentComponentId];\n if (location?.type === \"InZone\") {\n table.componentLocations[currentComponentId] = {\n ...location,\n position: index,\n };\n }\n });\n }\n delete table.componentLocations[componentId];\n return;\n }\n\n if (currentLocation.type === \"InContainer\") {\n delete table.componentLocations[componentId];\n reindexContainerOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.containerId as BoardContainerIdOfTable<\n Table,\n BoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnEdge\") {\n delete table.componentLocations[componentId];\n reindexEdgeOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.edgeId as HexEdgeIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnVertex\") {\n delete table.componentLocations[componentId];\n reindexVertexOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.vertexId as HexVertexIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"InSlot\") {\n delete table.componentLocations[componentId];\n reindexSlotOccupants(table, currentLocation.host, currentLocation.slotId);\n return;\n }\n\n delete table.componentLocations[componentId];\n}\n\nexport function moveComponentToSpaceInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n spaceId: SpaceId,\n): void {\n const position = getComponentsOnSpace(table, boardId, spaceId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId,\n position,\n };\n}\n\nexport function moveComponentToContainerInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n containerId: ContainerId,\n): void {\n assertCardAllowedInContainer(table, boardId, containerId, componentId);\n const position = getComponentsInContainer(table, boardId, containerId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId,\n position,\n };\n}\n\nexport function moveComponentToDetachedInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = { type: \"Detached\" };\n}\n\nexport function moveComponentToEdgeInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n edgeId: EdgeId,\n): void {\n getEdge(table, boardId, edgeId);\n const position = getComponentsOnEdge(table, boardId, edgeId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position,\n };\n}\n\nexport function moveComponentToVertexInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n vertexId: VertexId,\n): void {\n getVertex(table, boardId, vertexId);\n const position = getComponentsOnVertex(table, boardId, vertexId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position,\n };\n}\n","import type {\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n} from \"../model\";\nimport { assertCardAllowedInZone } from \"./card-validation\";\nimport {\n assertZoneScope,\n ensureArray,\n syncPlayerZoneWithHand,\n syncSharedZoneWithDeck,\n} from \"./internal\";\nimport { assertNonNegativeSafeInteger } from \"./numeric\";\n\nfunction sharedZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n): string[] {\n return [...ensureArray(table.zones.shared[zoneId] ?? table.decks[zoneId])];\n}\n\nfunction playerZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n playerId: string,\n): string[] {\n return [\n ...ensureArray(\n (table.zones.perPlayer[zoneId] ?? table.hands[zoneId])?.[playerId] as\n readonly string[] | undefined,\n ),\n ];\n}\n\nfunction assertCardInSharedZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n if (!sharedZoneCards(table, zoneId).includes(cardId)) {\n throw new Error(`Card '${cardId}' is not in shared zone '${zoneId}'.`);\n }\n\n const location = table.componentLocations[cardId];\n if (location?.type !== \"InDeck\" || location.deckId !== zoneId) {\n throw new Error(\n `Card '${cardId}' has a location that disagrees with shared zone '${zoneId}'.`,\n );\n }\n}\n\nfunction assertCardInPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cardId: string,\n): void {\n if (!playerZoneCards(table, zoneId, playerId).includes(cardId)) {\n throw new Error(\n `Card '${cardId}' is not in zone '${zoneId}' for player '${playerId}'.`,\n );\n }\n\n const location = table.componentLocations[cardId];\n if (\n location?.type !== \"InHand\" ||\n location.handId !== zoneId ||\n location.playerId !== playerId\n ) {\n throw new Error(\n `Card '${cardId}' has a location that disagrees with zone '${zoneId}' for player '${playerId}'.`,\n );\n }\n}\n\nfunction assertCardDetached(table: RuntimeTableRecord, cardId: string): void {\n const location = table.componentLocations[cardId];\n if (location?.type !== \"Detached\") {\n throw new Error(`Card '${cardId}' must be detached before placement.`);\n }\n}\n\nfunction assertCardAbsentFromSharedZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n if (sharedZoneCards(table, zoneId).includes(cardId)) {\n throw new Error(`Card '${cardId}' is already in shared zone '${zoneId}'.`);\n }\n}\n\nfunction assertCardAbsentFromPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cardId: string,\n): void {\n if (playerZoneCards(table, zoneId, playerId).includes(cardId)) {\n throw new Error(\n `Card '${cardId}' is already in zone '${zoneId}' for player '${playerId}'.`,\n );\n }\n}\n\nfunction reindexSharedZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n cardIds: readonly string[],\n playedByForCard?: Readonly<Record<string, string | null>>,\n): void {\n for (const [index, currentCardId] of cardIds.entries()) {\n const existing = table.componentLocations[currentCardId];\n table.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId: zoneId,\n playedBy:\n playedByForCard?.[currentCardId] ??\n (existing?.type === \"InDeck\" ? existing.playedBy : null),\n position: index,\n };\n }\n}\n\nfunction reindexPlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cardIds: readonly string[],\n): void {\n for (const [index, currentCardId] of cardIds.entries()) {\n table.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: zoneId,\n playerId,\n position: index,\n };\n }\n}\n\nfunction insertCard(\n cardIds: readonly string[],\n cardId: string,\n position: \"top\" | \"bottom\" = \"bottom\",\n): string[] {\n return position === \"top\" ? [cardId, ...cardIds] : [...cardIds, cardId];\n}\n\nfunction removeCard(cardIds: readonly string[], cardId: string): string[] {\n return cardIds.filter((candidate) => candidate !== cardId);\n}\n\nfunction appendCardToSharedZoneCollectionInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: string,\n playedBy: string | null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): void {\n const nextCards = insertCard(\n sharedZoneCards(table, deckId as string),\n cardId,\n position,\n );\n syncSharedZoneWithDeck(\n table,\n deckId,\n nextCards as DeckCardsOfTable<Table, DeckId>,\n );\n reindexSharedZoneCards(table, deckId as string, nextCards, {\n [cardId]: playedBy,\n });\n}\n\nfunction removeCardFromSharedZoneCollectionInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(table: Table, deckId: DeckId, cardId: string): void {\n const remaining = removeCard(\n sharedZoneCards(table, deckId as string),\n cardId,\n );\n syncSharedZoneWithDeck(\n table,\n deckId,\n remaining as DeckCardsOfTable<Table, DeckId>,\n );\n reindexSharedZoneCards(table, deckId as string, remaining);\n}\n\nfunction setPlayerZoneCardsInPlace<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table> | HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n playerId: PlayerId,\n cardIds: readonly string[],\n): void {\n syncPlayerZoneWithHand(table, zoneId, playerId, cardIds);\n reindexPlayerZoneCards(table, zoneId as string, playerId as string, cardIds);\n}\n\n/**\n * Read or write a per-player zone's card list by mutating `table` in place.\n * Called with no `nextCards` to read; called with `nextCards` to write the\n * new ordering. Returns the list at the read site as a plain array.\n *\n * Used by engine-side per-player shuffle resolution; authors should reach for\n * the named ops in this file.\n */\nexport function shufflePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n nextCards?: readonly string[],\n): string[] {\n if (nextCards === undefined) {\n const fromZone = (table.zones.perPlayer[zoneId] ?? table.hands[zoneId])?.[\n playerId\n ] as readonly string[] | undefined;\n return [...ensureArray(fromZone)];\n }\n table.hands[zoneId] = {\n ...table.hands[zoneId],\n [playerId]: [...nextCards],\n } as (typeof table.hands)[string];\n table.zones.perPlayer[zoneId] = {\n ...table.zones.perPlayer[zoneId],\n [playerId]: [...nextCards],\n } as (typeof table.zones.perPlayer)[string];\n return [...nextCards];\n}\n\nexport function appendToDeckInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): void {\n assertZoneScope(\n table,\n deckId as string,\n \"shared\",\n \"addCardToSharedZone\",\n \"zoneId\",\n );\n assertCardDetached(table, cardId as string);\n assertCardAbsentFromSharedZone(table, deckId as string, cardId as string);\n assertCardAllowedInZone(table, deckId, cardId);\n appendCardToSharedZoneCollectionInPlace(\n table,\n deckId,\n cardId as string,\n playedBy as string | null,\n position,\n );\n table.ownerOfCard[cardId] = playedBy;\n table.visibility[cardId] = {\n faceUp: true,\n };\n}\n\nexport function removeFromDeckInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): void {\n assertZoneScope(\n table,\n deckId as string,\n \"shared\",\n \"removeCardFromSharedZone\",\n \"zoneId\",\n );\n assertCardInSharedZone(table, deckId as string, cardId as string);\n removeCardFromSharedZoneCollectionInPlace(table, deckId, cardId as string);\n table.componentLocations[cardId as string] = { type: \"Detached\" };\n}\n\nfunction computeVisibilityForPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction moveFromHandToDeckInPlace<\n Table extends RuntimeTableRecord,\n HandId extends HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends DeckIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n handId: HandId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n deckId: DeckId;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.handId as string,\n \"perPlayer\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.deckId as string,\n \"shared\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"toZoneId\",\n );\n assertCardInPlayerZone(\n options.table,\n options.handId as string,\n options.playerId as string,\n options.cardId as string,\n );\n assertCardAbsentFromSharedZone(\n options.table,\n options.deckId as string,\n options.cardId as string,\n );\n assertCardAllowedInZone(\n options.table,\n options.deckId as string,\n options.cardId as string,\n );\n\n const currentHand = playerZoneCards(\n options.table,\n options.handId as string,\n options.playerId as string,\n );\n const nextHand = removeCard(currentHand, options.cardId as string);\n setPlayerZoneCardsInPlace(\n options.table,\n options.handId,\n options.playerId,\n nextHand,\n );\n appendCardToSharedZoneCollectionInPlace(\n options.table,\n options.deckId,\n options.cardId as string,\n (options.playedBy ?? options.playerId) as string | null,\n options.position ?? \"bottom\",\n );\n options.table.ownerOfCard[options.cardId] =\n options.playedBy ?? options.playerId;\n options.table.visibility[options.cardId] = {\n faceUp: true,\n };\n}\n\nexport function moveCardFromPlayerZoneToSharedZoneInPlace<\n Table extends RuntimeTableRecord,\n HandId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: HandId;\n toZoneId: DeckId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): void {\n moveFromHandToDeckInPlace({\n table: options.table,\n playerId: options.playerId,\n handId: options.fromZoneId,\n cardId: options.cardId,\n deckId: options.toZoneId,\n playedBy: options.playedBy,\n position: options.position,\n });\n}\n\nexport function dealCardsBetweenPlayerZonesInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n}): void {\n assertNonNegativeSafeInteger(options.count, \"Deal count\");\n if (options.count === 0) return;\n assertZoneScope(\n options.table,\n options.fromZoneId as string,\n \"perPlayer\",\n \"dealCardsBetweenPlayerZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.toZoneId as string,\n \"perPlayer\",\n \"dealCardsBetweenPlayerZones\",\n \"toZoneId\",\n );\n if ((options.fromZoneId as string) === (options.toZoneId as string)) {\n throw new Error(\"Deal source and destination must differ.\");\n }\n\n const sourceCards = playerZoneCards(\n options.table,\n options.fromZoneId as string,\n options.playerId as string,\n );\n const selectedCards = sourceCards.slice(0, options.count);\n const destinationCards = playerZoneCards(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n for (const cardId of selectedCards) {\n assertCardInPlayerZone(\n options.table,\n options.fromZoneId as string,\n options.playerId as string,\n cardId,\n );\n assertCardAbsentFromPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n cardId,\n );\n assertCardAllowedInZone(options.table, options.toZoneId as string, cardId);\n }\n\n const remainingSource = sourceCards.slice(selectedCards.length);\n const nextDestination = [...destinationCards, ...selectedCards];\n setPlayerZoneCardsInPlace(\n options.table,\n options.fromZoneId,\n options.playerId,\n remainingSource,\n );\n setPlayerZoneCardsInPlace(\n options.table,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const cardId of selectedCards) {\n options.table.visibility[cardId] = computeVisibilityForPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n }\n}\n\nexport function moveCardFromSharedZoneToPlayerZoneInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<Table, ToZoneId, FromZoneId>;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.fromZoneId as string,\n \"shared\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"toZoneId\",\n );\n\n assertCardInSharedZone(\n options.table,\n options.fromZoneId as string,\n options.cardId as string,\n );\n assertCardAbsentFromPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n options.cardId as string,\n );\n assertCardAllowedInZone(\n options.table,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const destinationCards = playerZoneCards(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n const nextDestination = insertCard(\n destinationCards,\n options.cardId as string,\n options.position ?? \"bottom\",\n );\n removeCardFromSharedZoneCollectionInPlace(\n options.table,\n options.fromZoneId,\n options.cardId as string,\n );\n setPlayerZoneCardsInPlace(\n options.table,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n options.table.ownerOfCard[options.cardId as string] =\n options.playerId as string;\n options.table.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n}\n\nexport function moveCardBetweenPlayerZonesInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<Table, FromZoneId, ToZoneId>;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.fromZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"toZoneId\",\n );\n\n assertCardInPlayerZone(\n options.table,\n options.fromZoneId as string,\n options.playerId as string,\n options.cardId as string,\n );\n assertCardAbsentFromPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n options.cardId as string,\n );\n assertCardAllowedInZone(\n options.table,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const sourceCards = playerZoneCards(\n options.table,\n options.fromZoneId as string,\n options.playerId as string,\n );\n const destinationCards = playerZoneCards(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n const remainingSource = removeCard(sourceCards, options.cardId as string);\n const nextDestination = insertCard(\n destinationCards,\n options.cardId as string,\n options.position ?? \"bottom\",\n );\n setPlayerZoneCardsInPlace(\n options.table,\n options.fromZoneId,\n options.playerId,\n remainingSource,\n );\n setPlayerZoneCardsInPlace(\n options.table,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n options.table.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n}\n\nexport function moveCardBetweenSharedZonesInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<Table, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.fromZoneId as string,\n \"shared\",\n \"moveCardBetweenSharedZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.toZoneId as string,\n \"shared\",\n \"moveCardBetweenSharedZones\",\n \"toZoneId\",\n );\n assertCardInSharedZone(\n options.table,\n options.fromZoneId as string,\n options.cardId as string,\n );\n assertCardAbsentFromSharedZone(\n options.table,\n options.toZoneId as string,\n options.cardId as string,\n );\n assertCardAllowedInZone(\n options.table,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n removeCardFromSharedZoneCollectionInPlace(\n options.table,\n options.fromZoneId,\n options.cardId as string,\n );\n appendCardToSharedZoneCollectionInPlace(\n options.table,\n options.toZoneId,\n options.cardId as string,\n (options.playedBy ?? null) as string | null,\n options.position ?? \"bottom\",\n );\n options.table.ownerOfCard[options.cardId as string] =\n options.playedBy ?? null;\n options.table.visibility[options.cardId as string] = {\n faceUp: true,\n };\n}\n\nexport function removeCardFromSharedZoneInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): void {\n removeFromDeckInPlace(table, deckId, cardId);\n}\n\nexport function addCardToSharedZoneInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): void {\n appendToDeckInPlace(table, deckId, cardId, playedBy, position);\n}\n\nexport function dealCardsFromDeckToHandInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n HandId extends HandIdOfTable<Table>,\n>(\n table: Table,\n fromZoneId: DeckId,\n playerId: PlayerId,\n toZoneId: HandId,\n count: number,\n): void {\n assertNonNegativeSafeInteger(count, \"Deal count\");\n if (count === 0) return;\n assertZoneScope(\n table,\n fromZoneId as string,\n \"shared\",\n \"dealCardsFromDeckToHand\",\n \"fromZoneId\",\n );\n assertZoneScope(\n table,\n toZoneId as string,\n \"perPlayer\",\n \"dealCardsFromDeckToHand\",\n \"toZoneId\",\n );\n\n const sourceCards = sharedZoneCards(table, fromZoneId as string);\n const selectedCards = sourceCards.slice(0, count);\n const destinationCards = playerZoneCards(\n table,\n toZoneId as string,\n playerId as string,\n );\n\n for (const cardId of selectedCards) {\n assertCardInSharedZone(table, fromZoneId as string, cardId);\n assertCardAbsentFromPlayerZone(\n table,\n toZoneId as string,\n playerId as string,\n cardId,\n );\n assertCardAllowedInZone(table, toZoneId as string, cardId);\n }\n\n const remainingSource = sourceCards.slice(selectedCards.length);\n const nextHand = [...destinationCards, ...selectedCards];\n syncSharedZoneWithDeck(\n table,\n fromZoneId,\n remainingSource as DeckCardsOfTable<Table, DeckId>,\n );\n reindexSharedZoneCards(table, fromZoneId as string, remainingSource);\n setPlayerZoneCardsInPlace(table, toZoneId, playerId, nextHand);\n\n for (const cardId of selectedCards) {\n table.ownerOfCard[cardId] = playerId;\n table.visibility[cardId] = computeVisibilityForPlayerZone(\n table,\n toZoneId as string,\n playerId as string,\n );\n }\n}\n","import { requireLookup } from \"../shared/lookup.js\";\nimport { bindBoardQueries } from \"./table/board-queries\";\nimport type {\n BoardIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n RuntimeTableRecord,\n TableQueries,\n TableQueriesOfState,\n} from \"./model\";\nimport {\n getAllPlayerZoneCards,\n getAllSharedZoneCards,\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getSlotOccupants,\n getSlotOccupantsByHost,\n getComponentContainerLocation,\n getComponentDeckLocation,\n getComponentEdgeLocation,\n getComponentHandLocation,\n getComponentLocation,\n getComponentSlotLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n getPlayerZoneCardCollection,\n getPlayerZoneCards,\n getSharedZoneCardCollection,\n getSharedZoneCards,\n} from \"./table\";\n\nexport function createTableQueries<Table extends RuntimeTableRecord>(\n table: Table,\n): TableQueries<Table> {\n return {\n board: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n bindBoardQueries(table, boardId),\n zone: {\n sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>\n getSharedZoneCards(table, zoneId),\n sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(\n zoneId: ZoneId,\n ) => getSharedZoneCardCollection(table, zoneId),\n allSharedCards: () => getAllSharedZoneCards(table),\n playerCards: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCards(table, playerId, zoneId),\n playerCardCollection: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCardCollection(table, playerId, zoneId),\n allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>\n getAllPlayerZoneCards(table, zoneId),\n },\n card: {\n get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCard(table, cardId),\n byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(\n cardIds: CardIds,\n ) => getCardsById(table, cardIds),\n owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardOwner(table, cardId),\n visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardVisibility(table, cardId),\n },\n slot: {\n occupants: (host, slotId) => getSlotOccupants(table, host, slotId),\n occupantsByHost: (host) => getSlotOccupantsByHost(table, host),\n pieceOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"piece\", id: hostId }, slotId),\n pieceOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"piece\", id: hostId }),\n dieOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"die\", id: hostId }, slotId),\n dieOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"die\", id: hostId }),\n },\n player: {\n order: () => getPlayerOrder(table),\n nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),\n resources: (playerId) => getPlayerResources(table, playerId),\n resource: (playerId, resourceId) =>\n getPlayerResourceAmount(table, playerId, resourceId),\n resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),\n canAfford: (playerId, amounts) =>\n canAffordResources(table, playerId, amounts),\n missingResources: (playerId, amounts) =>\n getMissingResources(table, playerId, amounts),\n },\n component: {\n data: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) =>\n requireLookup(\n table.cards[componentId] ??\n table.pieces[componentId] ??\n table.dice[componentId],\n \"Component\",\n componentId,\n ) as ComponentDataOfTable<Table, ComponentId>,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(table, componentId),\n deck: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentDeckLocation(table, componentId),\n hand: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentHandLocation(table, componentId),\n zone: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentZoneLocation(table, componentId),\n space: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSpaceLocation(table, componentId),\n container: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentContainerLocation(table, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, componentId),\n slot: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSlotLocation(table, componentId),\n },\n };\n}\n\nexport function createStateQueries<State extends { table: RuntimeTableRecord }>(\n state: State,\n): TableQueriesOfState<State> {\n return createTableQueries(\n state.table,\n ) as unknown as TableQueriesOfState<State>;\n}\n","import type {\n AnyInteractionSpec,\n BaseGameStateOfContract,\n InputCollector,\n InteractionMap,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewOfContract,\n OptionsOfContract,\n} from \"./model\";\n\nexport type ReducerIndexedPhase<Contract extends ReducerGameContractLike> =\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n OptionsOfContract<Contract>\n >;\n\nexport type ReducerIndexedInteractionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyInteractionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport interface ReducerDefinitionPhaseIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n readonly phaseName: PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n readonly phase: ReducerIndexedPhase<Contract>;\n readonly interactions: ReadonlyArray<\n ReducerIndexedInteractionEntry<Contract>\n >;\n}\n\nexport interface ReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >,\n ReducerIndexedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, View>>,\n ReducerDefinitionPhaseIndex<Contract, Definitions, View>\n >;\n}\n\nfunction phaseEntriesOf<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): Array<\n readonly [\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, View>>,\n ReducerIndexedPhase<Contract>,\n ]\n> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n return Object.entries(definition.phases) as unknown as Array<\n readonly [PhaseName, ReducerIndexedPhase<Contract>]\n >;\n}\n\nfunction interactionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n return Object.entries(\n (phase as { interactions?: Record<string, unknown> }).interactions ?? {},\n ) as Array<ReducerIndexedInteractionEntry<Contract>>;\n}\n\nfunction simultaneousSubmitEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n const submit = (phase as { submit?: unknown }).submit;\n if (!submit) return [];\n return [\n [\"submit\", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,\n ];\n}\n\nexport function collectReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): ReducerDefinitionIndex<Contract, Definitions, View> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n\n const phaseEntries = phaseEntriesOf(definition);\n const phasesByName = new Map<\n PhaseName,\n ReducerDefinitionPhaseIndex<Contract, Definitions, View>\n >();\n\n for (const [phaseName, phase] of phaseEntries) {\n const interactionEntries = [\n ...interactionEntriesOf(phase),\n ...simultaneousSubmitEntriesOf(phase),\n ];\n phasesByName.set(phaseName, {\n phaseName,\n phase,\n interactions: interactionEntries,\n });\n }\n\n return {\n phaseEntries,\n phasesByName,\n };\n}\n","import { collectReducerDefinitionIndex } from \"../definition-index\";\nimport { z } from \"zod\";\nimport * as ContractZod from \"../../shared/runtime-schema\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n OptionsOfContract,\n TableOfManifest,\n ViewOfContract,\n} from \"../model\";\nimport type { IngressRuntimeCodec, RawReducerSessionState } from \"./raw-types\";\nimport { createRuntimeInputParser } from \"./input-codec\";\nimport { collectIngressPhaseSchemas } from \"./phase-schemas\";\n\nconst runtimeRecordSchema = z.record(z.string(), runtimePayloadSchema);\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InDeck\"),\n deckId: z.string(),\n playedBy: z.string().nullable(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InHand\"),\n handId: z.string(),\n playerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: z.string().nullable().optional(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnSpace\"),\n boardId: z.string(),\n spaceId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InContainer\"),\n boardId: z.string(),\n containerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnEdge\"),\n boardId: z.string(),\n edgeId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnVertex\"),\n boardId: z.string(),\n vertexId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InSlot\"),\n host: z.union([\n z.object({ kind: z.literal(\"piece\"), id: z.string() }).strict(),\n z.object({ kind: z.literal(\"die\"), id: z.string() }).strict(),\n ]),\n slotId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z\n .object({\n shared: z.record(z.string(), z.array(z.string())),\n perPlayer: z.record(\n z.string(),\n z.record(z.string().min(1), z.array(z.string())),\n ),\n visibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(z.string(), z.array(z.string()))\n .optional(),\n })\n .strict(),\n decks: z.record(z.string(), z.array(z.string())),\n hands: z.record(\n z.string(),\n z.record(z.string().min(1), z.array(z.string())),\n ),\n handVisibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n cardSetId: z.string(),\n cardType: z.string(),\n name: z.string().optional(),\n text: z.string().optional(),\n frontImage: z.string().optional(),\n backImage: z.string().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n pieces: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n pieceTypeId: z.string(),\n pieceName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n componentLocations: z.record(z.string(), runtimeComponentLocationSchema),\n ownerOfCard: z.record(z.string(), z.string().nullable()),\n visibility: z.record(\n z.string(),\n z\n .object({\n faceUp: z.boolean(),\n visibleTo: z.array(z.string()).nullable().optional(),\n })\n .strict(),\n ),\n resources: z.record(z.string().min(1), runtimeRecordSchema),\n boards: z\n .object({\n byId: z.record(z.string(), runtimeRecordSchema),\n hex: z.record(z.string(), runtimeRecordSchema),\n square: z.record(z.string(), runtimeRecordSchema),\n network: z.record(z.string(), runtimeRecordSchema).optional(),\n track: z.record(z.string(), runtimeRecordSchema).optional(),\n })\n .strict(),\n dice: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n dieTypeId: z.string(),\n dieName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n sides: z.number().int(),\n value: z.number().int().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n })\n .strict();\n\nexport function createIngressRuntimeCodec<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>,\n OptionsOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, View>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName,\n OptionsOfContract<Contract>\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const definitionIndex = collectReducerDefinitionIndex(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n\n const flowSchema = z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n });\n function parseOptions(rawOptions: unknown): OptionsOfContract<Contract> {\n const jsonInput = runtimeRecordSchema.parse(rawOptions);\n const parsed = safeParseOrThrow(\n definition.contract.options,\n jsonInput,\n \"options\",\n );\n return runtimeRecordSchema.parse(parsed) as OptionsOfContract<Contract>;\n }\n const runtimeStateSchema = z.object({\n events: z.array(ContractZod.GameEventSchema).max(32),\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n draws: z.array(ContractZod.RngDrawSchema).default([]),\n }),\n options: z.unknown().transform(parseOptions),\n pending: z.partialRecord(\n playerIdSchema,\n z\n .object({\n phaseName: phaseNameSchema,\n interactionId: z.string().min(1),\n values: z.array(runtimePayloadSchema).min(1),\n })\n .strict()\n .refine((pending) => {\n const phase = definitionIndex.phasesByName.get(pending.phaseName);\n const steps = phase?.interactions.find(\n ([id]) => id === pending.interactionId,\n )?.[1].steps;\n return !!steps && pending.values.length < steps.entries.length;\n }, \"Pending interaction must name an authored stepped interaction with an unfinished prefix.\"),\n ),\n simultaneous: z.object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: runtimePayloadSchema,\n }),\n ),\n })\n .nullable(),\n }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable(),\n });\n const parseRuntimeInput = createRuntimeInputParser(playerIdSchema);\n\n // The return type uses branded/mapped types derived from the contract generic.\n // TypeScript cannot verify that plain objects satisfy these deep mapped types,\n // but the runtime Zod parsing ensures correctness.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n options: OptionsOfContract<Contract>,\n ) {\n const runtimeState: State[\"runtime\"] = {\n events: [],\n rng: {\n seed,\n cursor: 0,\n trace: [],\n draws: [],\n },\n options,\n pending: {},\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialOptions(rawOptions: unknown) {\n return parseOptions(rawOptions === undefined ? {} : rawOptions);\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n return {\n table,\n playerIds: safeParseOrThrow(\n z.array(playerIdSchema),\n playerIds && playerIds.length > 0 ? playerIds : table.playerOrder,\n \"table.playerOrder\",\n ),\n };\n },\n parseState(rawState: RawReducerSessionState) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const table = safeParseOrThrow(\n definition.contract.manifest.tableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = [...table.playerOrder] as PlayerId[];\n const privateState = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n definition.contract.state.private,\n envelope.domain.privateState[playerId] ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"domain\"][\"privateState\"];\n const flow = safeParseOrThrow(\n flowSchema,\n {\n currentPhase: envelope.domain.flow.currentPhase,\n turn: envelope.domain.flow.turn,\n round: envelope.domain.flow.round,\n activePlayers: envelope.domain.flow.activePlayers,\n },\n \"domain.flow\",\n );\n const currentPhaseDefinition = definition.phases[flow.currentPhase];\n if (!currentPhaseDefinition) {\n throw new Error(`Unknown reducer phase '${flow.currentPhase}'.`);\n }\n const rawPhaseState = envelope.domain.phase;\n const phase = safeParseOrThrow(\n currentPhaseDefinition.state,\n rawPhaseState ?? {},\n `phase:${flow.currentPhase}`,\n ) as State[\"domain\"][\"phase\"];\n\n const parsedState: State = {\n domain: {\n table,\n publicState: safeParseOrThrow(\n definition.contract.state.public,\n envelope.domain.publicState,\n \"domain.publicState\",\n ) as State[\"domain\"][\"publicState\"],\n privateState,\n hiddenState: safeParseOrThrow(\n definition.contract.state.hidden,\n envelope.domain.hiddenState,\n \"domain.hiddenState\",\n ) as State[\"domain\"][\"hiddenState\"],\n flow,\n phase,\n },\n runtime: safeParseOrThrow(\n runtimeStateSchema,\n envelope.runtime,\n \"runtime\",\n ) as unknown as State[\"runtime\"],\n };\n return parsedState;\n },\n serializeState(state: State) {\n return {\n domain: { ...state.domain },\n runtime: state.runtime,\n } as unknown as RawReducerSessionState;\n },\n parsePlayerId(rawPlayerId: string) {\n return safeParseOrThrow(playerIdSchema, rawPlayerId, \"playerId\");\n },\n parseInput(rawInput: unknown) {\n return parseRuntimeInput(rawInput);\n },\n } as unknown as ReturnType;\n}\n","import { z } from \"zod\";\n\nexport function formatIssue(\n label: string,\n issue: { path: PropertyKey[]; message: string },\n): string {\n const path = issue.path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.toString() : String(segment),\n )\n .join(\".\");\n return `${path || label}: ${issue.message}`;\n}\n\nexport function safeParseOrThrow<Schema extends z.ZodTypeAny>(\n schema: Schema,\n value: unknown,\n label: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n const message = parsed.error.issues\n .map((issue) => formatIssue(label, issue))\n .join(\"; \");\n throw new Error(message || `Invalid ${label}`);\n }\n return parsed.data;\n}\n","import { z } from \"zod\";\nimport { assertJsonWithinLimits } from \"../../runtime-json\";\nimport { RuntimeJsonSchema } from \"../../shared/runtime-json.js\";\nimport type { RuntimePayload } from \"../model\";\n\nexport { RuntimeJsonSchema } from \"../../shared/runtime-json.js\";\nexport { parseTransportJson } from \"../../runtime-json\";\n\nexport const runtimePayloadSchema = z.preprocess((value) => {\n if (value === undefined) return value;\n assertJsonWithinLimits(\n value,\n {\n maxDepth: 64,\n maxNodes: 100_000,\n maxStringBytes: 1_048_576,\n maxCollectionEntries: 50_000,\n },\n \"Runtime payload\",\n );\n return value;\n}, RuntimeJsonSchema) as z.ZodType<RuntimePayload>;\n","import { RuntimeJsonSchema, type RuntimeJson } from \"./shared/runtime-json.js\";\n\nexport type JsonLimits = {\n maxDepth: number;\n maxNodes: number;\n maxStringBytes: number;\n maxCollectionEntries: number;\n};\n\nexport type JsonValidationCode =\n | \"cycle\"\n | \"depth\"\n | \"nodes\"\n | \"string-bytes\"\n | \"collection-entries\"\n | \"non-json\";\n\nexport class JsonValidationError extends Error {\n constructor(\n public readonly code: JsonValidationCode,\n message: string,\n ) {\n super(message);\n this.name = \"JsonValidationError\";\n }\n}\n\nexport const TRANSPORT_JSON_LIMITS = {\n maxDepth: 64,\n maxNodes: 100_000,\n maxStringBytes: 1_048_576,\n maxCollectionEntries: 50_000,\n} as const satisfies JsonLimits;\n\nexport const BROWSER_ATTRIBUTE_JSON_LIMITS = {\n maxDepth: 32,\n maxNodes: 10_000,\n maxStringBytes: 65_536,\n maxCollectionEntries: 5_000,\n} as const satisfies JsonLimits;\n\nfunction jsonError(\n code: JsonValidationCode,\n label: string,\n detail: string,\n): JsonValidationError {\n return new JsonValidationError(code, `${label} ${detail}.`);\n}\n\nfunction requirePlainObject(\n value: object,\n label: string,\n): Record<string, unknown> {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw jsonError(\"non-json\", label, \"contains a non-plain object\");\n }\n return value as Record<string, unknown>;\n}\n\nexport function assertJsonWithinLimits(\n root: unknown,\n limits: JsonLimits,\n label: string,\n): void {\n const stack: Array<{ value: unknown; depth: number }> = [\n { value: root, depth: 0 },\n ];\n const seen = new WeakSet<object>();\n const encoder = new TextEncoder();\n let nodes = 0;\n let stringBytes = 0;\n let collectionEntries = 0;\n\n while (stack.length > 0) {\n const item = stack.pop();\n if (!item) continue;\n const { value, depth } = item;\n\n nodes += 1;\n if (nodes > limits.maxNodes) {\n throw jsonError(\"nodes\", label, \"exceeds the node limit\");\n }\n if (depth > limits.maxDepth) {\n throw jsonError(\"depth\", label, \"exceeds the depth limit\");\n }\n\n switch (typeof value) {\n case \"string\":\n stringBytes += encoder.encode(value).byteLength;\n if (stringBytes > limits.maxStringBytes) {\n throw jsonError(\n \"string-bytes\",\n label,\n \"exceeds the string-byte limit\",\n );\n }\n continue;\n case \"number\":\n if (!Number.isFinite(value)) {\n throw jsonError(\"non-json\", label, \"contains a non-finite number\");\n }\n continue;\n case \"boolean\":\n continue;\n case \"object\":\n if (value === null) continue;\n break;\n default:\n throw jsonError(\"non-json\", label, \"contains a non-JSON value\");\n }\n\n if (seen.has(value)) {\n throw jsonError(\"cycle\", label, \"contains a cycle\");\n }\n seen.add(value);\n\n const children = Array.isArray(value)\n ? value\n : Object.values(requirePlainObject(value, label));\n collectionEntries += children.length;\n if (collectionEntries > limits.maxCollectionEntries) {\n throw jsonError(\n \"collection-entries\",\n label,\n \"exceeds the collection-entry limit\",\n );\n }\n for (const child of children) {\n stack.push({ value: child, depth: depth + 1 });\n }\n }\n}\n\nexport function parseJsonWithLimits(\n value: unknown,\n limits: JsonLimits,\n label: string,\n): RuntimeJson {\n assertJsonWithinLimits(value, limits, label);\n return RuntimeJsonSchema.parse(value);\n}\n\nexport function parseTransportJson(value: unknown): RuntimeJson {\n return parseJsonWithLimits(value, TRANSPORT_JSON_LIMITS, \"Runtime payload\");\n}\n\nexport function parseBrowserAttributeJson(value: unknown): RuntimeJson {\n return parseJsonWithLimits(\n value,\n BROWSER_ATTRIBUTE_JSON_LIMITS,\n \"Browser interaction attribute\",\n );\n}\n","import { z } from \"zod\";\nimport * as ContractZod from \"../../shared/runtime-schema\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type { RawRuntimeInput } from \"./raw-types\";\n\nexport function createRuntimeInputParser<PlayerId extends string>(\n playerIdSchema: z.ZodType<PlayerId>,\n): (rawInput: unknown) => RawRuntimeInput {\n return (rawInput: unknown) => {\n const input = safeParseOrThrow(\n ContractZod.GameInputSchema,\n rawInput,\n \"input\",\n );\n const playerId = safeParseOrThrow(\n playerIdSchema,\n input.playerId,\n \"input.playerId\",\n );\n\n return {\n ...input,\n playerId,\n } as RawRuntimeInput;\n };\n}\n","import { z } from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewOfContract,\n} from \"../model\";\n\nfunction createPhaseNameSchema<PhaseName extends string>(\n phaseNames: readonly PhaseName[],\n): z.ZodType<PhaseName> {\n const allowed = new Set(phaseNames);\n return z.custom<PhaseName>(\n (value: unknown) =>\n typeof value === \"string\" && allowed.has(value as PhaseName),\n { message: \"Invalid phase name\" },\n );\n}\n\nexport function collectIngressPhaseSchemas<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): {\n phaseEntries: Array<\n [\n PhaseNameOfContract<Contract>,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n phaseNames: PhaseNameOfContract<Contract>[];\n phaseNameSchema: z.ZodType<PhaseNameOfContract<Contract>>;\n} {\n type PhaseName = PhaseNameOfContract<Contract>;\n const phaseEntries = Object.entries(definition.phases) as Array<\n [\n PhaseName,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n const phaseNames = phaseEntries.map(([phaseName]) => phaseName);\n return {\n phaseEntries,\n phaseNames,\n phaseNameSchema: createPhaseNameSchema(phaseNames),\n };\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n CardIdOfTable,\n CompatibleHandIdForDeck,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport { asPlayerId } from \"./per-player\";\nimport {\n addCardToSharedZoneInPlace as tableAddCardToSharedZoneInPlace,\n addPlayerResourcesInPlace as tableAddPlayerResourcesInPlace,\n dealCardsFromDeckToHandInPlace as tableDealCardsFromDeckToHandInPlace,\n dealCardsBetweenPlayerZonesInPlace as tableDealCardsBetweenPlayerZonesInPlace,\n moveCardBetweenPlayerZonesInPlace as tableMoveCardBetweenPlayerZonesInPlace,\n moveCardBetweenSharedZonesInPlace as tableMoveCardBetweenSharedZonesInPlace,\n moveCardFromPlayerZoneToSharedZoneInPlace as tableMoveCardFromPlayerZoneToSharedZoneInPlace,\n moveCardFromSharedZoneToPlayerZoneInPlace as tableMoveCardFromSharedZoneToPlayerZoneInPlace,\n moveComponentToContainerInPlace as tableMoveComponentToContainerInPlace,\n moveComponentToDetachedInPlace as tableMoveComponentToDetachedInPlace,\n moveComponentToEdgeInPlace as tableMoveComponentToEdgeInPlace,\n moveComponentToSpaceInPlace as tableMoveComponentToSpaceInPlace,\n moveComponentToVertexInPlace as tableMoveComponentToVertexInPlace,\n removeCardFromSharedZoneInPlace as tableRemoveCardFromSharedZoneInPlace,\n setPlayerResourceInPlace as tableSetPlayerResourceInPlace,\n spendPlayerResourcesInPlace as tableSpendPlayerResourcesInPlace,\n transferPlayerResourcesInPlace as tableTransferPlayerResourcesInPlace,\n} from \"./table\";\n\nexport type RotatePlayerZoneArgs<\n State extends { table: RuntimeTableRecord },\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>> = PlayerZoneIdOfTable<\n TableOfState<State>\n >,\n PlayerId extends PlayerIdOfTable<TableOfState<State>> = PlayerIdOfTable<\n TableOfState<State>\n >,\n> = {\n zoneId: ZoneId;\n direction: \"left\" | \"right\";\n players?: readonly PlayerId[];\n cardIdsByPlayer?: Partial<\n Record<PlayerId, readonly CardIdOfTable<TableOfState<State>>[]>\n >;\n position?: \"top\" | \"bottom\";\n};\n\n/**\n * Shallow patch or functional updater for one state slice. The updater is a\n * method-style callable so a transaction over a phase-scoped state stays\n * assignable to one over the base game state; a plain function type would be\n * invariant in `T` under `strictFunctionTypes`.\n */\nexport type StatePatch<T> = Partial<T> | { update(prev: T): T }[\"update\"];\n\n/**\n * Mutations available on a transaction-owned draft.\n */\nexport interface TransactionMutations<\n State extends { table: RuntimeTableRecord },\n> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(activePlayers: ReadonlyArray<PlayerIdOfState<State>>): State;\n\n /**\n * Advance `flow.activePlayers` to the single next seat in `playerOrder`.\n *\n * Uses `state.flow.activePlayers[0]` as the current seat (or the first\n * seat in `playerOrder` when `activePlayers` is empty) and sets\n * `activePlayers` to `[q.player.nextInOrder(current)]`. No-op when the\n * player order is empty.\n */\n advanceActivePlayer(): State;\n\n // --- Author-owned state slices --------------------------------------\n\n /**\n * Update the current phase's local state.\n *\n * Accepts either a `Partial<PhaseState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PhaseState`.\n */\n patchPhaseState(patch: StatePatch<PhaseStateOfState<State>>): State;\n\n /**\n * Update `state.publicState`.\n *\n * Accepts either a `Partial<PublicState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PublicState`.\n */\n patchPublicState(patch: StatePatch<PublicStateOfState<State>>): State;\n\n /**\n * Update `state.hiddenState`.\n *\n * Accepts either a `Partial<HiddenState>` or a functional updater.\n */\n patchHiddenState(patch: StatePatch<HiddenStateOfState<State>>): State;\n\n /**\n * Update a single player's entry in `state.privateState`.\n *\n * Accepts either a `Partial<PrivateState>` or a functional updater.\n */\n patchPlayerPrivateState(args: {\n playerId: PlayerIdOfState<State>;\n patch: StatePatch<PrivateStateOfState<State>>;\n }): State;\n\n // --- Shared zones / decks -------------------------------------------\n\n /**\n * Append a card to a shared zone (deck). Defaults to placing the card at the\n * bottom; pass `position: \"top\"` for top-of-deck placement (e.g. Bureaucrat-style).\n */\n addCardToSharedZone<\n DeckId extends SharedZoneIdOfTable<TableOfState<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<TableOfState<State>, DeckId>[number];\n playedBy?: PlayerIdOfTable<TableOfState<State>> | null;\n position?: \"top\" | \"bottom\";\n }): State;\n\n /** Remove a card from a shared zone (deck). */\n removeCardFromSharedZone<\n DeckId extends DeckIdOfTable<TableOfState<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<TableOfState<State>, DeckId>[number];\n }): State;\n\n /**\n * Move a card between two shared zones (decks). Defaults to placing the card\n * at the bottom of the destination; pass `position: \"top\"` for top placement.\n */\n moveCardBetweenSharedZones<\n FromZoneId extends SharedZoneIdOfTable<TableOfState<State>>,\n ToZoneId extends SharedZoneIdOfTable<TableOfState<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<TableOfState<State>, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<TableOfState<State>> | null;\n position?: \"top\" | \"bottom\";\n }): State;\n\n /**\n * Draw the top `count` cards from one perPlayer zone into another for the\n * same player (e.g. deck → hand at the start of a turn). Companion to\n * {@link deal} for the perPlayer → perPlayer case. Stops\n * silently if the source runs out before `count` is reached.\n */\n dealCardsBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n ToZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n }): State;\n\n /**\n * Move a card between two perPlayer zones owned by the same player (e.g.\n * hand → in-play → discard). Owner is preserved; visibility is recomputed\n * from the destination zone.\n */\n moveCardBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n ToZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<\n TableOfState<State>,\n FromZoneId,\n ToZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): State;\n\n /**\n * Move a card from a player zone (hand) to a shared zone (deck). Defaults to\n * placing the card at the bottom; pass `position: \"top\"` to topdeck.\n */\n moveCardFromPlayerZoneToSharedZone<\n FromZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n ToZoneId extends SharedZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n TableOfState<State>,\n FromZoneId,\n ToZoneId\n >;\n playedBy?: PlayerIdOfTable<TableOfState<State>> | null;\n position?: \"top\" | \"bottom\";\n }): State;\n\n /**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer\n * zone (e.g. discard). The \"gain\" verb in deck-builders. Distinct from\n * {@link deal}, which draws unspecified top-N cards from a\n * deck. Owner flips to the receiving player; visibility is recomputed.\n */\n moveCardFromSharedZoneToPlayerZone<\n FromZoneId extends SharedZoneIdOfTable<TableOfState<State>>,\n ToZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n TableOfState<State>,\n ToZoneId,\n FromZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): State;\n\n /**\n * Deal the top `count` cards from a shared deck into a player's hand zone.\n *\n * Dealing does not consume RNG. Shuffle first with `tx.shuffle({ zoneId })`\n * when the deck needs a random order, then call `tx.deal(...)`.\n */\n deal<\n FromZoneId extends DeckIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n ToZoneId extends CompatibleHandIdForDeck<TableOfState<State>, FromZoneId> &\n HandIdOfTable<TableOfState<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n playerId: PlayerId;\n toZoneId: ToZoneId;\n count: number;\n }): State;\n\n /**\n * Atomically rotate cards in a per-player zone around the table.\n *\n * Defaults to rotating every card currently in `zoneId` for every player in\n * turn order. Pass `players` to use a smaller explicit order, or\n * `cardIdsByPlayer` to rotate only selected cards such as Hearts passes.\n */\n rotatePlayerZone<\n ZoneId extends PlayerZoneIdOfTable<TableOfState<State>>,\n PlayerId extends PlayerIdOfTable<TableOfState<State>>,\n >(\n args: RotatePlayerZoneArgs<State, ZoneId, PlayerId>,\n ): State;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n SpaceId extends SpaceIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): State;\n\n /** Move a component into a board container. */\n moveComponentToContainer<\n BoardId extends BoardIdOfTable<TableOfState<State>>,\n ContainerId extends BoardContainerIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n containerId: ContainerId;\n }): State;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<TableOfState<State>>,\n EdgeId extends TiledEdgeIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): State;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<TableOfState<State>>,\n VertexId extends TiledVertexIdOfTable<TableOfState<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): State;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<TableOfState<State>>,\n >(args: {\n componentId: ComponentId;\n }): State;\n\n // --- Resources ------------------------------------------------------\n\n /**\n * Credit the specified resources to a player.\n *\n * Amounts must be non-negative; use {@link spendResources} for deductions\n * so that affordability is checked explicitly.\n *\n * tx.addResources({ playerId, amounts: { wood: 1, brick: 1 } });\n */\n addResources(args: {\n playerId: PlayerIdOfTable<TableOfState<State>>;\n amounts: ResourceAmountsOfTable<TableOfState<State>>;\n }): State;\n\n /**\n * Debit the specified resources from a player.\n *\n * Throws when the player cannot afford the full cost — gate with\n * `q.player.canAfford(...)` in your `validate` step before invoking.\n *\n * tx.spendResources({ playerId, amounts: COST_DEV_CARD });\n * tx.deal({ ... });\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<TableOfState<State>>;\n amounts: ResourceAmountsOfTable<TableOfState<State>>;\n }): State;\n\n /**\n * Transfer the specified resources from one player to another.\n *\n * Throws when the source cannot afford the full amount. On success the\n * destination gains exactly what the source loses.\n */\n transferResources(args: {\n fromPlayerId: PlayerIdOfTable<TableOfState<State>>;\n toPlayerId: PlayerIdOfTable<TableOfState<State>>;\n amounts: ResourceAmountsOfTable<TableOfState<State>>;\n }): State;\n\n /**\n * Overwrite a single resource balance for a player. Prefer\n * {@link addResources} / {@link spendResources} — use this only when the\n * new balance is an absolute (e.g. scripted setup).\n */\n setResource(args: {\n playerId: PlayerIdOfTable<TableOfState<State>>;\n resourceId: ResourceIdOfTable<TableOfState<State>>;\n amount: number;\n }): State;\n}\n\ntype AnyTable = RuntimeTableRecord;\ntype AnyState = { table: AnyTable };\n\nfunction computePlayerZoneVisibility(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction readPlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): readonly string[] {\n const zone = table.zones.perPlayer[zoneId] ?? table.hands[zoneId];\n if (!zone) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n return zone[playerId] ?? [];\n}\n\nfunction writePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n cards: readonly string[],\n): void {\n const currentZone = table.zones.perPlayer[zoneId];\n const currentHand = table.hands[zoneId];\n const player = asPlayerId(playerId);\n if (currentZone) {\n table.zones.perPlayer[zoneId] = { ...currentZone, [player]: [...cards] };\n }\n if (currentHand) {\n table.hands[zoneId] = { ...currentHand, [player]: [...cards] };\n }\n}\n\nfunction assertCardAllowedInPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n cardId: string,\n): void {\n const allowedCardSetIds = table.zones.cardSetIdsByZoneId?.[zoneId];\n if (!allowedCardSetIds || allowedCardSetIds.length === 0) {\n return;\n }\n const card = table.cards[cardId];\n if (!card) {\n throw new Error(`Card '${cardId}' does not exist.`);\n }\n if (!allowedCardSetIds.includes(card.cardSetId)) {\n throw new Error(\n `Card '${cardId}' from set '${card.cardSetId}' is not allowed in player zone '${zoneId}'.`,\n );\n }\n}\n\nfunction rotatePlayerZoneTableInPlace(options: {\n table: RuntimeTableRecord;\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n}): void {\n const nextTable = options.table;\n const zoneId = options.zoneId;\n if (!nextTable.zones.perPlayer[zoneId] && !nextTable.hands[zoneId]) {\n throw new Error(`Player zone '${zoneId}' does not exist.`);\n }\n const players = [...(options.players ?? nextTable.playerOrder)];\n if (players.length === 0) {\n return;\n }\n const playerSet = new Set(nextTable.playerOrder);\n for (const playerId of players) {\n if (!playerSet.has(playerId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': player '${playerId}' is not in player order.`,\n );\n }\n }\n\n const selectedByPlayer = new Map<string, readonly string[]>();\n for (const playerId of players) {\n const sourceCards = readPlayerZoneCards(nextTable, zoneId, playerId);\n const selected = options.cardIdsByPlayer?.[playerId] ?? sourceCards;\n for (const cardId of selected) {\n if (!sourceCards.includes(cardId)) {\n throw new Error(\n `Cannot rotate player zone '${zoneId}': card '${cardId}' is not in zone for player '${playerId}'.`,\n );\n }\n assertCardAllowedInPlayerZone(nextTable, zoneId, cardId);\n }\n selectedByPlayer.set(playerId, [...selected]);\n }\n\n const removeByPlayer = new Map<string, string[]>();\n for (const playerId of players) {\n const selected = new Set(selectedByPlayer.get(playerId) ?? []);\n removeByPlayer.set(\n playerId,\n readPlayerZoneCards(nextTable, zoneId, playerId).filter(\n (cardId) => !selected.has(cardId),\n ),\n );\n }\n\n const additionsByPlayer = new Map<string, string[]>(\n players.map((playerId) => [playerId, []]),\n );\n for (const [index, fromPlayerId] of players.entries()) {\n const offset = options.direction === \"left\" ? 1 : -1;\n const recipient =\n players[(index + offset + players.length) % players.length]!;\n additionsByPlayer\n .get(recipient)!\n .push(...(selectedByPlayer.get(fromPlayerId) ?? []));\n }\n\n for (const playerId of players) {\n const remaining = removeByPlayer.get(playerId) ?? [];\n const additions = additionsByPlayer.get(playerId) ?? [];\n const nextCards =\n options.position === \"top\"\n ? [...additions, ...remaining]\n : [...remaining, ...additions];\n writePlayerZoneCards(nextTable, zoneId, playerId, nextCards);\n for (const [position, cardId] of nextCards.entries()) {\n nextTable.componentLocations[cardId] = {\n type: \"InHand\",\n handId: zoneId,\n playerId,\n position,\n };\n nextTable.ownerOfCard[cardId] = playerId;\n nextTable.visibility[cardId] = computePlayerZoneVisibility(\n nextTable,\n zoneId,\n playerId,\n );\n }\n }\n}\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The table mutation helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside the transaction mutation implementation\n * the `State` generic is not yet bound, so at this call site we only know\n * that all ids are plain strings. These aliases narrow that distinction to\n * one place instead of leaking `as never` casts across every op body.\n */\n\ntype TableMoveComponentToEdgeInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => void;\n\ntype TableMoveComponentToVertexInPlaceInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => void;\n\ntype TableDealCardsFromDeckToHandInPlaceInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => void;\n\nconst moveComponentToEdgeInPlaceInternal =\n tableMoveComponentToEdgeInPlace as unknown as TableMoveComponentToEdgeInPlaceInternal;\nconst moveComponentToVertexInPlaceInternal =\n tableMoveComponentToVertexInPlace as unknown as TableMoveComponentToVertexInPlaceInternal;\nconst dealCardsFromDeckToHandInPlaceInternal =\n tableDealCardsFromDeckToHandInPlace as unknown as TableDealCardsFromDeckToHandInPlaceInternal;\n\nconst applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n): T => {\n if (typeof patch === \"function\") {\n return (patch as (prev: T) => T)(prev);\n }\n return { ...prev, ...patch };\n};\n\nexport const transactionMutations = {\n setActivePlayers<S extends AnyState>(\n state: S,\n activePlayers: ReadonlyArray<string>,\n ): S {\n const flow = (state as S & { flow: object }).flow;\n return Object.assign(state, {\n flow: { ...flow, activePlayers: [...activePlayers] },\n });\n },\n advanceActivePlayer<S extends AnyState>(state: S): S {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return transactionMutations.setActivePlayers(state, [nextId]);\n },\n patchPhaseState<S extends AnyState>(state: S, patch: unknown): S {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return Object.assign(state, { phase: next });\n },\n patchPublicState<S extends AnyState>(state: S, patch: unknown): S {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return Object.assign(state, { publicState: next });\n },\n patchHiddenState<S extends AnyState>(state: S, patch: unknown): S {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return Object.assign(state, { hiddenState: next });\n },\n patchPlayerPrivateState<S extends AnyState>(\n state: S,\n args: { playerId: string; patch: unknown },\n ): S {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return Object.assign(state, {\n privateState: { ...privateByPlayer, [args.playerId]: next },\n });\n },\n addCardToSharedZone<S extends AnyState>(\n state: S,\n args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableAddCardToSharedZoneInPlace(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return state;\n },\n removeCardFromSharedZone<S extends AnyState>(\n state: S,\n args: { deckId: string; cardId: string },\n ): S {\n tableRemoveCardFromSharedZoneInPlace(state.table, args.deckId, args.cardId);\n return state;\n },\n moveCardBetweenSharedZones<S extends AnyState>(\n state: S,\n args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardBetweenSharedZonesInPlace({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n dealCardsBetweenPlayerZones<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n },\n ): S {\n tableDealCardsBetweenPlayerZonesInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return state;\n },\n moveCardBetweenPlayerZones<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardBetweenPlayerZonesInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveCardFromPlayerZoneToSharedZone<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardFromPlayerZoneToSharedZoneInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveCardFromSharedZoneToPlayerZone<S extends AnyState>(\n state: S,\n args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n tableMoveCardFromSharedZoneToPlayerZoneInPlace({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n deal<S extends AnyState>(\n state: S,\n args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n },\n ): S {\n dealCardsFromDeckToHandInPlaceInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return state;\n },\n rotatePlayerZone<S extends AnyState>(\n state: S,\n args: {\n zoneId: string;\n direction: \"left\" | \"right\";\n players?: readonly string[];\n cardIdsByPlayer?: Partial<Record<string, readonly string[]>>;\n position?: \"top\" | \"bottom\";\n },\n ): S {\n rotatePlayerZoneTableInPlace({\n table: state.table,\n zoneId: args.zoneId,\n direction: args.direction,\n players: args.players,\n cardIdsByPlayer: args.cardIdsByPlayer,\n position: args.position ?? \"bottom\",\n });\n return state;\n },\n moveComponentToSpace<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; spaceId: string },\n ): S {\n tableMoveComponentToSpaceInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return state;\n },\n moveComponentToContainer<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; containerId: string },\n ): S {\n tableMoveComponentToContainerInPlace(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return state;\n },\n moveComponentToEdge<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; edgeId: string },\n ): S {\n moveComponentToEdgeInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return state;\n },\n moveComponentToVertex<S extends AnyState>(\n state: S,\n args: { componentId: string; boardId: string; vertexId: string },\n ): S {\n moveComponentToVertexInPlaceInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return state;\n },\n moveComponentToDetached<S extends AnyState>(\n state: S,\n args: { componentId: string },\n ): S {\n tableMoveComponentToDetachedInPlace(state.table, args.componentId);\n return state;\n },\n addResources<S extends AnyState>(\n state: S,\n args: { playerId: string; amounts: Record<string, number | undefined> },\n ): S {\n tableAddPlayerResourcesInPlace(state.table, args.playerId, args.amounts);\n return state;\n },\n spendResources<S extends AnyState>(\n state: S,\n args: { playerId: string; amounts: Record<string, number | undefined> },\n ): S {\n tableSpendPlayerResourcesInPlace(state.table, args.playerId, args.amounts);\n return state;\n },\n transferResources<S extends AnyState>(\n state: S,\n args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n },\n ): S {\n tableTransferPlayerResourcesInPlace(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return state;\n },\n setResource<S extends AnyState>(\n state: S,\n args: { playerId: string; resourceId: string; amount: number },\n ): S {\n tableSetPlayerResourceInPlace(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return state;\n },\n};\n","import type {\n GameEvent,\n GameOutcome,\n PhaseNameOfState,\n PlayerIdOfState,\n ReducerAccept,\n ReducerReject,\n RuntimeTableRecord,\n TableQueriesOfState,\n} from \"./model\";\nimport {\n transactionMutations,\n type TransactionMutations,\n} from \"./transaction-mutations\";\nimport type {\n DeckIdOfState,\n PlayerZoneIdOfState,\n PlayerIdOfTable,\n TableOfState,\n StringKeyOf,\n} from \"./model\";\nimport { shufflePlayerZoneCards } from \"./table\";\n\nexport type TransactionRandom = {\n roll(sides: number): number;\n shuffle<Value>(\n values: readonly Value[],\n operation: \"shuffleSharedZone\" | \"shufflePlayerZone\",\n ): Value[];\n};\nimport { createStateQueries } from \"./table-queries\";\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\n\n/** Phase names a transaction may transition to; `string` when state is erased. */\ntype TransitionTarget<State> =\n IsAny<State> extends true ? string : PhaseNameOfState<State>;\nimport { cloneRuntimeTable } from \"./table/clone\";\n\nexport type { RotatePlayerZoneArgs } from \"./transaction-mutations\";\n\n/**\n * Result builders on the transaction. A mutation callback ends with one of\n * these or with a bare `return` (accept the transaction as it stands).\n */\nexport type ReducerTransactionOutcome<\n State extends { table: RuntimeTableRecord },\n ErrorCode extends string = string,\n> = {\n /** Emit public display events for every seat. Private details belong in the authored seat view. */\n emit(...events: GameEvent[]): void;\n /** Accept with the current transaction state. Same as a bare `return`. */\n accept(): ReducerAccept<State>;\n /** Accept and move the flow to another declared phase. */\n transition<To extends TransitionTarget<State>>(to: To): ReducerAccept<State>;\n /**\n * Accept and end the game with a terminal outcome. Pass `transition` to\n * also move the flow to a terminal phase in the same result.\n */\n endGame(\n outcome: GameOutcome<PlayerIdOfState<State>>,\n options?: { transition?: TransitionTarget<State> },\n ): ReducerAccept<State>;\n /** Reject with a declared error code. The transaction is discarded. */\n reject(errorCode: ErrorCode, message?: string): ReducerReject;\n};\n\nexport type ReducerTransaction<\n State extends { table: RuntimeTableRecord },\n ErrorCode extends string = string,\n> = TransactionMutations<State> &\n ReducerTransactionOutcome<State, ErrorCode> & {\n readonly state: State;\n readonly q: TableQueriesOfState<State>;\n roll(dieId: StringKeyOf<TableOfState<State>[\"dice\"]>): number;\n shuffle(\n args:\n | { zoneId: DeckIdOfState<State> }\n | {\n zoneId: PlayerZoneIdOfState<State>;\n playerId: PlayerIdOfTable<TableOfState<State>>;\n },\n ): void;\n };\n\nexport type ReducerEdit<State extends { table: RuntimeTableRecord }> = <\n DraftState extends State,\n>(\n state: DraftState,\n random: TransactionRandom,\n) => ReducerTransaction<DraftState>;\n\nconst transactionContext = Symbol(\"dreamboard.reducerTransactionContext\");\n\ntype TransactionContext<State extends { table: RuntimeTableRecord }> = {\n currentState: State;\n currentQueries: TableQueriesOfState<State> | null;\n methodCache: Record<string, (...args: readonly unknown[]) => State>;\n events: GameEvent[];\n random: TransactionRandom;\n rollMethod?: (dieId: string) => number;\n shuffleMethod?: (args: { zoneId: string; playerId?: string }) => void;\n outcome?: ReducerTransactionOutcome<State>;\n};\n\nfunction createOutcomeMethods<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n): ReducerTransactionOutcome<State> {\n const accept = (): ReducerAccept<State> => ({\n type: \"accept\",\n state: context.currentState,\n events: [...context.events],\n });\n return {\n emit(...events) {\n context.events.push(...events);\n },\n accept,\n transition(to) {\n return { ...accept(), transition: to as PhaseNameOfState<State> };\n },\n endGame(outcome, options) {\n return {\n ...accept(),\n terminal: outcome,\n ...(options?.transition\n ? { transition: options.transition as PhaseNameOfState<State> }\n : {}),\n };\n },\n reject(errorCode, message) {\n return { type: \"reject\", errorCode, message };\n },\n };\n}\n\ntype TransactionHost<State extends { table: RuntimeTableRecord }> = {\n [transactionContext]: TransactionContext<State>;\n};\n\nfunction getTransactionContext<State extends { table: RuntimeTableRecord }>(\n host: unknown,\n): TransactionContext<State> {\n const context = (host as Partial<TransactionHost<State>>)[transactionContext];\n if (!context) {\n throw new TypeError(\"Reducer transaction method called without a receiver\");\n }\n return context;\n}\n\nfunction invalidate<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n): void {\n context.currentQueries = null;\n}\n\nfunction runInternal<State extends { table: RuntimeTableRecord }>(\n context: TransactionContext<State>,\n key: keyof TransactionMutations<State>,\n args: readonly unknown[],\n): State {\n (\n transactionMutations[key] as unknown as (\n state: State,\n ...args: readonly unknown[]\n ) => State\n )(context.currentState, ...args);\n invalidate(context);\n return context.currentState;\n}\n\nfunction createReducerTransactionSurface<\n State extends { table: RuntimeTableRecord },\n>() {\n const surface = {};\n const descriptors: PropertyDescriptorMap = {\n state: {\n enumerable: true,\n get(this: unknown) {\n return getTransactionContext<State>(this).currentState;\n },\n },\n q: {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n context.currentQueries ??= createStateQueries(context.currentState);\n return context.currentQueries;\n },\n },\n };\n\n for (const key of [\n \"emit\",\n \"accept\",\n \"transition\",\n \"endGame\",\n \"reject\",\n ] as const) {\n descriptors[key] = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n context.outcome ??= createOutcomeMethods(context);\n return context.outcome[key];\n },\n };\n }\n\n for (const key of Object.keys(transactionMutations) as Array<\n keyof TransactionMutations<State>\n >) {\n descriptors[String(key)] = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n const cacheKey = String(key);\n context.methodCache[cacheKey] ??= (...args: readonly unknown[]) =>\n runInternal(context, key, args);\n return context.methodCache[cacheKey];\n },\n };\n }\n\n descriptors.roll = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n return (context.rollMethod ??= (dieId: string) => {\n const die = context.currentState.table.dice[dieId];\n if (!die) throw new Error(`Cannot roll unknown die '${dieId}'.`);\n const value = context.random.roll(die.sides);\n context.currentState.table.dice[dieId] = { ...die, value };\n invalidate(context);\n return value;\n });\n },\n };\n descriptors.shuffle = {\n enumerable: true,\n get(this: unknown) {\n const context = getTransactionContext<State>(this);\n return (context.shuffleMethod ??= (args: {\n zoneId: string;\n playerId?: string;\n }) => {\n const table = context.currentState.table;\n if (args.playerId !== undefined) {\n const cards = shufflePlayerZoneCards(\n table,\n args.zoneId,\n args.playerId,\n );\n const shuffled = context.random.shuffle(cards, \"shufflePlayerZone\");\n shufflePlayerZoneCards(table, args.zoneId, args.playerId, shuffled);\n for (const [position, cardId] of shuffled.entries()) {\n const location = table.componentLocations[cardId];\n table.componentLocations[cardId] = {\n ...location,\n type: \"InHand\",\n handId: args.zoneId,\n playerId: args.playerId,\n position,\n };\n }\n } else {\n const cards = table.decks[args.zoneId];\n if (!cards)\n throw new Error(\n `Cannot shuffle unknown shared zone '${args.zoneId}'.`,\n );\n const shuffled = context.random.shuffle(cards, \"shuffleSharedZone\");\n table.decks[args.zoneId] = shuffled;\n table.zones.shared[args.zoneId] = [...shuffled];\n for (const [position, cardId] of shuffled.entries()) {\n const location = table.componentLocations[cardId];\n table.componentLocations[cardId] = {\n ...location,\n type: \"InDeck\",\n deckId: args.zoneId,\n position,\n playedBy:\n location?.type === \"InDeck\" || location?.type === \"InZone\"\n ? (location.playedBy ?? null)\n : null,\n };\n }\n }\n invalidate(context);\n });\n },\n };\n Object.defineProperties(surface, descriptors);\n return surface;\n}\n\nfunction createReducerTransactionFromSurface<\n State extends { table: RuntimeTableRecord },\n>(\n initialState: State,\n surface: object,\n random: TransactionRandom,\n): ReducerTransaction<State> {\n const transaction = Object.create(surface) as ReducerTransaction<State> &\n TransactionHost<State>;\n Object.defineProperty(transaction, transactionContext, {\n value: {\n currentState: {\n ...initialState,\n table: cloneRuntimeTable(initialState.table),\n },\n currentQueries: null,\n methodCache: {},\n events: [],\n random,\n } satisfies TransactionContext<State>,\n });\n return transaction;\n}\n\nexport function createReducerTransaction<\n State extends { table: RuntimeTableRecord },\n>(initialState: State, random: TransactionRandom): ReducerTransaction<State> {\n return createReducerTransactionFromSurface(\n initialState,\n createReducerTransactionSurface<State>(),\n random,\n );\n}\n\nexport function createReducerEdit<\n State extends { table: RuntimeTableRecord },\n>(): ReducerEdit<State> {\n const surface = createReducerTransactionSurface<State>();\n return <DraftState extends State>(\n state: DraftState,\n random: TransactionRandom,\n ) => createReducerTransactionFromSurface(state, surface, random);\n}\n","import type {\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewOfContract,\n} from \"../../model\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\n} from \"../../definition-index\";\n\nexport type TrustedErasedPhase<Contract extends ReducerGameContractLike> =\n ReducerIndexedPhase<Contract>;\n\nexport type TrustedInteractionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedInteractionEntry<Contract>;\n\nexport type TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReducerDefinitionPhaseIndex<Contract, Definitions, View>;\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, View>>,\n TrustedPhaseRegistry<Contract, Definitions, View>\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): TrustedRuntimeRegistry<Contract, Definitions, View> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, View>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, View>\n >();\n for (const phaseIndex of index.phasesByName.values()) {\n const trustedPhase: TrustedPhaseRegistry<Contract, Definitions, View> = {\n phaseName: phaseIndex.phaseName,\n phase: phaseIndex.phase,\n interactions: phaseIndex.interactions,\n };\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n };\n}\n","import type { ReducerTransaction, ReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n ReducerGameContractLike,\n RuntimeTableRecord,\n ReducerAccept,\n TableQueriesOfState,\n} from \"../../model\";\nimport type {\n ActionContext,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport type { TrustedState } from \"./runtime-scope\";\n\nexport function buildContext<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n): ActionContext<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n> {\n type DomainState = BaseGameStateOfContract<Contract>;\n type PlayerId = PlayerIdOfState<DomainState>;\n type Manifest = ManifestContractOf<Contract>;\n return {\n currentPhase: state.flow.currentPhase as ActionContext<\n DomainState,\n Manifest\n >[\"currentPhase\"],\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const rest = { ...runtime } as Omit<Runtime, \"rng\"> & { rng?: unknown };\n delete rest.rng;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n integer() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nconst implicitResultSymbol = Symbol(\"dreamboard.implicitResult\");\n\nexport type RuntimeArgsWithTransaction<\n DomainState extends { table: RuntimeTableRecord },\n> = {\n tx: ReducerTransaction<DomainState>;\n [implicitResultSymbol]: () => ReducerAccept<DomainState>;\n};\n\n/**\n * Preserve the complete transaction on a bare return, without opening a\n * transaction when the callback never used one.\n */\nexport function implicitResultOf<\n DomainState extends { table: RuntimeTableRecord },\n>(args: RuntimeArgsWithTransaction<DomainState>): ReducerAccept<DomainState> {\n return args[implicitResultSymbol]();\n}\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n createTransaction: ReducerEdit<BaseGameStateOfContract<Contract>>,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n random?: import(\"./rng-sampler\").MutableRandomHelpers;\n } = {},\n) {\n type DomainState = BaseGameStateOfContract<Contract>;\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState);\n const args = {\n ...buildContext(state, manifest),\n q,\n runtime: publicRuntime(state.runtime),\n random: options.random?.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n // The transaction clones the table, so open it only when a callback reads\n // `tx`. Views, actor selectors, and rules never pay for it.\n let transaction: ReducerTransaction<DomainState> | undefined;\n Object.defineProperty(args, \"tx\", {\n enumerable: true,\n get: () => {\n if (!options.random)\n throw new Error(\n \"Transactions are only available in reducer mutation callbacks.\",\n );\n return (transaction ??= createTransaction(domainState, options.random));\n },\n });\n Object.defineProperty(args, implicitResultSymbol, {\n enumerable: false,\n value: () =>\n transaction\n ? transaction.accept()\n : { type: \"accept\", state: domainState, events: [] },\n });\n return args as typeof args & RuntimeArgsWithTransaction<DomainState>;\n}\n","import { assertJsonWithinLimits } from \"../../../runtime-json\";\nimport type {\n GameEvent,\n GameEventDetail,\n GameOutcome,\n OutcomeScoreComponent,\n OutcomeStanding,\n OutcomeTieBreak,\n ReducerReject,\n ReducerResult,\n SystemActionEvent,\n} from \"../../model\";\n\nconst OUTCOME_STRING_LIMIT = 256;\nconst OUTCOME_LABEL_LIMIT = 128;\nconst OUTCOME_MAX_STANDINGS = 32;\nconst OUTCOME_MAX_COMPONENTS = 32;\nconst OUTCOME_MAX_TIE_BREAKS = 16;\nconst GAME_EVENT_STRING_LIMIT = 256;\nconst GAME_EVENT_LABEL_LIMIT = 128;\nconst GAME_EVENT_MAX_EVENTS = 32;\nconst GAME_EVENT_MAX_DETAILS = 16;\n\nfunction failOutcome(message: string): never {\n throw new Error(`Invalid GameOutcome: ${message}`);\n}\n\nfunction failGameEvent(message: string): never {\n throw new Error(`Invalid GameEvent: ${message}`);\n}\n\nfunction assertNonEmptyBoundedString(\n value: unknown,\n label: string,\n maxLength = OUTCOME_STRING_LIMIT,\n): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0) {\n failOutcome(`${label} must be a non-empty string`);\n }\n if (value.length > maxLength) {\n failOutcome(`${label} is too long`);\n }\n}\n\nfunction assertGameEventString(\n value: unknown,\n label: string,\n maxLength = GAME_EVENT_STRING_LIMIT,\n): asserts value is string {\n if (typeof value !== \"string\" || value.length === 0) {\n failGameEvent(`${label} must be a non-empty string`);\n }\n if (value.length > maxLength) {\n failGameEvent(`${label} is too long`);\n }\n}\n\nfunction assertFiniteNumber(\n value: unknown,\n label: string,\n): asserts value is number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n failOutcome(`${label} must be a finite number`);\n }\n}\n\nfunction assertUniqueIds(\n entries: readonly (OutcomeScoreComponent | OutcomeTieBreak)[] | undefined,\n label: string,\n): void {\n if (!entries) return;\n const seen = new Set<string>();\n for (const entry of entries) {\n assertNonEmptyBoundedString(entry.id, `${label}.id`, OUTCOME_LABEL_LIMIT);\n assertNonEmptyBoundedString(\n entry.label,\n `${label}.label`,\n OUTCOME_LABEL_LIMIT,\n );\n if (seen.has(entry.id)) {\n failOutcome(`${label} contains duplicate id '${entry.id}'`);\n }\n seen.add(entry.id);\n }\n}\n\nfunction assertStandingValues<PlayerId extends string>(\n standing: OutcomeStanding<PlayerId>,\n): void {\n if (!Number.isInteger(standing.rank) || standing.rank < 1) {\n failOutcome(`standing for '${standing.playerId}' has invalid rank`);\n }\n if (\n standing.result !== \"win\" &&\n standing.result !== \"draw\" &&\n standing.result !== \"loss\" &&\n standing.result !== \"eliminated\"\n ) {\n failOutcome(`standing for '${standing.playerId}' has invalid result`);\n }\n if (standing.score !== undefined) {\n assertFiniteNumber(standing.score, `standing '${standing.playerId}'.score`);\n }\n if ((standing.scoreBreakdown?.length ?? 0) > OUTCOME_MAX_COMPONENTS) {\n failOutcome(\n `standing '${standing.playerId}' has too many score components`,\n );\n }\n if ((standing.tieBreaks?.length ?? 0) > OUTCOME_MAX_TIE_BREAKS) {\n failOutcome(`standing '${standing.playerId}' has too many tie-breaks`);\n }\n assertUniqueIds(standing.scoreBreakdown, \"scoreBreakdown\");\n assertUniqueIds(standing.tieBreaks, \"tieBreaks\");\n for (const component of standing.scoreBreakdown ?? []) {\n assertFiniteNumber(\n component.value,\n `standing '${standing.playerId}'.scoreBreakdown '${component.id}'`,\n );\n }\n for (const tieBreak of standing.tieBreaks ?? []) {\n if (typeof tieBreak.value === \"number\") {\n assertFiniteNumber(\n tieBreak.value,\n `standing '${standing.playerId}'.tieBreak '${tieBreak.id}'`,\n );\n } else {\n assertNonEmptyBoundedString(\n tieBreak.value,\n `standing '${standing.playerId}'.tieBreak '${tieBreak.id}'`,\n OUTCOME_LABEL_LIMIT,\n );\n }\n }\n}\n\nexport function normalizeGameOutcome<State, PlayerId extends string>(\n state: State,\n outcome: GameOutcome<PlayerId>,\n): GameOutcome<PlayerId> {\n assertJsonWithinLimits(\n outcome,\n {\n maxDepth: 16,\n maxNodes: 2_000,\n maxStringBytes: 32_768,\n maxCollectionEntries: 1_000,\n },\n \"GameOutcome\",\n );\n assertNonEmptyBoundedString(\n outcome.reason?.code,\n \"reason.code\",\n OUTCOME_LABEL_LIMIT,\n );\n if (outcome.reason.message !== undefined) {\n assertNonEmptyBoundedString(outcome.reason.message, \"reason.message\");\n }\n if (outcome.standings.length === 0) {\n failOutcome(\"standings must not be empty\");\n }\n if (outcome.standings.length > OUTCOME_MAX_STANDINGS) {\n failOutcome(\"standings contains too many rows\");\n }\n\n const playerOrder = (state as { table?: { playerOrder?: readonly string[] } })\n .table?.playerOrder;\n if (!Array.isArray(playerOrder) || playerOrder.length === 0) {\n failOutcome(\"state.table.playerOrder must list configured players\");\n }\n const playerOrderIndex = new Map(\n playerOrder.map((playerId, index) => [playerId, index]),\n );\n const seen = new Set<string>();\n for (const standing of outcome.standings) {\n assertNonEmptyBoundedString(\n standing.playerId,\n \"standing.playerId\",\n OUTCOME_LABEL_LIMIT,\n );\n if (!playerOrderIndex.has(standing.playerId)) {\n failOutcome(`unknown player '${standing.playerId}'`);\n }\n if (seen.has(standing.playerId)) {\n failOutcome(`duplicate player '${standing.playerId}'`);\n }\n seen.add(standing.playerId);\n assertStandingValues(standing);\n }\n for (const playerId of playerOrder) {\n if (!seen.has(playerId)) {\n failOutcome(`missing player '${playerId}'`);\n }\n }\n\n return {\n reason: { ...outcome.reason },\n standings: [...outcome.standings].sort((left, right) => {\n const rank = left.rank - right.rank;\n if (rank !== 0) return rank;\n return (\n (playerOrderIndex.get(left.playerId) ?? Number.MAX_SAFE_INTEGER) -\n (playerOrderIndex.get(right.playerId) ?? Number.MAX_SAFE_INTEGER)\n );\n }),\n };\n}\n\nfunction normalizeGameEventDetail(\n detail: GameEventDetail,\n index: number,\n): GameEventDetail {\n assertGameEventString(\n detail.label,\n `details[${index}].label`,\n GAME_EVENT_LABEL_LIMIT,\n );\n if (typeof detail.value === \"number\") {\n assertFiniteNumber(detail.value, `details[${index}].value`);\n } else if (typeof detail.value === \"string\") {\n assertGameEventString(\n detail.value,\n `details[${index}].value`,\n GAME_EVENT_STRING_LIMIT,\n );\n } else if (typeof detail.value !== \"boolean\") {\n failGameEvent(`details[${index}].value must be string, number, or boolean`);\n }\n return {\n label: detail.label,\n value: detail.value,\n };\n}\n\nfunction normalizeSystemActionEvent(\n event: SystemActionEvent,\n): SystemActionEvent {\n assertGameEventString(\n event.procedureId,\n \"procedureId\",\n GAME_EVENT_LABEL_LIMIT,\n );\n assertGameEventString(event.title, \"title\", GAME_EVENT_STRING_LIMIT);\n if (event.summary !== undefined) {\n assertGameEventString(event.summary, \"summary\", GAME_EVENT_STRING_LIMIT);\n }\n if ((event.details?.length ?? 0) > GAME_EVENT_MAX_DETAILS) {\n failGameEvent(\"systemAction has too many details\");\n }\n return {\n kind: \"systemAction\",\n procedureId: event.procedureId,\n title: event.title,\n ...(event.summary !== undefined ? { summary: event.summary } : {}),\n ...(event.details !== undefined\n ? {\n details: event.details.map((detail, index) =>\n normalizeGameEventDetail(detail, index),\n ),\n }\n : {}),\n };\n}\n\nexport function normalizeGameEvents(\n events: readonly GameEvent[] = [],\n): GameEvent[] {\n assertJsonWithinLimits(\n events,\n {\n maxDepth: 8,\n maxNodes: 1_000,\n maxStringBytes: 32_768,\n maxCollectionEntries: 1_000,\n },\n \"GameEvent\",\n );\n if (events.length > GAME_EVENT_MAX_EVENTS) {\n failGameEvent(\"accepted result has too many events\");\n }\n return events.map((event, index) => {\n if (event.kind !== \"systemAction\") {\n failGameEvent(`events[${index}].kind is unsupported`);\n }\n return normalizeSystemActionEvent(event);\n });\n}\n\nexport function rejectResult(\n errorCode: string,\n message?: string,\n): ReducerReject {\n return {\n type: \"reject\",\n errorCode,\n message,\n };\n}\n\nexport function normalizeResult<State>(\n result: ReducerResult<State> | void,\n implicitResult: () => ReducerResult<State>,\n): ReducerResult<State> {\n if (result === undefined || result === null) {\n result = implicitResult();\n }\n if (result.type === \"accept\") {\n // Results built by `tx.accept()` / `tx.transition()` / `tx.endGame()`\n // arrive raw; enforce the canonical result limits before committing.\n return {\n ...result,\n\n events: normalizeGameEvents(result.events),\n ...(result.terminal\n ? { terminal: normalizeGameOutcome(result.state, result.terminal) }\n : {}),\n };\n }\n return result;\n}\n","export function toDomainState<State extends { runtime: unknown }, DomainState>(\n state: State,\n): DomainState {\n const domain = { ...state } as Omit<State, \"runtime\"> & { runtime?: unknown };\n delete domain.runtime;\n attachPhaseAccessor(domain);\n return domain as DomainState;\n}\n\nexport function toCombinedState<\n SessionState extends { domain: unknown; runtime: unknown },\n State,\n>(session: SessionState): State {\n const combined = {\n ...(session.domain as object),\n runtime: session.runtime,\n };\n attachPhaseAccessor(combined);\n return combined as State;\n}\n\nexport function toSessionState<\n State extends { runtime: unknown },\n DomainState,\n SessionState,\n>(state: State, toDomain: (state: State) => DomainState): SessionState {\n return {\n domain: toDomain(state),\n runtime: state.runtime,\n } as SessionState;\n}\n\nfunction attachPhaseAccessor(state: unknown): void {\n if (!state || typeof state !== \"object\") return;\n const candidate = state as {\n flow?: { currentPhase?: unknown };\n phase?: unknown;\n };\n const phase = candidate.phase;\n if (!phase || typeof phase !== \"object\") return;\n const descriptor = Object.getOwnPropertyDescriptor(phase, \"get\");\n if (descriptor && typeof descriptor.value === \"function\") return;\n Object.defineProperty(phase, \"get\", {\n enumerable: false,\n configurable: true,\n value: (phaseName: string) =>\n candidate.flow?.currentPhase === phaseName ? phase : null,\n });\n}\n","import { createReducerEdit } from \"../../transaction\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport { createReducerDiagnosticsEmitter } from \"../../diagnostics\";\nimport type {\n ReducerDiagnosticsEmitter,\n ReducerDiagnosticsSink,\n} from \"../../diagnostics\";\nimport type {\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n ReducerGameContractLike,\n ReducerGameDefinition,\n TableQueriesOfState,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n ActionContext,\n RandomHelpers,\n} from \"../../model/spec/runtime-args\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n type RuntimeArgsWithTransaction,\n} from \"./trusted-runtime-args\";\nimport { rejectResult } from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\n\nexport { normalizeResult } from \"./trusted-runtime-result\";\nexport { rejectResult };\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, View>;\n\nexport type TrustedDomainState<Contract extends ReducerGameContractLike> =\n BaseGameStateOfContract<Contract>;\n\nexport type TrustedSessionState<Contract extends ReducerGameContractLike> =\n BaseGameSessionOfContract<Contract>;\n\nexport type TrustedState<Contract extends ReducerGameContractLike> =\n TrustedDomainState<Contract> & {\n runtime: TrustedSessionState<Contract>[\"runtime\"];\n };\n\nexport type TrustedManifest<Contract extends ReducerGameContractLike> =\n ManifestContractOf<Contract>;\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, View>>;\n\nexport type TrustedPlayerId<Contract extends ReducerGameContractLike> =\n PlayerIdOfState<TrustedDomainState<Contract>>;\n\nexport type TrustedInput<Contract extends ReducerGameContractLike> =\n TrustedRuntimeInput<TrustedPlayerId<Contract>>;\n\nexport type { TrustedErasedPhase } from \"./runtime-registry\";\n\nexport interface TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, View>;\n diagnostics: ReducerDiagnosticsEmitter;\n registry: TrustedRuntimeRegistry<Contract, Definitions, View>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, View>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, View>;\n toDomainState(state: TrustedState<Contract>): TrustedDomainState<Contract>;\n toCombinedState(\n session: TrustedSessionState<Contract>,\n ): TrustedState<Contract>;\n toSessionState(state: TrustedState<Contract>): TrustedSessionState<Contract>;\n phaseRegistryByName(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n ): TrustedPhaseRegistry<Contract, Definitions, View> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, View>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<TrustedDomainState<Contract>>;\n random?: import(\"./rng-sampler\").MutableRandomHelpers;\n },\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>> & {\n q: ReturnType<typeof createStateQueries<TrustedDomainState<Contract>>>;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & RuntimeArgsWithTransaction<TrustedDomainState<Contract>> &\n Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, View>,\n options: { diagnostics?: ReducerDiagnosticsSink } = {},\n): TrustedRuntimeScope<Contract, Definitions, View> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = definition.initialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n\n function toDomainState(state: State): DomainState {\n return codecToDomainState<State, DomainState>(state);\n }\n\n function toCombinedState(session: SessionState): State {\n return codecToCombinedState<SessionState, State>(session);\n }\n\n function toSessionState(state: State): SessionState {\n return codecToSessionState<State, DomainState, SessionState>(\n state,\n toDomainState,\n );\n }\n\n function phaseRegistryByName(\n phaseName: PhaseName,\n ): TrustedPhaseRegistry<Contract, Definitions, View> | undefined {\n return registry.phasesByName.get(phaseName);\n }\n\n function phaseByName(phaseName: PhaseName): TrustedErasedPhase<Contract> {\n const phaseRegistry = phaseRegistryByName(phaseName);\n if (!phaseRegistry) {\n throw new Error(`Unknown reducer phase '${phaseName}'.`);\n }\n return phaseRegistry.phase;\n }\n\n function findInteractionInPhase(\n phaseName: PhaseName,\n interactionId: string,\n ): AnyInteractionSpec<DomainState, Manifest> | undefined {\n const found = interactionEntriesForPhase(phaseName).find(\n ([id]) => id === interactionId,\n );\n return found?.[1];\n }\n\n function interactionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.interactions ?? [];\n }\n\n const createTransaction = createReducerEdit<DomainState>();\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, definition.contract.manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState>;\n random?: import(\"./rng-sampler\").MutableRandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n definition.contract.manifest,\n createTransaction,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n diagnostics: createReducerDiagnosticsEmitter(options.diagnostics),\n registry,\n phaseEntries,\n defaultInitialPhase,\n\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n ManifestContract,\n TableOfState,\n} from \"../../model\";\n\nexport function collectTargetDomainMetadata(collector: InputCollector): {\n targetKind?: string;\n boardId?: string;\n valueKind?: \"board-id\" | \"player-board-space\";\n zoneId?: string;\n zoneIds?: readonly string[];\n} {\n switch (collector.kind) {\n case \"card\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? \"card\",\n zoneId: meta.zoneId,\n zoneIds:\n meta.zoneIds ??\n (meta.zoneId === undefined ? undefined : [meta.zoneId]),\n };\n }\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n boardId: meta.boardId,\n valueKind: meta.valueKind,\n };\n }\n default:\n return {};\n }\n}\n\nexport function interactionInputsOf<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<string, InputCollector> {\n return (interaction.inputs ?? {}) as Record<string, InputCollector>;\n}\n\nexport function collectInputMetadata<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<\n string,\n {\n kind: string;\n targetKind?: string;\n boardId?: string;\n zoneId?: string;\n zoneIds?: readonly string[];\n }\n> {\n const collectors = interactionInputsOf(interaction);\n return Object.fromEntries(\n Object.entries(collectors).map(([key, collector]) => [\n key,\n {\n kind: collector.kind,\n ...collectTargetDomainMetadata(collector),\n },\n ]),\n );\n}\n\nexport function collectFirstCardZoneId<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n const collectors = interactionInputsOf(interaction);\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n if (collector.meta.zoneId.length > 0) {\n return collector.meta.zoneId;\n }\n }\n }\n return undefined;\n}\n\nexport function collectCardZoneIds<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): readonly string[] {\n const collectors = interactionInputsOf(interaction);\n const zoneIds = new Set<string>();\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n for (const zoneId of collector.meta.zoneIds ?? [collector.meta.zoneId]) {\n if (zoneId.length > 0) zoneIds.add(zoneId);\n }\n }\n }\n return [...zoneIds];\n}\n\nexport function findCardInputKey<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) => collector.kind === \"card\",\n )?.[0];\n}\n\nexport function findCardInputKeyForZone<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n zoneId: string,\n): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) =>\n collector.kind === \"card\" &&\n (collector.meta.zoneIds ?? [collector.meta.zoneId])\n .map(String)\n .includes(zoneId),\n )?.[0];\n}\n","import type {\n InteractionDescriptor,\n InteractionCommitPolicy,\n InteractionAvailability,\n InteractionDiagnosticReason,\n InteractionInputDescriptor,\n} from \"../../../shared/interaction-schema\";\nimport type {\n AnyInteractionSpec,\n InteractionIdOfDefinition,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n TrustedDefinition,\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n CollectorInputEnumeration,\n CollectorInputSatisfiability,\n} from \"./collector-input-solver\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, View>>;\n\nexport type InteractionCommitPolicyShape = InteractionCommitPolicy;\nexport type InteractionAvailabilityShape = InteractionAvailability;\n\nexport type InteractionDecision =\n | { available: true }\n | {\n available: false;\n code: string;\n ruleId?: string;\n message?: string;\n };\n\nexport type InteractionDiagnosticReasonShape = InteractionDiagnosticReason;\n\nexport type InteractionExplanation = {\n interactionId: string;\n phase: string;\n step: string | null;\n availability:\n \"available\" | \"notYourTurn\" | \"wrongPhase\" | \"wrongStep\" | \"blocked\";\n rules: ReadonlyArray<{\n ruleId: string;\n outcome: \"passed\" | \"failed\" | \"notEvaluated\";\n errorCode?: string;\n message?: string;\n }>;\n actor: { required: readonly string[]; playerIsActor: boolean };\n inputs: ReadonlyArray<{\n key: string;\n kind: string;\n eligibleCount: number | \"unknown\";\n }>;\n};\n\n// Before projection admission, authored collectors may still return unknown values.\n// All transport fields derive from the admitting schema; only game identity and\n// the not-yet-admitted authored values are narrowed here.\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n ZoneId extends string = string,\n> = Omit<\n InteractionDescriptor,\n | \"phaseName\"\n | \"interactionKey\"\n | \"interactionId\"\n | \"zoneId\"\n | \"zoneIds\"\n | \"inputs\"\n | \"step\"\n> & {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: readonly InteractionInputDescriptorShape[];\n step?: Omit<NonNullable<InteractionDescriptor[\"step\"]>, \"selected\"> & {\n selected: Record<string, unknown>;\n };\n};\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, View>,\n TrustedInteractionId<Contract, Definitions, View>\n>;\n\nexport type InteractionInputDescriptorShape = Omit<\n InteractionInputDescriptor,\n \"defaultValue\"\n> & { defaultValue?: unknown };\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type InteractionDiagnosticsMode = \"verbose\" | undefined;\n\nexport type ResolveDecisionInput<Contract extends ReducerGameContractLike> = {\n state: TrustedState<Contract>;\n playerId: TrustedPlayerId<Contract>;\n interactionId: string;\n params?: Record<string, unknown>;\n mode: ResolveDecisionMode;\n /**\n * Internal finite-domain optimization. The caller has already proven the\n * param-independent actor, stage, step, and availability-rule invariants;\n * concrete submit validation still parses params and evaluates targets,\n * cost, and authored validate rules.\n */\n candidateInvariantsValidated?: boolean;\n projection?: ProjectionContext<TrustedDomainState<Contract>>;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> =\n | {\n found: false;\n validation: ReducerValidationResult;\n }\n | {\n found: true;\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n parsedParams: Record<string, unknown>;\n stepResult?: { values: unknown[]; complete: boolean };\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n View\n >;\n /** Trusted collector/domain satisfiability used by inspect/explore. */\n inputSatisfiability?: CollectorInputSatisfiability;\n validation: ReducerValidationResult;\n };\n\nexport type InteractionActionabilityResult =\n | { readonly found: false }\n | { readonly found: true; readonly visible: false }\n | {\n readonly found: true;\n readonly visible: true;\n readonly descriptor: InteractionDescriptorShape;\n readonly inputSatisfiability?: CollectorInputSatisfiability;\n };\n\nexport type InteractionInputEnumerationResult =\n | { readonly found: false }\n | { readonly found: true; readonly visible: false }\n | {\n readonly found: true;\n readonly visible: true;\n readonly descriptor: InteractionDescriptorShape;\n readonly inputSatisfiability?: CollectorInputSatisfiability;\n /** Null when trusted availability fails before input enumeration. */\n readonly enumeration: CollectorInputEnumeration | null;\n };\n\nexport function makeValidationError(\n errorCode: string,\n message?: string,\n): ReducerValidationResult {\n return {\n valid: false,\n errorCode,\n message,\n };\n}\n","import {\n inputValueInDomain,\n inputValueKey,\n} from \"../../../shared/input-domain\";\nimport { formatIssue } from \"../../parse-utils\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n InputSelectionDescriptor,\n ManifestContract,\n ReducerValidationResult,\n TableOfState,\n} from \"../../model\";\nimport { makeValidationError } from \"./interaction-types\";\nimport { interactionInputsOf } from \"./collector-introspection\";\n\nexport function parseInteractionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n options: { skipRng?: boolean } = {},\n):\n | { ok: true; params: Record<string, unknown> }\n | { ok: false; message: string } {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n if (interaction.paramsSchema) {\n const result = interaction.paramsSchema.safeParse(record);\n if (!result.success) {\n return {\n ok: false,\n message: result.error.issues\n .map((issue) => formatIssue(\"params\", issue))\n .join(\"; \"),\n };\n }\n return { ok: true, params: result.data as Record<string, unknown> };\n }\n const parsed: Record<string, unknown> = {};\n const issues: string[] = [];\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\" && options.skipRng) continue;\n const rawValue =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\n const result = collector.schema.safeParse(rawValue);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push(formatIssue(`params.${key}`, issue));\n }\n continue;\n }\n parsed[key] = result.data;\n }\n if (issues.length > 0) {\n return { ok: false, message: issues.join(\"; \") };\n }\n return { ok: true, params: parsed };\n}\n\nexport function prepareInteractionProjectionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n): Record<string, unknown> {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n const prepared: Record<string, unknown> = { ...record };\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n if (record[key] !== undefined) {\n const result = collector.schema.safeParse(record[key]);\n if (result.success) {\n prepared[key] = result.data;\n }\n continue;\n }\n if (\"defaultValue\" in collector) {\n prepared[key] = collector.defaultValue;\n continue;\n }\n const defaultResult = collector.schema.safeParse(undefined);\n if (defaultResult.success) {\n prepared[key] = defaultResult.data;\n }\n }\n return prepared;\n}\n\nexport function validateCollectorTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n params: Record<string, unknown>,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ));\n for (const [key, collector] of Object.entries(collectors)) {\n const issue = validateCollectorValue(\n collector,\n domainState,\n playerId,\n queries(),\n params[key],\n );\n if (issue) return makeValidationError(issue.errorCode, issue.message);\n }\n return { valid: true };\n}\n\nexport function validateCollectorValue(\n collector: InputCollector,\n state: CollectorState,\n playerId: string,\n q: unknown,\n value: unknown,\n domain = collector.domain?.(state, playerId, q),\n): { errorCode: string; message?: string } | null {\n const selectionIssue = validateCollectorSelection(collector, value);\n if (selectionIssue) return selectionIssue;\n if (value === undefined || collector.kind === \"rng\") return null;\n if (value !== null) {\n for (const target of valuesForCollectorValidation(\n collector.selection,\n value,\n )) {\n const issue = collector.validateTarget?.(state, playerId, q, target);\n if (issue) return issue;\n }\n }\n return domain && !inputValueInDomain(domain, value, collector.selection)\n ? {\n errorCode: \"INVALID_INPUT_VALUE\",\n message: \"Selected value is outside the current input domain.\",\n }\n : null;\n}\n\nfunction valuesForCollectorValidation(\n selection: InputSelectionDescriptor | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") {\n return Array.isArray(value) ? value : [];\n }\n return [value];\n}\n\nexport function validateCollectorSelection(\n collector: InputCollector,\n value: unknown,\n): { errorCode: string; message?: string } | null {\n const selection = collector.selection;\n if (selection?.mode !== \"many\") return null;\n if (!Array.isArray(value)) return null;\n if (value.length < selection.min) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at least ${selection.min} value${selection.min === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.max !== undefined && value.length > selection.max) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at most ${selection.max} value${selection.max === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = inputValueKey(item);\n if (seen.has(key)) {\n return {\n errorCode: \"DUPLICATE_INPUT_VALUE\",\n message: \"Input values must be distinct.\",\n };\n }\n seen.add(key);\n }\n }\n return null;\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport const SIMULTANEOUS_SUBMIT_INTERACTION_ID = \"submit\";\n\ntype ErasedPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<TrustedRuntimeScope<Contract, Definitions, View>[\"phaseByName\"]>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, View>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, View>,\n):\n | AnyInteractionSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>\n | undefined {\n return (phase as { submit?: unknown }).submit as\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n}\n\nfunction resolvePromptToArray<PlayerId extends string>(\n value: unknown,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n if (Array.isArray(value)) return value as PlayerId[];\n if (typeof value === \"string\") return [value as PlayerId];\n return [];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, View>,\n projection?: ProjectionContext<TrustedDomainState<Contract>>,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector =\n (phase as { actors?: unknown; actor?: unknown }).actors ??\n (phase as { actor?: unknown }).actor;\n if (typeof selector === \"function\") {\n const selected = selector(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n const resolved = resolvePromptToArray<PlayerId>(selected);\n if (resolved.length > 0) {\n return resolved;\n }\n }\n const active = state.flow.activePlayers as PlayerId[];\n if (active.length > 0) {\n return [...active];\n }\n return [...(state.table.playerOrder as PlayerId[])];\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionActorAuthorization } from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n} from \"./simultaneous-player\";\n\nfunction resolveActorSet<PlayerId extends string>(\n to: unknown,\n): ReadonlySet<PlayerId> {\n if (to === undefined || to === null) return new Set();\n if (Array.isArray(to)) {\n return new Set(to as PlayerId[]);\n }\n if (typeof to === \"string\") {\n return new Set([to as PlayerId]);\n }\n return new Set();\n}\n\nexport function createInteractionAuthorization<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, View>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState>,\n ): InteractionActorAuthorization<PlayerId> {\n if (interaction.actor) {\n const resolved = interaction.actor(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n return {\n mode: \"actors\",\n actors: resolveActorSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase as PhaseName);\n if (isSimultaneousPhase(phase)) {\n return {\n mode: \"actors\",\n actors: new Set(\n resolveSimultaneousActors(scope, state, phase, projection),\n ),\n };\n }\n if (phase.actor) {\n const resolved = phase.actor(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n return {\n mode: \"actors\",\n actors: resolveActorSet<PlayerId>(resolved),\n };\n }\n return { mode: \"active\" };\n }\n\n function isActorAuthorized(\n state: State,\n playerId: PlayerId,\n authorization: InteractionActorAuthorization<PlayerId>,\n ): boolean {\n if (authorization.mode === \"actors\") {\n return authorization.actors.has(playerId);\n }\n const active = state.flow.activePlayers as readonly PlayerId[];\n if (active.length === 0) {\n return true;\n }\n return active.includes(playerId);\n }\n\n return {\n isActorAuthorized,\n resolveInteractionActorAuthorization,\n };\n}\n","import { z } from \"zod\";\nimport { collectReducerDefinitionIndex } from \"./definition-index\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewOfContract,\n} from \"./model\";\n\nexport type ClientParamSchema = {\n safeParse: (value: unknown) =>\n | { success: true; data: Record<string, unknown> }\n | {\n success: false;\n error: { issues: Array<{ path: PropertyKey[]; message: string }> };\n };\n};\n\nexport type ClientParamSchemasByPhase = Readonly<\n Record<string, Readonly<Record<string, ClientParamSchema>>>\n>;\n\nexport function schemaForCollectors(\n collectors: Record<string, InputCollector>,\n): ClientParamSchema {\n const shape: Record<string, z.ZodTypeAny> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n const schema = collector.schema as z.ZodTypeAny;\n shape[key] =\n \"defaultValue\" in collector\n ? schema.default(collector.defaultValue)\n : schema;\n }\n return z.object(shape) as unknown as ClientParamSchema;\n}\n\nexport function createClientParamSchemasByPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n): ClientParamSchemasByPhase {\n const index = collectReducerDefinitionIndex(definition);\n const out: Record<string, Record<string, ClientParamSchema>> = {};\n for (const phaseIndex of index.phasesByName.values()) {\n const phaseSchemas: Record<string, ClientParamSchema> = {};\n for (const [id, interaction] of phaseIndex.interactions) {\n if (interaction.steps) continue;\n phaseSchemas[id] =\n interaction.paramsSchema ?? schemaForCollectors(interaction.inputs);\n }\n out[String(phaseIndex.phaseName)] = phaseSchemas;\n }\n return out;\n}\n","import type { StepDefinition } from \"../../authoring/steps\";\nimport type {\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n PlayerIdOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport { createStateQueries } from \"../../table-queries\";\nimport { validateCollectorValue } from \"./collector-params\";\n\n/** Evaluate in order against authoritative state. Never samples RNG or applies defaults. */\nexport function evaluateStepPrefix<State extends CollectorState>(\n steps: StepDefinition<Record<string, InputCollector>>,\n state: State,\n playerId: PlayerIdOfState<State>,\n values: readonly unknown[],\n) {\n const q = createStateQueries(state) as TableQueriesOfState<State>;\n const selected: Record<string, unknown> = {};\n const collectors: Record<string, InputCollector> = {};\n const validValues: unknown[] = [];\n let current:\n | { key: string; collector: InputCollector; domain?: InputDomainDescriptor }\n | undefined;\n let issue: string | undefined;\n for (const entry of steps.entries) {\n const collector = entry.resolve({ state, playerId, q, selected });\n const domain = collector.domain?.(state, playerId, q);\n current = { key: entry.key, collector, domain };\n if (validValues.length === values.length) break;\n const value = values[validValues.length];\n const parsed = collector.schema.safeParse(value);\n if (!parsed.success || value === undefined || parsed.data === undefined) {\n issue = `Invalid value for step '${entry.key}'.`;\n break;\n }\n if (\n validateCollectorValue(collector, state, playerId, q, parsed.data, domain)\n ) {\n issue = `Value for step '${entry.key}' is no longer eligible.`;\n break;\n }\n selected[entry.key] = parsed.data;\n collectors[entry.key] = collector;\n validValues.push(value);\n current = undefined;\n }\n if (values.length > steps.entries.length)\n issue = \"Too many committed step values.\";\n return {\n selected,\n collectors,\n values: validValues,\n current,\n issue,\n complete: !current && validValues.length === steps.entries.length,\n };\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport { interactionInputsOf } from \"./collector-introspection\";\n\nexport type CollectorInputSatisfiability =\n | { readonly status: \"yes\" }\n | { readonly status: \"no\"; readonly inputKey?: string }\n | { readonly status: \"notEnumerable\"; readonly inputKey?: string };\n\nexport type CollectorInputEnumeration =\n | {\n readonly status: \"enumerated\";\n readonly assignments: readonly Readonly<Record<string, unknown>>[];\n readonly evaluated: number;\n }\n | {\n readonly status: \"notEnumerable\";\n readonly assignments: readonly [];\n readonly evaluated: number;\n readonly inputKey?: string;\n }\n | {\n readonly status: \"budget\";\n readonly assignments: readonly [];\n readonly evaluated: number;\n readonly inputKey?: string;\n };\n\nexport type CollectorInputSolverOptions<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n> = {\n readonly interaction: AnyInteractionSpec<DomainState, Manifest>;\n readonly domainState: DomainState;\n readonly playerId: PlayerId;\n readonly queries?: TableQueriesOfState<DomainState>;\n /** Values already selected by a trusted caller, such as a card projection. */\n readonly initialValues?: Readonly<Record<string, unknown>>;\n /**\n * Final trusted acceptance check for one structurally complete assignment.\n * The decision layer supplies the normal submit validator here so collector\n * domains cannot advertise commands rejected by rules, costs, or targets.\n */\n readonly acceptsAssignment?: (\n assignment: Readonly<Record<string, unknown>>,\n ) => boolean;\n};\n\ntype ValueSource = {\n /** False means the yielded values are witnesses, not an exhaustive domain. */\n readonly complete: boolean;\n readonly values: () => Iterable<unknown>;\n};\n\nconst ABSENT_COLLECTOR_VALUE = Symbol(\"absentCollectorValue\");\n\ntype SolverContext = {\n readonly interaction: AnyInteractionSpec<\n CollectorState,\n ManifestContract<CollectorState[\"table\"]>\n >;\n readonly domainState: CollectorState;\n readonly playerId: string;\n readonly collectors: readonly (readonly [string, InputCollector])[];\n readonly initialValues: Readonly<Record<string, unknown>>;\n readonly acceptsAssignment: (\n assignment: Readonly<Record<string, unknown>>,\n ) => boolean;\n readonly queries: () => unknown;\n};\n\ntype RecursiveSatisfiability =\n | {\n readonly status: \"yes\";\n readonly assignment: Readonly<Record<string, unknown>>;\n }\n | { readonly status: \"no\"; readonly inputKey?: string }\n | { readonly status: \"notEnumerable\"; readonly inputKey?: string };\n\nclass EnumerationBudgetError extends Error {\n readonly inputKey?: string;\n\n constructor(inputKey?: string) {\n super(\"Collector input enumeration exceeded its evaluation budget.\");\n this.name = \"EnumerationBudgetError\";\n this.inputKey = inputKey;\n }\n}\n\nclass DomainNotEnumerableError extends Error {\n readonly inputKey?: string;\n\n constructor(inputKey?: string) {\n super(\"Collector input domain is not completely enumerable.\");\n this.name = \"DomainNotEnumerableError\";\n this.inputKey = inputKey;\n }\n}\n\n/**\n * Proves whether collector/domain authority contains at least one complete\n * client parameter assignment. This operation has no pagination or evaluation\n * budget: changing an explore page can never change production actionability.\n */\nexport function hasAnyCollectorInputAssignment<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n options: CollectorInputSolverOptions<DomainState, Manifest, PlayerId>,\n): CollectorInputSatisfiability {\n const context = createSolverContext(options);\n const result = findFirstAssignment(context, 0, {});\n return result.status === \"yes\" ? { status: \"yes\" } : result;\n}\n\n/**\n * Materializes the complete finite collector domain in deterministic order.\n * Results are all-or-nothing: an opaque/unbounded branch or exhausted budget\n * returns an omission status instead of a misleading partial domain.\n */\nexport function enumerateCollectorInputAssignments<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n options: CollectorInputSolverOptions<DomainState, Manifest, PlayerId> & {\n readonly maxEvaluations: number;\n },\n): CollectorInputEnumeration {\n assertEvaluationBudget(options.maxEvaluations);\n const context = createSolverContext(options);\n const assignments: Array<Readonly<Record<string, unknown>>> = [];\n let evaluated = 0;\n\n const accountEvaluation = (inputKey?: string): void => {\n if (evaluated >= options.maxEvaluations) {\n throw new EnumerationBudgetError(inputKey);\n }\n evaluated += 1;\n };\n\n const visit = (\n collectorIndex: number,\n assignment: Readonly<Record<string, unknown>>,\n ): void => {\n const entry = context.collectors[collectorIndex];\n if (!entry) {\n accountEvaluation();\n const complete = completeAssignment(context, assignment);\n if (complete.status === \"yes\") assignments.push(complete.assignment);\n if (complete.status === \"notEnumerable\") {\n throw new DomainNotEnumerableError(complete.inputKey);\n }\n return;\n }\n\n const [inputKey, collector] = entry;\n if (collector.kind === \"rng\") {\n visit(collectorIndex + 1, assignment);\n return;\n }\n\n const source = valueSourceForCollector(context, inputKey, collector);\n if (!source.complete) {\n throw new DomainNotEnumerableError(inputKey);\n }\n for (const value of source.values()) {\n accountEvaluation(inputKey);\n visit(\n collectorIndex + 1,\n value === ABSENT_COLLECTOR_VALUE\n ? assignment\n : { ...assignment, [inputKey]: value },\n );\n }\n };\n\n try {\n visit(0, {});\n } catch (error) {\n if (error instanceof DomainNotEnumerableError) {\n return {\n status: \"notEnumerable\",\n assignments: [],\n evaluated,\n inputKey: error.inputKey,\n };\n }\n if (error instanceof EnumerationBudgetError) {\n return {\n status: \"budget\",\n assignments: [],\n evaluated,\n inputKey: error.inputKey,\n };\n }\n throw error;\n }\n\n const byCanonicalValue = new Map<string, Readonly<Record<string, unknown>>>();\n for (const assignment of assignments) {\n byCanonicalValue.set(canonicalJson(assignment), assignment);\n }\n return {\n status: \"enumerated\",\n assignments: [...byCanonicalValue.entries()]\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([, assignment]) => assignment),\n evaluated,\n };\n}\n\nfunction createSolverContext<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n options: CollectorInputSolverOptions<DomainState, Manifest, PlayerId>,\n): SolverContext {\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n options.domainState as unknown as {\n table: CollectorState[\"table\"];\n },\n ) as unknown as TableQueriesOfState<DomainState>);\n return {\n interaction: options.interaction as unknown as AnyInteractionSpec<\n CollectorState,\n ManifestContract<CollectorState[\"table\"]>\n >,\n domainState: options.domainState,\n playerId: options.playerId,\n collectors: Object.entries(interactionInputsOf(options.interaction)),\n initialValues: options.initialValues ?? {},\n acceptsAssignment: options.acceptsAssignment ?? (() => true),\n queries,\n };\n}\n\nfunction findFirstAssignment(\n context: SolverContext,\n collectorIndex: number,\n assignment: Readonly<Record<string, unknown>>,\n): RecursiveSatisfiability {\n const entry = context.collectors[collectorIndex];\n if (!entry) return completeAssignment(context, assignment);\n\n const [inputKey, collector] = entry;\n if (collector.kind === \"rng\") {\n return findFirstAssignment(context, collectorIndex + 1, assignment);\n }\n\n const source = valueSourceForCollector(context, inputKey, collector);\n let sawUnknown = !source.complete;\n for (const value of source.values()) {\n const result = findFirstAssignment(\n context,\n collectorIndex + 1,\n value === ABSENT_COLLECTOR_VALUE\n ? assignment\n : { ...assignment, [inputKey]: value },\n );\n if (result.status === \"yes\") return result;\n if (result.status === \"notEnumerable\") sawUnknown = true;\n }\n return sawUnknown\n ? { status: \"notEnumerable\", inputKey }\n : { status: \"no\", inputKey };\n}\n\nfunction completeAssignment(\n context: SolverContext,\n assignment: Readonly<Record<string, unknown>>,\n): RecursiveSatisfiability {\n const candidate = { ...context.initialValues, ...assignment };\n if (!context.interaction.paramsSchema) {\n return context.acceptsAssignment(candidate)\n ? { status: \"yes\", assignment: candidate }\n : { status: \"no\" };\n }\n const parsed = context.interaction.paramsSchema.safeParse(candidate);\n if (parsed.success) {\n return context.acceptsAssignment(candidate)\n ? { status: \"yes\", assignment: candidate }\n : { status: \"no\" };\n }\n if (context.collectors.length === 0) {\n return { status: \"notEnumerable\" };\n }\n return { status: \"no\" };\n}\n\nfunction valueSourceForCollector(\n context: SolverContext,\n inputKey: string,\n collector: InputCollector,\n): ValueSource {\n const resolved = resolveCollectorValueSource(context, collector);\n if (!Object.prototype.hasOwnProperty.call(context.initialValues, inputKey)) {\n return resolved;\n }\n\n const fixedValue = context.initialValues[inputKey];\n if (!resolved.complete) {\n return fixedCollectorValueSource(context, collector, fixedValue);\n }\n if (collector.selection?.mode === \"many\" && !Array.isArray(fixedValue)) {\n const matchingSelections = [...resolved.values()].filter(\n (candidate): candidate is readonly unknown[] =>\n Array.isArray(candidate) &&\n candidate.some(\n (selected) => canonicalJson(selected) === canonicalJson(fixedValue),\n ),\n );\n return finiteValueSource(matchingSelections);\n }\n const matches = [...resolved.values()].some(\n (candidate) => canonicalJson(candidate) === canonicalJson(fixedValue),\n );\n return {\n complete: true,\n values: function* () {\n if (matches) yield fixedValue;\n },\n };\n}\n\nfunction fixedCollectorValueSource(\n context: SolverContext,\n collector: InputCollector,\n fixedValue: unknown,\n): ValueSource {\n const schemaResult = collector.schema.safeParse(fixedValue);\n const targetValues =\n collector.selection?.mode === \"many\" && Array.isArray(fixedValue)\n ? fixedValue\n : [fixedValue];\n const targetValid = targetValues.every(\n (target) =>\n !collector.validateTarget ||\n collector.validateTarget(\n context.domainState,\n context.playerId,\n context.queries(),\n target,\n ) == null,\n );\n return {\n complete: true,\n values: function* () {\n if (schemaResult.success && targetValid) yield fixedValue;\n },\n };\n}\n\nfunction resolveCollectorValueSource(\n context: SolverContext,\n collector: InputCollector,\n): ValueSource {\n if (!collector.domain) return incompleteValueSource();\n\n const domain = collector.domain(\n context.domainState,\n context.playerId,\n context.queries(),\n );\n const base = baseValuesForDomain(domain, collector, context);\n const selected = applySelection(\n base,\n collector.selection ?? domain.selection,\n );\n return collector.schema.safeParse(undefined).success\n ? withAbsentCollectorValue(selected)\n : selected;\n}\n\nfunction withAbsentCollectorValue(source: ValueSource): ValueSource {\n return {\n complete: source.complete,\n values: function* () {\n yield ABSENT_COLLECTOR_VALUE;\n yield* source.values();\n },\n };\n}\n\nfunction baseValuesForDomain(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n context: SolverContext,\n): ValueSource {\n switch (domain.type) {\n case \"cardTarget\":\n case \"boardTarget\": {\n if (collector.eligibleTargets) {\n return finiteValueSource(\n collector.eligibleTargets(\n context.domainState,\n context.playerId,\n context.queries(),\n ),\n );\n }\n return domain.projection === \"resolved\"\n ? finiteValueSource(domain.eligibleTargets)\n : incompleteValueSource();\n }\n case \"choice\": {\n const eligibleTargetKeys = collector.eligibleTargets\n ? new Set(\n collector\n .eligibleTargets(\n context.domainState,\n context.playerId,\n context.queries(),\n )\n .map((value) => canonicalJson(value)),\n )\n : null;\n return finiteValueSource(\n domain.choices.flatMap((choice) =>\n choice.disabled ||\n (eligibleTargetKeys &&\n !eligibleTargetKeys.has(canonicalJson(choice.value)))\n ? []\n : [choice.value],\n ),\n );\n }\n case \"choiceList\":\n return choiceListValueSource(domain);\n case \"boundedNumber\":\n return boundedNumberValueSource(domain.min, domain.max, domain.step ?? 1);\n case \"resourceMap\":\n return resourceMapValueSource(domain.resources);\n }\n}\n\nfunction finiteValueSource(values: Iterable<unknown>): ValueSource {\n const byCanonicalValue = new Map<string, unknown>();\n for (const value of values) {\n byCanonicalValue.set(canonicalJson(value), value);\n }\n const ordered = [...byCanonicalValue.entries()]\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([, value]) => value);\n return {\n complete: true,\n values: () => ordered,\n };\n}\n\nfunction incompleteValueSource(values: readonly unknown[] = []): ValueSource {\n return {\n complete: false,\n values: () => values,\n };\n}\n\nfunction boundedNumberValueSource(\n min: number,\n max: number,\n step: number,\n): ValueSource {\n if (![min, max, step].every(Number.isFinite) || step <= 0) {\n return incompleteValueSource();\n }\n if (max < min) return finiteValueSource([]);\n const count = Math.floor((max - min) / step) + 1;\n if (!Number.isSafeInteger(count)) {\n return incompleteValueSource([min]);\n }\n return {\n complete: true,\n values: function* () {\n for (let index = 0; index < count; index += 1) {\n yield min + index * step;\n }\n },\n };\n}\n\nfunction resourceMapValueSource(\n resources: readonly {\n readonly resourceId: string;\n readonly min: number;\n readonly max: number;\n }[],\n): ValueSource {\n const orderedResources = [...resources].sort((left, right) =>\n compareCanonicalStrings(left.resourceId, right.resourceId),\n );\n if (\n orderedResources.some(\n ({ min, max }) =>\n !Number.isSafeInteger(min) || !Number.isSafeInteger(max),\n )\n ) {\n return incompleteValueSource();\n }\n if (orderedResources.some(({ min, max }) => max < min)) {\n return finiteValueSource([]);\n }\n return {\n complete: true,\n values: function* () {\n yield* enumerateResourceMaps(orderedResources, 0, {});\n },\n };\n}\n\nfunction* enumerateResourceMaps(\n resources: readonly {\n readonly resourceId: string;\n readonly min: number;\n readonly max: number;\n }[],\n index: number,\n current: Readonly<Record<string, number>>,\n): Iterable<Record<string, number>> {\n const resource = resources[index];\n if (!resource) {\n yield { ...current };\n return;\n }\n for (let value = resource.min; value <= resource.max; value += 1) {\n yield* enumerateResourceMaps(resources, index + 1, {\n ...current,\n [resource.resourceId]: value,\n });\n }\n}\n\nfunction choiceListValueSource(domain: {\n readonly choices: readonly {\n readonly value: string;\n readonly disabled?: boolean;\n }[];\n readonly min?: number;\n readonly max?: number;\n}): ValueSource {\n const choices = [\n ...new Set(\n domain.choices\n .filter((choice) => !choice.disabled)\n .map((choice) => choice.value),\n ),\n ].sort((left, right) =>\n compareCanonicalStrings(canonicalJson(left), canonicalJson(right)),\n );\n const min = domain.min ?? 0;\n const max = domain.max ?? choices.length;\n if (\n !Number.isSafeInteger(min) ||\n !Number.isSafeInteger(max) ||\n min < 0 ||\n max < min\n ) {\n return incompleteValueSource();\n }\n if (min > choices.length) return finiteValueSource([]);\n const cappedMax = Math.min(max, choices.length);\n return {\n complete: true,\n values: function* () {\n for (let count = min; count <= cappedMax; count += 1) {\n yield* enumerateCombinations(choices, count, 0, []);\n }\n },\n };\n}\n\nfunction applySelection(\n source: ValueSource,\n selection:\n | {\n readonly mode: \"single\";\n }\n | {\n readonly mode: \"many\";\n readonly min: number;\n readonly max?: number;\n readonly distinct?: boolean;\n }\n | undefined,\n): ValueSource {\n if (selection?.mode !== \"many\") return source;\n if (!source.complete) return incompleteValueSource();\n const min = selection.min;\n const max = selection.max;\n if (!Number.isSafeInteger(min) || min < 0) return incompleteValueSource();\n if (max !== undefined && (!Number.isSafeInteger(max) || max < min)) {\n return incompleteValueSource();\n }\n if (max === undefined && !selection.distinct) {\n return {\n complete: false,\n values: function* () {\n yield* enumerateSequencesFromSource(source.values, min, []);\n },\n };\n }\n return {\n complete: true,\n values: function* () {\n if (selection.distinct && max === undefined) {\n for (let count = min; ; count += 1) {\n let yielded = false;\n for (const combination of enumerateCombinationsFromSource(\n source.values,\n count,\n 0,\n [],\n )) {\n yielded = true;\n yield combination;\n }\n if (!yielded) return;\n }\n }\n const finiteMax = max ?? min;\n for (let count = min; count <= finiteMax; count += 1) {\n if (selection.distinct) {\n yield* enumerateCombinationsFromSource(source.values, count, 0, []);\n } else {\n yield* enumerateSequencesFromSource(source.values, count, []);\n }\n }\n },\n };\n}\n\nfunction* enumerateCombinationsFromSource<Value>(\n values: () => Iterable<Value>,\n count: number,\n start: number,\n current: readonly Value[],\n): Iterable<Value[]> {\n if (current.length === count) {\n yield [...current];\n return;\n }\n let index = 0;\n for (const value of values()) {\n if (index >= start) {\n yield* enumerateCombinationsFromSource(values, count, index + 1, [\n ...current,\n value,\n ]);\n }\n index += 1;\n }\n}\n\nfunction* enumerateSequencesFromSource<Value>(\n values: () => Iterable<Value>,\n count: number,\n current: readonly Value[],\n): Iterable<Value[]> {\n if (current.length === count) {\n yield [...current];\n return;\n }\n for (const value of values()) {\n yield* enumerateSequencesFromSource(values, count, [...current, value]);\n }\n}\n\nfunction* enumerateCombinations<Value>(\n values: readonly Value[],\n count: number,\n start: number,\n current: readonly Value[],\n): Iterable<Value[]> {\n if (current.length === count) {\n yield [...current];\n return;\n }\n for (let index = start; index < values.length; index += 1) {\n yield* enumerateCombinations(values, count, index + 1, [\n ...current,\n values[index]!,\n ]);\n }\n}\n\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(canonicalizeJson(value));\n}\n\nfunction canonicalizeJson(value: unknown): unknown {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new Error(\"Collector input domain contains a non-finite number.\");\n }\n return value;\n }\n if (Array.isArray(value)) return value.map(canonicalizeJson);\n if (typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => compareCanonicalStrings(left, right))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n }\n throw new Error(\"Collector input domain contains a non-JSON value.\");\n}\n\nfunction compareCanonicalStrings(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction assertEvaluationBudget(value: number): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(\"maxEvaluations must be a positive safe integer.\");\n }\n}\n","export function interactionDomainEligibleCount(\n domain: unknown,\n): number | \"unknown\" {\n if (!domain || typeof domain !== \"object\") return \"unknown\";\n const typed = domain as {\n type?: string;\n projection?: string;\n eligibleTargets?: readonly unknown[];\n choices?: readonly { disabled?: boolean }[];\n resources?: readonly unknown[];\n min?: number;\n max?: number;\n step?: number;\n };\n if (\n (typed.type === \"cardTarget\" || typed.type === \"boardTarget\") &&\n typed.projection === \"resolved\"\n ) {\n return typed.eligibleTargets?.length ?? 0;\n }\n if (typed.type === \"choice\" || typed.type === \"choiceList\") {\n return (typed.choices ?? []).filter((choice) => !choice.disabled).length;\n }\n if (typed.type === \"resourceMap\") {\n return typed.resources?.length ?? 0;\n }\n if (\n typed.type === \"boundedNumber\" &&\n typeof typed.min === \"number\" &&\n typeof typed.max === \"number\"\n ) {\n const step =\n typeof typed.step === \"number\" && typed.step > 0 ? typed.step : 1;\n return Math.max(0, Math.floor((typed.max - typed.min) / step) + 1);\n }\n return \"unknown\";\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n ManifestContract,\n TableOfState,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\nimport { interactionInputsOf } from \"./collector-introspection\";\n\nexport function collectInteractionInputs<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: { readonly queries?: TableQueriesOfState<DomainState> } = {},\n): InteractionInputDescriptorShape[] {\n const q = options.queries ?? createStateQueries(domainState);\n return Object.entries(interactionInputsOf(interaction)).flatMap(\n ([key, collector]) => {\n if (collector.kind === \"rng\") return [];\n if (!collector.domain)\n throw new Error(`Interaction input '${key}' has no renderable domain.`);\n const resolved = collector.domain(domainState, playerId, q);\n const domain = collector.selection\n ? { ...resolved, selection: collector.selection }\n : resolved;\n const defaultValue =\n \"defaultValue\" in collector\n ? collector.defaultValue\n : collector.resolveDefaultValue?.(domainState, playerId, q, domain);\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(defaultValue !== undefined ? { defaultValue } : {}),\n },\n ];\n },\n );\n}\n","import { evaluateStepPrefix } from \"./step-prefix\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n interactionInputsOf,\n} from \"./collector-introspection\";\nimport { collectInteractionInputs } from \"./collector-domains\";\nimport type {\n InteractionDecision,\n InteractionAvailabilityShape,\n InteractionDescriptorShape,\n TrustedInteractionDescriptorShape,\n TrustedInteractionId,\n} from \"./interaction-types\";\nimport { FrameworkErrorCodes } from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nfunction humanizeInteractionId(id: string): string {\n if (!id) return id;\n const withSpaces = id\n .replace(/[-_]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .trim();\n if (!withSpaces) return id;\n return withSpaces\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isManyCollector(collector: InputCollector): boolean {\n return collector.selection?.mode === \"many\";\n}\n\nfunction deriveCommitPolicy(\n inputs: Record<string, InputCollector>,\n explicit: InteractionDescriptorShape[\"commit\"] | undefined,\n): InteractionDescriptorShape[\"commit\"] {\n const collectors = Object.values(inputs);\n const hasManyCollector = collectors.some(isManyCollector);\n if (explicit) {\n if (explicit.mode === \"autoWhenReady\" && hasManyCollector) {\n throw new Error(\n 'Interactions with many(...) inputs must use commit: { mode: \"manual\" }.',\n );\n }\n return explicit;\n }\n if (hasManyCollector) {\n return { mode: \"manual\" };\n }\n if (collectors.length === 0 || !collectors.some(isTargetCollector)) {\n return { mode: \"manual\" };\n }\n const terminalCollectors = Object.values(inputs);\n if (terminalCollectors.length === 0) {\n return { mode: \"manual\" };\n }\n return terminalCollectors.every(\n (collector) => isTargetCollector(collector) || collector.kind === \"rng\",\n ) && terminalCollectors.some(isTargetCollector)\n ? { mode: \"autoWhenReady\" }\n : { mode: \"manual\" };\n}\n\nfunction projectInteractionMetadata(interaction: {\n inputs: Record<string, InputCollector>;\n commit?: InteractionDescriptorShape[\"commit\"];\n presentation?: { label?: string; help?: string };\n interactionId: string;\n}): Pick<InteractionDescriptorShape, \"kind\" | \"commit\" | \"label\" | \"help\"> {\n const label = normalizePresentationText(interaction.presentation?.label);\n const help = normalizePresentationText(interaction.presentation?.help);\n return {\n kind: \"action\",\n commit: deriveCommitPolicy(interaction.inputs, interaction.commit),\n label: label ?? humanizeInteractionId(interaction.interactionId),\n help,\n };\n}\n\nfunction normalizePresentationText(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction enrichResourceInputPresentation(\n inputs: InteractionDescriptorShape[\"inputs\"],\n manifest: { literals?: { resourcePresentationById?: unknown } },\n): InteractionDescriptorShape[\"inputs\"] {\n const presentationById = manifest.literals?.resourcePresentationById;\n if (!presentationById || typeof presentationById !== \"object\") {\n return inputs;\n }\n const resources = presentationById as Record<\n string,\n { label?: unknown; icon?: unknown }\n >;\n const enrichChoice = <\n Choice extends { value: string | null; label: string; icon?: string },\n >(\n choice: Choice,\n ): Choice & { icon?: string } => {\n const presentation =\n choice.value === null ? undefined : resources[choice.value];\n return {\n ...choice,\n label:\n typeof presentation?.label === \"string\" &&\n (!choice.label || choice.label === choice.value)\n ? presentation.label\n : choice.label ||\n (typeof presentation?.label === \"string\" ? presentation.label : \"\"),\n icon:\n choice.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n };\n return inputs.map((input) => {\n if (input.domain.type === \"choice\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type === \"choiceList\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type !== \"resourceMap\") return input;\n return {\n ...input,\n domain: {\n ...input.domain,\n resources: input.domain.resources.map((entry) => {\n const presentation = resources[entry.resourceId];\n return {\n ...entry,\n label:\n entry.label ??\n (typeof presentation?.label === \"string\"\n ? presentation.label\n : undefined),\n icon:\n entry.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n }),\n },\n };\n });\n}\n\nfunction interactionAvailabilityFromDecision(\n decision: InteractionDecision,\n): InteractionAvailabilityShape {\n if (decision.available) return { status: \"available\" };\n switch (decision.code) {\n case FrameworkErrorCodes.NOT_YOUR_TURN:\n return {\n status: \"notYourTurn\",\n reason: decision.message ?? \"Not your turn\",\n };\n case FrameworkErrorCodes.NO_LEGAL_INPUT:\n return {\n status: \"blocked\",\n reason: decision.message ?? \"No legal input is currently available.\",\n code: FrameworkErrorCodes.NO_LEGAL_INPUT,\n };\n default:\n return {\n status: \"blocked\",\n reason: decision.message ?? \"Interaction unavailable\",\n code: decision.code,\n };\n }\n}\n\nexport function buildInteractionDescriptor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n state: TrustedState<Contract>,\n playerId: TrustedPlayerId<Contract>,\n interactionId: TrustedInteractionId<Contract, Definitions, View>,\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >,\n decision: InteractionDecision,\n options: {\n projection?: ProjectionContext<TrustedDomainState<Contract>>;\n includeDiagnosticReasons?: boolean;\n stepPrefix?: ReturnType<typeof evaluateStepPrefix>;\n } = {},\n): TrustedInteractionDescriptorShape<Contract, Definitions, View> {\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n View\n >;\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const saved = state.runtime.pending[playerId];\n const prefix =\n options.stepPrefix ??\n (interaction.steps &&\n (decision.available || decision.code === FrameworkErrorCodes.NO_LEGAL_INPUT)\n ? evaluateStepPrefix(\n interaction.steps,\n domainState,\n playerId,\n saved?.interactionId === interactionId &&\n saved.phaseName === phaseName\n ? saved.values\n : [],\n )\n : undefined);\n const projectedInteraction = prefix\n ? {\n ...interaction,\n steps: undefined,\n paramsSchema: undefined,\n inputs: prefix.current\n ? { [prefix.current.key]: prefix.current.collector }\n : {},\n }\n : interaction;\n const interactionInputs = interactionInputsOf(projectedInteraction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n interactionId: String(interactionId),\n });\n const queries = options.projection?.q ?? createStateQueries(domainState);\n\n const shouldMaterializeInputDomains =\n decision.available || decision.code === FrameworkErrorCodes.NO_LEGAL_INPUT;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(projectedInteraction, domainState, playerId, {\n queries,\n }),\n scope.definition.contract.manifest,\n )\n : [];\n const baseDescriptor = {\n phaseName,\n interactionKey: `${phaseName}.${interactionId}`,\n interactionId,\n label: metadata.label,\n help: metadata.help,\n commit: metadata.commit,\n zoneId: collectFirstCardZoneId(projectedInteraction),\n zoneIds: collectCardZoneIds(projectedInteraction),\n inputs,\n ...(prefix\n ? {\n step: {\n index: prefix.values.length,\n total: interaction.steps!.entries.length,\n selected: prefix.selected,\n canCancel: !!saved,\n },\n }\n : {}),\n availability: interactionAvailabilityFromDecision(decision),\n reasons:\n options.includeDiagnosticReasons && !decision.available && decision.ruleId\n ? [{ ruleId: decision.ruleId, errorCode: decision.code }]\n : undefined,\n };\n return {\n ...baseDescriptor,\n kind: \"action\",\n } as Descriptor;\n}\n","import { schemaForCollectors } from \"../../client-param-schemas\";\nimport { evaluateStepPrefix } from \"./step-prefix\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewOfContract,\n} from \"../../model\";\nimport { FrameworkErrorCodes } from \"../../model\";\nimport {\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./collector-params\";\nimport {\n enumerateCollectorInputAssignments,\n hasAnyCollectorInputAssignment,\n} from \"./collector-input-solver\";\nimport { interactionDomainEligibleCount } from \"./interaction-domain-metadata\";\nimport { buildInteractionDescriptor } from \"./interaction-descriptor\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport {\n makeValidationError,\n type InteractionDecision,\n type InteractionActionabilityResult,\n type InteractionDiagnosticsMode,\n type InteractionExplanation,\n type InteractionDecisionResult,\n type InteractionInputEnumerationResult,\n type ResolveDecisionInput,\n type TrustedInteractionDescriptorShape,\n type TrustedInteractionId,\n} from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, View>\n>;\n\ntype InteractionRuleIssue = {\n ruleId: string;\n errorCode: string;\n message?: string;\n};\n\ntype RuleValidationIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction readStep(state: { phase?: unknown }): string | null {\n const phase = state.phase;\n if (!phase || typeof phase !== \"object\") return null;\n const step = (phase as { step?: unknown }).step;\n return typeof step === \"string\" ? step : null;\n}\n\nfunction explanationAvailability(\n decision: InteractionDecision,\n): InteractionExplanation[\"availability\"] {\n if (decision.available) return \"available\";\n switch (decision.code) {\n case FrameworkErrorCodes.NOT_YOUR_TURN:\n return \"notYourTurn\";\n case FrameworkErrorCodes.WRONG_PHASE:\n return \"wrongPhase\";\n case FrameworkErrorCodes.WRONG_STEP:\n return \"wrongStep\";\n default:\n return \"blocked\";\n }\n}\n\nexport function createInteractionDecisionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n authorization: AuthorizationFor<Contract, Definitions, View>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, View>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n View\n >;\n\n const contractErrors =\n (scope.definition.contract as { errors?: Record<string, string> }).errors ??\n {};\n\n function defaultMessageForCode(code: string): string | undefined {\n return contractErrors[code];\n }\n\n function issueFromRule(\n rule: InteractionRuleIssue,\n message?: string,\n ): InteractionRuleIssue {\n return {\n ruleId: rule.ruleId,\n errorCode: rule.errorCode,\n message: message ?? rule.message ?? defaultMessageForCode(rule.errorCode),\n };\n }\n\n function issueFromRuleValidationResult(\n rule: InteractionRuleIssue,\n result: boolean | string | RuleValidationIssue | null | undefined,\n ): InteractionRuleIssue | undefined {\n if (result === false) return issueFromRule(rule);\n if (typeof result === \"string\") return issueFromRule(rule, result);\n if (result && typeof result === \"object\") {\n return {\n ruleId: rule.ruleId,\n errorCode: result.errorCode,\n message:\n result.message ??\n rule.message ??\n defaultMessageForCode(result.errorCode),\n };\n }\n return undefined;\n }\n\n function acceptsSubmitAssignment(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n assignment: Readonly<Record<string, unknown>>;\n projection?: ProjectionContext<DomainState>;\n }): boolean {\n const decision = resolveInteractionDecision({\n state: input.state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.assignment,\n mode: \"submit\",\n candidateInvariantsValidated: true,\n projection: input.projection,\n });\n return decision.found && decision.validation.valid;\n }\n\n function resolveInteractionEligibility({\n state,\n playerId,\n interactionId,\n mode = \"descriptor\",\n candidateInvariantsValidated = false,\n projection,\n }: Omit<ResolveDecisionInput<Contract>, \"params\" | \"mode\"> & {\n mode?: ResolveDecisionInput<Contract>[\"mode\"];\n }) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction)\n return {\n found: false as const,\n validation: makeValidationError(\n \"unsupported-action\",\n `Unknown interaction '${interactionId}'.`,\n ),\n };\n const pending = state.runtime.pending[playerId];\n const pendingMatches =\n pending?.phaseName === phaseName &&\n pending.interactionId === interactionId;\n const phase = scope.phaseByName(phaseName);\n const isSimultaneousSubmit =\n isSimultaneousPhase(phase) &&\n interactionId === SIMULTANEOUS_SUBMIT_INTERACTION_ID;\n const alreadySubmitted =\n isSimultaneousSubmit &&\n state.runtime.simultaneous?.current?.phaseName === phaseName &&\n Boolean(state.runtime.simultaneous.current.submissions[playerId]);\n const canResubmit =\n isSimultaneousSubmit &&\n (phase as { canResubmit?: boolean }).canResubmit === true;\n\n const actorAuthorization = candidateInvariantsValidated\n ? ({ mode: \"active\" } as const)\n : authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = candidateInvariantsValidated\n ? true\n : authorization.isActorAuthorized(state, playerId, actorAuthorization);\n let visible = authorized;\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n let validation: ReducerValidationResult = { valid: true };\n const otherPending = pending !== undefined && !pendingMatches;\n if (otherPending) {\n visible = false;\n validation = makeValidationError(\n \"PENDING_INTERACTION\",\n \"Finish or cancel the pending interaction first.\",\n );\n }\n if (!authorized) {\n validation = makeValidationError(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${interactionId}').`,\n );\n } else if (alreadySubmitted && !canResubmit) {\n validation = makeValidationError(\n \"ALREADY_SUBMITTED\",\n `Interaction '${interactionId}' has already been submitted by '${playerId}'.`,\n );\n }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n !candidateInvariantsValidated &&\n interaction.rules\n ) {\n const availabilityArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n );\n for (const rule of interaction.rules) {\n if (!rule.available) continue;\n if (!rule.available(availabilityArgs)) {\n ruleAvailabilityIssue = issueFromRule({\n ruleId: rule.id,\n errorCode: rule.errorCode,\n message: rule.message,\n });\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n ruleAvailabilityIssue.errorCode,\n ruleAvailabilityIssue.message,\n );\n }\n break;\n }\n }\n }\n\n return {\n found: true as const,\n interaction,\n authorized,\n visible,\n validation,\n ruleAvailabilityIssue,\n otherPending,\n canEvaluateProjectionDetails,\n };\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n candidateInvariantsValidated = false,\n projection,\n }: ResolveDecisionInput<Contract>): InteractionDecisionResult<\n Contract,\n Definitions,\n View\n > {\n const phaseName = state.flow.currentPhase as PhaseName;\n let interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n found: false,\n validation: makeValidationError(\n \"unsupported-action\",\n `Interaction '${interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n ),\n };\n }\n const trustedInteractionId = interactionId as InteractionId;\n const originalInteraction = interaction;\n const pending = state.runtime.pending[playerId];\n const pendingMatches =\n pending?.phaseName === phaseName &&\n pending.interactionId === interactionId;\n const eligibility = resolveInteractionEligibility({\n state,\n playerId,\n interactionId,\n mode,\n candidateInvariantsValidated,\n projection,\n });\n if (!eligibility.found) return eligibility;\n const { authorized, visible, ruleAvailabilityIssue, otherPending } =\n eligibility;\n let validation = eligibility.validation;\n if (!validation.valid) {\n const code =\n \"errorCode\" in validation ? validation.errorCode : \"action-unavailable\";\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible,\n descriptor: buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available: false,\n code,\n message: validation.message ?? code,\n ...(ruleAvailabilityIssue\n ? { ruleId: ruleAvailabilityIssue.ruleId }\n : {}),\n },\n {\n projection,\n includeDiagnosticReasons: options.diagnostics === \"verbose\",\n },\n ),\n validation,\n };\n }\n const previousValues = pendingMatches ? pending.values : [];\n const submittedKey = interaction.steps?.entries[previousValues.length]?.key;\n const paramsRecord =\n params !== null && typeof params === \"object\" && !Array.isArray(params)\n ? params\n : {};\n const prefix = interaction.steps\n ? evaluateStepPrefix(\n interaction.steps,\n scope.toDomainState(state),\n playerId,\n mode === \"submit\"\n ? [...previousValues, paramsRecord[submittedKey ?? \"\"]]\n : previousValues,\n )\n : undefined;\n const submittedPrefix = mode === \"submit\" ? prefix : undefined;\n const stepComplete = submittedPrefix?.complete === true;\n const stepParamsValid =\n !prefix ||\n mode !== \"submit\" ||\n (!!submittedKey &&\n Object.keys(paramsRecord).length === 1 &&\n Object.prototype.hasOwnProperty.call(paramsRecord, submittedKey) &&\n prefix.values.length === previousValues.length + 1 &&\n !prefix.issue);\n if (prefix) {\n interaction = {\n ...interaction,\n steps: undefined,\n inputs: stepComplete\n ? submittedPrefix!.collectors\n : prefix.current\n ? { [prefix.current.key]: prefix.current.collector }\n : {},\n paramsSchema: stepComplete ? interaction.paramsSchema : undefined,\n };\n }\n\n const parseForSubmit = mode === \"submit\";\n const finalStepSchema =\n stepComplete && originalInteraction.paramsSchema\n ? originalInteraction.paramsSchema.safeParse(submittedPrefix!.selected)\n : undefined;\n const parsed = !stepParamsValid\n ? {\n ok: false as const,\n message: \"Submit exactly the current eligible step value.\",\n }\n : submittedPrefix\n ? finalStepSchema && !finalStepSchema.success\n ? {\n ok: false as const,\n message:\n \"Complete step parameters do not match the interaction schema.\",\n }\n : {\n ok: true as const,\n params: (finalStepSchema?.success\n ? finalStepSchema.data\n : submittedPrefix.selected) as Record<string, unknown>,\n }\n : parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n const descriptorDecision: InteractionDecision = {\n available: false,\n code: FrameworkErrorCodes.INVALID_PARAMS,\n message: parsed.message,\n };\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible: true,\n descriptor: buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n interaction,\n descriptorDecision,\n { projection },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n let authoredValidation:\n | {\n ruleId: string;\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (validation.valid && mode === \"submit\" && (!prefix || stepComplete)) {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n );\n }\n\n if (validation.valid && mode === \"submit\" && (!prefix || stepComplete)) {\n const validateArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: {\n playerId,\n params: parsed.params,\n },\n },\n projection,\n );\n for (const rule of interaction.rules ?? []) {\n if (!rule.validate) continue;\n authoredValidation = issueFromRuleValidationResult(\n {\n ruleId: rule.id,\n errorCode: rule.errorCode,\n message: rule.message,\n },\n rule.validate(validateArgs),\n );\n if (authoredValidation) break;\n }\n if (authoredValidation) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n authoredValidation.errorCode,\n authoredValidation.message,\n );\n }\n }\n }\n\n const candidateInvariantAvailable =\n authorized && !otherPending && !ruleAvailabilityIssue;\n const inputSatisfiability =\n candidateInvariantAvailable && mode !== \"submit\"\n ? hasAnyCollectorInputAssignment({\n interaction,\n domainState: projection?.domainState ?? scope.toDomainState(state),\n playerId,\n queries: projection?.q,\n initialValues: params,\n acceptsAssignment: () => true,\n })\n : undefined;\n const available =\n candidateInvariantAvailable &&\n (inputSatisfiability?.status === \"yes\" ||\n (inputSatisfiability?.status !== \"no\" && !authoredValidation));\n const descriptorDecision: InteractionDecision = available\n ? { available: true }\n : !authorized\n ? {\n available: false,\n code: FrameworkErrorCodes.NOT_YOUR_TURN,\n message: \"Not your turn\",\n }\n : ruleAvailabilityIssue\n ? {\n available: false,\n code: ruleAvailabilityIssue.errorCode,\n ruleId: ruleAvailabilityIssue.ruleId,\n message:\n ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode,\n }\n : authoredValidation\n ? {\n available: false,\n code: authoredValidation.errorCode,\n ruleId: authoredValidation.ruleId,\n message:\n authoredValidation.message ?? \"Interaction unavailable\",\n }\n : inputSatisfiability?.status === \"no\"\n ? {\n available: false,\n code: FrameworkErrorCodes.NO_LEGAL_INPUT,\n message: \"No legal input is currently available.\",\n }\n : {\n available: false,\n code: \"action-unavailable\",\n message: \"Interaction unavailable\",\n };\n const descriptor = buildInteractionDescriptor(\n scope,\n state,\n playerId,\n trustedInteractionId,\n originalInteraction,\n descriptorDecision,\n {\n projection,\n stepPrefix: mode === \"submit\" ? undefined : prefix,\n includeDiagnosticReasons: options.diagnostics === \"verbose\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n ...(submittedPrefix\n ? {\n stepResult: {\n values: submittedPrefix.values,\n complete: submittedPrefix.complete,\n },\n }\n : {}),\n visible,\n descriptor,\n inputSatisfiability,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: { projection?: ProjectionContext<DomainState> } = {},\n ) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const descriptors: Descriptor[] = [];\n for (const [interactionId] of scope.interactionEntriesForPhase(phaseName)) {\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection: options.projection,\n });\n if (!decision.found || !decision.visible) continue;\n descriptors.push(decision.descriptor);\n }\n return descriptors;\n }\n\n function resolveInteractionActionability(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n projection?: ProjectionContext<DomainState>;\n }): InteractionActionabilityResult {\n const decision = resolveInteractionDecision({\n ...input,\n params: {},\n mode: \"descriptor\",\n });\n if (!decision.found) return { found: false };\n if (!decision.visible) return { found: true, visible: false };\n return {\n found: true,\n visible: true,\n descriptor: decision.descriptor,\n inputSatisfiability: decision.inputSatisfiability,\n };\n }\n\n function currentClientParamSchema(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n }) {\n const decision = resolveInteractionDecision({\n ...input,\n mode: \"descriptor\",\n });\n if (!decision.found || !decision.visible || !decision.descriptor.step)\n return null;\n return schemaForCollectors(decision.interaction.inputs ?? {});\n }\n\n function enumerateInteractionParams(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n maxEvaluations: number;\n projection?: ProjectionContext<DomainState>;\n }): InteractionInputEnumerationResult {\n const decision = resolveInteractionDecision({\n state: input.state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: {},\n mode: \"descriptor\",\n projection: input.projection,\n });\n if (!decision.found) return { found: false };\n if (!decision.visible) return { found: true, visible: false };\n const enumeration =\n decision.descriptor.availability.status === \"available\"\n ? enumerateCollectorInputAssignments({\n interaction: decision.interaction,\n domainState:\n input.projection?.domainState ?? scope.toDomainState(input.state),\n playerId: input.playerId,\n queries: input.projection?.q,\n acceptsAssignment: (assignment) =>\n acceptsSubmitAssignment({\n state: input.state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n assignment,\n projection: input.projection,\n }),\n maxEvaluations: input.maxEvaluations,\n })\n : null;\n return {\n found: true,\n visible: true,\n descriptor: decision.descriptor,\n inputSatisfiability: decision.inputSatisfiability,\n enumeration,\n };\n }\n\n function explainInteraction(input: {\n state: State;\n playerId: PlayerId;\n interactionId: string;\n projection?: ProjectionContext<DomainState>;\n }): InteractionExplanation {\n const { state, playerId, interactionId, projection } = input;\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n interactionId,\n phase: String(state.flow.currentPhase),\n step: readStep(state),\n availability: \"blocked\",\n rules: [],\n actor: { required: [], playerIsActor: false },\n inputs: [],\n };\n }\n\n const actorAuthorization =\n authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = authorization.isActorAuthorized(\n state,\n playerId,\n actorAuthorization,\n );\n const required =\n actorAuthorization.mode === \"actors\"\n ? [...actorAuthorization.actors]\n : [...(state.flow.activePlayers as readonly string[])];\n\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection,\n });\n const descriptorDecision: InteractionDecision =\n decision.found && decision.descriptor.availability.status === \"available\"\n ? { available: true }\n : decision.found &&\n decision.descriptor.availability.status === \"notYourTurn\"\n ? {\n available: false,\n code: FrameworkErrorCodes.NOT_YOUR_TURN,\n message: decision.descriptor.availability.reason,\n }\n : decision.found &&\n decision.descriptor.availability.status === \"blocked\" &&\n decision.descriptor.availability.code\n ? {\n available: false,\n code: decision.descriptor.availability.code,\n message: decision.descriptor.availability.reason,\n }\n : {\n available: false,\n code: \"action-unavailable\",\n message: \"Interaction unavailable\",\n };\n\n const ruleOutcomes: Array<InteractionExplanation[\"rules\"][number]> = [];\n const canEvaluateRules = authorized;\n let sawFailure = false;\n const availabilityArgs = canEvaluateRules\n ? scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n )\n : null;\n for (const rule of interaction.rules ?? []) {\n if (sawFailure || !canEvaluateRules || !rule.available) {\n ruleOutcomes.push({\n ruleId: rule.id,\n outcome: \"notEvaluated\",\n errorCode: rule.errorCode,\n message: rule.message ?? defaultMessageForCode(rule.errorCode),\n });\n continue;\n }\n const passed = rule.available(availabilityArgs!);\n const issue = passed\n ? undefined\n : issueFromRule({\n ruleId: rule.id,\n errorCode: rule.errorCode,\n message: rule.message,\n });\n ruleOutcomes.push({\n ruleId: rule.id,\n outcome: passed ? \"passed\" : \"failed\",\n errorCode: passed ? undefined : issue?.errorCode,\n message: passed ? undefined : issue?.message,\n });\n if (!passed) sawFailure = true;\n }\n\n const domainDescriptor = buildInteractionDescriptor(\n scope,\n state,\n playerId,\n interactionId as InteractionId,\n interaction,\n { available: true },\n {\n projection,\n },\n );\n\n return {\n interactionId,\n phase: String(state.flow.currentPhase),\n step: readStep(state),\n availability: explanationAvailability(descriptorDecision),\n rules: ruleOutcomes,\n actor: { required, playerIsActor: authorized },\n inputs: domainDescriptor.inputs.map((entry) => ({\n key: entry.key,\n kind: entry.kind,\n eligibleCount: interactionDomainEligibleCount(entry.domain),\n })),\n };\n }\n\n return {\n currentClientParamSchema,\n enumerateInteractionParams,\n explainInteraction,\n resolveAvailableInteractionsFor,\n resolveInteractionActionability,\n resolveInteractionDecision,\n resolveInteractionEligibility,\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewOfContract,\n} from \"../../model\";\nimport {\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n} from \"./collector-introspection\";\nimport { parseInteractionParams } from \"./collector-params\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionDiagnosticsMode } from \"./interaction-types\";\n\nexport type { InteractionDescriptorShape } from \"./interaction-types\";\n\nexport function createInteractionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n options: { diagnostics?: InteractionDiagnosticsMode } = {},\n) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n authorization,\n options,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction.cancel\") {\n const pending = state.runtime.pending[input.playerId];\n return pending?.interactionId === input.interactionId\n ? { valid: true }\n : {\n valid: false,\n errorCode: \"NO_PENDING_INTERACTION\",\n message: \"There is no matching unsealed interaction to cancel.\",\n };\n }\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.playerId as PlayerId,\n interactionId: input.interactionId,\n params: (input.params ?? {}) as Record<string, unknown>,\n mode: \"submit\",\n });\n return decision.validation;\n }\n return { valid: true };\n }\n\n function validateOrReject(\n state: State,\n input: ReducerInput,\n ): ReducerReject | null {\n const validation = validateClientInput(state, input);\n if (validation.valid) {\n return null;\n }\n const invalidValidation = validation as Exclude<\n ReducerValidationResult,\n { valid: true }\n >;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n return {\n currentClientParamSchema: decisions.currentClientParamSchema,\n collectFirstCardZoneId,\n enumerateInteractionParams: decisions.enumerateInteractionParams,\n explainInteraction: decisions.explainInteraction,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n parseInteractionParams,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActionability: decisions.resolveInteractionActionability,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n resolveInteractionEligibility: decisions.resolveInteractionEligibility,\n validateClientInput,\n validateOrReject,\n };\n}\n","import type {\n RuntimeRngDraw,\n RuntimeRngOperation,\n RuntimeRngState,\n} from \"./model\";\n\n/**\n * Deterministic pseudo-random integer generator for reducer-native games.\n *\n * The public contract is `(rng.seed, rng.cursor) -> value`, with the cursor\n * advanced by one per call. Same `(seed, cursor)` tuple always produces the\n * same output, which is what makes session replay deterministic without\n * having to persist anything beyond the seed and cursor.\n *\n * Internally we hash `(seed, cursor)` through a Murmur3-style 32-bit\n * finalizer rather than computing a linear combination of the cursor. The\n * older `(seed * A + C + cursor) & 0x7fffffff` form was linear in `cursor`,\n * so consecutive samples differed by a fixed step — for a d6 that meant\n * every roll produced a simple `+1` counter through the faces. Mixing\n * `(seed, cursor)` with an avalanche finalizer is still pure and still\n * cheap, but now nearby cursors yield well-distributed outputs.\n *\n * Distribution note: the `% bound` step is biased when `bound` is not a\n * power of two. For gameplay-level bounds (≤ 64) the bias is negligible\n * and we leave it in to keep replay fixtures stable against future bound\n * changes. If a caller ever needs strict uniformity we can add an\n * explicit `nextUniformInt` without touching the existing consumers.\n */\nexport function nextRandomInt(\n bound: number,\n rng: RuntimeRngState,\n operation: RuntimeRngOperation = {\n kind: \"integer\",\n parameters: { minInclusive: 0, maxInclusive: bound - 1 },\n },\n): [number, RuntimeRngState, RuntimeRngDraw] {\n if (!Number.isSafeInteger(bound) || bound <= 0) {\n throw new Error(\"Random bound must be a positive safe integer.\");\n }\n const seed = rng.seed ?? 1;\n const raw = hashSeedCursor(seed, rng.cursor);\n const value = raw % bound;\n const draw: RuntimeRngDraw = {\n index: rng.draws.length,\n cursorBefore: rng.cursor,\n cursorAfter: rng.cursor + 1,\n operation: {\n kind: operation.kind,\n parameters: { ...operation.parameters },\n },\n };\n return [\n value,\n {\n ...rng,\n cursor: rng.cursor + 1,\n trace: [\n ...rng.trace,\n `cursor=${rng.cursor};bound=${bound};value=${value}`,\n ],\n draws: [...rng.draws, draw],\n },\n draw,\n ];\n}\n\n/**\n * Mix `(seed, cursor)` into a uniformly-distributed uint32 using a\n * Murmur3-style finalizer. The seed is split into its low and high 32-bit\n * halves so large 53-bit JS-integer seeds (including the negative seeds\n * the backend derives from its own 64-bit generator) don't collapse onto\n * the same bucket after a `| 0` truncation.\n */\nfunction hashSeedCursor(seed: number, cursor: number): number {\n const seedLo = seed | 0;\n // `Math.floor(seed / 2^32) | 0` keeps the upper bits of large seeds.\n // For small seeds this is 0 (or -1 for negatives), so the stir below is\n // still dominated by `seedLo` + `cursor` as you'd expect.\n const seedHi = Math.floor(seed / 0x1_0000_0000) | 0;\n let x = Math.imul(seedLo, 0x9e3779b1);\n x = (x + Math.imul(seedHi, 0x85ebca77)) | 0;\n x = (x + Math.imul(cursor | 0, 0xc2b2ae3d)) | 0;\n // Murmur3 32-bit finalizer.\n x = Math.imul(x ^ (x >>> 16), 0x85ebca6b);\n x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);\n x = x ^ (x >>> 16);\n return x >>> 0;\n}\n","import type {\n CollectorState,\n InputCollector,\n RuntimeRngState,\n SchemaLike,\n} from \"../../model\";\nimport type { RandomHelpers } from \"../../model/spec/runtime-args\";\nimport { nextRandomInt } from \"../../rng\";\n\nexport type RngConsumption = {\n operation: string;\n drawIndex: number;\n traceEntry: string;\n};\n\nexport type MutableRandomHelpers =\n import(\"../../transaction\").TransactionRandom & {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n consumptions: () => readonly RngConsumption[];\n };\n\nconst MAX_INTEGER_RANGE = 0x1_0000_0000;\n\nfunction assertIntegerRange(options: {\n minInclusive: number;\n maxInclusive: number;\n}): number {\n const { minInclusive, maxInclusive } = options;\n if (\n !Number.isSafeInteger(minInclusive) ||\n !Number.isSafeInteger(maxInclusive)\n ) {\n throw new Error(\"random.integer bounds must be safe integers.\");\n }\n if (minInclusive > maxInclusive) {\n throw new Error(\n \"random.integer minInclusive must be less than or equal to maxInclusive.\",\n );\n }\n const range = maxInclusive - minInclusive + 1;\n if (!Number.isSafeInteger(range) || range > MAX_INTEGER_RANGE) {\n throw new Error(\n `random.integer range must contain at most ${MAX_INTEGER_RANGE} values.`,\n );\n }\n return range;\n}\n\nfunction traceEntry(nextRng: RuntimeRngState): string {\n return nextRng.trace[nextRng.trace.length - 1] ?? \"\";\n}\n\nexport function sampleIntegerValue(\n options: { minInclusive: number; maxInclusive: number },\n rng: RuntimeRngState,\n operation = \"random.integer\",\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const range = assertIntegerRange(options);\n const [offset, nextRng, draw] = nextRandomInt(range, rng, {\n kind: \"integer\",\n parameters: {\n minInclusive: options.minInclusive,\n maxInclusive: options.maxInclusive,\n },\n });\n return {\n value: options.minInclusive + offset,\n nextRng,\n consumption: {\n operation,\n drawIndex: draw.index,\n traceEntry: traceEntry(nextRng),\n },\n };\n}\n\nexport function sampleDieValue(\n sides: number,\n rng: RuntimeRngState,\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const [offset, nextRng, draw] = nextRandomInt(sides, rng, {\n kind: \"integer\",\n parameters: { minInclusive: 1, maxInclusive: sides },\n });\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n drawIndex: draw.index,\n traceEntry: traceEntry(nextRng),\n },\n };\n}\n\nexport function shuffleWithRng<T>(\n values: readonly T[],\n rng: RuntimeRngState,\n operation:\n | \"shuffleSharedZone\"\n | \"shufflePlayerZone\"\n | \"randomSubset\" = \"shuffleSharedZone\",\n): {\n orderedValues: T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n const orderedValues = [...values];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (\n let lastIndex = orderedValues.length - 1;\n lastIndex > 0;\n lastIndex -= 1\n ) {\n const [swapIndex, updatedRng, draw] = nextRandomInt(\n lastIndex + 1,\n nextRng,\n {\n kind: \"integer\",\n parameters: { minInclusive: 0, maxInclusive: lastIndex },\n },\n );\n consumptions.push({\n operation,\n drawIndex: draw.index,\n traceEntry: traceEntry(updatedRng),\n });\n nextRng = updatedRng;\n const current = orderedValues[lastIndex];\n const swap = orderedValues[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `shuffleWithRng: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${orderedValues.length})`,\n );\n }\n orderedValues[lastIndex] = swap;\n orderedValues[swapIndex] = current;\n }\n return { orderedValues, nextRng, consumptions };\n}\n\nexport function subsetWithRng<T>(\n values: readonly T[],\n count: number,\n rng: RuntimeRngState,\n): {\n values: readonly T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\"random.subset count must be a non-negative integer.\");\n }\n if (count > values.length) {\n throw new Error(\n `random.subset count ${count} exceeds source length ${values.length}.`,\n );\n }\n const shuffled = shuffleWithRng(values, rng, \"randomSubset\");\n return {\n values: shuffled.orderedValues.slice(0, count),\n nextRng: shuffled.nextRng,\n consumptions: shuffled.consumptions,\n };\n}\n\nexport function createMutableRandomHelpers(\n rng: RuntimeRngState,\n): MutableRandomHelpers {\n let current = rng;\n const recordedConsumptions: RngConsumption[] = [];\n return {\n random: {\n integer(options) {\n const sampled = sampleIntegerValue(options, current);\n current = sampled.nextRng;\n recordedConsumptions.push(sampled.consumption);\n return sampled.value;\n },\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n recordedConsumptions.push(...sampled.consumptions);\n return sampled.values;\n },\n },\n roll(sides) {\n const sampled = sampleDieValue(sides, current);\n current = sampled.nextRng;\n recordedConsumptions.push(sampled.consumption);\n return sampled.value;\n },\n shuffle(values, operation) {\n const sampled = shuffleWithRng(values, current, operation);\n current = sampled.nextRng;\n recordedConsumptions.push(...sampled.consumptions);\n return sampled.orderedValues;\n },\n currentRng: () => current,\n consumptions: () => [...recordedConsumptions],\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): {\n value: unknown;\n nextRng: RuntimeRngState;\n consumptions: readonly RngConsumption[];\n} {\n const meta = collector.meta;\n switch (meta.rng) {\n case \"d6\": {\n const count = meta.count > 0 ? meta.count : 1;\n const values: number[] = [];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (let i = 0; i < count; i += 1) {\n const sampled = sampleDieValue(6, nextRng);\n values.push(sampled.value);\n nextRng = sampled.nextRng;\n consumptions.push({\n operation: \"rngInput.d6\",\n drawIndex: sampled.consumption.drawIndex,\n traceEntry: sampled.consumption.traceEntry,\n });\n }\n return { value: { values }, nextRng, consumptions };\n }\n case \"coin\": {\n const [offset, nextRng, draw] = nextRandomInt(2, rng, {\n kind: \"integer\",\n parameters: { minInclusive: 0, maxInclusive: 1 },\n });\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n consumptions: [\n {\n operation: \"rngInput.coin\",\n drawIndex: draw.index,\n traceEntry: traceEntry(nextRng),\n },\n ],\n };\n }\n default: {\n const _exhaustive: never = meta;\n throw new Error(\n `Unknown rngInput kind '${String(_exhaustive)}'. Register a sampler in trusted rng-sampler.`,\n );\n }\n }\n}\n","import { implicitResultOf } from \"./trusted-runtime-args\";\nimport { safeParseOrThrow } from \"../../parse-utils\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n GameEvent,\n GameOutcome,\n PhaseMapOf,\n ReducerGameContractLike,\n OptionsOfContract,\n ViewOfContract,\n} from \"../../model\";\n\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers, type RngConsumption } from \"./rng-sampler\";\nimport type {\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, View>) {\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInitialPhase(): PhaseName {\n const resolvedPhase = (scope.defaultInitialPhase ??\n scope.phaseEntries[0]?.[0]) as PhaseName | undefined;\n if (!resolvedPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n if (!scope.definition.phases[resolvedPhase]) {\n throw new Error(`Unknown initial phase '${resolvedPhase}'.`);\n }\n return resolvedPhase;\n }\n\n function initPhaseState(\n state: State,\n phaseName: PhaseName,\n playerIds: PlayerId[],\n ): State {\n const phase = scope.phaseByName(phaseName);\n const phaseState = phase.initialState\n ? phase.initialState({\n manifest: scope.definition.contract.manifest,\n state,\n playerIds,\n options: state.runtime.options,\n })\n : safeParseOrThrow(phase.state, {}, `phase:${phaseName}:initialState`);\n return {\n ...state,\n phase: safeParseOrThrow(\n phase.state,\n phaseState,\n `phase:${phaseName}`,\n ) as State[\"phase\"],\n };\n }\n\n function enterPhase({\n state,\n phaseName,\n playerIds,\n event,\n }: {\n state: State;\n phaseName: PhaseName;\n playerIds: PlayerId[];\n event: \"initialize\" | \"transition\";\n }): {\n state: State;\n transition?: PhaseName;\n consumptions: RngConsumption[];\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n } {\n const enteringState = {\n ...state,\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n pending: {},\n simultaneous: { current: null },\n lastTransition:\n event === \"initialize\"\n ? null\n : {\n from: state.flow.currentPhase,\n to: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n },\n } as State;\n const workingState = initPhaseState(enteringState, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n let transition: PhaseName | undefined;\n const consumptions: RngConsumption[] = [];\n let terminal: GameOutcome<PlayerId> | undefined;\n const events: GameEvent[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const enterArgs = scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random },\n );\n const entered = normalizeResult(phase.enter(enterArgs), () =>\n implicitResultOf(enterArgs),\n );\n if (entered.type === \"reject\") {\n throw new Error(\n entered.message ??\n (event === \"initialize\"\n ? `Reducer phase '${phaseName}' rejected during initialization.`\n : `Reducer phase '${phaseName}' rejected during phase initialization.`),\n );\n }\n nextState = {\n ...entered.state,\n runtime: { ...workingState.runtime, rng: random.currentRng() },\n } as State;\n terminal ??= entered.terminal;\n events.push(...(entered.events ?? []));\n consumptions.push(...random.consumptions());\n transition = entered.transition as PhaseName | undefined;\n }\n\n return {\n state: nextState,\n transition,\n consumptions,\n ...(terminal ? { terminal } : {}),\n events,\n };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n transition?: PhaseName;\n consumptions: RngConsumption[];\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder as PlayerId[],\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n options,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n options: OptionsOfContract<Contract>;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.definition.contract.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n const initialPhase = resolveInitialPhase();\n const initialQueries = createStateQueries({ table: parsedTable });\n return {\n initialPhase,\n state: {\n table: parsedTable,\n publicState: safeParseOrThrow(\n scope.definition.contract.state.public,\n scope.definition.initial?.public?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n options,\n q: initialQueries,\n }) ?? {},\n \"publicState\",\n ) as State[\"publicState\"],\n privateState: Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n scope.definition.contract.state.private,\n scope.definition.initial?.private?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n options,\n q: initialQueries,\n }) ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"privateState\"],\n hiddenState: safeParseOrThrow(\n scope.definition.contract.state.hidden,\n scope.definition.initial?.hidden?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n options,\n q: initialQueries,\n }) ?? {},\n \"hiddenState\",\n ) as State[\"hiddenState\"],\n flow: {\n currentPhase: initialPhase as State[\"flow\"][\"currentPhase\"],\n turn: 0,\n round: 0,\n activePlayers: [],\n },\n phase: {} as State[\"phase\"],\n runtime: {\n events: [],\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n draws: [],\n },\n options,\n pending: {},\n simultaneous: { current: null },\n lastTransition: null,\n } as State[\"runtime\"],\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.definition.contract.manifest;\n const defaultZones = manifest.defaults.zones(playerIds);\n const tableZones = table.zones ?? {};\n const tableResources = table.resources;\n return {\n ...table,\n playerOrder:\n table.playerOrder && table.playerOrder.length > 0\n ? table.playerOrder\n : playerIds,\n zones: {\n ...defaultZones,\n ...tableZones,\n shared: {\n ...(defaultZones.shared ?? {}),\n ...(tableZones.shared ?? {}),\n },\n perPlayer: {\n ...(defaultZones.perPlayer ?? {}),\n ...(tableZones.perPlayer ?? {}),\n },\n visibility: {\n ...(defaultZones.visibility ?? {}),\n ...(tableZones.visibility ?? {}),\n },\n cardSetIdsByZoneId: {\n ...(defaultZones.cardSetIdsByZoneId ?? {}),\n ...(tableZones.cardSetIdsByZoneId ?? {}),\n },\n },\n decks: {\n ...manifest.defaults.decks(playerIds),\n ...table.decks,\n },\n hands: {\n ...manifest.defaults.hands(playerIds),\n ...table.hands,\n },\n handVisibility: {\n ...manifest.defaults.handVisibility(playerIds),\n ...table.handVisibility,\n },\n ownerOfCard: {\n ...manifest.defaults.ownerOfCard(playerIds),\n ...table.ownerOfCard,\n },\n visibility: {\n ...manifest.defaults.visibility(playerIds),\n ...table.visibility,\n },\n resources:\n Object.keys(tableResources).length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n } as State[\"table\"];\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n options: OptionsOfContract<Contract>;\n },\n complete: (\n result: ReturnType<typeof enterPhase>,\n entries: number,\n ) => {\n state: State;\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n },\n ): {\n state: SessionState;\n terminal?: GameOutcome<PlayerId>;\n events: GameEvent[];\n } {\n const initial = createInitialState(input);\n const entered = enterPhase({\n state: initial.state,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n const drained = complete(entered, 1);\n const terminal = entered.terminal ?? drained.terminal;\n return {\n state: scope.toSessionState(drained.state),\n ...(terminal ? { terminal } : {}),\n events: drained.events,\n };\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n };\n}\n","import { normalizeGameEvents } from \"./trusted-runtime-result\";\nimport { evaluateStepPrefix } from \"./step-prefix\";\nimport { implicitResultOf } from \"./trusted-runtime-args\";\nimport type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimePayload } from \"../../model\";\nimport type {\n GameEvent,\n GameOutcome,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewOfContract,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n simultaneousSubmitInteraction,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport {\n normalizeResult,\n rejectResult,\n type TrustedDomainState,\n type TrustedInput,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, View>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, View>>;\n\nexport function createReducerExecutor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n interactions: InteractionResolverFor<Contract, Definitions, View>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, View>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n type RuntimeRngResult = {\n runtimeRng?: RuntimeRngState;\n rngConsumptions?: readonly RngConsumption[];\n };\n\n function rngTrace(\n consumptions: readonly RngConsumption[],\n ): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n version: 2 as const,\n operation: consumption.operation,\n drawIndex: consumption.drawIndex,\n traceEntry: consumption.traceEntry,\n }));\n }\n\n function reduceInternal(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) {\n return rejectResult(\n \"unsupported-action\",\n `Interaction '${input.interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n );\n }\n const params = input.params as Record<string, unknown>;\n const random = createMutableRandomHelpers(state.runtime.rng);\n const reduceArgs = scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params,\n },\n },\n { random },\n );\n const result = normalizeResult(\n interaction.reduce(reduceArgs) as ReducerResult<DomainState>,\n () => implicitResultOf(reduceArgs),\n );\n return result.type === \"accept\"\n ? {\n ...result,\n runtimeRng: random.currentRng(),\n rngConsumptions: random.consumptions(),\n }\n : result;\n }\n\n function preSampleRngForAction(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ): {\n state: State;\n input: Extract<ReducerInput, { kind: \"interaction\" }>;\n error?: string;\n consumptions: readonly {\n operation: string;\n drawIndex: number;\n traceEntry: string;\n }[];\n } {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) return { state, input, consumptions: [] };\n const collectors = (interaction.inputs ?? {}) as Record<\n string,\n InputCollector\n >;\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n const consumptions: RngConsumption[] = [];\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const {\n value,\n nextRng: advanced,\n consumptions: collectorConsumptions,\n } = sampleRngCollectorValue(collector, nextRng);\n const parsed = collector.schema.safeParse(value);\n if (!parsed.success) {\n return {\n state,\n input,\n consumptions: [],\n error: parsed.error.issues\n .map((issue) => `params.${key}: ${issue.message}`)\n .join(\"; \"),\n };\n }\n sampled[key] = parsed.data;\n nextRng = advanced;\n consumptions.push(...collectorConsumptions);\n anySampled = true;\n }\n if (!anySampled) return { state, input, consumptions: [] };\n const mergedParams: Record<string, unknown> = {\n ...((input.params ?? {}) as Record<string, unknown>),\n ...sampled,\n };\n return {\n state: {\n ...state,\n runtime: { ...state.runtime, rng: nextRng },\n } as State,\n input: { ...input, params: mergedParams } as Extract<\n ReducerInput,\n { kind: \"interaction\" }\n >,\n consumptions,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n } as State;\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ):\n | (ReducerResult<State> & {\n trace?: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n })\n | null {\n if (input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) {\n return null;\n }\n\n const submit = simultaneousSubmitInteraction(scope.phaseByName(phaseName));\n if (!submit) {\n return rejectResult(\n \"missing-submit-interaction\",\n `Simultaneous phase '${phaseName}' does not declare submit.`,\n );\n }\n const resolve = (phase as { resolve?: unknown }).resolve;\n if (typeof resolve !== \"function\") {\n return rejectResult(\n \"missing-simultaneous-resolve\",\n `Simultaneous phase '${phaseName}' does not declare resolve.`,\n );\n }\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId as PlayerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const params = input.params;\n\n const current =\n state.runtime.simultaneous?.current?.phaseName === phaseName\n ? state.runtime.simultaneous.current\n : {\n phaseName,\n actors,\n submissions: {},\n };\n const existing = current.submissions[input.playerId as PlayerId];\n const canResubmit =\n (phase as { canResubmit?: boolean }).canResubmit === true;\n if (existing && !canResubmit) {\n return rejectResult(\n \"ALREADY_SUBMITTED\",\n `Interaction '${input.interactionId}' has already been submitted by '${input.playerId}'.`,\n );\n }\n\n const submissions: Record<\n string,\n { interactionId: string; params: RuntimePayload }\n > = {\n ...current.submissions,\n [input.playerId]: {\n interactionId: input.interactionId,\n params,\n },\n };\n const stateWithSubmission = {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: {\n current: {\n phaseName,\n actors,\n submissions,\n },\n },\n },\n } as State;\n const waitingPlayerIds = actors.filter((actor) => !submissions[actor]);\n if (waitingPlayerIds.length > 0) {\n return {\n type: \"accept\",\n state: stateWithSubmission,\n };\n }\n\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n );\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolveArgs = scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random },\n );\n const resolved = normalizeResult(\n resolve(resolveArgs) as ReducerResult<DomainState>,\n () => implicitResultOf(resolveArgs),\n );\n if (resolved.type === \"reject\") {\n return resolved;\n }\n return {\n type: \"accept\",\n state: clearSimultaneousCurrent({\n ...resolved.state,\n runtime: { ...stateWithSubmission.runtime, rng: random.currentRng() },\n } as State),\n ...(resolved.transition ? { transition: resolved.transition } : {}),\n ...(resolved.terminal ? { terminal: resolved.terminal } : {}),\n events: resolved.events ?? [],\n trace: rngTrace(random.consumptions()),\n };\n }\n\n function reduceOnce(\n state: State,\n input: Extract<ReducerInput, { kind: \"interaction\" }>,\n ) {\n const sampled = preSampleRngForAction(state, input);\n if (sampled.error)\n return rejectResult(\"invalid-action-params\", sampled.error);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult.type === \"reject\"\n ? simultaneousResult\n : {\n ...simultaneousResult,\n trace: [\n ...rngTrace(sampled.consumptions),\n ...(simultaneousResult.trace ?? []),\n ],\n };\n }\n const result = reduceInternal(sampled.state, sampled.input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: {\n ...result.state,\n runtime: {\n ...sampled.state.runtime,\n rng: result.runtimeRng ?? sampled.state.runtime.rng,\n },\n } as State,\n ...(result.transition ? { transition: result.transition } : {}),\n ...(result.terminal ? { terminal: result.terminal } : {}),\n events: result.events ?? [],\n trace: rngTrace([\n ...sampled.consumptions,\n ...(result.rngConsumptions ?? []),\n ]),\n };\n }\n\n function reconcilePending(state: State): State {\n const pending = { ...state.runtime.pending };\n for (const [seat, choice] of Object.entries(state.runtime.pending)) {\n const playerId = seat as PlayerId;\n const saved = choice as NonNullable<\n State[\"runtime\"][\"pending\"][PlayerId]\n >;\n const interaction = scope.findInteractionInPhase(\n state.flow.currentPhase as PhaseName,\n saved.interactionId,\n );\n const eligibility = interactions.resolveInteractionEligibility({\n state,\n playerId,\n interactionId: saved.interactionId,\n });\n if (\n saved.phaseName !== state.flow.currentPhase ||\n !interaction?.steps ||\n !eligibility.found ||\n !eligibility.validation.valid\n ) {\n delete pending[playerId];\n continue;\n }\n const prefix = evaluateStepPrefix(\n interaction.steps,\n scope.toDomainState(state),\n playerId,\n saved.values,\n );\n if (prefix.values.length === 0) delete pending[playerId];\n else\n pending[playerId] = {\n ...saved,\n values: prefix.values as RuntimePayload[],\n };\n }\n return { ...state, runtime: { ...state.runtime, pending } };\n }\n\n const MAX_PHASE_ENTRIES = 1_000;\n\n type Accepted = {\n state: State;\n transition?: PhaseName;\n terminal?: GameOutcome<PlayerId>;\n events?: readonly GameEvent[];\n trace?: readonly DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n };\n\n function complete(initial: Accepted, entries = 0) {\n let state = initial.state;\n let transition = initial.transition;\n let terminal = initial.terminal;\n const events = [...(initial.events ?? [])];\n const trace = [...(initial.trace ?? [])];\n while (transition !== undefined) {\n if (entries >= MAX_PHASE_ENTRIES) {\n throw new Error(\n `Reducer exceeded ${MAX_PHASE_ENTRIES} phase entries in one dispatch.`,\n );\n }\n entries += 1;\n const finalEntry = terminal !== undefined;\n const from = state.flow.currentPhase;\n const entered = lifecycle.initializePhaseResult(state, transition);\n trace.push({\n type: \"phaseEntered\",\n from,\n to: entered.state.flow.currentPhase,\n });\n trace.push(...rngTrace(entered.consumptions));\n state = entered.state;\n events.push(...entered.events);\n terminal ??= entered.terminal;\n if (finalEntry && entered.transition !== undefined) {\n throw new Error(\n \"A terminal phase entry cannot request another transition.\",\n );\n }\n transition = entered.transition as PhaseName | undefined;\n }\n const committedEvents = normalizeGameEvents(events);\n return {\n type: \"accept\" as const,\n state: reconcilePending({\n ...state,\n runtime: { ...state.runtime, events: committedEvents },\n }),\n events: committedEvents,\n trace,\n ...(terminal ? { terminal } : {}),\n };\n }\n\n function dispatch(state: State, input: ReducerInput) {\n const pending = { ...state.runtime.pending };\n if (input.kind === \"interaction.cancel\") {\n const rejected = interactions.validateOrReject(state, input);\n if (rejected) return rejected;\n delete pending[input.playerId];\n return complete({\n state: { ...state, runtime: { ...state.runtime, pending } },\n trace: [{ type: \"acceptedClientInput\", input }],\n });\n }\n const decision = interactions.resolveInteractionDecision({\n state,\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params as Record<string, unknown>,\n mode: \"submit\",\n });\n if (!decision.validation.valid)\n return rejectResult(\n decision.validation.errorCode,\n decision.validation.message,\n );\n if (!decision.found) return rejectResult(\"unsupported-action\");\n let workingState = state;\n const workingInput = {\n ...input,\n params: decision.parsedParams as RuntimePayload,\n };\n if (decision.stepResult) {\n if (!decision.stepResult.complete) {\n pending[input.playerId] = {\n phaseName: state.flow.currentPhase,\n interactionId: input.interactionId,\n values: decision.stepResult.values as RuntimePayload[],\n };\n return complete({\n state: { ...state, runtime: { ...state.runtime, pending } },\n trace: [{ type: \"acceptedClientInput\", input }],\n });\n }\n delete pending[input.playerId];\n workingState = { ...state, runtime: { ...state.runtime, pending } };\n }\n const result = reduceOnce(workingState, workingInput);\n if (result.type === \"reject\") return result;\n return complete({\n ...result,\n transition: result.transition as PhaseName | undefined,\n trace: [{ type: \"acceptedClientInput\", input }, ...(result.trace ?? [])],\n });\n }\n\n return { dispatch, complete };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport type { TrustedRuntimeScope } from \"./runtime-scope\";\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n .join(\",\")}}`;\n}\n\nfunction hashProjection(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\nfunction readManifestVersion(manifest: unknown): string {\n const m = manifest as { version?: unknown; literals?: unknown };\n if (typeof m.version === \"string\" && m.version.length > 0) {\n return m.version;\n }\n if (m.literals && typeof m.literals === \"object\") {\n return hashProjection(stableStringify(m.literals));\n }\n return \"0\";\n}\n\nexport function createStaticProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, View>) {\n return {\n boardStatic(): {\n view: unknown;\n hash: string;\n manifestVersion: string;\n } | null {\n const manifest = scope.definition.contract.manifest;\n const view = {\n boards: manifest.staticBoards ?? { byId: {}, hex: {}, square: {} },\n };\n const serialized = stableStringify(view);\n return {\n view: JSON.parse(serialized) as unknown,\n hash: hashProjection(serialized),\n manifestVersion: readManifestVersion(manifest),\n };\n },\n };\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type { RuntimeTableRecord, TableQueriesOfState } from \"../../model\";\n\nexport type ProjectionContext<State extends { table: RuntimeTableRecord }> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n>(options: { domainState: State }): ProjectionContext<State> {\n const q = createStateQueries(options.domainState);\n return {\n domainState: options.domainState,\n q,\n };\n}\n","import type { RuntimeJson } from \"../../../shared/runtime-json\";\nimport {\n canonicalizePluginRuntimeJson as toCanonicalJson,\n encodeCanonicalPluginRuntimeJson as canonicalJson,\n digestPluginRuntimeJson as hashJson,\n} from \"../../../shared/protocol/json\";\nimport type * as Wire from \"../../../shared/runtime-types\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewOfContract,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\nimport {\n createProjectionContext,\n type ProjectionContext,\n} from \"./projection-context\";\nimport { collectCardZoneIds } from \"./collector-introspection\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype ProjectionMode = \"full\" | \"actionsOnly\";\ntype ProjectionTimingMetadata = {\n resolveAvailableInteractionsMs: number;\n resolveViewMs: number;\n resolveZoneHandlesMs: number;\n descriptorHashMs: number;\n};\ntype DescriptorRegistry = {\n add(descriptor: InteractionDescriptorShape, actorSeat: number): string;\n entries(): Record<string, InteractionDescriptorShape>;\n};\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, View>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, View>,\n interactions: InteractionResolverFor<Contract, Definitions, View>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, View>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function createDescriptorRegistry(\n timing: ProjectionTimingMetadata,\n ): DescriptorRegistry {\n const byRef: Record<string, InteractionDescriptorShape> = {};\n const byHash = new Map<string, string>();\n return {\n add(descriptor, actorSeat) {\n return measureProjectionTiming(timing, \"descriptorHashMs\", () => {\n const enriched = descriptorWithBrowserReplayDigests(\n descriptor,\n actorSeat,\n );\n const fingerprint = canonicalJson(enriched);\n const existing = byHash.get(fingerprint);\n if (existing) return existing;\n const base =\n typeof enriched.interactionId === \"string\" &&\n enriched.interactionId.length > 0\n ? enriched.interactionId\n : \"interaction\";\n const ref = `${base}:${fnv1a64(fingerprint)}`;\n byHash.set(fingerprint, ref);\n byRef[ref] = enriched;\n return ref;\n });\n },\n entries() {\n return byRef;\n },\n };\n }\n\n function resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n actorSeat: number,\n projection: ProjectionContext<DomainState>,\n registry: DescriptorRegistry,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const zoneIds = new Set<string>(\n scope.definition.contract.manifest.literals.playerZoneIds.map(String),\n );\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n for (const zoneId of collectCardZoneIds(interaction)) {\n zoneIds.add(String(zoneId));\n }\n }\n const zones = [...zoneIds];\n if (zones.length === 0) return {};\n const q = projection.q;\n const result: Record<\n string,\n {\n cardIds: string[];\n cardViewsById: Record<string, string>;\n playableByCardId: Record<string, string[]>;\n }\n > = {};\n for (const zoneId of zones) {\n const visibility =\n combinedState.table.zones.visibility[zoneId] ??\n combinedState.table.handVisibility[zoneId];\n if (visibility === \"hidden\") continue;\n const table = combinedState.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n const isPlayerZone =\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {});\n const cardIds = Array.from(\n isPlayerZone\n ? (q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly string[])\n : (q.zone.sharedCards(zoneId as never) as readonly string[]),\n ).filter((cardId) => {\n const visibility = q.card.visibility(cardId as never);\n return (\n !visibility ||\n visibility.faceUp ||\n visibility.visibleTo?.includes(playerId)\n );\n });\n const cardInteractionIds = scope\n .interactionEntriesForPhase(phaseName)\n .filter(([, interaction]) =>\n collectCardZoneIds(interaction).map(String).includes(zoneId),\n )\n .map(([interactionId]) => interactionId);\n const cardViewsById: Record<string, string> = {};\n const playableByCardId: Record<string, string[]> = {};\n for (const cardId of cardIds) {\n cardViewsById[cardId] = JSON.stringify(q.card.get(cardId as never));\n const perCard: string[] = [];\n for (const interactionId of cardInteractionIds) {\n const interaction = scope.findInteractionInPhase(\n phaseName,\n interactionId,\n );\n if (!interaction) continue;\n const cardKey = interactions.findCardInputKeyForZone(\n interaction,\n zoneId,\n );\n const params = cardKey ? { [cardKey]: cardId } : {};\n const decision = interactions.resolveInteractionDecision({\n state: combinedState,\n playerId,\n interactionId,\n params,\n mode: \"card\",\n projection,\n });\n if (!decision.found || !decision.visible) continue;\n const cardDomain = cardKey\n ? decision.descriptor.inputs.find((input) => input.key === cardKey)\n ?.domain\n : undefined;\n const cardTargets =\n cardDomain?.type === \"cardTarget\" &&\n cardDomain.projection === \"resolved\"\n ? cardDomain.eligibleTargets\n : undefined;\n if (cardKey && !cardTargets?.includes(cardId)) {\n continue;\n }\n perCard.push(\n registry.add(\n {\n ...decision.descriptor,\n zoneId,\n },\n actorSeat,\n ),\n );\n }\n playableByCardId[cardId] = perCard;\n }\n result[zoneId] = {\n cardIds,\n cardViewsById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveSchedulerFlowFor(\n state: SessionState,\n projection?: ProjectionContext<DomainState>,\n ): Wire.SchedulerFlowAuthorityProjection {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (phase.kind === \"auto\") {\n return emptySchedulerFlow();\n }\n\n if (isSimultaneousPhase(phase)) {\n const current = state.runtime.simultaneous?.current;\n const actors = orderKnownPlayerIds(\n combinedState,\n current?.phaseName === phaseName\n ? current.actors.map(String)\n : resolveSimultaneousActors(\n scope,\n combinedState,\n phase,\n projection,\n ).map(String),\n );\n const submissions =\n current?.phaseName === phaseName ? current.submissions : {};\n const sealedPlayerIds = actors.filter(\n (playerId) =>\n submissions[playerId as keyof typeof submissions] !== undefined,\n );\n const pendingPlayerIds = actors.filter(\n (playerId) =>\n submissions[playerId as keyof typeof submissions] === undefined,\n );\n const activePlayerIds =\n (phase as { canResubmit?: boolean }).canResubmit === true\n ? actors\n : pendingPlayerIds;\n return {\n version: 1,\n activePlayerIds,\n pendingPlayerIds,\n continuationDependencies: sealedPlayerIds.flatMap((waiterPlayerId) => {\n const blockerPlayerIds = pendingPlayerIds.filter(\n (playerId) => playerId !== waiterPlayerId,\n );\n return blockerPlayerIds.length > 0\n ? [{ waiterPlayerId, blockerPlayerIds }]\n : [];\n }),\n };\n }\n\n const activePlayerIds = new Set<string>();\n const pendingPlayerIds = new Set<string>();\n let sawScheduledInteraction = false;\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n sawScheduledInteraction = true;\n const actorAuthorization =\n interactions.resolveInteractionActorAuthorization(\n combinedState,\n interaction,\n projection,\n );\n if (actorAuthorization.mode === \"actors\") {\n for (const playerId of actorAuthorization.actors) {\n activePlayerIds.add(String(playerId));\n if (interaction.actor) {\n pendingPlayerIds.add(String(playerId));\n }\n }\n continue;\n }\n const active = combinedState.flow.activePlayers as readonly string[];\n for (const playerId of active.length > 0\n ? active\n : (combinedState.table.playerOrder as readonly string[])) {\n activePlayerIds.add(String(playerId));\n }\n }\n\n if (!sawScheduledInteraction) {\n for (const playerId of combinedState.flow\n .activePlayers as readonly string[]) {\n activePlayerIds.add(String(playerId));\n }\n }\n\n const orderedActivePlayerIds = orderKnownPlayerIds(\n combinedState,\n activePlayerIds,\n );\n const orderedPendingPlayerIds = orderKnownPlayerIds(\n combinedState,\n pendingPlayerIds,\n );\n const continuationDependencies = orderKnownPlayerIds(\n combinedState,\n combinedState.flow.activePlayers as readonly string[],\n ).flatMap((waiterPlayerId) => {\n const blockerPlayerIds = orderedPendingPlayerIds.filter(\n (playerId) => playerId !== waiterPlayerId,\n );\n return blockerPlayerIds.length > 0\n ? [{ waiterPlayerId, blockerPlayerIds }]\n : [];\n });\n return {\n version: 1,\n activePlayerIds: orderedActivePlayerIds,\n pendingPlayerIds: orderedPendingPlayerIds,\n continuationDependencies,\n };\n }\n\n function emptySchedulerFlow(): Wire.SchedulerFlowAuthorityProjection {\n return {\n version: 1,\n activePlayerIds: [],\n pendingPlayerIds: [],\n continuationDependencies: [],\n };\n }\n\n function orderKnownPlayerIds(\n state: State,\n playerIds: Iterable<string>,\n ): string[] {\n const selected = new Set([...playerIds].map(String));\n return (state.table.playerOrder as readonly string[])\n .map(String)\n .filter((playerId) => selected.has(playerId));\n }\n\n function resolveSimultaneousPhaseFor(state: SessionState) {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) return null;\n const current = state.runtime.simultaneous?.current;\n if (!current || current.phaseName !== phaseName) return null;\n const submit = simultaneousSubmitInteraction(phase);\n if (!submit) return null;\n const actorIds = current.actors.map(String);\n const sealedPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] !== undefined,\n );\n const pendingPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] === undefined,\n );\n return {\n phaseName: String(current.phaseName),\n interactionId: SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n actorIds,\n sealedPlayerIds,\n pendingPlayerIds,\n };\n }\n\n /** Every player's public balances plus the seat's own owner-only ones. */\n function resolveResourcesFor(\n combinedState: State,\n playerId: PlayerId,\n ): Record<string, Record<string, number>> {\n const ownerOnly = new Set<string>(\n scope.definition.contract.manifest.literals.ownerResourceIds ?? [],\n );\n const balances = combinedState.table.resources as Record<\n string,\n Record<string, number>\n >;\n return Object.fromEntries(\n Object.entries(balances).map(([holder, resources]) => [\n holder,\n holder === playerId\n ? { ...resources }\n : Object.fromEntries(\n Object.entries(resources).filter(([id]) => !ownerOnly.has(id)),\n ),\n ]),\n );\n }\n\n function resolvePlayerViewFor(\n combinedState: State,\n playerId: PlayerId,\n projection: ProjectionContext<DomainState>,\n ): unknown {\n const view = scope.definition.view;\n const viewArgs = {\n ...scope.buildContext(combinedState),\n q: projection.q,\n state: projection.domainState,\n playerId,\n } as unknown as Parameters<typeof view>[0];\n return view(viewArgs);\n }\n\n function project({\n state,\n playerIds,\n projectionMode = \"full\",\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n projectionMode?: ProjectionMode;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n domainState: scope.toDomainState(combinedState),\n });\n const timing = createProjectionTimingMetadata();\n const registry = createDescriptorRegistry(timing);\n type SeatProjection = {\n view?: ReturnType<typeof resolvePlayerViewFor>;\n availableInteractionRefs: string[];\n zones?: ReturnType<typeof resolveZoneHandlesFor>;\n resources?: ReturnType<typeof resolveResourcesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n for (const [actorSeat, playerId] of playerIds.entries()) {\n const availableInteractions = measureProjectionTiming(\n timing,\n \"resolveAvailableInteractionsMs\",\n () =>\n interactions.resolveAvailableInteractionsFor(\n combinedState,\n playerId,\n {\n projection,\n },\n ),\n );\n const availableInteractionRefs = availableInteractions.map((descriptor) =>\n registry.add(descriptor, actorSeat),\n );\n const fullProjection =\n projectionMode === \"full\"\n ? {\n view: measureProjectionTiming(timing, \"resolveViewMs\", () =>\n resolvePlayerViewFor(combinedState, playerId, projection),\n ),\n zones: measureProjectionTiming(\n timing,\n \"resolveZoneHandlesMs\",\n () =>\n resolveZoneHandlesFor(\n combinedState,\n playerId,\n actorSeat,\n projection,\n registry,\n ),\n ),\n resources: resolveResourcesFor(combinedState, playerId),\n }\n : {};\n seats[playerId as unknown as string] = {\n ...fullProjection,\n availableInteractionRefs,\n };\n }\n return withProjectionTiming(\n {\n events: state.runtime.events,\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n schedulerFlow: resolveSchedulerFlowFor(state, projection),\n interactionsByRef: registry.entries(),\n seats,\n },\n timing,\n );\n }\n\n return {\n project,\n resolveSchedulerFlowFor,\n resolvePlayerViewFor,\n resolveZoneHandlesFor,\n };\n}\n\nfunction createProjectionTimingMetadata(): ProjectionTimingMetadata {\n return {\n resolveAvailableInteractionsMs: 0,\n resolveViewMs: 0,\n resolveZoneHandlesMs: 0,\n descriptorHashMs: 0,\n };\n}\n\nfunction measureProjectionTiming<T>(\n timing: ProjectionTimingMetadata,\n field: keyof ProjectionTimingMetadata,\n block: () => T,\n): T {\n const startedAt = performance.now();\n try {\n return block();\n } finally {\n timing[field] += performance.now() - startedAt;\n }\n}\n\nfunction withProjectionTiming<T extends object>(\n projection: T,\n timing: ProjectionTimingMetadata,\n): T & { timing: ProjectionTimingMetadata } {\n Object.defineProperty(projection, \"timing\", {\n value: timing,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n return projection as T & { timing: ProjectionTimingMetadata };\n}\n\nfunction descriptorWithBrowserReplayDigests(\n descriptor: InteractionDescriptorShape,\n actorSeat: number,\n): InteractionDescriptorShape {\n const descriptorDigestValue =\n descriptor.descriptorDigest ?? interactionDescriptorDigest(descriptor);\n return {\n ...descriptor,\n descriptorDigest: descriptorDigestValue,\n actorSeat,\n draftDigest:\n descriptor.draftDigest ??\n interactionDraftDigest({\n actorSeat,\n descriptor,\n descriptorDigest: descriptorDigestValue,\n }),\n };\n}\n\nfunction interactionDescriptorDigest(\n descriptor: InteractionDescriptorShape,\n): string {\n return hashJson({\n commitMode: descriptor.commit.mode,\n defaults: toDescriptorDigestJson(defaultsForDescriptor(descriptor)),\n inputKeys: descriptor.inputs.map((input) => input.key),\n inputs: descriptor.inputs.map((input) => ({\n key: input.key,\n kind: input.kind,\n domain: toDescriptorDigestJson(input.domain),\n defaultValue:\n input.defaultValue === undefined\n ? null\n : toDescriptorDigestJson(input.defaultValue),\n })),\n interactionId: descriptor.interactionId,\n interactionKey: descriptor.interactionKey,\n stableIdentity: `${descriptor.interactionKey}:${descriptor.interactionId}`,\n });\n}\n\nfunction interactionDraftDigest({\n actorSeat,\n descriptor,\n descriptorDigest,\n}: {\n actorSeat: number;\n descriptor: InteractionDescriptorShape;\n descriptorDigest: string;\n}): string {\n return hashJson({\n digestVersion: \"interaction-draft@2\",\n actorSeat,\n descriptorDigest,\n emitted: false,\n interactionId: descriptor.interactionId,\n interactionKey: descriptor.interactionKey,\n values: defaultsForDescriptor(descriptor),\n });\n}\n\nfunction toDescriptorDigestJson(value: unknown): RuntimeJson {\n const canonical = toCanonicalJson(value);\n return normalizeOrderInsensitiveDescriptorFields(canonical);\n}\n\nfunction normalizeOrderInsensitiveDescriptorFields(\n value: RuntimeJson,\n): RuntimeJson {\n if (Array.isArray(value)) {\n return value.map(normalizeOrderInsensitiveDescriptorFields);\n }\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => {\n const normalized = normalizeOrderInsensitiveDescriptorFields(item);\n if (key === \"eligibleTargets\" && Array.isArray(normalized)) {\n return [\n key,\n [...normalized].sort((left, right) =>\n compareCanonicalJson(canonicalJson(left), canonicalJson(right)),\n ),\n ];\n }\n return [key, normalized];\n }),\n );\n}\n\nfunction defaultsForDescriptor(\n descriptor: InteractionDescriptorShape,\n): Record<string, RuntimeJson> {\n return Object.fromEntries(\n descriptor.inputs.flatMap((input) =>\n input.defaultValue === undefined\n ? []\n : [[input.key, toCanonicalJson(input.defaultValue)]],\n ),\n );\n}\n\nfunction compareCanonicalJson(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction fnv1a64(value: string): string {\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n for (let index = 0; index < value.length; index += 1) {\n hash ^= BigInt(value.charCodeAt(index));\n hash = BigInt.asUintN(64, hash * prime);\n }\n return hash.toString(16).padStart(16, \"0\");\n}\n","import type * as Wire from \"../../shared/runtime-types\";\nimport { REDUCER_CONTRACT_VERSION } from \"../../shared/worker-contract\";\nimport type { GameEvent, GameOutcome } from \"../../shared/domain/results\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n ViewOfContract,\n} from \"../model\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type { UntrustedReducerSessionState } from \"../ingress/types\";\nimport { createIngressRuntimeCodec } from \"../ingress/session-codec\";\nimport { summarizeDispatchTrace } from \"../diagnostics\";\nimport type { ReducerBundle, ReducerBundleOptions } from \"./types\";\nimport {\n createTrustedRuntimeScope,\n type TrustedInput,\n type TrustedSessionState,\n} from \"./trusted/runtime-scope\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createReducerExecutor } from \"./trusted/reducer-executor\";\nimport { createStaticProjectionBuilder } from \"./trusted/static-projection\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\n\nfunction wireOutcome(outcome: GameOutcome): Wire.GameOutcome {\n return {\n reason: outcome.reason,\n standings: outcome.standings.map(\n ({ scoreBreakdown, tieBreaks, ...standing }) => ({\n ...standing,\n ...(scoreBreakdown ? { scoreBreakdown: [...scoreBreakdown] } : {}),\n ...(tieBreaks ? { tieBreaks: [...tieBreaks] } : {}),\n }),\n ),\n };\n}\nfunction wireEvents(events: readonly GameEvent[]): Wire.GameEvent[] {\n return events.map(({ details, ...event }) => ({\n ...event,\n ...(details ? { details: [...details] } : {}),\n }));\n}\n\nfunction toWireDispatchResult<State, PlayerId extends string>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n terminal?: GameOutcome<PlayerId>;\n events?: readonly GameEvent[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.DispatchResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\":\n trace.push({\n kind: \"acceptedClientInput\",\n input: entry.input as Wire.GameInput,\n });\n break;\n case \"phaseEntered\":\n trace.push({\n kind: \"phaseEntered\",\n from: String(entry.from),\n to: String(entry.to),\n });\n break;\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n version: entry.version,\n operation: entry.operation,\n drawIndex: entry.drawIndex,\n traceEntry: entry.traceEntry,\n });\n break;\n default: {\n const _exhaustive: never = entry;\n throw new Error(\n `toWireDispatchResult: unknown trace entry type '${(_exhaustive as { type: string }).type}'.`,\n );\n }\n }\n }\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n ...(result.terminal ? { terminal: wireOutcome(result.terminal) } : {}),\n trace,\n events: wireEvents(result.events ?? []),\n };\n}\n\n/** The single validated production execution and projection boundary. */\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n View extends ViewOfContract<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, View>,\n options: ReducerBundleOptions = {},\n): ReducerBundle {\n const codec = createIngressRuntimeCodec(definition);\n // The codec validates the authored schemas; its erased phase return type\n // cannot express the contract-specific phase-state mapping.\n const parseState = (state: Wire.ReducerSessionState) =>\n codec.parseState(state) as unknown as TrustedSessionState<Contract>;\n const parseInput = (input: Wire.GameInput) =>\n codec.parseInput(input) as TrustedInput<Contract>;\n const scope = createTrustedRuntimeScope(definition, {\n diagnostics:\n typeof options.diagnostics === \"object\" ? options.diagnostics : undefined,\n });\n const interactions = createInteractionResolver(scope, {\n diagnostics:\n options.descriptorDiagnostics ??\n (options.diagnostics === \"verbose\" ? \"verbose\" : undefined),\n });\n const lifecycle = createLifecycleRunner(scope);\n const executor = createReducerExecutor(scope, interactions, lifecycle);\n const staticProjection = createStaticProjectionBuilder(scope);\n const projection = createProjectionBuilder(scope, interactions);\n let submissionCounter = 0;\n return {\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({ table, playerIds, rngSeed, options }) {\n const parsed = codec.parseInitialTable(\n table as unknown as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n const result = lifecycle.initializeSession(\n { ...parsed, rngSeed, options: codec.parseInitialOptions(options) },\n executor.complete,\n );\n return {\n state: codec.serializeState(result.state),\n ...(result.terminal ? { terminal: wireOutcome(result.terminal) } : {}),\n events: wireEvents(result.events),\n };\n },\n async dispatch({ state, input: rawInput }) {\n const input = parseInput(rawInput);\n const combinedState = scope.toCombinedState(parseState(state));\n const submissionId = `sub-${++submissionCounter}`;\n scope.diagnostics.event({\n type: \"submitReceived\",\n submissionId,\n playerId: input.playerId,\n interactionId: input.interactionId,\n phase: String(combinedState.flow.currentPhase),\n });\n const result = executor.dispatch(combinedState, input);\n if (result.type === \"reject\") {\n scope.diagnostics.event({\n type: \"submitRejected\",\n submissionId,\n errorCode: result.errorCode,\n ...(result.message ? { message: result.message } : {}),\n });\n } else {\n scope.diagnostics.event({\n type: \"submitAccepted\",\n submissionId,\n trace: summarizeDispatchTrace(result.trace),\n });\n const from = combinedState.flow.currentPhase;\n const to = result.state.flow.currentPhase;\n if (String(from) !== String(to))\n scope.diagnostics.event({\n type: \"phaseTransition\",\n from: String(from),\n to: String(to),\n reason: \"effect\",\n });\n }\n return toWireDispatchResult(result, (next) =>\n codec.serializeState(scope.toSessionState(next)),\n );\n },\n boardStatic: () =>\n staticProjection.boardStatic() as Wire.BoardStaticProjection | null,\n project({ state, playerIds }) {\n return projection.project({\n state: parseState(state),\n playerIds: playerIds.map((id) => codec.parsePlayerId(id)),\n }) as unknown as Wire.SeatProjectionBundle;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAO,IAAM,sBAAsB;AAAA,EACjC,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,gBAAgB;AAClB;;;ACLA,SAAS,SAAS;AA8LlB,SAAS,sBACP,QAC4C;AAC5C,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI,MAAM,KAAK,MAAM;AAC1C,MAAI,OAAO,UAAU,aAAa;AAChC,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AACA,SAAO,CAAC,OAAyB,GAAI,IAA8B;AACrE;AAcA,IAAM,wBAAwB,oBAAI,QAGhC;AAEK,SAAS,yBAId,QACA,QACoD;AACpD,wBAAsB,IAAI,QAA6B,MAAM;AAC7D,SAAO;AACT;AAEO,SAAS,uBAAuB,QAA0B;AAC/D,SACE,OAAO,WAAW,YAClB,WAAW,QACX,sBAAsB,IAAI,MAAgB;AAE9C;AAEO,SAAS,qBACd,QAC8B;AAC9B,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,IAAI,MAAgB;AACnD;AAEO,SAAS,kCAId,QACA,QAIA;AACA,QAAM,SACJ,OAAO,WAAW,IACb,EAAE,OAAO,IAGT,EAAE,KAAK,sBAAsB,MAAM,CAAC;AAG3C,SAAO,yBAAyB,QAAQ,MAAM;AAChD;AASO,SAAS,qBACd,QACmB;AACnB,SAAO;AACT;AAuBO,SAAS,4BAGd;AAAA,EACA;AAAA,EACA;AACF,GAGG;AACD,SAAO,EAAE,OAAO;AAAA,IACd,QAAQ,EAAE,MAAkB,eAAe,EAAE,IAAI,EAAE;AAAA,IACnD,KAAK,EACF,OAAO;AAAA,MACN,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MACrC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,MAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,MACrC,OAAO,EAAE,MAAkB,aAAa,EAAE,QAAQ,CAAC,CAAC;AAAA,IACtD,CAAC,EACA,QAAQ;AAAA,MACP,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,OAAO,CAAC;AAAA,IACV,CAAC;AAAA,IACH,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAAA,IAC3D,cAAc,EACX,OAAO;AAAA,MACN,SAAS,EACN,OAAO;AAAA,QACN,WAAW;AAAA,QACX,QAAQ,EAAE,MAAM,cAAc;AAAA,QAC9B,aAAa,EAAE;AAAA,UACb,EAAE,OAAO;AAAA,UACT,EAAE,OAAO;AAAA,YACP,eAAe,EAAE,OAAO;AAAA,YACxB,QAAQ,EAAE,QAAQ;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF,CAAC,EACA,SAAS;AAAA,IACd,CAAC,EACA,QAAQ,EAAE,SAAS,KAAK,CAAC;AAAA,IAC5B,gBAAgB,EACb,OAAO;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,IACN,CAAC,EACA,SAAS,EACT,QAAQ,IAAI;AAAA,IACf,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,EAC5C,CAAC;AACH;AAEO,SAAS,8BAQd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,SAAO,EAAE,OAAO;AAAA,IACd,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM,EAAE,OAAO;AAAA,MACb,cAAc;AAAA,MACd,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA,MACrB,OAAO,EAAE,OAAO,EAAE,IAAI;AAAA,MACtB,eAAe,EAAE,MAAM,cAAc;AAAA,IACvC,CAAC;AAAA,IACD,OAAO;AAAA,IACP,SAAS,4BAA4B;AAAA,MACnC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;ACtFO,IAAM,6BAA4C;AAAA,EACvD;AACF;;;AC3TA,SAAS,KAAAA,UAAS;AA0BX,SAAS,WAAW,KAAuB;AAChD,SAAO;AACT;AAOO,SAAS,WAAW,OAAmC;AAC5D,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS;AACrD;AAsCO,SAAS,eACd,QACwB;AACxB,SAAO,EAAE,OAAO;AAClB;AAGO,SAAS,kBACd,QACA,MAC+B;AAC/B,SAAO,EAAE,QAAQ,KAAK;AACxB;AAMO,SAAS,SACd,QACA,MACsB;AACtB,MAAI,SAAS,QAAW;AACtB,WAAO,EAAE,OAAO;AAAA,EAClB;AACA,SAAO,EAAE,QAAQ,KAAK;AACxB;AAGO,SAAS,YAAY,KAAuB;AACjD,SAAO,IAAI,SAAS,SAAY,IAAI,SAAS,GAAG,IAAI,MAAM,IAAI,IAAI,IAAI;AACxE;AAOO,SAAS,iBAAiB,KAA8B;AAC7D,MAAI,CAAC,IAAI,QAAQ;AACf,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,MAAI,QAAQ,GAAG;AACb,WAAO,EAAE,QAAQ,IAAI;AAAA,EACvB;AACA,QAAM,SAAS,IAAI,MAAM,GAAG,KAAK;AACjC,QAAM,OAAO,IAAI,MAAM,QAAQ,CAAC;AAChC,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,QAAQ;AAClC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,QAAQ,KAAuB;AAC1C;AAQO,SAAS,eAId,UAGI,CAAC,GAC4B;AACjC,QAAM,aACJ,QAAQ,gBAAiBA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC3C,QAAM,eACJ,QAAQ,kBAAmBA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC7C,QAAM,SAASA,GAAE,aAAa,EAAE,QAAQ,WAAW,CAAC;AACpD,QAAM,YAAYA,GAAE,aAAa,EAAE,QAAQ,YAAY,MAAM,aAAa,CAAC;AAC3E,SAAOA,GAAE,MAAM,CAAC,WAAW,MAAM,CAAC;AAGpC;AAGO,SAAS,iBACd,KAC+B;AAC/B,SAAO,IAAI,SAAS;AACtB;AAGO,SAAS,oBACd,KACsC;AACtC,SAAO,IAAI,SAAS;AACtB;;;ACvKA,SAAS,KAAAC,UAAS;AAIX,IAAM,2BAA2B;AAaxC,IAAM,WAAWA,GAAE;AAAA,EACjB,CAAC,UAAU,OAAO,UAAU;AAC9B;AAEA,IAAM,eAAeA,GAAE,OAAO;AAAA,EAC5B,wBAAwBA,GAAE,QAAQ,wBAAwB;AAAA,EAC1D,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AACX,CAAC;AAEM,SAAS,4BACd,OACA,QACwC;AACxC,QAAM,SAAS,aAAa,UAAU,KAAK;AAC3C,MAAI,OAAO,QAAS;AACpB,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,MAAM,kBAAkB,MAAM,4BAA4B;AAAA,EACtE;AACA,QAAM,SAAS;AACf,MAAI,OAAO,2BAA2B,0BAA0B;AAC9D,UAAM,IAAI;AAAA,MACR,kBAAkB,MAAM,4BAA4B,wBAAwB,cAAc,OAAO,OAAO,0BAA0B,SAAS,CAAC;AAAA,IAC9I;AAAA,EACF;AACA,QAAM,SAAS,OAAO,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC;AAC7C,QAAM,IAAI,MAAM,kBAAkB,MAAM,eAAe,OAAO,MAAM,CAAC,KAAK;AAC5E;;;ACIO,IAAM,sBAA8C;AAAA,EACzD,QAAQ;AAAA,EAAC;AACX;AAMA,SAAS,mBAAmB,OAAwB;AAClD,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,SAAO,iBAAiB,QAAQ,MAAM,QAAQ;AAChD;AAEO,SAAS,gCACd,MAC2B;AAC3B,QAAM,SAAS,QAAQ;AACvB,MAAI,WAAW;AACf,SAAO;AAAA,IACL,IAAI,WAAW;AACb,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO;AACX,UAAI,SAAU;AACd,UAAI;AACF,eAAO,MAAM,KAAK;AAAA,MACpB,SAAS,OAAO;AACd,mBAAW;AACX,YAAI;AACF,iBAAO,MAAM;AAAA,YACX,MAAM;AAAA,YACN,cACE,kBAAkB,QAAQ,MAAM,eAAe;AAAA,YACjD,SAAS,mCAAmC;AAAA,cAC1C;AAAA,YACF,CAAC;AAAA,YACD,OAAO,iBAAiB,KAAK;AAAA,UAC/B,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,uBACd,OAC6B;AAC7B,SAAO,MAAM,IAAI,CAAC,UAAU;AAC1B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,eACE,MAAM,MAAM,SAAS,gBACjB,MAAM,MAAM,gBACZ,MAAM,MAAM;AAAA,UAClB,UACE,MAAM,MAAM,SAAS,gBAAgB,MAAM,MAAM,WAAW;AAAA,QAChE;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,OAAO,MAAM,IAAI;AAAA,UACvB,IAAI,OAAO,MAAM,EAAE;AAAA,QACrB;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,QACnB;AAAA,MACF,SAAS;AACP,cAAM,cAAqB;AAC3B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC7HO,SAAS,YAAe,OAA4C;AACzE,SAAO,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;AAC9C;AAEA,SAAS,iBAAiB,UAA4C;AACpE,SAAO,cAAc,YAAY,OAAO,SAAS,aAAa,WAC1D,SAAS,WACT,OAAO;AACb;AAEO,SAAS,+BACd,OACA,WACU;AACV,SAAO,OAAO,QAAQ,MAAM,kBAAkB,EAC3C,OAAO,CAAC,CAAC,EAAE,QAAQ,MAAM,UAAU,QAAQ,CAAC,EAC5C;AAAA,IACC,CAAC,MAAM,UAAU,iBAAiB,KAAK,CAAC,CAAC,IAAI,iBAAiB,MAAM,CAAC,CAAC;AAAA,EACxE,EACC,IAAI,CAAC,CAAC,WAAW,MAAM,WAAW;AACvC;AAEA,SAAS,UAAU,QAAiC,KAAsB;AACxE,SAAO,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG;AACzD;AAEA,SAAS,eAAe,OAA2B,QAAyB;AAC1E,SACE,UAAU,MAAM,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,QAAQ,MAAM;AAE1E;AAEA,SAAS,eAAe,OAA2B,QAAyB;AAC1E,SACE,UAAU,MAAM,OAAO,MAAM,KAC7B,UAAU,MAAM,MAAM,WAAW,MAAM,KACvC,UAAU,MAAM,gBAAgB,MAAM;AAE1C;AAEA,SAAS,eACP,OACA,QAC+B;AAC/B,MAAI,eAAe,OAAO,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AACA,MAAI,eAAe,OAAO,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,gBACd,OACA,QACA,eACA,WACA,cACM;AACN,QAAM,cAAc,eAAe,OAAO,MAAM;AAChD,MAAI,gBAAgB,eAAe;AACjC;AAAA,EACF;AAEA,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI;AAAA,MACR,iBAAiB,MAAM,eAAe,YAAY,OAAO,SAAS;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,SAAS,MAAM,gBAAgB,WAAW,UAAU,SAAS,aAAa,YAAY,YAAY,kBAAkB,WAAW,WAAW,WAAW;AAAA,EACvJ;AACF;AAEO,SAAS,uBAGd,OAAc,QAAgB,WAAoC;AAClE,QAAM,MAAM,MAAM,IAAI,CAAC,GAAG,SAAS;AACnC,QAAM,MAAM,OAAO,MAAM,IAAI;AAAA,IAC3B,GAAG;AAAA,EACL;AACF;AAEO,SAAS,uBAKd,OACA,QACA,UACA,WACM;AACN,QAAM,MAAM,MAAM,IAAI;AAAA,IACpB,GAAG,MAAM,MAAM,MAAM;AAAA,IACrB,CAAC,QAAkB,GAAG,CAAC,GAAG,SAAS;AAAA,EACrC;AACA,QAAM,MAAM,UAAU,MAAM,IAAI;AAAA,IAC9B,GAAG,MAAM,MAAM,UAAU,MAAM;AAAA,IAC/B,CAAC,QAAkB,GAAG,CAAC,GAAG,SAAS;AAAA,EACrC;AACF;;;ACrFA,IAAM,gBAAgB,oBAAI,QAGxB;AACF,SAAS,WAAW,OAA6B;AAC/C,MAAI,WAAW,cAAc,IAAI,KAAK;AACtC,MAAI,CAAC,UAAU;AACb,eAAW,uBAAuB;AAAA,MAChC,IAAI,MAAM,UAAU,MAAM;AAAA,MAC1B,aAAa,MAAM;AAAA,MACnB,QAAQ,OAAO,OAAO,MAAM,MAAM;AAAA,IACpC,CAAC;AACD,kBAAc,IAAI,OAAO,QAAQ;AAAA,EACnC;AACA,SAAO;AACT;AAEO,SAAS,SAGd,OAAc,SAAoD;AAClE,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,OAAO;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAeO,SAAS,cAId,OACA,SACyE;AACzE,SAAO,SAAS,OAAO,OAAO;AAIhC;AAEO,SAAS,eAId,OACA,SACiE;AACjE,SAAO,SAAS,OAAO,OAAO;AAIhC;AAEO,SAAS,SAKd,OACA,SACA,SACqD;AACrD,SAAO;AAAA,IACL,SAAS,OAAO,OAAO,EAAE,OAAO,OAAO;AAAA,IACvC,kBAAkB,OAAO;AAAA,IACzB;AAAA,EACF;AACF;AAoBO,SAAS,eAKd,OACA,SACA,SAImB;AACnB,SAAO,SAAS,OAAO,SAAS,OAAO;AAIzC;AAEO,SAAS,aAKd,OACA,SACA,aAC6D;AAC7D,SAAO;AAAA,IACL,SAAS,OAAO,OAAO,EAAE,WAAW,WAAW;AAAA,IAC/C,sBAAsB,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;AAEO,SAAS,QAKd,OACA,SACA,QAC+C;AAC/C,QAAM,OAAO,cAAc,OAAO,OAAO,EAAE,MAAM;AAAA,IAC/C,CAAC,cAAc,UAAU,OAAO;AAAA,EAClC;AACA,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iBAAiB,MAAM,eAAe,OAAO,IAAI;AAAA,EACnE;AACA,SAAO;AACT;AAEO,SAAS,UAKd,OACA,SACA,UACmD;AACnD,QAAM,SAAS,cAAc,OAAO,OAAO,EAAE,SAAS;AAAA,IACpD,CAAC,cAAc,UAAU,OAAO;AAAA,EAClC;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,mBAAmB,QAAQ,eAAe,OAAO,IAAI;AAAA,EACvE;AACA,SAAO;AACT;AAkDO,SAAS,cAId,OACA,SACA,SACsC;AACtC,SAAO,cAAc,OAAO,OAAO,EAChC,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS,OAAO,CAAC,EACtD,IAAI,CAAC,SAAS,KAAK,EAAwC;AAChE;AAEO,SAAS,iBAId,OACA,SACA,SACwC;AACxC,SAAO,cAAc,OAAO,OAAO,EAChC,SAAS,OAAO,CAAC,WAAW,OAAO,SAAS,SAAS,OAAO,CAAC,EAC7D,IAAI,CAAC,WAAW,OAAO,EAA0C;AACtE;AAEO,SAAS,iBAKd,OACA,SACA,UACsC;AACtC,QAAM,aAAa,cAAc,OAAO,OAAO;AAC/C,MAAI,WAAW,WAAW,OAAO;AAC/B,UAAM,WAAW,WAAW,UAAU;AACtC,UAAMC,UAAS,SAAS,SAAS,KAAK,CAACA,YAAWA,QAAO,OAAO,QAAQ;AACxE,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,mBAAmB,QAAQ,eAAe,OAAO,IAAI;AACvE,WAAOA,QAAO;AAAA,EAChB;AAEA,QAAM,SAAS,WAAW,SAAS;AAAA,IACjC,CAAC,cAAc,UAAU,OAAO;AAAA,EAClC;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,mBAAmB,QAAQ,eAAe,OAAO,IAAI;AAAA,EACvE;AACA,QAAM,iBAAiB,IAAI,IAAI,OAAO,QAAQ;AAC9C,SAAO,WAAW,MACf;AAAA,IAAO,CAAC,SACP,KAAK,SAAS,MAAM,CAAC,YAAY,eAAe,IAAI,OAAO,CAAC;AAAA,EAC9D,EACC,IAAI,CAAC,SAAS,KAAK,EAAwC;AAChE;AAEO,SAAS,oBAKd,OACA,SACA,QACwC;AACxC,QAAM,aAAa,cAAc,OAAO,OAAO;AAC/C,MAAI,WAAW,WAAW,OAAO;AAC/B,UAAM,WAAW,WAAW,UAAU;AACtC,UAAMC,QAAO,SAAS,MAAM,KAAK,CAACA,UAASA,MAAK,OAAO,MAAM;AAC7D,QAAI,CAACA;AACH,YAAM,IAAI,MAAM,iBAAiB,MAAM,eAAe,OAAO,IAAI;AACnE,WAAOA,MAAK;AAAA,EACd;AAEA,QAAM,OAAO,WAAW,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,MAAM;AACzE,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,iBAAiB,MAAM,eAAe,OAAO,IAAI;AAAA,EACnE;AACA,QAAM,eAAe,IAAI,IAAI,KAAK,QAAQ;AAC1C,SAAO,WAAW,SACf;AAAA,IAAO,CAAC,WACP,MAAM,KAAK,YAAY,EAAE;AAAA,MAAM,CAAC,YAC9B,OAAO,SAAS,SAAS,OAAO;AAAA,IAClC;AAAA,EACF,EACC,IAAI,CAAC,WAAW,OAAO,EAA0C;AACtE;AAEO,SAAS,iBAMd,OACA,SACA,SACA,gBACW;AACX,QAAM,QAAQ,SAAS,OAAO,OAAO;AACrC,QAAM,UAAU,oBAAI,IAAa;AAEjC,aAAW,YAAY,MAAM,WAAW;AACtC,QAAI,SAAS,WAAW,gBAAgB;AACtC;AAAA,IACF;AACA,QAAI,SAAS,gBAAgB,SAAS;AACpC,cAAQ,IAAI,SAAS,SAAoB;AACzC;AAAA,IACF;AACA,QAAI,CAAC,SAAS,YAAY,SAAS,cAAc,SAAS;AACxD,cAAQ,IAAI,SAAS,WAAsB;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,OAAO;AACpB;AAEO,SAAS,kBAId,OAAc,SAAkB,SAA6B;AAC7D,QAAM,QAAQ,SAAS,OAAO,OAAO;AACrC,MAAI,MAAM,WAAW;AACnB,WAAO,WAAW,KAAK,EAAE,UAAU,OAAO;AAC5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBAKd,OACA,SACA,aACA,WACQ;AACR,QAAM,QAAQ,SAAS,OAAO,OAAO;AACrC,MAAI,MAAM,WAAW;AACnB,WAAO,WAAW,KAAK,EAAE,SAAS,aAAa,SAAS;AAC1D,MAAI,gBAAgB,WAAW;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,oBAAI,IAAY,CAAC,WAAW,CAAC;AAC7C,MAAI,WAAqB,CAAC,WAAW;AACrC,MAAI,WAAW;AAEf,SAAO,SAAS,SAAS,GAAG;AAC1B,gBAAY;AACZ,UAAM,eAAyB,CAAC;AAEhC,eAAW,kBAAkB,UAAU;AACrC,iBAAW,cAAc;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,YAAI,eAAe,WAAW;AAC5B,iBAAO;AAAA,QACT;AACA,YAAI,CAAC,QAAQ,IAAI,UAAU,GAAG;AAC5B,kBAAQ,IAAI,UAAU;AACtB,uBAAa,KAAK,UAAU;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,eAAW;AAAA,EACb;AAEA,SAAO,OAAO;AAChB;AAEO,SAAS,mBAKd,OACA,SACA,SACA,UAAwD,CAAC,GACjB;AACxC,QAAM,QAAQ,eAAe,OAAO,OAAO;AAC3C,QAAM,QAAQ,eAAe,OAAO,SAAS,OAAO;AACpD,QAAM,UACJ,QAAQ,SAAS,aACb;AAAA,IACE,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,EACP,IACA,QAAQ,SAAS,QACf;AAAA,IACE,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,EACP,IACA;AAAA,IACE,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,EAAE;AAAA,EACR;AAER,SAAO,QACJ;AAAA,IAAI,CAAC,CAAC,WAAW,SAAS,MACzB,OAAO,OAAO,MAAM,MAAM,EAAE;AAAA,MAC1B,CAAC,cACC,UAAU,QAAQ,MAAM,MAAM,aAC9B,UAAU,QAAQ,MAAM,MAAM;AAAA,IAClC;AAAA,EACF,EACC,OAAO,CAAC,cAAyC,cAAc,MAAS,EACxE,IAAI,CAAC,cAAc,UAAU,EAA0C;AAC5E;AAEO,SAAS,kBAKd,OACA,SACA,aACA,WACA,UAAkD,CAAC,GAC3C;AACR,QAAM,OAAO,eAAe,OAAO,SAAS,WAAW;AACvD,QAAM,KAAK,eAAe,OAAO,SAAS,SAAS;AACnD,QAAM,cAAc,KAAK,IAAI,KAAK,MAAM,GAAG,GAAG;AAC9C,QAAM,cAAc,KAAK,IAAI,KAAK,MAAM,GAAG,GAAG;AAE9C,SAAO,QAAQ,WAAW,cACtB,KAAK,IAAI,aAAa,WAAW,IACjC,cAAc;AACpB;AAWO,SAAS,kBAKd,OACA,SACA,QACkC;AAClC,SAAO,OAAO,QAAQ,SAAS,OAAO,OAAO,EAAE,MAAM,EAClD,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,WAAW,MAAM,EAC7C,IAAI,CAAC,CAAC,OAAO,MAAM,OAAyC;AACjE;AA8BO,SAAS,qBAKd,OACA,SACA,SAC6B;AAC7B,QAAM,SAAS,SAAS,OAAO,SAAS,OAAO,EAAE;AACjD,SAAO;AAAA,IACL;AAAA,IACA,CAAC,aACE,SAAS,SAAS,aACjB,SAAS,YAAY,WACrB,SAAS,YAAY,WACtB,SAAS,SAAS,YACjB,OAAO,WAAW,YAClB,OAAO,SAAS,KAChB,SAAS,WAAW;AAAA,EAC1B;AACF;AAEO,SAAS,yBAKd,OACA,SACA,aAC6B;AAC7B,QAAM,SAAS,aAAa,OAAO,SAAS,WAAW,EAAE;AACzD,SAAO;AAAA,IACL;AAAA,IACA,CAAC,aACE,SAAS,SAAS,iBACjB,SAAS,YAAY,WACrB,SAAS,gBAAgB,eAC1B,SAAS,SAAS,YACjB,OAAO,WAAW,YAClB,OAAO,SAAS,KAChB,SAAS,WAAW;AAAA,EAC1B;AACF;AAEO,SAAS,oBAId,OAAc,SAAkB,QAA6C;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,CAAC,aACC,SAAS,SAAS,YAClB,SAAS,YAAY,WACrB,SAAS,WAAW;AAAA,EACxB;AACF;AAEO,SAAS,sBAKd,OACA,SACA,UAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA,CAAC,aACC,SAAS,SAAS,cAClB,SAAS,YAAY,WACrB,SAAS,aAAa;AAAA,EAC1B;AACF;AAEO,SAAS,iBAGd,OAAc,SAAkB;AAChC,QAAM,QAAQ,SAAS,OAAO,OAAO;AACrC,QAAM,SAAS;AAAA,IACb;AAAA,IACA,OAAO,CAAiD,OAAgB;AACtE,aAAO,SAAS,OAAO,SAAS,EAAE;AAAA,IACpC;AAAA,IACA,WAAW,CACT,OACG,aAAa,OAAO,SAAS,EAAE;AAAA,IACpC,cAAc,CACZ,OACG,kBAAkB,OAAO,SAAS,EAAE;AAAA,IACzC,eAAe,CAIb,IACA,WACG,iBAAiB,OAAO,SAAS,IAAI,MAAM;AAAA,IAChD,WAAW,CAAC,OACV,kBAAkB,OAAO,SAAS,EAAE;AAAA,IACtC,UAAU,CACR,MACA,OACG,iBAAiB,OAAO,SAAS,MAAM,EAAE;AAAA,IAC9C,gBAAgB,CAAC,OACf,qBAAqB,OAAO,SAAS,EAAE;AAAA,IACzC,oBAAoB,CAAC,OACnB,yBAAyB,OAAO,SAAS,EAAE;AAAA,EAC/C;AACA,MAAI,MAAM,WAAW,OAAO;AAC1B,UAAM,WAAW,WAAW,KAAK;AACjC,UAAM;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,kBAAkB;AAAA,MAClB,GAAG;AAAA,IACL,IAAI;AACJ,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EAIF;AACA,MAAI,MAAM,WAAW,UAAU;AAC7B,UAAM,UAAU;AAEhB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,CAAC,OACR,iBAAiB,OAAO,SAAS,EAAE;AAAA,MACrC,YAAY,CAAC,OACX,oBAAoB,OAAO,SAAS,EAAE;AAAA,MACxC,YAAY,CAAC,OACX,cAAc,OAAO,SAAS,EAAE;AAAA,MAClC,eAAe,CAAC,OACd,iBAAiB,OAAO,SAAS,EAAE;AAAA,MACrC,UAAU,CAAC,OACT,MAAM,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,EAAE,EAAG;AAAA,MACrD,aAAa,CAAC,OACZ,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,EAAG;AAAA,MAC9C,WAAW,CACT,IACA,YACG,mBAAmB,OAAO,SAAS,IAAI,OAAO;AAAA,MACnD,UAAU,CACR,MACA,IACA,YACG,kBAAkB,OAAO,SAAS,MAAM,IAAI,OAAO;AAAA,IAC1D;AAAA,EAIF;AACA,SAAO;AAIT;;;ACxsBA,SAAS,yBACP,OACA,QACmB;AACnB,SAAO,MAAM,MAAM,qBAAqB,MAAM,KAAK,CAAC;AACtD;AAEO,SAAS,wBACd,OACA,QACA,aACM;AACN,QAAM,OAAO,MAAM,MAAM,WAAW;AACpC,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,oBAAoB,yBAAyB,OAAO,MAAM;AAChE,MACE,kBAAkB,SAAS,KAC3B,CAAC,kBAAkB,SAAS,KAAK,SAAS,GAC1C;AACA,UAAM,IAAI;AAAA,MACR,SAAS,WAAW,oBAAoB,KAAK,SAAS,wBAAwB,MAAM;AAAA,IACtF;AAAA,EACF;AACF;AAEO,SAAS,6BAKd,OACA,SACA,aACA,aACM;AACN,QAAM,OAAO,MAAM,MAAM,WAAW;AACpC,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,oBACJ,aAAa,OAAO,SAAS,WAAW,EAAE,qBAAqB,CAAC;AAClE,MACE,kBAAkB,SAAS,KAC3B,CAAC,kBAAkB,SAAS,KAAK,SAAS,GAC1C;AACA,UAAM,IAAI;AAAA,MACR,SAAS,WAAW,oBAAoB,KAAK,SAAS,6BAA6B,WAAW,eAAe,OAAO;AAAA,IACtH;AAAA,EACF;AACF;;;AC1DA,IAAI,6BAA6B;AAUjC,SAAS,uBAAuB,OAA6C;AAC3E,MAAI,MAAM,WAAW,WAAW;AAC9B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,MAC1B,QAAQ,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,UACrD;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,WAAW,MAAM,UAAU,IAAI,CAAC,cAAc;AAAA,QAC5C,GAAG;AAAA,QACH,QAAQ,EAAE,GAAG,SAAS,OAAO;AAAA,MAC/B,EAAE;AAAA,MACF,YAAY,OAAO;AAAA,QACjB,OAAO,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,aAAa,SAAS,MAAM;AAAA,UACjE;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,QAAQ,EAAE,GAAG,UAAU,OAAO;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,QAChC,GAAG;AAAA,QACH,UAAU,CAAC,GAAG,KAAK,QAAQ;AAAA,QAC3B,QAAQ,EAAE,GAAG,KAAK,OAAO;AAAA,MAC3B,EAAE;AAAA,MACF,UAAU,MAAM,SAAS,IAAI,CAAC,YAAY;AAAA,QACxC,GAAG;AAAA,QACH,UAAU,CAAC,GAAG,OAAO,QAAQ;AAAA,QAC7B,QAAQ,EAAE,GAAG,OAAO,OAAO;AAAA,MAC7B,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,IAC1B,QAAQ,OAAO;AAAA,MACb,OAAO,QAAQ,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,QACrD;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,WAAW,MAAM,UAAU,IAAI,CAAC,cAAc;AAAA,MAC5C,GAAG;AAAA,MACH,QAAQ,EAAE,GAAG,SAAS,OAAO;AAAA,IAC/B,EAAE;AAAA,IACF,YAAY,OAAO;AAAA,MACjB,OAAO,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,aAAa,SAAS,MAAM;AAAA,QACjE;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,UAAU,OAAO;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,kBACd,OACO;AACP,gCAA8B;AAC9B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,MACL,QAAQ,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ,YAAY,MAAM;AAAA,UACjE;AAAA,UACA,CAAC,GAAG,YAAY;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,MACA,WAAW,OAAO;AAAA,QAChB,OAAO,QAAQ,MAAM,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,OAAO,MAAM;AAAA,UAC/D;AAAA,UACA,OAAO;AAAA,YACL,MAAM,YAAY,IAAI,CAAC,aAAa;AAAA,cAClC;AAAA,cACA,CAAC,GAAG,QAAQ,QAAQ,CAAC;AAAA,YACvB,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,YAAY,EAAE,GAAG,MAAM,MAAM,WAAW;AAAA,MACxC,oBAAoB,MAAM,MAAM,qBAC5B,OAAO;AAAA,QACL,OAAO,QAAQ,MAAM,MAAM,kBAAkB,EAAE;AAAA,UAC7C,CAAC,CAAC,QAAQ,UAAU,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC;AAAA,QACpD;AAAA,MACF,IACA,MAAM,MAAM;AAAA,IAClB;AAAA,IACA,OAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM;AAAA,QACnD;AAAA,QACA,CAAC,GAAG,KAAK;AAAA,MACX,CAAC;AAAA,IACH;AAAA,IACA,OAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,OAAO,MAAM;AAAA,QACrD;AAAA,QACA,OAAO;AAAA,UACL,MAAM,YAAY,IAAI,CAAC,aAAa;AAAA,YAClC;AAAA,YACA,CAAC,GAAG,QAAQ,QAAQ,CAAC;AAAA,UACvB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,gBAAgB,EAAE,GAAG,MAAM,eAAe;AAAA,IAC1C,QAAQ,OAAO;AAAA,MACb,OAAO,QAAQ,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,QACrD;AAAA,QACA,EAAE,GAAG,MAAM;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IACA,oBAAoB,EAAE,GAAG,MAAM,mBAAmB;AAAA,IAClD,aAAa,EAAE,GAAG,MAAM,YAAY;AAAA,IACpC,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,IAClC,WAAW,OAAO;AAAA,MAChB,MAAM,YAAY,IAAI,CAAC,aAAa;AAAA,QAClC;AAAA,QACA,EAAE,GAAG,MAAM,UAAU,QAAQ,EAAE;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,MAAM;AAAA,MACT,MAAM,OAAO;AAAA,QACX,OAAO,QAAQ,MAAM,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,UAC1D;AAAA,UACA,uBAAuB,KAAK;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,KAAK,OAAO;AAAA,QACV,OAAO,QAAQ,MAAM,OAAO,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,UAC/D;AAAA,UACA,uBAAuB,KAAK;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,QAAQ,OAAO;AAAA,QACb,OAAO,QAAQ,MAAM,OAAO,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,UAClE;AAAA,UACA,uBAAuB,KAAK;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AAAA,MACX,OAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;AAAA,IACtE;AAAA,EACF;AACF;;;AC3IO,SAAS,qBAId,OACA,aAC8C;AAC9C,SAAO;AAAA,IACL,MAAM,mBAAmB,WAAW;AAAA,IACpC;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,yBAId,OACA,aACiD;AACjD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,OAAO,MAAM,MAAM,SAAS,MAA8B;AAAA,IAC1D;AAAA,EACF;AACF;AAEO,SAAS,yBAId,OACA,aACiD;AACjD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,UAAU,SAAS;AAAA,IACnB,OACE,MAAM,MAAM,SAAS,MAA8B,IACjD,SAAS,QACX;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,yBAId,OACA,aACiD;AACjD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB;AAAA,EACF;AACF;AAEO,SAAS,0BAId,OACA,aACkD;AAClD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,WAAW;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,SAAS;AACzB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,SAAS,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,OAAO,SAAS,OAAO,SAAS,OAAO;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAAS,8BAId,OACA,aACsD;AACtD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,eAAe;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,cAAc,SAAS;AAI7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,SAAS,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,WAAW,aAAa,OAAO,SAAS,WAAW;AAAA,IACnD;AAAA,EACF;AACF;AAEO,SAAS,yBAId,OACA,aACiD;AACjD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,SAAS,SAAS;AACxB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,cAAc,OAAO,OAAO;AAAA,IACnC;AAAA,IACA,MAAM,QAAQ,OAAO,SAAS,MAAM;AAAA,IACpC;AAAA,EACF;AACF;AAEO,SAAS,2BAId,OACA,aACmD;AACnD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,YAAY;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS;AACzB,QAAM,WAAW,SAAS;AAI1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,cAAc,OAAO,OAAO;AAAA,IACnC;AAAA,IACA,QAAQ,UAAU,OAAO,SAAS,QAAQ;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,SAAS,yBAId,OACA,aACiD;AACjD,QAAM,WAAW,qBAAqB,OAAO,WAAW;AACxD,MAAI,SAAS,SAAS,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB;AAAA,EACF;AACF;;;ACzLA,SAAS,gBACP,UACA,MACA,QACmE;AACnE,SACE,SAAS,SAAS,YAClB,SAAS,KAAK,SAAS,KAAK,QAC5B,SAAS,KAAK,OAAO,KAAK,OACzB,WAAW,UAAa,SAAS,WAAW;AAEjD;AAEA,SAAS,kBACP,OACA,aAC0C;AAC1C,QAAM,QAAQ,MAAM,OAAO,WAAW;AACtC,MAAI,OAAO;AACT,WAAQ,MAAM,WAAW;AAAA,EAC3B;AAEA,QAAM,MAAM,MAAM,KAAK,WAAW;AAClC,MAAI,KAAK;AACP,WAAQ,IAAI,WAAW;AAAA,EACzB;AAEA,QAAM,QAAQ,MAAM,YAAY,WAAW;AAC3C,MAAI,UAAU,QAAW;AACvB,WAAQ,SAAS;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,cACP,OACA,aACqC;AACrC,QAAM,QAAQ,MAAM,OAAO,WAAW;AACtC,MAAI,OAAO;AACT,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,MAAM,MAAM,KAAK,WAAW;AAClC,MAAI,KAAK;AACP,WAAO,IAAI;AAAA,EACb;AAEA,QAAM,OAAO,MAAM,MAAM,WAAW;AACpC,MAAI,MAAM;AACR,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;AAgBO,SAAS,mBAGd,OAAc,QAAiD;AAC/D;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG,YAAY,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,EAClE;AACF;AAEO,SAAS,mBAKd,OACA,UACA,QACiC;AACjC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,QACJ,MAAM,MAAM,UAAU,MAAM,IAAI,QAAkB,KAClD,MAAM,MAAM,MAAM,IAAI,QAAkB;AAC1C,SAAO;AAAA,IACL,GAAG,YAAY,KAAsC;AAAA,EACvD;AACF;AAEA,SAAS,kBACJ,SACO;AACV,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAQ;AACb,eAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,WAAK,IAAI,GAAG;AAAA,IACd;AAAA,EACF;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;AAEO,SAAS,sBACd,OAGA;AACA,QAAM,UAAU;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,MAAM;AAAA,EACR;AACA,QAAM,SAA6C,CAAC;AACpD,aAAW,UAAU,SAAS;AAC5B,WAAO,MAAM,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAGT;AAEO,SAAS,sBAId,OACA,QAGA;AACA,QAAM,SAA6C,CAAC;AACpD,aAAW,YAAY,MAAM,aAAa;AACxC,WAAO,QAAQ,IAAI;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAGT;AAEO,SAAS,QAGd,OAAc,QAAiD;AAC/D,QAAM,OAAO;AAAA,IACX,MAAM,MAAM,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,EACnB;AACF;AAEO,SAAS,aAId,OACA,SAGC;AACD,SAAO,OAAO;AAAA,IACZ,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,EAC1D;AAGF;AAEO,SAAS,4BAId,OACA,QAIA;AACA,QAAM,UAAU,mBAAmB,OAAO,MAAM;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,WAAW,aAAa,OAAO,OAA0C;AAAA,EAC3E;AACF;AAEO,SAAS,4BAKd,OACA,UACA,QAIA;AACA,QAAM,UAAU,mBAAmB,OAAO,UAAU,MAAM;AAE1D,SAAO;AAAA,IACL;AAAA,IACA,WAAW,aAAa,OAAO,OAA0C;AAAA,EAC3E;AACF;AAUO,SAAS,iBACd,OACA,MACA,QACmC;AACnC,SAAO;AAAA,IAA+B;AAAA,IAAO,CAAC,aAC5C,gBAAgB,UAAU,MAAM,MAAM;AAAA,EACxC,EAAE,IAAI,CAAC,iBAAiB;AAAA,IACtB,SAAS;AAAA,IACT,UAAU;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA,MAAM,cAAc,OAAO,WAAwC;AAAA,EACrE,EAAE;AACJ;AAEO,SAAS,uBACd,OACA,MAC6D;AAC7D,QAAM,kBAAqE,CAAC;AAE5E;AAAA,IAA+B;AAAA,IAAO,CAAC,aACrC,gBAAgB,UAAU,IAAI;AAAA,EAChC,EAAE,QAAQ,CAAC,gBAAgB;AACzB,UAAM,WAAW,MAAM,mBAAmB,WAAW;AACrD,QAAI,CAAC,YAAY,CAAC,gBAAgB,UAAU,IAAI,GAAG;AACjD;AAAA,IACF;AAEA,UAAM,eAAgD;AAAA,MACpD,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,MAAM,cAAc,OAAO,WAAwC;AAAA,IACrE;AAEA,KAAC,gBAAgB,SAAS,MAAM,MAAM,CAAC,GAAG,KAAK,YAAY;AAAA,EAC7D,CAAC;AAED,SAAO;AACT;AAEO,SAAS,aAGd,OAAc,QAA8C;AAC5D,SAAO,MAAM,YAAY,MAAM;AACjC;AAEO,SAAS,kBAGd,OAAc,QAA6C;AAC3D,SAAO,MAAM,WAAW,MAAM;AAChC;;;AClWO,SAAS,6BACd,OACA,OACM;AACN,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,MAAM,GAAG,KAAK,uCAAuC;AAAA,EACjE;AACF;;;ACEO,SAAS,eACd,OACsB;AACtB,SAAO,MAAM;AACf;AAEO,SAAS,mBACd,OACA,UACgC;AAChC,SAAO,MAAM,UAAU,QAAQ;AACjC;AAMO,SAAS,wBACd,OACA,UACA,YACQ;AACR,QAAM,kBAAkB,MAAM,UAAU,QAAQ;AAChD,MAAI,CAAC,gBAAiB,QAAO;AAC7B,QAAM,QAAS,gBAA4C,UAAU;AACrE,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI;AAAA,MACR,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AACA,+BAA6B,OAAO,aAAa,UAAU,WAAW;AACtE,SAAO;AACT;AAMO,SAAS,uBACd,OACA,UACQ;AACR,QAAM,kBAAkB,MAAM,UAAU,QAAQ;AAChD,MAAI,CAAC,gBAAiB,QAAO;AAC7B,MAAI,QAAQ;AACZ,aAAW,OAAO,OAAO,KAAK,eAAe,GAAG;AAC9C,UAAM,QAAS,gBAA4C,GAAG;AAC9D,QAAI,UAAU,OAAW;AACzB,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,IAAI;AAAA,QACR,aAAa,GAAG;AAAA,MAClB;AAAA,IACF;AACA,iCAA6B,OAAO,aAAa,GAAG,WAAW;AAC/D,UAAM,YAAY,QAAQ;AAC1B,iCAA6B,WAAW,gBAAgB;AACxD,YAAQ;AAAA,EACV;AACA,SAAO;AACT;AAOO,SAAS,qBACd,OACA,UAC+B;AAC/B,QAAM,QAAQ,MAAM;AAGpB,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,MAAM,MAAM,QAAQ,QAAkC;AAC5D,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,OAAO,MAAM,KAAK,MAAM,MAAM,KAAK;AAC5C;AAMA,SAAS,gBACP,SACwC;AACxC,QAAM,UAA8B,CAAC;AACrC,aAAW,cAAc,OAAO,KAAK,OAAO,GAAG;AAC7C,UAAM,SAAS,QAAQ,UAAU;AACjC,QAAI,WAAW,UAAa,WAAW,EAAG;AAC1C,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI;AAAA,QACR,aAAa,UAAU;AAAA,MACzB;AAAA,IACF;AACA,iCAA6B,QAAQ,aAAa,UAAU,UAAU;AACtE,YAAQ,KAAK,CAAC,YAAY,MAAM,CAAC;AAAA,EACnC;AACA,SAAO;AACT;AAOO,SAAS,mBACd,OACA,UACA,SACS;AACT,aAAW,CAAC,YAAY,QAAQ,KAAK,gBAAgB,OAAO,GAAG;AAC7D,QAAI,wBAAwB,OAAO,UAAU,UAAU,IAAI,UAAU;AACnE,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,oBACd,OACA,UACA,SACwB;AACxB,QAAM,UAAkC,CAAC;AACzC,aAAW,CAAC,YAAY,QAAQ,KAAK,gBAAgB,OAAO,GAAG;AAC7D,UAAM,OAAO,wBAAwB,OAAO,UAAU,UAAU;AAChE,QAAI,OAAO,SAAU,SAAQ,UAAU,IAAI,WAAW;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,qBACP,OACA,UACA,eACM;AACN,QAAM,YAAY;AAAA,IAChB,GAAG,MAAM;AAAA,IACT,CAAC,QAAQ,GAAG;AAAA,EACd;AACF;AAEO,SAAS,0BACd,OACA,UACA,SACM;AACN,QAAM,OAAQ,MAAM,UAAU,QAAQ,KAAK,CAAC;AAC5C,QAAM,OAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,CAAC,YAAY,MAAM,KAAK,gBAAgB,OAAO,GAAG;AAC3D,UAAM,aACJ,wBAAwB,OAAO,UAAU,UAAU,IAAI;AACzD;AAAA,MACE;AAAA,MACA,aAAa,UAAU;AAAA,IACzB;AACA,SAAK,UAAU,IAAI;AAAA,EACrB;AACA,uBAAqB,OAAO,UAAU,IAAI;AAC5C;AAEO,SAAS,4BACd,OACA,UACA,SACM;AACN,QAAM,UAAU,gBAAgB,OAAO;AACvC,MAAI,CAAC,mBAAmB,OAAO,UAAU,OAAO,GAAG;AACjD,UAAM,UAAU,oBAAoB,OAAO,UAAU,OAAO;AAC5D,UAAM,IAAI;AAAA,MACR,iCAAiC,QAAQ,mBAAmB,KAAK;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,OAAQ,MAAM,UAAU,QAAQ,KAAK,CAAC;AAC5C,QAAM,OAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,CAAC,YAAY,MAAM,KAAK,SAAS;AAC1C,UAAM,aACJ,wBAAwB,OAAO,UAAU,UAAU,IAAI;AACzD;AAAA,MACE;AAAA,MACA,aAAa,UAAU;AAAA,IACzB;AACA,SAAK,UAAU,IAAI;AAAA,EACrB;AACA,uBAAqB,OAAO,UAAU,IAAI;AAC5C;AAEO,SAAS,+BAGd,OACA,cACA,YACA,SACM;AACN,QAAM,UAAU,gBAAgB,OAAO;AACvC,MAAI,CAAC,mBAAmB,OAAO,cAAc,OAAO,GAAG;AACrD,UAAM,UAAU,oBAAoB,OAAO,cAAc,OAAO;AAChE,UAAM,IAAI;AAAA,MACR,iCAAiC,YAAY,mBAAmB,KAAK;AAAA,QACnE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,iBAAiB,WAAY;AAEjC,QAAM,WAAY,MAAM,UAAU,YAAY,KAAK,CAAC;AAIpD,QAAM,SAAU,MAAM,UAAU,UAAU,KAAK,CAAC;AAChD,QAAM,WAAmC,EAAE,GAAG,SAAS;AACvD,QAAM,SAAiC,EAAE,GAAG,OAAO;AAEnD,aAAW,CAAC,YAAY,MAAM,KAAK,SAAS;AAC1C,UAAM,gBACJ,wBAAwB,OAAO,cAAc,UAAU,IAAI;AAC7D,UAAM,qBACJ,wBAAwB,OAAO,YAAY,UAAU,IAAI;AAC3D;AAAA,MACE;AAAA,MACA,aAAa,UAAU;AAAA,IACzB;AACA;AAAA,MACE;AAAA,MACA,aAAa,UAAU;AAAA,IACzB;AACA,aAAS,UAAU,IAAI;AACvB,WAAO,UAAU,IAAI;AAAA,EACvB;AAEA,uBAAqB,OAAO,cAAc,QAAQ;AAClD,uBAAqB,OAAO,YAAY,MAAM;AAChD;AAEO,SAAS,yBACd,OACA,UACA,YACA,QACM;AACN,+BAA6B,QAAQ,aAAa,UAAU,UAAU;AACtE,QAAM,OAAQ,MAAM,UAAU,QAAQ,KAAK,CAAC;AAC5C,uBAAqB,OAAO,UAAU;AAAA,IACpC,GAAG;AAAA,IACH,CAAC,UAAU,GAAG;AAAA,EAChB,CAAC;AACH;;;ACxOA,SAAS,sBAIP,OAAc,SAAkB,SAAwB;AACxD,uBAAqB,OAAO,SAAS,OAAO,EAAE;AAAA,IAC5C,CAAC,aAAa,UAAU;AACtB,YAAM,WAAW,MAAM,mBAAmB,WAAW;AACrD,UAAI,UAAU,SAAS,WAAW;AAChC,cAAM,mBAAmB,WAAW,IAAI;AAAA,UACtC,GAAG;AAAA,UACH,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BAIP,OAAc,SAAkB,aAAgC;AAChE,2BAAyB,OAAO,SAAS,WAAW,EAAE;AAAA,IACpD,CAAC,aAAa,UAAU;AACtB,YAAM,WAAW,MAAM,mBAAmB,WAAW;AACrD,UAAI,UAAU,SAAS,eAAe;AACpC,cAAM,mBAAmB,WAAW,IAAI;AAAA,UACtC,GAAG;AAAA,UACH,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAIP,OAAc,SAAkB,QAAsB;AACtD;AAAA,IACE;AAAA,IACA,CAAC,aACC,SAAS,SAAS,YAClB,SAAS,YAAY,WACrB,SAAS,WAAW;AAAA,EACxB,EAAE,QAAQ,CAAC,aAAa,UAAU;AAChC,UAAM,WAAW,MAAM,mBAAmB,WAAW;AACrD,QAAI,UAAU,SAAS,UAAU;AAC/B,YAAM,mBAAmB,WAAW,IAAI;AAAA,QACtC,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBAIP,OAAc,SAAkB,UAA0B;AAC1D;AAAA,IACE;AAAA,IACA,CAAC,aACC,SAAS,SAAS,cAClB,SAAS,YAAY,WACrB,SAAS,aAAa;AAAA,EAC1B,EAAE,QAAQ,CAAC,aAAa,UAAU;AAChC,UAAM,WAAW,MAAM,mBAAmB,WAAW;AACrD,QAAI,UAAU,SAAS,YAAY;AACjC,YAAM,mBAAmB,WAAW,IAAI;AAAA,QACtC,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBACP,OACA,MACA,QACM;AACN;AAAA,IACE;AAAA,IACA,CAAC,aACC,SAAS,SAAS,YAClB,SAAS,KAAK,SAAS,KAAK,QAC5B,SAAS,KAAK,OAAO,KAAK,MAC1B,SAAS,WAAW;AAAA,EACxB,EAAE,QAAQ,CAAC,aAAa,UAAU;AAChC,UAAM,WAAW,MAAM,mBAAmB,WAAW;AACrD,QAAI,UAAU,SAAS,UAAU;AAC/B,YAAM,mBAAmB,WAAW,IAAI;AAAA,QACtC,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,mCAGP,OAAc,aAAgC;AAC9C,QAAM,kBAAkB,MAAM,mBAAmB,WAAW;AAC5D,MAAI,CAAC,iBAAiB;AACpB;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,UAAU;AACrC,UAAM,YAAY,YAAY,MAAM,MAAM,gBAAgB,MAAM,CAAC,EAAE;AAAA,MACjE,CAAC,cAAc,cAAc;AAAA,IAC/B;AACA;AAAA,MACE;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,IACF;AACA,cAAU,QAAQ,CAAC,QAAQ,UAAU;AACnC,YAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,UAAI,UAAU,SAAS,UAAU;AAC/B,cAAM,mBAAmB,MAAM,IAAI;AAAA,UACjC,GAAG;AAAA,UACH,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,UAAU;AACrC,UAAM,YAAY;AAAA,MAChB,MAAM,MAAM,gBAAgB,MAAM,IAAI,gBAAgB,QAAQ;AAAA,IAChE,EAAE,OAAO,CAAC,cAAc,cAAc,WAAW;AACjD;AAAA,MACE;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB;AAAA,IACF;AACA,cAAU,QAAQ,CAAC,QAAQ,UAAU;AACnC,YAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,UAAI,UAAU,SAAS,UAAU;AAC/B,cAAM,mBAAmB,MAAM,IAAI;AAAA,UACjC,GAAG;AAAA,UACH,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,WAAW;AACtC,WAAO,MAAM,mBAAmB,WAAW;AAC3C;AAAA,MACE;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AACA;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,UAAU;AACrC,QAAI,gBAAgB,UAAU,MAAM,MAAM,QAAQ;AAChD,YAAM,iBAAiB;AAAA,QACrB,MAAM,MAAM,OAAO,gBAAgB,MAAM;AAAA,MAC3C,EAAE,OAAO,CAAC,cAAc,cAAc,WAAW;AACjD;AAAA,QACE;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,MACF;AACA,qBAAe,QAAQ,CAAC,oBAAoB,UAAU;AACpD,cAAM,WAAW,MAAM,mBAAmB,kBAAkB;AAC5D,YAAI,UAAU,SAAS,UAAU;AAC/B,gBAAM,mBAAmB,kBAAkB,IAAI;AAAA,YAC7C,GAAG;AAAA,YACH,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,MAAM,mBAAmB,WAAW;AAC3C;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,eAAe;AAC1C,WAAO,MAAM,mBAAmB,WAAW;AAC3C;AAAA,MACE;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAIlB;AACA;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,UAAU;AACrC,WAAO,MAAM,mBAAmB,WAAW;AAC3C;AAAA,MACE;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAIlB;AACA;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,YAAY;AACvC,WAAO,MAAM,mBAAmB,WAAW;AAC3C;AAAA,MACE;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAIlB;AACA;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,UAAU;AACrC,WAAO,MAAM,mBAAmB,WAAW;AAC3C,yBAAqB,OAAO,gBAAgB,MAAM,gBAAgB,MAAM;AACxE;AAAA,EACF;AAEA,SAAO,MAAM,mBAAmB,WAAW;AAC7C;AAEO,SAAS,4BAMd,OACA,aACA,SACA,SACM;AACN,QAAM,WAAW,qBAAqB,OAAO,SAAS,OAAO,EAAE;AAC/D,qCAAmC,OAAO,WAAW;AACrD,QAAM,mBAAmB,WAAW,IAAI;AAAA,IACtC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gCAMd,OACA,aACA,SACA,aACM;AACN,+BAA6B,OAAO,SAAS,aAAa,WAAW;AACrE,QAAM,WAAW,yBAAyB,OAAO,SAAS,WAAW,EAAE;AACvE,qCAAmC,OAAO,WAAW;AACrD,QAAM,mBAAmB,WAAW,IAAI;AAAA,IACtC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,+BAGd,OAAc,aAAgC;AAC9C,qCAAmC,OAAO,WAAW;AACrD,QAAM,mBAAmB,WAAW,IAAI,EAAE,MAAM,WAAW;AAC7D;AAEO,SAAS,2BAMd,OACA,aACA,SACA,QACM;AACN,UAAQ,OAAO,SAAS,MAAM;AAC9B,QAAM,WAAW,oBAAoB,OAAO,SAAS,MAAM,EAAE;AAC7D,qCAAmC,OAAO,WAAW;AACrD,QAAM,mBAAmB,WAAW,IAAI;AAAA,IACtC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,6BAMd,OACA,aACA,SACA,UACM;AACN,YAAU,OAAO,SAAS,QAAQ;AAClC,QAAM,WAAW,sBAAsB,OAAO,SAAS,QAAQ,EAAE;AACjE,qCAAmC,OAAO,WAAW;AACrD,QAAM,mBAAmB,WAAW,IAAI;AAAA,IACtC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvVA,SAAS,gBACP,OACA,QACU;AACV,SAAO,CAAC,GAAG,YAAY,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC;AAC3E;AAEA,SAAS,gBACP,OACA,QACA,UACU;AACV,SAAO;AAAA,IACL,GAAG;AAAA,OACA,MAAM,MAAM,UAAU,MAAM,KAAK,MAAM,MAAM,MAAM,KAAK,QAAQ;AAAA,IAEnE;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,QACA,QACM;AACN,MAAI,CAAC,gBAAgB,OAAO,MAAM,EAAE,SAAS,MAAM,GAAG;AACpD,UAAM,IAAI,MAAM,SAAS,MAAM,4BAA4B,MAAM,IAAI;AAAA,EACvE;AAEA,QAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,MAAI,UAAU,SAAS,YAAY,SAAS,WAAW,QAAQ;AAC7D,UAAM,IAAI;AAAA,MACR,SAAS,MAAM,qDAAqD,MAAM;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,QACA,UACA,QACM;AACN,MAAI,CAAC,gBAAgB,OAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM,GAAG;AAC9D,UAAM,IAAI;AAAA,MACR,SAAS,MAAM,qBAAqB,MAAM,iBAAiB,QAAQ;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,MACE,UAAU,SAAS,YACnB,SAAS,WAAW,UACpB,SAAS,aAAa,UACtB;AACA,UAAM,IAAI;AAAA,MACR,SAAS,MAAM,8CAA8C,MAAM,iBAAiB,QAAQ;AAAA,IAC9F;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAA2B,QAAsB;AAC3E,QAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,MAAI,UAAU,SAAS,YAAY;AACjC,UAAM,IAAI,MAAM,SAAS,MAAM,sCAAsC;AAAA,EACvE;AACF;AAEA,SAAS,+BACP,OACA,QACA,QACM;AACN,MAAI,gBAAgB,OAAO,MAAM,EAAE,SAAS,MAAM,GAAG;AACnD,UAAM,IAAI,MAAM,SAAS,MAAM,gCAAgC,MAAM,IAAI;AAAA,EAC3E;AACF;AAEA,SAAS,+BACP,OACA,QACA,UACA,QACM;AACN,MAAI,gBAAgB,OAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM,GAAG;AAC7D,UAAM,IAAI;AAAA,MACR,SAAS,MAAM,yBAAyB,MAAM,iBAAiB,QAAQ;AAAA,IACzE;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,QACA,SACA,iBACM;AACN,aAAW,CAAC,OAAO,aAAa,KAAK,QAAQ,QAAQ,GAAG;AACtD,UAAM,WAAW,MAAM,mBAAmB,aAAa;AACvD,UAAM,mBAAmB,aAAa,IAAI;AAAA,MACxC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UACE,kBAAkB,aAAa,MAC9B,UAAU,SAAS,WAAW,SAAS,WAAW;AAAA,MACrD,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,uBACP,OACA,QACA,UACA,SACM;AACN,aAAW,CAAC,OAAO,aAAa,KAAK,QAAQ,QAAQ,GAAG;AACtD,UAAM,mBAAmB,aAAa,IAAI;AAAA,MACxC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,WACP,SACA,QACA,WAA6B,UACnB;AACV,SAAO,aAAa,QAAQ,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC,GAAG,SAAS,MAAM;AACxE;AAEA,SAAS,WAAW,SAA4B,QAA0B;AACxE,SAAO,QAAQ,OAAO,CAAC,cAAc,cAAc,MAAM;AAC3D;AAEA,SAAS,wCAIP,OACA,QACA,QACA,UACA,WAA6B,UACvB;AACN,QAAM,YAAY;AAAA,IAChB,gBAAgB,OAAO,MAAgB;AAAA,IACvC;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,yBAAuB,OAAO,QAAkB,WAAW;AAAA,IACzD,CAAC,MAAM,GAAG;AAAA,EACZ,CAAC;AACH;AAEA,SAAS,0CAGP,OAAc,QAAgB,QAAsB;AACpD,QAAM,YAAY;AAAA,IAChB,gBAAgB,OAAO,MAAgB;AAAA,IACvC;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,yBAAuB,OAAO,QAAkB,SAAS;AAC3D;AAEA,SAAS,0BAKP,OACA,QACA,UACA,SACM;AACN,yBAAuB,OAAO,QAAQ,UAAU,OAAO;AACvD,yBAAuB,OAAO,QAAkB,UAAoB,OAAO;AAC7E;AAUO,SAAS,uBACd,OACA,QACA,UACA,WACU;AACV,MAAI,cAAc,QAAW;AAC3B,UAAM,YAAY,MAAM,MAAM,UAAU,MAAM,KAAK,MAAM,MAAM,MAAM,KACnE,QACF;AACA,WAAO,CAAC,GAAG,YAAY,QAAQ,CAAC;AAAA,EAClC;AACA,QAAM,MAAM,MAAM,IAAI;AAAA,IACpB,GAAG,MAAM,MAAM,MAAM;AAAA,IACrB,CAAC,QAAQ,GAAG,CAAC,GAAG,SAAS;AAAA,EAC3B;AACA,QAAM,MAAM,UAAU,MAAM,IAAI;AAAA,IAC9B,GAAG,MAAM,MAAM,UAAU,MAAM;AAAA,IAC/B,CAAC,QAAQ,GAAG,CAAC,GAAG,SAAS;AAAA,EAC3B;AACA,SAAO,CAAC,GAAG,SAAS;AACtB;AAEO,SAAS,oBAId,OACA,QACA,QACA,WAA0C,MAC1C,WAA6B,UACvB;AACN;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,qBAAmB,OAAO,MAAgB;AAC1C,iCAA+B,OAAO,QAAkB,MAAgB;AACxE,0BAAwB,OAAO,QAAQ,MAAM;AAC7C;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,YAAY,MAAM,IAAI;AAC5B,QAAM,WAAW,MAAM,IAAI;AAAA,IACzB,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,sBAId,OACA,QACA,QACM;AACN;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,yBAAuB,OAAO,QAAkB,MAAgB;AAChE,4CAA0C,OAAO,QAAQ,MAAgB;AACzE,QAAM,mBAAmB,MAAgB,IAAI,EAAE,MAAM,WAAW;AAClE;AAEA,SAAS,+BACP,OACA,QACA,UAC2C;AAC3C,QAAM,OAAO,MAAM,eAAe,MAAM;AACxC,MAAI,SAAS,SAAS,SAAS,UAAU;AACvC,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AACA,SAAO,EAAE,QAAQ,OAAO,WAAW,CAAC,QAAQ,EAAE;AAChD;AAEA,SAAS,0BAKP,SAQO;AACP;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,QAAM,cAAc;AAAA,IAClB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,WAAW,WAAW,aAAa,QAAQ,MAAgB;AACjE;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACP,QAAQ,YAAY,QAAQ;AAAA,IAC7B,QAAQ,YAAY;AAAA,EACtB;AACA,UAAQ,MAAM,YAAY,QAAQ,MAAM,IACtC,QAAQ,YAAY,QAAQ;AAC9B,UAAQ,MAAM,WAAW,QAAQ,MAAM,IAAI;AAAA,IACzC,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,0CAKd,SAQO;AACP,4BAA0B;AAAA,IACxB,OAAO,QAAQ;AAAA,IACf,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;AAEO,SAAS,mCAKd,SAMO;AACP,+BAA6B,QAAQ,OAAO,YAAY;AACxD,MAAI,QAAQ,UAAU,EAAG;AACzB;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAK,QAAQ,eAA2B,QAAQ,UAAqB;AACnE,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,QAAM,cAAc;AAAA,IAClB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,gBAAgB,YAAY,MAAM,GAAG,QAAQ,KAAK;AACxD,QAAM,mBAAmB;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,aAAW,UAAU,eAAe;AAClC;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AACA,4BAAwB,QAAQ,OAAO,QAAQ,UAAoB,MAAM;AAAA,EAC3E;AAEA,QAAM,kBAAkB,YAAY,MAAM,cAAc,MAAM;AAC9D,QAAM,kBAAkB,CAAC,GAAG,kBAAkB,GAAG,aAAa;AAC9D;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA,aAAW,UAAU,eAAe;AAClC,YAAQ,MAAM,WAAW,MAAM,IAAI;AAAA,MACjC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,0CAKd,SAOO;AACP;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,QAAM,mBAAmB;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,YAAY;AAAA,EACtB;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA,UAAQ,MAAM,YAAY,QAAQ,MAAgB,IAChD,QAAQ;AACV,UAAQ,MAAM,WAAW,QAAQ,MAAgB,IAC/C;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACJ;AAEO,SAAS,kCAKd,SAOO;AACP;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,QAAM,cAAc;AAAA,IAClB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,mBAAmB;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,QAAM,kBAAkB,WAAW,aAAa,QAAQ,MAAgB;AACxE,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ,YAAY;AAAA,EACtB;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,EACF;AACA,UAAQ,MAAM,WAAW,QAAQ,MAAgB,IAC/C;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACJ;AAEO,SAAS,kCAId,SAOO;AACP;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACP,QAAQ,YAAY;AAAA,IACrB,QAAQ,YAAY;AAAA,EACtB;AACA,UAAQ,MAAM,YAAY,QAAQ,MAAgB,IAChD,QAAQ,YAAY;AACtB,UAAQ,MAAM,WAAW,QAAQ,MAAgB,IAAI;AAAA,IACnD,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,gCAId,OACA,QACA,QACM;AACN,wBAAsB,OAAO,QAAQ,MAAM;AAC7C;AAEO,SAAS,2BAId,OACA,QACA,QACA,WAA0C,MAC1C,WAA6B,UACvB;AACN,sBAAoB,OAAO,QAAQ,QAAQ,UAAU,QAAQ;AAC/D;AAEO,SAAS,+BAMd,OACA,YACA,UACA,UACA,OACM;AACN,+BAA6B,OAAO,YAAY;AAChD,MAAI,UAAU,EAAG;AACjB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc,gBAAgB,OAAO,UAAoB;AAC/D,QAAM,gBAAgB,YAAY,MAAM,GAAG,KAAK;AAChD,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,UAAU,eAAe;AAClC,2BAAuB,OAAO,YAAsB,MAAM;AAC1D;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,4BAAwB,OAAO,UAAoB,MAAM;AAAA,EAC3D;AAEA,QAAM,kBAAkB,YAAY,MAAM,cAAc,MAAM;AAC9D,QAAM,WAAW,CAAC,GAAG,kBAAkB,GAAG,aAAa;AACvD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,yBAAuB,OAAO,YAAsB,eAAe;AACnE,4BAA0B,OAAO,UAAU,UAAU,QAAQ;AAE7D,aAAW,UAAU,eAAe;AAClC,UAAM,YAAY,MAAM,IAAI;AAC5B,UAAM,WAAW,MAAM,IAAI;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC/uBO,SAAS,mBACd,OACqB;AACrB,SAAO;AAAA,IACL,OAAO,CAAwC,YAC7C,iBAAiB,OAAO,OAAO;AAAA,IACjC,MAAM;AAAA,MACJ,aAAa,CAAsC,WACjD,mBAAmB,OAAO,MAAM;AAAA,MAClC,sBAAsB,CACpB,WACG,4BAA4B,OAAO,MAAM;AAAA,MAC9C,gBAAgB,MAAM,sBAAsB,KAAK;AAAA,MACjD,aAAa,CAIX,UACA,WACG,mBAAmB,OAAO,UAAU,MAAM;AAAA,MAC/C,sBAAsB,CAIpB,UACA,WACG,4BAA4B,OAAO,UAAU,MAAM;AAAA,MACxD,gBAAgB,CAAsC,WACpD,sBAAsB,OAAO,MAAM;AAAA,IACvC;AAAA,IACA,MAAM;AAAA,MACJ,KAAK,CAAsC,WACzC,QAAQ,OAAO,MAAM;AAAA,MACvB,OAAO,CACL,YACG,aAAa,OAAO,OAAO;AAAA,MAChC,OAAO,CAAsC,WAC3C,aAAa,OAAO,MAAM;AAAA,MAC5B,YAAY,CAAsC,WAChD,kBAAkB,OAAO,MAAM;AAAA,IACnC;AAAA,IACA,MAAM;AAAA,MACJ,WAAW,CAAC,MAAM,WAAW,iBAAiB,OAAO,MAAM,MAAM;AAAA,MACjE,iBAAiB,CAAC,SAAS,uBAAuB,OAAO,IAAI;AAAA,MAC7D,gBAAgB,CAAC,QAAQ,WACvB,iBAAiB,OAAO,EAAE,MAAM,SAAS,IAAI,OAAO,GAAG,MAAM;AAAA,MAC/D,sBAAsB,CAAC,WACrB,uBAAuB,OAAO,EAAE,MAAM,SAAS,IAAI,OAAO,CAAC;AAAA,MAC7D,cAAc,CAAC,QAAQ,WACrB,iBAAiB,OAAO,EAAE,MAAM,OAAO,IAAI,OAAO,GAAG,MAAM;AAAA,MAC7D,oBAAoB,CAAC,WACnB,uBAAuB,OAAO,EAAE,MAAM,OAAO,IAAI,OAAO,CAAC;AAAA,IAC7D;AAAA,IACA,QAAQ;AAAA,MACN,OAAO,MAAM,eAAe,KAAK;AAAA,MACjC,aAAa,CAAC,aAAa,qBAAqB,OAAO,QAAQ;AAAA,MAC/D,WAAW,CAAC,aAAa,mBAAmB,OAAO,QAAQ;AAAA,MAC3D,UAAU,CAAC,UAAU,eACnB,wBAAwB,OAAO,UAAU,UAAU;AAAA,MACrD,eAAe,CAAC,aAAa,uBAAuB,OAAO,QAAQ;AAAA,MACnE,WAAW,CAAC,UAAU,YACpB,mBAAmB,OAAO,UAAU,OAAO;AAAA,MAC7C,kBAAkB,CAAC,UAAU,YAC3B,oBAAoB,OAAO,UAAU,OAAO;AAAA,IAChD;AAAA,IACA,WAAW;AAAA,MACT,MAAM,CACJ,gBAEA;AAAA,QACE,MAAM,MAAM,WAAW,KACrB,MAAM,OAAO,WAAW,KACxB,MAAM,KAAK,WAAW;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAAA,MACF,UAAU,CACR,gBACG,qBAAqB,OAAO,WAAW;AAAA,MAC5C,MAAM,CACJ,gBACG,yBAAyB,OAAO,WAAW;AAAA,MAChD,MAAM,CACJ,gBACG,yBAAyB,OAAO,WAAW;AAAA,MAChD,MAAM,CACJ,gBACG,yBAAyB,OAAO,WAAW;AAAA,MAChD,OAAO,CACL,gBACG,0BAA0B,OAAO,WAAW;AAAA,MACjD,WAAW,CACT,gBACG,8BAA8B,OAAO,WAAW;AAAA,MACrD,MAAM,CACJ,gBACG,yBAAyB,OAAO,WAAW;AAAA,MAChD,QAAQ,CACN,gBACG,2BAA2B,OAAO,WAAW;AAAA,MAClD,MAAM,CACJ,gBACG,yBAAyB,OAAO,WAAW;AAAA,IAClD;AAAA,EACF;AACF;AAEO,SAAS,mBACd,OAC4B;AAC5B,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;;;ACtFA,SAAS,eAKP,YAMA;AAIA,SAAO,OAAO,QAAQ,WAAW,MAAM;AAGzC;AAEA,SAAS,qBACP,OACiD;AACjD,SAAO,OAAO;AAAA,IACX,MAAqD,gBAAgB,CAAC;AAAA,EACzE;AACF;AAEA,SAAS,4BACP,OACiD;AACjD,QAAM,SAAU,MAA+B;AAC/C,MAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,SAAO;AAAA,IACL,CAAC,UAAU,MAAM;AAAA,EACnB;AACF;AAEO,SAAS,8BAKd,YACqD;AAKrD,QAAM,eAAe,eAAe,UAAU;AAC9C,QAAM,eAAe,oBAAI,IAGvB;AAEF,aAAW,CAAC,WAAW,KAAK,KAAK,cAAc;AAC7C,UAAM,qBAAqB;AAAA,MACzB,GAAG,qBAAqB,KAAK;AAAA,MAC7B,GAAG,4BAA4B,KAAK;AAAA,IACtC;AACA,iBAAa,IAAI,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AC9IA,SAAS,KAAAC,UAAS;;;ACCX,SAAS,YACd,OACA,OACQ;AACR,QAAM,OAAO,MAAM,KAChB;AAAA,IAAI,CAAC,YACJ,OAAO,YAAY,WAAW,QAAQ,SAAS,IAAI,OAAO,OAAO;AAAA,EACnE,EACC,KAAK,GAAG;AACX,SAAO,GAAG,QAAQ,KAAK,KAAK,MAAM,OAAO;AAC3C;AAEO,SAAS,iBACd,QACA,OACA,OACkB;AAClB,QAAM,SAAS,OAAO,UAAU,KAAK;AACrC,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,UAAU,OAAO,MAAM,OAC1B,IAAI,CAAC,UAAU,YAAY,OAAO,KAAK,CAAC,EACxC,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,WAAW,WAAW,KAAK,EAAE;AAAA,EAC/C;AACA,SAAO,OAAO;AAChB;;;AC3BA,SAAS,KAAAC,UAAS;;;ACiBX,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAMpB;AAgBA,SAAS,UACP,MACA,OACA,QACqB;AACrB,SAAO,IAAI,oBAAoB,MAAM,GAAG,KAAK,IAAI,MAAM,GAAG;AAC5D;AAEA,SAAS,mBACP,OACA,OACyB;AACzB,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,MAAI,cAAc,OAAO,aAAa,cAAc,MAAM;AACxD,UAAM,UAAU,YAAY,OAAO,6BAA6B;AAAA,EAClE;AACA,SAAO;AACT;AAEO,SAAS,uBACd,MACA,QACA,OACM;AACN,QAAM,QAAkD;AAAA,IACtD,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,EAC1B;AACA,QAAM,OAAO,oBAAI,QAAgB;AACjC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,QAAQ;AACZ,MAAI,cAAc;AAClB,MAAI,oBAAoB;AAExB,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,OAAO,MAAM,IAAI;AACvB,QAAI,CAAC,KAAM;AACX,UAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,aAAS;AACT,QAAI,QAAQ,OAAO,UAAU;AAC3B,YAAM,UAAU,SAAS,OAAO,wBAAwB;AAAA,IAC1D;AACA,QAAI,QAAQ,OAAO,UAAU;AAC3B,YAAM,UAAU,SAAS,OAAO,yBAAyB;AAAA,IAC3D;AAEA,YAAQ,OAAO,OAAO;AAAA,MACpB,KAAK;AACH,uBAAe,QAAQ,OAAO,KAAK,EAAE;AACrC,YAAI,cAAc,OAAO,gBAAgB;AACvC,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,YAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,gBAAM,UAAU,YAAY,OAAO,8BAA8B;AAAA,QACnE;AACA;AAAA,MACF,KAAK;AACH;AAAA,MACF,KAAK;AACH,YAAI,UAAU,KAAM;AACpB;AAAA,MACF;AACE,cAAM,UAAU,YAAY,OAAO,2BAA2B;AAAA,IAClE;AAEA,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,YAAM,UAAU,SAAS,OAAO,kBAAkB;AAAA,IACpD;AACA,SAAK,IAAI,KAAK;AAEd,UAAM,WAAW,MAAM,QAAQ,KAAK,IAChC,QACA,OAAO,OAAO,mBAAmB,OAAO,KAAK,CAAC;AAClD,yBAAqB,SAAS;AAC9B,QAAI,oBAAoB,OAAO,sBAAsB;AACnD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,eAAW,SAAS,UAAU;AAC5B,YAAM,KAAK,EAAE,OAAO,OAAO,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC/C;AAAA,EACF;AACF;;;AD5HO,IAAM,uBAAuBC,GAAE,WAAW,CAAC,UAAU;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC;AAAA,IACE;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT,GAAG,iBAAiB;;;AEhBb,SAAS,yBACd,gBACwC;AACxC,SAAO,CAAC,aAAsB;AAC5B,UAAM,QAAQ;AAAA,MACA;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACA,UAAM,WAAW;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACzBA,SAAS,KAAAC,UAAS;AAalB,SAAS,sBACP,YACsB;AACtB,QAAM,UAAU,IAAI,IAAI,UAAU;AAClC,SAAOA,GAAE;AAAA,IACP,CAAC,UACC,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAkB;AAAA,IAC7D,EAAE,SAAS,qBAAqB;AAAA,EAClC;AACF;AAEO,SAAS,2BAKd,YAcA;AAEA,QAAM,eAAe,OAAO,QAAQ,WAAW,MAAM;AAUrD,QAAM,aAAa,aAAa,IAAI,CAAC,CAAC,SAAS,MAAM,SAAS;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,iBAAiB,sBAAsB,UAAU;AAAA,EACnD;AACF;;;ALpCA,IAAM,sBAAsBC,GAAE,OAAOA,GAAE,OAAO,GAAG,oBAAoB;AACrE,IAAM,iCAAiCA,GAAE,mBAAmB,QAAQ;AAAA,EAClEA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,UAAU,EAAE,CAAC,EAAE,OAAO;AAAA,EACjDA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,QAAQA,GAAE,OAAO;AAAA,IACjB,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,QAAQA,GAAE,OAAO;AAAA,IACjB,UAAUA,GAAE,OAAO;AAAA,IACnB,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,QAAQA,GAAE,OAAO;AAAA,IACjB,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IACzC,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,SAAS;AAAA,IACzB,SAASA,GAAE,OAAO;AAAA,IAClB,SAASA,GAAE,OAAO;AAAA,IAClB,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,aAAa;AAAA,IAC7B,SAASA,GAAE,OAAO;AAAA,IAClB,aAAaA,GAAE,OAAO;AAAA,IACtB,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,SAASA,GAAE,OAAO;AAAA,IAClB,QAAQA,GAAE,OAAO;AAAA,IACjB,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,UAAU;AAAA,IAC1B,SAASA,GAAE,OAAO;AAAA,IAClB,UAAUA,GAAE,OAAO;AAAA,IACnB,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,MAAMA,GAAE,QAAQ,QAAQ;AAAA,IACxB,MAAMA,GAAE,MAAM;AAAA,MACZA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,OAAO,GAAG,IAAIA,GAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,MAC9DA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,KAAK,GAAG,IAAIA,GAAE,OAAO,EAAE,CAAC,EAAE,OAAO;AAAA,IAC9D,CAAC;AAAA,IACD,QAAQA,GAAE,OAAO;AAAA,IACjB,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,CAAC,EACA,OAAO;AACZ,CAAC;AACD,IAAM,4BAA4BA,GAC/B,OAAO;AAAA,EACN,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC/B,OAAOA,GACJ,OAAO;AAAA,IACN,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC;AAAA,IAChD,WAAWA,GAAE;AAAA,MACXA,GAAE,OAAO;AAAA,MACTA,GAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC;AAAA,IACjD;AAAA,IACA,YAAYA,GAAE;AAAA,MACZA,GAAE,OAAO;AAAA,MACTA,GAAE,KAAK,CAAC,OAAO,aAAa,UAAU,QAAQ,CAAC;AAAA,IACjD;AAAA,IACA,oBAAoBA,GACjB,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,EACtC,SAAS;AAAA,EACd,CAAC,EACA,OAAO;AAAA,EACV,OAAOA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC;AAAA,EAC/C,OAAOA,GAAE;AAAA,IACPA,GAAE,OAAO;AAAA,IACTA,GAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC;AAAA,EACjD;AAAA,EACA,gBAAgBA,GAAE;AAAA,IAChBA,GAAE,OAAO;AAAA,IACTA,GAAE,KAAK,CAAC,OAAO,aAAa,UAAU,QAAQ,CAAC;AAAA,EACjD;AAAA,EACA,OAAOA,GAAE;AAAA,IACPA,GAAE,OAAO;AAAA,IACTA,GACG,OAAO;AAAA,MACN,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACnC,IAAIA,GAAE,OAAO;AAAA,MACb,WAAWA,GAAE,OAAO;AAAA,MACpB,UAAUA,GAAE,OAAO;AAAA,MACnB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,YAAY;AAAA,IACd,CAAC,EACA,OAAO;AAAA,EACZ;AAAA,EACA,QAAQA,GAAE;AAAA,IACRA,GAAE,OAAO;AAAA,IACTA,GACG,OAAO;AAAA,MACN,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACnC,IAAIA,GAAE,OAAO;AAAA,MACb,aAAaA,GAAE,OAAO;AAAA,MACtB,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MAC1C,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MACxC,YAAY;AAAA,IACd,CAAC,EACA,OAAO;AAAA,EACZ;AAAA,EACA,oBAAoBA,GAAE,OAAOA,GAAE,OAAO,GAAG,8BAA8B;AAAA,EACvE,aAAaA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,SAAS,CAAC;AAAA,EACvD,YAAYA,GAAE;AAAA,IACZA,GAAE,OAAO;AAAA,IACTA,GACG,OAAO;AAAA,MACN,QAAQA,GAAE,QAAQ;AAAA,MAClB,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,IACrD,CAAC,EACA,OAAO;AAAA,EACZ;AAAA,EACA,WAAWA,GAAE,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,GAAG,mBAAmB;AAAA,EAC1D,QAAQA,GACL,OAAO;AAAA,IACN,MAAMA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB;AAAA,IAC9C,KAAKA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB;AAAA,IAC7C,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB;AAAA,IAChD,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAAA,IAC5D,OAAOA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB,EAAE,SAAS;AAAA,EAC5D,CAAC,EACA,OAAO;AAAA,EACV,MAAMA,GAAE;AAAA,IACNA,GAAE,OAAO;AAAA,IACTA,GACG,OAAO;AAAA,MACN,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACnC,IAAIA,GAAE,OAAO;AAAA,MACb,WAAWA,GAAE,OAAO;AAAA,MACpB,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MACxC,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,MACxC,OAAOA,GAAE,OAAO,EAAE,IAAI;AAAA,MACtB,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,MAC5C,YAAY;AAAA,IACd,CAAC,EACA,OAAO;AAAA,EACZ;AACF,CAAC,EACA,OAAO;AAEH,SAAS,0BAKd,YAQA;AAeA,QAAM,EAAE,gBAAgB,IAAI,2BAA2B,UAAU;AACjE,QAAM,kBAAkB,8BAA8B,UAAU;AAChE,QAAM,iBAAiB,WAAW,SAAS,SAAS,IACjD;AAEH,QAAM,aAAaA,GAAE,OAAO;AAAA,IAC1B,cAAc;AAAA,IACd,MAAMA,GAAE,OAAO,EAAE,IAAI;AAAA,IACrB,OAAOA,GAAE,OAAO,EAAE,IAAI;AAAA,IACtB,eAAeA,GAAE,MAAM,cAAc;AAAA,EACvC,CAAC;AACD,WAAS,aAAa,YAAkD;AACtE,UAAM,YAAY,oBAAoB,MAAM,UAAU;AACtD,UAAM,SAAS;AAAA,MACb,WAAW,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,WAAO,oBAAoB,MAAM,MAAM;AAAA,EACzC;AACA,QAAM,qBAAqBA,GAAE,OAAO;AAAA,IAClC,QAAQA,GAAE,MAAkB,eAAe,EAAE,IAAI,EAAE;AAAA,IACnD,KAAKA,GAAE,OAAO;AAAA,MACZ,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAChC,QAAQA,GAAE,OAAO,EAAE,IAAI;AAAA,MACvB,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,MACzB,OAAOA,GAAE,MAAkB,aAAa,EAAE,QAAQ,CAAC,CAAC;AAAA,IACtD,CAAC;AAAA,IACD,SAASA,GAAE,QAAQ,EAAE,UAAU,YAAY;AAAA,IAC3C,SAASA,GAAE;AAAA,MACT;AAAA,MACAA,GACG,OAAO;AAAA,QACN,WAAW;AAAA,QACX,eAAeA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,QAC/B,QAAQA,GAAE,MAAM,oBAAoB,EAAE,IAAI,CAAC;AAAA,MAC7C,CAAC,EACA,OAAO,EACP,OAAO,CAAC,YAAY;AACnB,cAAM,QAAQ,gBAAgB,aAAa,IAAI,QAAQ,SAAS;AAChE,cAAM,QAAQ,OAAO,aAAa;AAAA,UAChC,CAAC,CAAC,EAAE,MAAM,OAAO,QAAQ;AAAA,QAC3B,IAAI,CAAC,EAAE;AACP,eAAO,CAAC,CAAC,SAAS,QAAQ,OAAO,SAAS,MAAM,QAAQ;AAAA,MAC1D,GAAG,0FAA0F;AAAA,IACjG;AAAA,IACA,cAAcA,GAAE,OAAO;AAAA,MACrB,SAASA,GACN,OAAO;AAAA,QACN,WAAW;AAAA,QACX,QAAQA,GAAE,MAAM,cAAc;AAAA,QAC9B,aAAaA,GAAE;AAAA,UACbA,GAAE,OAAO;AAAA,UACTA,GAAE,OAAO;AAAA,YACP,eAAeA,GAAE,OAAO;AAAA,YACxB,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AAAA,IACD,gBAAgBA,GACb,OAAO;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,IACN,CAAC,EACA,SAAS;AAAA,EACd,CAAC;AACD,QAAM,oBAAoB,yBAAyB,cAAc;AAKjE,SAAO;AAAA,IACL,oBACE,OAAsB,MACtB,SACA;AACA,YAAM,eAAiC;AAAA,QACrC,QAAQ,CAAC;AAAA,QACT,KAAK;AAAA,UACH;AAAA,UACA,QAAQ;AAAA,UACR,OAAO,CAAC;AAAA,UACR,OAAO,CAAC;AAAA,QACV;AAAA,QACA;AAAA,QACA,SAAS,CAAC;AAAA,QACV,cAAc,EAAE,SAAS,KAAK;AAAA,QAC9B,gBAAgB;AAAA,MAClB;AACA,aAAO;AAAA,IACT;AAAA,IACA,oBAAoB,YAAqB;AACvC,aAAO,aAAa,eAAe,SAAY,CAAC,IAAI,UAAU;AAAA,IAChE;AAAA,IACA,kBAAkB,UAAmB,WAAiC;AACpE,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,UACTA,GAAE,MAAM,cAAc;AAAA,UACtB,aAAa,UAAU,SAAS,IAAI,YAAY,MAAM;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW,UAAkC;AAC3C,YAAM,WAAW;AAAA,QACH;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AACA,YAAM,QAAQ;AAAA,QACZ,WAAW,SAAS,SAAS;AAAA,QAC7B,SAAS,OAAO;AAAA,QAChB;AAAA,MACF;AACA,YAAM,YAAY,CAAC,GAAG,MAAM,WAAW;AACvC,YAAM,eAAe,OAAO;AAAA,QAC1B,UAAU,IAAI,CAAC,aAAa;AAAA,UAC1B;AAAA,UACA;AAAA,YACE,WAAW,SAAS,MAAM;AAAA,YAC1B,SAAS,OAAO,aAAa,QAAQ,KAAK,CAAC;AAAA,YAC3C,gBAAgB,QAAQ;AAAA,UAC1B;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,OAAO;AAAA,QACX;AAAA,QACA;AAAA,UACE,cAAc,SAAS,OAAO,KAAK;AAAA,UACnC,MAAM,SAAS,OAAO,KAAK;AAAA,UAC3B,OAAO,SAAS,OAAO,KAAK;AAAA,UAC5B,eAAe,SAAS,OAAO,KAAK;AAAA,QACtC;AAAA,QACA;AAAA,MACF;AACA,YAAM,yBAAyB,WAAW,OAAO,KAAK,YAAY;AAClE,UAAI,CAAC,wBAAwB;AAC3B,cAAM,IAAI,MAAM,0BAA0B,KAAK,YAAY,IAAI;AAAA,MACjE;AACA,YAAM,gBAAgB,SAAS,OAAO;AACtC,YAAM,QAAQ;AAAA,QACZ,uBAAuB;AAAA,QACvB,iBAAiB,CAAC;AAAA,QAClB,SAAS,KAAK,YAAY;AAAA,MAC5B;AAEA,YAAM,cAAqB;AAAA,QACzB,QAAQ;AAAA,UACN;AAAA,UACA,aAAa;AAAA,YACX,WAAW,SAAS,MAAM;AAAA,YAC1B,SAAS,OAAO;AAAA,YAChB;AAAA,UACF;AAAA,UACA;AAAA,UACA,aAAa;AAAA,YACX,WAAW,SAAS,MAAM;AAAA,YAC1B,SAAS,OAAO;AAAA,YAChB;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe,OAAc;AAC3B,aAAO;AAAA,QACL,QAAQ,EAAE,GAAG,MAAM,OAAO;AAAA,QAC1B,SAAS,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IACA,cAAc,aAAqB;AACjC,aAAO,iBAAiB,gBAAgB,aAAa,UAAU;AAAA,IACjE;AAAA,IACA,WAAW,UAAmB;AAC5B,aAAO,kBAAkB,QAAQ;AAAA,IACnC;AAAA,EACF;AACF;;;AMnBA,SAAS,4BACP,OACA,QACA,UAC2C;AAC3C,QAAM,OAAO,MAAM,eAAe,MAAM;AACxC,MAAI,SAAS,SAAS,SAAS,UAAU;AACvC,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AACA,SAAO,EAAE,QAAQ,OAAO,WAAW,CAAC,QAAQ,EAAE;AAChD;AAEA,SAAS,oBACP,OACA,QACA,UACmB;AACnB,QAAM,OAAO,MAAM,MAAM,UAAU,MAAM,KAAK,MAAM,MAAM,MAAM;AAChE,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,gBAAgB,MAAM,mBAAmB;AAAA,EAC3D;AACA,SAAO,KAAK,QAAQ,KAAK,CAAC;AAC5B;AAEA,SAAS,qBACP,OACA,QACA,UACA,OACM;AACN,QAAM,cAAc,MAAM,MAAM,UAAU,MAAM;AAChD,QAAM,cAAc,MAAM,MAAM,MAAM;AACtC,QAAM,SAAS,WAAW,QAAQ;AAClC,MAAI,aAAa;AACf,UAAM,MAAM,UAAU,MAAM,IAAI,EAAE,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE;AAAA,EACzE;AACA,MAAI,aAAa;AACf,UAAM,MAAM,MAAM,IAAI,EAAE,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE;AAAA,EAC/D;AACF;AAEA,SAAS,8BACP,OACA,QACA,QACM;AACN,QAAM,oBAAoB,MAAM,MAAM,qBAAqB,MAAM;AACjE,MAAI,CAAC,qBAAqB,kBAAkB,WAAW,GAAG;AACxD;AAAA,EACF;AACA,QAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,SAAS,MAAM,mBAAmB;AAAA,EACpD;AACA,MAAI,CAAC,kBAAkB,SAAS,KAAK,SAAS,GAAG;AAC/C,UAAM,IAAI;AAAA,MACR,SAAS,MAAM,eAAe,KAAK,SAAS,oCAAoC,MAAM;AAAA,IACxF;AAAA,EACF;AACF;AAEA,SAAS,6BAA6B,SAO7B;AACP,QAAM,YAAY,QAAQ;AAC1B,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,UAAU,MAAM,UAAU,MAAM,KAAK,CAAC,UAAU,MAAM,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,gBAAgB,MAAM,mBAAmB;AAAA,EAC3D;AACA,QAAM,UAAU,CAAC,GAAI,QAAQ,WAAW,UAAU,WAAY;AAC9D,MAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,EACF;AACA,QAAM,YAAY,IAAI,IAAI,UAAU,WAAW;AAC/C,aAAW,YAAY,SAAS;AAC9B,QAAI,CAAC,UAAU,IAAI,QAAQ,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR,8BAA8B,MAAM,cAAc,QAAQ;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,oBAAI,IAA+B;AAC5D,aAAW,YAAY,SAAS;AAC9B,UAAM,cAAc,oBAAoB,WAAW,QAAQ,QAAQ;AACnE,UAAM,WAAW,QAAQ,kBAAkB,QAAQ,KAAK;AACxD,eAAW,UAAU,UAAU;AAC7B,UAAI,CAAC,YAAY,SAAS,MAAM,GAAG;AACjC,cAAM,IAAI;AAAA,UACR,8BAA8B,MAAM,YAAY,MAAM,gCAAgC,QAAQ;AAAA,QAChG;AAAA,MACF;AACA,oCAA8B,WAAW,QAAQ,MAAM;AAAA,IACzD;AACA,qBAAiB,IAAI,UAAU,CAAC,GAAG,QAAQ,CAAC;AAAA,EAC9C;AAEA,QAAM,iBAAiB,oBAAI,IAAsB;AACjD,aAAW,YAAY,SAAS;AAC9B,UAAM,WAAW,IAAI,IAAI,iBAAiB,IAAI,QAAQ,KAAK,CAAC,CAAC;AAC7D,mBAAe;AAAA,MACb;AAAA,MACA,oBAAoB,WAAW,QAAQ,QAAQ,EAAE;AAAA,QAC/C,CAAC,WAAW,CAAC,SAAS,IAAI,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,IAAI;AAAA,IAC5B,QAAQ,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;AAAA,EAC1C;AACA,aAAW,CAAC,OAAO,YAAY,KAAK,QAAQ,QAAQ,GAAG;AACrD,UAAM,SAAS,QAAQ,cAAc,SAAS,IAAI;AAClD,UAAM,YACJ,SAAS,QAAQ,SAAS,QAAQ,UAAU,QAAQ,MAAM;AAC5D,sBACG,IAAI,SAAS,EACb,KAAK,GAAI,iBAAiB,IAAI,YAAY,KAAK,CAAC,CAAE;AAAA,EACvD;AAEA,aAAW,YAAY,SAAS;AAC9B,UAAM,YAAY,eAAe,IAAI,QAAQ,KAAK,CAAC;AACnD,UAAM,YAAY,kBAAkB,IAAI,QAAQ,KAAK,CAAC;AACtD,UAAM,YACJ,QAAQ,aAAa,QACjB,CAAC,GAAG,WAAW,GAAG,SAAS,IAC3B,CAAC,GAAG,WAAW,GAAG,SAAS;AACjC,yBAAqB,WAAW,QAAQ,UAAU,SAAS;AAC3D,eAAW,CAAC,UAAU,MAAM,KAAK,UAAU,QAAQ,GAAG;AACpD,gBAAU,mBAAmB,MAAM,IAAI;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AACA,gBAAU,YAAY,MAAM,IAAI;AAChC,gBAAU,WAAW,MAAM,IAAI;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAmCA,IAAM,qCACJ;AACF,IAAM,uCACJ;AACF,IAAM,yCACJ;AAEF,IAAM,aAAa,CACjB,MACA,UACM;AACN,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAQ,MAAyB,IAAI;AAAA,EACvC;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM;AAC7B;AAEO,IAAM,uBAAuB;AAAA,EAClC,iBACE,OACA,eACG;AACH,UAAM,OAAQ,MAA+B;AAC7C,WAAO,OAAO,OAAO,OAAO;AAAA,MAC1B,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,aAAa,EAAE;AAAA,IACrD,CAAC;AAAA,EACH;AAAA,EACA,oBAAwC,OAAa;AACnD,UAAM,QAAS,MAAmD;AAClE,UAAM,QAAQ,MAAM;AACpB,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,OACJ,MACA;AACF,UAAM,UAAU,MAAM,gBAAgB,CAAC;AACvC,UAAM,MAAM,UAAU,MAAM,QAAQ,OAAO,IAAI;AAC/C,UAAM,UAAU,MAAM,IAAI,KAAK,MAAM,KAAK,MAAM;AAChD,UAAM,SAAS,MAAM,OAAO;AAC5B,QAAI,WAAW,OAAW,QAAO;AACjC,WAAO,qBAAqB,iBAAiB,OAAO,CAAC,MAAM,CAAC;AAAA,EAC9D;AAAA,EACA,gBAAoC,OAAU,OAAmB;AAC/D,UAAM,OAAQ,MAAwC,SAAS,CAAC;AAChE,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,IACF;AACA,WAAO,OAAO,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7C;AAAA,EACA,iBAAqC,OAAU,OAAmB;AAChE,UAAM,OACH,MAA8C,eAAe,CAAC;AACjE,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,IACF;AACA,WAAO,OAAO,OAAO,OAAO,EAAE,aAAa,KAAK,CAAC;AAAA,EACnD;AAAA,EACA,iBAAqC,OAAU,OAAmB;AAChE,UAAM,OACH,MAA8C,eAAe,CAAC;AACjE,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,IACF;AACA,WAAO,OAAO,OAAO,OAAO,EAAE,aAAa,KAAK,CAAC;AAAA,EACnD;AAAA,EACA,wBACE,OACA,MACG;AACH,UAAM,kBACH,MACE,gBAAgB,CAAC;AACtB,UAAM,OAAQ,gBAAgB,KAAK,QAAQ,KAAK,CAAC;AACjD,UAAM,OAAO;AAAA,MACX;AAAA,MACA,KAAK;AAAA,IACP;AACA,WAAO,OAAO,OAAO,OAAO;AAAA,MAC1B,cAAc,EAAE,GAAG,iBAAiB,CAAC,KAAK,QAAQ,GAAG,KAAK;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EACA,oBACE,OACA,MAMG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,YAAY;AAAA,MACjB,KAAK,YAAY;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EACA,yBACE,OACA,MACG;AACH,oCAAqC,MAAM,OAAO,KAAK,QAAQ,KAAK,MAAM;AAC1E,WAAO;AAAA,EACT;AAAA,EACA,2BACE,OACA,MAOG;AACH,sCAAuC;AAAA,MACrC,OAAO,MAAM;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK,YAAY;AAAA,MAC3B,UAAU,KAAK,YAAY;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,4BACE,OACA,MAMG;AACH,uCAAwC;AAAA,MACtC,OAAO,MAAM;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,IACd,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,2BACE,OACA,MAOG;AACH,sCAAuC;AAAA,MACrC,OAAO,MAAM;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK,YAAY;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,mCACE,OACA,MAQG;AACH,8CAA+C;AAAA,MAC7C,OAAO,MAAM;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK,YAAY;AAAA,MAC3B,UAAU,KAAK,YAAY;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,mCACE,OACA,MAOG;AACH,8CAA+C;AAAA,MAC7C,OAAO,MAAM;AAAA,MACb,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK,YAAY;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,KACE,OACA,MAMG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EACA,iBACE,OACA,MAOG;AACH,iCAA6B;AAAA,MAC3B,OAAO,MAAM;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,iBAAiB,KAAK;AAAA,MACtB,UAAU,KAAK,YAAY;AAAA,IAC7B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EACA,qBACE,OACA,MACG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EACA,yBACE,OACA,MACG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EACA,oBACE,OACA,MACG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EACA,sBACE,OACA,MACG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EACA,wBACE,OACA,MACG;AACH,mCAAoC,MAAM,OAAO,KAAK,WAAW;AACjE,WAAO;AAAA,EACT;AAAA,EACA,aACE,OACA,MACG;AACH,8BAA+B,MAAM,OAAO,KAAK,UAAU,KAAK,OAAO;AACvE,WAAO;AAAA,EACT;AAAA,EACA,eACE,OACA,MACG;AACH,gCAAiC,MAAM,OAAO,KAAK,UAAU,KAAK,OAAO;AACzE,WAAO;AAAA,EACT;AAAA,EACA,kBACE,OACA,MAKG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAAA,EACA,YACE,OACA,MACG;AACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AACA,WAAO;AAAA,EACT;AACF;;;AC3zBA,IAAM,qBAAqB,uBAAO,sCAAsC;AAaxE,SAAS,qBACP,SACkC;AAClC,QAAM,SAAS,OAA6B;AAAA,IAC1C,MAAM;AAAA,IACN,OAAO,QAAQ;AAAA,IACf,QAAQ,CAAC,GAAG,QAAQ,MAAM;AAAA,EAC5B;AACA,SAAO;AAAA,IACL,QAAQ,QAAQ;AACd,cAAQ,OAAO,KAAK,GAAG,MAAM;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,WAAW,IAAI;AACb,aAAO,EAAE,GAAG,OAAO,GAAG,YAAY,GAA8B;AAAA,IAClE;AAAA,IACA,QAAQ,SAAS,SAAS;AACxB,aAAO;AAAA,QACL,GAAG,OAAO;AAAA,QACV,UAAU;AAAA,QACV,GAAI,SAAS,aACT,EAAE,YAAY,QAAQ,WAAsC,IAC5D,CAAC;AAAA,MACP;AAAA,IACF;AAAA,IACA,OAAO,WAAW,SAAS;AACzB,aAAO,EAAE,MAAM,UAAU,WAAW,QAAQ;AAAA,IAC9C;AAAA,EACF;AACF;AAMA,SAAS,sBACP,MAC2B;AAC3B,QAAM,UAAW,KAAyC,kBAAkB;AAC5E,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,UAAU,sDAAsD;AAAA,EAC5E;AACA,SAAO;AACT;AAEA,SAAS,WACP,SACM;AACN,UAAQ,iBAAiB;AAC3B;AAEA,SAAS,YACP,SACA,KACA,MACO;AACP,EACE,qBAAqB,GAAG,EAIxB,QAAQ,cAAc,GAAG,IAAI;AAC/B,aAAW,OAAO;AAClB,SAAO,QAAQ;AACjB;AAEA,SAAS,kCAEL;AACF,QAAM,UAAU,CAAC;AACjB,QAAM,cAAqC;AAAA,IACzC,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,MAAmB;AACjB,eAAO,sBAA6B,IAAI,EAAE;AAAA,MAC5C;AAAA,IACF;AAAA,IACA,GAAG;AAAA,MACD,YAAY;AAAA,MACZ,MAAmB;AACjB,cAAM,UAAU,sBAA6B,IAAI;AACjD,gBAAQ,mBAAmB,mBAAmB,QAAQ,YAAY;AAClE,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AACV,gBAAY,GAAG,IAAI;AAAA,MACjB,YAAY;AAAA,MACZ,MAAmB;AACjB,cAAM,UAAU,sBAA6B,IAAI;AACjD,gBAAQ,YAAY,qBAAqB,OAAO;AAChD,eAAO,QAAQ,QAAQ,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,OAAO,KAAK,oBAAoB,GAE/C;AACD,gBAAY,OAAO,GAAG,CAAC,IAAI;AAAA,MACzB,YAAY;AAAA,MACZ,MAAmB;AACjB,cAAM,UAAU,sBAA6B,IAAI;AACjD,cAAM,WAAW,OAAO,GAAG;AAC3B,gBAAQ,YAAY,QAAQ,MAAM,IAAI,SACpC,YAAY,SAAS,KAAK,IAAI;AAChC,eAAO,QAAQ,YAAY,QAAQ;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,cAAY,OAAO;AAAA,IACjB,YAAY;AAAA,IACZ,MAAmB;AACjB,YAAM,UAAU,sBAA6B,IAAI;AACjD,aAAQ,QAAQ,eAAe,CAAC,UAAkB;AAChD,cAAM,MAAM,QAAQ,aAAa,MAAM,KAAK,KAAK;AACjD,YAAI,CAAC,IAAK,OAAM,IAAI,MAAM,4BAA4B,KAAK,IAAI;AAC/D,cAAM,QAAQ,QAAQ,OAAO,KAAK,IAAI,KAAK;AAC3C,gBAAQ,aAAa,MAAM,KAAK,KAAK,IAAI,EAAE,GAAG,KAAK,MAAM;AACzD,mBAAW,OAAO;AAClB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,cAAY,UAAU;AAAA,IACpB,YAAY;AAAA,IACZ,MAAmB;AACjB,YAAM,UAAU,sBAA6B,IAAI;AACjD,aAAQ,QAAQ,kBAAkB,CAAC,SAG7B;AACJ,cAAM,QAAQ,QAAQ,aAAa;AACnC,YAAI,KAAK,aAAa,QAAW;AAC/B,gBAAM,QAAQ;AAAA,YACZ;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,gBAAM,WAAW,QAAQ,OAAO,QAAQ,OAAO,mBAAmB;AAClE,iCAAuB,OAAO,KAAK,QAAQ,KAAK,UAAU,QAAQ;AAClE,qBAAW,CAAC,UAAU,MAAM,KAAK,SAAS,QAAQ,GAAG;AACnD,kBAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,kBAAM,mBAAmB,MAAM,IAAI;AAAA,cACjC,GAAG;AAAA,cACH,MAAM;AAAA,cACN,QAAQ,KAAK;AAAA,cACb,UAAU,KAAK;AAAA,cACf;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM,QAAQ,MAAM,MAAM,KAAK,MAAM;AACrC,cAAI,CAAC;AACH,kBAAM,IAAI;AAAA,cACR,uCAAuC,KAAK,MAAM;AAAA,YACpD;AACF,gBAAM,WAAW,QAAQ,OAAO,QAAQ,OAAO,mBAAmB;AAClE,gBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,gBAAM,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC,GAAG,QAAQ;AAC9C,qBAAW,CAAC,UAAU,MAAM,KAAK,SAAS,QAAQ,GAAG;AACnD,kBAAM,WAAW,MAAM,mBAAmB,MAAM;AAChD,kBAAM,mBAAmB,MAAM,IAAI;AAAA,cACjC,GAAG;AAAA,cACH,MAAM;AAAA,cACN,QAAQ,KAAK;AAAA,cACb;AAAA,cACA,UACE,UAAU,SAAS,YAAY,UAAU,SAAS,WAC7C,SAAS,YAAY,OACtB;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,mBAAW,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,SAAO,iBAAiB,SAAS,WAAW;AAC5C,SAAO;AACT;AAEA,SAAS,oCAGP,cACA,SACA,QAC2B;AAC3B,QAAM,cAAc,OAAO,OAAO,OAAO;AAEzC,SAAO,eAAe,aAAa,oBAAoB;AAAA,IACrD,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,GAAG;AAAA,QACH,OAAO,kBAAkB,aAAa,KAAK;AAAA,MAC7C;AAAA,MACA,gBAAgB;AAAA,MAChB,aAAa,CAAC;AAAA,MACd,QAAQ,CAAC;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAYO,SAAS,oBAEQ;AACtB,QAAM,UAAU,gCAAuC;AACvD,SAAO,CACL,OACA,WACG,oCAAoC,OAAO,SAAS,MAAM;AACjE;;;ACrSO,SAAS,8BAKd,YACqD;AAKrD,QAAM,QAAQ,8BAA8B,UAAU;AACtD,QAAM,eAAe,oBAAI,IAGvB;AACF,aAAW,cAAc,MAAM,aAAa,OAAO,GAAG;AACpD,UAAM,eAAkE;AAAA,MACtE,WAAW,WAAW;AAAA,MACtB,OAAO,WAAW;AAAA,MAClB,cAAc,WAAW;AAAA,IAC3B;AACA,iBAAa,IAAI,WAAW,WAAW,YAAY;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB;AAAA,EACF;AACF;;;ACzDO,SAAS,aACd,OACA,UAIA;AAIA,SAAO;AAAA,IACL,cAAc,MAAM,KAAK;AAAA,IAIzB;AAAA,IACA,aAAa,CAAC,GAAG,MAAM,MAAM,WAAW;AAAA,IACxC,eAAe,CAAC,GAAG,MAAM,KAAK,aAAa;AAAA,IAC3C,SAAS,cAAc,MAAM,OAAO;AAAA,EACtC;AACF;AAEA,SAAS,cACP,SACsB;AACtB,QAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,SAAO,KAAK;AACZ,SAAO;AACT;AAEA,IAAM,0BAAyC;AAAA,EAC7C,UAAU;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS;AACP,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,uBAAuB,uBAAO,2BAA2B;AAaxD,SAAS,iBAEd,MAA2E;AAC3E,SAAO,KAAK,oBAAoB,EAAE;AACpC;AAEO,SAAS,iBAId,OACA,UACA,mBACAC,gBAGA,OACA,UAGI,CAAC,GACL;AAEA,QAAM,cAAcA,eAAc,KAAK;AACvC,QAAM,IAAI,QAAQ,KAAK,mBAAmB,WAAW;AACrD,QAAM,OAAO;AAAA,IACX,GAAG,aAAa,OAAO,QAAQ;AAAA,IAC/B;AAAA,IACA,SAAS,cAAc,MAAM,OAAO;AAAA,IACpC,QAAQ,QAAQ,QAAQ,UAAU;AAAA,IAClC,GAAG;AAAA,EACL;AAGA,MAAI;AACJ,SAAO,eAAe,MAAM,MAAM;AAAA,IAChC,YAAY;AAAA,IACZ,KAAK,MAAM;AACT,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,aAAQ,gBAAgB,kBAAkB,aAAa,QAAQ,MAAM;AAAA,IACvE;AAAA,EACF,CAAC;AACD,SAAO,eAAe,MAAM,sBAAsB;AAAA,IAChD,YAAY;AAAA,IACZ,OAAO,MACL,cACI,YAAY,OAAO,IACnB,EAAE,MAAM,UAAU,OAAO,aAAa,QAAQ,CAAC,EAAE;AAAA,EACzD,CAAC;AACD,SAAO;AACT;;;ACjHA,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAChC,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAE/B,SAAS,YAAY,SAAwB;AAC3C,QAAM,IAAI,MAAM,wBAAwB,OAAO,EAAE;AACnD;AAEA,SAAS,cAAc,SAAwB;AAC7C,QAAM,IAAI,MAAM,sBAAsB,OAAO,EAAE;AACjD;AAEA,SAAS,4BACP,OACA,OACA,YAAY,sBACa;AACzB,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,gBAAY,GAAG,KAAK,6BAA6B;AAAA,EACnD;AACA,MAAI,MAAM,SAAS,WAAW;AAC5B,gBAAY,GAAG,KAAK,cAAc;AAAA,EACpC;AACF;AAEA,SAAS,sBACP,OACA,OACA,YAAY,yBACa;AACzB,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,kBAAc,GAAG,KAAK,6BAA6B;AAAA,EACrD;AACA,MAAI,MAAM,SAAS,WAAW;AAC5B,kBAAc,GAAG,KAAK,cAAc;AAAA,EACtC;AACF;AAEA,SAAS,mBACP,OACA,OACyB;AACzB,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,gBAAY,GAAG,KAAK,0BAA0B;AAAA,EAChD;AACF;AAEA,SAAS,gBACP,SACA,OACM;AACN,MAAI,CAAC,QAAS;AACd,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,SAAS,SAAS;AAC3B,gCAA4B,MAAM,IAAI,GAAG,KAAK,OAAO,mBAAmB;AACxE;AAAA,MACE,MAAM;AAAA,MACN,GAAG,KAAK;AAAA,MACR;AAAA,IACF;AACA,QAAI,KAAK,IAAI,MAAM,EAAE,GAAG;AACtB,kBAAY,GAAG,KAAK,2BAA2B,MAAM,EAAE,GAAG;AAAA,IAC5D;AACA,SAAK,IAAI,MAAM,EAAE;AAAA,EACnB;AACF;AAEA,SAAS,qBACP,UACM;AACN,MAAI,CAAC,OAAO,UAAU,SAAS,IAAI,KAAK,SAAS,OAAO,GAAG;AACzD,gBAAY,iBAAiB,SAAS,QAAQ,oBAAoB;AAAA,EACpE;AACA,MACE,SAAS,WAAW,SACpB,SAAS,WAAW,UACpB,SAAS,WAAW,UACpB,SAAS,WAAW,cACpB;AACA,gBAAY,iBAAiB,SAAS,QAAQ,sBAAsB;AAAA,EACtE;AACA,MAAI,SAAS,UAAU,QAAW;AAChC,uBAAmB,SAAS,OAAO,aAAa,SAAS,QAAQ,SAAS;AAAA,EAC5E;AACA,OAAK,SAAS,gBAAgB,UAAU,KAAK,wBAAwB;AACnE;AAAA,MACE,aAAa,SAAS,QAAQ;AAAA,IAChC;AAAA,EACF;AACA,OAAK,SAAS,WAAW,UAAU,KAAK,wBAAwB;AAC9D,gBAAY,aAAa,SAAS,QAAQ,2BAA2B;AAAA,EACvE;AACA,kBAAgB,SAAS,gBAAgB,gBAAgB;AACzD,kBAAgB,SAAS,WAAW,WAAW;AAC/C,aAAW,aAAa,SAAS,kBAAkB,CAAC,GAAG;AACrD;AAAA,MACE,UAAU;AAAA,MACV,aAAa,SAAS,QAAQ,qBAAqB,UAAU,EAAE;AAAA,IACjE;AAAA,EACF;AACA,aAAW,YAAY,SAAS,aAAa,CAAC,GAAG;AAC/C,QAAI,OAAO,SAAS,UAAU,UAAU;AACtC;AAAA,QACE,SAAS;AAAA,QACT,aAAa,SAAS,QAAQ,eAAe,SAAS,EAAE;AAAA,MAC1D;AAAA,IACF,OAAO;AACL;AAAA,QACE,SAAS;AAAA,QACT,aAAa,SAAS,QAAQ,eAAe,SAAS,EAAE;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,qBACd,OACA,SACuB;AACvB;AAAA,IACE;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,OAAO,YAAY,QAAW;AACxC,gCAA4B,QAAQ,OAAO,SAAS,gBAAgB;AAAA,EACtE;AACA,MAAI,QAAQ,UAAU,WAAW,GAAG;AAClC,gBAAY,6BAA6B;AAAA,EAC3C;AACA,MAAI,QAAQ,UAAU,SAAS,uBAAuB;AACpD,gBAAY,kCAAkC;AAAA,EAChD;AAEA,QAAM,cAAe,MAClB,OAAO;AACV,MAAI,CAAC,MAAM,QAAQ,WAAW,KAAK,YAAY,WAAW,GAAG;AAC3D,gBAAY,sDAAsD;AAAA,EACpE;AACA,QAAM,mBAAmB,IAAI;AAAA,IAC3B,YAAY,IAAI,CAAC,UAAU,UAAU,CAAC,UAAU,KAAK,CAAC;AAAA,EACxD;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,YAAY,QAAQ,WAAW;AACxC;AAAA,MACE,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,iBAAiB,IAAI,SAAS,QAAQ,GAAG;AAC5C,kBAAY,mBAAmB,SAAS,QAAQ,GAAG;AAAA,IACrD;AACA,QAAI,KAAK,IAAI,SAAS,QAAQ,GAAG;AAC/B,kBAAY,qBAAqB,SAAS,QAAQ,GAAG;AAAA,IACvD;AACA,SAAK,IAAI,SAAS,QAAQ;AAC1B,yBAAqB,QAAQ;AAAA,EAC/B;AACA,aAAW,YAAY,aAAa;AAClC,QAAI,CAAC,KAAK,IAAI,QAAQ,GAAG;AACvB,kBAAY,mBAAmB,QAAQ,GAAG;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,EAAE,GAAG,QAAQ,OAAO;AAAA,IAC5B,WAAW,CAAC,GAAG,QAAQ,SAAS,EAAE,KAAK,CAAC,MAAM,UAAU;AACtD,YAAM,OAAO,KAAK,OAAO,MAAM;AAC/B,UAAI,SAAS,EAAG,QAAO;AACvB,cACG,iBAAiB,IAAI,KAAK,QAAQ,KAAK,OAAO,qBAC9C,iBAAiB,IAAI,MAAM,QAAQ,KAAK,OAAO;AAAA,IAEpD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,yBACP,QACA,OACiB;AACjB;AAAA,IACE,OAAO;AAAA,IACP,WAAW,KAAK;AAAA,IAChB;AAAA,EACF;AACA,MAAI,OAAO,OAAO,UAAU,UAAU;AACpC,uBAAmB,OAAO,OAAO,WAAW,KAAK,SAAS;AAAA,EAC5D,WAAW,OAAO,OAAO,UAAU,UAAU;AAC3C;AAAA,MACE,OAAO;AAAA,MACP,WAAW,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF,WAAW,OAAO,OAAO,UAAU,WAAW;AAC5C,kBAAc,WAAW,KAAK,4CAA4C;AAAA,EAC5E;AACA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,SAAS,2BACP,OACmB;AACnB;AAAA,IACE,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACA,wBAAsB,MAAM,OAAO,SAAS,uBAAuB;AACnE,MAAI,MAAM,YAAY,QAAW;AAC/B,0BAAsB,MAAM,SAAS,WAAW,uBAAuB;AAAA,EACzE;AACA,OAAK,MAAM,SAAS,UAAU,KAAK,wBAAwB;AACzD,kBAAc,mCAAmC;AAAA,EACnD;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,GAAI,MAAM,YAAY,SAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,IAChE,GAAI,MAAM,YAAY,SAClB;AAAA,MACE,SAAS,MAAM,QAAQ;AAAA,QAAI,CAAC,QAAQ,UAClC,yBAAyB,QAAQ,KAAK;AAAA,MACxC;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;AAEO,SAAS,oBACd,SAA+B,CAAC,GACnB;AACb;AAAA,IACE;AAAA,IACA;AAAA,MACE,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,sBAAsB;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACA,MAAI,OAAO,SAAS,uBAAuB;AACzC,kBAAc,qCAAqC;AAAA,EACrD;AACA,SAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAClC,QAAI,MAAM,SAAS,gBAAgB;AACjC,oBAAc,UAAU,KAAK,uBAAuB;AAAA,IACtD;AACA,WAAO,2BAA2B,KAAK;AAAA,EACzC,CAAC;AACH;AAEO,SAAS,aACd,WACA,SACe;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBACd,QACA,gBACsB;AACtB,MAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,aAAS,eAAe;AAAA,EAC1B;AACA,MAAI,OAAO,SAAS,UAAU;AAG5B,WAAO;AAAA,MACL,GAAG;AAAA,MAEH,QAAQ,oBAAoB,OAAO,MAAM;AAAA,MACzC,GAAI,OAAO,WACP,EAAE,UAAU,qBAAqB,OAAO,OAAO,OAAO,QAAQ,EAAE,IAChE,CAAC;AAAA,IACP;AAAA,EACF;AACA,SAAO;AACT;;;AC9TO,SAAS,cACd,OACa;AACb,QAAM,SAAS,EAAE,GAAG,MAAM;AAC1B,SAAO,OAAO;AACd,sBAAoB,MAAM;AAC1B,SAAO;AACT;AAEO,SAAS,gBAGd,SAA8B;AAC9B,QAAM,WAAW;AAAA,IACf,GAAI,QAAQ;AAAA,IACZ,SAAS,QAAQ;AAAA,EACnB;AACA,sBAAoB,QAAQ;AAC5B,SAAO;AACT;AAEO,SAAS,eAId,OAAc,UAAuD;AACrE,SAAO;AAAA,IACL,QAAQ,SAAS,KAAK;AAAA,IACtB,SAAS,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,oBAAoB,OAAsB;AACjD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,QAAM,YAAY;AAIlB,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,QAAM,aAAa,OAAO,yBAAyB,OAAO,KAAK;AAC/D,MAAI,cAAc,OAAO,WAAW,UAAU,WAAY;AAC1D,SAAO,eAAe,OAAO,OAAO;AAAA,IAClC,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAO,CAAC,cACN,UAAU,MAAM,iBAAiB,YAAY,QAAQ;AAAA,EACzD,CAAC;AACH;;;AC0FO,SAAS,0BAKd,YACA,UAAoD,CAAC,GACH;AAMlD,QAAM,WAAW,8BAA8B,UAAU;AACzD,QAAM,EAAE,aAAa,IAAI;AACzB,QAAM,sBAAsB,WAAW,gBAAgB,aAAa,CAAC,IAAI,CAAC;AAC1E,MAAI,CAAC,qBAAqB;AACxB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,WAASC,eAAc,OAA2B;AAChD,WAAO,cAAuC,KAAK;AAAA,EACrD;AAEA,WAASC,iBAAgB,SAA8B;AACrD,WAAO,gBAA0C,OAAO;AAAA,EAC1D;AAEA,WAASC,gBAAe,OAA4B;AAClD,WAAO;AAAA,MACL;AAAA,MACAF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBACP,WAC+D;AAC/D,WAAO,SAAS,aAAa,IAAI,SAAS;AAAA,EAC5C;AAEA,WAAS,YAAY,WAAoD;AACvE,UAAM,gBAAgB,oBAAoB,SAAS;AACnD,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,0BAA0B,SAAS,IAAI;AAAA,IACzD;AACA,WAAO,cAAc;AAAA,EACvB;AAEA,WAAS,uBACP,WACA,eACuD;AACvD,UAAM,QAAQ,2BAA2B,SAAS,EAAE;AAAA,MAClD,CAAC,CAAC,EAAE,MAAM,OAAO;AAAA,IACnB;AACA,WAAO,QAAQ,CAAC;AAAA,EAClB;AAEA,WAAS,2BAA2B,WAAsB;AACxD,WAAO,oBAAoB,SAAS,GAAG,gBAAgB,CAAC;AAAA,EAC1D;AAEA,QAAM,oBAAoB,kBAA+B;AAEzD,WAASG,cAAa,OAAoD;AACxE,WAAO,aAA8B,OAAO,WAAW,SAAS,QAAQ;AAAA,EAC1E;AAEA,WAASC,kBACP,OACA,OACAC,UAIA;AACA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,SAAS;AAAA,MACpB;AAAA,MACAL;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,gCAAgC,QAAQ,WAAW;AAAA,IAChE;AAAA,IACA;AAAA,IACA;AAAA,IAEA,eAAAL;AAAA,IACA,iBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAAC;AAAA,IACA,kBAAAC;AAAA,EACF;AACF;;;ACxMO,SAAS,oBAId,aACgC;AAChC,SAAQ,YAAY,UAAU,CAAC;AACjC;AA6BO,SAAS,uBAGd,aAA4E;AAC5E,QAAM,aAAa,oBAAoB,WAAW;AAClD,aAAW,aAAa,OAAO,OAAO,UAAU,GAAG;AACjD,QAAI,UAAU,SAAS,QAAQ;AAC7B,UAAI,UAAU,KAAK,OAAO,SAAS,GAAG;AACpC,eAAO,UAAU,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAGd,aAA2E;AAC3E,QAAM,aAAa,oBAAoB,WAAW;AAClD,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,aAAa,OAAO,OAAO,UAAU,GAAG;AACjD,QAAI,UAAU,SAAS,QAAQ;AAC7B,iBAAW,UAAU,UAAU,KAAK,WAAW,CAAC,UAAU,KAAK,MAAM,GAAG;AACtE,YAAI,OAAO,SAAS,EAAG,SAAQ,IAAI,MAAM;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO;AACpB;AAEO,SAAS,iBAGd,aAA4E;AAC5E,SAAO,OAAO,QAAQ,oBAAoB,WAAW,CAAC,EAAE;AAAA,IACtD,CAAC,CAAC,EAAE,SAAS,MAAM,UAAU,SAAS;AAAA,EACxC,IAAI,CAAC;AACP;AAEO,SAAS,wBAId,aACA,QACoB;AACpB,SAAO,OAAO,QAAQ,oBAAoB,WAAW,CAAC,EAAE;AAAA,IACtD,CAAC,CAAC,EAAE,SAAS,MACX,UAAU,SAAS,WAClB,UAAU,KAAK,WAAW,CAAC,UAAU,KAAK,MAAM,GAC9C,IAAI,MAAM,EACV,SAAS,MAAM;AAAA,EACtB,IAAI,CAAC;AACP;;;ACqDO,SAAS,oBACd,WACA,SACyB;AACzB,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACF;;;AChLO,SAAS,uBAId,aACA,WACA,UAAiC,CAAC,GAGD;AACjC,QAAM,aAAa,oBAAoB,WAAW;AAClD,QAAM,SAAU,aAAa,CAAC;AAC9B,MAAI,YAAY,cAAc;AAC5B,UAAM,SAAS,YAAY,aAAa,UAAU,MAAM;AACxD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,SAAS,OAAO,MAAM,OACnB,IAAI,CAAC,UAAU,YAAY,UAAU,KAAK,CAAC,EAC3C,KAAK,IAAI;AAAA,MACd;AAAA,IACF;AACA,WAAO,EAAE,IAAI,MAAM,QAAQ,OAAO,KAAgC;AAAA,EACpE;AACA,QAAM,SAAkC,CAAC;AACzC,QAAM,SAAmB,CAAC;AAC1B,aAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,QAAI,UAAU,SAAS,SAAS,QAAQ,QAAS;AACjD,UAAM,WACJ,OAAO,GAAG,MAAM,UAAa,kBAAkB,YAC3C,UAAU,eACV,OAAO,GAAG;AAChB,UAAM,SAAS,UAAU,OAAO,UAAU,QAAQ;AAClD,QAAI,CAAC,OAAO,SAAS;AACnB,iBAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,eAAO,KAAK,YAAY,UAAU,GAAG,IAAI,KAAK,CAAC;AAAA,MACjD;AACA;AAAA,IACF;AACA,WAAO,GAAG,IAAI,OAAO;AAAA,EACvB;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,IAAI,OAAO,SAAS,OAAO,KAAK,IAAI,EAAE;AAAA,EACjD;AACA,SAAO,EAAE,IAAI,MAAM,QAAQ,OAAO;AACpC;AAEO,SAAS,mCAId,aACA,WACyB;AACzB,QAAM,aAAa,oBAAoB,WAAW;AAClD,QAAM,SAAU,aAAa,CAAC;AAC9B,QAAM,WAAoC,EAAE,GAAG,OAAO;AACtD,aAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,QAAI,UAAU,SAAS,MAAO;AAC9B,QAAI,OAAO,GAAG,MAAM,QAAW;AAC7B,YAAM,SAAS,UAAU,OAAO,UAAU,OAAO,GAAG,CAAC;AACrD,UAAI,OAAO,SAAS;AAClB,iBAAS,GAAG,IAAI,OAAO;AAAA,MACzB;AACA;AAAA,IACF;AACA,QAAI,kBAAkB,WAAW;AAC/B,eAAS,GAAG,IAAI,UAAU;AAC1B;AAAA,IACF;AACA,UAAM,gBAAgB,UAAU,OAAO,UAAU,MAAS;AAC1D,QAAI,cAAc,SAAS;AACzB,eAAS,GAAG,IAAI,cAAc;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,yBAKd,aACA,aACA,UACA,QACyB;AACzB,QAAM,aAAa,oBAAoB,WAAW;AAClD,MAAI,cAA4D;AAChE,QAAM,UAAU,MACb,gBAAgB;AAAA,IACf;AAAA,EACF;AACF,aAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,OAAO,GAAG;AAAA,IACZ;AACA,QAAI,MAAO,QAAO,oBAAoB,MAAM,WAAW,MAAM,OAAO;AAAA,EACtE;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,uBACd,WACA,OACA,UACA,GACA,OACA,SAAS,UAAU,SAAS,OAAO,UAAU,CAAC,GACE;AAChD,QAAM,iBAAiB,2BAA2B,WAAW,KAAK;AAClE,MAAI,eAAgB,QAAO;AAC3B,MAAI,UAAU,UAAa,UAAU,SAAS,MAAO,QAAO;AAC5D,MAAI,UAAU,MAAM;AAClB,eAAW,UAAU;AAAA,MACnB,UAAU;AAAA,MACV;AAAA,IACF,GAAG;AACD,YAAM,QAAQ,UAAU,iBAAiB,OAAO,UAAU,GAAG,MAAM;AACnE,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO,UAAU,CAAC,mBAAmB,QAAQ,OAAO,UAAU,SAAS,IACnE;AAAA,IACE,WAAW;AAAA,IACX,SAAS;AAAA,EACX,IACA;AACN;AAEA,SAAS,6BACP,WACA,OACoB;AACpB,MAAI,WAAW,SAAS,QAAQ;AAC9B,WAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AAAA,EACzC;AACA,SAAO,CAAC,KAAK;AACf;AAEO,SAAS,2BACd,WACA,OACgD;AAChD,QAAM,YAAY,UAAU;AAC5B,MAAI,WAAW,SAAS,OAAQ,QAAO;AACvC,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,MAAI,MAAM,SAAS,UAAU,KAAK;AAChC,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,2BAA2B,UAAU,GAAG,SAAS,UAAU,QAAQ,IAAI,KAAK,GAAG;AAAA,IAC1F;AAAA,EACF;AACA,MAAI,UAAU,QAAQ,UAAa,MAAM,SAAS,UAAU,KAAK;AAC/D,WAAO;AAAA,MACL,WAAW;AAAA,MACX,SAAS,0BAA0B,UAAU,GAAG,SAAS,UAAU,QAAQ,IAAI,KAAK,GAAG;AAAA,IACzF;AAAA,EACF;AACA,MAAI,UAAU,UAAU;AACtB,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,cAAc,IAAI;AAC9B,UAAI,KAAK,IAAI,GAAG,GAAG;AACjB,eAAO;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,QACX;AAAA,MACF;AACA,WAAK,IAAI,GAAG;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;;;ACrLO,IAAM,qCAAqC;AAQ3C,SAAS,oBAId,OAA0D;AAC1D,SAAO,MAAM,SAAS;AACxB;AAEO,SAAS,8BAKd,OAGY;AACZ,SAAQ,MAA+B;AAMzC;AAEA,SAAS,qBACP,OACY;AACZ,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO,CAAC;AACnD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC,KAAiB;AACxD,SAAO,CAAC;AACV;AAEO,SAAS,0BAKd,OACA,OACA,OACA,YAC6B;AAE7B,QAAM,WACH,MAAgD,UAChD,MAA8B;AACjC,MAAI,OAAO,aAAa,YAAY;AAClC,UAAM,WAAW;AAAA,MACf,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,UACE,OAAO,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,QAC7D;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,qBAA+B,QAAQ;AACxD,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,SAAS,MAAM,KAAK;AAC1B,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,CAAC,GAAG,MAAM;AAAA,EACnB;AACA,SAAO,CAAC,GAAI,MAAM,MAAM,WAA0B;AACpD;;;ACtEA,SAAS,gBACP,IACuB;AACvB,MAAI,OAAO,UAAa,OAAO,KAAM,QAAO,oBAAI,IAAI;AACpD,MAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,WAAO,IAAI,IAAI,EAAgB;AAAA,EACjC;AACA,MAAI,OAAO,OAAO,UAAU;AAC1B,WAAO,oBAAI,IAAI,CAAC,EAAc,CAAC;AAAA,EACjC;AACA,SAAO,oBAAI,IAAI;AACjB;AAEO,SAAS,+BAId,OAAyD;AAOzD,WAAS,qCACP,OACA,aACA,YACyC;AACzC,QAAI,YAAY,OAAO;AACrB,YAAM,WAAW,YAAY;AAAA,QAC3B,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,YACE,OAAO,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,UAC7D;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,gBAA0B,QAAQ;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,YAAY,MAAM,KAAK,YAAyB;AACpE,QAAI,oBAAoB,KAAK,GAAG;AAC9B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,IAAI;AAAA,UACV,0BAA0B,OAAO,OAAO,OAAO,UAAU;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,OAAO;AACf,YAAM,WAAW,MAAM;AAAA,QACrB,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,YACE,OAAO,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,UAC7D;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,gBAA0B,QAAQ;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAEA,WAAS,kBACP,OACA,UACA,eACS;AACT,QAAI,cAAc,SAAS,UAAU;AACnC,aAAO,cAAc,OAAO,IAAI,QAAQ;AAAA,IAC1C;AACA,UAAM,SAAS,MAAM,KAAK;AAC1B,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AACA,WAAO,OAAO,SAAS,QAAQ;AAAA,EACjC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AC/GA,SAAS,KAAAE,UAAS;AAuBX,SAAS,oBACd,YACmB;AACnB,QAAM,QAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,QAAI,UAAU,SAAS,MAAO;AAC9B,UAAM,SAAS,UAAU;AACzB,UAAM,GAAG,IACP,kBAAkB,YACd,OAAO,QAAQ,UAAU,YAAY,IACrC;AAAA,EACR;AACA,SAAOC,GAAE,OAAO,KAAK;AACvB;AAEO,SAAS,gCAKd,YAC2B;AAC3B,QAAM,QAAQ,8BAA8B,UAAU;AACtD,QAAM,MAAyD,CAAC;AAChE,aAAW,cAAc,MAAM,aAAa,OAAO,GAAG;AACpD,UAAM,eAAkD,CAAC;AACzD,eAAW,CAAC,IAAI,WAAW,KAAK,WAAW,cAAc;AACvD,UAAI,YAAY,MAAO;AACvB,mBAAa,EAAE,IACb,YAAY,gBAAgB,oBAAoB,YAAY,MAAM;AAAA,IACtE;AACA,QAAI,OAAO,WAAW,SAAS,CAAC,IAAI;AAAA,EACtC;AACA,SAAO;AACT;;;AC7CO,SAAS,mBACd,OACA,OACA,UACA,QACA;AACA,QAAM,IAAI,mBAAmB,KAAK;AAClC,QAAM,WAAoC,CAAC;AAC3C,QAAM,aAA6C,CAAC;AACpD,QAAM,cAAyB,CAAC;AAChC,MAAI;AAGJ,MAAI;AACJ,aAAW,SAAS,MAAM,SAAS;AACjC,UAAM,YAAY,MAAM,QAAQ,EAAE,OAAO,UAAU,GAAG,SAAS,CAAC;AAChE,UAAM,SAAS,UAAU,SAAS,OAAO,UAAU,CAAC;AACpD,cAAU,EAAE,KAAK,MAAM,KAAK,WAAW,OAAO;AAC9C,QAAI,YAAY,WAAW,OAAO,OAAQ;AAC1C,UAAM,QAAQ,OAAO,YAAY,MAAM;AACvC,UAAM,SAAS,UAAU,OAAO,UAAU,KAAK;AAC/C,QAAI,CAAC,OAAO,WAAW,UAAU,UAAa,OAAO,SAAS,QAAW;AACvE,cAAQ,2BAA2B,MAAM,GAAG;AAC5C;AAAA,IACF;AACA,QACE,uBAAuB,WAAW,OAAO,UAAU,GAAG,OAAO,MAAM,MAAM,GACzE;AACA,cAAQ,mBAAmB,MAAM,GAAG;AACpC;AAAA,IACF;AACA,aAAS,MAAM,GAAG,IAAI,OAAO;AAC7B,eAAW,MAAM,GAAG,IAAI;AACxB,gBAAY,KAAK,KAAK;AACtB,cAAU;AAAA,EACZ;AACA,MAAI,OAAO,SAAS,MAAM,QAAQ;AAChC,YAAQ;AACV,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,UAAU,CAAC,WAAW,YAAY,WAAW,MAAM,QAAQ;AAAA,EAC7D;AACF;;;ACKA,IAAM,yBAAyB,uBAAO,sBAAsB;AAyB5D,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChC;AAAA,EAET,YAAY,UAAmB;AAC7B,UAAM,6DAA6D;AACnE,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AACF;AAEA,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClC;AAAA,EAET,YAAY,UAAmB;AAC7B,UAAM,sDAAsD;AAC5D,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AACF;AAOO,SAAS,+BAKd,SAC8B;AAC9B,QAAM,UAAU,oBAAoB,OAAO;AAC3C,QAAM,SAAS,oBAAoB,SAAS,GAAG,CAAC,CAAC;AACjD,SAAO,OAAO,WAAW,QAAQ,EAAE,QAAQ,MAAM,IAAI;AACvD;AAOO,SAAS,mCAKd,SAG2B;AAC3B,yBAAuB,QAAQ,cAAc;AAC7C,QAAM,UAAU,oBAAoB,OAAO;AAC3C,QAAM,cAAwD,CAAC;AAC/D,MAAI,YAAY;AAEhB,QAAM,oBAAoB,CAAC,aAA4B;AACrD,QAAI,aAAa,QAAQ,gBAAgB;AACvC,YAAM,IAAI,uBAAuB,QAAQ;AAAA,IAC3C;AACA,iBAAa;AAAA,EACf;AAEA,QAAM,QAAQ,CACZ,gBACA,eACS;AACT,UAAM,QAAQ,QAAQ,WAAW,cAAc;AAC/C,QAAI,CAAC,OAAO;AACV,wBAAkB;AAClB,YAAM,WAAW,mBAAmB,SAAS,UAAU;AACvD,UAAI,SAAS,WAAW,MAAO,aAAY,KAAK,SAAS,UAAU;AACnE,UAAI,SAAS,WAAW,iBAAiB;AACvC,cAAM,IAAI,yBAAyB,SAAS,QAAQ;AAAA,MACtD;AACA;AAAA,IACF;AAEA,UAAM,CAAC,UAAU,SAAS,IAAI;AAC9B,QAAI,UAAU,SAAS,OAAO;AAC5B,YAAM,iBAAiB,GAAG,UAAU;AACpC;AAAA,IACF;AAEA,UAAM,SAAS,wBAAwB,SAAS,UAAU,SAAS;AACnE,QAAI,CAAC,OAAO,UAAU;AACpB,YAAM,IAAI,yBAAyB,QAAQ;AAAA,IAC7C;AACA,eAAW,SAAS,OAAO,OAAO,GAAG;AACnC,wBAAkB,QAAQ;AAC1B;AAAA,QACE,iBAAiB;AAAA,QACjB,UAAU,yBACN,aACA,EAAE,GAAG,YAAY,CAAC,QAAQ,GAAG,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,GAAG,CAAC,CAAC;AAAA,EACb,SAAS,OAAO;AACd,QAAI,iBAAiB,0BAA0B;AAC7C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAa,CAAC;AAAA,QACd;AAAA,QACA,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AACA,QAAI,iBAAiB,wBAAwB;AAC3C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,aAAa,CAAC;AAAA,QACd;AAAA,QACA,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,QAAM,mBAAmB,oBAAI,IAA+C;AAC5E,aAAW,cAAc,aAAa;AACpC,qBAAiB,IAAI,cAAc,UAAU,GAAG,UAAU;AAAA,EAC5D;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAa,CAAC,GAAG,iBAAiB,QAAQ,CAAC,EACxC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,wBAAwB,MAAM,KAAK,CAAC,EAC9D,IAAI,CAAC,CAAC,EAAE,UAAU,MAAM,UAAU;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,oBAKP,SACe;AACf,MAAI,cACF,QAAQ,WAAW;AACrB,QAAM,UAAU,MACb,gBAAgB;AAAA,IACf,QAAQ;AAAA,EAGV;AACF,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IAIrB,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,YAAY,OAAO,QAAQ,oBAAoB,QAAQ,WAAW,CAAC;AAAA,IACnE,eAAe,QAAQ,iBAAiB,CAAC;AAAA,IACzC,mBAAmB,QAAQ,sBAAsB,MAAM;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,oBACP,SACA,gBACA,YACyB;AACzB,QAAM,QAAQ,QAAQ,WAAW,cAAc;AAC/C,MAAI,CAAC,MAAO,QAAO,mBAAmB,SAAS,UAAU;AAEzD,QAAM,CAAC,UAAU,SAAS,IAAI;AAC9B,MAAI,UAAU,SAAS,OAAO;AAC5B,WAAO,oBAAoB,SAAS,iBAAiB,GAAG,UAAU;AAAA,EACpE;AAEA,QAAM,SAAS,wBAAwB,SAAS,UAAU,SAAS;AACnE,MAAI,aAAa,CAAC,OAAO;AACzB,aAAW,SAAS,OAAO,OAAO,GAAG;AACnC,UAAM,SAAS;AAAA,MACb;AAAA,MACA,iBAAiB;AAAA,MACjB,UAAU,yBACN,aACA,EAAE,GAAG,YAAY,CAAC,QAAQ,GAAG,MAAM;AAAA,IACzC;AACA,QAAI,OAAO,WAAW,MAAO,QAAO;AACpC,QAAI,OAAO,WAAW,gBAAiB,cAAa;AAAA,EACtD;AACA,SAAO,aACH,EAAE,QAAQ,iBAAiB,SAAS,IACpC,EAAE,QAAQ,MAAM,SAAS;AAC/B;AAEA,SAAS,mBACP,SACA,YACyB;AACzB,QAAM,YAAY,EAAE,GAAG,QAAQ,eAAe,GAAG,WAAW;AAC5D,MAAI,CAAC,QAAQ,YAAY,cAAc;AACrC,WAAO,QAAQ,kBAAkB,SAAS,IACtC,EAAE,QAAQ,OAAO,YAAY,UAAU,IACvC,EAAE,QAAQ,KAAK;AAAA,EACrB;AACA,QAAM,SAAS,QAAQ,YAAY,aAAa,UAAU,SAAS;AACnE,MAAI,OAAO,SAAS;AAClB,WAAO,QAAQ,kBAAkB,SAAS,IACtC,EAAE,QAAQ,OAAO,YAAY,UAAU,IACvC,EAAE,QAAQ,KAAK;AAAA,EACrB;AACA,MAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,WAAO,EAAE,QAAQ,gBAAgB;AAAA,EACnC;AACA,SAAO,EAAE,QAAQ,KAAK;AACxB;AAEA,SAAS,wBACP,SACA,UACA,WACa;AACb,QAAM,WAAW,4BAA4B,SAAS,SAAS;AAC/D,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,eAAe,QAAQ,GAAG;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,cAAc,QAAQ;AACjD,MAAI,CAAC,SAAS,UAAU;AACtB,WAAO,0BAA0B,SAAS,WAAW,UAAU;AAAA,EACjE;AACA,MAAI,UAAU,WAAW,SAAS,UAAU,CAAC,MAAM,QAAQ,UAAU,GAAG;AACtE,UAAM,qBAAqB,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE;AAAA,MAChD,CAAC,cACC,MAAM,QAAQ,SAAS,KACvB,UAAU;AAAA,QACR,CAAC,aAAa,cAAc,QAAQ,MAAM,cAAc,UAAU;AAAA,MACpE;AAAA,IACJ;AACA,WAAO,kBAAkB,kBAAkB;AAAA,EAC7C;AACA,QAAM,UAAU,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE;AAAA,IACrC,CAAC,cAAc,cAAc,SAAS,MAAM,cAAc,UAAU;AAAA,EACtE;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa;AACnB,UAAI,QAAS,OAAM;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,0BACP,SACA,WACA,YACa;AACb,QAAM,eAAe,UAAU,OAAO,UAAU,UAAU;AAC1D,QAAM,eACJ,UAAU,WAAW,SAAS,UAAU,MAAM,QAAQ,UAAU,IAC5D,aACA,CAAC,UAAU;AACjB,QAAM,cAAc,aAAa;AAAA,IAC/B,CAAC,WACC,CAAC,UAAU,kBACX,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF,KAAK;AAAA,EACT;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa;AACnB,UAAI,aAAa,WAAW,YAAa,OAAM;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,4BACP,SACA,WACa;AACb,MAAI,CAAC,UAAU,OAAQ,QAAO,sBAAsB;AAEpD,QAAM,SAAS,UAAU;AAAA,IACvB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,QAAQ;AAAA,EAClB;AACA,QAAM,OAAO,oBAAoB,QAAQ,WAAW,OAAO;AAC3D,QAAM,WAAW;AAAA,IACf;AAAA,IACA,UAAU,aAAa,OAAO;AAAA,EAChC;AACA,SAAO,UAAU,OAAO,UAAU,MAAS,EAAE,UACzC,yBAAyB,QAAQ,IACjC;AACN;AAEA,SAAS,yBAAyB,QAAkC;AAClE,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,QAAQ,aAAa;AACnB,YAAM;AACN,aAAO,OAAO,OAAO;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,oBACP,QACA,WACA,SACa;AACb,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,UAAI,UAAU,iBAAiB;AAC7B,eAAO;AAAA,UACL,UAAU;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,aAAO,OAAO,eAAe,aACzB,kBAAkB,OAAO,eAAe,IACxC,sBAAsB;AAAA,IAC5B;AAAA,IACA,KAAK,UAAU;AACb,YAAM,qBAAqB,UAAU,kBACjC,IAAI;AAAA,QACF,UACG;AAAA,UACC,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ,QAAQ;AAAA,QAClB,EACC,IAAI,CAAC,UAAU,cAAc,KAAK,CAAC;AAAA,MACxC,IACA;AACJ,aAAO;AAAA,QACL,OAAO,QAAQ;AAAA,UAAQ,CAAC,WACtB,OAAO,YACN,sBACC,CAAC,mBAAmB,IAAI,cAAc,OAAO,KAAK,CAAC,IACjD,CAAC,IACD,CAAC,OAAO,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,sBAAsB,MAAM;AAAA,IACrC,KAAK;AACH,aAAO,yBAAyB,OAAO,KAAK,OAAO,KAAK,OAAO,QAAQ,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,uBAAuB,OAAO,SAAS;AAAA,EAClD;AACF;AAEA,SAAS,kBAAkB,QAAwC;AACjE,QAAM,mBAAmB,oBAAI,IAAqB;AAClD,aAAW,SAAS,QAAQ;AAC1B,qBAAiB,IAAI,cAAc,KAAK,GAAG,KAAK;AAAA,EAClD;AACA,QAAM,UAAU,CAAC,GAAG,iBAAiB,QAAQ,CAAC,EAC3C,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,wBAAwB,MAAM,KAAK,CAAC,EAC9D,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,KAAK;AAC3B,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,sBAAsB,SAA6B,CAAC,GAAgB;AAC3E,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,yBACP,KACA,KACA,MACa;AACb,MAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,MAAM,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACzD,WAAO,sBAAsB;AAAA,EAC/B;AACA,MAAI,MAAM,IAAK,QAAO,kBAAkB,CAAC,CAAC;AAC1C,QAAM,QAAQ,KAAK,OAAO,MAAM,OAAO,IAAI,IAAI;AAC/C,MAAI,CAAC,OAAO,cAAc,KAAK,GAAG;AAChC,WAAO,sBAAsB,CAAC,GAAG,CAAC;AAAA,EACpC;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa;AACnB,eAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,cAAM,MAAM,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,uBACP,WAKa;AACb,QAAM,mBAAmB,CAAC,GAAG,SAAS,EAAE;AAAA,IAAK,CAAC,MAAM,UAClD,wBAAwB,KAAK,YAAY,MAAM,UAAU;AAAA,EAC3D;AACA,MACE,iBAAiB;AAAA,IACf,CAAC,EAAE,KAAK,IAAI,MACV,CAAC,OAAO,cAAc,GAAG,KAAK,CAAC,OAAO,cAAc,GAAG;AAAA,EAC3D,GACA;AACA,WAAO,sBAAsB;AAAA,EAC/B;AACA,MAAI,iBAAiB,KAAK,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,GAAG,GAAG;AACtD,WAAO,kBAAkB,CAAC,CAAC;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa;AACnB,aAAO,sBAAsB,kBAAkB,GAAG,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAEA,UAAU,sBACR,WAKA,OACA,SACkC;AAClC,QAAM,WAAW,UAAU,KAAK;AAChC,MAAI,CAAC,UAAU;AACb,UAAM,EAAE,GAAG,QAAQ;AACnB;AAAA,EACF;AACA,WAAS,QAAQ,SAAS,KAAK,SAAS,SAAS,KAAK,SAAS,GAAG;AAChE,WAAO,sBAAsB,WAAW,QAAQ,GAAG;AAAA,MACjD,GAAG;AAAA,MACH,CAAC,SAAS,UAAU,GAAG;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBAAsB,QAOf;AACd,QAAM,UAAU;AAAA,IACd,GAAG,IAAI;AAAA,MACL,OAAO,QACJ,OAAO,CAAC,WAAW,CAAC,OAAO,QAAQ,EACnC,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,IACjC;AAAA,EACF,EAAE;AAAA,IAAK,CAAC,MAAM,UACZ,wBAAwB,cAAc,IAAI,GAAG,cAAc,KAAK,CAAC;AAAA,EACnE;AACA,QAAM,MAAM,OAAO,OAAO;AAC1B,QAAM,MAAM,OAAO,OAAO,QAAQ;AAClC,MACE,CAAC,OAAO,cAAc,GAAG,KACzB,CAAC,OAAO,cAAc,GAAG,KACzB,MAAM,KACN,MAAM,KACN;AACA,WAAO,sBAAsB;AAAA,EAC/B;AACA,MAAI,MAAM,QAAQ,OAAQ,QAAO,kBAAkB,CAAC,CAAC;AACrD,QAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,MAAM;AAC9C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa;AACnB,eAAS,QAAQ,KAAK,SAAS,WAAW,SAAS,GAAG;AACpD,eAAO,sBAAsB,SAAS,OAAO,GAAG,CAAC,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eACP,QACA,WAWa;AACb,MAAI,WAAW,SAAS,OAAQ,QAAO;AACvC,MAAI,CAAC,OAAO,SAAU,QAAO,sBAAsB;AACnD,QAAM,MAAM,UAAU;AACtB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,OAAO,cAAc,GAAG,KAAK,MAAM,EAAG,QAAO,sBAAsB;AACxE,MAAI,QAAQ,WAAc,CAAC,OAAO,cAAc,GAAG,KAAK,MAAM,MAAM;AAClE,WAAO,sBAAsB;AAAA,EAC/B;AACA,MAAI,QAAQ,UAAa,CAAC,UAAU,UAAU;AAC5C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,aAAa;AACnB,eAAO,6BAA6B,OAAO,QAAQ,KAAK,CAAC,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,aAAa;AACnB,UAAI,UAAU,YAAY,QAAQ,QAAW;AAC3C,iBAAS,QAAQ,OAAO,SAAS,GAAG;AAClC,cAAI,UAAU;AACd,qBAAW,eAAe;AAAA,YACxB,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,CAAC;AAAA,UACH,GAAG;AACD,sBAAU;AACV,kBAAM;AAAA,UACR;AACA,cAAI,CAAC,QAAS;AAAA,QAChB;AAAA,MACF;AACA,YAAM,YAAY,OAAO;AACzB,eAAS,QAAQ,KAAK,SAAS,WAAW,SAAS,GAAG;AACpD,YAAI,UAAU,UAAU;AACtB,iBAAO,gCAAgC,OAAO,QAAQ,OAAO,GAAG,CAAC,CAAC;AAAA,QACpE,OAAO;AACL,iBAAO,6BAA6B,OAAO,QAAQ,OAAO,CAAC,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,UAAU,gCACR,QACA,OACA,OACA,SACmB;AACnB,MAAI,QAAQ,WAAW,OAAO;AAC5B,UAAM,CAAC,GAAG,OAAO;AACjB;AAAA,EACF;AACA,MAAI,QAAQ;AACZ,aAAW,SAAS,OAAO,GAAG;AAC5B,QAAI,SAAS,OAAO;AAClB,aAAO,gCAAgC,QAAQ,OAAO,QAAQ,GAAG;AAAA,QAC/D,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AACA,aAAS;AAAA,EACX;AACF;AAEA,UAAU,6BACR,QACA,OACA,SACmB;AACnB,MAAI,QAAQ,WAAW,OAAO;AAC5B,UAAM,CAAC,GAAG,OAAO;AACjB;AAAA,EACF;AACA,aAAW,SAAS,OAAO,GAAG;AAC5B,WAAO,6BAA6B,QAAQ,OAAO,CAAC,GAAG,SAAS,KAAK,CAAC;AAAA,EACxE;AACF;AAEA,UAAU,sBACR,QACA,OACA,OACA,SACmB;AACnB,MAAI,QAAQ,WAAW,OAAO;AAC5B,UAAM,CAAC,GAAG,OAAO;AACjB;AAAA,EACF;AACA,WAAS,QAAQ,OAAO,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACzD,WAAO,sBAAsB,QAAQ,OAAO,QAAQ,GAAG;AAAA,MACrD,GAAG;AAAA,MACH,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,OAAwB;AAC7C,SAAO,KAAK,UAAU,iBAAiB,KAAK,CAAC;AAC/C;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,gBAAgB;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAgC,EAC5C,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,SAAS,MAAS,EACvC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,wBAAwB,MAAM,KAAK,CAAC,EAC9D,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,iBAAiB,IAAI,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AACA,QAAM,IAAI,MAAM,mDAAmD;AACrE;AAEA,SAAS,wBAAwB,MAAc,OAAuB;AACpE,SAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AAChD;AAEA,SAAS,uBAAuB,OAAqB;AACnD,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,UAAM,IAAI,WAAW,iDAAiD;AAAA,EACxE;AACF;;;AChuBO,SAAS,+BACd,QACoB;AACpB,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,QAAQ;AAUd,OACG,MAAM,SAAS,gBAAgB,MAAM,SAAS,kBAC/C,MAAM,eAAe,YACrB;AACA,WAAO,MAAM,iBAAiB,UAAU;AAAA,EAC1C;AACA,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,cAAc;AAC1D,YAAQ,MAAM,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,QAAQ,EAAE;AAAA,EACpE;AACA,MAAI,MAAM,SAAS,eAAe;AAChC,WAAO,MAAM,WAAW,UAAU;AAAA,EACpC;AACA,MACE,MAAM,SAAS,mBACf,OAAO,MAAM,QAAQ,YACrB,OAAO,MAAM,QAAQ,UACrB;AACA,UAAM,OACJ,OAAO,MAAM,SAAS,YAAY,MAAM,OAAO,IAAI,MAAM,OAAO;AAClE,WAAO,KAAK,IAAI,GAAG,KAAK,OAAO,MAAM,MAAM,MAAM,OAAO,IAAI,IAAI,CAAC;AAAA,EACnE;AACA,SAAO;AACT;;;ACzBO,SAAS,yBAKd,aACA,aACA,UACA,UAAmE,CAAC,GACjC;AACnC,QAAM,IAAI,QAAQ,WAAW,mBAAmB,WAAW;AAC3D,SAAO,OAAO,QAAQ,oBAAoB,WAAW,CAAC,EAAE;AAAA,IACtD,CAAC,CAAC,KAAK,SAAS,MAAM;AACpB,UAAI,UAAU,SAAS,MAAO,QAAO,CAAC;AACtC,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,sBAAsB,GAAG,6BAA6B;AACxE,YAAM,WAAW,UAAU,OAAO,aAAa,UAAU,CAAC;AAC1D,YAAM,SAAS,UAAU,YACrB,EAAE,GAAG,UAAU,WAAW,UAAU,UAAU,IAC9C;AACJ,YAAM,eACJ,kBAAkB,YACd,UAAU,eACV,UAAU,sBAAsB,aAAa,UAAU,GAAG,MAAM;AACtE,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA,MAAM,UAAU;AAAA,UAChB;AAAA,UACA,GAAI,iBAAiB,SAAY,EAAE,aAAa,IAAI,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACZA,SAAS,sBAAsB,IAAoB;AACjD,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,aAAa,GAChB,QAAQ,UAAU,GAAG,EACrB,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,yBAAyB,OAAO,EACxC,KAAK;AACR,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,WACJ,MAAM,KAAK,EACX,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;AAEA,SAAS,kBAAkB,WAAoC;AAC7D,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,gBAAgB,WAAoC;AAC3D,SAAO,UAAU,WAAW,SAAS;AACvC;AAEA,SAAS,mBACP,QACA,UACsC;AACtC,QAAM,aAAa,OAAO,OAAO,MAAM;AACvC,QAAM,mBAAmB,WAAW,KAAK,eAAe;AACxD,MAAI,UAAU;AACZ,QAAI,SAAS,SAAS,mBAAmB,kBAAkB;AACzD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB;AACpB,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,MAAI,WAAW,WAAW,KAAK,CAAC,WAAW,KAAK,iBAAiB,GAAG;AAClE,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,QAAM,qBAAqB,OAAO,OAAO,MAAM;AAC/C,MAAI,mBAAmB,WAAW,GAAG;AACnC,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,SAAO,mBAAmB;AAAA,IACxB,CAAC,cAAc,kBAAkB,SAAS,KAAK,UAAU,SAAS;AAAA,EACpE,KAAK,mBAAmB,KAAK,iBAAiB,IAC1C,EAAE,MAAM,gBAAgB,IACxB,EAAE,MAAM,SAAS;AACvB;AAEA,SAAS,2BAA2B,aAKuC;AACzE,QAAM,QAAQ,0BAA0B,YAAY,cAAc,KAAK;AACvE,QAAM,OAAO,0BAA0B,YAAY,cAAc,IAAI;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,mBAAmB,YAAY,QAAQ,YAAY,MAAM;AAAA,IACjE,OAAO,SAAS,sBAAsB,YAAY,aAAa;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,OAAoC;AACrE,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAAS,gCACP,QACA,UACsC;AACtC,QAAM,mBAAmB,SAAS,UAAU;AAC5C,MAAI,CAAC,oBAAoB,OAAO,qBAAqB,UAAU;AAC7D,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAIlB,QAAM,eAAe,CAGnB,WAC+B;AAC/B,UAAM,eACJ,OAAO,UAAU,OAAO,SAAY,UAAU,OAAO,KAAK;AAC5D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OACE,OAAO,cAAc,UAAU,aAC9B,CAAC,OAAO,SAAS,OAAO,UAAU,OAAO,SACtC,aAAa,QACb,OAAO,UACN,OAAO,cAAc,UAAU,WAAW,aAAa,QAAQ;AAAA,MACtE,MACE,OAAO,SACN,OAAO,cAAc,SAAS,WAC3B,aAAa,OACb;AAAA,IACR;AAAA,EACF;AACA,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QAAI,MAAM,OAAO,SAAS,UAAU;AAClC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,GAAG,MAAM;AAAA,UACT,SAAS,MAAM,OAAO,QAAQ,IAAI,YAAY;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,OAAO,SAAS,cAAc;AACtC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,GAAG,MAAM;AAAA,UACT,SAAS,MAAM,OAAO,QAAQ,IAAI,YAAY;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,OAAO,SAAS,cAAe,QAAO;AAChD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,QACN,GAAG,MAAM;AAAA,QACT,WAAW,MAAM,OAAO,UAAU,IAAI,CAAC,UAAU;AAC/C,gBAAM,eAAe,UAAU,MAAM,UAAU;AAC/C,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OACE,MAAM,UACL,OAAO,cAAc,UAAU,WAC5B,aAAa,QACb;AAAA,YACN,MACE,MAAM,SACL,OAAO,cAAc,SAAS,WAC3B,aAAa,OACb;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oCACP,UAC8B;AAC9B,MAAI,SAAS,UAAW,QAAO,EAAE,QAAQ,YAAY;AACrD,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,oBAAoB;AACvB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,SAAS,WAAW;AAAA,MAC9B;AAAA,IACF,KAAK,oBAAoB;AACvB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,SAAS,WAAW;AAAA,QAC5B,MAAM,oBAAoB;AAAA,MAC5B;AAAA,IACF;AACE,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,SAAS,WAAW;AAAA,QAC5B,MAAM,SAAS;AAAA,MACjB;AAAA,EACJ;AACF;AAEO,SAAS,2BAKd,OACA,OACA,UACA,eACA,aAIA,UACA,UAII,CAAC,GAC2D;AAOhE,QAAM,cACJ,QAAQ,YAAY,eAAe,MAAM,cAAc,KAAK;AAC9D,QAAM,YAAY,MAAM,KAAK;AAC7B,QAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ;AAC5C,QAAM,SACJ,QAAQ,eACP,YAAY,UACZ,SAAS,aAAa,SAAS,SAAS,oBAAoB,kBACzD;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB,iBACvB,MAAM,cAAc,YAClB,MAAM,SACN,CAAC;AAAA,EACP,IACA;AACN,QAAM,uBAAuB,SACzB;AAAA,IACE,GAAG;AAAA,IACH,OAAO;AAAA,IACP,cAAc;AAAA,IACd,QAAQ,OAAO,UACX,EAAE,CAAC,OAAO,QAAQ,GAAG,GAAG,OAAO,QAAQ,UAAU,IACjD,CAAC;AAAA,EACP,IACA;AACJ,QAAM,oBAAoB,oBAAoB,oBAAoB;AAClE,QAAM,WAAW,2BAA2B;AAAA,IAC1C,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,eAAe,OAAO,aAAa;AAAA,EACrC,CAAC;AACD,QAAM,UAAU,QAAQ,YAAY,KAAK,mBAAmB,WAAW;AAEvE,QAAM,gCACJ,SAAS,aAAa,SAAS,SAAS,oBAAoB;AAC9D,QAAM,SAAS,gCACX;AAAA,IACE,yBAAyB,sBAAsB,aAAa,UAAU;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,IACD,MAAM,WAAW,SAAS;AAAA,EAC5B,IACA,CAAC;AACL,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,gBAAgB,GAAG,SAAS,IAAI,aAAa;AAAA,IAC7C;AAAA,IACA,OAAO,SAAS;AAAA,IAChB,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS;AAAA,IACjB,QAAQ,uBAAuB,oBAAoB;AAAA,IACnD,SAAS,mBAAmB,oBAAoB;AAAA,IAChD;AAAA,IACA,GAAI,SACA;AAAA,MACE,MAAM;AAAA,QACJ,OAAO,OAAO,OAAO;AAAA,QACrB,OAAO,YAAY,MAAO,QAAQ;AAAA,QAClC,UAAU,OAAO;AAAA,QACjB,WAAW,CAAC,CAAC;AAAA,MACf;AAAA,IACF,IACA,CAAC;AAAA,IACL,cAAc,oCAAoC,QAAQ;AAAA,IAC1D,SACE,QAAQ,4BAA4B,CAAC,SAAS,aAAa,SAAS,SAChE,CAAC,EAAE,QAAQ,SAAS,QAAQ,WAAW,SAAS,KAAK,CAAC,IACtD;AAAA,EACR;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,EACR;AACF;;;AClQA,SAAS,SAAS,OAA2C;AAC3D,QAAM,QAAQ,MAAM;AACpB,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,OAAQ,MAA6B;AAC3C,SAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEA,SAAS,wBACP,UACwC;AACxC,MAAI,SAAS,UAAW,QAAO;AAC/B,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK,oBAAoB;AACvB,aAAO;AAAA,IACT,KAAK,oBAAoB;AACvB,aAAO;AAAA,IACT,KAAK,oBAAoB;AACvB,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kCAKd,OACA,eACA,UAAwD,CAAC,GACzD;AAYA,QAAM,iBACH,MAAM,WAAW,SAAiD,UACnE,CAAC;AAEH,WAAS,sBAAsB,MAAkC;AAC/D,WAAO,eAAe,IAAI;AAAA,EAC5B;AAEA,WAAS,cACP,MACA,SACsB;AACtB,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS,WAAW,KAAK,WAAW,sBAAsB,KAAK,SAAS;AAAA,IAC1E;AAAA,EACF;AAEA,WAAS,8BACP,MACA,QACkC;AAClC,QAAI,WAAW,MAAO,QAAO,cAAc,IAAI;AAC/C,QAAI,OAAO,WAAW,SAAU,QAAO,cAAc,MAAM,MAAM;AACjE,QAAI,UAAU,OAAO,WAAW,UAAU;AACxC,aAAO;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,WAAW,OAAO;AAAA,QAClB,SACE,OAAO,WACP,KAAK,WACL,sBAAsB,OAAO,SAAS;AAAA,MAC1C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB,OAMrB;AACV,UAAM,WAAW,2BAA2B;AAAA,MAC1C,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,eAAe,MAAM;AAAA,MACrB,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,8BAA8B;AAAA,MAC9B,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,WAAO,SAAS,SAAS,SAAS,WAAW;AAAA,EAC/C;AAEA,WAAS,8BAA8B;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,+BAA+B;AAAA,IAC/B;AAAA,EACF,GAEG;AACD,UAAM,YAAY,MAAM,KAAK;AAC7B,UAAM,cAAc,MAAM,uBAAuB,WAAW,aAAa;AACzE,QAAI,CAAC;AACH,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,UACV;AAAA,UACA,wBAAwB,aAAa;AAAA,QACvC;AAAA,MACF;AACF,UAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ;AAC9C,UAAM,iBACJ,SAAS,cAAc,aACvB,QAAQ,kBAAkB;AAC5B,UAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,UAAM,uBACJ,oBAAoB,KAAK,KACzB,kBAAkB;AACpB,UAAM,mBACJ,wBACA,MAAM,QAAQ,cAAc,SAAS,cAAc,aACnD,QAAQ,MAAM,QAAQ,aAAa,QAAQ,YAAY,QAAQ,CAAC;AAClE,UAAM,cACJ,wBACC,MAAoC,gBAAgB;AAEvD,UAAM,qBAAqB,+BACtB,EAAE,MAAM,SAAS,IAClB,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACJ,UAAM,aAAa,+BACf,OACA,cAAc,kBAAkB,OAAO,UAAU,kBAAkB;AACvE,QAAI,UAAU;AACd,QAAI,oBAAoB,CAAC,eAAe,SAAS,UAAU;AACzD,gBAAU;AAAA,IACZ;AACA,QAAI,aAAsC,EAAE,OAAO,KAAK;AACxD,UAAM,eAAe,YAAY,UAAa,CAAC;AAC/C,QAAI,cAAc;AAChB,gBAAU;AACV,mBAAa;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,YAAY;AACf,mBAAa;AAAA,QACX;AAAA,QACA,qCAAqC,aAAa;AAAA,MACpD;AAAA,IACF,WAAW,oBAAoB,CAAC,aAAa;AAC3C,mBAAa;AAAA,QACX;AAAA,QACA,gBAAgB,aAAa,oCAAoC,QAAQ;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,+BACJ,SAAS,YAAY,WAAW;AAClC,UAAM,8BAA8B,SAAS,YAAY,WAAW;AACpE,QAAI;AACJ,SACG,+BAA+B,iCAChC,CAAC,gCACD,YAAY,OACZ;AACA,YAAM,mBAAmB,MAAM;AAAA,QAC7B;AAAA,QACA;AAAA,UACE,OAAO,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,UAC3D,OAAO,EAAE,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AACA,iBAAW,QAAQ,YAAY,OAAO;AACpC,YAAI,CAAC,KAAK,UAAW;AACrB,YAAI,CAAC,KAAK,UAAU,gBAAgB,GAAG;AACrC,kCAAwB,cAAc;AAAA,YACpC,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK;AAAA,YAChB,SAAS,KAAK;AAAA,UAChB,CAAC;AACD,cAAI,SAAS,YAAY,WAAW,OAAO;AACzC,yBAAa;AAAA,cACX,sBAAsB;AAAA,cACtB,sBAAsB;AAAA,YACxB;AAAA,UACF;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,2BAA2B;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV;AAAA,IACA,+BAA+B;AAAA,IAC/B;AAAA,EACF,GAIE;AACA,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,cAAc,MAAM,uBAAuB,WAAW,aAAa;AACvE,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,UACV;AAAA,UACA,gBAAgB,aAAa,gCAAgC,MAAM,KAAK,YAAY;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AACA,UAAM,uBAAuB;AAC7B,UAAM,sBAAsB;AAC5B,UAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ;AAC9C,UAAM,iBACJ,SAAS,cAAc,aACvB,QAAQ,kBAAkB;AAC5B,UAAM,cAAc,8BAA8B;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,CAAC,YAAY,MAAO,QAAO;AAC/B,UAAM,EAAE,YAAY,SAAS,uBAAuB,aAAa,IAC/D;AACF,QAAI,aAAa,YAAY;AAC7B,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,OACJ,eAAe,aAAa,WAAW,YAAY;AACrD,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA,cAAc,CAAC;AAAA,QACf;AAAA,QACA,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACE,WAAW;AAAA,YACX;AAAA,YACA,SAAS,WAAW,WAAW;AAAA,YAC/B,GAAI,wBACA,EAAE,QAAQ,sBAAsB,OAAO,IACvC,CAAC;AAAA,UACP;AAAA,UACA;AAAA,YACE;AAAA,YACA,0BAA0B,QAAQ,gBAAgB;AAAA,UACpD;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,iBAAiB,iBAAiB,QAAQ,SAAS,CAAC;AAC1D,UAAM,eAAe,YAAY,OAAO,QAAQ,eAAe,MAAM,GAAG;AACxE,UAAM,eACJ,WAAW,QAAQ,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAClE,SACA,CAAC;AACP,UAAM,SAAS,YAAY,QACvB;AAAA,MACE,YAAY;AAAA,MACZ,MAAM,cAAc,KAAK;AAAA,MACzB;AAAA,MACA,SAAS,WACL,CAAC,GAAG,gBAAgB,aAAa,gBAAgB,EAAE,CAAC,IACpD;AAAA,IACN,IACA;AACJ,UAAM,kBAAkB,SAAS,WAAW,SAAS;AACrD,UAAM,eAAe,iBAAiB,aAAa;AACnD,UAAM,kBACJ,CAAC,UACD,SAAS,YACR,CAAC,CAAC,gBACD,OAAO,KAAK,YAAY,EAAE,WAAW,KACrC,OAAO,UAAU,eAAe,KAAK,cAAc,YAAY,KAC/D,OAAO,OAAO,WAAW,eAAe,SAAS,KACjD,CAAC,OAAO;AACZ,QAAI,QAAQ;AACV,oBAAc;AAAA,QACZ,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ,eACJ,gBAAiB,aACjB,OAAO,UACL,EAAE,CAAC,OAAO,QAAQ,GAAG,GAAG,OAAO,QAAQ,UAAU,IACjD,CAAC;AAAA,QACP,cAAc,eAAe,YAAY,eAAe;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,iBAAiB,SAAS;AAChC,UAAM,kBACJ,gBAAgB,oBAAoB,eAChC,oBAAoB,aAAa,UAAU,gBAAiB,QAAQ,IACpE;AACN,UAAM,SAAS,CAAC,kBACZ;AAAA,MACE,IAAI;AAAA,MACJ,SAAS;AAAA,IACX,IACA,kBACE,mBAAmB,CAAC,gBAAgB,UAClC;AAAA,MACE,IAAI;AAAA,MACJ,SACE;AAAA,IACJ,IACA;AAAA,MACE,IAAI;AAAA,MACJ,QAAS,iBAAiB,UACtB,gBAAgB,OAChB,gBAAgB;AAAA,IACtB,IACF,iBACE,uBAAuB,aAAa,QAAQ;AAAA,MAC1C,SAAS;AAAA,IACX,CAAC,IACA;AAAA,MACC,IAAI;AAAA,MACJ,QAAQ,mCAAmC,aAAa,MAAM;AAAA,IAChE;AACR,QAAI,CAAC,OAAO,IAAI;AACd,YAAMC,sBAA0C;AAAA,QAC9C,WAAW;AAAA,QACX,MAAM,oBAAoB;AAAA,QAC1B,SAAS,OAAO;AAAA,MAClB;AACA,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA,cAAc,CAAC;AAAA,QACf,SAAS;AAAA,QACT,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACAA;AAAA,UACA,EAAE,WAAW;AAAA,QACf;AAAA,QACA,YAAY;AAAA,UACV;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAOJ,QAAI,WAAW,SAAS,SAAS,aAAa,CAAC,UAAU,eAAe;AACtE,mBAAa;AAAA,QACX;AAAA,QACA,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,QACpD;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,WAAW,SAAS,SAAS,aAAa,CAAC,UAAU,eAAe;AACtE,YAAM,eAAe,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,UACE,OAAO,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,UAC3D,OAAO;AAAA,YACL;AAAA,YACA,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF;AAAA,QACA;AAAA,MACF;AACA,iBAAW,QAAQ,YAAY,SAAS,CAAC,GAAG;AAC1C,YAAI,CAAC,KAAK,SAAU;AACpB,6BAAqB;AAAA,UACnB;AAAA,YACE,QAAQ,KAAK;AAAA,YACb,WAAW,KAAK;AAAA,YAChB,SAAS,KAAK;AAAA,UAChB;AAAA,UACA,KAAK,SAAS,YAAY;AAAA,QAC5B;AACA,YAAI,mBAAoB;AAAA,MAC1B;AACA,UAAI,oBAAoB;AACtB,YAAI,SAAS,YAAY,WAAW,OAAO;AACzC,uBAAa;AAAA,YACX,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,8BACJ,cAAc,CAAC,gBAAgB,CAAC;AAClC,UAAM,sBACJ,+BAA+B,SAAS,WACpC,+BAA+B;AAAA,MAC7B;AAAA,MACA,aAAa,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,MACjE;AAAA,MACA,SAAS,YAAY;AAAA,MACrB,eAAe;AAAA,MACf,mBAAmB,MAAM;AAAA,IAC3B,CAAC,IACD;AACN,UAAM,YACJ,gCACC,qBAAqB,WAAW,SAC9B,qBAAqB,WAAW,QAAQ,CAAC;AAC9C,UAAM,qBAA0C,YAC5C,EAAE,WAAW,KAAK,IAClB,CAAC,aACC;AAAA,MACE,WAAW;AAAA,MACX,MAAM,oBAAoB;AAAA,MAC1B,SAAS;AAAA,IACX,IACA,wBACE;AAAA,MACE,WAAW;AAAA,MACX,MAAM,sBAAsB;AAAA,MAC5B,QAAQ,sBAAsB;AAAA,MAC9B,SACE,sBAAsB,WACtB,sBAAsB;AAAA,IAC1B,IACA,qBACE;AAAA,MACE,WAAW;AAAA,MACX,MAAM,mBAAmB;AAAA,MACzB,QAAQ,mBAAmB;AAAA,MAC3B,SACE,mBAAmB,WAAW;AAAA,IAClC,IACA,qBAAqB,WAAW,OAC9B;AAAA,MACE,WAAW;AAAA,MACX,MAAM,oBAAoB;AAAA,MAC1B,SAAS;AAAA,IACX,IACA;AAAA,MACE,WAAW;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACZ,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,YAAY,SAAS,WAAW,SAAY;AAAA,QAC5C,0BAA0B,QAAQ,gBAAgB;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,GAAI,kBACA;AAAA,QACE,YAAY;AAAA,UACV,QAAQ,gBAAgB;AAAA,UACxB,UAAU,gBAAgB;AAAA,QAC5B;AAAA,MACF,IACA,CAAC;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,gCACP,OACA,UACAC,WAA2D,CAAC,GAC5D;AACA,UAAM,YAAY,MAAM,KAAK;AAC7B,UAAM,cAA4B,CAAC;AACnC,eAAW,CAAC,aAAa,KAAK,MAAM,2BAA2B,SAAS,GAAG;AACzE,YAAM,WAAW,2BAA2B;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,CAAC;AAAA,QACT,MAAM;AAAA,QACN,YAAYA,SAAQ;AAAA,MACtB,CAAC;AACD,UAAI,CAAC,SAAS,SAAS,CAAC,SAAS,QAAS;AAC1C,kBAAY,KAAK,SAAS,UAAU;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gCAAgC,OAKN;AACjC,UAAM,WAAW,2BAA2B;AAAA,MAC1C,GAAG;AAAA,MACH,QAAQ,CAAC;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,QAAI,CAAC,SAAS,MAAO,QAAO,EAAE,OAAO,MAAM;AAC3C,QAAI,CAAC,SAAS,QAAS,QAAO,EAAE,OAAO,MAAM,SAAS,MAAM;AAC5D,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY,SAAS;AAAA,MACrB,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACF;AAEA,WAAS,yBAAyB,OAI/B;AACD,UAAM,WAAW,2BAA2B;AAAA,MAC1C,GAAG;AAAA,MACH,MAAM;AAAA,IACR,CAAC;AACD,QAAI,CAAC,SAAS,SAAS,CAAC,SAAS,WAAW,CAAC,SAAS,WAAW;AAC/D,aAAO;AACT,WAAO,oBAAoB,SAAS,YAAY,UAAU,CAAC,CAAC;AAAA,EAC9D;AAEA,WAAS,2BAA2B,OAME;AACpC,UAAM,WAAW,2BAA2B;AAAA,MAC1C,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,eAAe,MAAM;AAAA,MACrB,QAAQ,CAAC;AAAA,MACT,MAAM;AAAA,MACN,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,QAAI,CAAC,SAAS,MAAO,QAAO,EAAE,OAAO,MAAM;AAC3C,QAAI,CAAC,SAAS,QAAS,QAAO,EAAE,OAAO,MAAM,SAAS,MAAM;AAC5D,UAAM,cACJ,SAAS,WAAW,aAAa,WAAW,cACxC,mCAAmC;AAAA,MACjC,aAAa,SAAS;AAAA,MACtB,aACE,MAAM,YAAY,eAAe,MAAM,cAAc,MAAM,KAAK;AAAA,MAClE,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM,YAAY;AAAA,MAC3B,mBAAmB,CAAC,eAClB,wBAAwB;AAAA,QACtB,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB;AAAA,QACA,YAAY,MAAM;AAAA,MACpB,CAAC;AAAA,MACH,gBAAgB,MAAM;AAAA,IACxB,CAAC,IACD;AACN,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,YAAY,SAAS;AAAA,MACrB,qBAAqB,SAAS;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,WAAS,mBAAmB,OAKD;AACzB,UAAM,EAAE,OAAO,UAAU,eAAe,WAAW,IAAI;AACvD,UAAM,YAAY,MAAM,KAAK;AAC7B,UAAM,cAAc,MAAM,uBAAuB,WAAW,aAAa;AACzE,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL;AAAA,QACA,OAAO,OAAO,MAAM,KAAK,YAAY;AAAA,QACrC,MAAM,SAAS,KAAK;AAAA,QACpB,cAAc;AAAA,QACd,OAAO,CAAC;AAAA,QACR,OAAO,EAAE,UAAU,CAAC,GAAG,eAAe,MAAM;AAAA,QAC5C,QAAQ,CAAC;AAAA,MACX;AAAA,IACF;AAEA,UAAM,qBACJ,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACF,UAAM,aAAa,cAAc;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,WACJ,mBAAmB,SAAS,WACxB,CAAC,GAAG,mBAAmB,MAAM,IAC7B,CAAC,GAAI,MAAM,KAAK,aAAmC;AAEzD,UAAM,WAAW,2BAA2B;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AACD,UAAM,qBACJ,SAAS,SAAS,SAAS,WAAW,aAAa,WAAW,cAC1D,EAAE,WAAW,KAAK,IAClB,SAAS,SACP,SAAS,WAAW,aAAa,WAAW,gBAC5C;AAAA,MACE,WAAW;AAAA,MACX,MAAM,oBAAoB;AAAA,MAC1B,SAAS,SAAS,WAAW,aAAa;AAAA,IAC5C,IACA,SAAS,SACP,SAAS,WAAW,aAAa,WAAW,aAC5C,SAAS,WAAW,aAAa,OACjC;AAAA,MACE,WAAW;AAAA,MACX,MAAM,SAAS,WAAW,aAAa;AAAA,MACvC,SAAS,SAAS,WAAW,aAAa;AAAA,IAC5C,IACA;AAAA,MACE,WAAW;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAEV,UAAM,eAA+D,CAAC;AACtE,UAAM,mBAAmB;AACzB,QAAI,aAAa;AACjB,UAAM,mBAAmB,mBACrB,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,OAAO,YAAY,eAAe,MAAM,cAAc,KAAK;AAAA,QAC3D,OAAO,EAAE,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,IACF,IACA;AACJ,eAAW,QAAQ,YAAY,SAAS,CAAC,GAAG;AAC1C,UAAI,cAAc,CAAC,oBAAoB,CAAC,KAAK,WAAW;AACtD,qBAAa,KAAK;AAAA,UAChB,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,UACT,WAAW,KAAK;AAAA,UAChB,SAAS,KAAK,WAAW,sBAAsB,KAAK,SAAS;AAAA,QAC/D,CAAC;AACD;AAAA,MACF;AACA,YAAM,SAAS,KAAK,UAAU,gBAAiB;AAC/C,YAAM,QAAQ,SACV,SACA,cAAc;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK;AAAA,MAChB,CAAC;AACL,mBAAa,KAAK;AAAA,QAChB,QAAQ,KAAK;AAAA,QACb,SAAS,SAAS,WAAW;AAAA,QAC7B,WAAW,SAAS,SAAY,OAAO;AAAA,QACvC,SAAS,SAAS,SAAY,OAAO;AAAA,MACvC,CAAC;AACD,UAAI,CAAC,OAAQ,cAAa;AAAA,IAC5B;AAEA,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,MAClB;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,MAAM,KAAK,YAAY;AAAA,MACrC,MAAM,SAAS,KAAK;AAAA,MACpB,cAAc,wBAAwB,kBAAkB;AAAA,MACxD,OAAO;AAAA,MACP,OAAO,EAAE,UAAU,eAAe,WAAW;AAAA,MAC7C,QAAQ,iBAAiB,OAAO,IAAI,CAAC,WAAW;AAAA,QAC9C,KAAK,MAAM;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,eAAe,+BAA+B,MAAM,MAAM;AAAA,MAC5D,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzyBO,SAAS,0BAKd,OACA,UAAwD,CAAC,GACzD;AAKA,QAAM,gBAAgB,+BAA+B,KAAK;AAC1D,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,WAAS,oBACP,OACA,OACyB;AACzB,QAAI,MAAM,SAAS,sBAAsB;AACvC,YAAM,UAAU,MAAM,QAAQ,QAAQ,MAAM,QAAQ;AACpD,aAAO,SAAS,kBAAkB,MAAM,gBACpC,EAAE,OAAO,KAAK,IACd;AAAA,QACE,OAAO;AAAA,QACP,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,IACN;AACA,QAAI,MAAM,SAAS,eAAe;AAChC,YAAM,WAAW,UAAU,2BAA2B;AAAA,QACpD;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB,QAAS,MAAM,UAAU,CAAC;AAAA,QAC1B,MAAM;AAAA,MACR,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AACA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAEA,WAAS,iBACP,OACA,OACsB;AACtB,UAAM,aAAa,oBAAoB,OAAO,KAAK;AACnD,QAAI,WAAW,OAAO;AACpB,aAAO;AAAA,IACT;AACA,UAAM,oBAAoB;AAI1B,WAAO,aAAa,kBAAkB,WAAW,kBAAkB,OAAO;AAAA,EAC5E;AAEA,SAAO;AAAA,IACL,0BAA0B,UAAU;AAAA,IACpC;AAAA,IACA,4BAA4B,UAAU;AAAA,IACtC,oBAAoB,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,mBAAmB,cAAc;AAAA,IACjC;AAAA,IACA,iCAAiC,UAAU;AAAA,IAC3C,iCAAiC,UAAU;AAAA,IAC3C,sCACE,cAAc;AAAA,IAChB,4BAA4B,UAAU;AAAA,IACtC,+BAA+B,UAAU;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AACF;;;AC7EO,SAAS,cACd,OACA,KACA,YAAiC;AAAA,EAC/B,MAAM;AAAA,EACN,YAAY,EAAE,cAAc,GAAG,cAAc,QAAQ,EAAE;AACzD,GAC2C;AAC3C,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAAG;AAC9C,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,QAAM,OAAO,IAAI,QAAQ;AACzB,QAAM,MAAM,eAAe,MAAM,IAAI,MAAM;AAC3C,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAuB;AAAA,IAC3B,OAAO,IAAI,MAAM;AAAA,IACjB,cAAc,IAAI;AAAA,IAClB,aAAa,IAAI,SAAS;AAAA,IAC1B,WAAW;AAAA,MACT,MAAM,UAAU;AAAA,MAChB,YAAY,EAAE,GAAG,UAAU,WAAW;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,QAAQ,IAAI,SAAS;AAAA,MACrB,OAAO;AAAA,QACL,GAAG,IAAI;AAAA,QACP,UAAU,IAAI,MAAM,UAAU,KAAK,UAAU,KAAK;AAAA,MACpD;AAAA,MACA,OAAO,CAAC,GAAG,IAAI,OAAO,IAAI;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AASA,SAAS,eAAe,MAAc,QAAwB;AAC5D,QAAM,SAAS,OAAO;AAItB,QAAM,SAAS,KAAK,MAAM,OAAO,UAAa,IAAI;AAClD,MAAI,IAAI,KAAK,KAAK,QAAQ,UAAU;AACpC,MAAK,IAAI,KAAK,KAAK,QAAQ,UAAU,IAAK;AAC1C,MAAK,IAAI,KAAK,KAAK,SAAS,GAAG,UAAU,IAAK;AAE9C,MAAI,KAAK,KAAK,IAAK,MAAM,IAAK,UAAU;AACxC,MAAI,KAAK,KAAK,IAAK,MAAM,IAAK,UAAU;AACxC,MAAI,IAAK,MAAM;AACf,SAAO,MAAM;AACf;;;ACjEA,IAAM,oBAAoB;AAE1B,SAAS,mBAAmB,SAGjB;AACT,QAAM,EAAE,cAAc,aAAa,IAAI;AACvC,MACE,CAAC,OAAO,cAAc,YAAY,KAClC,CAAC,OAAO,cAAc,YAAY,GAClC;AACA,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,MAAI,eAAe,cAAc;AAC/B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,eAAe,eAAe;AAC5C,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,mBAAmB;AAC7D,UAAM,IAAI;AAAA,MACR,6CAA6C,iBAAiB;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAAkC;AACpD,SAAO,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC,KAAK;AACpD;AAEO,SAAS,mBACd,SACA,KACA,YAAY,kBAKZ;AACA,QAAM,QAAQ,mBAAmB,OAAO;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAI,IAAI,cAAc,OAAO,KAAK;AAAA,IACxD,MAAM;AAAA,IACN,YAAY;AAAA,MACV,cAAc,QAAQ;AAAA,MACtB,cAAc,QAAQ;AAAA,IACxB;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,OAAO,QAAQ,eAAe;AAAA,IAC9B;AAAA,IACA,aAAa;AAAA,MACX;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,YAAY,WAAW,OAAO;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,eACd,OACA,KAKA;AACA,QAAM,CAAC,QAAQ,SAAS,IAAI,IAAI,cAAc,OAAO,KAAK;AAAA,IACxD,MAAM;AAAA,IACN,YAAY,EAAE,cAAc,GAAG,cAAc,MAAM;AAAA,EACrD,CAAC;AACD,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB;AAAA,IACA,aAAa;AAAA,MACX,WAAW;AAAA,MACX,WAAW,KAAK;AAAA,MAChB,YAAY,WAAW,OAAO;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,eACd,QACA,KACA,YAGqB,qBAKrB;AACA,QAAM,gBAAgB,CAAC,GAAG,MAAM;AAChC,MAAI,UAAU;AACd,QAAM,eAAiC,CAAC;AACxC,WACM,YAAY,cAAc,SAAS,GACvC,YAAY,GACZ,aAAa,GACb;AACA,UAAM,CAAC,WAAW,YAAY,IAAI,IAAI;AAAA,MACpC,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,YAAY,EAAE,cAAc,GAAG,cAAc,UAAU;AAAA,MACzD;AAAA,IACF;AACA,iBAAa,KAAK;AAAA,MAChB;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,YAAY,WAAW,UAAU;AAAA,IACnC,CAAC;AACD,cAAU;AACV,UAAM,UAAU,cAAc,SAAS;AACvC,UAAM,OAAO,cAAc,SAAS;AACpC,QAAI,YAAY,UAAa,SAAS,QAAW;AAC/C,YAAM,IAAI;AAAA,QACR,4CAA4C,SAAS,eAAe,SAAS,YAAY,cAAc,MAAM;AAAA,MAC/G;AAAA,IACF;AACA,kBAAc,SAAS,IAAI;AAC3B,kBAAc,SAAS,IAAI;AAAA,EAC7B;AACA,SAAO,EAAE,eAAe,SAAS,aAAa;AAChD;AAEO,SAAS,cACd,QACA,OACA,KAKA;AACA,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,MAAI,QAAQ,OAAO,QAAQ;AACzB,UAAM,IAAI;AAAA,MACR,uBAAuB,KAAK,0BAA0B,OAAO,MAAM;AAAA,IACrE;AAAA,EACF;AACA,QAAM,WAAW,eAAe,QAAQ,KAAK,cAAc;AAC3D,SAAO;AAAA,IACL,QAAQ,SAAS,cAAc,MAAM,GAAG,KAAK;AAAA,IAC7C,SAAS,SAAS;AAAA,IAClB,cAAc,SAAS;AAAA,EACzB;AACF;AAEO,SAAS,2BACd,KACsB;AACtB,MAAI,UAAU;AACd,QAAM,uBAAyC,CAAC;AAChD,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,QAAQ,SAAS;AACf,cAAM,UAAU,mBAAmB,SAAS,OAAO;AACnD,kBAAU,QAAQ;AAClB,6BAAqB,KAAK,QAAQ,WAAW;AAC7C,eAAO,QAAQ;AAAA,MACjB;AAAA,MACA,OAAO,SAAS;AACd,cAAM,UAAU,cAAc,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAClE,kBAAU,QAAQ;AAClB,6BAAqB,KAAK,GAAG,QAAQ,YAAY;AACjD,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,YAAM,UAAU,eAAe,OAAO,OAAO;AAC7C,gBAAU,QAAQ;AAClB,2BAAqB,KAAK,QAAQ,WAAW;AAC7C,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,QAAQ,QAAQ,WAAW;AACzB,YAAM,UAAU,eAAe,QAAQ,SAAS,SAAS;AACzD,gBAAU,QAAQ;AAClB,2BAAqB,KAAK,GAAG,QAAQ,YAAY;AACjD,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM,CAAC,GAAG,oBAAoB;AAAA,EAC9C;AACF;AAEO,SAAS,wBACd,WACA,KAKA;AACA,QAAM,OAAO,UAAU;AACvB,UAAQ,KAAK,KAAK;AAAA,IAChB,KAAK,MAAM;AACT,YAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ;AAC5C,YAAM,SAAmB,CAAC;AAC1B,UAAI,UAAU;AACd,YAAM,eAAiC,CAAC;AACxC,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;AACjC,cAAM,UAAU,eAAe,GAAG,OAAO;AACzC,eAAO,KAAK,QAAQ,KAAK;AACzB,kBAAU,QAAQ;AAClB,qBAAa,KAAK;AAAA,UAChB,WAAW;AAAA,UACX,WAAW,QAAQ,YAAY;AAAA,UAC/B,YAAY,QAAQ,YAAY;AAAA,QAClC,CAAC;AAAA,MACH;AACA,aAAO,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,aAAa;AAAA,IACpD;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,CAAC,QAAQ,SAAS,IAAI,IAAI,cAAc,GAAG,KAAK;AAAA,QACpD,MAAM;AAAA,QACN,YAAY,EAAE,cAAc,GAAG,cAAc,EAAE;AAAA,MACjD,CAAC;AACD,aAAO;AAAA,QACL,OAAO,EAAE,OAAO,WAAW,IAAI,UAAU,QAAQ;AAAA,QACjD;AAAA,QACA,cAAc;AAAA,UACZ;AAAA,YACE,WAAW;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,YAAY,WAAW,OAAO;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AACP,YAAM,cAAqB;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,OAAO,WAAW,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;;;AClPO,SAAS,sBAId,OAAyD;AAMzD,WAAS,sBAAiC;AACxC,UAAM,gBAAiB,MAAM,uBAC3B,MAAM,aAAa,CAAC,IAAI,CAAC;AAC3B,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,QAAI,CAAC,MAAM,WAAW,OAAO,aAAa,GAAG;AAC3C,YAAM,IAAI,MAAM,0BAA0B,aAAa,IAAI;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAEA,WAAS,eACP,OACA,WACA,WACO;AACP,UAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,UAAM,aAAa,MAAM,eACrB,MAAM,aAAa;AAAA,MACjB,UAAU,MAAM,WAAW,SAAS;AAAA,MACpC;AAAA,MACA;AAAA,MACA,SAAS,MAAM,QAAQ;AAAA,IACzB,CAAC,IACD,iBAAiB,MAAM,OAAO,CAAC,GAAG,SAAS,SAAS,eAAe;AACvE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,SAAS,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,WAAS,WAAW;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAWE;AACA,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,GAAG,MAAM;AAAA,QACT,cAAc;AAAA,MAChB;AAAA,MACA,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,SAAS,CAAC;AAAA,QACV,cAAc,EAAE,SAAS,KAAK;AAAA,QAC9B,gBACE,UAAU,eACN,OACA;AAAA,UACE,MAAM,MAAM,KAAK;AAAA,UACjB,IAAI;AAAA,QACN;AAAA,MACR;AAAA,IACF;AACA,UAAM,eAAe,eAAe,eAAe,WAAW,SAAS;AACvE,UAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,QAAI,YAAmB;AACvB,QAAI;AACJ,UAAM,eAAiC,CAAC;AACxC,QAAI;AACJ,UAAM,SAAsB,CAAC;AAC7B,QAAI,MAAM,OAAO;AACf,YAAM,SAAS,2BAA2B,aAAa,QAAQ,GAAG;AAClE,YAAM,YAAY,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,UACE;AAAA,UACA,OAAO,MAAM,cAAc,YAAY;AAAA,QACzC;AAAA,QACA,EAAE,OAAO;AAAA,MACX;AACA,YAAM,UAAU;AAAA,QAAgB,MAAM,MAAM,SAAS;AAAA,QAAG,MACtD,iBAAiB,SAAS;AAAA,MAC5B;AACA,UAAI,QAAQ,SAAS,UAAU;AAC7B,cAAM,IAAI;AAAA,UACR,QAAQ,YACL,UAAU,eACP,kBAAkB,SAAS,sCAC3B,kBAAkB,SAAS;AAAA,QACnC;AAAA,MACF;AACA,kBAAY;AAAA,QACV,GAAG,QAAQ;AAAA,QACX,SAAS,EAAE,GAAG,aAAa,SAAS,KAAK,OAAO,WAAW,EAAE;AAAA,MAC/D;AACA,mBAAa,QAAQ;AACrB,aAAO,KAAK,GAAI,QAAQ,UAAU,CAAC,CAAE;AACrC,mBAAa,KAAK,GAAG,OAAO,aAAa,CAAC;AAC1C,mBAAa,QAAQ;AAAA,IACvB;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,WAAS,sBACP,OACA,WAOA;AACA,WAAO,WAAW;AAAA,MAChB;AAAA,MACA;AAAA,MACA,WAAW,MAAM,aAAa,KAAK,EAAE;AAAA,MACrC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,WAAS,mBAAmB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAK8C;AAC5C,UAAM,4BAA4B;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AACA,UAAM,cAAc;AAAA,MAClB,MAAM,WAAW,SAAS,SAAS;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAAe,oBAAoB;AACzC,UAAM,iBAAiB,mBAAmB,EAAE,OAAO,YAAY,CAAC;AAChE,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,UACX,MAAM,WAAW,SAAS,MAAM;AAAA,UAChC,MAAM,WAAW,SAAS,SAAS;AAAA,YACjC,UAAU,MAAM,WAAW,SAAS;AAAA,YACpC,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UACL,CAAC,KAAK,CAAC;AAAA,UACP;AAAA,QACF;AAAA,QACA,cAAc,OAAO;AAAA,UACnB,UAAU,IAAI,CAAC,aAAa;AAAA,YAC1B;AAAA,YACA;AAAA,cACE,MAAM,WAAW,SAAS,MAAM;AAAA,cAChC,MAAM,WAAW,SAAS,UAAU;AAAA,gBAClC,UAAU,MAAM,WAAW,SAAS;AAAA,gBACpC,OAAO;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,GAAG;AAAA,cACL,CAAC,KAAK,CAAC;AAAA,cACP,gBAAgB,QAAQ;AAAA,YAC1B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,aAAa;AAAA,UACX,MAAM,WAAW,SAAS,MAAM;AAAA,UAChC,MAAM,WAAW,SAAS,SAAS;AAAA,YACjC,UAAU,MAAM,WAAW,SAAS;AAAA,YACpC,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG;AAAA,UACL,CAAC,KAAK,CAAC;AAAA,UACP;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ,cAAc;AAAA,UACd,MAAM;AAAA,UACN,OAAO;AAAA,UACP,eAAe,CAAC;AAAA,QAClB;AAAA,QACA,OAAO,CAAC;AAAA,QACR,SAAS;AAAA,UACP,QAAQ,CAAC;AAAA,UACT,KAAK;AAAA,YACH,MAAM,WAAW;AAAA,YACjB,QAAQ;AAAA,YACR,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAAA,UACA;AAAA,UACA,SAAS,CAAC;AAAA,UACV,cAAc,EAAE,SAAS,KAAK;AAAA,UAC9B,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,2BACP,OACA,WACgB;AAChB,UAAM,WAAW,MAAM,WAAW,SAAS;AAC3C,UAAM,eAAe,SAAS,SAAS,MAAM,SAAS;AACtD,UAAM,aAAa,MAAM,SAAS,CAAC;AACnC,UAAM,iBAAiB,MAAM;AAC7B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,aACE,MAAM,eAAe,MAAM,YAAY,SAAS,IAC5C,MAAM,cACN;AAAA,MACN,OAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,GAAI,aAAa,UAAU,CAAC;AAAA,UAC5B,GAAI,WAAW,UAAU,CAAC;AAAA,QAC5B;AAAA,QACA,WAAW;AAAA,UACT,GAAI,aAAa,aAAa,CAAC;AAAA,UAC/B,GAAI,WAAW,aAAa,CAAC;AAAA,QAC/B;AAAA,QACA,YAAY;AAAA,UACV,GAAI,aAAa,cAAc,CAAC;AAAA,UAChC,GAAI,WAAW,cAAc,CAAC;AAAA,QAChC;AAAA,QACA,oBAAoB;AAAA,UAClB,GAAI,aAAa,sBAAsB,CAAC;AAAA,UACxC,GAAI,WAAW,sBAAsB,CAAC;AAAA,QACxC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,GAAG,SAAS,SAAS,MAAM,SAAS;AAAA,QACpC,GAAG,MAAM;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,GAAG,SAAS,SAAS,MAAM,SAAS;AAAA,QACpC,GAAG,MAAM;AAAA,MACX;AAAA,MACA,gBAAgB;AAAA,QACd,GAAG,SAAS,SAAS,eAAe,SAAS;AAAA,QAC7C,GAAG,MAAM;AAAA,MACX;AAAA,MACA,aAAa;AAAA,QACX,GAAG,SAAS,SAAS,YAAY,SAAS;AAAA,QAC1C,GAAG,MAAM;AAAA,MACX;AAAA,MACA,YAAY;AAAA,QACV,GAAG,SAAS,SAAS,WAAW,SAAS;AAAA,QACzC,GAAG,MAAM;AAAA,MACX;AAAA,MACA,WACE,OAAO,KAAK,cAAc,EAAE,SAAS,IACjC,iBACA,SAAS,SAAS,UAAU,SAAS;AAAA,IAC7C;AAAA,EACF;AAEA,WAAS,kBACP,OAMA,UAYA;AACA,UAAM,UAAU,mBAAmB,KAAK;AACxC,UAAM,UAAU,WAAW;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,OAAO;AAAA,IACT,CAAC;AACD,UAAM,UAAU,SAAS,SAAS,CAAC;AACnC,UAAM,WAAW,QAAQ,YAAY,QAAQ;AAC7C,WAAO;AAAA,MACL,OAAO,MAAM,eAAe,QAAQ,KAAK;AAAA,MACzC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/B,QAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3TO,SAAS,sBAKd,OACA,cACA,WACA;AAYA,WAAS,SACP,cACqD;AACrD,WAAO,aAAa,IAAI,CAAC,iBAAiB;AAAA,MACxC,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW,YAAY;AAAA,MACvB,WAAW,YAAY;AAAA,MACvB,YAAY,YAAY;AAAA,IAC1B,EAAE;AAAA,EACJ;AAEA,WAAS,eACP,OACA,OAC+C;AAC/C,UAAM,MAAM,MAAM,aAAa,KAAK;AAEpC,UAAM,YAAY,MAAM,KAAK;AAC7B,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA,MAAM;AAAA,IACR;AACA,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL;AAAA,QACA,gBAAgB,MAAM,aAAa,gCAAgC,MAAM,KAAK,YAAY;AAAA,MAC5F;AAAA,IACF;AACA,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,2BAA2B,MAAM,QAAQ,GAAG;AAC3D,UAAM,aAAa,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,OAAO,MAAM,cAAc,KAAK;AAAA,QAChC,OAAO;AAAA,UACL,UAAU,MAAM;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AACA,UAAM,SAAS;AAAA,MACb,YAAY,OAAO,UAAU;AAAA,MAC7B,MAAM,iBAAiB,UAAU;AAAA,IACnC;AACA,WAAO,OAAO,SAAS,WACnB;AAAA,MACE,GAAG;AAAA,MACH,YAAY,OAAO,WAAW;AAAA,MAC9B,iBAAiB,OAAO,aAAa;AAAA,IACvC,IACA;AAAA,EACN;AAEA,WAAS,sBACP,OACA,OAUA;AACA,UAAM,YAAY,MAAM,KAAK;AAC7B,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA,MAAM;AAAA,IACR;AACA,QAAI,CAAC,YAAa,QAAO,EAAE,OAAO,OAAO,cAAc,CAAC,EAAE;AAC1D,UAAM,aAAc,YAAY,UAAU,CAAC;AAI3C,QAAI,UAAU,MAAM,QAAQ;AAC5B,UAAM,UAAmC,CAAC;AAC1C,UAAM,eAAiC,CAAC;AACxC,QAAI,aAAa;AACjB,eAAW,CAAC,KAAK,SAAS,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,UAAI,UAAU,SAAS,MAAO;AAC9B,YAAM;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,IAAI,wBAAwB,WAAW,OAAO;AAC9C,YAAM,SAAS,UAAU,OAAO,UAAU,KAAK;AAC/C,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,cAAc,CAAC;AAAA,UACf,OAAO,OAAO,MAAM,OACjB,IAAI,CAAC,UAAU,UAAU,GAAG,KAAK,MAAM,OAAO,EAAE,EAChD,KAAK,IAAI;AAAA,QACd;AAAA,MACF;AACA,cAAQ,GAAG,IAAI,OAAO;AACtB,gBAAU;AACV,mBAAa,KAAK,GAAG,qBAAqB;AAC1C,mBAAa;AAAA,IACf;AACA,QAAI,CAAC,WAAY,QAAO,EAAE,OAAO,OAAO,cAAc,CAAC,EAAE;AACzD,UAAM,eAAwC;AAAA,MAC5C,GAAK,MAAM,UAAU,CAAC;AAAA,MACtB,GAAG;AAAA,IACL;AACA,WAAO;AAAA,MACL,OAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,SAAS,KAAK,QAAQ;AAAA,MAC5C;AAAA,MACA,OAAO,EAAE,GAAG,OAAO,QAAQ,aAAa;AAAA,MAIxC;AAAA,IACF;AAAA,EACF;AAEA,WAAS,yBAAyB,OAAqB;AACrD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,cAAc,EAAE,SAAS,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,WAAS,yBACP,OACA,OAKO;AACP,QAAI,MAAM,kBAAkB,oCAAoC;AAC9D,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,MAAM,KAAK;AAC7B,UAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,QAAI,CAAC,oBAAoB,KAAK,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,8BAA8B,MAAM,YAAY,SAAS,CAAC;AACzE,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL;AAAA,QACA,uBAAuB,SAAS;AAAA,MAClC;AAAA,IACF;AACA,UAAM,UAAW,MAAgC;AACjD,QAAI,OAAO,YAAY,YAAY;AACjC,aAAO;AAAA,QACL;AAAA,QACA,uBAAuB,SAAS;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,SAAS,0BAA0B,OAAO,OAAO,KAAK;AAC5D,QAAI,CAAC,OAAO,SAAS,MAAM,QAAoB,GAAG;AAChD,aAAO;AAAA,QACL;AAAA,QACA,qCAAqC,MAAM,aAAa;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AAErB,UAAM,UACJ,MAAM,QAAQ,cAAc,SAAS,cAAc,YAC/C,MAAM,QAAQ,aAAa,UAC3B;AAAA,MACE;AAAA,MACA;AAAA,MACA,aAAa,CAAC;AAAA,IAChB;AACN,UAAM,WAAW,QAAQ,YAAY,MAAM,QAAoB;AAC/D,UAAM,cACH,MAAoC,gBAAgB;AACvD,QAAI,YAAY,CAAC,aAAa;AAC5B,aAAO;AAAA,QACL;AAAA,QACA,gBAAgB,MAAM,aAAa,oCAAoC,MAAM,QAAQ;AAAA,MACvF;AAAA,IACF;AAEA,UAAM,cAGF;AAAA,MACF,GAAG,QAAQ;AAAA,MACX,CAAC,MAAM,QAAQ,GAAG;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,UAAM,sBAAsB;AAAA,MAC1B,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,MAAM;AAAA,QACT,cAAc;AAAA,UACZ,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,mBAAmB,OAAO,OAAO,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC;AACrE,QAAI,iBAAiB,SAAS,GAAG;AAC/B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,sBAAsB,OAAO;AAAA,MACjC,OAAO,IAAI,CAAC,UAAU;AAAA,QACpB;AAAA,QACA;AAAA,UACE,UAAU;AAAA,UACV,QAAQ,YAAY,KAAK,GAAG,UAAU,CAAC;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,SAAS,2BAA2B,oBAAoB,QAAQ,GAAG;AACzE,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,QACE,OAAO,MAAM,cAAc,mBAAmB;AAAA,QAC9C,aAAa;AAAA,QACb,oBAAoB,CAAC,GAAG,MAAM;AAAA,QAC9B,kBAAkB,CAAC;AAAA,MACrB;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AACA,UAAM,WAAW;AAAA,MACf,QAAQ,WAAW;AAAA,MACnB,MAAM,iBAAiB,WAAW;AAAA,IACpC;AACA,QAAI,SAAS,SAAS,UAAU;AAC9B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,yBAAyB;AAAA,QAC9B,GAAG,SAAS;AAAA,QACZ,SAAS,EAAE,GAAG,oBAAoB,SAAS,KAAK,OAAO,WAAW,EAAE;AAAA,MACtE,CAAU;AAAA,MACV,GAAI,SAAS,aAAa,EAAE,YAAY,SAAS,WAAW,IAAI,CAAC;AAAA,MACjE,GAAI,SAAS,WAAW,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MAC3D,QAAQ,SAAS,UAAU,CAAC;AAAA,MAC5B,OAAO,SAAS,OAAO,aAAa,CAAC;AAAA,IACvC;AAAA,EACF;AAEA,WAAS,WACP,OACA,OACA;AACA,UAAM,UAAU,sBAAsB,OAAO,KAAK;AAClD,QAAI,QAAQ;AACV,aAAO,aAAa,yBAAyB,QAAQ,KAAK;AAC5D,UAAM,qBAAqB;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,QAAI,oBAAoB;AACtB,aAAO,mBAAmB,SAAS,WAC/B,qBACA;AAAA,QACE,GAAG;AAAA,QACH,OAAO;AAAA,UACL,GAAG,SAAS,QAAQ,YAAY;AAAA,UAChC,GAAI,mBAAmB,SAAS,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACN;AACA,UAAM,SAAS,eAAe,QAAQ,OAAO,QAAQ,KAAK;AAC1D,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,GAAG,OAAO;AAAA,QACV,SAAS;AAAA,UACP,GAAG,QAAQ,MAAM;AAAA,UACjB,KAAK,OAAO,cAAc,QAAQ,MAAM,QAAQ;AAAA,QAClD;AAAA,MACF;AAAA,MACA,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7D,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,MACvD,QAAQ,OAAO,UAAU,CAAC;AAAA,MAC1B,OAAO,SAAS;AAAA,QACd,GAAG,QAAQ;AAAA,QACX,GAAI,OAAO,mBAAmB,CAAC;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,iBAAiB,OAAqB;AAC7C,UAAM,UAAU,EAAE,GAAG,MAAM,QAAQ,QAAQ;AAC3C,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,MAAM,QAAQ,OAAO,GAAG;AAClE,YAAM,WAAW;AACjB,YAAM,QAAQ;AAGd,YAAM,cAAc,MAAM;AAAA,QACxB,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,MACR;AACA,YAAM,cAAc,aAAa,8BAA8B;AAAA,QAC7D;AAAA,QACA;AAAA,QACA,eAAe,MAAM;AAAA,MACvB,CAAC;AACD,UACE,MAAM,cAAc,MAAM,KAAK,gBAC/B,CAAC,aAAa,SACd,CAAC,YAAY,SACb,CAAC,YAAY,WAAW,OACxB;AACA,eAAO,QAAQ,QAAQ;AACvB;AAAA,MACF;AACA,YAAM,SAAS;AAAA,QACb,YAAY;AAAA,QACZ,MAAM,cAAc,KAAK;AAAA,QACzB;AAAA,QACA,MAAM;AAAA,MACR;AACA,UAAI,OAAO,OAAO,WAAW,EAAG,QAAO,QAAQ,QAAQ;AAAA;AAErD,gBAAQ,QAAQ,IAAI;AAAA,UAClB,GAAG;AAAA,UACH,QAAQ,OAAO;AAAA,QACjB;AAAA,IACJ;AACA,WAAO,EAAE,GAAG,OAAO,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,EAAE;AAAA,EAC5D;AAEA,QAAM,oBAAoB;AAU1B,WAAS,SAAS,SAAmB,UAAU,GAAG;AAChD,QAAI,QAAQ,QAAQ;AACpB,QAAI,aAAa,QAAQ;AACzB,QAAI,WAAW,QAAQ;AACvB,UAAM,SAAS,CAAC,GAAI,QAAQ,UAAU,CAAC,CAAE;AACzC,UAAM,QAAQ,CAAC,GAAI,QAAQ,SAAS,CAAC,CAAE;AACvC,WAAO,eAAe,QAAW;AAC/B,UAAI,WAAW,mBAAmB;AAChC,cAAM,IAAI;AAAA,UACR,oBAAoB,iBAAiB;AAAA,QACvC;AAAA,MACF;AACA,iBAAW;AACX,YAAM,aAAa,aAAa;AAChC,YAAM,OAAO,MAAM,KAAK;AACxB,YAAM,UAAU,UAAU,sBAAsB,OAAO,UAAU;AACjE,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,IAAI,QAAQ,MAAM,KAAK;AAAA,MACzB,CAAC;AACD,YAAM,KAAK,GAAG,SAAS,QAAQ,YAAY,CAAC;AAC5C,cAAQ,QAAQ;AAChB,aAAO,KAAK,GAAG,QAAQ,MAAM;AAC7B,mBAAa,QAAQ;AACrB,UAAI,cAAc,QAAQ,eAAe,QAAW;AAClD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,mBAAa,QAAQ;AAAA,IACvB;AACA,UAAM,kBAAkB,oBAAoB,MAAM;AAClD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,iBAAiB;AAAA,QACtB,GAAG;AAAA,QACH,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,gBAAgB;AAAA,MACvD,CAAC;AAAA,MACD,QAAQ;AAAA,MACR;AAAA,MACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,WAAS,SAAS,OAAc,OAAqB;AACnD,UAAM,UAAU,EAAE,GAAG,MAAM,QAAQ,QAAQ;AAC3C,QAAI,MAAM,SAAS,sBAAsB;AACvC,YAAM,WAAW,aAAa,iBAAiB,OAAO,KAAK;AAC3D,UAAI,SAAU,QAAO;AACrB,aAAO,QAAQ,MAAM,QAAQ;AAC7B,aAAO,SAAS;AAAA,QACd,OAAO,EAAE,GAAG,OAAO,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,EAAE;AAAA,QAC1D,OAAO,CAAC,EAAE,MAAM,uBAAuB,MAAM,CAAC;AAAA,MAChD,CAAC;AAAA,IACH;AACA,UAAM,WAAW,aAAa,2BAA2B;AAAA,MACvD;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,eAAe,MAAM;AAAA,MACrB,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,IACR,CAAC;AACD,QAAI,CAAC,SAAS,WAAW;AACvB,aAAO;AAAA,QACL,SAAS,WAAW;AAAA,QACpB,SAAS,WAAW;AAAA,MACtB;AACF,QAAI,CAAC,SAAS,MAAO,QAAO,aAAa,oBAAoB;AAC7D,QAAI,eAAe;AACnB,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,QAAQ,SAAS;AAAA,IACnB;AACA,QAAI,SAAS,YAAY;AACvB,UAAI,CAAC,SAAS,WAAW,UAAU;AACjC,gBAAQ,MAAM,QAAQ,IAAI;AAAA,UACxB,WAAW,MAAM,KAAK;AAAA,UACtB,eAAe,MAAM;AAAA,UACrB,QAAQ,SAAS,WAAW;AAAA,QAC9B;AACA,eAAO,SAAS;AAAA,UACd,OAAO,EAAE,GAAG,OAAO,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,EAAE;AAAA,UAC1D,OAAO,CAAC,EAAE,MAAM,uBAAuB,MAAM,CAAC;AAAA,QAChD,CAAC;AAAA,MACH;AACA,aAAO,QAAQ,MAAM,QAAQ;AAC7B,qBAAe,EAAE,GAAG,OAAO,SAAS,EAAE,GAAG,MAAM,SAAS,QAAQ,EAAE;AAAA,IACpE;AACA,UAAM,SAAS,WAAW,cAAc,YAAY;AACpD,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,WAAO,SAAS;AAAA,MACd,GAAG;AAAA,MACH,YAAY,OAAO;AAAA,MACnB,OAAO,CAAC,EAAE,MAAM,uBAAuB,MAAM,GAAG,GAAI,OAAO,SAAS,CAAC,CAAE;AAAA,IACzE,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,SAAS;AAC9B;;;AC7gBA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EACjE;AACA,QAAM,UAAU,OAAO,QAAQ,KAAgC,EAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS,EACjC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAE;AAClD,SAAO,IAAI,QACR,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,UAAU,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,EAAE,EAC5D,KAAK,GAAG,CAAC;AACd;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,SAAK,MAAM,WAAW,CAAC;AACvB,QAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,SAAU;AAAA,EACxE;AACA,SAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACvC;AAEA,SAAS,oBAAoB,UAA2B;AACtD,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,YAAY,YAAY,EAAE,QAAQ,SAAS,GAAG;AACzD,WAAO,EAAE;AAAA,EACX;AACA,MAAI,EAAE,YAAY,OAAO,EAAE,aAAa,UAAU;AAChD,WAAO,eAAe,gBAAgB,EAAE,QAAQ,CAAC;AAAA,EACnD;AACA,SAAO;AACT;AAEO,SAAS,8BAId,OAAyD;AACzD,SAAO;AAAA,IACL,cAIS;AACP,YAAM,WAAW,MAAM,WAAW,SAAS;AAC3C,YAAM,OAAO;AAAA,QACX,QAAQ,SAAS,gBAAgB,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,MACnE;AACA,YAAM,aAAa,gBAAgB,IAAI;AACvC,aAAO;AAAA,QACL,MAAM,KAAK,MAAM,UAAU;AAAA,QAC3B,MAAM,eAAe,UAAU;AAAA,QAC/B,iBAAiB,oBAAoB,QAAQ;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;;;ACzDO,SAAS,wBAEd,SAA2D;AAC3D,QAAM,IAAI,mBAAmB,QAAQ,WAAW;AAChD,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB;AAAA,EACF;AACF;;;ACsCO,SAAS,wBAKd,OACA,cACA;AAOA,WAAS,yBACP,QACoB;AACpB,UAAM,QAAoD,CAAC;AAC3D,UAAM,SAAS,oBAAI,IAAoB;AACvC,WAAO;AAAA,MACL,IAAI,YAAY,WAAW;AACzB,eAAO,wBAAwB,QAAQ,oBAAoB,MAAM;AAC/D,gBAAM,WAAW;AAAA,YACf;AAAA,YACA;AAAA,UACF;AACA,gBAAM,cAAc,iCAAc,QAAQ;AAC1C,gBAAM,WAAW,OAAO,IAAI,WAAW;AACvC,cAAI,SAAU,QAAO;AACrB,gBAAM,OACJ,OAAO,SAAS,kBAAkB,YAClC,SAAS,cAAc,SAAS,IAC5B,SAAS,gBACT;AACN,gBAAM,MAAM,GAAG,IAAI,IAAI,QAAQ,WAAW,CAAC;AAC3C,iBAAO,IAAI,aAAa,GAAG;AAC3B,gBAAM,GAAG,IAAI;AACb,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,MACA,UAAU;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,WAAS,sBACP,eACA,UACA,WACA,YACA,UACA;AACA,UAAM,YAAY,cAAc,KAAK;AACrC,UAAM,UAAU,IAAI;AAAA,MAClB,MAAM,WAAW,SAAS,SAAS,SAAS,cAAc,IAAI,MAAM;AAAA,IACtE;AACA,eAAW,CAAC,EAAE,WAAW,KAAK,MAAM,2BAA2B,SAAS,GAAG;AACzE,iBAAW,UAAU,mBAAmB,WAAW,GAAG;AACpD,gBAAQ,IAAI,OAAO,MAAM,CAAC;AAAA,MAC5B;AAAA,IACF;AACA,UAAM,QAAQ,CAAC,GAAG,OAAO;AACzB,QAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,UAAM,IAAI,WAAW;AACrB,UAAM,SAOF,CAAC;AACL,eAAW,UAAU,OAAO;AAC1B,YAAM,aACJ,cAAc,MAAM,MAAM,WAAW,MAAM,KAC3C,cAAc,MAAM,eAAe,MAAM;AAC3C,UAAI,eAAe,SAAU;AAC7B,YAAM,QAAQ,cAAc;AAQ5B,YAAM,eACJ,WAAW,MAAM,SAAS,CAAC,MAC3B,WAAW,MAAM,OAAO,aAAa,CAAC;AACxC,YAAM,UAAU,MAAM;AAAA,QACpB,eACK,EAAE,KAAK;AAAA,UACN;AAAA,UACA;AAAA,QACF,IACC,EAAE,KAAK,YAAY,MAAe;AAAA,MACzC,EAAE,OAAO,CAAC,WAAW;AACnB,cAAMC,cAAa,EAAE,KAAK,WAAW,MAAe;AACpD,eACE,CAACA,eACDA,YAAW,UACXA,YAAW,WAAW,SAAS,QAAQ;AAAA,MAE3C,CAAC;AACD,YAAM,qBAAqB,MACxB,2BAA2B,SAAS,EACpC;AAAA,QAAO,CAAC,CAAC,EAAE,WAAW,MACrB,mBAAmB,WAAW,EAAE,IAAI,MAAM,EAAE,SAAS,MAAM;AAAA,MAC7D,EACC,IAAI,CAAC,CAAC,aAAa,MAAM,aAAa;AACzC,YAAM,gBAAwC,CAAC;AAC/C,YAAM,mBAA6C,CAAC;AACpD,iBAAW,UAAU,SAAS;AAC5B,sBAAc,MAAM,IAAI,KAAK,UAAU,EAAE,KAAK,IAAI,MAAe,CAAC;AAClE,cAAM,UAAoB,CAAC;AAC3B,mBAAW,iBAAiB,oBAAoB;AAC9C,gBAAM,cAAc,MAAM;AAAA,YACxB;AAAA,YACA;AAAA,UACF;AACA,cAAI,CAAC,YAAa;AAClB,gBAAM,UAAU,aAAa;AAAA,YAC3B;AAAA,YACA;AAAA,UACF;AACA,gBAAM,SAAS,UAAU,EAAE,CAAC,OAAO,GAAG,OAAO,IAAI,CAAC;AAClD,gBAAM,WAAW,aAAa,2BAA2B;AAAA,YACvD,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AACD,cAAI,CAAC,SAAS,SAAS,CAAC,SAAS,QAAS;AAC1C,gBAAM,aAAa,UACf,SAAS,WAAW,OAAO,KAAK,CAAC,UAAU,MAAM,QAAQ,OAAO,GAC5D,SACJ;AACJ,gBAAM,cACJ,YAAY,SAAS,gBACrB,WAAW,eAAe,aACtB,WAAW,kBACX;AACN,cAAI,WAAW,CAAC,aAAa,SAAS,MAAM,GAAG;AAC7C;AAAA,UACF;AACA,kBAAQ;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,GAAG,SAAS;AAAA,gBACZ;AAAA,cACF;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,yBAAiB,MAAM,IAAI;AAAA,MAC7B;AACA,aAAO,MAAM,IAAI;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,WAAS,wBACP,OACA,YACuC;AACvC,UAAM,gBAAgB,MAAM,gBAAgB,KAAK;AACjD,UAAM,YAAY,cAAc,KAAK;AACrC,UAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,mBAAmB;AAAA,IAC5B;AAEA,QAAI,oBAAoB,KAAK,GAAG;AAC9B,YAAM,UAAU,MAAM,QAAQ,cAAc;AAC5C,YAAM,SAAS;AAAA,QACb;AAAA,QACA,SAAS,cAAc,YACnB,QAAQ,OAAO,IAAI,MAAM,IACzB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,EAAE,IAAI,MAAM;AAAA,MAClB;AACA,YAAM,cACJ,SAAS,cAAc,YAAY,QAAQ,cAAc,CAAC;AAC5D,YAAM,kBAAkB,OAAO;AAAA,QAC7B,CAAC,aACC,YAAY,QAAoC,MAAM;AAAA,MAC1D;AACA,YAAMC,oBAAmB,OAAO;AAAA,QAC9B,CAAC,aACC,YAAY,QAAoC,MAAM;AAAA,MAC1D;AACA,YAAMC,mBACH,MAAoC,gBAAgB,OACjD,SACAD;AACN,aAAO;AAAA,QACL,SAAS;AAAA,QACT,iBAAAC;AAAA,QACA,kBAAAD;AAAA,QACA,0BAA0B,gBAAgB,QAAQ,CAAC,mBAAmB;AACpE,gBAAM,mBAAmBA,kBAAiB;AAAA,YACxC,CAAC,aAAa,aAAa;AAAA,UAC7B;AACA,iBAAO,iBAAiB,SAAS,IAC7B,CAAC,EAAE,gBAAgB,iBAAiB,CAAC,IACrC,CAAC;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,kBAAkB,oBAAI,IAAY;AACxC,UAAM,mBAAmB,oBAAI,IAAY;AACzC,QAAI,0BAA0B;AAC9B,eAAW,CAAC,EAAE,WAAW,KAAK,MAAM,2BAA2B,SAAS,GAAG;AACzE,gCAA0B;AAC1B,YAAM,qBACJ,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACF,UAAI,mBAAmB,SAAS,UAAU;AACxC,mBAAW,YAAY,mBAAmB,QAAQ;AAChD,0BAAgB,IAAI,OAAO,QAAQ,CAAC;AACpC,cAAI,YAAY,OAAO;AACrB,6BAAiB,IAAI,OAAO,QAAQ,CAAC;AAAA,UACvC;AAAA,QACF;AACA;AAAA,MACF;AACA,YAAM,SAAS,cAAc,KAAK;AAClC,iBAAW,YAAY,OAAO,SAAS,IACnC,SACC,cAAc,MAAM,aAAmC;AAC1D,wBAAgB,IAAI,OAAO,QAAQ,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,CAAC,yBAAyB;AAC5B,iBAAW,YAAY,cAAc,KAClC,eAAoC;AACrC,wBAAgB,IAAI,OAAO,QAAQ,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,UAAM,yBAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AACA,UAAM,0BAA0B;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AACA,UAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA,cAAc,KAAK;AAAA,IACrB,EAAE,QAAQ,CAAC,mBAAmB;AAC5B,YAAM,mBAAmB,wBAAwB;AAAA,QAC/C,CAAC,aAAa,aAAa;AAAA,MAC7B;AACA,aAAO,iBAAiB,SAAS,IAC7B,CAAC,EAAE,gBAAgB,iBAAiB,CAAC,IACrC,CAAC;AAAA,IACP,CAAC;AACD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,WAAS,qBAA4D;AACnE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,iBAAiB,CAAC;AAAA,MAClB,kBAAkB,CAAC;AAAA,MACnB,0BAA0B,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,WAAS,oBACP,OACA,WACU;AACV,UAAM,WAAW,IAAI,IAAI,CAAC,GAAG,SAAS,EAAE,IAAI,MAAM,CAAC;AACnD,WAAQ,MAAM,MAAM,YACjB,IAAI,MAAM,EACV,OAAO,CAAC,aAAa,SAAS,IAAI,QAAQ,CAAC;AAAA,EAChD;AAEA,WAAS,4BAA4B,OAAqB;AACxD,UAAM,gBAAgB,MAAM,gBAAgB,KAAK;AACjD,UAAM,YAAY,cAAc,KAAK;AACrC,UAAM,QAAQ,MAAM,YAAY,SAAS;AACzC,QAAI,CAAC,oBAAoB,KAAK,EAAG,QAAO;AACxC,UAAM,UAAU,MAAM,QAAQ,cAAc;AAC5C,QAAI,CAAC,WAAW,QAAQ,cAAc,UAAW,QAAO;AACxD,UAAM,SAAS,8BAA8B,KAAK;AAClD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,WAAW,QAAQ,OAAO,IAAI,MAAM;AAC1C,UAAM,kBAAkB,SAAS;AAAA,MAC/B,CAAC,aAAa,QAAQ,YAAY,QAAoB,MAAM;AAAA,IAC9D;AACA,UAAM,mBAAmB,SAAS;AAAA,MAChC,CAAC,aAAa,QAAQ,YAAY,QAAoB,MAAM;AAAA,IAC9D;AACA,WAAO;AAAA,MACL,WAAW,OAAO,QAAQ,SAAS;AAAA,MACnC,eAAe;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,WAAS,oBACP,eACA,UACwC;AACxC,UAAM,YAAY,IAAI;AAAA,MACpB,MAAM,WAAW,SAAS,SAAS,SAAS,oBAAoB,CAAC;AAAA,IACnE;AACA,UAAM,WAAW,cAAc,MAAM;AAIrC,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,SAAS,MAAM;AAAA,QACpD;AAAA,QACA,WAAW,WACP,EAAE,GAAG,UAAU,IACf,OAAO;AAAA,UACL,OAAO,QAAQ,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;AAAA,QAC/D;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,qBACP,eACA,UACA,YACS;AACT,UAAM,OAAO,MAAM,WAAW;AAC9B,UAAM,WAAW;AAAA,MACf,GAAG,MAAM,aAAa,aAAa;AAAA,MACnC,GAAG,WAAW;AAAA,MACd,OAAO,WAAW;AAAA,MAClB;AAAA,IACF;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAEA,WAAS,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,EACnB,GAIG;AACD,UAAM,gBAAgB,MAAM,gBAAgB,KAAK;AACjD,UAAM,aAAa,wBAAwB;AAAA,MACzC,aAAa,MAAM,cAAc,aAAa;AAAA,IAChD,CAAC;AACD,UAAM,SAAS,+BAA+B;AAC9C,UAAM,WAAW,yBAAyB,MAAM;AAOhD,UAAM,QAAwC,CAAC;AAC/C,eAAW,CAAC,WAAW,QAAQ,KAAK,UAAU,QAAQ,GAAG;AACvD,YAAM,wBAAwB;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,MACE,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,YACE;AAAA,UACF;AAAA,QACF;AAAA,MACJ;AACA,YAAM,2BAA2B,sBAAsB;AAAA,QAAI,CAAC,eAC1D,SAAS,IAAI,YAAY,SAAS;AAAA,MACpC;AACA,YAAM,iBACJ,mBAAmB,SACf;AAAA,QACE,MAAM;AAAA,UAAwB;AAAA,UAAQ;AAAA,UAAiB,MACrD,qBAAqB,eAAe,UAAU,UAAU;AAAA,QAC1D;AAAA,QACA,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,MACE;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACJ;AAAA,QACA,WAAW,oBAAoB,eAAe,QAAQ;AAAA,MACxD,IACA,CAAC;AACP,YAAM,QAA6B,IAAI;AAAA,QACrC,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE,QAAQ,MAAM,QAAQ;AAAA,QACtB,mBAAmB,4BAA4B,KAAK;AAAA,QACpD,eAAe,wBAAwB,OAAO,UAAU;AAAA,QACxD,mBAAmB,SAAS,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iCAA2D;AAClE,SAAO;AAAA,IACL,gCAAgC;AAAA,IAChC,eAAe;AAAA,IACf,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,EACpB;AACF;AAEA,SAAS,wBACP,QACA,OACA,OACG;AACH,QAAM,YAAY,YAAY,IAAI;AAClC,MAAI;AACF,WAAO,MAAM;AAAA,EACf,UAAE;AACA,WAAO,KAAK,KAAK,YAAY,IAAI,IAAI;AAAA,EACvC;AACF;AAEA,SAAS,qBACP,YACA,QAC0C;AAC1C,SAAO,eAAe,YAAY,UAAU;AAAA,IAC1C,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AACD,SAAO;AACT;AAEA,SAAS,mCACP,YACA,WAC4B;AAC5B,QAAM,wBACJ,WAAW,oBAAoB,4BAA4B,UAAU;AACvE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,kBAAkB;AAAA,IAClB;AAAA,IACA,aACE,WAAW,eACX,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACL;AACF;AAEA,SAAS,4BACP,YACQ;AACR,SAAO,wBAAS;AAAA,IACd,YAAY,WAAW,OAAO;AAAA,IAC9B,UAAU,uBAAuB,sBAAsB,UAAU,CAAC;AAAA,IAClE,WAAW,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,GAAG;AAAA,IACrD,QAAQ,WAAW,OAAO,IAAI,CAAC,WAAW;AAAA,MACxC,KAAK,MAAM;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,QAAQ,uBAAuB,MAAM,MAAM;AAAA,MAC3C,cACE,MAAM,iBAAiB,SACnB,OACA,uBAAuB,MAAM,YAAY;AAAA,IACjD,EAAE;AAAA,IACF,eAAe,WAAW;AAAA,IAC1B,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,GAAG,WAAW,cAAc,IAAI,WAAW,aAAa;AAAA,EAC1E,CAAC;AACH;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIW;AACT,SAAO,wBAAS;AAAA,IACd,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,eAAe,WAAW;AAAA,IAC1B,gBAAgB,WAAW;AAAA,IAC3B,QAAQ,sBAAsB,UAAU;AAAA,EAC1C,CAAC;AACH;AAEA,SAAS,uBAAuB,OAA6B;AAC3D,QAAM,YAAY,8BAAgB,KAAK;AACvC,SAAO,0CAA0C,SAAS;AAC5D;AAEA,SAAS,0CACP,OACa;AACb,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,yCAAyC;AAAA,EAC5D;AACA,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AACzC,YAAM,aAAa,0CAA0C,IAAI;AACjE,UAAI,QAAQ,qBAAqB,MAAM,QAAQ,UAAU,GAAG;AAC1D,eAAO;AAAA,UACL;AAAA,UACA,CAAC,GAAG,UAAU,EAAE;AAAA,YAAK,CAAC,MAAM,UAC1B,qBAAqB,iCAAc,IAAI,GAAG,iCAAc,KAAK,CAAC;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AACA,aAAO,CAAC,KAAK,UAAU;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBACP,YAC6B;AAC7B,SAAO,OAAO;AAAA,IACZ,WAAW,OAAO;AAAA,MAAQ,CAAC,UACzB,MAAM,iBAAiB,SACnB,CAAC,IACD,CAAC,CAAC,MAAM,KAAK,8BAAgB,MAAM,YAAY,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAAc,OAAuB;AACjE,SAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AAChD;AAEA,SAAS,QAAQ,OAAuB;AACtC,MAAI,OAAO;AACX,QAAM,QAAQ;AACd,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAQ,OAAO,MAAM,WAAW,KAAK,CAAC;AACtC,WAAO,OAAO,QAAQ,IAAI,OAAO,KAAK;AAAA,EACxC;AACA,SAAO,KAAK,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAC3C;;;ACrnBA,SAAS,YAAY,SAAwC;AAC3D,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ,UAAU;AAAA,MAC3B,CAAC,EAAE,gBAAgB,WAAW,GAAG,SAAS,OAAO;AAAA,QAC/C,GAAG;AAAA,QACH,GAAI,iBAAiB,EAAE,gBAAgB,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC;AAAA,QAChE,GAAI,YAAY,EAAE,WAAW,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;AACA,SAAS,WAAW,QAAgD;AAClE,SAAO,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,OAAO;AAAA,IAC5C,GAAG;AAAA,IACH,GAAI,UAAU,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7C,EAAE;AACJ;AAEA,SAAS,qBACP,QASA,gBACqB;AACrB,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,OAAO,YAAY,SACtB,EAAE,MAAM,UAAU,WAAW,OAAO,UAAU,IAC9C;AAAA,MACE,MAAM;AAAA,MACN,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,IAClB;AAAA,EACN;AACA,QAAM,QAA8B,CAAC;AACrC,aAAW,SAAS,OAAO,OAAO;AAChC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,OAAO,MAAM;AAAA,QACf,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM,OAAO,MAAM,IAAI;AAAA,UACvB,IAAI,OAAO,MAAM,EAAE;AAAA,QACrB,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,UACjB,YAAY,MAAM;AAAA,QACpB,CAAC;AACD;AAAA,MACF,SAAS;AACP,cAAM,cAAqB;AAC3B,cAAM,IAAI;AAAA,UACR,mDAAoD,YAAiC,IAAI;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,eAAe,OAAO,KAAK;AAAA,IAClC,GAAI,OAAO,WAAW,EAAE,UAAU,YAAY,OAAO,QAAQ,EAAE,IAAI,CAAC;AAAA,IACpE;AAAA,IACA,QAAQ,WAAW,OAAO,UAAU,CAAC,CAAC;AAAA,EACxC;AACF;AAGO,SAAS,oBAKd,YACA,UAAgC,CAAC,GAClB;AACf,QAAM,QAAQ,0BAA0B,UAAU;AAGlD,QAAM,aAAa,CAAC,UAClB,MAAM,WAAW,KAAK;AACxB,QAAM,aAAa,CAAC,UAClB,MAAM,WAAW,KAAK;AACxB,QAAM,QAAQ,0BAA0B,YAAY;AAAA,IAClD,aACE,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAAA,EACpE,CAAC;AACD,QAAM,eAAe,0BAA0B,OAAO;AAAA,IACpD,aACE,QAAQ,0BACP,QAAQ,gBAAgB,YAAY,YAAY;AAAA,EACrD,CAAC;AACD,QAAM,YAAY,sBAAsB,KAAK;AAC7C,QAAM,WAAW,sBAAsB,OAAO,cAAc,SAAS;AACrE,QAAM,mBAAmB,8BAA8B,KAAK;AAC5D,QAAM,aAAa,wBAAwB,OAAO,YAAY;AAC9D,MAAI,oBAAoB;AACxB,SAAO;AAAA,IACL,wBAAwB;AAAA,IACxB,MAAM,WAAW,EAAE,OAAO,WAAW,SAAS,SAAAE,SAAQ,GAAG;AACvD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AACA,YAAM,SAAS,UAAU;AAAA,QACvB,EAAE,GAAG,QAAQ,SAAS,SAAS,MAAM,oBAAoBA,QAAO,EAAE;AAAA,QAClE,SAAS;AAAA,MACX;AACA,aAAO;AAAA,QACL,OAAO,MAAM,eAAe,OAAO,KAAK;AAAA,QACxC,GAAI,OAAO,WAAW,EAAE,UAAU,YAAY,OAAO,QAAQ,EAAE,IAAI,CAAC;AAAA,QACpE,QAAQ,WAAW,OAAO,MAAM;AAAA,MAClC;AAAA,IACF;AAAA,IACA,MAAM,SAAS,EAAE,OAAO,OAAO,SAAS,GAAG;AACzC,YAAM,QAAQ,WAAW,QAAQ;AACjC,YAAM,gBAAgB,MAAM,gBAAgB,WAAW,KAAK,CAAC;AAC7D,YAAM,eAAe,OAAO,EAAE,iBAAiB;AAC/C,YAAM,YAAY,MAAM;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,eAAe,MAAM;AAAA,QACrB,OAAO,OAAO,cAAc,KAAK,YAAY;AAAA,MAC/C,CAAC;AACD,YAAM,SAAS,SAAS,SAAS,eAAe,KAAK;AACrD,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,YAAY,MAAM;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,UACA,WAAW,OAAO;AAAA,UAClB,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;AAAA,QACtD,CAAC;AAAA,MACH,OAAO;AACL,cAAM,YAAY,MAAM;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,UACA,OAAO,uBAAuB,OAAO,KAAK;AAAA,QAC5C,CAAC;AACD,cAAM,OAAO,cAAc,KAAK;AAChC,cAAM,KAAK,OAAO,MAAM,KAAK;AAC7B,YAAI,OAAO,IAAI,MAAM,OAAO,EAAE;AAC5B,gBAAM,YAAY,MAAM;AAAA,YACtB,MAAM;AAAA,YACN,MAAM,OAAO,IAAI;AAAA,YACjB,IAAI,OAAO,EAAE;AAAA,YACb,QAAQ;AAAA,UACV,CAAC;AAAA,MACL;AACA,aAAO;AAAA,QAAqB;AAAA,QAAQ,CAAC,SACnC,MAAM,eAAe,MAAM,eAAe,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAAA,IACA,aAAa,MACX,iBAAiB,YAAY;AAAA,IAC/B,QAAQ,EAAE,OAAO,UAAU,GAAG;AAC5B,aAAO,WAAW,QAAQ;AAAA,QACxB,OAAO,WAAW,KAAK;AAAA,QACvB,WAAW,UAAU,IAAI,CAAC,OAAO,MAAM,cAAc,EAAE,CAAC;AAAA,MAC1D,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["z","z","vertex","edge","z","z","z","z","z","toDomainState","toDomainState","toCombinedState","toSessionState","buildContext","buildRuntimeArgs","options","z","z","descriptorDecision","options","visibility","pendingPlayerIds","activePlayerIds","options"]}