do-ui-design-system 1.1.17 → 1.1.19
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/do-theme/table.css +74 -28
- package/dist/molecules/Pagination/Pagination.svelte +1 -0
- package/dist/organisms/TableBasic/TableBasic.svelte +67 -35
- package/dist/organisms/TableBasic/TableBasic.svelte.d.ts +2 -2
- package/dist/organisms/TableBasic/TableBasic.svelte.d.ts.map +1 -1
- package/dist/organisms/TableBasic/TableBasic.types.d.ts +3 -0
- package/dist/organisms/TableBasic/TableBasic.types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/do-theme/table.css
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
display: flex;
|
|
4
4
|
align-items: center;
|
|
5
5
|
justify-content: space-between;
|
|
6
|
+
gap: 1rem;
|
|
6
7
|
margin-bottom: 1rem;
|
|
7
8
|
|
|
8
9
|
.do-table__header__left__tags {
|
|
9
10
|
display: flex;
|
|
11
|
+
flex-wrap: wrap;
|
|
10
12
|
align-items: center;
|
|
11
13
|
gap: 0.5rem;
|
|
12
14
|
}
|
|
@@ -22,33 +24,61 @@
|
|
|
22
24
|
gap: 0.75rem;
|
|
23
25
|
flex-wrap: wrap;
|
|
24
26
|
}
|
|
25
|
-
}
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
.do-table__partial-match {
|
|
29
|
+
position: absolute;
|
|
30
|
+
white-space: nowrap;
|
|
31
|
+
left: 4px;
|
|
32
|
+
bottom: -0.8rem;
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
font-size: 0.8rem;
|
|
36
|
+
}
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
.do-table__header__right__date-range {
|
|
39
|
+
display: flex;
|
|
40
|
+
align-items: center;
|
|
41
|
+
gap: 0.5rem;
|
|
42
|
+
flex-wrap: wrap;
|
|
43
|
+
padding: 0.5rem;
|
|
44
|
+
position: relative;
|
|
45
|
+
|
|
46
|
+
h5 {
|
|
47
|
+
margin: 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
41
50
|
|
|
42
|
-
.do-table__date-
|
|
51
|
+
.do-table__date-fields {
|
|
43
52
|
display: flex;
|
|
44
|
-
|
|
45
|
-
gap: 0.
|
|
53
|
+
align-items: center;
|
|
54
|
+
gap: 0.5rem;
|
|
55
|
+
flex-wrap: wrap;
|
|
56
|
+
position: relative;
|
|
57
|
+
|
|
58
|
+
.do-table__date-fields__field {
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-direction: column;
|
|
61
|
+
gap: 0.25rem;
|
|
62
|
+
}
|
|
46
63
|
}
|
|
47
64
|
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
.do-table__date-error {
|
|
69
|
+
position: absolute;
|
|
70
|
+
white-space: nowrap;
|
|
71
|
+
left: 10px;
|
|
72
|
+
bottom: -0.7rem;
|
|
73
|
+
font-size: 0.75rem;
|
|
74
|
+
color: red;
|
|
75
|
+
}
|
|
48
76
|
}
|
|
49
77
|
|
|
50
78
|
.do-table-wrapper {
|
|
51
79
|
overflow-x: auto;
|
|
80
|
+
border: 1px solid var(--do-table-border);
|
|
81
|
+
border-radius: 1rem;
|
|
52
82
|
}
|
|
53
83
|
|
|
54
84
|
.do-table__content {
|
|
@@ -136,6 +166,24 @@
|
|
|
136
166
|
}
|
|
137
167
|
}
|
|
138
168
|
|
|
169
|
+
.do-table__empty {
|
|
170
|
+
td {
|
|
171
|
+
text-align: center;
|
|
172
|
+
color: var(--do-table-text);
|
|
173
|
+
opacity: 0.5;
|
|
174
|
+
|
|
175
|
+
.do-table__empty__wrapper {
|
|
176
|
+
display: flex;
|
|
177
|
+
align-items: center;
|
|
178
|
+
justify-content: center;
|
|
179
|
+
border: 1px solid white;
|
|
180
|
+
margin: 10px;
|
|
181
|
+
border-radius: 10px;
|
|
182
|
+
min-height: 6rem;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
139
187
|
.do-table__content__th-filter {
|
|
140
188
|
padding: 0.2rem 0.5rem;
|
|
141
189
|
|
|
@@ -185,27 +233,25 @@
|
|
|
185
233
|
grid-template-columns: 1fr min-content;
|
|
186
234
|
align-items: center;
|
|
187
235
|
padding: 10px 16px;
|
|
188
|
-
border-top: 1px solid white;
|
|
189
236
|
gap: 16px;
|
|
190
237
|
color: inherit;
|
|
191
238
|
font-size: 1rem;
|
|
192
239
|
|
|
193
240
|
.selected-count {
|
|
194
|
-
color: #
|
|
241
|
+
color: #8a8a8a;
|
|
195
242
|
}
|
|
196
243
|
|
|
197
244
|
.sort-label strong {
|
|
198
|
-
color: #
|
|
245
|
+
color: #8a8a8a;
|
|
199
246
|
font-weight: 500;
|
|
200
247
|
}
|
|
201
|
-
}
|
|
202
248
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
font-size: 0.75rem;
|
|
209
|
-
color: red;
|
|
249
|
+
.do-table__footer__left {
|
|
250
|
+
display: flex;
|
|
251
|
+
gap: 1rem;
|
|
252
|
+
|
|
253
|
+
}
|
|
210
254
|
}
|
|
255
|
+
|
|
256
|
+
|
|
211
257
|
}
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
- `columns`: ColumnDef<T>[] - column definitions `{ key: keyof T, label: string, maxWidth?: number }` — `maxWidth` in rem
|
|
18
18
|
- `actionColumns?`: ActionColumnDef<T>[] - icon button columns `{ key: string, icon: IconNames, label?: string, showHeader?: boolean, onClick: (row: T) => void }`
|
|
19
19
|
- `tagConfig?`: `{ column: keyof T, label: string }` - enables tag filter buttons in the header
|
|
20
|
-
- `dateConfig?`: `{ columnFrom?: keyof T, columnTo?: keyof T, mode?: 'year' | 'date' }` - enables date range filter;
|
|
20
|
+
- `dateConfig?`: `{ columnFrom?: keyof T, columnTo?: keyof T, mode?: 'year' | 'date', label?: string, partialMatchLabel?: string }` - enables date range filter; when both columns are set, default filters strict range (both ends inside), partial match switch allows overlap
|
|
21
21
|
- `idKey?`: keyof T - row identifier key (default `'id'`)
|
|
22
|
-
- `headerActions?`: HeaderAction[] - `{ icon: IconNames, label: string, onClick: () => void }` - action buttons in the table header
|
|
22
|
+
- `headerActions?`: HeaderAction[] - `{ icon: IconNames, label: string, onClick: () => void, disabled?: boolean }` - action buttons in the table header
|
|
23
23
|
- `pageSize?`: number - rows per page (default `25`)
|
|
24
24
|
- `showCheckbox?`: boolean - show row selection checkboxes (default `true`)
|
|
25
25
|
- `onSelectionChange?`: `(ids: (string | number)[]) => void` - callback fired when row selection changes
|
|
@@ -77,6 +77,8 @@
|
|
|
77
77
|
const currentYear = new Date().getFullYear();
|
|
78
78
|
const years = Array.from({ length: 30 }, (_, i) => String(currentYear - i));
|
|
79
79
|
|
|
80
|
+
let partialMatch: boolean = $state(false);
|
|
81
|
+
|
|
80
82
|
const clearDates = () => {
|
|
81
83
|
dateFrom = '';
|
|
82
84
|
dateTo = '';
|
|
@@ -132,9 +134,15 @@
|
|
|
132
134
|
if (dateConfig.columnFrom && dateConfig.columnTo) {
|
|
133
135
|
const from = normalize(String(row[dateConfig.columnFrom]));
|
|
134
136
|
const to = normalize(String(row[dateConfig.columnTo]));
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
if (partialMatch) {
|
|
138
|
+
// overlap: alguna parte del rango coincide con el filtro
|
|
139
|
+
if (dateTo && from > dateTo) return false;
|
|
140
|
+
if (dateFrom && to < dateFrom) return false;
|
|
141
|
+
} else {
|
|
142
|
+
// estricto: inicio y fin deben estar dentro del rango del filtro
|
|
143
|
+
if (dateFrom && from < dateFrom) return false;
|
|
144
|
+
if (dateTo && to > dateTo) return false;
|
|
145
|
+
}
|
|
138
146
|
} else if (dateConfig.columnFrom) {
|
|
139
147
|
const from = normalize(String(row[dateConfig.columnFrom]));
|
|
140
148
|
if (dateFrom && from < dateFrom) return false;
|
|
@@ -262,42 +270,56 @@
|
|
|
262
270
|
</div>
|
|
263
271
|
{/if}
|
|
264
272
|
</div>
|
|
273
|
+
|
|
265
274
|
<div class="do-table__header__right">
|
|
266
275
|
{#if dateConfig}
|
|
267
276
|
<div class="do-table__header__right__dates">
|
|
268
277
|
<div class="do-table__header__right__date-range">
|
|
269
|
-
<h5>Rango fechas</h5>
|
|
278
|
+
<h5>{dateConfig?.label ?? 'Rango de fechas'}</h5>
|
|
270
279
|
<div class="do-table__date-fields">
|
|
271
|
-
<div class="do-table__date-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
<
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
<
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
280
|
+
<div class="do-table__date-fields">
|
|
281
|
+
<div class="do-table__date-fields__field">
|
|
282
|
+
{#if dateMode === 'year'}
|
|
283
|
+
<select bind:value={dateFrom} class="do-select">
|
|
284
|
+
<option value="">Desde</option>
|
|
285
|
+
{#each years as year}
|
|
286
|
+
<option value={year}>{year}</option>
|
|
287
|
+
{/each}
|
|
288
|
+
</select>
|
|
289
|
+
{:else}
|
|
290
|
+
<input type="date" bind:value={dateFrom} class="do-input" />
|
|
291
|
+
{/if}
|
|
292
|
+
</div>
|
|
293
|
+
|
|
294
|
+
<div class="do-table__date-fields__field">
|
|
295
|
+
{#if dateMode === 'year'}
|
|
296
|
+
<select bind:value={dateTo} class="do-select">
|
|
297
|
+
<option value="">Hasta</option>
|
|
298
|
+
{#each years as year}
|
|
299
|
+
<option value={year}>{year}</option>
|
|
300
|
+
{/each}
|
|
301
|
+
</select>
|
|
302
|
+
{:else}
|
|
303
|
+
<input type="date" bind:value={dateTo} class="do-input" />
|
|
304
|
+
{/if}
|
|
305
|
+
</div>
|
|
295
306
|
</div>
|
|
296
|
-
|
|
297
|
-
{#if dateError}
|
|
298
|
-
<span class="do-table__date-error">{dateError}</span>
|
|
299
|
-
{/if}
|
|
300
307
|
</div>
|
|
308
|
+
{#if dateConfig?.columnFrom && dateConfig?.columnTo && !dateError}
|
|
309
|
+
<label class="do-table__partial-match">
|
|
310
|
+
<input
|
|
311
|
+
type="checkbox"
|
|
312
|
+
role="switch"
|
|
313
|
+
class="do-switch"
|
|
314
|
+
bind:checked={partialMatch}
|
|
315
|
+
/>
|
|
316
|
+
<span>{dateConfig?.partialMatchLabel ?? 'Incluir coincidencias parciales'}</span>
|
|
317
|
+
</label>
|
|
318
|
+
{/if}
|
|
319
|
+
|
|
320
|
+
{#if dateError}
|
|
321
|
+
<span class="do-table__date-error">{dateError || 'Error'}</span>
|
|
322
|
+
{/if}
|
|
301
323
|
|
|
302
324
|
{#if dateFrom || dateTo}
|
|
303
325
|
<IconButton
|
|
@@ -320,6 +342,7 @@
|
|
|
320
342
|
ariaLabel={action.label}
|
|
321
343
|
label={action.label}
|
|
322
344
|
variant="do-btn-accent"
|
|
345
|
+
disabled={action.disabled}
|
|
323
346
|
onClick={action.onClick}
|
|
324
347
|
/>
|
|
325
348
|
{/each}
|
|
@@ -403,6 +426,15 @@
|
|
|
403
426
|
</thead>
|
|
404
427
|
|
|
405
428
|
<tbody>
|
|
429
|
+
{#if filtered().length === 0}
|
|
430
|
+
<tr class="do-table__empty">
|
|
431
|
+
<td colspan={columns.length + actionColumns.length + (showCheckbox ? 1 : 0)}>
|
|
432
|
+
<div class="do-table__empty__wrapper">
|
|
433
|
+
<p>No hay coincidencias</p>
|
|
434
|
+
</div>
|
|
435
|
+
</td>
|
|
436
|
+
</tr>
|
|
437
|
+
{/if}
|
|
406
438
|
{#each paginated() as row (row[idKey])}
|
|
407
439
|
{@const isSelected = selected.has(row[idKey])}
|
|
408
440
|
<tr class="do-row" class:selected={isSelected}>
|
|
@@ -452,7 +484,7 @@
|
|
|
452
484
|
{/if}
|
|
453
485
|
{#if sortKey}
|
|
454
486
|
<span class="sort-label">
|
|
455
|
-
Ordenado por
|
|
487
|
+
Ordenado por:
|
|
456
488
|
<strong>{columns.find((c) => c.key === sortKey)?.label}</strong>
|
|
457
489
|
{sortDir === 'asc' ? '↑' : '↓'}
|
|
458
490
|
</span>
|
|
@@ -30,9 +30,9 @@ type Props<T extends Record<string, any>> = {
|
|
|
30
30
|
* - `columns`: ColumnDef<T>[] - column definitions `{ key: keyof T, label: string, maxWidth?: number }` — `maxWidth` in rem
|
|
31
31
|
* - `actionColumns?`: ActionColumnDef<T>[] - icon button columns `{ key: string, icon: IconNames, label?: string, showHeader?: boolean, onClick: (row: T) => void }`
|
|
32
32
|
* - `tagConfig?`: `{ column: keyof T, label: string }` - enables tag filter buttons in the header
|
|
33
|
-
* - `dateConfig?`: `{ columnFrom?: keyof T, columnTo?: keyof T, mode?: 'year' | 'date' }` - enables date range filter;
|
|
33
|
+
* - `dateConfig?`: `{ columnFrom?: keyof T, columnTo?: keyof T, mode?: 'year' | 'date', label?: string, partialMatchLabel?: string }` - enables date range filter; when both columns are set, default filters strict range (both ends inside), partial match switch allows overlap
|
|
34
34
|
* - `idKey?`: keyof T - row identifier key (default `'id'`)
|
|
35
|
-
* - `headerActions?`: HeaderAction[] - `{ icon: IconNames, label: string, onClick: () => void }` - action buttons in the table header
|
|
35
|
+
* - `headerActions?`: HeaderAction[] - `{ icon: IconNames, label: string, onClick: () => void, disabled?: boolean }` - action buttons in the table header
|
|
36
36
|
* - `pageSize?`: number - rows per page (default `25`)
|
|
37
37
|
* - `showCheckbox?`: boolean - show row selection checkboxes (default `true`)
|
|
38
38
|
* - `onSelectionChange?`: `(ids: (string | number)[]) => void` - callback fired when row selection changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableBasic.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/organisms/TableBasic/TableBasic.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,EACf,SAAS,EAET,MAAM,uBAAuB,CAAC;AAG/B,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IAC3C,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAChB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;CACvD,CAAC;
|
|
1
|
+
{"version":3,"file":"TableBasic.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/organisms/TableBasic/TableBasic.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,eAAe,EACf,SAAS,EAET,MAAM,uBAAuB,CAAC;AAG/B,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IAC3C,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAChB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;CACvD,CAAC;AAsYH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,QAAA,MAAM,UAAU,gDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -9,11 +9,14 @@ export type DateConfig<T> = {
|
|
|
9
9
|
columnFrom?: keyof T;
|
|
10
10
|
columnTo?: keyof T;
|
|
11
11
|
mode?: DateMode;
|
|
12
|
+
label?: string;
|
|
13
|
+
partialMatchLabel?: string;
|
|
12
14
|
};
|
|
13
15
|
export type HeaderAction = {
|
|
14
16
|
icon: IconNames;
|
|
15
17
|
label: string;
|
|
16
18
|
onClick: () => void;
|
|
19
|
+
disabled?: boolean;
|
|
17
20
|
};
|
|
18
21
|
export type ActionColumnDef<T> = {
|
|
19
22
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableBasic.types.d.ts","sourceRoot":"","sources":["../../../src/lib/organisms/TableBasic/TableBasic.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;AAClD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACvB,MAAM,EAAE,MAAM,CAAC,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"TableBasic.types.d.ts","sourceRoot":"","sources":["../../../src/lib/organisms/TableBasic/TableBasic.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;AAClD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACvB,MAAM,EAAE,MAAM,CAAC,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACvB,GAAG,EAAE,MAAM,CAAC,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IACpD,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAChB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;CAC1D,CAAC"}
|