@inferrlm/react-native-mlx 0.4.0 → 0.4.2-alpha.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.
- package/MLXReactNative.podspec +1 -1
- package/ios/Sources/HybridLLM.swift +44 -0
- package/lib/module/index.js +9 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/llm.js +193 -0
- package/lib/module/llm.js.map +1 -0
- package/lib/module/modelManager.js +79 -0
- package/lib/module/modelManager.js.map +1 -0
- package/lib/module/models.js +360 -0
- package/lib/module/models.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/specs/LLM.nitro.js +4 -0
- package/lib/module/specs/LLM.nitro.js.map +1 -0
- package/lib/module/specs/ModelManager.nitro.js +4 -0
- package/lib/module/specs/ModelManager.nitro.js.map +1 -0
- package/lib/module/specs/STT.nitro.js +4 -0
- package/lib/module/specs/STT.nitro.js.map +1 -0
- package/lib/module/specs/TTS.nitro.js +4 -0
- package/lib/module/specs/TTS.nitro.js.map +1 -0
- package/lib/module/stt.js +49 -0
- package/lib/module/stt.js.map +1 -0
- package/lib/module/tool-utils.js +56 -0
- package/lib/module/tool-utils.js.map +1 -0
- package/lib/module/tts.js +40 -0
- package/lib/module/tts.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/index.d.ts +11 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/llm.d.ts +129 -0
- package/lib/typescript/src/llm.d.ts.map +1 -0
- package/lib/typescript/src/modelManager.d.ts +53 -0
- package/lib/typescript/src/modelManager.d.ts.map +1 -0
- package/lib/typescript/src/models.d.ts +67 -0
- package/lib/typescript/src/models.d.ts.map +1 -0
- package/lib/typescript/src/specs/LLM.nitro.d.ts +160 -0
- package/lib/typescript/src/specs/LLM.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/ModelManager.nitro.d.ts +41 -0
- package/lib/typescript/src/specs/ModelManager.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/STT.nitro.d.ts +28 -0
- package/lib/typescript/src/specs/STT.nitro.d.ts.map +1 -0
- package/lib/typescript/src/specs/TTS.nitro.d.ts +22 -0
- package/lib/typescript/src/specs/TTS.nitro.d.ts.map +1 -0
- package/lib/typescript/src/stt.d.ts +16 -0
- package/lib/typescript/src/stt.d.ts.map +1 -0
- package/lib/typescript/src/tool-utils.d.ts +13 -0
- package/lib/typescript/src/tool-utils.d.ts.map +1 -0
- package/lib/typescript/src/tts.d.ts +13 -0
- package/lib/typescript/src/tts.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/models.ts +24 -0
package/MLXReactNative.podspec
CHANGED
|
@@ -24,7 +24,7 @@ Pod::Spec.new do |s|
|
|
|
24
24
|
|
|
25
25
|
spm_dependency(s,
|
|
26
26
|
url: "https://github.com/ml-explore/mlx-swift-lm.git",
|
|
27
|
-
requirement: {kind: "
|
|
27
|
+
requirement: {kind: "branch", branch: "main"},
|
|
28
28
|
products: ["MLXLLM", "MLXLMCommon"]
|
|
29
29
|
)
|
|
30
30
|
|
|
@@ -66,6 +66,34 @@ class HybridLLM: HybridLLMSpec {
|
|
|
66
66
|
allocatedMB, cacheMB, peakMB)
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
private func parseEosTokenIds(from modelDir: URL) -> Set<Int> {
|
|
70
|
+
let configURL = modelDir.appendingPathComponent("config.json")
|
|
71
|
+
guard let data = try? Data(contentsOf: configURL),
|
|
72
|
+
let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
|
|
73
|
+
else { return [] }
|
|
74
|
+
|
|
75
|
+
if let ids = extractEosIds(from: json) {
|
|
76
|
+
return ids
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if let textConfig = json["text_config"] as? [String: Any],
|
|
80
|
+
let ids = extractEosIds(from: textConfig) {
|
|
81
|
+
return ids
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return []
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private func extractEosIds(from dict: [String: Any]) -> Set<Int>? {
|
|
88
|
+
if let id = dict["eos_token_id"] as? Int {
|
|
89
|
+
return [id]
|
|
90
|
+
}
|
|
91
|
+
if let ids = dict["eos_token_id"] as? [Int], !ids.isEmpty {
|
|
92
|
+
return Set(ids)
|
|
93
|
+
}
|
|
94
|
+
return nil
|
|
95
|
+
}
|
|
96
|
+
|
|
69
97
|
private func buildToolSchema(from tool: ToolDefinition) -> ToolSpec {
|
|
70
98
|
var properties: [String: [String: Any]] = [:]
|
|
71
99
|
var required: [String] = []
|
|
@@ -125,6 +153,22 @@ class HybridLLM: HybridLLMSpec {
|
|
|
125
153
|
|
|
126
154
|
try Task.checkCancellation()
|
|
127
155
|
|
|
156
|
+
/*
|
|
157
|
+
mlx-swift-lm only reads top-level eos_token_id from config.json.
|
|
158
|
+
Models like Qwen3.5 nest it inside text_config, leaving the stop
|
|
159
|
+
set empty. Parse it ourselves and patch the container.
|
|
160
|
+
*/
|
|
161
|
+
let containerEos = await loadedContainer.configuration.eosTokenIds
|
|
162
|
+
if containerEos.isEmpty {
|
|
163
|
+
let parsed = self.parseEosTokenIds(from: modelDir)
|
|
164
|
+
if !parsed.isEmpty {
|
|
165
|
+
log("Patching eosTokenIds from config: \(parsed)")
|
|
166
|
+
await loadedContainer.update { ctx in
|
|
167
|
+
ctx.configuration.eosTokenIds = parsed
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
128
172
|
let memoryAfterContainer = self.getMemoryUsage()
|
|
129
173
|
let gpuAfterContainer = self.getGPUMemoryUsage()
|
|
130
174
|
log("Model loaded - Host: \(memoryAfterContainer), GPU: \(gpuAfterContainer)")
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export { LLM } from "./llm.js";
|
|
4
|
+
export { ModelManager } from "./modelManager.js";
|
|
5
|
+
export { MLXModel, MLXModels, ModelFamily, ModelProvider } from "./models.js";
|
|
6
|
+
export { createTool } from "./tool-utils.js";
|
|
7
|
+
export { TTS } from "./tts.js";
|
|
8
|
+
export { STT } from "./stt.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["LLM","ModelManager","MLXModel","MLXModels","ModelFamily","ModelProvider","createTool","TTS","STT"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SACEA,GAAG,QAKE,UAAO;AACd,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SACEC,QAAQ,EACRC,SAAS,EACTC,WAAW,EAEXC,aAAa,QAGR,aAAU;AAqBjB,SAASC,UAAU,QAAqC,iBAAc;AACtE,SAASC,GAAG,QAAQ,UAAO;AAM3B,SAASC,GAAG,QAAQ,UAAO","ignoreList":[]}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
4
|
+
let instance = null;
|
|
5
|
+
function getInstance() {
|
|
6
|
+
if (!instance) {
|
|
7
|
+
instance = NitroModules.createHybridObject('LLM');
|
|
8
|
+
}
|
|
9
|
+
return instance;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* LLM text generation using MLX on Apple Silicon.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { LLM } from 'react-native-nitro-mlx'
|
|
18
|
+
*
|
|
19
|
+
* // Load a model
|
|
20
|
+
* await LLM.load('mlx-community/Qwen3-0.6B-4bit', progress => {
|
|
21
|
+
* console.log(`Loading: ${(progress * 100).toFixed(0)}%`)
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* // Stream a response
|
|
25
|
+
* await LLM.stream('Hello!', token => {
|
|
26
|
+
* process.stdout.write(token)
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* // Get generation stats
|
|
30
|
+
* const stats = LLM.getLastGenerationStats()
|
|
31
|
+
* console.log(`${stats.tokensPerSecond} tokens/sec`)
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export const LLM = {
|
|
35
|
+
/**
|
|
36
|
+
* Load a model into memory. Downloads the model from HuggingFace if not already cached.
|
|
37
|
+
* @param modelId - HuggingFace model ID (e.g., 'mlx-community/Qwen3-0.6B-4bit')
|
|
38
|
+
* @param options - Callback invoked with loading progress (0-1)
|
|
39
|
+
*/
|
|
40
|
+
load(modelId, options) {
|
|
41
|
+
return getInstance().load(modelId, options);
|
|
42
|
+
},
|
|
43
|
+
/**
|
|
44
|
+
* Generate a complete response for a prompt. Blocks until generation is complete.
|
|
45
|
+
* For streaming responses, use `stream()` instead.
|
|
46
|
+
* @param prompt - The input text to generate a response for
|
|
47
|
+
* @returns The complete generated text
|
|
48
|
+
*/
|
|
49
|
+
generate(prompt) {
|
|
50
|
+
return getInstance().generate(prompt);
|
|
51
|
+
},
|
|
52
|
+
/**
|
|
53
|
+
* Stream a response token by token with optional tool calling support.
|
|
54
|
+
* Tools must be provided when loading the model via `load()` options.
|
|
55
|
+
* Tools are automatically executed when the model calls them.
|
|
56
|
+
* @param prompt - The input text to generate a response for
|
|
57
|
+
* @param onToken - Callback invoked for each generated token
|
|
58
|
+
* @param onToolCall - Optional callback invoked when a tool is called.
|
|
59
|
+
* Receives the current tool call and an accumulated array of all tool calls so far.
|
|
60
|
+
* @returns The complete generated text
|
|
61
|
+
*/
|
|
62
|
+
stream(prompt, onToken, onToolCall) {
|
|
63
|
+
const accumulatedToolCalls = [];
|
|
64
|
+
return getInstance().stream(prompt, onToken, (name, argsJson) => {
|
|
65
|
+
if (onToolCall) {
|
|
66
|
+
try {
|
|
67
|
+
const args = JSON.parse(argsJson);
|
|
68
|
+
const toolCall = {
|
|
69
|
+
name,
|
|
70
|
+
arguments: args
|
|
71
|
+
};
|
|
72
|
+
accumulatedToolCalls.push(toolCall);
|
|
73
|
+
onToolCall({
|
|
74
|
+
toolCall,
|
|
75
|
+
allToolCalls: [...accumulatedToolCalls]
|
|
76
|
+
});
|
|
77
|
+
} catch {
|
|
78
|
+
const toolCall = {
|
|
79
|
+
name,
|
|
80
|
+
arguments: {}
|
|
81
|
+
};
|
|
82
|
+
accumulatedToolCalls.push(toolCall);
|
|
83
|
+
onToolCall({
|
|
84
|
+
toolCall,
|
|
85
|
+
allToolCalls: [...accumulatedToolCalls]
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* Stream with typed events for thinking blocks and tool calls.
|
|
93
|
+
* Provides granular lifecycle events for UI updates.
|
|
94
|
+
*
|
|
95
|
+
* @param prompt - The input text
|
|
96
|
+
* @param onEvent - Callback receiving typed StreamEvent objects
|
|
97
|
+
* @returns Promise resolving to final content string (thinking content stripped)
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* await LLM.streamWithEvents(prompt, (event) => {
|
|
102
|
+
* switch (event.type) {
|
|
103
|
+
* case 'token':
|
|
104
|
+
* appendToContent(event.token)
|
|
105
|
+
* break
|
|
106
|
+
* case 'thinking_start':
|
|
107
|
+
* showThinkingIndicator()
|
|
108
|
+
* break
|
|
109
|
+
* case 'thinking_chunk':
|
|
110
|
+
* appendToThinking(event.chunk)
|
|
111
|
+
* break
|
|
112
|
+
* case 'tool_call_start':
|
|
113
|
+
* showToolCallCard(event.name, event.arguments)
|
|
114
|
+
* break
|
|
115
|
+
* }
|
|
116
|
+
* })
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
streamWithEvents(prompt, onEvent) {
|
|
120
|
+
return getInstance().streamWithEvents(prompt, eventJson => {
|
|
121
|
+
try {
|
|
122
|
+
const event = JSON.parse(eventJson);
|
|
123
|
+
onEvent(event);
|
|
124
|
+
} catch {
|
|
125
|
+
// Silently ignore malformed events
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
/**
|
|
130
|
+
* Stop the current generation. Safe to call even if not generating.
|
|
131
|
+
*/
|
|
132
|
+
stop() {
|
|
133
|
+
getInstance().stop();
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* Unload the current model and release memory.
|
|
137
|
+
* Call this when you're done with the model to free up memory.
|
|
138
|
+
*/
|
|
139
|
+
unload() {
|
|
140
|
+
getInstance().unload();
|
|
141
|
+
},
|
|
142
|
+
/**
|
|
143
|
+
* Get statistics from the last generation.
|
|
144
|
+
* @returns Statistics including token count, tokens/sec (excluding tool execution), TTFT, total time, and tool execution time
|
|
145
|
+
*/
|
|
146
|
+
getLastGenerationStats() {
|
|
147
|
+
return getInstance().getLastGenerationStats();
|
|
148
|
+
},
|
|
149
|
+
/**
|
|
150
|
+
* Get the message history if management is enabled.
|
|
151
|
+
* @returns Array of messages in the history
|
|
152
|
+
*/
|
|
153
|
+
getHistory() {
|
|
154
|
+
return getInstance().getHistory();
|
|
155
|
+
},
|
|
156
|
+
/**
|
|
157
|
+
* Clear the message history.
|
|
158
|
+
*/
|
|
159
|
+
clearHistory() {
|
|
160
|
+
getInstance().clearHistory();
|
|
161
|
+
},
|
|
162
|
+
/** Whether a model is currently loaded and ready for generation */
|
|
163
|
+
get isLoaded() {
|
|
164
|
+
return getInstance().isLoaded;
|
|
165
|
+
},
|
|
166
|
+
/** Whether text is currently being generated */
|
|
167
|
+
get isGenerating() {
|
|
168
|
+
return getInstance().isGenerating;
|
|
169
|
+
},
|
|
170
|
+
/** The ID of the currently loaded model, or empty string if none */
|
|
171
|
+
get modelId() {
|
|
172
|
+
return getInstance().modelId;
|
|
173
|
+
},
|
|
174
|
+
/** Enable debug logging to console */
|
|
175
|
+
get debug() {
|
|
176
|
+
return getInstance().debug;
|
|
177
|
+
},
|
|
178
|
+
set debug(value) {
|
|
179
|
+
getInstance().debug = value;
|
|
180
|
+
},
|
|
181
|
+
/**
|
|
182
|
+
* System prompt used when loading the model.
|
|
183
|
+
* Set this before calling `load()`. Changes require reloading the model.
|
|
184
|
+
* @default "You are a helpful assistant."
|
|
185
|
+
*/
|
|
186
|
+
get systemPrompt() {
|
|
187
|
+
return getInstance().systemPrompt;
|
|
188
|
+
},
|
|
189
|
+
set systemPrompt(value) {
|
|
190
|
+
getInstance().systemPrompt = value;
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NitroModules","instance","getInstance","createHybridObject","LLM","load","modelId","options","generate","prompt","stream","onToken","onToolCall","accumulatedToolCalls","name","argsJson","args","JSON","parse","toolCall","arguments","push","allToolCalls","streamWithEvents","onEvent","eventJson","event","stop","unload","getLastGenerationStats","getHistory","clearHistory","isLoaded","isGenerating","debug","value","systemPrompt"],"sourceRoot":"../../src","sources":["llm.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NitroModules } from 'react-native-nitro-modules';
|
|
4
|
+
let instance = null;
|
|
5
|
+
function getInstance() {
|
|
6
|
+
if (!instance) {
|
|
7
|
+
instance = NitroModules.createHybridObject('ModelManager');
|
|
8
|
+
}
|
|
9
|
+
return instance;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Manage MLX model downloads from HuggingFace.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { ModelManager } from 'react-native-nitro-mlx'
|
|
18
|
+
*
|
|
19
|
+
* // Download a model
|
|
20
|
+
* await ModelManager.download('mlx-community/Qwen3-0.6B-4bit', progress => {
|
|
21
|
+
* console.log(`Downloading: ${(progress * 100).toFixed(0)}%`)
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* // Check if downloaded
|
|
25
|
+
* const isReady = await ModelManager.isDownloaded('mlx-community/Qwen3-0.6B-4bit')
|
|
26
|
+
*
|
|
27
|
+
* // List all downloaded models
|
|
28
|
+
* const models = await ModelManager.getDownloadedModels()
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const ModelManager = {
|
|
32
|
+
/**
|
|
33
|
+
* Download a model from HuggingFace.
|
|
34
|
+
* @param modelId - HuggingFace model ID (e.g., 'mlx-community/Qwen3-0.6B-4bit')
|
|
35
|
+
* @param progressCallback - Callback invoked with download progress (0-1)
|
|
36
|
+
* @returns Path to the downloaded model directory
|
|
37
|
+
*/
|
|
38
|
+
download(modelId, progressCallback) {
|
|
39
|
+
return getInstance().download(modelId, progressCallback);
|
|
40
|
+
},
|
|
41
|
+
/**
|
|
42
|
+
* Check if a model is already downloaded.
|
|
43
|
+
* @param modelId - HuggingFace model ID
|
|
44
|
+
* @returns True if the model is fully downloaded
|
|
45
|
+
*/
|
|
46
|
+
isDownloaded(modelId) {
|
|
47
|
+
return getInstance().isDownloaded(modelId);
|
|
48
|
+
},
|
|
49
|
+
/**
|
|
50
|
+
* Get a list of all downloaded model IDs.
|
|
51
|
+
* @returns Array of model IDs that are available locally
|
|
52
|
+
*/
|
|
53
|
+
getDownloadedModels() {
|
|
54
|
+
return getInstance().getDownloadedModels();
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Delete a downloaded model to free up disk space.
|
|
58
|
+
* @param modelId - HuggingFace model ID
|
|
59
|
+
*/
|
|
60
|
+
deleteModel(modelId) {
|
|
61
|
+
return getInstance().deleteModel(modelId);
|
|
62
|
+
},
|
|
63
|
+
/**
|
|
64
|
+
* Get the local filesystem path for a downloaded model.
|
|
65
|
+
* @param modelId - HuggingFace model ID
|
|
66
|
+
* @returns Absolute path to the model directory
|
|
67
|
+
*/
|
|
68
|
+
getModelPath(modelId) {
|
|
69
|
+
return getInstance().getModelPath(modelId);
|
|
70
|
+
},
|
|
71
|
+
/** Enable debug logging to console */
|
|
72
|
+
get debug() {
|
|
73
|
+
return getInstance().debug;
|
|
74
|
+
},
|
|
75
|
+
set debug(value) {
|
|
76
|
+
getInstance().debug = value;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=modelManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NitroModules","instance","getInstance","createHybridObject","ModelManager","download","modelId","progressCallback","isDownloaded","getDownloadedModels","deleteModel","getModelPath","debug","value"],"sourceRoot":"../../src","sources":["modelManager.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,IAAIC,QAAiC,GAAG,IAAI;AAE5C,SAASC,WAAWA,CAAA,EAAqB;EACvC,IAAI,CAACD,QAAQ,EAAE;IACbA,QAAQ,GAAGD,YAAY,CAACG,kBAAkB,CAAmB,cAAc,CAAC;EAC9E;EACA,OAAOF,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMG,YAAY,GAAG;EAC1B;AACF;AACA;AACA;AACA;AACA;EACEC,QAAQA,CACNC,OAAe,EACfC,gBAA4C,EAC3B;IACjB,OAAOL,WAAW,CAAC,CAAC,CAACG,QAAQ,CAACC,OAAO,EAAEC,gBAAgB,CAAC;EAC1D,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,YAAYA,CAACF,OAAe,EAAoB;IAC9C,OAAOJ,WAAW,CAAC,CAAC,CAACM,YAAY,CAACF,OAAO,CAAC;EAC5C,CAAC;EAED;AACF;AACA;AACA;EACEG,mBAAmBA,CAAA,EAAsB;IACvC,OAAOP,WAAW,CAAC,CAAC,CAACO,mBAAmB,CAAC,CAAC;EAC5C,CAAC;EAED;AACF;AACA;AACA;EACEC,WAAWA,CAACJ,OAAe,EAAiB;IAC1C,OAAOJ,WAAW,CAAC,CAAC,CAACQ,WAAW,CAACJ,OAAO,CAAC;EAC3C,CAAC;EAED;AACF;AACA;AACA;AACA;EACEK,YAAYA,CAACL,OAAe,EAAmB;IAC7C,OAAOJ,WAAW,CAAC,CAAC,CAACS,YAAY,CAACL,OAAO,CAAC;EAC5C,CAAC;EAED;EACA,IAAIM,KAAKA,CAAA,EAAY;IACnB,OAAOV,WAAW,CAAC,CAAC,CAACU,KAAK;EAC5B,CAAC;EAED,IAAIA,KAAKA,CAACC,KAAc,EAAE;IACxBX,WAAW,CAAC,CAAC,CAACU,KAAK,GAAGC,KAAK;EAC7B;AACF,CAAC","ignoreList":[]}
|