@chai-ui/core 0.5.0 → 0.6.1
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 +33 -3
- package/dist/check-suggested-models.d.ts +31 -0
- package/dist/check-suggested-models.d.ts.map +1 -0
- package/dist/check-suggested-models.js +123 -0
- package/dist/check-suggested-models.js.map +1 -0
- package/dist/composer.d.ts +188 -0
- package/dist/composer.d.ts.map +1 -0
- package/dist/composer.js +326 -0
- package/dist/composer.js.map +1 -0
- package/dist/engines/fal.d.ts +6 -4
- package/dist/engines/fal.d.ts.map +1 -1
- package/dist/engines/fal.js +20 -19
- package/dist/engines/fal.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/media-analyzer.d.ts +55 -0
- package/dist/media-analyzer.d.ts.map +1 -0
- package/dist/media-analyzer.js +124 -0
- package/dist/media-analyzer.js.map +1 -0
- package/dist/reasoning.d.ts +59 -0
- package/dist/reasoning.d.ts.map +1 -0
- package/dist/reasoning.js +55 -0
- package/dist/reasoning.js.map +1 -0
- package/dist/suggested-models.d.ts +23 -0
- package/dist/suggested-models.d.ts.map +1 -0
- package/dist/suggested-models.js +110 -0
- package/dist/suggested-models.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/check-suggested-models.ts +147 -0
- package/src/composer.ts +525 -0
- package/src/engines/fal.ts +20 -19
- package/src/index.ts +5 -0
- package/src/media-analyzer.ts +182 -0
- package/src/reasoning.ts +90 -0
- package/src/suggested-models.ts +121 -0
- package/src/types.ts +13 -0
package/dist/composer.js
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Composer's behavior with no framework: turns a submit payload into
|
|
3
|
+
* `Request` → `Run` → `Result` (§6), fanning out across `engine.generate`
|
|
4
|
+
* calls and folding each one back into state as it settles. A small store
|
|
5
|
+
* (`getState` + `subscribe`) that `useComposer` (React) and the Vue
|
|
6
|
+
* composable wrap; the pure transitions live in `run.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import { createMockEngine, isAbortError, mockEngine, normalizeGenerationError, } from "./engine.js";
|
|
9
|
+
import { routeModel } from "./model-routing.js";
|
|
10
|
+
import { buildRegionEditPrompt, PRECISE_EDIT_MODELS } from "./region-edit.js";
|
|
11
|
+
import { pickReasoning, reasoningModelFor } from "./reasoning.js";
|
|
12
|
+
import { cancelResult, createRun, deriveGenerationUseCase, failResult, resolveResult, ROUTING_MODEL_ID, startResult, streamResult, } from "./run.js";
|
|
13
|
+
/** A plain text request — what a submit means when no use case is picked, unless the builder sets `defaultUseCase`. */
|
|
14
|
+
export const TEXT_USE_CASE = { kind: "text", label: "Text" };
|
|
15
|
+
/** Editing the attached image, the attach menu's "Edit image". Pair it with `useComposer`'s `editImage` and an `EditCard`. */
|
|
16
|
+
export const EDIT_IMAGE_USE_CASE = { kind: "image", label: "Edit image", edit: true };
|
|
17
|
+
/** A result's `modelId` when nothing was picked: the engine runs its own default model. */
|
|
18
|
+
export const DEFAULT_MODEL_ID = "default";
|
|
19
|
+
const mockTextEngine = createMockEngine({ outputKind: "text" });
|
|
20
|
+
function defaultEnhancePrompt(value, mode) {
|
|
21
|
+
const subject = mode?.includes("video")
|
|
22
|
+
? "a video-generation"
|
|
23
|
+
: mode === "text-to-text" || mode === "vision"
|
|
24
|
+
? "an AI assistant"
|
|
25
|
+
: "an image-generation";
|
|
26
|
+
return `Rewrite the following ${subject} prompt to be more detailed and specific, keeping the same intent. Reply with only the rewritten prompt, nothing else.\n\n${value}`;
|
|
27
|
+
}
|
|
28
|
+
function defaultEditPrompt({ prompt, regions, model }) {
|
|
29
|
+
return buildRegionEditPrompt({ prompt, regions, format: model?.regionFormat });
|
|
30
|
+
}
|
|
31
|
+
const imageOnly = (media) => (media?.kind === "image" ? media : null);
|
|
32
|
+
/**
|
|
33
|
+
* `getOptions` is read on every call, so options can change between
|
|
34
|
+
* renders; `getProvided` is the nearest provider's reasoning, if any.
|
|
35
|
+
*/
|
|
36
|
+
export function createComposerStore(getOptions, getProvided = () => undefined) {
|
|
37
|
+
let state = {
|
|
38
|
+
runs: [],
|
|
39
|
+
enhancing: false,
|
|
40
|
+
routing: false,
|
|
41
|
+
editRuns: [],
|
|
42
|
+
regions: [],
|
|
43
|
+
activeVersion: 0,
|
|
44
|
+
editSource: imageOnly(getOptions().editImage)?.src ?? null,
|
|
45
|
+
editImageCount: 0,
|
|
46
|
+
};
|
|
47
|
+
const listeners = new Set();
|
|
48
|
+
// Edit state belongs to one image: a read sees another image's state as
|
|
49
|
+
// empty, and the first write after the change actually clears it.
|
|
50
|
+
const forImage = (s, image = imageOnly(getOptions().editImage)) => {
|
|
51
|
+
const src = image?.src ?? null;
|
|
52
|
+
return src === s.editSource
|
|
53
|
+
? s
|
|
54
|
+
: { ...s, editSource: src, editImageCount: s.editImageCount + 1, editRuns: [], regions: [], activeVersion: 0 };
|
|
55
|
+
};
|
|
56
|
+
const set = (fn) => {
|
|
57
|
+
const current = forImage(state);
|
|
58
|
+
state = { ...current, ...fn(current) };
|
|
59
|
+
for (const l of listeners)
|
|
60
|
+
l();
|
|
61
|
+
};
|
|
62
|
+
let versionsCache = null;
|
|
63
|
+
const versionsOf = (s, image) => {
|
|
64
|
+
if (versionsCache && versionsCache.image === image && versionsCache.editRuns === s.editRuns && versionsCache.count === s.editImageCount) {
|
|
65
|
+
return versionsCache.versions;
|
|
66
|
+
}
|
|
67
|
+
const versions = image
|
|
68
|
+
? [
|
|
69
|
+
{ id: `original-${s.editImageCount}`, src: image.src, status: "done", regions: [] },
|
|
70
|
+
...s.editRuns.flatMap((run) => run.results.map((r) => ({
|
|
71
|
+
id: r.id,
|
|
72
|
+
src: r.output?.src,
|
|
73
|
+
from: run.request.attachments[0]?.src,
|
|
74
|
+
status: r.status,
|
|
75
|
+
regions: run.request.params.regions ?? [],
|
|
76
|
+
error: r.error?.message,
|
|
77
|
+
}))),
|
|
78
|
+
]
|
|
79
|
+
: [];
|
|
80
|
+
versionsCache = { image, editRuns: s.editRuns, count: s.editImageCount, versions };
|
|
81
|
+
return versions;
|
|
82
|
+
};
|
|
83
|
+
const reasoning = () => pickReasoning(getOptions(), getProvided());
|
|
84
|
+
// Each submit gets an id, so routing that settles after a newer submit is dropped.
|
|
85
|
+
let submitId = 0;
|
|
86
|
+
// Aborts the current submit's engine calls: on `cancel()`, and when a newer
|
|
87
|
+
// submit replaces it (its results would be dropped anyway).
|
|
88
|
+
let controller = null;
|
|
89
|
+
// Edit placeholders from routing waits, dropped from the history when the
|
|
90
|
+
// next real runs start (including ones a newer submit abandoned).
|
|
91
|
+
let placeholderIds = new Set();
|
|
92
|
+
// One request per selection. An edit runs on the image version showing
|
|
93
|
+
// in the EditCard (the original until an edit lands) and carries its regions.
|
|
94
|
+
function buildRequest(payload, selection) {
|
|
95
|
+
const opts = getOptions();
|
|
96
|
+
const r = reasoning();
|
|
97
|
+
const isText = selection.useCase.kind === "text";
|
|
98
|
+
const isEdit = Boolean(selection.useCase.edit && opts.editImage?.kind === "image");
|
|
99
|
+
const image = imageOnly(opts.editImage);
|
|
100
|
+
const s = forImage(state, image);
|
|
101
|
+
const shown = versionsOf(s, image)[s.activeVersion];
|
|
102
|
+
const editFrom = shown?.status === "done" && shown.src ? shown.src : opts.editImage?.src;
|
|
103
|
+
const attachments = isEdit && editFrom ? [{ src: editFrom, kind: "image" }] : payload.attachments;
|
|
104
|
+
// Nothing picked: text uses the builder's text model when there is
|
|
105
|
+
// one; otherwise the engine runs its own default. Never a silent no-op.
|
|
106
|
+
const fallback = isText ? (opts.textModel ?? (r && reasoningModelFor(r, attachments))) : undefined;
|
|
107
|
+
const params = payload.aspectRatio && !isEdit ? { aspectRatio: payload.aspectRatio } : {};
|
|
108
|
+
if (isEdit)
|
|
109
|
+
params.regions = payload.regions ?? [];
|
|
110
|
+
const request = {
|
|
111
|
+
mode: deriveGenerationUseCase(selection.useCase, attachments),
|
|
112
|
+
prompt: payload.value,
|
|
113
|
+
attachments,
|
|
114
|
+
modelIds: selection.modelIds.length > 0 ? selection.modelIds : [fallback ?? DEFAULT_MODEL_ID],
|
|
115
|
+
params,
|
|
116
|
+
};
|
|
117
|
+
const engine = isText
|
|
118
|
+
? (opts.textEngine ?? r?.engine ?? mockTextEngine)
|
|
119
|
+
: (opts.engineByKind?.[selection.useCase.kind] ?? opts.engine ?? mockEngine);
|
|
120
|
+
return { request, engine, isEdit };
|
|
121
|
+
}
|
|
122
|
+
function start(payload, signal) {
|
|
123
|
+
const opts = getOptions();
|
|
124
|
+
const newRuns = payload.selections.map((selection) => {
|
|
125
|
+
const { request, engine, isEdit } = buildRequest(payload, selection);
|
|
126
|
+
return { run: createRun(request), engine, isEdit, models: selection.models ?? [] };
|
|
127
|
+
});
|
|
128
|
+
const placeholders = placeholderIds;
|
|
129
|
+
placeholderIds = new Set();
|
|
130
|
+
set((s) => {
|
|
131
|
+
const newEditRuns = newRuns.filter((r) => r.isEdit).map((r) => r.run);
|
|
132
|
+
const kept = s.editRuns.filter((r) => !placeholders.has(r.id));
|
|
133
|
+
const runs = newRuns.map((r) => r.run);
|
|
134
|
+
// Show the first new version, and start the next edit with no regions:
|
|
135
|
+
// these ones now belong to the versions they made.
|
|
136
|
+
if (newEditRuns.length > 0) {
|
|
137
|
+
return {
|
|
138
|
+
runs,
|
|
139
|
+
editRuns: [...kept, ...newEditRuns],
|
|
140
|
+
activeVersion: 1 + kept.reduce((n, r) => n + r.results.length, 0),
|
|
141
|
+
regions: [],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return placeholders.size > 0 ? { runs, editRuns: kept } : { runs };
|
|
145
|
+
});
|
|
146
|
+
// Results settle independently and out of order — each update only
|
|
147
|
+
// ever touches its own run, and only if that run is still current. A
|
|
148
|
+
// run from an earlier submit is no longer in state (and its calls were
|
|
149
|
+
// aborted), so a late result can't clobber the newer ones.
|
|
150
|
+
const update = (runId, fn) => {
|
|
151
|
+
const apply = (prev) => (prev.some((r) => r.id === runId) ? prev.map((r) => (r.id === runId ? fn(r) : r)) : prev);
|
|
152
|
+
set((s) => ({ runs: apply(s.runs), editRuns: apply(s.editRuns) }));
|
|
153
|
+
};
|
|
154
|
+
for (const { run: newRun, engine, isEdit, models } of newRuns) {
|
|
155
|
+
opts.onRun?.(newRun);
|
|
156
|
+
for (const result of newRun.results) {
|
|
157
|
+
update(newRun.id, (r) => startResult(r, result.id));
|
|
158
|
+
// An edit's prompt depends on the model: one with box support gets
|
|
159
|
+
// boxes, any other gets the regions described in words.
|
|
160
|
+
const regions = newRun.request.params.regions ?? [];
|
|
161
|
+
const model = models.find((m) => m.id === result.modelId) ?? PRECISE_EDIT_MODELS.find((m) => m.id === result.modelId);
|
|
162
|
+
const prompt = isEdit
|
|
163
|
+
? (opts.editPrompt ?? defaultEditPrompt)({ prompt: newRun.request.prompt, regions, model })
|
|
164
|
+
: newRun.request.prompt;
|
|
165
|
+
void engine
|
|
166
|
+
.generate({
|
|
167
|
+
modelId: result.modelId === DEFAULT_MODEL_ID ? undefined : result.modelId,
|
|
168
|
+
prompt,
|
|
169
|
+
attachments: newRun.request.attachments,
|
|
170
|
+
aspectRatio: newRun.request.params.aspectRatio,
|
|
171
|
+
// Text engines that stream fill `output` in while still "running".
|
|
172
|
+
onText: (text) => update(newRun.id, (r) => streamResult(r, result.id, text)),
|
|
173
|
+
signal,
|
|
174
|
+
})
|
|
175
|
+
.then(({ src, kind, usage, evaluations }) => {
|
|
176
|
+
update(newRun.id, (r) => resolveResult(r, result.id, { src, kind }, usage, evaluations));
|
|
177
|
+
getOptions().onResult?.(newRun, result.id);
|
|
178
|
+
}, (err) => {
|
|
179
|
+
if (isAbortError(err))
|
|
180
|
+
return update(newRun.id, (r) => cancelResult(r, result.id));
|
|
181
|
+
update(newRun.id, (r) => failResult(r, result.id, normalizeGenerationError(err)));
|
|
182
|
+
getOptions().onError?.(newRun, result.id);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function submit(payload) {
|
|
188
|
+
const id = ++submitId;
|
|
189
|
+
controller?.abort();
|
|
190
|
+
const { signal } = (controller = new AbortController());
|
|
191
|
+
const toRoute = payload.autoSelectModel && payload.selections.some((sel) => sel.models.length > 0);
|
|
192
|
+
if (!toRoute) {
|
|
193
|
+
if (state.routing)
|
|
194
|
+
set(() => ({ routing: false }));
|
|
195
|
+
start(payload, signal);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const opts = getOptions();
|
|
199
|
+
const r = reasoning();
|
|
200
|
+
if (!r)
|
|
201
|
+
warnNoReasoningOnce("each request runs on the first listed model");
|
|
202
|
+
// Runs exist from the moment of submit, so a result card shows progress
|
|
203
|
+
// while the reasoning model chooses. Their results read "Choosing model".
|
|
204
|
+
const placeholders = payload.selections.map((sel) => {
|
|
205
|
+
const { request, isEdit } = buildRequest(payload, sel);
|
|
206
|
+
const modelIds = sel.models.length > 0 ? [ROUTING_MODEL_ID] : request.modelIds;
|
|
207
|
+
return { run: createRun({ ...request, modelIds }), isEdit };
|
|
208
|
+
});
|
|
209
|
+
set((s) => {
|
|
210
|
+
const next = { routing: true, runs: placeholders.map((p) => p.run) };
|
|
211
|
+
const editPlaceholders = placeholders.filter((p) => p.isEdit).map((p) => p.run);
|
|
212
|
+
if (editPlaceholders.length > 0) {
|
|
213
|
+
const editRuns = s.editRuns.filter((run) => !placeholderIds.has(run.id));
|
|
214
|
+
for (const run of editPlaceholders)
|
|
215
|
+
placeholderIds.add(run.id);
|
|
216
|
+
next.editRuns = [...editRuns, ...editPlaceholders];
|
|
217
|
+
next.activeVersion = 1 + editRuns.reduce((n, run) => n + run.results.length, 0);
|
|
218
|
+
}
|
|
219
|
+
return next;
|
|
220
|
+
});
|
|
221
|
+
void Promise.all(payload.selections.map((sel) => sel.models.length === 0
|
|
222
|
+
? Promise.resolve(null)
|
|
223
|
+
: routeModel({
|
|
224
|
+
prompt: payload.value,
|
|
225
|
+
outputKind: sel.useCase.kind,
|
|
226
|
+
attachmentKinds: payload.attachments.map((a) => a.kind),
|
|
227
|
+
attachments: payload.attachments,
|
|
228
|
+
models: sel.models,
|
|
229
|
+
engine: r?.engine,
|
|
230
|
+
model: r && reasoningModelFor(r, payload.attachments),
|
|
231
|
+
routingPrompt: opts.routingPrompt,
|
|
232
|
+
signal,
|
|
233
|
+
}))).then((results) => {
|
|
234
|
+
if (id !== submitId || signal.aborted)
|
|
235
|
+
return;
|
|
236
|
+
set(() => ({ routing: false }));
|
|
237
|
+
const latest = getOptions();
|
|
238
|
+
for (const res of results)
|
|
239
|
+
if (res?.status === "fallback")
|
|
240
|
+
latest.onRoutingFallback?.(res);
|
|
241
|
+
const routedIds = results.flatMap((res) => (res ? [res.modelId] : []));
|
|
242
|
+
if (latest.onModelIdsChange)
|
|
243
|
+
latest.onModelIdsChange(routedIds);
|
|
244
|
+
else if (routedIds[0])
|
|
245
|
+
latest.onModelChange?.(routedIds[0]);
|
|
246
|
+
start({
|
|
247
|
+
...payload,
|
|
248
|
+
modelId: routedIds[0] ?? payload.modelId,
|
|
249
|
+
selections: payload.selections.map((sel, i) => ({
|
|
250
|
+
...sel,
|
|
251
|
+
modelIds: results[i] ? [results[i].modelId] : sel.modelIds,
|
|
252
|
+
})),
|
|
253
|
+
}, signal);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Stops the current submit: wire it to Composer's `onAbort`. Its
|
|
258
|
+
* unfinished results turn `"cancelled"` right away, and each engine
|
|
259
|
+
* cancels at the provider where it can (best effort: some providers keep
|
|
260
|
+
* running, and billing, once a request has started).
|
|
261
|
+
*/
|
|
262
|
+
function cancel() {
|
|
263
|
+
submitId += 1;
|
|
264
|
+
controller?.abort();
|
|
265
|
+
controller = null;
|
|
266
|
+
const cancelAll = (prev) => prev.map((run) => run.results.reduce((acc, r) => cancelResult(acc, r.id), run));
|
|
267
|
+
set((s) => ({ routing: false, runs: cancelAll(s.runs), editRuns: cancelAll(s.editRuns) }));
|
|
268
|
+
}
|
|
269
|
+
/** Rewrites a prompt with the reasoning model. Only offer it when `reasoning()` is set. */
|
|
270
|
+
async function enhance(value) {
|
|
271
|
+
const r = reasoning();
|
|
272
|
+
if (!r)
|
|
273
|
+
throw new Error("[chai-ui] Enhance needs a reasoning engine and model.");
|
|
274
|
+
set(() => ({ enhancing: true }));
|
|
275
|
+
try {
|
|
276
|
+
const prompt = (getOptions().enhancePrompt ?? defaultEnhancePrompt)(value, state.runs[0]?.request.mode);
|
|
277
|
+
const { src } = await r.engine.generate({ modelId: r.model, prompt, attachments: [] });
|
|
278
|
+
return src;
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
set(() => ({ enhancing: false }));
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const setActiveVersion = (activeVersion) => set(() => ({ activeVersion }));
|
|
285
|
+
const setRegions = (regions) => set(() => ({ regions }));
|
|
286
|
+
/**
|
|
287
|
+
* The `EditCard` props for a state and the current `editImage`, or `null`
|
|
288
|
+
* without one. Pure, so a binding can call it while rendering with that
|
|
289
|
+
* render's options.
|
|
290
|
+
*/
|
|
291
|
+
function edit(s, editImage) {
|
|
292
|
+
const image = imageOnly(editImage);
|
|
293
|
+
if (!image)
|
|
294
|
+
return null;
|
|
295
|
+
const current = forImage(s, image);
|
|
296
|
+
const versions = versionsOf(current, image);
|
|
297
|
+
return {
|
|
298
|
+
versions,
|
|
299
|
+
activeVersion: Math.min(current.activeVersion, versions.length - 1),
|
|
300
|
+
onActiveVersionChange: setActiveVersion,
|
|
301
|
+
regions: current.regions,
|
|
302
|
+
onRegionsChange: setRegions,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
getState: () => state,
|
|
307
|
+
subscribe(listener) {
|
|
308
|
+
listeners.add(listener);
|
|
309
|
+
return () => void listeners.delete(listener);
|
|
310
|
+
},
|
|
311
|
+
submit,
|
|
312
|
+
cancel,
|
|
313
|
+
enhance,
|
|
314
|
+
edit,
|
|
315
|
+
reasoning,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
const warned = new Set();
|
|
319
|
+
/** One console warning per message per page load: auto-select is on with no reasoning model to route with. */
|
|
320
|
+
export function warnNoReasoningOnce(consequence) {
|
|
321
|
+
if (warned.has(consequence))
|
|
322
|
+
return;
|
|
323
|
+
warned.add(consequence);
|
|
324
|
+
console.warn(`[chai-ui] Auto-select model is on, but there's no reasoning model, so ${consequence}. Wrap your app in <ChaiProvider> to route with one.`);
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=composer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,wBAAwB,GAEzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAmD,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAmB,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AAClF,OAAO,EACL,YAAY,EACZ,SAAS,EACT,uBAAuB,EACvB,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,YAAY,GAIb,MAAM,UAAU,CAAC;AA0BlB,uHAAuH;AACvH,MAAM,CAAC,MAAM,aAAa,GAAoB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAE9E,8HAA8H;AAC9H,MAAM,CAAC,MAAM,mBAAmB,GAAoB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAgDvG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAuF1C,MAAM,cAAc,GAAG,gBAAgB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;AAEhE,SAAS,oBAAoB,CAAC,KAAa,EAAE,IAAwB;IACnE,MAAM,OAAO,GAAG,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC;QACrC,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,QAAQ;YAC5C,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,qBAAqB,CAAC;IAC5B,OAAO,yBAAyB,OAAO,6HAA6H,KAAK,EAAE,CAAC;AAC9K,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAkE;IACnH,OAAO,qBAAqB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,KAAsC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEvG;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAiC,EAAE,cAA2C,GAAG,EAAE,CAAC,SAAS;IAC/H,IAAI,KAAK,GAAkB;QACzB,IAAI,EAAE,EAAE;QACR,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,IAAI;QAC1D,cAAc,EAAE,CAAC;KAClB,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,wEAAwE;IACxE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,CAAC,CAAgB,EAAE,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,EAAiB,EAAE;QAC9F,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC;QAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU;YACzB,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,EAAgD,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,EAAE,CAAC;IACjC,CAAC,CAAC;IAEF,IAAI,aAAa,GAAmG,IAAI,CAAC;IACzH,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAE,KAA0B,EAAiB,EAAE;QACjF,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,KAAK,KAAK,IAAI,aAAa,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,aAAa,CAAC,KAAK,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;YACxI,OAAO,aAAa,CAAC,QAAQ,CAAC;QAChC,CAAC;QACD,MAAM,QAAQ,GAAkB,KAAK;YACnC,CAAC,CAAC;gBACE,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;gBACnF,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG;oBAClB,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG;oBACrC,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,OAAO,EAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAoC,IAAI,EAAE;oBACvE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO;iBACxB,CAAC,CAAC,CACJ;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,aAAa,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC;QACnF,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAEnE,mFAAmF;IACnF,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,4EAA4E;IAC5E,4DAA4D;IAC5D,IAAI,UAAU,GAA2B,IAAI,CAAC;IAC9C,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,uEAAuE;IACvE,8EAA8E;IAC9E,SAAS,YAAY,CAAC,OAA8B,EAAE,SAA4B;QAChF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;QACzF,MAAM,WAAW,GAAmB,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAClH,mEAAmE;QACnE,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnG,MAAM,MAAM,GAA4B,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACnD,MAAM,OAAO,GAAY;YACvB,IAAI,EAAE,uBAAuB,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;YAC7D,MAAM,EAAE,OAAO,CAAC,KAAK;YACrB,WAAW;YACX,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,gBAAgB,CAAC;YAC7F,MAAM;SACP,CAAC;QACF,MAAM,MAAM,GAAG,MAAM;YACnB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,MAAM,IAAI,cAAc,CAAC;YAClD,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;QAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,SAAS,KAAK,CAAC,OAA8B,EAAE,MAAmB;QAChE,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACnD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACrE,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,cAAc,CAAC;QACpC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACR,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACvC,uEAAuE;YACvE,mDAAmD;YACnD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,IAAI;oBACJ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC;oBACnC,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;oBACjE,OAAO,EAAE,EAAE;iBACZ,CAAC;YACJ,CAAC;YACD,OAAO,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,qEAAqE;QACrE,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAqB,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC;QAEF,KAAK,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;YAC9D,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;YACrB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpD,mEAAmE;gBACnE,wDAAwD;gBACxD,MAAM,OAAO,GAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAoC,IAAI,EAAE,CAAC;gBAClF,MAAM,KAAK,GACT,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC1G,MAAM,MAAM,GAAG,MAAM;oBACnB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;oBAC3F,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC1B,KAAK,MAAM;qBACR,QAAQ,CAAC;oBACR,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;oBACzE,MAAM;oBACN,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW;oBACvC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAiC;oBACpE,mEAAmE;oBACnE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBAC5E,MAAM;iBACP,CAAC;qBACD,IAAI,CACH,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;oBACpC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;oBACzF,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7C,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;oBACN,IAAI,YAAY,CAAC,GAAG,CAAC;wBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;oBACnF,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClF,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC5C,CAAC,CACF,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,MAAM,CAAC,OAA8B;QAC5C,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC;QACtB,UAAU,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,KAAK,CAAC,OAAO;gBAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnD,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC;YAAE,mBAAmB,CAAC,6CAA6C,CAAC,CAAC;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAClD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/E,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACR,MAAM,IAAI,GAA2B,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7F,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzE,KAAK,MAAM,GAAG,IAAI,gBAAgB;oBAAE,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,gBAAgB,CAAC,CAAC;gBACnD,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,OAAO,CAAC,GAAG,CACd,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7B,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YACrB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,UAAU,CAAC;gBACT,MAAM,EAAE,OAAO,CAAC,KAAK;gBACrB,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;gBAC5B,eAAe,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,CAAC,EAAE,MAAM;gBACjB,KAAK,EAAE,CAAC,IAAI,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;gBACrD,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,MAAM;aACP,CAAC,CACP,CACF,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,IAAI,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO;YAC9C,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,OAAO;gBAAE,IAAI,GAAG,EAAE,MAAM,KAAK,UAAU;oBAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC;YAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,MAAM,CAAC,gBAAgB;gBAAE,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;iBAC3D,IAAI,SAAS,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,KAAK,CACH;gBACE,GAAG,OAAO;gBACV,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO;gBACxC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC9C,GAAG,GAAG;oBACN,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ;iBAC5D,CAAC,CAAC;aACJ,EACD,MAAM,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,SAAS,MAAM;QACb,QAAQ,IAAI,CAAC,CAAC;QACd,UAAU,EAAE,KAAK,EAAE,CAAC;QACpB,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,SAAS,GAAG,CAAC,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACnH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,2FAA2F;IAC3F,KAAK,UAAU,OAAO,CAAC,KAAa;QAClC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACjF,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,aAAa,IAAI,oBAAoB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACxG,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YACvF,OAAO,GAAG,CAAC;QACb,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,UAAU,GAAG,CAAC,OAAqB,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAEvE;;;;OAIG;IACH,SAAS,IAAI,CAAC,CAAgB,EAAE,SAA0C;QACxE,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO;YACL,QAAQ;YACR,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACnE,qBAAqB,EAAE,gBAAgB;YACvC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,eAAe,EAAE,UAAU;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,SAAS,CAAC,QAAoB;YAC5B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM;QACN,MAAM;QACN,OAAO;QACP,IAAI;QACJ,SAAS;KACV,CAAC;AACJ,CAAC;AAID,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;AACjC,8GAA8G;AAC9G,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO;IACpC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CACV,yEAAyE,WAAW,sDAAsD,CAC3I,CAAC;AACJ,CAAC"}
|
package/dist/engines/fal.d.ts
CHANGED
|
@@ -59,11 +59,13 @@ export declare function describeFalError(json: {
|
|
|
59
59
|
error?: unknown;
|
|
60
60
|
detail?: unknown;
|
|
61
61
|
}, fallback: string): string;
|
|
62
|
+
/** Fal's named `image_size` values for the ratios they cover (FLUX.1, GPT Image 2). */
|
|
63
|
+
export declare const FAL_NAMED_IMAGE_SIZES: Record<string, string>;
|
|
62
64
|
/**
|
|
63
|
-
* Builds the one Fal request body CHAI sends: the prompt,
|
|
64
|
-
* images
|
|
65
|
-
*
|
|
66
|
-
*
|
|
65
|
+
* Builds the one Fal request body CHAI sends: the prompt, the aspect ratio
|
|
66
|
+
* and the attached images, each in the field the model expects. A
|
|
67
|
+
* suggested model says which (`ModelOption.falInput`, from its Fal
|
|
68
|
+
* schema); for any other model the field is guessed from its id.
|
|
67
69
|
*/
|
|
68
70
|
export declare function buildFalRequestBody(args: {
|
|
69
71
|
prompt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fal.d.ts","sourceRoot":"","sources":["../../src/engines/fal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAA6D,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fal.d.ts","sourceRoot":"","sources":["../../src/engines/fal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAA6D,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG3D,kHAAkH;AAClH,KAAK,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,uGAAuG;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gHAAgH;IAChH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8HAA8H;IAC9H,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,8EAA8E;IAC9E,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mHAAmH;IACnH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AA6BD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,2KAA2K;AAC3K,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStG;AASD,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMxD,CAAC;AASF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,YAAY,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB1B;AAED,iIAAiI;AACjI,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAIpG;AA0DD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,gBAAgB,CAyDhF;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GAC5E,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BnE"}
|
package/dist/engines/fal.js
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* key into this file would put it in the browser bundle; don't add one.
|
|
22
22
|
*/
|
|
23
23
|
import { abortError, abortableSleep, isAbortError, readEvaluations } from "../engine.js";
|
|
24
|
+
import { SUGGESTED_FAL_MODELS } from "../suggested-models.js";
|
|
24
25
|
/**
|
|
25
26
|
* Fal model ids verified live against fal.ai's own docs/catalog
|
|
26
27
|
* 2026-09-24, not invented. No default for "audio": CHAI has no audio
|
|
@@ -48,40 +49,39 @@ export function describeFalError(json, fallback) {
|
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
|
-
* Fal models that take their input images as an
|
|
52
|
-
* image being edited first)
|
|
53
|
-
*
|
|
52
|
+
* Fal models outside the suggested lists that take their input images as an
|
|
53
|
+
* `image_urls` list (the image being edited first). Suggested models say
|
|
54
|
+
* so themselves (`ModelOption.falInput`).
|
|
54
55
|
*/
|
|
55
56
|
const IMAGE_LIST_MODELS = new Set(["blackforestlabs/flux-3/edit-image"]);
|
|
56
|
-
/**
|
|
57
|
-
const
|
|
57
|
+
/** Fal's named `image_size` values for the ratios they cover (FLUX.1, GPT Image 2). */
|
|
58
|
+
export const FAL_NAMED_IMAGE_SIZES = {
|
|
58
59
|
"1:1": "square_hd",
|
|
59
60
|
"4:3": "landscape_4_3",
|
|
60
61
|
"16:9": "landscape_16_9",
|
|
61
62
|
"3:4": "portrait_4_3",
|
|
62
63
|
"9:16": "portrait_16_9",
|
|
63
64
|
};
|
|
64
|
-
/** GPT Image's `image_size` pixel sizes for the ratios it takes (fal.ai/models/fal-ai/gpt-image-1/text-to-image/api). */
|
|
65
|
-
const
|
|
65
|
+
/** GPT Image 1's `image_size` pixel sizes for the ratios it takes (fal.ai/models/fal-ai/gpt-image-1/text-to-image/api). */
|
|
66
|
+
const GPT_IMAGE_1_SIZES = {
|
|
66
67
|
"1:1": "1024x1024",
|
|
67
68
|
"3:2": "1536x1024",
|
|
68
69
|
"2:3": "1024x1536",
|
|
69
70
|
};
|
|
70
71
|
/**
|
|
71
|
-
* Builds the one Fal request body CHAI sends: the prompt,
|
|
72
|
-
* images
|
|
73
|
-
*
|
|
74
|
-
*
|
|
72
|
+
* Builds the one Fal request body CHAI sends: the prompt, the aspect ratio
|
|
73
|
+
* and the attached images, each in the field the model expects. A
|
|
74
|
+
* suggested model says which (`ModelOption.falInput`, from its Fal
|
|
75
|
+
* schema); for any other model the field is guessed from its id.
|
|
75
76
|
*/
|
|
76
77
|
export function buildFalRequestBody(args) {
|
|
77
78
|
const body = { prompt: args.prompt };
|
|
79
|
+
const known = args.model ? SUGGESTED_FAL_MODELS.get(args.model)?.falInput : undefined;
|
|
78
80
|
if (args.aspectRatio) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
: args.model?.startsWith("fal-ai/gpt-image")
|
|
84
|
-
? GPT_IMAGE_SIZES
|
|
81
|
+
const sizes = args.model?.startsWith("fal-ai/gpt-image")
|
|
82
|
+
? GPT_IMAGE_1_SIZES
|
|
83
|
+
: (known?.aspectRatio ?? (args.model?.startsWith("fal-ai/flux/") ? "image_size" : "aspect_ratio")) === "image_size"
|
|
84
|
+
? FAL_NAMED_IMAGE_SIZES
|
|
85
85
|
: null;
|
|
86
86
|
if (sizes) {
|
|
87
87
|
const size = sizes[args.aspectRatio];
|
|
@@ -95,10 +95,11 @@ export function buildFalRequestBody(args) {
|
|
|
95
95
|
const images = (args.attachments ?? []).filter((a) => a.kind === "image").map((a) => a.src);
|
|
96
96
|
if (images.length === 0)
|
|
97
97
|
return body;
|
|
98
|
-
|
|
98
|
+
const field = known?.image ?? (args.model && IMAGE_LIST_MODELS.has(args.model) ? "image_urls" : "image_url");
|
|
99
|
+
if (field === "image_urls")
|
|
99
100
|
body.image_urls = images;
|
|
100
101
|
else
|
|
101
|
-
body
|
|
102
|
+
body[field] = images[0];
|
|
102
103
|
return body;
|
|
103
104
|
}
|
|
104
105
|
/** Pulls the generated media URL out of Fal's result JSON for the given output kind — the response shape differs by modality. */
|
package/dist/engines/fal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fal.js","sourceRoot":"","sources":["../../src/engines/fal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAyB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fal.js","sourceRoot":"","sources":["../../src/engines/fal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAyB,MAAM,cAAc,CAAC;AAEhH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAsB9D;;;;;GAKG;AACH,MAAM,qBAAqB,GAA2C;IACpE,KAAK,EAAE,qBAAqB;IAC5B,KAAK,EAAE,8BAA8B;CACtC,CAAC;AAEF,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAyBnC,2KAA2K;AAC3K,MAAM,UAAU,gBAAgB,CAAC,IAA2C,EAAE,QAAgB;IAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC;AAEzE,uFAAuF;AACvF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,gBAAgB;IACxB,KAAK,EAAE,cAAc;IACrB,MAAM,EAAE,eAAe;CACxB,CAAC;AAEF,2HAA2H;AAC3H,MAAM,iBAAiB,GAA2B;IAChD,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAKnC;IACC,MAAM,IAAI,GAA4B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACtF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,kBAAkB,CAAC;YACtD,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,YAAY;gBACjH,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,IAAI;gBAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAC7G,IAAI,KAAK,KAAK,YAAY;QAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;;QAChD,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iIAAiI;AACjI,MAAM,UAAU,mBAAmB,CAAC,IAAuB,EAAE,IAAmB;IAC9E,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACnD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAK3B;IACC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;QACjE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;KAChC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsB,CAAC;IACvE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtG,IAAI,CAAC,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC3E,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;AAC3E,CAAC;AAED,6FAA6F;AAC7F,KAAK,UAAU,WAAW,CAAC,IAS1B;IACC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;IAC7C,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,oCAAoC,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,SAAS,SAAS,CAAC,CAAC;QACrG,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsB,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACtG,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC;IACjC,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9F,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAsB,CAAC;IACvE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtG,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,YAAY,CAAC,IAAqF;IAC/G,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9H,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAA4B,EAAE;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC;IACrD,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,SAAS,GAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3F,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;IACjD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,wBAAwB,CAAC;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAE1D,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE;YAClE,MAAM,KAAK,GACT,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACrG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,kDAAkD,UAAU,uCAAuC,UAAU,KAAK,CACnH,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9E,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,UAAU,EAAE,CAAC;YAExC,IAAI,CAAC;gBACH,qEAAqE;gBACrE,uCAAuC;gBACvC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBACvF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACpB,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC9D,MAAM,UAAU,EAAE,CAAC;gBACrB,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;oBAC/B,QAAQ;oBACR,KAAK;oBACL,SAAS;oBACT,MAAM;oBACN,SAAS;oBACT,cAAc;oBACd,SAAS;oBACT,MAAM;iBACP,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBACrB,IAAI,YAAY,CAAC,GAAG,CAAC;wBAAE,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;oBACrF,MAAM,GAAG,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBACpD,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,UAAU,2BAA2B,CAAC,CAAC;gBACvE,gEAAgE;gBAChE,mEAAmE;gBACnE,+DAA+D;gBAC/D,+CAA+C;gBAC/C,sDAAsD;gBACtD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YACzE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,YAAY,CAAC,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,UAA2E,EAAE;IAE7E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAC;IACrD,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,SAAS,GAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC,KAAM,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC;YAC/C,QAAQ;YACR,KAAK;YACL,IAAI,EAAE,mBAAmB,CAAC,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;YAClF,SAAS;SACV,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,QAAQ;YACR,KAAK;YACL,SAAS;YACT,MAAM;YACN,SAAS;YACT,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC;QAC3E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAChF,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,9 @@ export * from "./engines/openrouter.js";
|
|
|
6
6
|
export * from "./engines/fal.js";
|
|
7
7
|
export * from "./model-routing.js";
|
|
8
8
|
export * from "./region-edit.js";
|
|
9
|
+
export * from "./suggested-models.js";
|
|
10
|
+
export * from "./check-suggested-models.js";
|
|
11
|
+
export * from "./reasoning.js";
|
|
12
|
+
export * from "./composer.js";
|
|
13
|
+
export * from "./media-analyzer.js";
|
|
9
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,4 +6,9 @@ export * from "./engines/openrouter.js";
|
|
|
6
6
|
export * from "./engines/fal.js";
|
|
7
7
|
export * from "./model-routing.js";
|
|
8
8
|
export * from "./region-edit.js";
|
|
9
|
+
export * from "./suggested-models.js";
|
|
10
|
+
export * from "./check-suggested-models.js";
|
|
11
|
+
export * from "./reasoning.js";
|
|
12
|
+
export * from "./composer.js";
|
|
13
|
+
export * from "./media-analyzer.js";
|
|
9
14
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type GenerationEngine } from "./engine.js";
|
|
2
|
+
import { type MediaAnalysisPromptLength } from "./media-analysis-prompts.js";
|
|
3
|
+
import { type ModelRoutingInput, type ModelRoutingResult } from "./model-routing.js";
|
|
4
|
+
import { type Reasoning } from "./reasoning.js";
|
|
5
|
+
import type { DroppedMedia, ModelOption } from "./types.js";
|
|
6
|
+
export interface MediaAnalyzerAttachment extends DroppedMedia {
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
export interface MediaAnalyzerSubmitPayload {
|
|
10
|
+
attachments: MediaAnalyzerAttachment[];
|
|
11
|
+
modelId: string | null;
|
|
12
|
+
/** When true, the analyzer routes among `models` at submit instead of using `modelId`. */
|
|
13
|
+
autoSelectModel: boolean;
|
|
14
|
+
/** The models offered for the attached media's kind. */
|
|
15
|
+
models: ModelOption[];
|
|
16
|
+
/** `null` until a person actually picks one — see `MediaAnalyzer`'s `promptLength` prop for why this doesn't default to "concise". */
|
|
17
|
+
promptLength: MediaAnalysisPromptLength | null;
|
|
18
|
+
}
|
|
19
|
+
export interface MediaAnalyzerOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Overrides the nearest `ChaiProvider`'s reasoning engine. With neither,
|
|
22
|
+
* a mock text engine answers, so a first render works with no key.
|
|
23
|
+
*/
|
|
24
|
+
engine?: GenerationEngine;
|
|
25
|
+
/** The model when the person hasn't picked one. Defaults to the provider's reasoning model for the media's kind. */
|
|
26
|
+
model?: string;
|
|
27
|
+
onResult?: (prompt: string) => void;
|
|
28
|
+
onError?: (message: string) => void;
|
|
29
|
+
/** Auto-select: fires with the routed model so the trigger shows it. Wire it to `MediaAnalyzer`'s `onModelChange` state. */
|
|
30
|
+
onModelChange?: (modelId: string) => void;
|
|
31
|
+
/** Replaces the routing instruction (`buildModelRoutingPrompt`). */
|
|
32
|
+
routingPrompt?: (input: ModelRoutingInput) => string;
|
|
33
|
+
/** Fires when auto-select fell back to the first listed model (no reasoning model, a failed call, or an unlisted reply). Analysis still runs. */
|
|
34
|
+
onRoutingFallback?: (result: Extract<ModelRoutingResult, {
|
|
35
|
+
status: "fallback";
|
|
36
|
+
}>) => void;
|
|
37
|
+
}
|
|
38
|
+
export interface MediaAnalyzerState {
|
|
39
|
+
analyzing: boolean;
|
|
40
|
+
error: string | null;
|
|
41
|
+
prompt: string | null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* `getOptions` is read on every call, so options can change between
|
|
45
|
+
* renders; `getProvided` is the nearest provider's reasoning, if any.
|
|
46
|
+
*/
|
|
47
|
+
export declare function createMediaAnalyzerStore(getOptions: () => MediaAnalyzerOptions, getProvided?: () => Reasoning | undefined): {
|
|
48
|
+
getState: () => MediaAnalyzerState;
|
|
49
|
+
subscribe(listener: () => void): () => undefined;
|
|
50
|
+
submit: (payload: MediaAnalyzerSubmitPayload) => void;
|
|
51
|
+
cancel: () => void;
|
|
52
|
+
reset: () => void;
|
|
53
|
+
};
|
|
54
|
+
export type MediaAnalyzerStore = ReturnType<typeof createMediaAnalyzerStore>;
|
|
55
|
+
//# sourceMappingURL=media-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-analyzer.d.ts","sourceRoot":"","sources":["../src/media-analyzer.ts"],"names":[],"mappings":"AASA,OAAO,EAA4D,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAc,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,uBAAwB,SAAQ,YAAY;IAC3D,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0FAA0F;IAC1F,eAAe,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,sIAAsI;IACtI,YAAY,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,oHAAoH;IACpH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,4HAA4H;IAC5H,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACrD,iJAAiJ;IACjJ,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,kBAAkB,EAAE;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CAC3F;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,oBAAoB,EACtC,WAAW,GAAE,MAAM,SAAS,GAAG,SAA2B;;wBAyGpC,MAAM,IAAI;sBA3FP,0BAA0B;;;EAmGpD;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
|