UNPKG

ai-gateway-provider

Version:

AI Gateway Provider for AI-SDK

1 lines 16.8 kB
{"version":3,"sources":["../src/providers.ts","../src/index.ts"],"sourcesContent":["export const providers = [\n\t{\n\t\tregex: /^https:\\/\\/api\\.openai\\.com\\//,\n\t\tname: \"openai\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.openai\\.com\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.deepseek\\.com\\//,\n\t\tname: \"deepseek\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.deepseek\\.com\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.anthropic\\.com\\//,\n\t\tname: \"anthropic\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.anthropic\\.com\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/generativelanguage\\.googleapis\\.com\\//,\n\t\tname: \"google-ai-studio\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/generativelanguage\\.googleapis\\.com\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.x\\.ai\\//,\n\t\tname: \"grok\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.x\\.ai\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.mistral\\.ai\\//,\n\t\tname: \"mistral\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.mistral\\.ai\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.perplexity\\.ai\\//,\n\t\tname: \"perplexity-ai\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.perplexity\\.ai\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.replicate\\.com\\//,\n\t\tname: \"replicate\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.replicate\\.com\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/api\\.groq\\.com\\/openai\\/v1\\//,\n\t\tname: \"groq\",\n\t\ttransformEndpoint: (url: string) => url.replace(/^https:\\/\\/api\\.groq\\.com\\/openai\\/v1\\//, \"\"),\n\t},\n\t{\n\t\tregex: /^https:\\/\\/(?<resource>[^.]+)\\.openai\\.azure\\.com\\/openai\\/deployments\\/(?<deployment>[^/]+)\\/(?<rest>.*)$/,\n\t\tname: \"azure-openai\",\n\t\ttransformEndpoint: (url: string) => {\n\t\t\tconst match = url.match(/^https:\\/\\/(?<resource>[^.]+)\\.openai\\.azure\\.com\\/openai\\/deployments\\/(?<deployment>[^/]+)\\/(?<rest>.*)$/);\n\t\t\tif (!match || !match.groups) return url;\n\t\t\tconst { resource, deployment, rest } = match.groups;\n\t\t\tif (!resource || !deployment || !rest) {\n\t\t\t\tthrow new Error(\"Failed to parse Azure OpenAI endpoint URL.\");\n\t\t\t}\n\t\t\treturn `${resource}/${deployment}/${rest}`;\n\t\t},\n\t},\n];\n","import type { LanguageModelV1 } from \"@ai-sdk/provider\";\nimport type { FetchFunction } from \"@ai-sdk/provider-utils\";\nimport { providers } from \"./providers\";\n\nexport class AiGatewayInternalFetchError extends Error {}\n\nexport class AiGatewayDoesNotExist extends Error {}\n\nexport class AiGatewayUnauthorizedError extends Error {}\n\nasync function streamToObject(stream: ReadableStream) {\n\tconst response = new Response(stream);\n\treturn await response.json();\n}\n\n\ntype InternalLanguageModelV1 = LanguageModelV1 & { config?: { fetch?: FetchFunction | undefined } };\n\nexport class AiGatewayChatLanguageModel implements LanguageModelV1 {\n\treadonly specificationVersion = \"v1\";\n\treadonly defaultObjectGenerationMode = \"json\";\n\n\treadonly models: InternalLanguageModelV1[];\n\treadonly config: AiGatewaySettings;\n\n\tget modelId(): string {\n\t\tif (!this.models[0]) {\n\t\t\tthrow new Error(\"models cannot be empty array\");\n\t\t}\n\n\t\treturn this.models[0].modelId;\n\t}\n\n\tget provider(): string {\n\t\tif (!this.models[0]) {\n\t\t\tthrow new Error(\"models cannot be empty array\");\n\t\t}\n\n\t\treturn this.models[0].provider;\n\t}\n\n\tconstructor(models: LanguageModelV1[], config: AiGatewaySettings) {\n\t\tthis.models = models;\n\t\tthis.config = config;\n\t}\n\n\tasync processModelRequest<\n\t\tT extends LanguageModelV1[\"doStream\"] | LanguageModelV1[\"doGenerate\"],\n\t>(\n\t\toptions: Parameters<T>[0],\n\t\tmodelMethod: \"doStream\" | \"doGenerate\",\n\t): Promise<Awaited<ReturnType<T>>> {\n\t\tconst requests: { url: string; request: Request; modelProvider: string }[] = [];\n\n\t\t// Model configuration and request collection\n\t\tfor (const model of this.models) {\n\t\t\tif (!model.config || !Object.keys(model.config).includes(\"fetch\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Sorry, but provider \"${model.provider}\" is currently not supported, please open a issue in the github repo!`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tmodel.config.fetch = (url, request) => {\n\t\t\t\trequests.push({\n\t\t\t\t\turl: url as string,\n\t\t\t\t\trequest: request as Request,\n\t\t\t\t\tmodelProvider: model.provider,\n\t\t\t\t});\n\t\t\t\tthrow new AiGatewayInternalFetchError(\"Stopping provider execution...\");\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tawait model[modelMethod](options);\n\t\t\t} catch (e) {\n\t\t\t\tif (!(e instanceof AiGatewayInternalFetchError)) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process requests\n\t\tconst body = await Promise.all(\n\t\t\trequests.map(async (req) => {\n\t\t\t\tlet providerConfig = null;\n\t\t\t\tfor (const provider of providers) {\n\t\t\t\t\tif (provider.regex.test(req.url)) {\n\t\t\t\t\t\tproviderConfig = provider;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!providerConfig) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Sorry, but provider \"${req.modelProvider}\" is currently not supported, please open a issue in the github repo!`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!req.request.body) {\n\t\t\t\t\tthrow new Error(\"Ai Gateway provider received an unexpected empty body\");\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tprovider: providerConfig.name,\n\t\t\t\t\tendpoint: providerConfig.transformEndpoint(req.url),\n\t\t\t\t\theaders: req.request.headers,\n\t\t\t\t\tquery: await streamToObject(req.request.body),\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\t// Handle response\n\t\tconst headers = parseAiGatewayOptions(this.config.options ?? {});\n\t\tlet resp: Response;\n\n\t\tif (\"binding\" in this.config) {\n\t\t\tconst updatedBody = body.map((obj) => ({\n\t\t\t\t...obj,\n\t\t\t\theaders: {\n\t\t\t\t\t...(obj.headers ?? {}),\n\t\t\t\t\t...Object.fromEntries(headers.entries()),\n\t\t\t\t},\n\t\t\t}));\n\t\t\tresp = await this.config.binding.run(updatedBody);\n\t\t} else {\n\t\t\theaders.set(\"Content-Type\", \"application/json\");\n\t\t\theaders.set(\"cf-aig-authorization\", `Bearer ${this.config.apiKey}`);\n\t\t\tresp = await fetch(\n\t\t\t\t`https://gateway.ai.cloudflare.com/v1/${this.config.accountId}/${this.config.gateway}`,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: headers,\n\t\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Error handling\n\t\tif (resp.status === 400) {\n\t\t\tconst cloneResp = resp.clone();\n\t\t\tconst result: { success?: boolean; error?: { code: number; message: string }[] } =\n\t\t\t\tawait cloneResp.json();\n\t\t\tif (\n\t\t\t\tresult.success === false &&\n\t\t\t\tresult.error &&\n\t\t\t\tresult.error.length > 0 &&\n\t\t\t\tresult.error[0]?.code === 2001\n\t\t\t) {\n\t\t\t\tthrow new AiGatewayDoesNotExist(\"This AI gateway does not exist\");\n\t\t\t}\n\t\t} else if (resp.status === 401) {\n\t\t\tconst cloneResp = resp.clone();\n\t\t\tconst result: { success?: boolean; error?: { code: number; message: string }[] } =\n\t\t\t\tawait cloneResp.json();\n\t\t\tif (\n\t\t\t\tresult.success === false &&\n\t\t\t\tresult.error &&\n\t\t\t\tresult.error.length > 0 &&\n\t\t\t\tresult.error[0]?.code === 2009\n\t\t\t) {\n\t\t\t\tthrow new AiGatewayUnauthorizedError(\n\t\t\t\t\t\"Your AI Gateway has authentication active, but you didn't provide a valid apiKey\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst step = Number.parseInt(resp.headers.get(\"cf-aig-step\") ?? \"0\");\n\t\tif (!this.models[step]) {\n\t\t\tthrow new Error(\"Unexpected AI Gateway Error\");\n\t\t}\n\n\t\tthis.models[step].config = {\n\t\t\t...this.models[step].config,\n\t\t\tfetch: (url, req) => resp as unknown as Promise<Response>,\n\t\t};\n\n\t\treturn this.models[step][modelMethod](options) as Promise<Awaited<ReturnType<T>>>;\n\t}\n\n\tasync doStream(\n\t\toptions: Parameters<LanguageModelV1[\"doStream\"]>[0],\n\t): Promise<Awaited<ReturnType<LanguageModelV1[\"doStream\"]>>> {\n\t\treturn this.processModelRequest<LanguageModelV1[\"doStream\"]>(options, \"doStream\");\n\t}\n\n\tasync doGenerate(\n\t\toptions: Parameters<LanguageModelV1[\"doGenerate\"]>[0],\n\t): Promise<Awaited<ReturnType<LanguageModelV1[\"doGenerate\"]>>> {\n\t\treturn this.processModelRequest<LanguageModelV1[\"doGenerate\"]>(options, \"doGenerate\");\n\t}\n}\n\nexport interface AiGateway {\n\t(models: LanguageModelV1 | LanguageModelV1[]): LanguageModelV1;\n\n\tchat(models: LanguageModelV1 | LanguageModelV1[]): LanguageModelV1;\n}\n\nexport type AiGatewayReties = {\n\tmaxAttempts?: 1 | 2 | 3 | 4 | 5;\n\tretryDelayMs?: number;\n\tbackoff?: \"constant\" | \"linear\" | \"exponential\";\n};\nexport type AiGatewayOptions = {\n\tcacheKey?: string;\n\tcacheTtl?: number;\n\tskipCache?: boolean;\n\tmetadata?: Record<string, number | string | boolean | null | bigint>;\n\tcollectLog?: boolean;\n\teventId?: string;\n\trequestTimeoutMs?: number;\n\tretries?: AiGatewayReties;\n};\nexport type AiGatewayAPISettings = {\n\tgateway: string;\n\taccountId: string;\n\tapiKey?: string;\n\toptions?: AiGatewayOptions;\n};\nexport type AiGatewayBindingSettings = {\n\tbinding: {\n\t\trun(data: unknown): Promise<Response>;\n\t};\n\toptions?: AiGatewayOptions;\n};\nexport type AiGatewaySettings = AiGatewayAPISettings | AiGatewayBindingSettings;\n\nexport function createAiGateway(options: AiGatewaySettings): AiGateway {\n\tconst createChatModel = (models: LanguageModelV1 | LanguageModelV1[]) => {\n\t\treturn new AiGatewayChatLanguageModel(Array.isArray(models) ? models : [models], options);\n\t};\n\n\tconst provider = (models: LanguageModelV1 | LanguageModelV1[]) => createChatModel(models);\n\n\tprovider.chat = createChatModel;\n\n\treturn provider;\n}\n\nexport function parseAiGatewayOptions(options: AiGatewayOptions): Headers {\n\tconst headers = new Headers();\n\n\tif (options.skipCache === true) {\n\t\theaders.set(\"cf-skip-cache\", \"true\");\n\t}\n\n\tif (options.cacheTtl) {\n\t\theaders.set(\"cf-cache-ttl\", options.cacheTtl.toString());\n\t}\n\n\tif (options.metadata) {\n\t\theaders.set(\"cf-aig-metadata\", JSON.stringify(options.metadata));\n\t}\n\n\tif (options.cacheKey) {\n\t\theaders.set(\"cf-aig-cache-key\", options.cacheKey);\n\t}\n\n\tif (options.collectLog !== undefined) {\n\t\theaders.set(\"cf-aig-collect-log\", options.collectLog === true ? \"true\" : \"false\");\n\t}\n\n\tif (options.eventId !== undefined) {\n\t\theaders.set(\"cf-aig-event-id\", options.eventId);\n\t}\n\n\tif (options.requestTimeoutMs !== undefined) {\n\t\theaders.set(\"cf-aig-request-timeout\", options.requestTimeoutMs.toString());\n\t}\n\n\tif (options.retries !== undefined) {\n\t\tif (options.retries.maxAttempts !== undefined) {\n\t\t\theaders.set(\"cf-aig-max-attempts\", options.retries.maxAttempts.toString());\n\t\t}\n\t\tif (options.retries.retryDelayMs !== undefined) {\n\t\t\theaders.set(\"cf-aig-retry-delay\", options.retries.retryDelayMs.toString());\n\t\t}\n\t\tif (options.retries.backoff !== undefined) {\n\t\t\theaders.set(\"cf-aig-backoff\", options.retries.backoff);\n\t\t}\n\t}\n\n\treturn headers;\n}\n"],"mappings":";;;;;AAAO,IAAM,YAAY;AAAA,EACxB;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,iCAAiC,EAAE;AAAA,EACpF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,mCAAmC,EAAE;AAAA,EACtF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,oCAAoC,EAAE;AAAA,EACvF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,oDAAoD,EAAE;AAAA,EACvG;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,2BAA2B,EAAE;AAAA,EAC9E;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,iCAAiC,EAAE;AAAA,EACpF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,oCAAoC,EAAE;AAAA,EACvF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,oCAAoC,EAAE;AAAA,EACvF;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB,IAAI,QAAQ,2CAA2C,EAAE;AAAA,EAC9F;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,MAAM;AAAA,IACN,mBAAmB,CAAC,QAAgB;AACnC,YAAM,QAAQ,IAAI,MAAM,4GAA4G;AACpI,UAAI,CAAC,SAAS,CAAC,MAAM,OAAQ,QAAO;AACpC,YAAM,EAAE,UAAU,YAAY,KAAK,IAAI,MAAM;AAC7C,UAAI,CAAC,YAAY,CAAC,cAAc,CAAC,MAAM;AACtC,cAAM,IAAI,MAAM,4CAA4C;AAAA,MAC7D;AACA,aAAO,GAAG,QAAQ,IAAI,UAAU,IAAI,IAAI;AAAA,IACzC;AAAA,EACD;AACD;;;ACvDO,IAAM,8BAAN,cAA0C,MAAM;AAAC;AAEjD,IAAM,wBAAN,cAAoC,MAAM;AAAC;AAE3C,IAAM,6BAAN,cAAyC,MAAM;AAAC;AAEvD,eAAe,eAAe,QAAwB;AACrD,QAAM,WAAW,IAAI,SAAS,MAAM;AACpC,SAAO,MAAM,SAAS,KAAK;AAC5B;AAKO,IAAM,6BAAN,MAA4D;AAAA,EAuBlE,YAAY,QAA2B,QAA2B;AAtBlE,wBAAS,wBAAuB;AAChC,wBAAS,+BAA8B;AAEvC,wBAAS;AACT,wBAAS;AAmBR,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EACf;AAAA,EAnBA,IAAI,UAAkB;AACrB,QAAI,CAAC,KAAK,OAAO,CAAC,GAAG;AACpB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAC/C;AAEA,WAAO,KAAK,OAAO,CAAC,EAAE;AAAA,EACvB;AAAA,EAEA,IAAI,WAAmB;AACtB,QAAI,CAAC,KAAK,OAAO,CAAC,GAAG;AACpB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAC/C;AAEA,WAAO,KAAK,OAAO,CAAC,EAAE;AAAA,EACvB;AAAA,EAOA,MAAM,oBAGL,SACA,aACkC;AAClC,UAAM,WAAuE,CAAC;AAG9E,eAAW,SAAS,KAAK,QAAQ;AAChC,UAAI,CAAC,MAAM,UAAU,CAAC,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,OAAO,GAAG;AAClE,cAAM,IAAI;AAAA,UACT,wBAAwB,MAAM,QAAQ;AAAA,QACvC;AAAA,MACD;AAEA,YAAM,OAAO,QAAQ,CAAC,KAAK,YAAY;AACtC,iBAAS,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA,eAAe,MAAM;AAAA,QACtB,CAAC;AACD,cAAM,IAAI,4BAA4B,gCAAgC;AAAA,MACvE;AAEA,UAAI;AACH,cAAM,MAAM,WAAW,EAAE,OAAO;AAAA,MACjC,SAAS,GAAG;AACX,YAAI,EAAE,aAAa,8BAA8B;AAChD,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAGA,UAAM,OAAO,MAAM,QAAQ;AAAA,MAC1B,SAAS,IAAI,OAAO,QAAQ;AAC3B,YAAI,iBAAiB;AACrB,mBAAW,YAAY,WAAW;AACjC,cAAI,SAAS,MAAM,KAAK,IAAI,GAAG,GAAG;AACjC,6BAAiB;AAAA,UAClB;AAAA,QACD;AAEA,YAAI,CAAC,gBAAgB;AACpB,gBAAM,IAAI;AAAA,YACT,wBAAwB,IAAI,aAAa;AAAA,UAC1C;AAAA,QACD;AAEA,YAAI,CAAC,IAAI,QAAQ,MAAM;AACtB,gBAAM,IAAI,MAAM,uDAAuD;AAAA,QACxE;AAEA,eAAO;AAAA,UACN,UAAU,eAAe;AAAA,UACzB,UAAU,eAAe,kBAAkB,IAAI,GAAG;AAAA,UAClD,SAAS,IAAI,QAAQ;AAAA,UACrB,OAAO,MAAM,eAAe,IAAI,QAAQ,IAAI;AAAA,QAC7C;AAAA,MACD,CAAC;AAAA,IACF;AAGA,UAAM,UAAU,sBAAsB,KAAK,OAAO,WAAW,CAAC,CAAC;AAC/D,QAAI;AAEJ,QAAI,aAAa,KAAK,QAAQ;AAC7B,YAAM,cAAc,KAAK,IAAI,CAAC,SAAS;AAAA,QACtC,GAAG;AAAA,QACH,SAAS;AAAA,UACR,GAAI,IAAI,WAAW,CAAC;AAAA,UACpB,GAAG,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAAA,QACxC;AAAA,MACD,EAAE;AACF,aAAO,MAAM,KAAK,OAAO,QAAQ,IAAI,WAAW;AAAA,IACjD,OAAO;AACN,cAAQ,IAAI,gBAAgB,kBAAkB;AAC9C,cAAQ,IAAI,wBAAwB,UAAU,KAAK,OAAO,MAAM,EAAE;AAClE,aAAO,MAAM;AAAA,QACZ,wCAAwC,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,OAAO;AAAA,QACpF;AAAA,UACC,QAAQ;AAAA,UACR;AAAA,UACA,MAAM,KAAK,UAAU,IAAI;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAGA,QAAI,KAAK,WAAW,KAAK;AACxB,YAAM,YAAY,KAAK,MAAM;AAC7B,YAAM,SACL,MAAM,UAAU,KAAK;AACtB,UACC,OAAO,YAAY,SACnB,OAAO,SACP,OAAO,MAAM,SAAS,KACtB,OAAO,MAAM,CAAC,GAAG,SAAS,MACzB;AACD,cAAM,IAAI,sBAAsB,gCAAgC;AAAA,MACjE;AAAA,IACD,WAAW,KAAK,WAAW,KAAK;AAC/B,YAAM,YAAY,KAAK,MAAM;AAC7B,YAAM,SACL,MAAM,UAAU,KAAK;AACtB,UACC,OAAO,YAAY,SACnB,OAAO,SACP,OAAO,MAAM,SAAS,KACtB,OAAO,MAAM,CAAC,GAAG,SAAS,MACzB;AACD,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,UAAM,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,aAAa,KAAK,GAAG;AACnE,QAAI,CAAC,KAAK,OAAO,IAAI,GAAG;AACvB,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC9C;AAEA,SAAK,OAAO,IAAI,EAAE,SAAS;AAAA,MAC1B,GAAG,KAAK,OAAO,IAAI,EAAE;AAAA,MACrB,OAAO,CAAC,KAAK,QAAQ;AAAA,IACtB;AAEA,WAAO,KAAK,OAAO,IAAI,EAAE,WAAW,EAAE,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAM,SACL,SAC4D;AAC5D,WAAO,KAAK,oBAAiD,SAAS,UAAU;AAAA,EACjF;AAAA,EAEA,MAAM,WACL,SAC8D;AAC9D,WAAO,KAAK,oBAAmD,SAAS,YAAY;AAAA,EACrF;AACD;AAqCO,SAAS,gBAAgB,SAAuC;AACtE,QAAM,kBAAkB,CAAC,WAAgD;AACxE,WAAO,IAAI,2BAA2B,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,OAAO;AAAA,EACzF;AAEA,QAAM,WAAW,CAAC,WAAgD,gBAAgB,MAAM;AAExF,WAAS,OAAO;AAEhB,SAAO;AACR;AAEO,SAAS,sBAAsB,SAAoC;AACzE,QAAM,UAAU,IAAI,QAAQ;AAE5B,MAAI,QAAQ,cAAc,MAAM;AAC/B,YAAQ,IAAI,iBAAiB,MAAM;AAAA,EACpC;AAEA,MAAI,QAAQ,UAAU;AACrB,YAAQ,IAAI,gBAAgB,QAAQ,SAAS,SAAS,CAAC;AAAA,EACxD;AAEA,MAAI,QAAQ,UAAU;AACrB,YAAQ,IAAI,mBAAmB,KAAK,UAAU,QAAQ,QAAQ,CAAC;AAAA,EAChE;AAEA,MAAI,QAAQ,UAAU;AACrB,YAAQ,IAAI,oBAAoB,QAAQ,QAAQ;AAAA,EACjD;AAEA,MAAI,QAAQ,eAAe,QAAW;AACrC,YAAQ,IAAI,sBAAsB,QAAQ,eAAe,OAAO,SAAS,OAAO;AAAA,EACjF;AAEA,MAAI,QAAQ,YAAY,QAAW;AAClC,YAAQ,IAAI,mBAAmB,QAAQ,OAAO;AAAA,EAC/C;AAEA,MAAI,QAAQ,qBAAqB,QAAW;AAC3C,YAAQ,IAAI,0BAA0B,QAAQ,iBAAiB,SAAS,CAAC;AAAA,EAC1E;AAEA,MAAI,QAAQ,YAAY,QAAW;AAClC,QAAI,QAAQ,QAAQ,gBAAgB,QAAW;AAC9C,cAAQ,IAAI,uBAAuB,QAAQ,QAAQ,YAAY,SAAS,CAAC;AAAA,IAC1E;AACA,QAAI,QAAQ,QAAQ,iBAAiB,QAAW;AAC/C,cAAQ,IAAI,sBAAsB,QAAQ,QAAQ,aAAa,SAAS,CAAC;AAAA,IAC1E;AACA,QAAI,QAAQ,QAAQ,YAAY,QAAW;AAC1C,cAAQ,IAAI,kBAAkB,QAAQ,QAAQ,OAAO;AAAA,IACtD;AAAA,EACD;AAEA,SAAO;AACR;","names":[]}