@mux/ai 0.1.0 → 0.1.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/dist/audio-translation.d.ts +21 -0
- package/dist/audio-translation.d.ts.map +1 -0
- package/dist/audio-translation.js +229 -0
- package/dist/audio-translation.js.map +1 -0
- package/dist/burned-in-captions.d.ts +19 -0
- package/dist/burned-in-captions.d.ts.map +1 -0
- package/dist/burned-in-captions.js +243 -0
- package/dist/burned-in-captions.js.map +1 -0
- package/dist/chapters.d.ts +18 -0
- package/dist/chapters.d.ts.map +1 -0
- package/dist/chapters.js +255 -0
- package/dist/chapters.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/moderation.d.ts +39 -0
- package/dist/moderation.d.ts.map +1 -0
- package/dist/moderation.js +341 -0
- package/dist/moderation.js.map +1 -0
- package/dist/summarization.d.ts +26 -0
- package/dist/summarization.d.ts.map +1 -0
- package/dist/summarization.js +337 -0
- package/dist/summarization.js.map +1 -0
- package/dist/translation.d.ts +22 -0
- package/dist/translation.d.ts.map +1 -0
- package/dist/translation.js +196 -0
- package/dist/translation.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/image-download.d.ts +65 -0
- package/dist/utils/image-download.d.ts.map +1 -0
- package/dist/utils/image-download.js +150 -0
- package/dist/utils/image-download.js.map +1 -0
- package/dist/utils/storyboard-processor.d.ts +40 -0
- package/dist/utils/storyboard-processor.d.ts.map +1 -0
- package/dist/utils/storyboard-processor.js +202 -0
- package/dist/utils/storyboard-processor.js.map +1 -0
- package/dist/utils/vtt-parser.d.ts +8 -0
- package/dist/utils/vtt-parser.d.ts.map +1 -0
- package/dist/utils/vtt-parser.js +43 -0
- package/dist/utils/vtt-parser.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import Mux from '@mux/mux-node';
|
|
2
|
+
import OpenAI from 'openai';
|
|
3
|
+
import { downloadImagesAsBase64 } from './utils/image-download';
|
|
4
|
+
const DEFAULT_THRESHOLDS = {
|
|
5
|
+
sexual: 0.7,
|
|
6
|
+
violence: 0.8
|
|
7
|
+
};
|
|
8
|
+
// Process promises in batches with maximum concurrency limit
|
|
9
|
+
async function processConcurrently(items, processor, maxConcurrent = 5) {
|
|
10
|
+
const results = [];
|
|
11
|
+
for (let i = 0; i < items.length; i += maxConcurrent) {
|
|
12
|
+
const batch = items.slice(i, i + maxConcurrent);
|
|
13
|
+
const batchPromises = batch.map(processor);
|
|
14
|
+
const batchResults = await Promise.all(batchPromises);
|
|
15
|
+
results.push(...batchResults);
|
|
16
|
+
}
|
|
17
|
+
return results;
|
|
18
|
+
}
|
|
19
|
+
// Mapping Hive categories to OpenAI-compatible scores
|
|
20
|
+
const HIVE_SEXUAL_CATEGORIES = [
|
|
21
|
+
'general_nsfw',
|
|
22
|
+
'general_suggestive',
|
|
23
|
+
'yes_sexual_activity',
|
|
24
|
+
'female_underwear',
|
|
25
|
+
'male_underwear',
|
|
26
|
+
'bra',
|
|
27
|
+
'panties',
|
|
28
|
+
'sex_toys',
|
|
29
|
+
'nudity_female',
|
|
30
|
+
'nudity_male',
|
|
31
|
+
'cleavage',
|
|
32
|
+
'swimwear'
|
|
33
|
+
];
|
|
34
|
+
const HIVE_VIOLENCE_CATEGORIES = [
|
|
35
|
+
'gun_in_hand',
|
|
36
|
+
'gun_not_in_hand',
|
|
37
|
+
'animated_gun',
|
|
38
|
+
'knife_in_hand',
|
|
39
|
+
'knife_not_in_hand',
|
|
40
|
+
'culinary_knife_not_in_hand',
|
|
41
|
+
'culinary_knife_in_hand',
|
|
42
|
+
'very_bloody',
|
|
43
|
+
'a_little_bloody',
|
|
44
|
+
'other_blood',
|
|
45
|
+
'hanging',
|
|
46
|
+
'noose',
|
|
47
|
+
'human_corpse',
|
|
48
|
+
'animated_corpse',
|
|
49
|
+
'emaciated_body',
|
|
50
|
+
'self_harm',
|
|
51
|
+
'animal_abuse',
|
|
52
|
+
'fights',
|
|
53
|
+
'garm_death_injury_or_military_conflict'
|
|
54
|
+
];
|
|
55
|
+
// Generates thumbnail URLs at regular intervals based on video duration
|
|
56
|
+
function getThumbnailUrls(playbackId, duration, options = {}) {
|
|
57
|
+
const { interval = 10, width = 640 } = options;
|
|
58
|
+
const timestamps = [];
|
|
59
|
+
if (duration <= 50) {
|
|
60
|
+
// Short videos: 5 evenly spaced thumbnails
|
|
61
|
+
const spacing = duration / 6;
|
|
62
|
+
for (let i = 1; i <= 5; i++) {
|
|
63
|
+
timestamps.push(Math.round(i * spacing));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Longer videos: one thumbnail every interval seconds
|
|
68
|
+
for (let time = 0; time < duration; time += interval) {
|
|
69
|
+
timestamps.push(time);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return timestamps.map((time) => `https://image.mux.com/${playbackId}/thumbnail.png?time=${time}&width=${width}`);
|
|
73
|
+
}
|
|
74
|
+
// Sends thumbnail URLs to OpenAI moderation API with concurrency limiting
|
|
75
|
+
async function requestOpenAIModeration(imageUrls, openaiClient, model, maxConcurrent = 5, submissionMode = 'url', downloadOptions) {
|
|
76
|
+
// If using base64 mode, download all images first
|
|
77
|
+
if (submissionMode === 'base64') {
|
|
78
|
+
try {
|
|
79
|
+
const downloadResults = await downloadImagesAsBase64(imageUrls, downloadOptions, maxConcurrent);
|
|
80
|
+
// Process each downloaded image through OpenAI moderation
|
|
81
|
+
const processor = async (downloadResult) => {
|
|
82
|
+
try {
|
|
83
|
+
const moderation = await openaiClient.moderations.create({
|
|
84
|
+
model,
|
|
85
|
+
input: [
|
|
86
|
+
{
|
|
87
|
+
type: "image_url",
|
|
88
|
+
image_url: {
|
|
89
|
+
url: downloadResult.base64Data, // Use base64 data URI
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
const categoryScores = moderation.results[0].category_scores;
|
|
95
|
+
return {
|
|
96
|
+
url: downloadResult.url, // Return original URL for tracking
|
|
97
|
+
sexual: categoryScores.sexual || 0,
|
|
98
|
+
violence: categoryScores.violence || 0,
|
|
99
|
+
error: false
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`Failed to moderate downloaded image ${downloadResult.url}:`, error);
|
|
104
|
+
return {
|
|
105
|
+
url: downloadResult.url,
|
|
106
|
+
sexual: 0,
|
|
107
|
+
violence: 0,
|
|
108
|
+
error: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
return processConcurrently(downloadResults, processor, maxConcurrent);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error('Failed to download images for base64 submission:', error);
|
|
116
|
+
// Return error results for all URLs
|
|
117
|
+
return imageUrls.map(url => ({
|
|
118
|
+
url,
|
|
119
|
+
sexual: 0,
|
|
120
|
+
violence: 0,
|
|
121
|
+
error: true,
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Original URL-based submission mode
|
|
126
|
+
const processor = async (url) => {
|
|
127
|
+
try {
|
|
128
|
+
const moderation = await openaiClient.moderations.create({
|
|
129
|
+
model,
|
|
130
|
+
input: [
|
|
131
|
+
{
|
|
132
|
+
type: "image_url",
|
|
133
|
+
image_url: {
|
|
134
|
+
url: url,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
});
|
|
139
|
+
const categoryScores = moderation.results[0].category_scores;
|
|
140
|
+
return {
|
|
141
|
+
url,
|
|
142
|
+
sexual: categoryScores.sexual || 0,
|
|
143
|
+
violence: categoryScores.violence || 0,
|
|
144
|
+
error: false
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
console.error("Failed to moderate image:", error);
|
|
149
|
+
return {
|
|
150
|
+
url,
|
|
151
|
+
sexual: 0,
|
|
152
|
+
violence: 0,
|
|
153
|
+
error: true,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
return processConcurrently(imageUrls, processor, maxConcurrent);
|
|
158
|
+
}
|
|
159
|
+
// Sends thumbnail URLs to Hive moderation API with concurrency limiting
|
|
160
|
+
async function requestHiveModeration(imageUrls, hiveApiKey, maxConcurrent = 5, submissionMode = 'url', downloadOptions) {
|
|
161
|
+
// If using base64 mode, download all images first and upload via multipart/form-data
|
|
162
|
+
if (submissionMode === 'base64') {
|
|
163
|
+
try {
|
|
164
|
+
const downloadResults = await downloadImagesAsBase64(imageUrls, downloadOptions, maxConcurrent);
|
|
165
|
+
// Process each downloaded image through Hive moderation via file upload
|
|
166
|
+
const processor = async (downloadResult) => {
|
|
167
|
+
try {
|
|
168
|
+
// Create form data with image buffer
|
|
169
|
+
const formData = new FormData();
|
|
170
|
+
// Create a Blob from the buffer for form data
|
|
171
|
+
const imageBlob = new Blob([downloadResult.buffer], {
|
|
172
|
+
type: downloadResult.contentType
|
|
173
|
+
});
|
|
174
|
+
// Get file extension from content type
|
|
175
|
+
const extension = downloadResult.contentType.split('/')[1] || 'png';
|
|
176
|
+
formData.append('media', imageBlob, `image.${extension}`);
|
|
177
|
+
const response = await fetch('https://api.thehive.ai/api/v2/task/sync', {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'Authorization': `Token ${hiveApiKey}`,
|
|
181
|
+
// Don't set Content-Type header - let fetch set it with boundary for multipart
|
|
182
|
+
},
|
|
183
|
+
body: formData
|
|
184
|
+
});
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
throw new Error(`Hive API error: ${response.statusText}`);
|
|
187
|
+
}
|
|
188
|
+
const hiveResult = await response.json();
|
|
189
|
+
// Extract scores from Hive response and map to OpenAI format
|
|
190
|
+
const classes = hiveResult.status?.[0]?.response?.output?.[0]?.classes || [];
|
|
191
|
+
const scoreMap = Object.fromEntries(classes.map((c) => [c.class, c.score]));
|
|
192
|
+
const sexualScores = HIVE_SEXUAL_CATEGORIES.map(category => scoreMap[category] || 0);
|
|
193
|
+
const violenceScores = HIVE_VIOLENCE_CATEGORIES.map(category => scoreMap[category] || 0);
|
|
194
|
+
return {
|
|
195
|
+
url: downloadResult.url, // Return original URL for tracking
|
|
196
|
+
sexual: Math.max(...sexualScores, 0),
|
|
197
|
+
violence: Math.max(...violenceScores, 0),
|
|
198
|
+
error: false
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.error(`Failed to moderate uploaded image ${downloadResult.url}:`, error);
|
|
203
|
+
return {
|
|
204
|
+
url: downloadResult.url,
|
|
205
|
+
sexual: 0,
|
|
206
|
+
violence: 0,
|
|
207
|
+
error: true,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
return processConcurrently(downloadResults, processor, maxConcurrent);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
console.error('Failed to download images for Hive multipart upload:', error);
|
|
215
|
+
// Return error results for all URLs
|
|
216
|
+
return imageUrls.map(url => ({
|
|
217
|
+
url,
|
|
218
|
+
sexual: 0,
|
|
219
|
+
violence: 0,
|
|
220
|
+
error: true,
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Original URL-based submission mode
|
|
225
|
+
const processor = async (url) => {
|
|
226
|
+
try {
|
|
227
|
+
const response = await fetch('https://api.thehive.ai/api/v2/task/sync', {
|
|
228
|
+
method: 'POST',
|
|
229
|
+
headers: {
|
|
230
|
+
'Authorization': `Token ${hiveApiKey}`,
|
|
231
|
+
'Content-Type': 'application/json'
|
|
232
|
+
},
|
|
233
|
+
body: JSON.stringify({ url })
|
|
234
|
+
});
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
throw new Error(`Hive API error: ${response.statusText}`);
|
|
237
|
+
}
|
|
238
|
+
const hiveResult = await response.json();
|
|
239
|
+
// Extract scores from Hive response and map to OpenAI format
|
|
240
|
+
// Hive returns scores in status[0].response.output[0].classes as array of {class, score}
|
|
241
|
+
const classes = hiveResult.status?.[0]?.response?.output?.[0]?.classes || [];
|
|
242
|
+
const scoreMap = Object.fromEntries(classes.map((c) => [c.class, c.score]));
|
|
243
|
+
const sexualScores = HIVE_SEXUAL_CATEGORIES.map(category => scoreMap[category] || 0);
|
|
244
|
+
const violenceScores = HIVE_VIOLENCE_CATEGORIES.map(category => scoreMap[category] || 0);
|
|
245
|
+
return {
|
|
246
|
+
url,
|
|
247
|
+
sexual: Math.max(...sexualScores, 0),
|
|
248
|
+
violence: Math.max(...violenceScores, 0),
|
|
249
|
+
error: false
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
console.error("Failed to moderate image with Hive:", error);
|
|
254
|
+
return {
|
|
255
|
+
url,
|
|
256
|
+
sexual: 0,
|
|
257
|
+
violence: 0,
|
|
258
|
+
error: true,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
return processConcurrently(imageUrls, processor, maxConcurrent);
|
|
263
|
+
}
|
|
264
|
+
export async function getModerationScores(assetId, options = {}) {
|
|
265
|
+
const { provider = 'openai', model = 'omni-moderation-latest', thresholds = DEFAULT_THRESHOLDS, thumbnailInterval = 10, thumbnailWidth = 640, maxConcurrent = 5, imageSubmissionMode = 'url', imageDownloadOptions, muxTokenId, muxTokenSecret, openaiApiKey, ...config } = options;
|
|
266
|
+
if (provider !== 'openai' && provider !== 'hive') {
|
|
267
|
+
throw new Error('Only OpenAI and Hive providers are currently supported');
|
|
268
|
+
}
|
|
269
|
+
// Validate required credentials
|
|
270
|
+
const muxId = muxTokenId || process.env.MUX_TOKEN_ID;
|
|
271
|
+
const muxSecret = muxTokenSecret || process.env.MUX_TOKEN_SECRET;
|
|
272
|
+
const openaiKey = openaiApiKey || process.env.OPENAI_API_KEY;
|
|
273
|
+
const hiveKey = options.hiveApiKey || process.env.HIVE_API_KEY;
|
|
274
|
+
if (!muxId || !muxSecret) {
|
|
275
|
+
throw new Error('Mux credentials are required. Provide muxTokenId and muxTokenSecret in options or set MUX_TOKEN_ID and MUX_TOKEN_SECRET environment variables.');
|
|
276
|
+
}
|
|
277
|
+
if (provider === 'openai' && !openaiKey) {
|
|
278
|
+
throw new Error('OpenAI API key is required for OpenAI provider. Provide openaiApiKey in options or set OPENAI_API_KEY environment variable.');
|
|
279
|
+
}
|
|
280
|
+
if (provider === 'hive' && !hiveKey) {
|
|
281
|
+
throw new Error('Hive API key is required for Hive provider. Provide hiveApiKey in options or set HIVE_API_KEY environment variable.');
|
|
282
|
+
}
|
|
283
|
+
// Initialize clients
|
|
284
|
+
const mux = new Mux({
|
|
285
|
+
tokenId: muxId,
|
|
286
|
+
tokenSecret: muxSecret,
|
|
287
|
+
});
|
|
288
|
+
let openaiClient;
|
|
289
|
+
if (provider === 'openai') {
|
|
290
|
+
openaiClient = new OpenAI({
|
|
291
|
+
apiKey: openaiKey,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// Fetch asset data from Mux
|
|
295
|
+
let assetData;
|
|
296
|
+
try {
|
|
297
|
+
const asset = await mux.video.assets.retrieve(assetId);
|
|
298
|
+
assetData = asset;
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
throw new Error(`Failed to fetch asset from Mux: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
302
|
+
}
|
|
303
|
+
// Get playback ID - prefer public playback IDs
|
|
304
|
+
const publicPlaybackIds = assetData.playback_ids?.filter(pid => pid.policy === 'public') || [];
|
|
305
|
+
if (publicPlaybackIds.length === 0) {
|
|
306
|
+
throw new Error('No public playback IDs found for this asset. Moderation requires public playback access.');
|
|
307
|
+
}
|
|
308
|
+
const playbackId = publicPlaybackIds[0].id;
|
|
309
|
+
const duration = assetData.duration || 0;
|
|
310
|
+
// Generate thumbnail URLs
|
|
311
|
+
const thumbnailUrls = getThumbnailUrls(playbackId, duration, {
|
|
312
|
+
interval: thumbnailInterval,
|
|
313
|
+
width: thumbnailWidth
|
|
314
|
+
});
|
|
315
|
+
// Request moderation for all thumbnails
|
|
316
|
+
let thumbnailScores;
|
|
317
|
+
if (provider === 'openai') {
|
|
318
|
+
thumbnailScores = await requestOpenAIModeration(thumbnailUrls, openaiClient, model, maxConcurrent, imageSubmissionMode, imageDownloadOptions);
|
|
319
|
+
}
|
|
320
|
+
else if (provider === 'hive') {
|
|
321
|
+
thumbnailScores = await requestHiveModeration(thumbnailUrls, hiveKey, maxConcurrent, imageSubmissionMode, imageDownloadOptions);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
throw new Error('Unsupported provider');
|
|
325
|
+
}
|
|
326
|
+
// Find highest scores across all thumbnails
|
|
327
|
+
const maxSexual = Math.max(...thumbnailScores.map(s => s.sexual));
|
|
328
|
+
const maxViolence = Math.max(...thumbnailScores.map(s => s.violence));
|
|
329
|
+
const finalThresholds = { ...DEFAULT_THRESHOLDS, ...thresholds };
|
|
330
|
+
return {
|
|
331
|
+
assetId,
|
|
332
|
+
thumbnailScores,
|
|
333
|
+
maxScores: {
|
|
334
|
+
sexual: maxSexual,
|
|
335
|
+
violence: maxViolence
|
|
336
|
+
},
|
|
337
|
+
exceedsThreshold: maxSexual > finalThresholds.sexual || maxViolence > finalThresholds.violence,
|
|
338
|
+
thresholds: finalThresholds
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=moderation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moderation.js","sourceRoot":"","sources":["../src/moderation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MuxAIOptions, ToneType } from './types';
|
|
2
|
+
import { ImageDownloadOptions } from './utils/image-download';
|
|
3
|
+
export interface SummaryAndTagsResult {
|
|
4
|
+
assetId: string;
|
|
5
|
+
title: string;
|
|
6
|
+
description: string;
|
|
7
|
+
tags: string[];
|
|
8
|
+
storyboardUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SummarizationOptions extends MuxAIOptions {
|
|
11
|
+
provider?: 'openai' | 'anthropic';
|
|
12
|
+
model?: string;
|
|
13
|
+
maxSummaryLength?: number;
|
|
14
|
+
maxTags?: number;
|
|
15
|
+
customPrompt?: string;
|
|
16
|
+
tone?: ToneType;
|
|
17
|
+
includeTranscript?: boolean;
|
|
18
|
+
/** Whether to clean VTT timestamps and formatting from transcript (default: true) */
|
|
19
|
+
cleanTranscript?: boolean;
|
|
20
|
+
/** Method for submitting storyboard to AI providers (default: 'url') */
|
|
21
|
+
imageSubmissionMode?: 'url' | 'base64';
|
|
22
|
+
/** Options for image download when using base64 submission mode */
|
|
23
|
+
imageDownloadOptions?: ImageDownloadOptions;
|
|
24
|
+
}
|
|
25
|
+
export declare function getSummaryAndTags(assetId: string, promptOrOptions?: string | SummarizationOptions, options?: SummarizationOptions): Promise<SummaryAndTagsResult>;
|
|
26
|
+
//# sourceMappingURL=summarization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarization.d.ts","sourceRoot":"","sources":["../src/summarization.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAsD,MAAM,wBAAwB,CAAC;AAGlH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qFAAqF;IACrF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,mBAAmB,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvC,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAmBD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,GAAG,oBAAoB,EAC/C,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA+V/B"}
|