@jerome-benoit/sap-ai-provider-v2 5.0.1 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +39 -32
  2. package/dist/{chunk-JRUSQTKB.js → chunk-3H5C5U22.js} +19 -11
  3. package/dist/chunk-3H5C5U22.js.map +1 -0
  4. package/dist/{chunk-AFZC2DH2.js → chunk-4JLNWASF.js} +59 -387
  5. package/dist/chunk-4JLNWASF.js.map +1 -0
  6. package/dist/{chunk-U23M3VYO.js → chunk-E76ZDPIW.js} +17 -7
  7. package/dist/chunk-E76ZDPIW.js.map +1 -0
  8. package/dist/chunk-NF355OFT.js +635 -0
  9. package/dist/chunk-NF355OFT.js.map +1 -0
  10. package/dist/chunk-UIBQ5AFS.js +778 -0
  11. package/dist/chunk-UIBQ5AFS.js.map +1 -0
  12. package/dist/{chunk-MF3VO3ER.js → chunk-YP3AADWD.js} +47 -40
  13. package/dist/chunk-YP3AADWD.js.map +1 -0
  14. package/dist/{foundation-models-embedding-model-strategy-2GUADNXT.js → foundation-models-embedding-model-strategy-SAVQFBF4.js} +8 -9
  15. package/dist/foundation-models-embedding-model-strategy-SAVQFBF4.js.map +1 -0
  16. package/dist/{foundation-models-language-model-strategy-5AYZ5KHA.js → foundation-models-language-model-strategy-ZDOWVYTA.js} +19 -22
  17. package/dist/foundation-models-language-model-strategy-ZDOWVYTA.js.map +1 -0
  18. package/dist/index.cjs +1317 -31652
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +17 -32
  21. package/dist/index.d.ts +17 -32
  22. package/dist/index.js +48 -194
  23. package/dist/index.js.map +1 -1
  24. package/dist/{orchestration-embedding-model-strategy-F7WHDLX7.js → orchestration-embedding-model-strategy-GT27AFII.js} +7 -11
  25. package/dist/orchestration-embedding-model-strategy-GT27AFII.js.map +1 -0
  26. package/dist/{orchestration-language-model-strategy-Z72AFW62.js → orchestration-language-model-strategy-7QTPQHCC.js} +32 -27
  27. package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +1 -0
  28. package/package.json +16 -13
  29. package/dist/chunk-2KOXKYVT.js +0 -31083
  30. package/dist/chunk-2KOXKYVT.js.map +0 -1
  31. package/dist/chunk-643USI3B.js +0 -251
  32. package/dist/chunk-643USI3B.js.map +0 -1
  33. package/dist/chunk-AFZC2DH2.js.map +0 -1
  34. package/dist/chunk-JRUSQTKB.js.map +0 -1
  35. package/dist/chunk-MF3VO3ER.js.map +0 -1
  36. package/dist/chunk-U23M3VYO.js.map +0 -1
  37. package/dist/foundation-models-embedding-model-strategy-2GUADNXT.js.map +0 -1
  38. package/dist/foundation-models-language-model-strategy-5AYZ5KHA.js.map +0 -1
  39. package/dist/orchestration-embedding-model-strategy-F7WHDLX7.js.map +0 -1
  40. package/dist/orchestration-language-model-strategy-Z72AFW62.js.map +0 -1
package/README.md CHANGED
@@ -104,16 +104,17 @@ try {
104
104
 
105
105
  console.log(result.text);
106
106
  } catch (error) {
107
- if (error instanceof APICallError) {
108
- console.error("SAP AI Core API error:", error.message);
109
- console.error("Status:", error.statusCode);
107
+ process.exitCode = 1;
108
+ if (APICallError.isInstance(error)) {
109
+ console.error("SAP AI Core API error:", error.statusCode, error.name);
110
110
  } else {
111
- console.error("Unexpected error:", error);
111
+ console.error("Unexpected error:", error instanceof Error ? error.name : "Unknown error");
112
112
  }
113
113
  }
114
114
  ```
115
115
 
116
- > **Note:** Requires `AICORE_SERVICE_KEY` environment variable. See
116
+ > **Note:** For local service-key setup, set `AICORE_SERVICE_KEY`. SAP BTP service
117
+ > bindings and custom destinations are alternatives. See
117
118
  > [Environment Setup](./ENVIRONMENT_SETUP.md) for configuration.
118
119
 
119
120
  ## Quick Reference
@@ -127,7 +128,7 @@ try {
127
128
  | **Streaming** | `streamText({ model: provider("gpt-4.1"), prompt })` | [Streaming](#streaming-responses) |
128
129
  | **Tool Calling** | `generateText({ tools: { myTool: tool({...}) } })` | [Tool Calling](#tool-calling) |
129
130
  | **Error Handling** | `if (APICallError.isInstance(error)) { /* handle error */ }` | [API Reference](./API_REFERENCE.md#error-handling--reference) |
130
- | **Choose Model** | See 80+ models (GPT, Claude, Gemini, Llama) | [Models](./API_REFERENCE.md#models) |
131
+ | **Choose Model** | Discover models available in your tenant | [Models](./API_REFERENCE.md#models) |
131
132
  | **Embeddings** | `embed({ model: provider.embedding("text-embedding-3-small") })` | [Embeddings](#embeddings) |
132
133
 
133
134
  ## Installation
@@ -140,11 +141,15 @@ The published package targets Node.js. Its ESM output uses Node
140
141
  The source-level Edge test suite does not establish deployability to pure Edge
141
142
  runtimes such as Cloudflare Workers; use a Node.js server runtime for deployment.
142
143
 
143
- | AI SDK | Install | Provider import |
144
- | ------ | -------------------------------------------------- | ----------------------------------- |
145
- | 7 | `npm install @jerome-benoit/sap-ai-provider ai@^7` | `@jerome-benoit/sap-ai-provider/v4` |
146
- | 6 | `npm install @jerome-benoit/sap-ai-provider ai@^6` | `@jerome-benoit/sap-ai-provider` |
147
- | 5 | `npm install @jerome-benoit/sap-ai-provider ai@^5` | `@jerome-benoit/sap-ai-provider/v2` |
144
+ | AI SDK | Install | Provider import |
145
+ | ------ | -------------------------------------------------- | ----------------------------------------------------------------------- |
146
+ | 7 | `npm install @jerome-benoit/sap-ai-provider ai@^7` | `@jerome-benoit/sap-ai-provider/v4` |
147
+ | 6 | `npm install @jerome-benoit/sap-ai-provider ai@^6` | `@jerome-benoit/sap-ai-provider` or `@jerome-benoit/sap-ai-provider/v3` |
148
+ | 5 | `npm install @jerome-benoit/sap-ai-provider ai@^5` | `@jerome-benoit/sap-ai-provider/v2` |
149
+
150
+ `/v3` is an explicit alias for the AI SDK 6 root entrypoint. Both resolve to
151
+ the same runtime modules and TypeScript declarations, including the same `sapai`
152
+ instance within each module format; existing root imports remain valid.
148
153
 
149
154
  The Quick Start and inline snippets on this page use AI SDK 6 with the root V3
150
155
  entrypoint. The runnable files in `examples/` use the repository's installed
@@ -375,11 +380,12 @@ try {
375
380
  // streamText returns a result object; its usage property is a promise.
376
381
  console.log("\n\nUsage:", await result.usage);
377
382
  } catch (error) {
383
+ process.exitCode = 1;
378
384
  if (APICallError.isInstance(error)) {
379
- console.error("API Error:", error.message);
380
- // See Error Handling section for complete error type reference
385
+ console.error("API error:", error.statusCode, error.name);
386
+ } else {
387
+ console.error("Streaming failed:", error instanceof Error ? error.name : "Unknown error");
381
388
  }
382
- throw error;
383
389
  }
384
390
  ```
385
391
 
@@ -507,7 +513,7 @@ const result = await generateText({
507
513
 
508
514
  ⚠️ **Model Limitations:** Some models have tool calling restrictions. See
509
515
  [API Reference - Model-Specific Tool Limitations](./API_REFERENCE.md#model-specific-tool-limitations)
510
- for the complete comparison table.
516
+ for upstream support documentation.
511
517
 
512
518
  ### Multi-modal Input (Images)
513
519
 
@@ -575,7 +581,7 @@ Ground LLM responses in your own documents using vector databases.
575
581
  const provider = createSAPAIProvider({
576
582
  defaultSettings: {
577
583
  grounding: buildDocumentGroundingConfig({
578
- filters: [{ id: "vector-store-1", data_repositories: ["*"] }],
584
+ filters: [{ id: "knowledge-filter", data_repositories: ["*"] }],
579
585
  placeholders: { input: ["groundingRequest"], output: "groundingOutput" },
580
586
  }),
581
587
  },
@@ -675,7 +681,8 @@ authentication, model parameters, data masking, content filtering, and more.
675
681
  - `deploymentId`: Specific deployment ID (auto-resolved if not set)
676
682
  - `requestConfig`: Custom HTTP request configuration (headers, params, timeout, etc.)
677
683
  forwarded to the underlying SAP AI SDK client on every call. Provider-level scope
678
- only; use `requestConfig.headers` for SAP-specific headers such as
684
+ only; per-call `headers` can override individual headers. Use `requestConfig.headers`
685
+ for SAP-specific headers such as
679
686
  `AI-Object-Store-Secret-Name` (feedback service). See
680
687
  [API Reference](./API_REFERENCE.md#sapaiprovidersettings) for portability caveats.
681
688
  - `modelParams`: Temperature, maxTokens, topP, and other generation parameters
@@ -751,19 +758,19 @@ repository's AI SDK 7 dependency and the local `../src/index-v4` entrypoint.
751
758
  In an AI SDK 7 application, import from `@jerome-benoit/sap-ai-provider/v4`.
752
759
  See [Installation](#installation) for other AI SDK versions.
753
760
 
754
- | Example | Description | Key Features |
755
- | ----------------------------------- | --------------------------- | --------------------------------------- |
756
- | `example-generate-text.ts` | Basic text generation | Simple prompts, synchronous generation |
757
- | `example-simple-chat-completion.ts` | Simple chat conversation | System messages, user prompts |
758
- | `example-chat-completion-tool.ts` | Tool calling with functions | Weather API tool, function execution |
759
- | `example-streaming-chat.ts` | Streaming responses | Real-time text generation, SSE |
760
- | `example-image-recognition.ts` | Multi-modal with images | Vision models, image analysis |
761
- | `example-data-masking.ts` | Data privacy integration | DPI masking, anonymization |
762
- | `example-content-filtering.ts` | Content filtering | Azure Content Safety, orchestration |
763
- | `example-document-grounding.ts` | Document grounding (RAG) | Vector store, retrieval-augmented gen |
764
- | `example-translation.ts` | Input/output translation | Multi-language support, SAP translation |
765
- | `example-embeddings.ts` | Text embeddings | Vector generation, semantic similarity |
766
- | `example-foundation-models.ts` | Foundation Models API | Direct model access, logprobs, seed |
761
+ | Example | Description | Key Features |
762
+ | ----------------------------------- | --------------------------- | ---------------------------------------- |
763
+ | `example-generate-text.ts` | Basic text generation | Simple prompts, non-streaming generation |
764
+ | `example-simple-chat-completion.ts` | Simple chat conversation | System messages, user prompts |
765
+ | `example-chat-completion-tool.ts` | Tool calling with functions | Demo weather tool, function execution |
766
+ | `example-streaming-chat.ts` | Streaming responses | Real-time text generation, SSE |
767
+ | `example-image-recognition.ts` | Multi-modal with images | Vision models, image analysis |
768
+ | `example-data-masking.ts` | Data privacy integration | DPI masking, anonymization |
769
+ | `example-content-filtering.ts` | Content filtering | Azure Content Safety, orchestration |
770
+ | `example-document-grounding.ts` | Document grounding (RAG) | Vector store, retrieval-augmented gen |
771
+ | `example-translation.ts` | Input/output translation | Multi-language support, SAP translation |
772
+ | `example-embeddings.ts` | Text embeddings | Vector generation, semantic similarity |
773
+ | `example-foundation-models.ts` | Foundation Models API | Direct model access, logprobs, seed |
767
774
 
768
775
  **Running Examples:**
769
776
 
@@ -771,8 +778,8 @@ See [Installation](#installation) for other AI SDK versions.
771
778
  npx tsx examples/example-generate-text.ts
772
779
  ```
773
780
 
774
- > **Note:** Examples require `AICORE_SERVICE_KEY` environment variable. See
775
- > [Environment Setup](./ENVIRONMENT_SETUP.md) for configuration.
781
+ > **Note:** Configure `AICORE_SERVICE_KEY` locally or bind the application to
782
+ > SAP AI Core on SAP BTP. See [Environment Setup](./ENVIRONMENT_SETUP.md).
776
783
 
777
784
  ## Migration Guides
778
785
 
@@ -1,13 +1,14 @@
1
1
  import {createRequire as __createRequire} from 'module';var require=__createRequire(import.meta.url);
2
2
  import {
3
3
  buildEmbeddingResult,
4
- prepareEmbeddingCall
5
- } from "./chunk-AFZC2DH2.js";
4
+ mergeRequestConfig
5
+ } from "./chunk-4JLNWASF.js";
6
6
  import {
7
7
  VERSION,
8
8
  convertToAISDKError,
9
- deepMerge
10
- } from "./chunk-2KOXKYVT.js";
9
+ deepMerge,
10
+ getProviderName
11
+ } from "./chunk-UIBQ5AFS.js";
11
12
 
12
13
  // src/base-embedding-model-strategy.ts
13
14
  import { TooManyEmbeddingValuesForCallError } from "@ai-sdk/provider";
@@ -24,10 +25,16 @@ var BaseEmbeddingModelStrategy = class {
24
25
  async doEmbed(config, settings, options, maxEmbeddingsPerCall) {
25
26
  const { abortSignal, values } = options;
26
27
  try {
27
- const { embeddingOptions, providerName } = await prepareEmbeddingCall(
28
- { maxEmbeddingsPerCall, modelId: config.modelId, provider: config.provider },
29
- options
30
- );
28
+ if (values.length > maxEmbeddingsPerCall) {
29
+ throw new TooManyEmbeddingValuesForCallError({
30
+ maxEmbeddingsPerCall,
31
+ modelId: config.modelId,
32
+ provider: config.provider,
33
+ values
34
+ });
35
+ }
36
+ const embeddingOptions = config.parsedProviderOptions;
37
+ const providerName = getProviderName(config.provider);
31
38
  const embeddingType = embeddingOptions?.type ?? settings.type ?? "text";
32
39
  const warnings = [];
33
40
  this.resolveWarnings(settings, warnings);
@@ -36,8 +43,7 @@ var BaseEmbeddingModelStrategy = class {
36
43
  client,
37
44
  values,
38
45
  embeddingType,
39
- abortSignal,
40
- config.requestConfig
46
+ mergeRequestConfig(config.requestConfig, abortSignal, options.headers)
41
47
  );
42
48
  const embeddings = this.extractEmbeddings(response);
43
49
  const totalTokens = this.extractTokenCount(response);
@@ -57,6 +63,8 @@ var BaseEmbeddingModelStrategy = class {
57
63
  throw error;
58
64
  }
59
65
  throw convertToAISDKError(error, {
66
+ modelId: config.modelId,
67
+ modelType: "embeddingModel",
60
68
  operation: "doEmbed",
61
69
  requestBody: { values: values.length },
62
70
  url: this.getUrl()
@@ -96,4 +104,4 @@ var BaseEmbeddingModelStrategy = class {
96
104
  export {
97
105
  BaseEmbeddingModelStrategy
98
106
  };
99
- //# sourceMappingURL=chunk-JRUSQTKB.js.map
107
+ //# sourceMappingURL=chunk-3H5C5U22.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/base-embedding-model-strategy.ts"],"sourcesContent":["/** Base class for embedding model strategies using the Template Method pattern. */\nimport type {\n EmbeddingModelV3CallOptions,\n EmbeddingModelV3Embedding,\n EmbeddingModelV3Result,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport type { CustomRequestConfig } from \"@sap-ai-sdk/core\";\n\nimport { TooManyEmbeddingValuesForCallError } from \"@ai-sdk/provider\";\n\nimport type { SAPAIEmbeddingSettings } from \"./sap-ai-settings.js\";\nimport type { EmbeddingModelAPIStrategy, EmbeddingModelStrategyConfig } from \"./sap-ai-strategy.js\";\n\nimport { deepMerge } from \"./deep-merge.js\";\nimport { convertToAISDKError } from \"./sap-ai-error.js\";\nimport { getProviderName } from \"./sap-ai-provider-options.js\";\nimport {\n buildEmbeddingResult,\n type EmbeddingProviderOptions,\n type EmbeddingType,\n mergeRequestConfig,\n type ResponseMetadata,\n} from \"./strategy-utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Abstract base class for embedding model strategies using the Template Method pattern.\n * @template TClient - The SDK client type (e.g., AzureOpenAiEmbeddingClient, OrchestrationEmbeddingClient).\n * @template TResponse - The API response type from the SDK client.\n * @internal\n */\nexport abstract class BaseEmbeddingModelStrategy<\n TClient,\n TResponse,\n> implements EmbeddingModelAPIStrategy {\n /**\n * Template method implementing the shared embedding algorithm.\n * @param config - Strategy configuration.\n * @param settings - Embedding model settings.\n * @param options - AI SDK call options.\n * @param maxEmbeddingsPerCall - Maximum embeddings per call.\n * @returns Complete embedding result for AI SDK.\n * @internal\n */\n async doEmbed(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n options: EmbeddingModelV3CallOptions,\n maxEmbeddingsPerCall: number,\n ): Promise<EmbeddingModelV3Result> {\n const { abortSignal, values } = options;\n\n try {\n if (values.length > maxEmbeddingsPerCall) {\n throw new TooManyEmbeddingValuesForCallError({\n maxEmbeddingsPerCall,\n modelId: config.modelId,\n provider: config.provider,\n values,\n });\n }\n const embeddingOptions = config.parsedProviderOptions;\n const providerName = getProviderName(config.provider);\n\n const embeddingType = embeddingOptions?.type ?? settings.type ?? \"text\";\n\n const warnings: SharedV3Warning[] = [];\n this.resolveWarnings(settings, warnings);\n\n const client = this.createClient(config, settings, embeddingOptions);\n\n const response = await this.executeCall(\n client,\n values,\n embeddingType,\n mergeRequestConfig(config.requestConfig, abortSignal, options.headers),\n );\n\n const embeddings = this.extractEmbeddings(response);\n const totalTokens = this.extractTokenCount(response);\n const { headers: responseHeaders, requestId } = this.extractResponseMetadata(response);\n\n return buildEmbeddingResult({\n embeddings,\n modelId: config.modelId,\n providerName,\n requestId,\n responseHeaders,\n totalTokens,\n version: VERSION,\n warnings,\n });\n } catch (error) {\n if (error instanceof TooManyEmbeddingValuesForCallError) {\n throw error;\n }\n throw convertToAISDKError(error, {\n modelId: config.modelId,\n modelType: \"embeddingModel\",\n operation: \"doEmbed\",\n requestBody: { values: values.length },\n url: this.getUrl(),\n });\n }\n }\n\n /**\n * Creates the appropriate SDK client for this API.\n * @param config - Strategy configuration.\n * @param settings - Embedding model settings.\n * @param embeddingOptions - Parsed provider options from the call.\n * @returns SDK client instance.\n * @internal\n */\n protected abstract createClient(\n config: EmbeddingModelStrategyConfig,\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): TClient;\n\n /**\n * Executes the embedding API call.\n * @param client - SDK client instance.\n * @param values - Input strings to embed.\n * @param embeddingType - Type of embedding (text, query, document).\n * @param requestConfig - Request configuration with merged headers and abort signal.\n * @returns SDK response containing embeddings.\n * @internal\n */\n protected abstract executeCall(\n client: TClient,\n values: string[],\n embeddingType: EmbeddingType,\n requestConfig: CustomRequestConfig | undefined,\n ): Promise<TResponse>;\n\n /**\n * Extracts embeddings from the SDK response.\n * @param response - SDK response containing embedding data.\n * @returns Array of normalized embedding vectors.\n * @internal\n */\n protected abstract extractEmbeddings(response: TResponse): EmbeddingModelV3Embedding[];\n\n /**\n * Extracts response metadata (request id and HTTP headers) from the SDK response.\n *\n * Default returns both fields as `undefined`; subclasses override to extract from the SDK response.\n * @param _response - SDK response.\n * @returns Combined `{ headers, requestId }` metadata.\n * @internal\n */\n protected extractResponseMetadata(_response: TResponse): ResponseMetadata {\n return { headers: undefined, requestId: undefined };\n }\n\n /**\n * Extracts total token count from the SDK response.\n * @param response - SDK response containing usage data.\n * @returns Total token count used for the embedding request.\n * @internal\n */\n protected abstract extractTokenCount(response: TResponse): number;\n\n /**\n * Returns the URL identifier for this API (used in error messages).\n * @returns URL string identifier.\n * @internal\n */\n protected abstract getUrl(): string;\n\n protected mergeModelParams(\n settings: SAPAIEmbeddingSettings,\n embeddingOptions: EmbeddingProviderOptions | undefined,\n ): Record<string, unknown> {\n return deepMerge(\n (settings.modelParams as Record<string, unknown> | undefined) ?? {},\n embeddingOptions?.modelParams ?? {},\n );\n }\n\n /**\n * Pushes API-specific deprecation or migration warnings into the shared\n * sink. Default no-op; subclasses override to surface settings-level\n * warnings (e.g. orchestration's masking_providers deprecation).\n * @param _settings - Embedding model settings.\n * @param _warnings - Shared warnings sink for the current call.\n * @internal\n */\n protected resolveWarnings(_settings: SAPAIEmbeddingSettings, _warnings: SharedV3Warning[]): void {\n return;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AASA,SAAS,0CAA0C;AAuB5C,IAAe,6BAAf,MAGgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUrC,MAAM,QACJ,QACA,UACA,SACA,sBACiC;AACjC,UAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,QAAI;AACF,UAAI,OAAO,SAAS,sBAAsB;AACxC,cAAM,IAAI,mCAAmC;AAAA,UAC3C;AAAA,UACA,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,mBAAmB,OAAO;AAChC,YAAM,eAAe,gBAAgB,OAAO,QAAQ;AAEpD,YAAM,gBAAgB,kBAAkB,QAAQ,SAAS,QAAQ;AAEjE,YAAM,WAA8B,CAAC;AACrC,WAAK,gBAAgB,UAAU,QAAQ;AAEvC,YAAM,SAAS,KAAK,aAAa,QAAQ,UAAU,gBAAgB;AAEnE,YAAM,WAAW,MAAM,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBAAmB,OAAO,eAAe,aAAa,QAAQ,OAAO;AAAA,MACvE;AAEA,YAAM,aAAa,KAAK,kBAAkB,QAAQ;AAClD,YAAM,cAAc,KAAK,kBAAkB,QAAQ;AACnD,YAAM,EAAE,SAAS,iBAAiB,UAAU,IAAI,KAAK,wBAAwB,QAAQ;AAErF,aAAO,qBAAqB;AAAA,QAC1B;AAAA,QACA,SAAS,OAAO;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,oCAAoC;AACvD,cAAM;AAAA,MACR;AACA,YAAM,oBAAoB,OAAO;AAAA,QAC/B,SAAS,OAAO;AAAA,QAChB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa,EAAE,QAAQ,OAAO,OAAO;AAAA,QACrC,KAAK,KAAK,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDU,wBAAwB,WAAwC;AACxE,WAAO,EAAE,SAAS,QAAW,WAAW,OAAU;AAAA,EACpD;AAAA,EAiBU,iBACR,UACA,kBACyB;AACzB,WAAO;AAAA,MACJ,SAAS,eAAuD,CAAC;AAAA,MAClE,kBAAkB,eAAe,CAAC;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,gBAAgB,WAAmC,WAAoC;AAC/F;AAAA,EACF;AACF;","names":[]}