usage-tab 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../../../internal/model-registry/src/errors.ts","../../../internal/model-registry/src/resolve.ts","../../../internal/model-registry/src/pricing-period.ts","../../../internal/model-registry/src/generated/registry.ts","../src/errors.ts","../src/fixed-point.ts","../src/warnings.ts","../src/normalize/support.ts","../src/normalize/generic.ts","../src/pricing-period.ts","../src/resolve-model.ts","../src/calculate-cost.ts","../src/calculator.ts","../src/overrides.ts","../src/normalize/openai.ts","../src/normalize/anthropic.ts","../src/normalize/google.ts","../src/normalize/openai-compatible.ts"],"sourcesContent":["/**\n * usage-tab — public entry point.\n *\n * Turns normalized (or provider-raw, via an adapter) LLM usage into a\n * reproducible cost breakdown against versioned, dated, committed pricing\n * data (`@llm-kit/model-registry`, bundled into this package at build time).\n * No runtime network fetch, ever; every price is\n * estimated from committed data, not an invoice. See `README.md`.\n */\n\nexport { calculateCost } from './calculate-cost.js';\nexport { resolveModel } from './resolve-model.js';\nexport { createPriceCalculator } from './calculator.js';\nexport { createPriceOverride } from './overrides.js';\n\nexport {\n NoPricingPeriodError,\n InvalidUsageError,\n InvalidTokenCountError,\n InvalidRateError,\n} from './errors.js';\n\n// Re-exported unchanged from `@llm-kit/model-registry` (bundled into this\n// package): this package's own `resolveModel` delegates to it directly, so\n// it throws these same classes — a caller catching by `code` never needs to\n// know which package actually threw.\nexport {\n AmbiguousAliasError,\n UnknownModelError,\n InvalidLookupDateError,\n type ModelCandidate,\n} from '@llm-kit/model-registry';\n\nexport { normalizeOpenAIUsage } from './normalize/openai.js';\nexport { normalizeAnthropicUsage } from './normalize/anthropic.js';\nexport { normalizeGoogleUsage } from './normalize/google.js';\nexport { normalizeOpenAICompatibleUsage } from './normalize/openai-compatible.js';\n\nexport type {\n LlmUsage,\n PriceMode,\n PriceRequest,\n CostLine,\n CostBreakdown,\n PriceWarning,\n PriceWarningCode,\n NormalizedUsageResult,\n ResolveModelOptions,\n ResolvedModel,\n PriceOptions,\n PriceCalculatorOptions,\n PriceCalculator,\n CustomPriceInput,\n} from './types.js';\n\n// Re-exported types this package's public API is built on (bundled, never\n// published on their own — this is the only way to reach them):\nexport type {\n ModelDescriptor,\n PricingPeriod,\n ProviderId,\n RegistrySource,\n} from '@llm-kit/model-registry';\nexport { MODEL_REGISTRY, REGISTRY_VERSION } from '@llm-kit/model-registry';\n","/**\n * Stable error types for `@llm-kit/model-registry`.\n *\n * Every error extends `Error`, sets a stable string `code`, and carries an\n * actionable message. Callers branch on `code`, never on `message` text —\n * messages may be reworded.\n */\n\nexport interface ModelCandidate {\n readonly provider: string;\n readonly canonicalId: string;\n}\n\nfunction formatCandidates(candidates: readonly ModelCandidate[]): string {\n return candidates.map((c) => `${c.provider}:${c.canonicalId}`).join(', ');\n}\n\n/**\n * Raised by `validateProviderSourceFile` (via the generator and\n * `scripts/verify-pricing-data.ts`) when source data does not match the\n * registry schema. Carries every issue found, not just the first, so a\n * reviewer fixes a source file in one pass.\n */\nexport class ModelRegistrySchemaError extends Error {\n readonly code = 'SCHEMA_VALIDATION_ERROR';\n readonly issues: readonly string[];\n\n constructor(issues: readonly string[]) {\n super(\n issues.length === 1\n ? issues[0]\n : `${String(issues.length)} schema validation issue(s):\\n${issues.map((i) => ` - ${i}`).join('\\n')}`,\n );\n this.name = 'ModelRegistrySchemaError';\n this.issues = issues;\n }\n}\n\n/**\n * Raised by `resolveModel` (resolution step 6) when a requested model id\n * matches nothing — not a custom override, not a provider-qualified\n * canonical id or alias, not a globally unambiguous alias (only reachable\n * when no provider was supplied — a provider qualifier is a constraint, not\n * a hint), and no fallback was configured or matched.\n */\nexport class UnknownModelError extends Error {\n readonly code = 'UNKNOWN_MODEL';\n readonly requestedId: string;\n readonly provider?: string;\n /**\n * Set only when the lookup was provider-qualified and `requestedId` exists\n * under one or more *other* providers — the single most actionable fact\n * for this failure. Sorted, deduplicated, and never the full registry:\n * just the providers that actually carry this id.\n */\n readonly otherProviders?: readonly string[];\n\n constructor(requestedId: string, provider?: string, otherProviders?: readonly string[]) {\n super(\n provider === undefined\n ? `No model matches \"${requestedId}\". Pass a provider to qualify the lookup, register a custom override, or configure an explicit fallback.`\n : otherProviders !== undefined && otherProviders.length > 0\n ? `No model matches \"${requestedId}\" for provider \"${provider}\" — it exists under ${otherProviders.join(', ')} instead. Pass one of those as the provider, register a custom override, or configure an explicit fallback.`\n : `No model matches \"${requestedId}\" for provider \"${provider}\". Check the provider spelling, register a custom override, or configure an explicit fallback.`,\n );\n this.name = 'UnknownModelError';\n this.requestedId = requestedId;\n this.provider = provider;\n if (otherProviders !== undefined && otherProviders.length > 0) {\n this.otherProviders = otherProviders;\n }\n }\n}\n\n/**\n * Raised by `resolveModel` whenever a requested model id would resolve to\n * more than one distinct model. Ambiguity is always an error, never a guess —\n * this is the single most important invariant this package enforces, since\n * silently picking one candidate is how a caller gets billed against the\n * wrong model.\n */\nexport class AmbiguousAliasError extends Error {\n readonly code = 'AMBIGUOUS_ALIAS';\n readonly requestedId: string;\n readonly candidates: readonly ModelCandidate[];\n\n constructor(requestedId: string, candidates: readonly ModelCandidate[]) {\n super(\n `\"${requestedId}\" matches more than one model (${formatCandidates(candidates)}). ` +\n 'Pass a provider qualifier or a custom override to disambiguate — this id is never resolved by guessing.',\n );\n this.name = 'AmbiguousAliasError';\n this.requestedId = requestedId;\n this.candidates = candidates;\n }\n}\n\n/**\n * Model identity `selectPricingPeriod` can be told about, purely so a thrown\n * {@link AmbiguousPricingPeriodError} can name which model's override is\n * broken. `selectPricingPeriod` itself only ever sees a bare\n * `PricingPeriod[]` — it has no descriptor to read this from — so a caller\n * that has one (e.g. `usage-tab`'s `selectPeriodOrThrow`, which already\n * holds the full `ModelDescriptor`) passes it through explicitly. Both\n * fields are optional and independent: omitting one still produces a\n * sentence-shaped message, and omitting the whole argument reproduces the\n * exact pre-existing (identity-free) message and error shape.\n */\nexport interface AmbiguousPricingPeriodIdentity {\n readonly canonicalId?: string;\n readonly provider?: string;\n}\n\n/**\n * Raised by `selectPricingPeriod` when more than one pricing period shares\n * the same (latest-qualifying) `effectiveFrom` for a lookup date — an exact\n * tie that array order would otherwise resolve silently. `validateModelDescriptor`\n * rejects overlapping periods (and two periods with the same `effectiveFrom`\n * necessarily overlap), so this cannot happen for the generated registry;\n * it is reachable only through a caller-supplied `ModelDescriptor` (e.g.\n * `usage-tab`'s `options.overrides`) that never passed that validator.\n * Ambiguity here is treated the same as an ambiguous alias: this is a money\n * path, and a silent pick between two same-dated prices is exactly the\n * failure mode this package refuses to allow anywhere.\n *\n * `canonicalId`/`provider` are set only when the caller of\n * `selectPricingPeriod` supplied an {@link AmbiguousPricingPeriodIdentity} —\n * `selectPricingPeriod` has no descriptor of its own to read them from. A\n * caller working through many overrides (the case this identity exists for)\n * needs to know *which* one is broken, not just that some period tied;\n * `UnknownModelError`/`AmbiguousAliasError` carry the same kind of stable\n * identity for the same reason.\n */\nexport class AmbiguousPricingPeriodError extends Error {\n readonly code = 'AMBIGUOUS_PRICING_PERIOD';\n readonly at: string;\n readonly effectiveFrom: string;\n readonly count: number;\n readonly canonicalId?: string;\n readonly provider?: string;\n\n constructor(\n at: string,\n effectiveFrom: string,\n count: number,\n identity?: AmbiguousPricingPeriodIdentity,\n ) {\n const canonicalId = identity?.canonicalId;\n const provider = identity?.provider;\n const modelLabel =\n canonicalId !== undefined && provider !== undefined\n ? ` for model \"${canonicalId}\" (provider \"${provider}\")`\n : canonicalId !== undefined\n ? ` for model \"${canonicalId}\"`\n : provider !== undefined\n ? ` for provider \"${provider}\"`\n : '';\n super(\n `${String(count)} pricing periods share effectiveFrom \"${effectiveFrom}\"${modelLabel}, all covering the lookup date \"${at}\". ` +\n 'Run this override through validateModelDescriptor (or give each period a distinct effectiveFrom, or remove the duplicate) — ' +\n 'the registry never guesses between two prices for the same date.',\n );\n this.name = 'AmbiguousPricingPeriodError';\n this.at = at;\n this.effectiveFrom = effectiveFrom;\n this.count = count;\n if (canonicalId !== undefined) {\n this.canonicalId = canonicalId;\n }\n if (provider !== undefined) {\n this.provider = provider;\n }\n }\n}\n\n/**\n * Raised by `selectPricingPeriod` when the `at` lookup value cannot be\n * parsed as a date. Distinct from \"no period matches\" (a normal result,\n * represented by `undefined` — see `pricing-period.ts`), which is not an\n * error.\n */\nexport class InvalidLookupDateError extends Error {\n readonly code = 'INVALID_LOOKUP_DATE';\n readonly value: string;\n\n constructor(value: string) {\n super(`\"${value}\" is not a valid date. Pass an ISO date string or a Date instance.`);\n this.name = 'InvalidLookupDateError';\n this.value = value;\n }\n}\n","/**\n * Alias resolution.\n *\n * Implements the resolution order exactly:\n *\n * 1. exact custom override\n * 2. exact canonical ID with provider qualifier\n * 3. exact alias scoped to provider\n * 4. globally unambiguous alias\n * 5. explicit configured fallback\n * 6. `UNKNOWN_MODEL` error\n *\n * Ambiguity at any step is an error, never a guess: if a step would match\n * more than one model, `resolveModel` throws `AmbiguousAliasError`\n * immediately rather than falling through to a later step.\n */\nimport { AmbiguousAliasError, UnknownModelError, type ModelCandidate } from './errors.js';\nimport type { ModelDescriptor } from './types.js';\n\nexport type ModelMatchKind =\n 'override' | 'canonical-qualified' | 'alias-scoped' | 'alias-global' | 'fallback';\n\nexport interface ResolveModelOptions {\n /** Restricts steps 2–3 to this provider and is echoed back on the result. */\n readonly provider?: string;\n /**\n * Custom or negotiated pricing entries that take precedence over the\n * registry when their `canonicalId` or an alias exactly matches the\n * requested id (step 1).\n */\n readonly overrides?: readonly ModelDescriptor[];\n /** Canonical id to fall back to (step 5) when nothing else matches. Looked up in `registry`, not in `overrides`. */\n readonly fallback?: string;\n}\n\nexport interface ResolvedModel {\n readonly descriptor: ModelDescriptor;\n readonly matchedBy: ModelMatchKind;\n readonly requestedId: string;\n readonly requestedProvider?: string;\n}\n\nfunction toCandidate(descriptor: ModelDescriptor): ModelCandidate {\n return { provider: descriptor.provider, canonicalId: descriptor.canonicalId };\n}\n\n/**\n * Runs the provider-qualified-then-global match shape against an arbitrary\n * pool of descriptors. Shared by the override step (step 1, against\n * `options.overrides`) and the main registry steps (steps 2–4, against\n * `registry`) so both apply identical \"exact before alias, scoped before\n * global\" precedence.\n */\nfunction matchExact(\n pool: readonly ModelDescriptor[],\n id: string,\n provider: string | undefined,\n): { readonly unique?: ModelDescriptor; readonly ambiguous?: readonly ModelDescriptor[] } {\n if (provider !== undefined) {\n const canonical = pool.find((d) => d.provider === provider && d.canonicalId === id);\n if (canonical !== undefined) return { unique: canonical };\n\n const scoped = pool.filter((d) => d.provider === provider && d.aliases.includes(id));\n if (scoped.length === 1) return { unique: scoped[0] };\n if (scoped.length > 1) return { ambiguous: scoped };\n\n // A provider qualifier is a constraint, not a hint: an override pool that\n // has no match under the requested provider must not fall through to one\n // registered for a different provider — that is how a caller who did\n // everything right gets billed against the wrong model. Ambiguity within\n // the *requested* provider is still handled above; cross-provider\n // candidates are simply not a match here.\n return {};\n }\n\n const global = pool.filter((d) => d.canonicalId === id || d.aliases.includes(id));\n if (global.length === 1) return { unique: global[0] };\n if (global.length > 1) return { ambiguous: global };\n\n return {};\n}\n\n/**\n * Resolves a requested model id against a registry, following the six-step\n * order above. Throws `AmbiguousAliasError` (code `AMBIGUOUS_ALIAS`) if any\n * step matches more than one model, and `UnknownModelError` (code\n * `UNKNOWN_MODEL`) if no step matches at all.\n */\nexport function resolveModel(\n requestedId: string,\n registry: readonly ModelDescriptor[],\n options: ResolveModelOptions = {},\n): ResolvedModel {\n const provider = options.provider;\n\n // Step 1: exact custom override.\n if (options.overrides !== undefined && options.overrides.length > 0) {\n const overrideMatch = matchExact(options.overrides, requestedId, provider);\n if (overrideMatch.ambiguous !== undefined) {\n throw new AmbiguousAliasError(requestedId, overrideMatch.ambiguous.map(toCandidate));\n }\n if (overrideMatch.unique !== undefined) {\n return {\n descriptor: overrideMatch.unique,\n matchedBy: 'override',\n requestedId,\n requestedProvider: provider,\n };\n }\n }\n\n // Steps 2–3: exact canonical id, then exact alias, both scoped to `provider`.\n if (provider !== undefined) {\n const canonical = registry.find(\n (d) => d.provider === provider && d.canonicalId === requestedId,\n );\n if (canonical !== undefined) {\n return {\n descriptor: canonical,\n matchedBy: 'canonical-qualified',\n requestedId,\n requestedProvider: provider,\n };\n }\n\n const scoped = registry.filter(\n (d) => d.provider === provider && d.aliases.includes(requestedId),\n );\n if (scoped.length === 1) {\n const descriptor = scoped[0];\n if (descriptor !== undefined) {\n return { descriptor, matchedBy: 'alias-scoped', requestedId, requestedProvider: provider };\n }\n }\n if (scoped.length > 1) {\n throw new AmbiguousAliasError(requestedId, scoped.map(toCandidate));\n }\n }\n\n // Step 4: globally unambiguous alias or canonical id, across every provider.\n // Only when the caller did NOT supply a provider. A provider qualifier is a\n // constraint, not a hint: once steps 2–3 have already looked for\n // `requestedId` under `provider` and found nothing, silently answering with\n // a different provider's descriptor is how a caller who did everything\n // right gets billed at whatever rate that other provider happens to\n // charge. A qualified miss falls through to step 5 (`fallback`) or step 6\n // (`UNKNOWN_MODEL`) instead.\n if (provider === undefined) {\n const global = registry.filter(\n (d) => d.canonicalId === requestedId || d.aliases.includes(requestedId),\n );\n if (global.length === 1) {\n const descriptor = global[0];\n if (descriptor !== undefined) {\n return { descriptor, matchedBy: 'alias-global', requestedId, requestedProvider: provider };\n }\n }\n if (global.length > 1) {\n throw new AmbiguousAliasError(requestedId, global.map(toCandidate));\n }\n }\n\n // Step 5: explicit configured fallback.\n if (options.fallback !== undefined) {\n const fallback = registry.find((d) => d.canonicalId === options.fallback);\n if (fallback !== undefined) {\n return {\n descriptor: fallback,\n matchedBy: 'fallback',\n requestedId,\n requestedProvider: provider,\n };\n }\n }\n\n // Step 6: nothing matched anywhere. When the miss was provider-qualified,\n // tell the caller if `requestedId` exists under a *different* provider —\n // the single most actionable fact for someone who hit this (they likely\n // typed the right id and the wrong provider) — without dumping the rest of\n // the registry. Sorted for a deterministic message.\n if (provider !== undefined) {\n const otherProviders = [\n ...new Set(\n registry\n .filter((d) => d.canonicalId === requestedId || d.aliases.includes(requestedId))\n .map((d) => d.provider),\n ),\n ].sort();\n if (otherProviders.length > 0) {\n throw new UnknownModelError(requestedId, provider, otherProviders);\n }\n }\n throw new UnknownModelError(requestedId, provider);\n}\n","/**\n * Effective-date pricing-period selection.\n */\nimport {\n AmbiguousPricingPeriodError,\n InvalidLookupDateError,\n type AmbiguousPricingPeriodIdentity,\n} from './errors.js';\nimport type { PricingPeriod } from './types.js';\n\nfunction toTimestamp(value: Date | string): number {\n const ms = value instanceof Date ? value.getTime() : Date.parse(value);\n if (Number.isNaN(ms)) {\n throw new InvalidLookupDateError(value instanceof Date ? value.toISOString() : value);\n }\n return ms;\n}\n\n/**\n * Selects the pricing period active at `at`.\n *\n * A period is active for `effectiveFrom <= at < effectiveTo`; `effectiveTo`\n * is exclusive, so a restated price takes over cleanly with no shared\n * instant between two periods. A period with no `effectiveTo` is open-ended\n * and stays active until superseded by a later `effectiveFrom`.\n *\n * Among qualifying periods, the one with the latest `effectiveFrom` wins, on\n * the theory that it is the most recent restatement for that moment. If more\n * than one qualifying period shares that same (latest) `effectiveFrom` —\n * an exact tie — this throws {@link AmbiguousPricingPeriodError} rather than\n * picking one by array order. Well-formed data never produces this:\n * `validateModelDescriptor` rejects overlapping periods, and two periods\n * with the same `effectiveFrom` necessarily overlap, so the only way to\n * reach this path is a caller-supplied `ModelDescriptor` (e.g. `usage-tab`'s\n * `options.overrides`) that was never run through that validator. Ambiguity\n * is surfaced explicitly, never guessed — the same stance this registry\n * already takes for an ambiguous alias (`AmbiguousAliasError`).\n *\n * Returns `undefined` when `at` precedes every known period — a historical\n * price lookup before the first known period. This is a normal result, not\n * an error: callers decide whether an unpriced historical lookup should\n * warn, fall back, or fail.\n *\n * `at` is a required parameter rather than defaulting to \"now\" — this keeps\n * the function pure and its result reproducible from its arguments alone;\n * callers that want \"now\" pass `new Date()` explicitly.\n *\n * `identity` is optional and purely cosmetic: this function only ever sees a\n * bare `periods` array, never a full `ModelDescriptor`, so it cannot name\n * the model itself in a thrown {@link AmbiguousPricingPeriodError}. A caller\n * that has the descriptor (`usage-tab`'s `selectPeriodOrThrow`, for\n * instance) can pass `{ canonicalId, provider }` so the error is actionable\n * across many overrides, not just \"some period tied.\" Omitting it reproduces\n * the exact pre-existing message and error shape — nothing about the\n * non-error return path changes.\n */\nexport function selectPricingPeriod(\n periods: readonly PricingPeriod[],\n at: Date | string,\n identity?: AmbiguousPricingPeriodIdentity,\n): PricingPeriod | undefined {\n const atMs = toTimestamp(at);\n\n let best: PricingPeriod | undefined;\n let bestFromMs = Number.NEGATIVE_INFINITY;\n let tieCount = 0;\n\n for (const period of periods) {\n const fromMs = toTimestamp(period.effectiveFrom);\n if (fromMs > atMs) continue;\n if (period.effectiveTo !== undefined && atMs >= toTimestamp(period.effectiveTo)) continue;\n if (fromMs > bestFromMs) {\n best = period;\n bestFromMs = fromMs;\n tieCount = 1;\n } else if (fromMs === bestFromMs) {\n tieCount += 1;\n }\n }\n\n if (best !== undefined && tieCount > 1) {\n throw new AmbiguousPricingPeriodError(\n at instanceof Date ? at.toISOString() : at,\n best.effectiveFrom,\n tieCount,\n identity,\n );\n }\n\n return best;\n}\n","/**\n * GENERATED FILE — DO NOT EDIT BY HAND.\n *\n * Produced by `scripts/generate-model-registry.ts` from the reviewed source\n * files under `docs/provider-data/`. Editing this file directly is forbidden.\n *\n * Regenerate: pnpm exec tsx scripts/generate-model-registry.ts\n * Verify: pnpm exec tsx scripts/generate-model-registry.ts --check\n */\nimport type { ModelDescriptor } from '../types.js';\n\nexport const REGISTRY_VERSION = \"registry-5af85ce1a47be918\";\n\nexport const MODEL_REGISTRY: readonly ModelDescriptor[] = [\n {\n canonicalId: \"claude-fable-5\",\n provider: \"anthropic\",\n aliases: [],\n family: \"fable\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"10.00\",\"output\":\"50.00\",\"cachedInput\":\"1.00\",\"cacheWrite\":\"12.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-haiku-4-5-20251001\",\n provider: \"anthropic\",\n aliases: [\"claude-haiku-4-5\"],\n family: \"haiku\",\n contextWindow: 200000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.00\",\"output\":\"5.00\",\"cachedInput\":\"0.10\",\"cacheWrite\":\"1.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"canonicalId is the full dated snapshot id; \\\"claude-haiku-4-5\\\" is the short alias Anthropic documents alongside it — a genuine alias/canonical-ID resolution case.\"]},\n },\n {\n canonicalId: \"claude-opus-4-6\",\n provider: \"anthropic\",\n aliases: [],\n family: \"opus\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"25.00\",\"cachedInput\":\"0.50\",\"cacheWrite\":\"6.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-opus-4-7\",\n provider: \"anthropic\",\n aliases: [],\n family: \"opus\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"25.00\",\"cachedInput\":\"0.50\",\"cacheWrite\":\"6.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-opus-4-8\",\n provider: \"anthropic\",\n aliases: [],\n family: \"opus\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"25.00\",\"cachedInput\":\"0.50\",\"cacheWrite\":\"6.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-opus-5\",\n provider: \"anthropic\",\n aliases: [],\n family: \"opus\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"25.00\",\"cachedInput\":\"0.50\",\"cacheWrite\":\"6.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-sonnet-4-6\",\n provider: \"anthropic\",\n aliases: [],\n family: \"sonnet\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"3.00\",\"output\":\"15.00\",\"cachedInput\":\"0.30\",\"cacheWrite\":\"3.75\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Anthropic did not publish an explicit effective date for this rate as observed; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-sonnet-5\",\n provider: \"anthropic\",\n aliases: [],\n family: \"sonnet\",\n contextWindow: 1000000,\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"effectiveTo\":\"2026-09-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"10.00\",\"cachedInput\":\"0.20\",\"cacheWrite\":\"2.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Introductory rate, confirmed active through 2026-08-31. This is the golden fixture for effective-date selection (see test/pricing-period.test.ts): a lookup dated 2026-08-15 must select this period.\",\"effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true introductory-rate start date; only the 2026-08-31 end date was observed.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n {\"effectiveFrom\":\"2026-09-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"3.00\",\"output\":\"15.00\",\"cachedInput\":\"0.30\",\"cacheWrite\":\"3.75\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Standard rate, effective 2026-09-01 immediately after the introductory-rate window (through 2026-08-31) ends. A lookup dated 2026-09-15 must select this period.\",\"cacheWrite reflects the 5-minute cache TTL (1.25x input). The 1-hour TTL write multiplier is 2x input and is not separately modeled by this schema (a single cacheWrite field).\"]},\n ],\n source: {\"url\":\"https://platform.claude.com/docs/en/about-claude/models/overview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Two pricing periods on purpose: an introductory rate ($2.00/$10.00) through 2026-08-31, then the standard rate ($3.00/$15.00) from 2026-09-01.\"]},\n },\n {\n canonicalId: \"amazon-nova-lite\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"amazon-nova\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.60\",\"output\":\"2.40\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No explicit effective date published for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Same cross-region/in-region caveat as amazon-nova-micro.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"amazon-nova-micro\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"amazon-nova\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.30\",\"output\":\"1.20\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"AWS's own first-party model (Amazon publishes both Bedrock and Nova), so \\\"aws-bedrock\\\" is effectively first-party pricing here, unlike the resold third-party models in this file.\",\"No explicit effective date published for this specific rate (unlike the Claude 3.5 Sonnet rows above, which do carry a stated Dec 2025 date); effectiveFrom is set conservatively to 2026-01-01.\",\"Bedrock's pricing page also distinguishes \\\"Global cross-region\\\" vs \\\"in-region\\\" inference pricing for Nova; this rate was not confirmed to be specifically the in-region (vs cross-region) figure — treat as the headline on-demand rate observed.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"amazon-nova-pro\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"amazon-nova\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.20\",\"output\":\"4.80\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No explicit effective date published for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Same cross-region/in-region caveat as amazon-nova-micro.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-3.5-sonnet\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"anthropic-claude\",\n pricing: [\n {\"effectiveFrom\":\"2025-12-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"6.00\",\"output\":\"30.00\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"AWS Bedrock's own rate card for this Anthropic model, explicitly labeled \\\"Effective 1 Dec 2025\\\" on the pricing page — a real, confirmed effective date, not the conservative default used elsewhere in this file.\",\"Batch: $3.00/$15.00 (confirmed 0.5x standard) as observed on the same page.\",\"This is Bedrock's own price for an older Claude generation (3.5 Sonnet), not the current claude-sonnet-5 model in anthropic.json — no comparable first-party entry exists in this registry for the same model, so no direct parity claim is possible or intended. Bedrock and Azure resell other vendors' models under their own rate cards, so a first-party price is never a safe proxy for theirs.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"claude-3.5-sonnet-v2\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"anthropic-claude\",\n pricing: [\n {\"effectiveFrom\":\"2025-12-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"6.00\",\"output\":\"30.00\",\"cachedInput\":\"0.60\",\"cacheWrite\":\"7.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"AWS Bedrock's own rate card, explicitly labeled \\\"Effective 1 Dec 2025\\\" on the pricing page.\",\"Batch: $3.00/$15.00 (confirmed 0.5x standard) as observed on the same page.\",\"Bedrock's own price for an older Claude generation; not comparable to any first-party entry currently in anthropic.json (which covers 4.x/5.x models only).\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemma-4-31b\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"google-gemma\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.14\",\"output\":\"0.40\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No explicit effective date published for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Cross-provider alias/canonicalId collision (allowed, not an error): Together AI also lists \\\"Gemma 4 31B\\\" (together.json: gemma-4-31b) at a different, higher rate ($0.39/$0.97 as observed) — same underlying Google open-weight model, independently priced by each reseller; do not assume parity.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mistral-large-3\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"mistral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No explicit effective date published for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Cross-provider alias/canonicalId collision (allowed, not an error): Mistral's own first-party pricing (mistral.json: mistral-large-3) shows the identical $0.50/$1.50 figure as independently observed — coincidental agreement between the two independently fetched sources, not assumed; both were confirmed directly.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"nemotron-nano-2\",\n provider: \"aws-bedrock\",\n aliases: [],\n family: \"nvidia-nemotron\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.06\",\"output\":\"0.23\",\"sourceUrl\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No explicit effective date published for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://aws.amazon.com/bedrock/pricing/\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-3.5-turbo\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-3.5\",\n pricing: [\n {\"effectiveFrom\":\"2025-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"The Retail Prices API returned exactly one row for this legacy SKU (a single primary-meter-region price, no per-region breakdown) rather than the ~24-28 region-duplicated rows seen for actively-priced SKUs — a single global list price, which is consistent with (not contradictory to) Global-deployment region-independence, but could not be cross-region spot-checked the way other entries were.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"Matches OpenAI's own first-party rate for \\\"gpt-3.5-turbo\\\" in openai.json exactly as observed ($0.50/$1.50) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-3.5-turbo\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4\",\n pricing: [\n {\"effectiveFrom\":\"2025-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"30.00\",\"output\":\"60.00\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"The Retail Prices API returned exactly one row for this legacy SKU (a single primary-meter-region price, no per-region breakdown) rather than the ~24-28 region-duplicated rows seen for actively-priced SKUs — a single global list price, which is consistent with (not contradictory to) Global-deployment region-independence, but could not be cross-region spot-checked the way other entries were.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"No comparable first-party entry exists in openai.json's 2026-08-05 snapshot for \\\"gpt-4\\\" (it is either a legacy/superseded model no longer on OpenAI's current pricing page, or a variant OpenAI does not sell directly) — Azure's own resale rate is recorded as observed with no parity claim possible or intended.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4-32k\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4\",\n pricing: [\n {\"effectiveFrom\":\"2025-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"60.00\",\"output\":\"120.00\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"The Retail Prices API returned exactly one row for this legacy SKU (a single primary-meter-region price, no per-region breakdown) rather than the ~24-28 region-duplicated rows seen for actively-priced SKUs — a single global list price, which is consistent with (not contradictory to) Global-deployment region-independence, but could not be cross-region spot-checked the way other entries were.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"No comparable first-party entry exists in openai.json's 2026-08-05 snapshot for \\\"gpt-4-32k\\\" (it is either a legacy/superseded model no longer on OpenAI's current pricing page, or a variant OpenAI does not sell directly) — Azure's own resale rate is recorded as observed with no parity claim possible or intended.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4-turbo\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4-turbo\",\n pricing: [\n {\"effectiveFrom\":\"2024-06-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"10.00\",\"output\":\"30.00\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 23 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"No comparable first-party entry exists in openai.json's 2026-08-05 snapshot for \\\"gpt-4-turbo\\\" (it is either a legacy/superseded model no longer on OpenAI's current pricing page, or a variant OpenAI does not sell directly) — Azure's own resale rate is recorded as observed with no parity claim possible or intended.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4.1\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4.1\",\n pricing: [\n {\"effectiveFrom\":\"2025-04-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"8.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 28 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-4.1\\\" in openai.json exactly as observed ($2.00/$8.00/$0.50 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-4.1\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4.1-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4.1\",\n pricing: [\n {\"effectiveFrom\":\"2025-04-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.40\",\"output\":\"1.60\",\"cachedInput\":\"0.10\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 28 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-4.1-mini\\\" in openai.json exactly as observed ($0.40/$1.60/$0.10 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-4.1-mini\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4.1-nano\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4.1\",\n pricing: [\n {\"effectiveFrom\":\"2025-04-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.10\",\"output\":\"0.40\",\"cachedInput\":\"0.025\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 28 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-4.1-nano\\\" in openai.json exactly as observed ($0.10/$0.40/$0.025 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-4.1-nano\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4o\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4o\",\n pricing: [\n {\"effectiveFrom\":\"2024-12-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.50\",\"output\":\"10.00\",\"cachedInput\":\"1.25\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 27 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-4o\\\" in openai.json exactly as observed ($2.50/$10.00/$1.25 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-4o\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4o-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-4o\",\n pricing: [\n {\"effectiveFrom\":\"2024-07-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.60\",\"cachedInput\":\"0.075\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 28 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-4o-mini\\\" in openai.json exactly as observed ($0.15/$0.60/$0.075 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-4o-mini\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2025-08-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"10.00\",\"cachedInput\":\"0.125\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5\\\" in openai.json exactly as observed ($1.25/$10.00/$0.125 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2025-08-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.25\",\"output\":\"2.00\",\"cachedInput\":\"0.025\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 27 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5-mini\\\" in openai.json exactly as observed ($0.25/$2.00/$0.025 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5-mini\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5-nano\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2025-08-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.05\",\"output\":\"0.40\",\"cachedInput\":\"0.005\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 27 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5-nano\\\" in openai.json exactly as observed ($0.05/$0.40/$0.005 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5-nano\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5-pro\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2025-10-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"15.00\",\"output\":\"120.00\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5-pro\\\" in openai.json exactly as observed ($15.00/$120.00) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5-pro\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.1\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.1\",\n pricing: [\n {\"effectiveFrom\":\"2025-11-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"10.00\",\"cachedInput\":\"0.125\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.1\\\" in openai.json exactly as observed ($1.25/$10.00/$0.125 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.1\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.2\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.2\",\n pricing: [\n {\"effectiveFrom\":\"2025-12-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.75\",\"output\":\"14.00\",\"cachedInput\":\"0.175\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.2\\\" in openai.json exactly as observed ($1.75/$14.00/$0.175 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.2\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.2-pro\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.2\",\n pricing: [\n {\"effectiveFrom\":\"2025-12-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"21.00\",\"output\":\"168.00\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.2-pro\\\" in openai.json exactly as observed ($21.00/$168.00) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.2-pro\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.50\",\"output\":\"15.00\",\"cachedInput\":\"0.25\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.4\\\" in openai.json exactly as observed ($2.50/$15.00/$0.25 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.4\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.75\",\"output\":\"4.50\",\"cachedInput\":\"0.075\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.4-mini\\\" in openai.json exactly as observed ($0.75/$4.50/$0.075 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.4-mini\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4-nano\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.20\",\"output\":\"1.25\",\"cachedInput\":\"0.02\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.4-nano\\\" in openai.json exactly as observed ($0.20/$1.25/$0.02 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.4-nano\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4-pro\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"30.00\",\"output\":\"180.00\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.4-pro\\\" in openai.json exactly as observed ($30.00/$180.00) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.4-pro\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.5\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-05-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"30.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.5\\\" in openai.json exactly as observed ($5.00/$30.00/$0.50 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.5\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.6-luna\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-07-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.00\",\"output\":\"6.00\",\"cachedInput\":\"0.10\",\"cacheWrite\":\"1.25\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"DIFFERS from OpenAI's own first-party rate recorded in openai.json for the same canonicalId \\\"gpt-5.6-luna\\\": OpenAI first-party is $0.20/$1.20 input/output (cached $0.02), Azure Global is $1.00/$6.00 (cached $0.10). Both independently observed on 2026-08-05; this is a genuine, confirmed pricing divergence between the two channels for the same named model, not a transcription error — this is exactly the kind of difference this provider file exists to capture.\",\"canonicalId \\\"gpt-5.6-luna\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.6-sol\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-07-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"30.00\",\"cachedInput\":\"0.50\",\"cacheWrite\":\"6.25\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"Matches OpenAI's own first-party rate for \\\"gpt-5.6-sol\\\" in openai.json exactly as observed ($5.00/$30.00/$0.50 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"gpt-5.6-sol\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.6-terra\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"gpt-5.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-07-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.50\",\"output\":\"15.00\",\"cachedInput\":\"0.25\",\"cacheWrite\":\"3.125\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"DIFFERS from OpenAI's own first-party rate recorded in openai.json for the same canonicalId \\\"gpt-5.6-terra\\\": OpenAI first-party is $2.00/$12.00 input/output (cached $0.20), Azure Global is $2.50/$15.00 (cached $0.25). Both independently observed on 2026-08-05; this is a genuine, confirmed pricing divergence between the two channels for the same named model, not a transcription error — this is exactly the kind of difference this provider file exists to capture.\",\"canonicalId \\\"gpt-5.6-terra\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o1\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2024-12-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"15.00\",\"output\":\"60.00\",\"cachedInput\":\"7.50\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 26 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"o1\\\" in openai.json exactly as observed ($15.00/$60.00/$7.50 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"o1\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o1-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2025-04-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.10\",\"output\":\"4.40\",\"cachedInput\":\"0.55\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"No comparable first-party entry exists in openai.json's 2026-08-05 snapshot for \\\"o1-mini\\\" (it is either a legacy/superseded model no longer on OpenAI's current pricing page, or a variant OpenAI does not sell directly) — Azure's own resale rate is recorded as observed with no parity claim possible or intended.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o1-preview\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2024-10-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"15.00\",\"output\":\"60.00\",\"cachedInput\":\"7.50\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 3 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"No Batch API meter was found for this model/SKU in the Retail Prices API response; batchMultiplier is intentionally omitted rather than assumed.\",\"No comparable first-party entry exists in openai.json's 2026-08-05 snapshot for \\\"o1-preview\\\" (it is either a legacy/superseded model no longer on OpenAI's current pricing page, or a variant OpenAI does not sell directly) — Azure's own resale rate is recorded as observed with no parity claim possible or intended.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o1-pro\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2025-03-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"150.00\",\"output\":\"600.00\",\"cachedInput\":\"75.00\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 25 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"o1-pro\\\" in openai.json exactly as observed ($150.00/$600.00) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"o1-pro\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o3\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2025-06-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"8.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"o3\\\" in openai.json exactly as observed ($2.00/$8.00/$0.50 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"o3\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o3-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2025-02-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.10\",\"output\":\"4.40\",\"cachedInput\":\"0.55\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 27 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"o3-mini\\\" in openai.json exactly as observed ($1.10/$4.40/$0.55 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"o3-mini\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o3-pro\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2025-06-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"20.00\",\"output\":\"80.00\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 24 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"o3-pro\\\" in openai.json exactly as observed ($20.00/$80.00) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"o3-pro\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o4-mini\",\n provider: \"azure-openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2025-04-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.10\",\"output\":\"4.40\",\"cachedInput\":\"0.275\",\"batchMultiplier\":\"0.5\",\"cheapestTier\":true,\"sourceUrl\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Azure's Retail Prices API quotes this meter per 1K tokens; converted to per-million-tokens by shifting the decimal point 3 places as exact string manipulation (never float multiplication).\",\"retailPrice confirmed identical across all 26 Azure regions returned for this Global-deployment SKU (spot-checked programmatically, not just a couple of regions) — no regional price variation observed for the Global tier.\",\"batchMultiplier 0.5 independently confirmed from this model's own Batch-API meter on Azure (batch input and output rows both computed to exactly 0.5x the standard Global rate), not assumed from a blanket policy statement.\",\"Matches OpenAI's own first-party rate for \\\"o4-mini\\\" in openai.json exactly as observed ($1.10/$4.40/$0.275 cached) — no markup detected for this model on Azure's Global deployment tier.\",\"canonicalId \\\"o4-mini\\\" is deliberately identical to the same model's entry in openai.json — Azure genuinely resells the identical first-party OpenAI model, unlike AWS Bedrock's or OpenRouter's differently-branded catalogues. Following the aws-bedrock.json precedent (e.g. its \\\"mistral-large-3\\\" and \\\"gemma-4-31b\\\" entries) rather than OpenRouter's provider-prefixed-slug convention: this is an intentional cross-provider canonicalId collision, not an error. A bare lookup of this id without a provider qualifier is ambiguous by design and must fail, exactly as already documented for the aws-bedrock.json collisions, since a lookup with a duplicated canonicalId requires a provider qualifier to resolve unambiguously. Per this task's ownership boundary, openai.json itself was not modified to cross-reference this note; a follow-up pass should add a mirroring note there.\"]},\n ],\n source: {\"url\":\"https://prices.azure.com/api/retail/prices?currencyCode='USD'&$filter=contains(productName,%20%27OpenAI%27)\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"aya-expanse-32b\",\n provider: \"cohere\",\n aliases: [],\n family: \"aya-expanse\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Cohere's pricing page publishes an identical $0.50/$1.50 rate for both the 8B and 32B Aya Expanse sizes (confirmed by two independent re-fetches of the same page); this was double-checked rather than assumed to be an extraction error.\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published.\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"aya-expanse-8b\",\n provider: \"cohere\",\n aliases: [],\n family: \"aya-expanse\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Cohere's pricing page publishes an identical $0.50/$1.50 rate for both the 8B and 32B Aya Expanse sizes (confirmed by two independent re-fetches of the same page); this was double-checked rather than assumed to be an extraction error.\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published.\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"command\",\n provider: \"cohere\",\n aliases: [],\n family: \"command\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.00\",\"output\":\"2.00\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Cohere's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"This rate appears in the pricing page's FAQ/legacy-rates section, not a headline pricing table; it is nonetheless the only per-token price Cohere currently publishes for this model.\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"command-light\",\n provider: \"cohere\",\n aliases: [],\n family: \"command\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.30\",\"output\":\"0.60\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Cohere's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"FAQ/legacy-rates section pricing, per the same caveat as \\\"command\\\".\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"command-r-03-2024\",\n provider: \"cohere\",\n aliases: [],\n family: \"command-r\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"\\\"03-2024\\\" is Cohere's own dated-snapshot naming for this model, not a confirmed price-effective date; effectiveFrom is set conservatively to 2026-01-01 per this repository's convention (a too-early effectiveFrom is safe; the price could have applied earlier than 2026 but was not independently confirmed).\",\"FAQ/legacy-rates section pricing.\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"command-r-plus-04-2024\",\n provider: \"cohere\",\n aliases: [],\n family: \"command-r-plus\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"3.00\",\"output\":\"15.00\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"\\\"04-2024\\\" is Cohere's own dated-snapshot naming for this model, not a confirmed price-effective date; effectiveFrom is set conservatively to 2026-01-01.\",\"FAQ/legacy-rates section pricing. Superseded in Cohere's catalogue by \\\"Command R+ 08-2024\\\" (below), a distinct dated snapshot with its own price — the two are not the same PricingPeriod for one model, they are two different canonicalIds, matching how Cohere itself lists them.\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"command-r-plus-08-2024\",\n provider: \"cohere\",\n aliases: [],\n family: \"command-r-plus\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.50\",\"output\":\"10.00\",\"sourceUrl\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"\\\"08-2024\\\" is Cohere's own dated-snapshot naming for this model, not a confirmed price-effective date; effectiveFrom is set conservatively to 2026-01-01.\",\"FAQ/legacy-rates section pricing.\"]},\n ],\n source: {\"url\":\"https://cohere.com/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-2.5-flash\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-2.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.30\",\"output\":\"2.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Standard (paid) tier rate. Priority tier is $0.54/$4.50 (1.8x standard); not modeled as a separate field.\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published.\",\"cachedInput omitted: not confirmed per-model.\",\"batchMultiplier of 0.5 verified directly from this model's own Batch row ($0.15/$1.25 vs standard $0.30/$2.50).\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-2.5-flash-lite\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-2.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.10\",\"output\":\"0.40\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Standard (paid) tier rate.\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published.\",\"cachedInput omitted: not confirmed per-model.\",\"batchMultiplier of 0.5 verified directly from this model's own Batch row ($0.05/$0.20 vs standard $0.10/$0.40).\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-2.5-pro\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-2.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"10.00\",\"cheapestTier\":true,\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"This is the standard-tier rate for prompts <= 200k tokens. For prompts > 200k tokens the page publishes a higher rate ($2.50 input / $15.00 output per 1M tokens) — this schema has no context-length-tiered pricing field, so only the <=200k (lower) tier is recorded here. Do not use this entry for long-context (>200k) requests.\",\"cachedInput and batchMultiplier are omitted: not confirmed for this Pro-tier model (the page states Batch/Flex give a general 50% reduction on input/output pricing, but no explicit per-model Batch row for this model was independently verified).\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published.\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-3.1-pro-preview\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-3.1\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"12.00\",\"cheapestTier\":true,\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"This is the standard-tier rate for prompts <= 200k tokens. For prompts > 200k tokens the page publishes a higher rate ($4.00 input / $18.00 output per 1M tokens) — this schema has no context-length-tiered pricing field, so only the <=200k (lower) tier is recorded here. Do not use this entry for long-context (>200k) requests.\",\"cachedInput and batchMultiplier are omitted: not confirmed for this Pro-tier model (unlike the Flash-tier models above, no explicit per-model Batch row was found for this model).\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published. \\\"-preview\\\" in the model name suggests this may be short-lived/subject to change.\",\"canonicalId uses the exact model name Google publishes on the pricing page (\\\"Gemini 3.1 Pro Preview\\\").\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-3.5-flash\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-3.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.50\",\"output\":\"9.00\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Standard (paid) tier rate. Priority tier is $2.70/$16.20 (1.8x standard); not modeled as a separate field.\",\"effectiveFrom set conservatively to 2026-01-01; page shows a \\\"Last Updated: July 30, 2026\\\" stamp but not a rate-specific effective date.\",\"cachedInput omitted: not confirmed per-model (see gemini-3.6-flash notes for the same caveat).\",\"batchMultiplier of 0.5 verified directly from this model's own Batch row ($0.75/$4.50 vs standard $1.50/$9.00).\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-3.5-flash-lite\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-3.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.30\",\"output\":\"2.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Standard (paid) tier rate. Priority tier is $0.54/$4.50 (1.8x standard); not modeled as a separate field.\",\"effectiveFrom set conservatively to 2026-01-01; exact rate-effective date not published.\",\"cachedInput omitted: not confirmed per-model.\",\"batchMultiplier of 0.5 verified directly from this model's own Batch row ($0.15/$1.25 vs standard $0.30/$2.50).\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemini-3.6-flash\",\n provider: \"google\",\n aliases: [],\n family: \"gemini-3.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.50\",\"output\":\"7.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Standard (paid) tier rate. The page also lists Flex and Priority tiers, which this schema does not model as separate fields: Flex is priced the same as Batch ($0.75/$3.75); Priority is $2.70/$13.50 (1.8x standard).\",\"Google's page shows \\\"Last Updated: July 30, 2026 UTC\\\" but does not state when this specific rate took effect; effectiveFrom is set conservatively to 2026-01-01.\",\"cachedInput (context caching) is omitted: the page states a general \\\"$0.15 per 1M cached input tokens\\\" figure covering multiple models but does not confirm it is this specific model's rate, plus a separate per-hour storage fee this schema does not model. Recording an unconfirmed number would be worse than omitting it.\",\"batchMultiplier of 0.5 was verified directly from this model's own Batch row ($0.75/$3.75 vs standard $1.50/$7.50).\"]},\n ],\n source: {\"url\":\"https://ai.google.dev/gemini-api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-oss-120b\",\n provider: \"groq\",\n aliases: [],\n family: \"gpt-oss\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.60\",\"sourceUrl\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Groq's docs page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"No prompt-caching or Batch API discount is documented for Groq in the fetched page.\",\"OpenAI's open-weight gpt-oss-120b model, hosted independently by Groq under Groq's own rate card (also hosted by Together AI, at the same $0.15/$0.60 rate as observed — coincidental agreement, not assumed parity).\"]},\n ],\n source: {\"url\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-oss-20b\",\n provider: \"groq\",\n aliases: [],\n family: \"gpt-oss\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.075\",\"output\":\"0.30\",\"sourceUrl\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Groq's docs page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"No prompt-caching or Batch API discount is documented for Groq in the fetched page.\",\"Also hosted by Together AI at a different rate ($0.05/$0.20 as observed) — each host prices it independently; do not assume parity.\"]},\n ],\n source: {\"url\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"llama-3.1-8b-instant\",\n provider: \"groq\",\n aliases: [\"llama-3.1-8b\"],\n family: \"llama-3.1\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.05\",\"output\":\"0.08\",\"sourceUrl\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Groq's docs page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"No prompt-caching or Batch API discount is documented for Groq in the fetched page, so cachedInput and batchMultiplier are omitted rather than assumed.\"]},\n ],\n source: {\"url\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"llama-3.3-70b-versatile\",\n provider: \"groq\",\n aliases: [\"llama-3.3-70b\"],\n family: \"llama-3.3\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.59\",\"output\":\"0.79\",\"sourceUrl\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Groq's docs page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"No prompt-caching or Batch API discount is documented for Groq in the fetched page, so cachedInput and batchMultiplier are omitted rather than assumed.\",\"This is Groq's own hosted rate for the same open-weight model Together AI also hosts (see together.json's llama-3.3-70b at a different, higher price) and AWS Bedrock resells — each host prices it independently; do not assume parity.\"]},\n ],\n source: {\"url\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"qwen3.6-27b\",\n provider: \"groq\",\n aliases: [],\n family: \"qwen\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.60\",\"output\":\"3.00\",\"sourceUrl\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Listed under Groq's \\\"Preview\\\" models section, not \\\"Production\\\" — preview models on Groq are explicitly subject to change or removal without notice. Included because a real price was published, but treat this one as less stable than the production-tier entries in this file.\",\"Groq's docs page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://console.groq.com/docs/models\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"codestral\",\n provider: \"mistral\",\n aliases: [],\n family: \"codestral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.30\",\"output\":\"0.90\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"devstral-2\",\n provider: \"mistral\",\n aliases: [],\n family: \"devstral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.40\",\"output\":\"2.00\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"devstral-small-2\",\n provider: \"mistral\",\n aliases: [],\n family: \"devstral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.10\",\"output\":\"0.30\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"magistral-medium\",\n provider: \"mistral\",\n aliases: [],\n family: \"magistral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"5.00\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Listed as a reasoning model on the pricing page; no separate \\\"reasoning\\\" surcharge is published, so the reasoning field is omitted.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"magistral-small\",\n provider: \"mistral\",\n aliases: [],\n family: \"magistral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"ministral-3-14b\",\n provider: \"mistral\",\n aliases: [],\n family: \"ministral-3\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.20\",\"output\":\"0.20\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"AWS Bedrock resells a \\\"Ministral 14B 3.0\\\" at the same $0.20/$0.20 figure as independently observed on Bedrock's pricing page — likely the same model, coincidental agreement not assumed; Bedrock's variant was not added to aws-bedrock.json in this pass since the version suffix (\\\"3.0\\\") was not cross-checked against this \\\"ministral-3-14b\\\" naming.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"ministral-3-3b\",\n provider: \"mistral\",\n aliases: [],\n family: \"ministral-3\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.10\",\"output\":\"0.10\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"ministral-3-8b\",\n provider: \"mistral\",\n aliases: [],\n family: \"ministral-3\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.15\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mistral-large-3\",\n provider: \"mistral\",\n aliases: [],\n family: \"mistral-large\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"This is Mistral's own first-party rate. AWS Bedrock also resells \\\"Mistral Large 3\\\" under its own rate card at the same $0.50/$1.50 figure as independently observed on Bedrock's pricing page — coincidental agreement between the two sources, not assumed; see aws-bedrock.json.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mistral-medium-3.5\",\n provider: \"mistral\",\n aliases: [],\n family: \"mistral-medium\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.50\",\"output\":\"7.50\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"No cachedInput or batchMultiplier is documented on the fetched page for this model; omitted rather than assumed.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mistral-nemo\",\n provider: \"mistral\",\n aliases: [],\n family: \"mistral-nemo\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.15\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"An older model generation still listed with a live price on the current pricing page as fetched; included because it is confidently sourced, not because it is a current flagship.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mistral-small-4\",\n provider: \"mistral\",\n aliases: [],\n family: \"mistral-small\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.60\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mixtral-8x22b\",\n provider: \"mistral\",\n aliases: [],\n family: \"mixtral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"6.00\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"An older model generation still listed with a live price on the current pricing page as fetched.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"mixtral-8x7b\",\n provider: \"mistral\",\n aliases: [],\n family: \"mixtral\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.70\",\"output\":\"0.70\",\"sourceUrl\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Mistral's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"An older model generation still listed with a live price on the current pricing page as fetched.\"]},\n ],\n source: {\"url\":\"https://mistral.ai/pricing/api\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-3.5-turbo\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-3.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.50\",\"output\":\"1.50\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Found on https://developers.openai.com/api/docs/pricing during a second confirmation pass.\",\"No cached-input rate is published for gpt-3.5-turbo on the current pricing page; cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4.1\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-4.1\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"8.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4.1-mini\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-4.1\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.40\",\"output\":\"1.60\",\"cachedInput\":\"0.10\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4.1-nano\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-4.1\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.10\",\"output\":\"0.40\",\"cachedInput\":\"0.025\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4o\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-4o\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.50\",\"output\":\"10.00\",\"cachedInput\":\"1.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-4o-mini\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-4o\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.60\",\"cachedInput\":\"0.075\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"10.00\",\"cachedInput\":\"0.125\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\",\"Lead-supplied verified table (observed 2026-08-05) matches this rate exactly; independently re-confirmed against https://developers.openai.com/api/docs/pricing on the same date.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5-mini\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.25\",\"output\":\"2.00\",\"cachedInput\":\"0.025\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5-nano\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.05\",\"output\":\"0.40\",\"cachedInput\":\"0.005\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5-pro\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"15.00\",\"output\":\"120.00\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No cached-input rate is published for gpt-5-pro (shown as \\\"—\\\"); cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier is intentionally omitted for this pro-tier model; not independently confirmed to apply.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.1\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.1\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"10.00\",\"cachedInput\":\"0.125\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.2\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.2\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.75\",\"output\":\"14.00\",\"cachedInput\":\"0.175\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.2-pro\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.2\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"21.00\",\"output\":\"168.00\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No cached-input rate is published for gpt-5.2-pro (shown as \\\"—\\\"); cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier is intentionally omitted for this pro-tier model; not independently confirmed to apply.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.50\",\"output\":\"15.00\",\"cachedInput\":\"0.25\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4-mini\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.75\",\"output\":\"4.50\",\"cachedInput\":\"0.075\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4-nano\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.20\",\"output\":\"1.25\",\"cachedInput\":\"0.02\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.4-pro\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.4\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"30.00\",\"output\":\"180.00\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No cached-input rate is published for gpt-5.4-pro (shown as \\\"—\\\"); cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier is intentionally omitted for this pro-tier model; not independently confirmed to apply.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.5\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"30.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.5-pro\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.5\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"30.00\",\"output\":\"180.00\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No cached-input rate is published for gpt-5.5-pro (shown as \\\"—\\\" on the pricing page); cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier is intentionally omitted for this pro-tier model: the pricing page's blanket \\\"50% off Batch\\\" statement was not independently confirmed to apply to the -pro tier, unlike the base tiers.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.6-luna\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.20\",\"output\":\"1.20\",\"cachedInput\":\"0.02\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.6-sol\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"5.00\",\"output\":\"30.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date (this model's naming implies a later release, but a conservative too-early effectiveFrom only ever makes a historical lookup succeed when it should return \\\"no period found\\\", never the reverse).\",\"batchMultiplier reflects OpenAI's general Batch API policy (\\\"a 50% discount to Standard pricing rates across all models\\\") as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-5.6-terra\",\n provider: \"openai\",\n aliases: [],\n family: \"gpt-5.6\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"12.00\",\"cachedInput\":\"0.20\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o1\",\n provider: \"openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"15.00\",\"output\":\"60.00\",\"cachedInput\":\"7.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o1-pro\",\n provider: \"openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"150.00\",\"output\":\"600.00\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Found on https://developers.openai.com/api/docs/pricing during a second confirmation pass.\",\"No cached-input rate is published for o1-pro (shown as \\\"—\\\"); cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier is intentionally omitted for this pro-tier model; not independently confirmed to apply.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o3\",\n provider: \"openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"8.00\",\"cachedInput\":\"0.50\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o3-mini\",\n provider: \"openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.10\",\"output\":\"4.40\",\"cachedInput\":\"0.55\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o3-pro\",\n provider: \"openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"20.00\",\"output\":\"80.00\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"No cached-input rate is published for o3-pro (shown as \\\"—\\\"); cachedInput is intentionally omitted rather than guessed.\",\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier is intentionally omitted for this pro-tier model; not independently confirmed to apply.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"o4-mini\",\n provider: \"openai\",\n aliases: [],\n family: \"o-series\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.10\",\"output\":\"4.40\",\"cachedInput\":\"0.275\",\"batchMultiplier\":\"0.5\",\"sourceUrl\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenAI's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01 pending confirmation of the true rollout date.\",\"batchMultiplier reflects OpenAI's general Batch API policy as stated on the pricing page; not independently confirmed per-model.\"]},\n ],\n source: {\"url\":\"https://developers.openai.com/api/docs/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"anthropic/claude-sonnet-5\",\n provider: \"openrouter\",\n aliases: [],\n family: \"anthropic-proxy\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"10.00\",\"sourceUrl\":\"https://openrouter.ai/anthropic/claude-sonnet-5\",\"observedAt\":\"2026-08-05\",\"notes\":[\"UNCERTAIN — flagged explicitly: this rate ($2.00/$10.00) matches Anthropic's own INTRODUCTORY rate for claude-sonnet-5, which anthropic.json records as expiring 2026-08-31 and being replaced by a $3.00/$15.00 standard rate from 2026-09-01 (see anthropic.json). It is not clear from the OpenRouter page alone whether OpenRouter (a) has simply not yet updated its listing to the post-introductory rate, (b) is genuinely offering a different long-term rate than Anthropic's own API, or (c) this reflects a caching/rounding artifact in the page. Recorded as fetched and observed on 2026-08-05, but a follow-up reviewer should re-check this specific model close to and after 2026-09-01.\",\"OpenRouter's per-model page does not publish an effective date; effectiveFrom is set conservatively to 2026-01-01.\",\"canonicalId uses OpenRouter's own slug format, deliberately distinct from Anthropic's first-party canonicalId \\\"claude-sonnet-5\\\" (anthropic.json) to avoid a canonicalId collision; this is a legitimate cross-provider situation, not an error.\"]},\n ],\n source: {\"url\":\"https://openrouter.ai/anthropic/claude-sonnet-5\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"google/gemini-3.1-pro-preview\",\n provider: \"openrouter\",\n aliases: [],\n family: \"google-proxy\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"2.00\",\"output\":\"12.00\",\"cheapestTier\":true,\"sourceUrl\":\"https://openrouter.ai/google/gemini-3.1-pro-preview\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenRouter's per-model page does not publish an effective date; effectiveFrom is set conservatively to 2026-01-01.\",\"Matches Google's own first-party <=200k-token-tier rate for gemini-3.1-pro-preview ($2.00/$12.00, see google.json) exactly as observed. Google's >200k-token tier ($4.00/$18.00) is not represented here (or, evidently, distinguished by OpenRouter's listing either) — same context-length-tiering limitation as google.json.\",\"canonicalId uses OpenRouter's own slug format, deliberately distinct from Google's first-party canonicalId \\\"gemini-3.1-pro-preview\\\" (google.json).\"]},\n ],\n source: {\"url\":\"https://openrouter.ai/google/gemini-3.1-pro-preview\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"meta-llama/llama-3.3-70b-instruct\",\n provider: \"openrouter\",\n aliases: [],\n family: \"meta-proxy\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.10\",\"output\":\"0.32\",\"sourceUrl\":\"https://openrouter.ai/meta-llama/llama-3.3-70b-instruct\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenRouter's per-model page does not publish an effective date; effectiveFrom is set conservatively to 2026-01-01.\",\"Meta does not sell first-party API access to Llama, so there is no first-party \\\"llama-3.3-70b\\\" entry in this registry to compare against; Groq (groq.json: llama-3.3-70b-versatile, $0.59/$0.79) and Together AI (together.json: llama-3.3-70b, $1.04/$1.04) each host the same open-weight model at their own, different rates. OpenRouter's rate here is the lowest of the three observed, plausibly because OpenRouter itself proxies to one of several underlying hosts and shows a blended/lowest-cost route; not independently confirmed which underlying host this routes to.\"]},\n ],\n source: {\"url\":\"https://openrouter.ai/meta-llama/llama-3.3-70b-instruct\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"openai/gpt-5\",\n provider: \"openrouter\",\n aliases: [],\n family: \"openai-proxy\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"10.00\",\"sourceUrl\":\"https://openrouter.ai/openai/gpt-5\",\"observedAt\":\"2026-08-05\",\"notes\":[\"OpenRouter's per-model page does not publish an effective date; effectiveFrom is set conservatively to 2026-01-01.\",\"Matches OpenAI's own first-party rate for gpt-5 ($1.25/$10.00, see openai.json) exactly as observed — no markup detected for this model.\",\"canonicalId uses OpenRouter's own slug format (\\\"openai/gpt-5\\\"), deliberately distinct from OpenAI's first-party canonicalId \\\"gpt-5\\\" (openai.json) — this avoids a canonicalId collision while still allowing a cross-provider alias collision if a caller looks up the bare id \\\"gpt-5\\\" without a provider qualifier; no bare \\\"gpt-5\\\" alias was added to this entry to keep that surface area minimal.\"]},\n ],\n source: {\"url\":\"https://openrouter.ai/openai/gpt-5\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"deepseek-v4-pro\",\n provider: \"together\",\n aliases: [],\n family: \"deepseek\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.74\",\"output\":\"3.48\",\"cachedInput\":\"0.20\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gemma-4-31b\",\n provider: \"together\",\n aliases: [],\n family: \"gemma\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.39\",\"output\":\"0.97\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Cross-provider alias/canonicalId collision (allowed, not an error): AWS Bedrock also lists \\\"Gemma 4 31B\\\" (aws-bedrock.json: gemma-4-31b) at a different, lower rate ($0.14/$0.40 as observed on Bedrock) — same underlying Google open-weight model, independently priced by each reseller; do not assume parity.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"glm-5.2\",\n provider: \"together\",\n aliases: [],\n family: \"glm\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.40\",\"output\":\"4.40\",\"cachedInput\":\"0.26\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-oss-120b\",\n provider: \"together\",\n aliases: [],\n family: \"gpt-oss\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.15\",\"output\":\"0.60\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Cross-provider alias/canonicalId collision (allowed, not an error): Groq also publishes a model with canonicalId \\\"gpt-oss-120b\\\" (groq.json), independently priced at the same $0.15/$0.60 figure as observed. The identical string \\\"gpt-oss-120b\\\" is used as the canonicalId on both providers because that is the actual model name each provider publishes; resolving \\\"gpt-oss-120b\\\" without a provider qualifier is ambiguous across providers by design and the resolver requires a provider qualifier to disambiguate it.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"gpt-oss-20b\",\n provider: \"together\",\n aliases: [],\n family: \"gpt-oss\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.05\",\"output\":\"0.20\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Cross-provider alias/canonicalId collision (allowed, not an error): Groq also publishes \\\"gpt-oss-20b\\\" (groq.json) at a different rate ($0.075/$0.30 as observed) — same model name, independently priced by each host; do not assume parity.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"kimi-k3\",\n provider: \"together\",\n aliases: [],\n family: \"kimi\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"3.00\",\"output\":\"15.00\",\"cachedInput\":\"0.30\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"llama-3.3-70b\",\n provider: \"together\",\n aliases: [],\n family: \"llama-3.3\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.04\",\"output\":\"1.04\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\",\"Also hosted by Groq (groq.json: llama-3.3-70b-versatile, $0.59/$0.79) and resold by AWS Bedrock — each host prices this same open-weight model independently; do not assume parity across providers.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"minimax-m3\",\n provider: \"together\",\n aliases: [],\n family: \"minimax\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.30\",\"output\":\"1.20\",\"cachedInput\":\"0.06\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"qwen3.5-397b-a17b\",\n provider: \"together\",\n aliases: [],\n family: \"qwen\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"0.60\",\"output\":\"3.60\",\"cachedInput\":\"0.35\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n {\n canonicalId: \"qwen3.7-max\",\n provider: \"together\",\n aliases: [],\n family: \"qwen\",\n pricing: [\n {\"effectiveFrom\":\"2026-01-01\",\"currency\":\"USD\",\"unit\":\"per-million-tokens\",\"input\":\"1.25\",\"output\":\"3.75\",\"cachedInput\":\"0.13\",\"sourceUrl\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\",\"notes\":[\"Together's pricing page does not publish an effective date for this rate; effectiveFrom is set conservatively to 2026-01-01.\"]},\n ],\n source: {\"url\":\"https://www.together.ai/pricing\",\"observedAt\":\"2026-08-05\"},\n },\n];\n","/**\n * Stable error types this package throws directly. `resolveModel` and\n * `calculateCost` also propagate `AmbiguousAliasError`, `UnknownModelError`,\n * and `InvalidLookupDateError` unchanged from `@llm-kit/model-registry` (see\n * `index.ts`) — they are not redefined here, so a caller catching by `code`\n * only ever deals with one class per code, regardless of which package threw\n * it.\n *\n * Every error extends `Error`, sets a stable string `code`, and carries an\n * actionable message. Normal conditions —\n * an unsupported usage field, a period recording only the cheapest of\n * several tiers — are `PriceWarning`s (see `types.ts`), not exceptions;\n * these classes are reserved for conditions where the reported cost would\n * otherwise be meaningless or silently wrong.\n */\n\n/**\n * Raised by `calculateCost` when `selectPricingPeriod` finds no period\n * covering the lookup date — including a lookup date that precedes the\n * first known period for a model. Returning a zero or default cost here\n * would be exactly the silent under-reporting this package exists to\n * prevent, so this is a thrown error, never a warning.\n */\nexport class NoPricingPeriodError extends Error {\n readonly code = 'NO_PRICING_PERIOD';\n readonly canonicalModel: string;\n readonly provider: string;\n readonly at: string;\n\n constructor(canonicalModel: string, provider: string, at: string) {\n super(\n `No pricing period for \"${provider}:${canonicalModel}\" covers ${at}. ` +\n 'Either the requested date precedes every known period for this model, or the model has no pricing data at all.',\n );\n this.name = 'NoPricingPeriodError';\n this.canonicalModel = canonicalModel;\n this.provider = provider;\n this.at = at;\n }\n}\n\n/**\n * Raised when `PriceRequest.usage` is neither an `LlmUsage`-shaped object\n * (numeric `inputTokens`/`outputTokens`) nor something a `normalize*Usage`\n * adapter already turned into one. `calculateCost` never guesses a raw\n * provider response's field names — call the matching adapter first.\n */\nexport class InvalidUsageError extends Error {\n readonly code = 'INVALID_USAGE';\n\n constructor(reason: string) {\n super(\n `Invalid usage: ${reason} Pass an LlmUsage object ({ inputTokens, outputTokens, ... }), ` +\n 'or normalize a raw provider response first with normalizeOpenAIUsage/normalizeAnthropicUsage/normalizeGoogleUsage/normalizeOpenAICompatibleUsage.',\n );\n this.name = 'InvalidUsageError';\n }\n}\n\n/**\n * Raised when a token count is negative, non-integer, or not a JS safe\n * integer. Very large aggregate token counts are expected to work up to\n * `Number.MAX_SAFE_INTEGER`; beyond that, or below zero, or fractional, the\n * count is rejected rather than silently coerced.\n */\nexport class InvalidTokenCountError extends Error {\n readonly code = 'INVALID_TOKEN_COUNT';\n readonly field: string;\n readonly value: number;\n\n constructor(field: string, value: number) {\n super(\n `usage.${field} must be a non-negative safe integer, received ${String(value)}. ` +\n 'Negative, fractional, or unsafely large token counts are rejected rather than silently coerced.',\n );\n this.name = 'InvalidTokenCountError';\n this.field = field;\n this.value = value;\n }\n}\n\n/**\n * Raised when a pricing-period rate string does not parse as an exact\n * non-negative decimal. Registry data is validated at generation time\n * (`@llm-kit/model-registry`'s schema), so this only fires for a malformed\n * `createPriceOverride`/custom `ModelDescriptor` supplied at the call site.\n */\nexport class InvalidRateError extends Error {\n readonly code = 'INVALID_RATE';\n readonly field: string;\n readonly value: string;\n\n constructor(field: string, value: string) {\n super(\n `Pricing field \"${field}\" must be a non-negative decimal string (e.g. \"3.00\"), received ${JSON.stringify(value)}.`,\n );\n this.name = 'InvalidRateError';\n this.field = field;\n this.value = value;\n }\n}\n","/**\n * Exact fixed-point money arithmetic. Money is never computed in binary\n * floating point on the authoritative path.\n *\n * A rate is a decimal string quoted in USD per 1,000,000 tokens. Both a rate\n * string and \"per million\" are exact powers of ten, so every cost this\n * package ever computes is an exact terminating decimal — `tokens * rate /\n * 1_000_000` never produces a repeating fraction as long as `tokens` is an\n * integer. The representation below (`ExactAmount`) carries that fraction as\n * a `bigint` numerator over an explicit power-of-ten `scale`\n * (`amount = numerator / 10^scale`) and never converts to a JS `number`\n * until `toDisplayNumber`, which is the one documented display boundary\n * where binary floating point is allowed to enter, and where rounding may\n * happen. Every other function here is exact: no rounding, ever, on the\n * authoritative path.\n */\nimport { InvalidRateError } from './errors.js';\n\n/** An exact non-negative rational number: `numerator / 10^scale`. `scale >= 0`. */\nexport interface ExactAmount {\n readonly numerator: bigint;\n readonly scale: number;\n}\n\nexport const ZERO: ExactAmount = { numerator: 0n, scale: 0 };\n\nconst DECIMAL_PATTERN = /^\\d+(\\.\\d+)?$/;\n\n/**\n * Parses a decimal rate string (as stored in `PricingPeriod`) into an exact\n * `ExactAmount`. Never uses `Number()`/`parseFloat` — the string is split on\n * `.` and both halves are concatenated into one `bigint`, so a rate like\n * `\"3.125\"` becomes exactly `3125n / 10^3`, not the nearest representable\n * double.\n */\nexport function parseDecimalRate(value: string, field: string): ExactAmount {\n if (!DECIMAL_PATTERN.test(value)) {\n throw new InvalidRateError(field, value);\n }\n const dot = value.indexOf('.');\n if (dot === -1) {\n return { numerator: BigInt(value), scale: 0 };\n }\n const wholePart = value.slice(0, dot);\n const fractionPart = value.slice(dot + 1);\n return { numerator: BigInt(wholePart + fractionPart), scale: fractionPart.length };\n}\n\nconst PER_MILLION_SCALE = 6;\n\n/**\n * Exact cost of `tokens` billed at `rate` (USD per 1,000,000 tokens).\n * `tokens` must already be a validated non-negative safe integer — see\n * `validateTokenCount` in `calculate-cost.ts`.\n */\nexport function costOfTokens(tokens: number, rate: ExactAmount): ExactAmount {\n return {\n numerator: BigInt(tokens) * rate.numerator,\n scale: rate.scale + PER_MILLION_SCALE,\n };\n}\n\n/** Exact product of two `ExactAmount`s — used to fold a batch multiplier into a rate before billing. */\nexport function multiplyExact(a: ExactAmount, b: ExactAmount): ExactAmount {\n return { numerator: a.numerator * b.numerator, scale: a.scale + b.scale };\n}\n\n/**\n * Exact sum of any number of `ExactAmount`s, even when they carry different\n * scales (e.g. a `\"3.125\"` cache-write rate next to a `\"1.25\"` input rate).\n * Every amount is rescaled to the largest scale present by multiplying its\n * numerator by a power of ten — always exact, never a division — before\n * summing.\n */\nexport function addExact(amounts: readonly ExactAmount[]): ExactAmount {\n if (amounts.length === 0) return ZERO;\n let maxScale = 0;\n for (const amount of amounts) if (amount.scale > maxScale) maxScale = amount.scale;\n\n let sum = 0n;\n for (const amount of amounts) {\n sum += amount.numerator * 10n ** BigInt(maxScale - amount.scale);\n }\n return { numerator: sum, scale: maxScale };\n}\n\n/**\n * Renders an `ExactAmount` as an exact decimal string — the authoritative\n * `totalUsdExact`/`costUsdExact` value. Trailing zero digits beyond the\n * second decimal place are trimmed for readability (never rounded away —\n * every trimmed digit is a literal `0`), and at least two decimal places are\n * always shown, matching ordinary currency notation.\n */\nexport function formatExact(amount: ExactAmount): string {\n const negative = amount.numerator < 0n;\n const magnitude = negative ? -amount.numerator : amount.numerator;\n const divisor = 10n ** BigInt(amount.scale);\n const integerPart = amount.scale === 0 ? magnitude : magnitude / divisor;\n const fractionDigits =\n amount.scale === 0 ? '' : (magnitude % divisor).toString().padStart(amount.scale, '0');\n\n let trimmed = fractionDigits.replace(/0+$/, '');\n if (trimmed.length < 2) trimmed = trimmed.padEnd(2, '0');\n\n return `${negative ? '-' : ''}${integerPart.toString()}.${trimmed}`;\n}\n\n/**\n * Ergonomic numeric form of an `ExactAmount` — the *only* place this package\n * converts money to a binary-floating-point `number`. Safe for display,\n * dashboards, and arithmetic a caller does not need to be exact; never used\n * internally for another calculation. Built from the already-exact decimal\n * string (`Number(formatExact(...))`), not from a fresh float division, so\n * it is the closest double to the true exact value rather than compounding a\n * second, independent rounding step.\n */\nexport function toDisplayNumber(amount: ExactAmount): number {\n return Number(formatExact(amount));\n}\n","/**\n * `PriceWarning` constructors — kept out of `calculate-cost.ts` so its main\n * algorithm reads as a sequence of decisions, not a wall of message text.\n */\nimport type { PriceWarning } from './types.js';\n\nexport function unsupportedUsageFieldWarning(field: string): PriceWarning {\n return {\n code: 'UNSUPPORTED_USAGE_FIELD',\n field,\n message: `usage field \"${field}\" is not recognized and was not priced. It is preserved here rather than silently discarded — if this represents billable tokens, report it under a known LlmUsage field.`,\n };\n}\n\nexport function cachedExceedsInputWarning(inputTokens: number, subsetTotal: number): PriceWarning {\n return {\n code: 'CACHED_EXCEEDS_INPUT',\n field: 'cachedInputTokens',\n message: `cachedInputTokens + cacheWriteTokens (${String(subsetTotal)}) exceeds inputTokens (${String(inputTokens)}). Ordinary billable input was clamped to 0 rather than going negative; the reported cached/cache-write token counts were still billed in full.`,\n };\n}\n\nexport function reasoningExceedsOutputWarning(\n outputTokens: number,\n reasoningTokens: number,\n): PriceWarning {\n return {\n code: 'REASONING_EXCEEDS_OUTPUT',\n field: 'reasoningTokens',\n message: `reasoningTokens (${String(reasoningTokens)}) exceeds outputTokens (${String(outputTokens)}). Ordinary billable output was clamped to 0 rather than going negative; the reported reasoning token count was still billed in full.`,\n };\n}\n\nexport function batchPricingUnavailableWarning(\n canonicalModel: string,\n provider: string,\n): PriceWarning {\n return {\n code: 'BATCH_PRICING_UNAVAILABLE',\n message: `mode: 'batch' was requested but \"${provider}:${canonicalModel}\"'s resolved pricing period publishes no batchMultiplier. Standard (non-batch) rates were used instead — this is the higher of the two prices, so the calculation never under-reports.`,\n };\n}\n\nexport function partialTierPricingWarning(canonicalModel: string, provider: string): PriceWarning {\n return {\n code: 'PARTIAL_TIER_PRICING',\n message: `\"${provider}:${canonicalModel}\"'s recorded rate is the cheapest of several published pricing tiers for this model (e.g. prompt size, deployment region, context length, or service tier — see the registry entry's notes for which). Real usage billed under a different tier will cost more than this calculation reports.`,\n };\n}\n\nexport function reasoningPricedAsOutputWarning(\n canonicalModel: string,\n provider: string,\n): PriceWarning {\n return {\n code: 'REASONING_PRICED_AS_OUTPUT',\n field: 'reasoningTokens',\n message: `\"${provider}:${canonicalModel}\" reported reasoning tokens but its pricing period publishes no dedicated reasoning rate. Billed at the output rate instead of being dropped, so the calculation never under-reports — but the real reasoning-token rate, if the provider publishes one, may differ.`,\n };\n}\n\nexport function cachedInputPricedAsInputWarning(\n canonicalModel: string,\n provider: string,\n): PriceWarning {\n return {\n code: 'CACHED_INPUT_PRICED_AS_INPUT',\n field: 'cachedInputTokens',\n message: `\"${provider}:${canonicalModel}\" reported cached input tokens but its pricing period publishes no dedicated cachedInput rate. Billed at the ordinary input rate instead of being dropped — the real cached rate, almost always cheaper, is not reflected, so this calculation may over-report for this line, never under-report.`,\n };\n}\n\nexport function cacheWritePricedAsInputWarning(\n canonicalModel: string,\n provider: string,\n): PriceWarning {\n return {\n code: 'CACHE_WRITE_PRICED_AS_INPUT',\n field: 'cacheWriteTokens',\n message: `\"${provider}:${canonicalModel}\" reported cache-write tokens but its pricing period publishes no dedicated cacheWrite rate. Billed at the ordinary input rate instead of being dropped — the real cache-write rate, usually a premium over input, is not reflected, so this calculation may under-report for this line.`,\n };\n}\n","/**\n * Shared structural helpers for the four provider usage adapters\n * (`openai.ts`, `anthropic.ts`, `google.ts`, `openai-compatible.ts`) and the\n * internal generic fallback (`generic.ts`). Every adapter reads an `unknown`\n * value the same cautious way — no provider SDK types, only plain-object/\n * number narrowing — so this lives once rather than once per adapter.\n */\nimport { InvalidUsageError } from '../errors.js';\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function assertUsageObject(value: unknown, adapterName: string): Record<string, unknown> {\n if (!isPlainObject(value)) {\n throw new InvalidUsageError(`${adapterName} expected an object, received ${typeof value}.`);\n }\n return value;\n}\n\n/**\n * A billable usage field is valid only as a non-negative, finite integer.\n * `NaN`, `Infinity`/`-Infinity`, negative numbers, fractional numbers, and\n * any non-number type are all rejected: a known usage field with an invalid\n * *value* (not just an invalid type) must never be silently priced as though\n * it were absent.\n */\nexport function isValidTokenCount(value: unknown): value is number {\n return (\n typeof value === 'number' && Number.isFinite(value) && Number.isInteger(value) && value >= 0\n );\n}\n\n/**\n * Renders an arbitrary value for an error message. Must never throw: it runs\n * while an error is being constructed (`describeInvalidNumber`,\n * `readNumericField` in `../normalize/generic.js`), and a throw from inside\n * an error-construction expression discards the error under construction, so\n * the caller would see a raw, uncoded exception instead of the stable-`code`\n * `InvalidUsageError` the contract promises. A `bigint` usage value (routine\n * from node-postgres/mysql2 driver rows) makes bare `JSON.stringify` throw,\n * which is exactly the case this function exists to cover.\n *\n * `JSON.stringify` is not total — it throws on a `bigint`, on a circular\n * object, and on an object whose `toJSON` throws, and it silently returns\n * `undefined` (not the string `\"undefined\"`) for a bare `symbol`, `function`,\n * or `undefined`. Every one of those is handled explicitly or covered by the\n * `catch` below.\n */\nexport function describeValue(value: unknown): string {\n if (typeof value === 'bigint') return `${value.toString()}n`;\n if (typeof value === 'symbol') return value.toString();\n if (typeof value === 'function') {\n return value.name.length > 0 ? `[Function: ${value.name}]` : '[Function (anonymous)]';\n }\n if (typeof value === 'undefined') return 'undefined';\n if (typeof value === 'number') {\n // `JSON.stringify` renders every one of these uselessly: `NaN` and\n // `±Infinity` both become the string `\"null\"` (indistinguishable from an\n // actual `null`), and `-0` becomes `\"0\"`, silently dropping the sign a\n // caller debugging a driver/serialization bug would want to see.\n if (Number.isNaN(value)) return 'NaN';\n if (!Number.isFinite(value)) return String(value);\n if (Object.is(value, -0)) return '-0';\n return String(value);\n }\n try {\n const json = JSON.stringify(value);\n // `JSON.stringify` returns `undefined` (the JS value) rather than\n // throwing for a handful of shapes not already excluded above — e.g. a\n // value nested only behind a `toJSON` that itself returns `undefined`.\n return json === undefined ? String(value) : json;\n } catch {\n // Circular structure, or a throwing `toJSON` — the exact failure doesn't\n // matter here; a coarse but safe fallback beats propagating any throw.\n return Object.prototype.toString.call(value);\n }\n}\n\n/** Renders a rejected token-count value for an error message. */\nexport function describeInvalidNumber(value: unknown): string {\n if (typeof value !== 'number') return `${typeof value} ${describeValue(value)}`;\n if (Number.isNaN(value)) return 'NaN';\n if (!Number.isFinite(value)) return String(value);\n if (!Number.isInteger(value)) return `a fractional value (${value})`;\n return `a negative value (${value})`;\n}\n\n/**\n * Reads `obj[key]` as a number.\n *\n * A known usage field has exactly two valid states: absent (the key is\n * missing, or explicitly `null` — providers routinely emit `null` for \"not\n * applicable\", treated the same as absent, never as invalid) or present as a\n * non-negative finite integer. Any other present value (a string,\n * boolean, object, `NaN`, `Infinity`, a negative number, a fractional\n * number) is a malformed known field, not an absent one, and throws\n * `InvalidUsageError` rather than silently pricing it as zero.\n */\nexport function readNumber(\n obj: Record<string, unknown>,\n key: string,\n adapterName: string,\n): number | undefined {\n const value = obj[key];\n if (value === undefined || value === null) return undefined;\n if (!isValidTokenCount(value)) {\n throw new InvalidUsageError(\n `${adapterName} expected \"${key}\" to be a non-negative integer, received ${describeInvalidNumber(value)}.`,\n );\n }\n return value;\n}\n\n/**\n * Reads `obj[parentKey]?.[key]` as a number. The parent object is subject to\n * the same absent-vs-invalid distinction as `readNumber`: an absent or\n * `null` parent is absent, but a parent that is present and not an object is\n * a malformed known field and throws — it does not silently fall through to\n * \"no nested value found\".\n */\nexport function readNestedNumber(\n obj: Record<string, unknown>,\n parentKey: string,\n key: string,\n adapterName: string,\n): number | undefined {\n const parent = obj[parentKey];\n if (parent === undefined || parent === null) return undefined;\n if (!isPlainObject(parent)) {\n throw new InvalidUsageError(\n `${adapterName} expected \"${parentKey}\" to be an object, received ${typeof parent}.`,\n );\n }\n return readNumber(parent, key, adapterName);\n}\n","/**\n * Internal fallback normalizer for `PriceRequest.usage: LlmUsage | unknown`.\n *\n * This is deliberately *not* one of the four provider adapters\n * (`normalizeOpenAIUsage`, etc.) and is not part of this package's public\n * surface. Its only job is to let `calculateCost` accept a value that is\n * already `LlmUsage`-shaped (numeric `inputTokens`/`outputTokens`) — whether\n * constructed by hand or produced by a provider adapter — while surfacing\n * any extra, unrecognized own-enumerable properties as warnings rather than\n * silently discarding them. It never attempts to guess a\n * raw provider response's field names (e.g. `prompt_tokens`); that is what\n * the named adapters in this directory are for.\n */\nimport { InvalidUsageError } from '../errors.js';\nimport type { LlmUsage, NormalizedUsageResult, PriceWarning } from '../types.js';\nimport { unsupportedUsageFieldWarning } from '../warnings.js';\nimport { describeValue, isPlainObject } from './support.js';\n\nconst KNOWN_FIELDS = new Set([\n 'inputTokens',\n 'outputTokens',\n 'cachedInputTokens',\n 'cacheWriteTokens',\n 'reasoningTokens',\n]);\n\n/**\n * Reads `obj[key]`, treating absent/`null` as absent and throwing\n * `InvalidUsageError` for any other non-numeric type. Unlike the provider\n * adapters' `readNumber` (`./support.ts`), this does not additionally reject\n * `NaN`/`Infinity`/negative/fractional values that are already\n * `typeof 'number'` — `calculateCost`'s own `validateUsage` already rejects\n * those with the more specific `InvalidTokenCountError`, and every value\n * that reaches this function is about to be handed straight to\n * `calculateCost`, so duplicating that check here would only relabel an\n * already-correctly-classified error.\n */\nfunction readNumericField(obj: Record<string, unknown>, key: string): number | undefined {\n const raw = obj[key];\n if (raw === undefined || raw === null) return undefined;\n if (typeof raw !== 'number') {\n throw new InvalidUsageError(\n `expected \"${key}\" to be a number, received ${typeof raw} ${describeValue(raw)}.`,\n );\n }\n return raw;\n}\n\nexport function normalizeRequestUsage(value: LlmUsage | unknown): NormalizedUsageResult {\n if (!isPlainObject(value)) {\n throw new InvalidUsageError(`expected an object, received ${typeof value}.`);\n }\n\n const inputTokens = readNumericField(value, 'inputTokens');\n const outputTokens = readNumericField(value, 'outputTokens');\n if (inputTokens === undefined || outputTokens === undefined) {\n throw new InvalidUsageError(\n 'expected numeric \"inputTokens\" and \"outputTokens\" fields, found none.',\n );\n }\n const cachedInputTokens = readNumericField(value, 'cachedInputTokens');\n const cacheWriteTokens = readNumericField(value, 'cacheWriteTokens');\n const reasoningTokens = readNumericField(value, 'reasoningTokens');\n\n const usage: LlmUsage = {\n inputTokens,\n outputTokens,\n ...(cachedInputTokens !== undefined ? { cachedInputTokens } : {}),\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n };\n\n const warnings: PriceWarning[] = [];\n for (const key of Object.keys(value)) {\n if (!KNOWN_FIELDS.has(key)) warnings.push(unsupportedUsageFieldWarning(key));\n }\n\n return { usage, warnings };\n}\n","/**\n * Effective-date pricing-period selection — a thin wrapper over\n * `@llm-kit/model-registry`'s `selectPricingPeriod` that turns \"no period\n * covers this date\" into a thrown, stable error instead of a silent\n * `undefined` a caller could accidentally treat as zero cost — including a\n * lookup date that precedes the first known period for a model.\n *\n * Also passes `descriptor.canonicalId`/`descriptor.provider` through as\n * `selectPricingPeriod`'s optional identity argument — `selectPricingPeriod`\n * itself only ever sees a bare `PricingPeriod[]`, but this function already\n * holds the full descriptor, so a thrown `AmbiguousPricingPeriodError` (an\n * `effectiveFrom` tie in `descriptor.pricing`, reachable only through a\n * caller-supplied override that skipped `validateModelDescriptor`) names\n * which model's override is broken instead of just \"some period tied.\"\n */\nimport {\n selectPricingPeriod,\n type ModelDescriptor,\n type PricingPeriod,\n} from '@llm-kit/model-registry';\nimport { NoPricingPeriodError } from './errors.js';\n\nexport function selectPeriodOrThrow(descriptor: ModelDescriptor, at: Date | string): PricingPeriod {\n const period = selectPricingPeriod(descriptor.pricing ?? [], at, {\n canonicalId: descriptor.canonicalId,\n provider: descriptor.provider,\n });\n if (period === undefined) {\n const atLabel = at instanceof Date ? at.toISOString() : at;\n throw new NoPricingPeriodError(descriptor.canonicalId, descriptor.provider, atLabel);\n }\n return period;\n}\n","/**\n * Model resolution — a thin, defaulting wrapper over\n * `@llm-kit/model-registry`'s `resolveModel`. All the\n * resolution-order and ambiguity logic lives there; this module only\n * supplies the bundled registry as a default and re-shapes the options type\n * for this package's public surface.\n */\nimport { MODEL_REGISTRY, resolveModel as resolveAgainstRegistry } from '@llm-kit/model-registry';\nimport type { ResolveModelOptions, ResolvedModel } from './types.js';\n\nexport function resolveModel(model: string, options: ResolveModelOptions = {}): ResolvedModel {\n const registry = options.registry ?? MODEL_REGISTRY;\n return resolveAgainstRegistry(model, registry, {\n provider: options.provider,\n overrides: options.overrides,\n fallback: options.fallback,\n });\n}\n","/**\n * `calculateCost` — the package's core function.\n *\n * Resolution → effective-date period selection → usage validation → cached/\n * cache-write/reasoning subset accounting → exact per-line billing → exact\n * total. Every step that could silently under-report cost either throws\n * (unresolvable model, no priced period) or attaches a `PriceWarning`\n * (unsupported usage field, a cheapest-tier rate, an unpriced token class\n * billed at a conservative fallback rate) — see `errors.ts` and\n * `warnings.ts`.\n */\nimport {\n MODEL_REGISTRY,\n REGISTRY_VERSION,\n type ModelDescriptor,\n type PricingPeriod,\n} from '@llm-kit/model-registry';\nimport { InvalidTokenCountError } from './errors.js';\nimport {\n addExact,\n costOfTokens,\n formatExact,\n multiplyExact,\n parseDecimalRate,\n toDisplayNumber,\n type ExactAmount,\n} from './fixed-point.js';\nimport { normalizeRequestUsage } from './normalize/generic.js';\nimport { selectPeriodOrThrow } from './pricing-period.js';\nimport { resolveModel } from './resolve-model.js';\nimport type {\n CostBreakdown,\n CostLine,\n LlmUsage,\n PriceOptions,\n PriceRequest,\n PriceWarning,\n} from './types.js';\nimport {\n batchPricingUnavailableWarning,\n cacheWritePricedAsInputWarning,\n cachedExceedsInputWarning,\n cachedInputPricedAsInputWarning,\n partialTierPricingWarning,\n reasoningExceedsOutputWarning,\n reasoningPricedAsOutputWarning,\n} from './warnings.js';\n\nfunction assertSafeNonNegativeInteger(field: string, value: number): void {\n if (!Number.isInteger(value) || !Number.isSafeInteger(value) || value < 0) {\n throw new InvalidTokenCountError(field, value);\n }\n}\n\nfunction validateUsage(usage: LlmUsage): void {\n assertSafeNonNegativeInteger('inputTokens', usage.inputTokens);\n assertSafeNonNegativeInteger('outputTokens', usage.outputTokens);\n if (usage.cachedInputTokens !== undefined) {\n assertSafeNonNegativeInteger('cachedInputTokens', usage.cachedInputTokens);\n }\n if (usage.cacheWriteTokens !== undefined) {\n assertSafeNonNegativeInteger('cacheWriteTokens', usage.cacheWriteTokens);\n }\n if (usage.reasoningTokens !== undefined) {\n assertSafeNonNegativeInteger('reasoningTokens', usage.reasoningTokens);\n }\n}\n\ninterface BuiltLine {\n readonly line: CostLine;\n readonly exact: ExactAmount;\n}\n\nfunction buildCostLine(tokens: number, rate: ExactAmount): BuiltLine {\n const exact = costOfTokens(tokens, rate);\n return {\n line: {\n tokens,\n rate: formatExact(rate),\n costUsd: toDisplayNumber(exact),\n costUsdExact: formatExact(exact),\n },\n exact,\n };\n}\n\nexport function calculateCost(request: PriceRequest, options: PriceOptions = {}): CostBreakdown {\n const registry = options.registry ?? MODEL_REGISTRY;\n // Two channels can carry a provider qualifier: `request.provider` (the\n // README's documented path) and `options.provider` (typed on `PriceOptions`\n // — a `ResolveModelOptions` — and threaded by `createPriceCalculator`,\n // `calculator.ts`). `request.provider` wins when both are supplied; an\n // explicit `request.provider: undefined` is indistinguishable from an\n // omitted property in JS (this repo does not set\n // `exactOptionalPropertyTypes`), so it correctly falls through to\n // `options.provider` rather than forcing an unqualified lookup.\n const provider = request.provider ?? options.provider;\n const resolved = resolveModel(request.model, {\n provider,\n overrides: options.overrides,\n fallback: options.fallback,\n registry,\n });\n const descriptor: ModelDescriptor = resolved.descriptor;\n\n const at = request.at ?? new Date();\n const period: PricingPeriod = selectPeriodOrThrow(descriptor, at);\n\n const { usage, warnings: usageWarnings } = normalizeRequestUsage(request.usage);\n validateUsage(usage);\n\n const warnings: PriceWarning[] = [...usageWarnings];\n\n let batchAmount: ExactAmount | undefined;\n if (request.mode === 'batch') {\n if (period.batchMultiplier !== undefined) {\n batchAmount = parseDecimalRate(period.batchMultiplier, 'batchMultiplier');\n } else {\n warnings.push(batchPricingUnavailableWarning(descriptor.canonicalId, descriptor.provider));\n }\n }\n\n function effectiveRate(rateStr: string, field: string): ExactAmount {\n const rate = parseDecimalRate(rateStr, field);\n return batchAmount === undefined ? rate : multiplyExact(rate, batchAmount);\n }\n\n const cachedInputTokens = usage.cachedInputTokens ?? 0;\n const cacheWriteTokens = usage.cacheWriteTokens ?? 0;\n const inputSubsetTotal = cachedInputTokens + cacheWriteTokens;\n let ordinaryInputTokens = usage.inputTokens - inputSubsetTotal;\n if (ordinaryInputTokens < 0) {\n warnings.push(cachedExceedsInputWarning(usage.inputTokens, inputSubsetTotal));\n ordinaryInputTokens = 0;\n }\n\n const reasoningTokens = usage.reasoningTokens ?? 0;\n let ordinaryOutputTokens = usage.outputTokens - reasoningTokens;\n if (ordinaryOutputTokens < 0) {\n warnings.push(reasoningExceedsOutputWarning(usage.outputTokens, reasoningTokens));\n ordinaryOutputTokens = 0;\n }\n\n const inputRate = effectiveRate(period.input, 'input');\n const outputRate = effectiveRate(period.output, 'output');\n const inputLine = buildCostLine(ordinaryInputTokens, inputRate);\n const outputLine = buildCostLine(ordinaryOutputTokens, outputRate);\n\n const lineAmounts: ExactAmount[] = [inputLine.exact, outputLine.exact];\n\n let cachedInputLine: CostLine | undefined;\n if (usage.cachedInputTokens !== undefined) {\n let rate: ExactAmount;\n if (period.cachedInput !== undefined) {\n rate = effectiveRate(period.cachedInput, 'cachedInput');\n } else {\n rate = inputRate;\n if (cachedInputTokens > 0) {\n warnings.push(cachedInputPricedAsInputWarning(descriptor.canonicalId, descriptor.provider));\n }\n }\n const built = buildCostLine(cachedInputTokens, rate);\n cachedInputLine = built.line;\n lineAmounts.push(built.exact);\n }\n\n let cacheWriteLine: CostLine | undefined;\n if (usage.cacheWriteTokens !== undefined) {\n let rate: ExactAmount;\n if (period.cacheWrite !== undefined) {\n rate = effectiveRate(period.cacheWrite, 'cacheWrite');\n } else {\n rate = inputRate;\n if (cacheWriteTokens > 0) {\n warnings.push(cacheWritePricedAsInputWarning(descriptor.canonicalId, descriptor.provider));\n }\n }\n const built = buildCostLine(cacheWriteTokens, rate);\n cacheWriteLine = built.line;\n lineAmounts.push(built.exact);\n }\n\n let reasoningLine: CostLine | undefined;\n if (usage.reasoningTokens !== undefined) {\n let rate: ExactAmount;\n if (period.reasoning !== undefined) {\n rate = effectiveRate(period.reasoning, 'reasoning');\n } else {\n rate = outputRate;\n if (reasoningTokens > 0) {\n warnings.push(reasoningPricedAsOutputWarning(descriptor.canonicalId, descriptor.provider));\n }\n }\n const built = buildCostLine(reasoningTokens, rate);\n reasoningLine = built.line;\n lineAmounts.push(built.exact);\n }\n\n if (period.cheapestTier === true) {\n warnings.push(partialTierPricingWarning(descriptor.canonicalId, descriptor.provider));\n }\n\n const total = addExact(lineAmounts);\n const totalUsdExact = formatExact(total);\n const totalUsd = toDisplayNumber(total);\n\n return {\n model: request.model,\n canonicalModel: descriptor.canonicalId,\n provider: descriptor.provider,\n matchedBy: resolved.matchedBy,\n ...(resolved.requestedProvider !== undefined\n ? { requestedProvider: resolved.requestedProvider }\n : {}),\n currency: 'USD',\n input: inputLine.line,\n output: outputLine.line,\n ...(cachedInputLine !== undefined ? { cachedInput: cachedInputLine } : {}),\n ...(cacheWriteLine !== undefined ? { cacheWrite: cacheWriteLine } : {}),\n ...(reasoningLine !== undefined ? { reasoning: reasoningLine } : {}),\n totalUsd,\n totalUsdExact,\n registryVersion: REGISTRY_VERSION,\n pricingEffectiveFrom: period.effectiveFrom,\n warnings,\n };\n}\n","/**\n * `createPriceCalculator` — bundles a set of default overrides/fallback/\n * registry once, so a caller pricing many requests against the same\n * negotiated rates doesn't repeat `options` on every call.\n */\nimport { calculateCost } from './calculate-cost.js';\nimport { resolveModel } from './resolve-model.js';\nimport type {\n CostBreakdown,\n PriceCalculator,\n PriceCalculatorOptions,\n PriceOptions,\n PriceRequest,\n ResolvedModel,\n ResolveModelOptions,\n} from './types.js';\n\nexport function createPriceCalculator(defaults: PriceCalculatorOptions = {}): PriceCalculator {\n return {\n calculateCost(request: PriceRequest, options: PriceOptions = {}): CostBreakdown {\n return calculateCost(request, {\n overrides: options.overrides ?? defaults.overrides,\n fallback: options.fallback ?? defaults.fallback,\n registry: options.registry ?? defaults.registry,\n provider: options.provider,\n });\n },\n resolveModel(model: string, options: ResolveModelOptions = {}): ResolvedModel {\n return resolveModel(model, {\n overrides: options.overrides ?? defaults.overrides,\n fallback: options.fallback ?? defaults.fallback,\n registry: options.registry ?? defaults.registry,\n provider: options.provider,\n });\n },\n };\n}\n","/**\n * Custom/negotiated pricing overrides — an exact custom override is the\n * highest-precedence resolution step.\n */\nimport type { ModelDescriptor, PricingPeriod, ProviderId } from '@llm-kit/model-registry';\nimport type { CustomPriceInput } from './types.js';\n\n/**\n * Builds a single-period `ModelDescriptor` from a simplified rate shape, for\n * passing as `options.overrides` to `calculateCost`/`resolveModel`/\n * `createPriceCalculator` — without hand-writing the full registry schema\n * (`sourceUrl`, `observedAt`, etc. are given sensible, deterministic\n * defaults rather than reading the system clock, so the result is a pure\n * function of its input).\n */\nexport function createPriceOverride(input: CustomPriceInput): ModelDescriptor {\n const effectiveFrom = input.effectiveFrom ?? '1970-01-01';\n const period: PricingPeriod = {\n effectiveFrom,\n ...(input.effectiveTo !== undefined ? { effectiveTo: input.effectiveTo } : {}),\n currency: 'USD',\n unit: 'per-million-tokens',\n input: input.input,\n output: input.output,\n ...(input.cachedInput !== undefined ? { cachedInput: input.cachedInput } : {}),\n ...(input.cacheWrite !== undefined ? { cacheWrite: input.cacheWrite } : {}),\n ...(input.reasoning !== undefined ? { reasoning: input.reasoning } : {}),\n ...(input.batchMultiplier !== undefined ? { batchMultiplier: input.batchMultiplier } : {}),\n sourceUrl: input.sourceUrl ?? 'urn:usage-tab:custom-override',\n observedAt: input.observedAt ?? effectiveFrom,\n ...(input.notes !== undefined ? { notes: input.notes } : {}),\n };\n\n return {\n canonicalId: input.canonicalId,\n // `ModelDescriptor.provider` is typed `ProviderId` for registry source\n // data (schema-validated against the baseline provider list); an\n // override is not registry source data, and `resolveModel` never checks\n // this field against `PROVIDER_IDS` at runtime, so a negotiated deal\n // with an unlisted vendor is free to use any label here.\n provider: (input.provider ?? 'custom') as ProviderId,\n aliases: input.aliases ?? [],\n ...(input.family !== undefined ? { family: input.family } : {}),\n ...(input.contextWindow !== undefined ? { contextWindow: input.contextWindow } : {}),\n pricing: [period],\n };\n}\n","/**\n * Structural adapter for OpenAI's usage shape — both the Chat Completions\n * form (`prompt_tokens`/`completion_tokens`) and the newer Responses API\n * form (`input_tokens`/`output_tokens`). Field names only; this file never\n * imports the `openai` SDK.\n *\n * OpenAI's `completion_tokens`/`output_tokens` already *includes* reasoning\n * tokens as a subset (confirmed by OpenAI's own usage docs for the o-series\n * and GPT-5 reasoning models), matching this package's default \"reasoning is\n * a subset of outputTokens\" contract — no arithmetic is needed here to make\n * it a subset; `calculateCost` performs the subtraction.\n */\nimport { InvalidUsageError } from '../errors.js';\nimport type { LlmUsage, NormalizedUsageResult, PriceWarning } from '../types.js';\nimport { unsupportedUsageFieldWarning } from '../warnings.js';\nimport { assertUsageObject, isPlainObject, readNestedNumber, readNumber } from './support.js';\n\nconst KNOWN_TOP_LEVEL = new Set([\n 'prompt_tokens',\n 'completion_tokens',\n 'input_tokens',\n 'output_tokens',\n 'total_tokens',\n 'prompt_tokens_details',\n 'completion_tokens_details',\n 'input_tokens_details',\n 'output_tokens_details',\n]);\n\nconst KNOWN_DETAIL_FIELDS = new Set([\n 'cached_tokens',\n 'reasoning_tokens',\n 'audio_tokens',\n 'accepted_prediction_tokens',\n 'rejected_prediction_tokens',\n]);\n\nexport function normalizeOpenAIUsage(value: unknown): NormalizedUsageResult {\n const obj = assertUsageObject(value, 'normalizeOpenAIUsage');\n const adapterName = 'normalizeOpenAIUsage';\n\n const inputTokens =\n readNumber(obj, 'prompt_tokens', adapterName) ?? readNumber(obj, 'input_tokens', adapterName);\n const outputTokens =\n readNumber(obj, 'completion_tokens', adapterName) ??\n readNumber(obj, 'output_tokens', adapterName);\n if (inputTokens === undefined || outputTokens === undefined) {\n throw new InvalidUsageError(\n 'normalizeOpenAIUsage expected numeric \"prompt_tokens\"/\"completion_tokens\" (Chat Completions) or \"input_tokens\"/\"output_tokens\" (Responses API).',\n );\n }\n\n const cachedInputTokens =\n readNestedNumber(obj, 'prompt_tokens_details', 'cached_tokens', adapterName) ??\n readNestedNumber(obj, 'input_tokens_details', 'cached_tokens', adapterName);\n const reasoningTokens =\n readNestedNumber(obj, 'completion_tokens_details', 'reasoning_tokens', adapterName) ??\n readNestedNumber(obj, 'output_tokens_details', 'reasoning_tokens', adapterName);\n\n const usage: LlmUsage = {\n inputTokens,\n outputTokens,\n ...(cachedInputTokens !== undefined ? { cachedInputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n };\n\n const warnings: PriceWarning[] = [];\n for (const key of Object.keys(obj)) {\n if (!KNOWN_TOP_LEVEL.has(key)) warnings.push(unsupportedUsageFieldWarning(key));\n }\n for (const detailKey of [\n 'prompt_tokens_details',\n 'completion_tokens_details',\n 'input_tokens_details',\n 'output_tokens_details',\n ]) {\n const details = obj[detailKey];\n if (!isPlainObject(details)) continue;\n for (const key of Object.keys(details)) {\n if (!KNOWN_DETAIL_FIELDS.has(key))\n warnings.push(unsupportedUsageFieldWarning(`${detailKey}.${key}`));\n }\n }\n\n return { usage, warnings };\n}\n","/**\n * Structural adapter for Anthropic's usage shape. Field names only; this\n * file never imports the `@anthropic-ai/sdk` package.\n *\n * Anthropic's `input_tokens` is the ordinary (non-cached, non-write)\n * portion only — `cache_creation_input_tokens` and `cache_read_input_tokens`\n * are reported *additionally*, not as a subset of `input_tokens` the way\n * OpenAI's `cached_tokens` is a subset of `prompt_tokens`. This is exactly\n * the case where this package's default \"cached/cache-write are subsets of\n * inputTokens\" contract does not hold in the provider's raw shape, so\n * `normalizeAnthropicUsage` sums the three into `LlmUsage.inputTokens` so the\n * default \"cached/cache-write are subsets of inputTokens\" contract holds\n * uniformly for every caller of `calculateCost`, regardless of which\n * provider's raw shape it came from.\n */\nimport { InvalidUsageError } from '../errors.js';\nimport type { LlmUsage, NormalizedUsageResult, PriceWarning } from '../types.js';\nimport { unsupportedUsageFieldWarning } from '../warnings.js';\nimport { assertUsageObject, isPlainObject, readNumber } from './support.js';\n\nconst KNOWN_TOP_LEVEL = new Set([\n 'input_tokens',\n 'output_tokens',\n 'cache_creation_input_tokens',\n 'cache_read_input_tokens',\n 'cache_creation',\n]);\n\nconst KNOWN_CACHE_CREATION_FIELDS = new Set([\n 'ephemeral_5m_input_tokens',\n 'ephemeral_1h_input_tokens',\n]);\n\nexport function normalizeAnthropicUsage(value: unknown): NormalizedUsageResult {\n const obj = assertUsageObject(value, 'normalizeAnthropicUsage');\n const adapterName = 'normalizeAnthropicUsage';\n\n const baseInputTokens = readNumber(obj, 'input_tokens', adapterName);\n const outputTokens = readNumber(obj, 'output_tokens', adapterName);\n if (baseInputTokens === undefined || outputTokens === undefined) {\n throw new InvalidUsageError(\n 'normalizeAnthropicUsage expected numeric \"input_tokens\" and \"output_tokens\".',\n );\n }\n\n const cachedInputTokens = readNumber(obj, 'cache_read_input_tokens', adapterName);\n\n // Anthropic's prompt-caching docs (see below) confirm current responses\n // report cache-write tokens BOTH ways at once: the aggregate\n // `cache_creation_input_tokens` field AND the per-TTL breakdown\n // (`cache_creation.ephemeral_5m_input_tokens` / `.ephemeral_1h_input_tokens`),\n // with `cache_creation_input_tokens` documented as equal to the sum of the\n // `cache_creation` object's values:\n //\n // \"Note that the current cache_creation_input_tokens field equals the\n // sum of the values in the cache_creation object.\"\n // — https://platform.claude.com/docs/en/build-with-claude/prompt-caching\n // (fetched 2026-08-06), whose example response carries both fields in\n // the same `usage` object:\n // { \"cache_creation_input_tokens\": 248, \"cache_creation\": { \"ephemeral_5m_input_tokens\": 148, \"ephemeral_1h_input_tokens\": 100 }, ... }\n //\n // This package's schema has one `cacheWrite` field per pricing period, not\n // one per TTL (see `docs/provider-data/anthropic.json`'s notes), so the\n // per-TTL buckets are only summed into `cacheWriteTokens` as a *fallback*\n // when the aggregate field is absent — `cache_creation_input_tokens` is\n // preferred when present, since the docs guarantee it is already the sum.\n //\n // The unknown-key scan over `cache_creation`, however, must NOT be gated\n // on that fallback: since both fields routinely co-occur, gating the scan\n // on `cacheWriteTokens === undefined` would mean the scan never runs in\n // the common case, and a future TTL bucket Anthropic adds to\n // `cache_creation` (something other than the two known\n // `ephemeral_*_input_tokens` fields) would go unreported. So the scan runs\n // whenever `cache_creation` is present, independent of whether the\n // aggregate field was also present.\n let cacheWriteTokens = readNumber(obj, 'cache_creation_input_tokens', adapterName);\n const warnings: PriceWarning[] = [];\n // `cache_creation` is itself a known field: absent or `null` is absent,\n // like every other field this adapter reads, but present-and-not-an-object\n // is malformed — it must not silently fall through to \"no per-TTL data\",\n // which would drop a cache-write signal without a warning.\n if (obj.cache_creation !== undefined && obj.cache_creation !== null) {\n if (!isPlainObject(obj.cache_creation)) {\n throw new InvalidUsageError(\n `${adapterName} expected \"cache_creation\" to be an object, received ${typeof obj.cache_creation}.`,\n );\n }\n const creation = obj.cache_creation;\n if (cacheWriteTokens === undefined) {\n const fiveMinute = readNumber(creation, 'ephemeral_5m_input_tokens', adapterName) ?? 0;\n const oneHour = readNumber(creation, 'ephemeral_1h_input_tokens', adapterName) ?? 0;\n if (fiveMinute > 0 || oneHour > 0) cacheWriteTokens = fiveMinute + oneHour;\n }\n for (const key of Object.keys(creation)) {\n if (!KNOWN_CACHE_CREATION_FIELDS.has(key)) {\n warnings.push(unsupportedUsageFieldWarning(`cache_creation.${key}`));\n }\n }\n }\n\n const inputTokens = baseInputTokens + (cachedInputTokens ?? 0) + (cacheWriteTokens ?? 0);\n\n const usage: LlmUsage = {\n inputTokens,\n outputTokens,\n ...(cachedInputTokens !== undefined ? { cachedInputTokens } : {}),\n ...(cacheWriteTokens !== undefined ? { cacheWriteTokens } : {}),\n };\n\n for (const key of Object.keys(obj)) {\n if (!KNOWN_TOP_LEVEL.has(key)) warnings.push(unsupportedUsageFieldWarning(key));\n }\n\n return { usage, warnings };\n}\n","/**\n * Structural adapter for Google Gemini's `usageMetadata` shape. Field names\n * only; this file never imports `@google/genai` or `@google/generative-ai`.\n *\n * Gemini's `candidatesTokenCount` excludes `thoughtsTokenCount` — thought\n * (reasoning) tokens are billed and reported separately, never folded into\n * the candidates count the way OpenAI folds `reasoning_tokens` into\n * `completion_tokens`. This is the mirror case of `normalizeAnthropicUsage`:\n * to give every caller of `calculateCost` the same \"reasoning is a subset of\n * outputTokens\" default, this adapter *adds*\n * `thoughtsTokenCount` into `LlmUsage.outputTokens` so `calculateCost`'s\n * subtraction recovers exactly `candidatesTokenCount` as ordinary output.\n * `cachedContentTokenCount`, by contrast, genuinely is a subset of\n * `promptTokenCount` already, so `inputTokens` needs no adjustment.\n */\nimport { InvalidUsageError } from '../errors.js';\nimport type { LlmUsage, NormalizedUsageResult, PriceWarning } from '../types.js';\nimport { unsupportedUsageFieldWarning } from '../warnings.js';\nimport { assertUsageObject, readNumber } from './support.js';\n\nconst KNOWN_TOP_LEVEL = new Set([\n 'promptTokenCount',\n 'candidatesTokenCount',\n 'totalTokenCount',\n 'cachedContentTokenCount',\n 'thoughtsTokenCount',\n]);\n\nexport function normalizeGoogleUsage(value: unknown): NormalizedUsageResult {\n const obj = assertUsageObject(value, 'normalizeGoogleUsage');\n const adapterName = 'normalizeGoogleUsage';\n\n const inputTokens = readNumber(obj, 'promptTokenCount', adapterName);\n const candidatesTokenCount = readNumber(obj, 'candidatesTokenCount', adapterName);\n if (inputTokens === undefined || candidatesTokenCount === undefined) {\n throw new InvalidUsageError(\n 'normalizeGoogleUsage expected numeric \"promptTokenCount\" and \"candidatesTokenCount\" (Gemini usageMetadata).',\n );\n }\n\n const cachedInputTokens = readNumber(obj, 'cachedContentTokenCount', adapterName);\n const reasoningTokens = readNumber(obj, 'thoughtsTokenCount', adapterName);\n const outputTokens = candidatesTokenCount + (reasoningTokens ?? 0);\n\n const usage: LlmUsage = {\n inputTokens,\n outputTokens,\n ...(cachedInputTokens !== undefined ? { cachedInputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n };\n\n const warnings: PriceWarning[] = [];\n for (const key of Object.keys(obj)) {\n if (!KNOWN_TOP_LEVEL.has(key)) warnings.push(unsupportedUsageFieldWarning(key));\n }\n\n return { usage, warnings };\n}\n","/**\n * Structural adapter for OpenAI-compatible chat-completions APIs (Groq,\n * Together AI, Mistral's La Plateforme, and similar) — the same\n * `prompt_tokens`/`completion_tokens` shape OpenAI popularized, but leniently:\n * these providers don't always nest cached-token counts under\n * `prompt_tokens_details` the way OpenAI does, so this adapter also accepts\n * a flat top-level `cached_tokens` and DeepSeek-style\n * `prompt_cache_hit_tokens`. Field names only; no provider SDK import.\n */\nimport { InvalidUsageError } from '../errors.js';\nimport type { LlmUsage, NormalizedUsageResult, PriceWarning } from '../types.js';\nimport { unsupportedUsageFieldWarning } from '../warnings.js';\nimport { assertUsageObject, readNestedNumber, readNumber } from './support.js';\n\nconst KNOWN_TOP_LEVEL = new Set([\n 'prompt_tokens',\n 'completion_tokens',\n 'total_tokens',\n 'prompt_tokens_details',\n 'completion_tokens_details',\n 'cached_tokens',\n 'prompt_cache_hit_tokens',\n 'prompt_cache_miss_tokens',\n]);\n\nexport function normalizeOpenAICompatibleUsage(value: unknown): NormalizedUsageResult {\n const obj = assertUsageObject(value, 'normalizeOpenAICompatibleUsage');\n const adapterName = 'normalizeOpenAICompatibleUsage';\n\n const inputTokens = readNumber(obj, 'prompt_tokens', adapterName);\n const outputTokens = readNumber(obj, 'completion_tokens', adapterName);\n if (inputTokens === undefined || outputTokens === undefined) {\n throw new InvalidUsageError(\n 'normalizeOpenAICompatibleUsage expected numeric \"prompt_tokens\" and \"completion_tokens\".',\n );\n }\n\n const cachedInputTokens =\n readNestedNumber(obj, 'prompt_tokens_details', 'cached_tokens', adapterName) ??\n readNumber(obj, 'cached_tokens', adapterName) ??\n readNumber(obj, 'prompt_cache_hit_tokens', adapterName);\n const reasoningTokens = readNestedNumber(\n obj,\n 'completion_tokens_details',\n 'reasoning_tokens',\n adapterName,\n );\n\n const usage: LlmUsage = {\n inputTokens,\n outputTokens,\n ...(cachedInputTokens !== undefined ? { cachedInputTokens } : {}),\n ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),\n };\n\n const warnings: PriceWarning[] = [];\n for (const key of Object.keys(obj)) {\n if (!KNOWN_TOP_LEVEL.has(key)) warnings.push(unsupportedUsageFieldWarning(key));\n }\n\n return { usage, warnings };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAAA;AAAA;AAAA;;;ACaA,SAAS,iBAAiB,YAA+C;AACvE,SAAO,WAAW,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI;AAC1E;AA8BO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAClC,OAAO;AAAA,EACP;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,EAET,YAAY,aAAqB,UAAmB,gBAAoC;AACtF;AAAA,MACE,aAAa,SACT,qBAAqB,WAAW,6GAChC,mBAAmB,UAAa,eAAe,SAAS,IACtD,qBAAqB,WAAW,mBAAmB,QAAQ,4BAAuB,eAAe,KAAK,IAAI,CAAC,gHAC3G,qBAAqB,WAAW,mBAAmB,QAAQ;AAAA,IACnE;AACA,SAAK,OAAO;AACZ,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,QAAI,mBAAmB,UAAa,eAAe,SAAS,GAAG;AAC7D,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AACF;AASO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACpC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,aAAqB,YAAuC;AACtE;AAAA,MACE,IAAI,WAAW,kCAAkC,iBAAiB,UAAU,CAAC;AAAA,IAE/E;AACA,SAAK,OAAO;AACZ,SAAK,cAAc;AACnB,SAAK,aAAa;AAAA,EACpB;AACF;AAsCO,IAAM,8BAAN,cAA0C,MAAM;AAAA,EAC5C,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,IACA,eACA,OACA,UACA;AACA,UAAM,cAAc,UAAU;AAC9B,UAAM,WAAW,UAAU;AAC3B,UAAM,aACJ,gBAAgB,UAAa,aAAa,SACtC,eAAe,WAAW,gBAAgB,QAAQ,OAClD,gBAAgB,SACd,eAAe,WAAW,MAC1B,aAAa,SACX,kBAAkB,QAAQ,MAC1B;AACV;AAAA,MACE,GAAG,OAAO,KAAK,CAAC,yCAAyC,aAAa,IAAI,UAAU,mCAAmC,EAAE;AAAA,IAG3H;AACA,SAAK,OAAO;AACZ,SAAK,KAAK;AACV,SAAK,gBAAgB;AACrB,SAAK,QAAQ;AACb,QAAI,gBAAgB,QAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AACA,QAAI,aAAa,QAAW;AAC1B,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AACF;AAQO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACvC,OAAO;AAAA,EACP;AAAA,EAET,YAAY,OAAe;AACzB,UAAM,IAAI,KAAK,oEAAoE;AACnF,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AACF;;;ACpJA,SAAS,YAAY,YAA6C;AAChE,SAAO,EAAE,UAAU,WAAW,UAAU,aAAa,WAAW,YAAY;AAC9E;AASA,SAAS,WACP,MACA,IACA,UACwF;AACxF,MAAI,aAAa,QAAW;AAC1B,UAAM,YAAY,KAAK,KAAK,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,gBAAgB,EAAE;AAClF,QAAI,cAAc,OAAW,QAAO,EAAE,QAAQ,UAAU;AAExD,UAAM,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,QAAQ,SAAS,EAAE,CAAC;AACnF,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,QAAQ,OAAO,CAAC,EAAE;AACpD,QAAI,OAAO,SAAS,EAAG,QAAO,EAAE,WAAW,OAAO;AAQlD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,gBAAgB,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAChF,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,QAAQ,OAAO,CAAC,EAAE;AACpD,MAAI,OAAO,SAAS,EAAG,QAAO,EAAE,WAAW,OAAO;AAElD,SAAO,CAAC;AACV;AAQO,SAAS,aACd,aACA,UACA,UAA+B,CAAC,GACjB;AACf,QAAM,WAAW,QAAQ;AAGzB,MAAI,QAAQ,cAAc,UAAa,QAAQ,UAAU,SAAS,GAAG;AACnE,UAAM,gBAAgB,WAAW,QAAQ,WAAW,aAAa,QAAQ;AACzE,QAAI,cAAc,cAAc,QAAW;AACzC,YAAM,IAAI,oBAAoB,aAAa,cAAc,UAAU,IAAI,WAAW,CAAC;AAAA,IACrF;AACA,QAAI,cAAc,WAAW,QAAW;AACtC,aAAO;AAAA,QACL,YAAY,cAAc;AAAA,QAC1B,WAAW;AAAA,QACX;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,QAAW;AAC1B,UAAM,YAAY,SAAS;AAAA,MACzB,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,gBAAgB;AAAA,IACtD;AACA,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AAAA,MACtB,CAAC,MAAM,EAAE,aAAa,YAAY,EAAE,QAAQ,SAAS,WAAW;AAAA,IAClE;AACA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,aAAa,OAAO,CAAC;AAC3B,UAAI,eAAe,QAAW;AAC5B,eAAO,EAAE,YAAY,WAAW,gBAAgB,aAAa,mBAAmB,SAAS;AAAA,MAC3F;AAAA,IACF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,IAAI,oBAAoB,aAAa,OAAO,IAAI,WAAW,CAAC;AAAA,IACpE;AAAA,EACF;AAUA,MAAI,aAAa,QAAW;AAC1B,UAAM,SAAS,SAAS;AAAA,MACtB,CAAC,MAAM,EAAE,gBAAgB,eAAe,EAAE,QAAQ,SAAS,WAAW;AAAA,IACxE;AACA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,aAAa,OAAO,CAAC;AAC3B,UAAI,eAAe,QAAW;AAC5B,eAAO,EAAE,YAAY,WAAW,gBAAgB,aAAa,mBAAmB,SAAS;AAAA,MAC3F;AAAA,IACF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,IAAI,oBAAoB,aAAa,OAAO,IAAI,WAAW,CAAC;AAAA,IACpE;AAAA,EACF;AAGA,MAAI,QAAQ,aAAa,QAAW;AAClC,UAAM,WAAW,SAAS,KAAK,CAAC,MAAM,EAAE,gBAAgB,QAAQ,QAAQ;AACxE,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAOA,MAAI,aAAa,QAAW;AAC1B,UAAM,iBAAiB;AAAA,MACrB,GAAG,IAAI;AAAA,QACL,SACG,OAAO,CAAC,MAAM,EAAE,gBAAgB,eAAe,EAAE,QAAQ,SAAS,WAAW,CAAC,EAC9E,IAAI,CAAC,MAAM,EAAE,QAAQ;AAAA,MAC1B;AAAA,IACF,EAAE,KAAK;AACP,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,IAAI,kBAAkB,aAAa,UAAU,cAAc;AAAA,IACnE;AAAA,EACF;AACA,QAAM,IAAI,kBAAkB,aAAa,QAAQ;AACnD;;;ACvLA,SAAS,YAAY,OAA8B;AACjD,QAAM,KAAK,iBAAiB,OAAO,MAAM,QAAQ,IAAI,KAAK,MAAM,KAAK;AACrE,MAAI,OAAO,MAAM,EAAE,GAAG;AACpB,UAAM,IAAI,uBAAuB,iBAAiB,OAAO,MAAM,YAAY,IAAI,KAAK;AAAA,EACtF;AACA,SAAO;AACT;AAwCO,SAAS,oBACd,SACA,IACA,UAC2B;AAC3B,QAAM,OAAO,YAAY,EAAE;AAE3B,MAAI;AACJ,MAAI,aAAa,OAAO;AACxB,MAAI,WAAW;AAEf,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,YAAY,OAAO,aAAa;AAC/C,QAAI,SAAS,KAAM;AACnB,QAAI,OAAO,gBAAgB,UAAa,QAAQ,YAAY,OAAO,WAAW,EAAG;AACjF,QAAI,SAAS,YAAY;AACvB,aAAO;AACP,mBAAa;AACb,iBAAW;AAAA,IACb,WAAW,WAAW,YAAY;AAChC,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,MAAI,SAAS,UAAa,WAAW,GAAG;AACtC,UAAM,IAAI;AAAA,MACR,cAAc,OAAO,GAAG,YAAY,IAAI;AAAA,MACxC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC/EO,IAAM,mBAAmB;AAEzB,IAAM,iBAA6C;AAAA,EACxD;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,eAAc,QAAO,cAAa,SAAQ,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACvoB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,aAAY;AAAA,EAC7G;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC,kBAAkB;AAAA,IAC5B,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACpoB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,cAAa,SAAQ,CAAC,wKAAqK,EAAC;AAAA,EAC7R;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACroB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,aAAY;AAAA,EAC7G;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACroB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,aAAY;AAAA,EAC7G;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACroB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,aAAY;AAAA,EAC7G;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACroB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,aAAY;AAAA,EAC7G;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oLAAmL,iLAAiL,EAAC;AAAA,IACroB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,aAAY;AAAA,EAC7G;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,eAAc,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,yMAAwM,+JAA8J,iLAAiL,EAAC;AAAA,MACj1B,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,oEAAmE,cAAa,cAAa,SAAQ,CAAC,oKAAmK,iLAAiL,EAAC;AAAA,IACrnB;AAAA,IACA,QAAQ,EAAC,OAAM,oEAAmE,cAAa,cAAa,SAAQ,CAAC,gJAAgJ,EAAC;AAAA,EACxQ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,0GAAyG,0DAA0D,EAAC;AAAA,IACzW;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,sLAAuL,oMAAmM,wPAAuP,EAAC;AAAA,IACvzB;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,0GAAyG,0DAA0D,EAAC;AAAA,IACzW;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,mBAAkB,OAAM,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,0NAAsN,+EAA8E,4YAAuY,EAAC;AAAA,IAC14B;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,mBAAkB,OAAM,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,+FAAgG,+EAA8E,6JAA6J,EAAC;AAAA,IACnlB;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,0GAAyG,2SAAwS,EAAC;AAAA,IACvlB;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,0GAAyG,gUAA2T,EAAC;AAAA,IAC1mB;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2CAA0C,cAAa,cAAa,SAAQ,CAAC,wGAAwG,EAAC;AAAA,IAC9S;AAAA,IACA,QAAQ,EAAC,OAAM,2CAA0C,cAAa,aAAY;AAAA,EACpF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,kZAA4Y,oJAAmJ,0LAAsL,i3BAAk3B,EAAC;AAAA,IACpiE;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,kZAA4Y,oJAAmJ,2TAAwT,EAAC;AAAA,IACtzC;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,kZAA4Y,oJAAmJ,+TAA4T,EAAC;AAAA,IAC3zC;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,oJAAmJ,iUAA8T,EAAC;AAAA,IAChpC;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,iMAA6L,22BAA42B,EAAC;AAAA,IACn/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,sMAAkM,g3BAAi3B,EAAC;AAAA,IAC7/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,uMAAmM,g3BAAi3B,EAAC;AAAA,IAC//D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,iMAA6L,02BAA22B,EAAC;AAAA,IACn/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,sMAAkM,+2BAAg3B,EAAC;AAAA,IAC7/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,iMAA6L,y2BAA02B,EAAC;AAAA,IACpzD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,qMAAiM,82BAA+2B,EAAC;AAAA,IAC5zD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,qMAAiM,82BAA+2B,EAAC;AAAA,IAC5zD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,yLAAqL,62BAA82B,EAAC;AAAA,IAC39D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,mMAA+L,22BAA42B,EAAC;AAAA,IACxzD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,mMAA+L,22BAA42B,EAAC;AAAA,IACxzD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,2LAAuL,+2BAAg3B,EAAC;AAAA,IAChyD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,kMAA8L,22BAA42B,EAAC;AAAA,IACtzD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,uMAAmM,g3BAAi3B,EAAC;AAAA,IACh0D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,sMAAkM,g3BAAi3B,EAAC;AAAA,IAC9zD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,2LAAuL,+2BAAg3B,EAAC;AAAA,IAChyD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,iOAAgO,kMAA8L,22BAA42B,EAAC;AAAA,IACtzD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,cAAa,QAAO,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,oJAAmJ,sdAAkd,g3BAAi3B,EAAC;AAAA,IAC7/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,QAAO,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,oJAAmJ,sMAAkM,+2BAAg3B,EAAC;AAAA,IAC7uD;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,cAAa,SAAQ,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,sOAAgO,oJAAmJ,ydAAqd,i3BAAk3B,EAAC;AAAA,IACngE;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,8LAA0L,s2BAAu2B,EAAC;AAAA,IAC7+D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,6TAA0T,EAAC;AAAA,IACpwC;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,eAAc,QAAO,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,qOAA+N,oJAAmJ,gUAA6T,EAAC;AAAA,IACnqC;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,UAAS,UAAS,UAAS,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,uLAAmL,02BAA22B,EAAC;AAAA,IAC7+D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,4LAAwL,s2BAAu2B,EAAC;AAAA,IACz+D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,iMAA6L,22BAA42B,EAAC;AAAA,IACn/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,qLAAiL,02BAA22B,EAAC;AAAA,IACn9D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,gBAAe,MAAK,aAAY,+GAA8G,cAAa,cAAa,SAAQ,CAAC,gMAA+L,sOAAgO,iOAAgO,kMAA8L,22BAA42B,EAAC;AAAA,IACr/D;AAAA,IACA,QAAQ,EAAC,OAAM,+GAA8G,cAAa,aAAY;AAAA,EACxJ;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,8OAA6O,0FAA0F,EAAC;AAAA,IAChgB;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,8OAA6O,0FAA0F,EAAC;AAAA,IAChgB;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,8HAA6H,uLAAuL,EAAC;AAAA,IAC7e;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,8HAA6H,qEAAuE,EAAC;AAAA,IAC7X;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,qTAAsT,mCAAmC,EAAC;AAAA,IAClhB;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,4JAA6J,2RAAwR,EAAC;AAAA,IAC/mB;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,aAAY,8BAA6B,cAAa,cAAa,SAAQ,CAAC,4JAA6J,mCAAmC,EAAC;AAAA,IAC1X;AAAA,IACA,QAAQ,EAAC,OAAM,8BAA6B,cAAa,aAAY;AAAA,EACvE;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,mBAAkB,OAAM,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,6GAA4G,4FAA2F,iDAAgD,iHAAiH,EAAC;AAAA,IAC5kB;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,mBAAkB,OAAM,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,8BAA6B,4FAA2F,iDAAgD,iHAAiH,EAAC;AAAA,IAC7f;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,gBAAe,MAAK,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,+UAAyU,wPAAuP,0FAA0F,EAAC;AAAA,IAC33B;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,gBAAe,MAAK,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,+UAAyU,sLAAqL,6KAA8K,wGAA0G,EAAC;AAAA,IACv/B;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,mBAAkB,OAAM,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,8GAA6G,4IAA6I,kGAAiG,iHAAiH,EAAC;AAAA,IAChrB;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,mBAAkB,OAAM,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,6GAA4G,4FAA2F,iDAAgD,iHAAiH,EAAC;AAAA,IAC5kB;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,mBAAkB,OAAM,aAAY,iDAAgD,cAAa,cAAa,SAAQ,CAAC,0NAAyN,oKAAqK,mUAAoU,qHAAqH,EAAC;AAAA,IAC3hC;AAAA,IACA,QAAQ,EAAC,OAAM,iDAAgD,cAAa,aAAY;AAAA,EAC1F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,wCAAuC,cAAa,cAAa,SAAQ,CAAC,yHAAwH,uFAAsF,4NAAuN,EAAC;AAAA,IACxmB;AAAA,IACA,QAAQ,EAAC,OAAM,wCAAuC,cAAa,aAAY;AAAA,EACjF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,QAAO,aAAY,wCAAuC,cAAa,cAAa,SAAQ,CAAC,yHAAwH,uFAAsF,0IAAqI,EAAC;AAAA,IACvhB;AAAA,IACA,QAAQ,EAAC,OAAM,wCAAuC,cAAa,aAAY;AAAA,EACjF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC,cAAc;AAAA,IACxB,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,wCAAuC,cAAa,cAAa,SAAQ,CAAC,yHAAwH,yJAAyJ,EAAC;AAAA,IACpd;AAAA,IACA,QAAQ,EAAC,OAAM,wCAAuC,cAAa,aAAY;AAAA,EACjF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC,eAAe;AAAA,IACzB,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,wCAAuC,cAAa,cAAa,SAAQ,CAAC,yHAAwH,2JAA0J,+OAA0O,EAAC;AAAA,IAC/rB;AAAA,IACA,QAAQ,EAAC,OAAM,wCAAuC,cAAa,aAAY;AAAA,EACjF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,wCAAuC,cAAa,cAAa,SAAQ,CAAC,0RAAwR,uHAAuH,EAAC;AAAA,IACllB;AAAA,IACA,QAAQ,EAAC,OAAM,wCAAuC,cAAa,aAAY;AAAA,EACjF;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,qIAAuI,EAAC;AAAA,IAClc;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,+VAAgW,EAAC;AAAA,IAC3pB;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,yRAAsR,EAAC;AAAA,IACjlB;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,kHAAkH,EAAC;AAAA,IAC7a;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,oLAAoL,EAAC;AAAA,IAC/e;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,6HAA6H,EAAC;AAAA,IAC1T;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,kGAAkG,EAAC;AAAA,IAC7Z;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kCAAiC,cAAa,cAAa,SAAQ,CAAC,+HAA8H,kGAAkG,EAAC;AAAA,IAC7Z;AAAA,IACA,QAAQ,EAAC,OAAM,kCAAiC,cAAa,aAAY;AAAA,EAC3E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,8FAA6F,8IAA6I,0KAA0K,EAAC;AAAA,IACjmB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACviB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACviB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,oIAAmI,mLAAmL,EAAC;AAAA,IAC7tB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,kIAA8H,4KAA2K,yGAAyG,EAAC;AAAA,IAClmB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACziB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACziB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,oIAAgI,4KAA2K,yGAAyG,EAAC;AAAA,IACpmB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACviB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,oIAAgI,4KAA2K,yGAAyG,EAAC;AAAA,IACpmB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,UAAS,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,wJAAoJ,4KAA2K,0MAA4M,EAAC;AAAA,IAC3tB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACviB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,6WAA8W,iMAAmM,EAAC;AAAA,IAC5yB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACziB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,UAAS,UAAS,UAAS,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,8FAA6F,+HAA2H,4KAA2K,yGAAyG,EAAC;AAAA,IAC7rB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACviB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACviB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,SAAQ,UAAS,SAAQ,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,+HAA2H,4KAA2K,yGAAyG,EAAC;AAAA,IAC9lB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,SAAQ,mBAAkB,OAAM,aAAY,kDAAiD,cAAa,cAAa,SAAQ,CAAC,4KAA2K,kIAAkI,EAAC;AAAA,IACxiB;AAAA,IACA,QAAQ,EAAC,OAAM,kDAAiD,cAAa,aAAY;AAAA,EAC3F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,aAAY,mDAAkD,cAAa,cAAa,SAAQ,CAAC,krBAA4qB,sHAAqH,iPAAmP,EAAC;AAAA,IACnuC;AAAA,IACA,QAAQ,EAAC,OAAM,mDAAkD,cAAa,aAAY;AAAA,EAC5F;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,gBAAe,MAAK,aAAY,uDAAsD,cAAa,cAAa,SAAQ,CAAC,sHAAqH,wUAAkU,oJAAsJ,EAAC;AAAA,IACpzB;AAAA,IACA,QAAQ,EAAC,OAAM,uDAAsD,cAAa,aAAY;AAAA,EAChG;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,2DAA0D,cAAa,cAAa,SAAQ,CAAC,sHAAqH,sjBAAwjB,EAAC;AAAA,IACn4B;AAAA,IACA,QAAQ,EAAC,OAAM,2DAA0D,cAAa,aAAY;AAAA,EACpG;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,aAAY,sCAAqC,cAAa,cAAa,SAAQ,CAAC,sHAAqH,iJAA2I,4YAA+Y,EAAC;AAAA,IACj1B;AAAA,IACA,QAAQ,EAAC,OAAM,sCAAqC,cAAa,aAAY;AAAA,EAC/E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,8HAA8H,EAAC;AAAA,IACjV;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,gIAA+H,wTAAqT,EAAC;AAAA,IAClnB;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,8HAA8H,EAAC;AAAA,IACjV;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,gIAA+H,ggBAAsgB,EAAC;AAAA,IACn0B;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,gIAA+H,mPAAgP,EAAC;AAAA,IAC7iB;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,SAAQ,eAAc,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,8HAA8H,EAAC;AAAA,IAClV;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,gIAA+H,2MAAsM,EAAC;AAAA,IACngB;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,8HAA8H,EAAC;AAAA,IACjV;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,8HAA8H,EAAC;AAAA,IACjV;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,EAAC,iBAAgB,cAAa,YAAW,OAAM,QAAO,sBAAqB,SAAQ,QAAO,UAAS,QAAO,eAAc,QAAO,aAAY,mCAAkC,cAAa,cAAa,SAAQ,CAAC,8HAA8H,EAAC;AAAA,IACjV;AAAA,IACA,QAAQ,EAAC,OAAM,mCAAkC,cAAa,aAAY;AAAA,EAC5E;AACF;;;AC9sCO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,gBAAwB,UAAkB,IAAY;AAChE;AAAA,MACE,0BAA0B,QAAQ,IAAI,cAAc,YAAY,EAAE;AAAA,IAEpE;AACA,SAAK,OAAO;AACZ,SAAK,iBAAiB;AACtB,SAAK,WAAW;AAChB,SAAK,KAAK;AAAA,EACZ;AACF;AAQO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAClC,OAAO;AAAA,EAEhB,YAAY,QAAgB;AAC1B;AAAA,MACE,kBAAkB,MAAM;AAAA,IAE1B;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAQO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACvC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,OAAe,OAAe;AACxC;AAAA,MACE,SAAS,KAAK,kDAAkD,OAAO,KAAK,CAAC;AAAA,IAE/E;AACA,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AACF;AAQO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAET,YAAY,OAAe,OAAe;AACxC;AAAA,MACE,kBAAkB,KAAK,mEAAmE,KAAK,UAAU,KAAK,CAAC;AAAA,IACjH;AACA,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AACF;;;AC5EO,IAAM,OAAoB,EAAE,WAAW,IAAI,OAAO,EAAE;AAE3D,IAAM,kBAAkB;AASjB,SAAS,iBAAiB,OAAe,OAA4B;AAC1E,MAAI,CAAC,gBAAgB,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,iBAAiB,OAAO,KAAK;AAAA,EACzC;AACA,QAAM,MAAM,MAAM,QAAQ,GAAG;AAC7B,MAAI,QAAQ,IAAI;AACd,WAAO,EAAE,WAAW,OAAO,KAAK,GAAG,OAAO,EAAE;AAAA,EAC9C;AACA,QAAM,YAAY,MAAM,MAAM,GAAG,GAAG;AACpC,QAAM,eAAe,MAAM,MAAM,MAAM,CAAC;AACxC,SAAO,EAAE,WAAW,OAAO,YAAY,YAAY,GAAG,OAAO,aAAa,OAAO;AACnF;AAEA,IAAM,oBAAoB;AAOnB,SAAS,aAAa,QAAgB,MAAgC;AAC3E,SAAO;AAAA,IACL,WAAW,OAAO,MAAM,IAAI,KAAK;AAAA,IACjC,OAAO,KAAK,QAAQ;AAAA,EACtB;AACF;AAGO,SAAS,cAAc,GAAgB,GAA6B;AACzE,SAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,OAAO,EAAE,QAAQ,EAAE,MAAM;AAC1E;AASO,SAAS,SAAS,SAA8C;AACrE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,WAAW;AACf,aAAW,UAAU,QAAS,KAAI,OAAO,QAAQ,SAAU,YAAW,OAAO;AAE7E,MAAI,MAAM;AACV,aAAW,UAAU,SAAS;AAC5B,WAAO,OAAO,YAAY,OAAO,OAAO,WAAW,OAAO,KAAK;AAAA,EACjE;AACA,SAAO,EAAE,WAAW,KAAK,OAAO,SAAS;AAC3C;AASO,SAAS,YAAY,QAA6B;AACvD,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,YAAY,WAAW,CAAC,OAAO,YAAY,OAAO;AACxD,QAAM,UAAU,OAAO,OAAO,OAAO,KAAK;AAC1C,QAAM,cAAc,OAAO,UAAU,IAAI,YAAY,YAAY;AACjE,QAAM,iBACJ,OAAO,UAAU,IAAI,MAAM,YAAY,SAAS,SAAS,EAAE,SAAS,OAAO,OAAO,GAAG;AAEvF,MAAI,UAAU,eAAe,QAAQ,OAAO,EAAE;AAC9C,MAAI,QAAQ,SAAS,EAAG,WAAU,QAAQ,OAAO,GAAG,GAAG;AAEvD,SAAO,GAAG,WAAW,MAAM,EAAE,GAAG,YAAY,SAAS,CAAC,IAAI,OAAO;AACnE;AAWO,SAAS,gBAAgB,QAA6B;AAC3D,SAAO,OAAO,YAAY,MAAM,CAAC;AACnC;;;AChHO,SAAS,6BAA6B,OAA6B;AACxE,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS,gBAAgB,KAAK;AAAA,EAChC;AACF;AAEO,SAAS,0BAA0B,aAAqB,aAAmC;AAChG,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS,yCAAyC,OAAO,WAAW,CAAC,0BAA0B,OAAO,WAAW,CAAC;AAAA,EACpH;AACF;AAEO,SAAS,8BACd,cACA,iBACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS,oBAAoB,OAAO,eAAe,CAAC,2BAA2B,OAAO,YAAY,CAAC;AAAA,EACrG;AACF;AAEO,SAAS,+BACd,gBACA,UACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,oCAAoC,QAAQ,IAAI,cAAc;AAAA,EACzE;AACF;AAEO,SAAS,0BAA0B,gBAAwB,UAAgC;AAChG,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,IAAI,QAAQ,IAAI,cAAc;AAAA,EACzC;AACF;AAEO,SAAS,+BACd,gBACA,UACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS,IAAI,QAAQ,IAAI,cAAc;AAAA,EACzC;AACF;AAEO,SAAS,gCACd,gBACA,UACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS,IAAI,QAAQ,IAAI,cAAc;AAAA,EACzC;AACF;AAEO,SAAS,+BACd,gBACA,UACc;AACd,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS,IAAI,QAAQ,IAAI,cAAc;AAAA,EACzC;AACF;;;ACxEO,SAAS,cAAc,OAAkD;AAC9E,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,kBAAkB,OAAgB,aAA8C;AAC9F,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,kBAAkB,GAAG,WAAW,iCAAiC,OAAO,KAAK,GAAG;AAAA,EAC5F;AACA,SAAO;AACT;AASO,SAAS,kBAAkB,OAAiC;AACjE,SACE,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,OAAO,UAAU,KAAK,KAAK,SAAS;AAE/F;AAkBO,SAAS,cAAc,OAAwB;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO,GAAG,MAAM,SAAS,CAAC;AACzD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAS;AACrD,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO,MAAM,KAAK,SAAS,IAAI,cAAc,MAAM,IAAI,MAAM;AAAA,EAC/D;AACA,MAAI,OAAO,UAAU,YAAa,QAAO;AACzC,MAAI,OAAO,UAAU,UAAU;AAK7B,QAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO,OAAO,KAAK;AAChD,QAAI,OAAO,GAAG,OAAO,EAAE,EAAG,QAAO;AACjC,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI;AACF,UAAM,OAAO,KAAK,UAAU,KAAK;AAIjC,WAAO,SAAS,SAAY,OAAO,KAAK,IAAI;AAAA,EAC9C,QAAQ;AAGN,WAAO,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EAC7C;AACF;AAGO,SAAS,sBAAsB,OAAwB;AAC5D,MAAI,OAAO,UAAU,SAAU,QAAO,GAAG,OAAO,KAAK,IAAI,cAAc,KAAK,CAAC;AAC7E,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO,OAAO,KAAK;AAChD,MAAI,CAAC,OAAO,UAAU,KAAK,EAAG,QAAO,uBAAuB,KAAK;AACjE,SAAO,qBAAqB,KAAK;AACnC;AAaO,SAAS,WACd,KACA,KACA,aACoB;AACpB,QAAM,QAAQ,IAAI,GAAG;AACrB,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,GAAG,WAAW,cAAc,GAAG,4CAA4C,sBAAsB,KAAK,CAAC;AAAA,IACzG;AAAA,EACF;AACA,SAAO;AACT;AASO,SAAS,iBACd,KACA,WACA,KACA,aACoB;AACpB,QAAM,SAAS,IAAI,SAAS;AAC5B,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR,GAAG,WAAW,cAAc,SAAS,+BAA+B,OAAO,MAAM;AAAA,IACnF;AAAA,EACF;AACA,SAAO,WAAW,QAAQ,KAAK,WAAW;AAC5C;;;ACrHA,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaD,SAAS,iBAAiB,KAA8B,KAAiC;AACvF,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,QAAQ,UAAa,QAAQ,KAAM,QAAO;AAC9C,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI;AAAA,MACR,aAAa,GAAG,8BAA8B,OAAO,GAAG,IAAI,cAAc,GAAG,CAAC;AAAA,IAChF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAkD;AACtF,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,kBAAkB,gCAAgC,OAAO,KAAK,GAAG;AAAA,EAC7E;AAEA,QAAM,cAAc,iBAAiB,OAAO,aAAa;AACzD,QAAM,eAAe,iBAAiB,OAAO,cAAc;AAC3D,MAAI,gBAAgB,UAAa,iBAAiB,QAAW;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,oBAAoB,iBAAiB,OAAO,mBAAmB;AACrE,QAAM,mBAAmB,iBAAiB,OAAO,kBAAkB;AACnE,QAAM,kBAAkB,iBAAiB,OAAO,iBAAiB;AAEjE,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAI,sBAAsB,SAAY,EAAE,kBAAkB,IAAI,CAAC;AAAA,IAC/D,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,IAC7D,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,WAA2B,CAAC;AAClC,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAI,CAAC,aAAa,IAAI,GAAG,EAAG,UAAS,KAAK,6BAA6B,GAAG,CAAC;AAAA,EAC7E;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;;;ACxDO,SAAS,oBAAoB,YAA6B,IAAkC;AACjG,QAAM,SAAS,oBAAoB,WAAW,WAAW,CAAC,GAAG,IAAI;AAAA,IAC/D,aAAa,WAAW;AAAA,IACxB,UAAU,WAAW;AAAA,EACvB,CAAC;AACD,MAAI,WAAW,QAAW;AACxB,UAAM,UAAU,cAAc,OAAO,GAAG,YAAY,IAAI;AACxD,UAAM,IAAI,qBAAqB,WAAW,aAAa,WAAW,UAAU,OAAO;AAAA,EACrF;AACA,SAAO;AACT;;;ACtBO,SAASC,cAAa,OAAe,UAA+B,CAAC,GAAkB;AAC5F,QAAM,WAAW,QAAQ,YAAY;AACrC,SAAO,aAAuB,OAAO,UAAU;AAAA,IAC7C,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;;;AC+BA,SAAS,6BAA6B,OAAe,OAAqB;AACxE,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AACzE,UAAM,IAAI,uBAAuB,OAAO,KAAK;AAAA,EAC/C;AACF;AAEA,SAAS,cAAc,OAAuB;AAC5C,+BAA6B,eAAe,MAAM,WAAW;AAC7D,+BAA6B,gBAAgB,MAAM,YAAY;AAC/D,MAAI,MAAM,sBAAsB,QAAW;AACzC,iCAA6B,qBAAqB,MAAM,iBAAiB;AAAA,EAC3E;AACA,MAAI,MAAM,qBAAqB,QAAW;AACxC,iCAA6B,oBAAoB,MAAM,gBAAgB;AAAA,EACzE;AACA,MAAI,MAAM,oBAAoB,QAAW;AACvC,iCAA6B,mBAAmB,MAAM,eAAe;AAAA,EACvE;AACF;AAOA,SAAS,cAAc,QAAgB,MAA8B;AACnE,QAAM,QAAQ,aAAa,QAAQ,IAAI;AACvC,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA,MAAM,YAAY,IAAI;AAAA,MACtB,SAAS,gBAAgB,KAAK;AAAA,MAC9B,cAAc,YAAY,KAAK;AAAA,IACjC;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,cAAc,SAAuB,UAAwB,CAAC,GAAkB;AAC9F,QAAM,WAAW,QAAQ,YAAY;AASrC,QAAM,WAAW,QAAQ,YAAY,QAAQ;AAC7C,QAAM,WAAWC,cAAa,QAAQ,OAAO;AAAA,IAC3C;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC;AACD,QAAM,aAA8B,SAAS;AAE7C,QAAM,KAAK,QAAQ,MAAM,oBAAI,KAAK;AAClC,QAAM,SAAwB,oBAAoB,YAAY,EAAE;AAEhE,QAAM,EAAE,OAAO,UAAU,cAAc,IAAI,sBAAsB,QAAQ,KAAK;AAC9E,gBAAc,KAAK;AAEnB,QAAM,WAA2B,CAAC,GAAG,aAAa;AAElD,MAAI;AACJ,MAAI,QAAQ,SAAS,SAAS;AAC5B,QAAI,OAAO,oBAAoB,QAAW;AACxC,oBAAc,iBAAiB,OAAO,iBAAiB,iBAAiB;AAAA,IAC1E,OAAO;AACL,eAAS,KAAK,+BAA+B,WAAW,aAAa,WAAW,QAAQ,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,WAAS,cAAc,SAAiB,OAA4B;AAClE,UAAM,OAAO,iBAAiB,SAAS,KAAK;AAC5C,WAAO,gBAAgB,SAAY,OAAO,cAAc,MAAM,WAAW;AAAA,EAC3E;AAEA,QAAM,oBAAoB,MAAM,qBAAqB;AACrD,QAAM,mBAAmB,MAAM,oBAAoB;AACnD,QAAM,mBAAmB,oBAAoB;AAC7C,MAAI,sBAAsB,MAAM,cAAc;AAC9C,MAAI,sBAAsB,GAAG;AAC3B,aAAS,KAAK,0BAA0B,MAAM,aAAa,gBAAgB,CAAC;AAC5E,0BAAsB;AAAA,EACxB;AAEA,QAAM,kBAAkB,MAAM,mBAAmB;AACjD,MAAI,uBAAuB,MAAM,eAAe;AAChD,MAAI,uBAAuB,GAAG;AAC5B,aAAS,KAAK,8BAA8B,MAAM,cAAc,eAAe,CAAC;AAChF,2BAAuB;AAAA,EACzB;AAEA,QAAM,YAAY,cAAc,OAAO,OAAO,OAAO;AACrD,QAAM,aAAa,cAAc,OAAO,QAAQ,QAAQ;AACxD,QAAM,YAAY,cAAc,qBAAqB,SAAS;AAC9D,QAAM,aAAa,cAAc,sBAAsB,UAAU;AAEjE,QAAM,cAA6B,CAAC,UAAU,OAAO,WAAW,KAAK;AAErE,MAAI;AACJ,MAAI,MAAM,sBAAsB,QAAW;AACzC,QAAI;AACJ,QAAI,OAAO,gBAAgB,QAAW;AACpC,aAAO,cAAc,OAAO,aAAa,aAAa;AAAA,IACxD,OAAO;AACL,aAAO;AACP,UAAI,oBAAoB,GAAG;AACzB,iBAAS,KAAK,gCAAgC,WAAW,aAAa,WAAW,QAAQ,CAAC;AAAA,MAC5F;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,mBAAmB,IAAI;AACnD,sBAAkB,MAAM;AACxB,gBAAY,KAAK,MAAM,KAAK;AAAA,EAC9B;AAEA,MAAI;AACJ,MAAI,MAAM,qBAAqB,QAAW;AACxC,QAAI;AACJ,QAAI,OAAO,eAAe,QAAW;AACnC,aAAO,cAAc,OAAO,YAAY,YAAY;AAAA,IACtD,OAAO;AACL,aAAO;AACP,UAAI,mBAAmB,GAAG;AACxB,iBAAS,KAAK,+BAA+B,WAAW,aAAa,WAAW,QAAQ,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,kBAAkB,IAAI;AAClD,qBAAiB,MAAM;AACvB,gBAAY,KAAK,MAAM,KAAK;AAAA,EAC9B;AAEA,MAAI;AACJ,MAAI,MAAM,oBAAoB,QAAW;AACvC,QAAI;AACJ,QAAI,OAAO,cAAc,QAAW;AAClC,aAAO,cAAc,OAAO,WAAW,WAAW;AAAA,IACpD,OAAO;AACL,aAAO;AACP,UAAI,kBAAkB,GAAG;AACvB,iBAAS,KAAK,+BAA+B,WAAW,aAAa,WAAW,QAAQ,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,iBAAiB,IAAI;AACjD,oBAAgB,MAAM;AACtB,gBAAY,KAAK,MAAM,KAAK;AAAA,EAC9B;AAEA,MAAI,OAAO,iBAAiB,MAAM;AAChC,aAAS,KAAK,0BAA0B,WAAW,aAAa,WAAW,QAAQ,CAAC;AAAA,EACtF;AAEA,QAAM,QAAQ,SAAS,WAAW;AAClC,QAAM,gBAAgB,YAAY,KAAK;AACvC,QAAM,WAAW,gBAAgB,KAAK;AAEtC,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,gBAAgB,WAAW;AAAA,IAC3B,UAAU,WAAW;AAAA,IACrB,WAAW,SAAS;AAAA,IACpB,GAAI,SAAS,sBAAsB,SAC/B,EAAE,mBAAmB,SAAS,kBAAkB,IAChD,CAAC;AAAA,IACL,UAAU;AAAA,IACV,OAAO,UAAU;AAAA,IACjB,QAAQ,WAAW;AAAA,IACnB,GAAI,oBAAoB,SAAY,EAAE,aAAa,gBAAgB,IAAI,CAAC;AAAA,IACxE,GAAI,mBAAmB,SAAY,EAAE,YAAY,eAAe,IAAI,CAAC;AAAA,IACrE,GAAI,kBAAkB,SAAY,EAAE,WAAW,cAAc,IAAI,CAAC;AAAA,IAClE;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,sBAAsB,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;;;ACjNO,SAAS,sBAAsB,WAAmC,CAAC,GAAoB;AAC5F,SAAO;AAAA,IACL,cAAc,SAAuB,UAAwB,CAAC,GAAkB;AAC9E,aAAO,cAAc,SAAS;AAAA,QAC5B,WAAW,QAAQ,aAAa,SAAS;AAAA,QACzC,UAAU,QAAQ,YAAY,SAAS;AAAA,QACvC,UAAU,QAAQ,YAAY,SAAS;AAAA,QACvC,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IACA,aAAa,OAAe,UAA+B,CAAC,GAAkB;AAC5E,aAAOC,cAAa,OAAO;AAAA,QACzB,WAAW,QAAQ,aAAa,SAAS;AAAA,QACzC,UAAU,QAAQ,YAAY,SAAS;AAAA,QACvC,UAAU,QAAQ,YAAY,SAAS;AAAA,QACvC,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACrBO,SAAS,oBAAoB,OAA0C;AAC5E,QAAM,gBAAgB,MAAM,iBAAiB;AAC7C,QAAM,SAAwB;AAAA,IAC5B;AAAA,IACA,GAAI,MAAM,gBAAgB,SAAY,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,IAC5E,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,GAAI,MAAM,gBAAgB,SAAY,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,IAC5E,GAAI,MAAM,eAAe,SAAY,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,IACzE,GAAI,MAAM,cAAc,SAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IACtE,GAAI,MAAM,oBAAoB,SAAY,EAAE,iBAAiB,MAAM,gBAAgB,IAAI,CAAC;AAAA,IACxF,WAAW,MAAM,aAAa;AAAA,IAC9B,YAAY,MAAM,cAAc;AAAA,IAChC,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,aAAa,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMnB,UAAW,MAAM,YAAY;AAAA,IAC7B,SAAS,MAAM,WAAW,CAAC;AAAA,IAC3B,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,IAC7D,GAAI,MAAM,kBAAkB,SAAY,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,IAClF,SAAS,CAAC,MAAM;AAAA,EAClB;AACF;;;AC7BA,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,qBAAqB,OAAuC;AAC1E,QAAM,MAAM,kBAAkB,OAAO,sBAAsB;AAC3D,QAAM,cAAc;AAEpB,QAAM,cACJ,WAAW,KAAK,iBAAiB,WAAW,KAAK,WAAW,KAAK,gBAAgB,WAAW;AAC9F,QAAM,eACJ,WAAW,KAAK,qBAAqB,WAAW,KAChD,WAAW,KAAK,iBAAiB,WAAW;AAC9C,MAAI,gBAAgB,UAAa,iBAAiB,QAAW;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBACJ,iBAAiB,KAAK,yBAAyB,iBAAiB,WAAW,KAC3E,iBAAiB,KAAK,wBAAwB,iBAAiB,WAAW;AAC5E,QAAM,kBACJ,iBAAiB,KAAK,6BAA6B,oBAAoB,WAAW,KAClF,iBAAiB,KAAK,yBAAyB,oBAAoB,WAAW;AAEhF,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAI,sBAAsB,SAAY,EAAE,kBAAkB,IAAI,CAAC;AAAA,IAC/D,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,WAA2B,CAAC;AAClC,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,gBAAgB,IAAI,GAAG,EAAG,UAAS,KAAK,6BAA6B,GAAG,CAAC;AAAA,EAChF;AACA,aAAW,aAAa;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,UAAM,UAAU,IAAI,SAAS;AAC7B,QAAI,CAAC,cAAc,OAAO,EAAG;AAC7B,eAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,UAAI,CAAC,oBAAoB,IAAI,GAAG;AAC9B,iBAAS,KAAK,6BAA6B,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;;;ACjEA,IAAMC,mBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,8BAA8B,oBAAI,IAAI;AAAA,EAC1C;AAAA,EACA;AACF,CAAC;AAEM,SAAS,wBAAwB,OAAuC;AAC7E,QAAM,MAAM,kBAAkB,OAAO,yBAAyB;AAC9D,QAAM,cAAc;AAEpB,QAAM,kBAAkB,WAAW,KAAK,gBAAgB,WAAW;AACnE,QAAM,eAAe,WAAW,KAAK,iBAAiB,WAAW;AACjE,MAAI,oBAAoB,UAAa,iBAAiB,QAAW;AAC/D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,WAAW,KAAK,2BAA2B,WAAW;AA8BhF,MAAI,mBAAmB,WAAW,KAAK,+BAA+B,WAAW;AACjF,QAAM,WAA2B,CAAC;AAKlC,MAAI,IAAI,mBAAmB,UAAa,IAAI,mBAAmB,MAAM;AACnE,QAAI,CAAC,cAAc,IAAI,cAAc,GAAG;AACtC,YAAM,IAAI;AAAA,QACR,GAAG,WAAW,wDAAwD,OAAO,IAAI,cAAc;AAAA,MACjG;AAAA,IACF;AACA,UAAM,WAAW,IAAI;AACrB,QAAI,qBAAqB,QAAW;AAClC,YAAM,aAAa,WAAW,UAAU,6BAA6B,WAAW,KAAK;AACrF,YAAM,UAAU,WAAW,UAAU,6BAA6B,WAAW,KAAK;AAClF,UAAI,aAAa,KAAK,UAAU,EAAG,oBAAmB,aAAa;AAAA,IACrE;AACA,eAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAI,CAAC,4BAA4B,IAAI,GAAG,GAAG;AACzC,iBAAS,KAAK,6BAA6B,kBAAkB,GAAG,EAAE,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,mBAAmB,qBAAqB,MAAM,oBAAoB;AAEtF,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAI,sBAAsB,SAAY,EAAE,kBAAkB,IAAI,CAAC;AAAA,IAC/D,GAAI,qBAAqB,SAAY,EAAE,iBAAiB,IAAI,CAAC;AAAA,EAC/D;AAEA,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAACA,iBAAgB,IAAI,GAAG,EAAG,UAAS,KAAK,6BAA6B,GAAG,CAAC;AAAA,EAChF;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;;;AC9FA,IAAMC,mBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,qBAAqB,OAAuC;AAC1E,QAAM,MAAM,kBAAkB,OAAO,sBAAsB;AAC3D,QAAM,cAAc;AAEpB,QAAM,cAAc,WAAW,KAAK,oBAAoB,WAAW;AACnE,QAAM,uBAAuB,WAAW,KAAK,wBAAwB,WAAW;AAChF,MAAI,gBAAgB,UAAa,yBAAyB,QAAW;AACnE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,WAAW,KAAK,2BAA2B,WAAW;AAChF,QAAM,kBAAkB,WAAW,KAAK,sBAAsB,WAAW;AACzE,QAAM,eAAe,wBAAwB,mBAAmB;AAEhE,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAI,sBAAsB,SAAY,EAAE,kBAAkB,IAAI,CAAC;AAAA,IAC/D,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,WAA2B,CAAC;AAClC,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAACA,iBAAgB,IAAI,GAAG,EAAG,UAAS,KAAK,6BAA6B,GAAG,CAAC;AAAA,EAChF;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;;;AC3CA,IAAMC,mBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,+BAA+B,OAAuC;AACpF,QAAM,MAAM,kBAAkB,OAAO,gCAAgC;AACrE,QAAM,cAAc;AAEpB,QAAM,cAAc,WAAW,KAAK,iBAAiB,WAAW;AAChE,QAAM,eAAe,WAAW,KAAK,qBAAqB,WAAW;AACrE,MAAI,gBAAgB,UAAa,iBAAiB,QAAW;AAC3D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBACJ,iBAAiB,KAAK,yBAAyB,iBAAiB,WAAW,KAC3E,WAAW,KAAK,iBAAiB,WAAW,KAC5C,WAAW,KAAK,2BAA2B,WAAW;AACxD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,GAAI,sBAAsB,SAAY,EAAE,kBAAkB,IAAI,CAAC;AAAA,IAC/D,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,EAC7D;AAEA,QAAM,WAA2B,CAAC;AAClC,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAACA,iBAAgB,IAAI,GAAG,EAAG,UAAS,KAAK,6BAA6B,GAAG,CAAC;AAAA,EAChF;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;","names":["resolveModel","resolveModel","resolveModel","resolveModel","KNOWN_TOP_LEVEL","KNOWN_TOP_LEVEL","KNOWN_TOP_LEVEL"]}