@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.
- package/README.md +39 -32
- package/dist/{chunk-JRUSQTKB.js → chunk-3H5C5U22.js} +19 -11
- package/dist/chunk-3H5C5U22.js.map +1 -0
- package/dist/{chunk-AFZC2DH2.js → chunk-4JLNWASF.js} +59 -387
- package/dist/chunk-4JLNWASF.js.map +1 -0
- package/dist/{chunk-U23M3VYO.js → chunk-E76ZDPIW.js} +17 -7
- package/dist/chunk-E76ZDPIW.js.map +1 -0
- package/dist/chunk-NF355OFT.js +635 -0
- package/dist/chunk-NF355OFT.js.map +1 -0
- package/dist/chunk-UIBQ5AFS.js +778 -0
- package/dist/chunk-UIBQ5AFS.js.map +1 -0
- package/dist/{chunk-MF3VO3ER.js → chunk-YP3AADWD.js} +47 -40
- package/dist/chunk-YP3AADWD.js.map +1 -0
- package/dist/{foundation-models-embedding-model-strategy-2GUADNXT.js → foundation-models-embedding-model-strategy-SAVQFBF4.js} +8 -9
- package/dist/foundation-models-embedding-model-strategy-SAVQFBF4.js.map +1 -0
- package/dist/{foundation-models-language-model-strategy-5AYZ5KHA.js → foundation-models-language-model-strategy-ZDOWVYTA.js} +19 -22
- package/dist/foundation-models-language-model-strategy-ZDOWVYTA.js.map +1 -0
- package/dist/index.cjs +1317 -31652
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -32
- package/dist/index.d.ts +17 -32
- package/dist/index.js +48 -194
- package/dist/index.js.map +1 -1
- package/dist/{orchestration-embedding-model-strategy-F7WHDLX7.js → orchestration-embedding-model-strategy-GT27AFII.js} +7 -11
- package/dist/orchestration-embedding-model-strategy-GT27AFII.js.map +1 -0
- package/dist/{orchestration-language-model-strategy-Z72AFW62.js → orchestration-language-model-strategy-7QTPQHCC.js} +32 -27
- package/dist/orchestration-language-model-strategy-7QTPQHCC.js.map +1 -0
- package/package.json +16 -13
- package/dist/chunk-2KOXKYVT.js +0 -31083
- package/dist/chunk-2KOXKYVT.js.map +0 -1
- package/dist/chunk-643USI3B.js +0 -251
- package/dist/chunk-643USI3B.js.map +0 -1
- package/dist/chunk-AFZC2DH2.js.map +0 -1
- package/dist/chunk-JRUSQTKB.js.map +0 -1
- package/dist/chunk-MF3VO3ER.js.map +0 -1
- package/dist/chunk-U23M3VYO.js.map +0 -1
- package/dist/foundation-models-embedding-model-strategy-2GUADNXT.js.map +0 -1
- package/dist/foundation-models-language-model-strategy-5AYZ5KHA.js.map +0 -1
- package/dist/orchestration-embedding-model-strategy-F7WHDLX7.js.map +0 -1
- 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
|
-
|
|
108
|
-
|
|
109
|
-
console.error("
|
|
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:**
|
|
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** |
|
|
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
|
|
380
|
-
|
|
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
|
|
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: "
|
|
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;
|
|
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,
|
|
757
|
-
| `example-simple-chat-completion.ts` | Simple chat conversation | System messages, user prompts
|
|
758
|
-
| `example-chat-completion-tool.ts` | Tool calling with functions |
|
|
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:**
|
|
775
|
-
> [Environment Setup](./ENVIRONMENT_SETUP.md)
|
|
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
|
-
|
|
5
|
-
} from "./chunk-
|
|
4
|
+
mergeRequestConfig
|
|
5
|
+
} from "./chunk-4JLNWASF.js";
|
|
6
6
|
import {
|
|
7
7
|
VERSION,
|
|
8
8
|
convertToAISDKError,
|
|
9
|
-
deepMerge
|
|
10
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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-
|
|
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":[]}
|