ultra-image-uploader 0.0.2 → 2.0.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/README.md +264 -89
- package/dist/components/ImageUploader.d.ts +20 -5
- package/dist/components/ImageUploader.d.ts.map +1 -0
- package/dist/components/ImageUploader.js +197 -17
- package/dist/components/ImageUploader.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -0
- package/dist/providers/index.d.ts +26 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +128 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/types/index.d.ts +60 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/validation.d.ts +11 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +125 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +50 -15
- package/dist/utils/imageUpload.d.ts +0 -10
- package/dist/utils/imageUpload.js +0 -31
- package/src/components/ImageUploader.tsx +0 -115
- package/src/index.ts +0 -4
- package/src/utils/imageUpload.ts +0 -56
- package/tsconfig.json +0 -17
package/README.md
CHANGED
|
@@ -1,146 +1,321 @@
|
|
|
1
1
|
# Ultra Image Uploader
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+
A modern, beautiful React image upload component with support for multiple providers.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/ultra-image-uploader)
|
|
8
|
+

|
|
9
|
+
[](https://opensource.org/licenses/MIT)
|
|
10
|
+
|
|
11
|
+
**Modern UI** • **Multiple Providers** • **5 Themes** • **Production Ready**
|
|
12
|
+
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
---
|
|
4
16
|
|
|
5
17
|
## Features
|
|
6
18
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
19
|
+
- **Beautiful UI** - Modern, clean design with smooth animations
|
|
20
|
+
- **5 Built-in Themes** - Light, Dark, Modern, Ocean, Sunset
|
|
21
|
+
- **Custom Themes** - Create your own color schemes
|
|
22
|
+
- **Multiple Providers** - ImgBB & Cloudinary support
|
|
23
|
+
- **Drag & Drop** - Intuitive file handling
|
|
24
|
+
- **Upload Progress** - Real-time progress tracking
|
|
25
|
+
- **File Validation** - Type and size validation
|
|
26
|
+
- **Auto Upload** - Optional automatic uploading
|
|
27
|
+
- **TypeScript** - Fully typed
|
|
28
|
+
- **Simple API** - Easy to use
|
|
15
29
|
|
|
16
30
|
## Installation
|
|
17
31
|
|
|
18
32
|
```bash
|
|
19
33
|
npm install ultra-image-uploader
|
|
20
|
-
# or
|
|
21
|
-
yarn add ultra-image-uploader
|
|
22
|
-
# or
|
|
23
|
-
pnpm add ultra-image-uploader
|
|
24
34
|
```
|
|
25
35
|
|
|
26
36
|
## Quick Start
|
|
27
37
|
|
|
28
|
-
### Basic Usage
|
|
29
|
-
|
|
30
38
|
```tsx
|
|
31
39
|
import { ImageUploader } from "ultra-image-uploader";
|
|
32
40
|
import { useState } from "react";
|
|
33
41
|
|
|
34
42
|
function App() {
|
|
35
|
-
const [
|
|
43
|
+
const [images, setImages] = useState<File[]>([]);
|
|
36
44
|
|
|
37
45
|
return (
|
|
38
46
|
<ImageUploader
|
|
39
|
-
images={
|
|
40
|
-
setImages={
|
|
41
|
-
|
|
42
|
-
|
|
47
|
+
images={images}
|
|
48
|
+
setImages={setImages}
|
|
49
|
+
multiple
|
|
50
|
+
theme="light"
|
|
43
51
|
/>
|
|
44
52
|
);
|
|
45
53
|
}
|
|
46
54
|
```
|
|
47
55
|
|
|
48
|
-
|
|
56
|
+
## Themes
|
|
57
|
+
|
|
58
|
+
Choose from 5 beautiful themes:
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
// Light (default)
|
|
62
|
+
<ImageUploader theme="light" images={images} setImages={setImages} />
|
|
63
|
+
|
|
64
|
+
// Dark
|
|
65
|
+
<ImageUploader theme="dark" images={images} setImages={setImages} />
|
|
66
|
+
|
|
67
|
+
// Modern (pink)
|
|
68
|
+
<ImageUploader theme="modern" images={images} setImages={setImages} />
|
|
69
|
+
|
|
70
|
+
// Ocean (cyan)
|
|
71
|
+
<ImageUploader theme="ocean" images={images} setImages={setImages} />
|
|
72
|
+
|
|
73
|
+
// Sunset (orange)
|
|
74
|
+
<ImageUploader theme="sunset" images={images} setImages={setImages} />
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Custom Theme
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
import { ImageUploader, type ThemeConfig } from "ultra-image-uploader";
|
|
81
|
+
|
|
82
|
+
const customTheme: ThemeConfig = {
|
|
83
|
+
primary: '#ff6b6b',
|
|
84
|
+
background: '#fff',
|
|
85
|
+
border: '#ddd',
|
|
86
|
+
text: '#333',
|
|
87
|
+
textSecondary: '#666',
|
|
88
|
+
error: '#e74c3c',
|
|
89
|
+
success: '#2ecc71',
|
|
90
|
+
radius: '8px',
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
<ImageUploader
|
|
94
|
+
images={images}
|
|
95
|
+
setImages={setImages}
|
|
96
|
+
theme={customTheme}
|
|
97
|
+
/>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Upload to ImgBB
|
|
49
101
|
|
|
50
102
|
```tsx
|
|
51
103
|
import { ImageUploader, uploadImagesToImageBB } from "ultra-image-uploader";
|
|
52
|
-
import { useState } from "react";
|
|
53
104
|
|
|
54
|
-
function
|
|
105
|
+
function UploadToImgBB() {
|
|
55
106
|
const [images, setImages] = useState<File[]>([]);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
const result = await uploadImagesToImageBB(
|
|
62
|
-
images,
|
|
63
|
-
"your-imgbb-api-key-here"
|
|
64
|
-
);
|
|
65
|
-
console.log("Uploaded URLs:", result.urls);
|
|
66
|
-
} catch (error) {
|
|
67
|
-
console.error("Error uploading images:", error);
|
|
68
|
-
} finally {
|
|
69
|
-
setLoading(false);
|
|
70
|
-
}
|
|
107
|
+
|
|
108
|
+
const handleUpload = async () => {
|
|
109
|
+
const result = await uploadImagesToImageBB(images, 'YOUR_API_KEY');
|
|
110
|
+
console.log('Uploaded:', result.urls);
|
|
71
111
|
};
|
|
72
112
|
|
|
73
113
|
return (
|
|
74
114
|
<div>
|
|
75
|
-
<ImageUploader
|
|
76
|
-
|
|
77
|
-
setImages={setImages}
|
|
78
|
-
mode="add"
|
|
79
|
-
multiple={true}
|
|
80
|
-
/>
|
|
81
|
-
<button
|
|
82
|
-
onClick={handleGetImageUrl}
|
|
83
|
-
disabled={loading || images.length === 0}
|
|
84
|
-
className="bg-blue-500 text-white p-2 rounded disabled:opacity-50"
|
|
85
|
-
>
|
|
86
|
-
{loading ? "Uploading..." : "Upload Images"}
|
|
87
|
-
</button>
|
|
115
|
+
<ImageUploader images={images} setImages={setImages} multiple />
|
|
116
|
+
<button onClick={handleUpload}>Upload</button>
|
|
88
117
|
</div>
|
|
89
118
|
);
|
|
90
119
|
}
|
|
91
120
|
```
|
|
92
121
|
|
|
93
|
-
##
|
|
94
|
-
|
|
95
|
-
| Prop | Type | Default | Description |
|
|
96
|
-
|------------------|--------------------------|------------|-------------|
|
|
97
|
-
| `images` | `File[]` | Required | Array of selected image files |
|
|
98
|
-
| `setImages` | `(files: File[]) => void`| Required | Function to update images array |
|
|
99
|
-
| `mode` | `"add" | "update"` | Required | Component operation mode |
|
|
100
|
-
| `defaultImages` | `string[]` | `[]` | Existing image URLs for update mode |
|
|
101
|
-
| `multiple` | `boolean` | `false` | Allow multiple file selection |
|
|
102
|
-
| `inputStyles` | `string` | `""` | Custom CSS classes for upload input |
|
|
103
|
-
| `containerStyles`| `string` | `""` | Custom CSS classes for container |
|
|
104
|
-
| `uploadText` | `string` | `"Browse files or drag & drop"` | Upload area text |
|
|
105
|
-
| `typeText` | `string` | `"PNG, JPG, JPEG, WEBP"` | Allowed file types text |
|
|
122
|
+
## Upload to Cloudinary
|
|
106
123
|
|
|
124
|
+
```tsx
|
|
125
|
+
import { ImageUploader, uploadImagesToCloudinary } from "ultra-image-uploader";
|
|
107
126
|
|
|
108
|
-
|
|
127
|
+
function UploadToCloudinary() {
|
|
128
|
+
const [images, setImages] = useState<File[]>([]);
|
|
109
129
|
|
|
110
|
-
|
|
130
|
+
const handleUpload = async () => {
|
|
131
|
+
const results = await uploadImagesToCloudinary(images, {
|
|
132
|
+
cloudName: 'your-cloud-name',
|
|
133
|
+
uploadPreset: 'your-upload-preset',
|
|
134
|
+
});
|
|
135
|
+
console.log('Uploaded:', results.map(r => r.url));
|
|
136
|
+
};
|
|
111
137
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
138
|
+
return (
|
|
139
|
+
<div>
|
|
140
|
+
<ImageUploader images={images} setImages={setImages} multiple theme="dark" />
|
|
141
|
+
<button onClick={handleUpload}>Upload</button>
|
|
142
|
+
</div>
|
|
143
|
+
);
|
|
115
144
|
}
|
|
145
|
+
```
|
|
116
146
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
147
|
+
## Auto Upload Mode
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<ImageUploader
|
|
151
|
+
images={images}
|
|
152
|
+
setImages={setImages}
|
|
153
|
+
multiple
|
|
154
|
+
autoUpload
|
|
155
|
+
uploadConfig={{
|
|
156
|
+
provider: 'imgbb',
|
|
157
|
+
config: { apiKey: 'your-api-key' },
|
|
158
|
+
}}
|
|
159
|
+
onUploadComplete={(urls) => console.log('Done!', urls)}
|
|
160
|
+
onUploadError={(error) => console.error('Error:', error)}
|
|
161
|
+
/>
|
|
121
162
|
```
|
|
122
163
|
|
|
123
|
-
##
|
|
164
|
+
## Props
|
|
124
165
|
|
|
125
|
-
|
|
166
|
+
| Prop | Type | Default | Description |
|
|
167
|
+
|------|------|---------|-------------|
|
|
168
|
+
| `images` | `File[]` | **Required** | Selected image files |
|
|
169
|
+
| `setImages` | `(files: File[]) => void` | **Required** | Update images state |
|
|
170
|
+
| `multiple` | `boolean` | `false` | Allow multiple files |
|
|
171
|
+
| `theme` | `'light' \| 'dark' \| 'modern' \| 'ocean' \| 'sunset' \| ThemeConfig` | `'light'` | Theme to use |
|
|
172
|
+
| `mode` | `'add' \| 'update'` | `'add'` | Component mode |
|
|
173
|
+
| `defaultImages` | `string[]` | `[]` | Existing image URLs |
|
|
174
|
+
| `uploadText` | `string` | `'Drop images here...'` | Upload area text |
|
|
175
|
+
| `maxSize` | `number` | `10485760` | Max file size (bytes) |
|
|
176
|
+
| `allowedTypes` | `string[]` | Image types | Allowed MIME types |
|
|
177
|
+
| `showFileSize` | `boolean` | `true` | Show file size |
|
|
178
|
+
| `dragAndDrop` | `boolean` | `true` | Enable drag-drop |
|
|
179
|
+
| `previewWidth` | `number` | `140` | Preview width (px) |
|
|
180
|
+
| `previewHeight` | `number` | `140` | Preview height (px) |
|
|
181
|
+
| `autoUpload` | `boolean` | `false` | Auto upload files |
|
|
182
|
+
| `uploadConfig` | `{ provider, config }` | `undefined` | Upload config |
|
|
183
|
+
| `onUploadComplete` | `(urls: string[]) => void` | `undefined` | Upload success callback |
|
|
184
|
+
| `onUploadError` | `(error: Error) => void` | `undefined` | Upload error callback |
|
|
185
|
+
| `className` | `string` | `''` | Extra CSS classes |
|
|
126
186
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
187
|
+
## Upload Functions
|
|
188
|
+
|
|
189
|
+
### `uploadImage(file, provider, config, options?)`
|
|
190
|
+
|
|
191
|
+
Upload a single image.
|
|
192
|
+
|
|
193
|
+
```tsx
|
|
194
|
+
import { uploadImage } from "ultra-image-uploader";
|
|
195
|
+
|
|
196
|
+
const result = await uploadImage(
|
|
197
|
+
file,
|
|
198
|
+
'imgbb',
|
|
199
|
+
{ apiKey: 'your-key' },
|
|
200
|
+
{
|
|
201
|
+
onProgress: (p) => console.log(p.percentage + '%'),
|
|
202
|
+
}
|
|
203
|
+
);
|
|
204
|
+
console.log(result.url);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### `uploadImages(files, provider, config, options?)`
|
|
208
|
+
|
|
209
|
+
Upload multiple images.
|
|
210
|
+
|
|
211
|
+
```tsx
|
|
212
|
+
const results = await uploadImages(files, 'cloudinary', {
|
|
213
|
+
cloudName: 'your-cloud',
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### `uploadImagesToImageBB(images, apiKey)`
|
|
218
|
+
|
|
219
|
+
Upload to ImgBB (shorthand).
|
|
220
|
+
|
|
221
|
+
```tsx
|
|
222
|
+
const { urls } = await uploadImagesToImageBB(images, 'api-key');
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### `uploadImagesToCloudinary(files, config, options?)`
|
|
226
|
+
|
|
227
|
+
Upload to Cloudinary (shorthand).
|
|
228
|
+
|
|
229
|
+
```tsx
|
|
230
|
+
const results = await uploadImagesToCloudinary(images, {
|
|
231
|
+
cloudName: 'your-cloud',
|
|
232
|
+
uploadPreset: 'your-preset',
|
|
233
|
+
});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Get API Keys
|
|
237
|
+
|
|
238
|
+
### ImgBB
|
|
239
|
+
1. Go to [imgbb.com/settings/api](https://imgbb.com/settings/api)
|
|
240
|
+
2. Copy your API key
|
|
241
|
+
|
|
242
|
+
### Cloudinary
|
|
243
|
+
1. Sign up at [cloudinary.com](https://cloudinary.com)
|
|
244
|
+
2. Get your cloud name from dashboard
|
|
245
|
+
3. Create upload preset (Settings → Upload)
|
|
246
|
+
|
|
247
|
+
## TypeScript
|
|
248
|
+
|
|
249
|
+
All types are exported:
|
|
250
|
+
|
|
251
|
+
```tsx
|
|
252
|
+
import type {
|
|
253
|
+
UploadProvider,
|
|
254
|
+
UploadResult,
|
|
255
|
+
ThemeConfig,
|
|
256
|
+
ImageUploaderProps,
|
|
257
|
+
FileValidationOptions,
|
|
258
|
+
// ... more
|
|
259
|
+
} from "ultra-image-uploader";
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Examples
|
|
263
|
+
|
|
264
|
+
### Profile Picture
|
|
265
|
+
|
|
266
|
+
```tsx
|
|
267
|
+
<ImageUploader
|
|
268
|
+
images={avatar}
|
|
269
|
+
setImages={setAvatar}
|
|
270
|
+
multiple={false}
|
|
271
|
+
maxSize={2 * 1024 * 1024}
|
|
272
|
+
theme="modern"
|
|
273
|
+
/>
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Product Gallery
|
|
277
|
+
|
|
278
|
+
```tsx
|
|
279
|
+
<ImageUploader
|
|
280
|
+
images={products}
|
|
281
|
+
setImages={setProducts}
|
|
282
|
+
multiple
|
|
283
|
+
mode="update"
|
|
284
|
+
defaultImages={existingImages}
|
|
285
|
+
allowedTypes={['image/jpeg', 'image/webp']}
|
|
286
|
+
theme="ocean"
|
|
287
|
+
/>
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Custom Colors
|
|
291
|
+
|
|
292
|
+
```tsx
|
|
293
|
+
<ImageUploader
|
|
294
|
+
images={images}
|
|
295
|
+
setImages={setImages}
|
|
296
|
+
theme={{
|
|
297
|
+
primary: '#00d9ff',
|
|
298
|
+
background: '#0a0a0a',
|
|
299
|
+
border: '#333',
|
|
300
|
+
text: '#fff',
|
|
301
|
+
textSecondary: '#999',
|
|
302
|
+
error: '#ff4757',
|
|
303
|
+
success: '#2ed573',
|
|
304
|
+
radius: '16px',
|
|
305
|
+
}}
|
|
306
|
+
/>
|
|
307
|
+
```
|
|
139
308
|
|
|
140
309
|
## License
|
|
141
310
|
|
|
142
311
|
MIT © Digontha Das
|
|
143
312
|
|
|
144
|
-
##
|
|
313
|
+
## Links
|
|
314
|
+
|
|
315
|
+
- [GitHub](https://github.com/digontha/ultra-image-uploader)
|
|
316
|
+
- [NPM](https://www.npmjs.com/package/ultra-image-uploader)
|
|
317
|
+
- [Issues](https://github.com/digontha/ultra-image-uploader/issues)
|
|
318
|
+
|
|
319
|
+
---
|
|
145
320
|
|
|
146
|
-
|
|
321
|
+
Made with ❤️ by [Digontha Das](https://github.com/digontha)
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
+
import type { UploadProvider, ProviderConfig, ThemeConfig } from '../types';
|
|
2
|
+
export declare const themes: Record<string, ThemeConfig>;
|
|
1
3
|
export interface ImageUploaderProps {
|
|
2
4
|
images: File[];
|
|
3
5
|
setImages: (images: File[]) => void;
|
|
4
|
-
mode
|
|
6
|
+
mode?: 'add' | 'update';
|
|
5
7
|
defaultImages?: string[];
|
|
6
8
|
multiple?: boolean;
|
|
7
|
-
|
|
8
|
-
containerStyles?: string;
|
|
9
|
+
theme?: keyof typeof themes | ThemeConfig;
|
|
9
10
|
uploadText?: string;
|
|
10
|
-
|
|
11
|
+
maxSize?: number;
|
|
12
|
+
allowedTypes?: string[];
|
|
13
|
+
showFileSize?: boolean;
|
|
14
|
+
dragAndDrop?: boolean;
|
|
15
|
+
previewWidth?: number;
|
|
16
|
+
previewHeight?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
autoUpload?: boolean;
|
|
19
|
+
uploadConfig?: {
|
|
20
|
+
provider: UploadProvider;
|
|
21
|
+
config: ProviderConfig;
|
|
22
|
+
};
|
|
23
|
+
onUploadComplete?: (urls: string[]) => void;
|
|
24
|
+
onUploadError?: (error: Error) => void;
|
|
11
25
|
}
|
|
12
|
-
export declare function ImageUploader({ images, setImages, mode, defaultImages, multiple,
|
|
26
|
+
export declare function ImageUploader({ images, setImages, mode, defaultImages, multiple, theme, uploadText, maxSize, allowedTypes, showFileSize, dragAndDrop, previewWidth, previewHeight, className, autoUpload, uploadConfig, onUploadComplete, onUploadError, }: ImageUploaderProps): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
//# sourceMappingURL=ImageUploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageUploader.d.ts","sourceRoot":"","sources":["../../src/components/ImageUploader.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5E,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAmD9C,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,OAAO,MAAM,GAAG,WAAW,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,cAAc,CAAC;QACzB,MAAM,EAAE,cAAc,CAAC;KACxB,CAAC;IACF,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAMD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,SAAS,EACT,IAAY,EACZ,aAAkB,EAClB,QAAgB,EAChB,KAAe,EACf,UAAkD,EAClD,OAA0B,EAC1B,YAAkF,EAClF,YAAmB,EACnB,WAAkB,EAClB,YAAkB,EAClB,aAAmB,EACnB,SAAc,EACd,UAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,aAAa,GACd,EAAE,kBAAkB,2CAqTpB"}
|