@yuuvis/client-components 3.0.0-beta.21.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.
Files changed (47) hide show
  1. package/README.md +3 -0
  2. package/autocomplete/README.md +3 -0
  3. package/common/README.md +3 -0
  4. package/datepicker/README.md +3 -0
  5. package/fesm2022/yuuvis-client-components-autocomplete.mjs +236 -0
  6. package/fesm2022/yuuvis-client-components-autocomplete.mjs.map +1 -0
  7. package/fesm2022/yuuvis-client-components-common.mjs +1724 -0
  8. package/fesm2022/yuuvis-client-components-common.mjs.map +1 -0
  9. package/fesm2022/yuuvis-client-components-datepicker.mjs +456 -0
  10. package/fesm2022/yuuvis-client-components-datepicker.mjs.map +1 -0
  11. package/fesm2022/yuuvis-client-components-list.mjs +666 -0
  12. package/fesm2022/yuuvis-client-components-list.mjs.map +1 -0
  13. package/fesm2022/yuuvis-client-components-master-details.mjs +136 -0
  14. package/fesm2022/yuuvis-client-components-master-details.mjs.map +1 -0
  15. package/fesm2022/yuuvis-client-components-overflow-hidden.mjs +109 -0
  16. package/fesm2022/yuuvis-client-components-overflow-hidden.mjs.map +1 -0
  17. package/fesm2022/yuuvis-client-components-overflow-menu.mjs +171 -0
  18. package/fesm2022/yuuvis-client-components-overflow-menu.mjs.map +1 -0
  19. package/fesm2022/yuuvis-client-components-popout.mjs +240 -0
  20. package/fesm2022/yuuvis-client-components-popout.mjs.map +1 -0
  21. package/fesm2022/yuuvis-client-components-split-view.mjs +317 -0
  22. package/fesm2022/yuuvis-client-components-split-view.mjs.map +1 -0
  23. package/fesm2022/yuuvis-client-components-widget-grid.mjs +933 -0
  24. package/fesm2022/yuuvis-client-components-widget-grid.mjs.map +1 -0
  25. package/fesm2022/yuuvis-client-components.mjs +18 -0
  26. package/fesm2022/yuuvis-client-components.mjs.map +1 -0
  27. package/lib/assets/i18n/de.json +56 -0
  28. package/lib/assets/i18n/en.json +56 -0
  29. package/list/README.md +3 -0
  30. package/master-details/README.md +3 -0
  31. package/overflow-hidden/README.md +3 -0
  32. package/overflow-menu/README.md +3 -0
  33. package/package.json +67 -0
  34. package/popout/README.md +3 -0
  35. package/split-view/README.md +3 -0
  36. package/types/yuuvis-client-components-autocomplete.d.ts +89 -0
  37. package/types/yuuvis-client-components-common.d.ts +536 -0
  38. package/types/yuuvis-client-components-datepicker.d.ts +94 -0
  39. package/types/yuuvis-client-components-list.d.ts +380 -0
  40. package/types/yuuvis-client-components-master-details.d.ts +69 -0
  41. package/types/yuuvis-client-components-overflow-hidden.d.ts +72 -0
  42. package/types/yuuvis-client-components-overflow-menu.d.ts +89 -0
  43. package/types/yuuvis-client-components-popout.d.ts +106 -0
  44. package/types/yuuvis-client-components-split-view.d.ts +197 -0
  45. package/types/yuuvis-client-components-widget-grid.d.ts +299 -0
  46. package/types/yuuvis-client-components.d.ts +8 -0
  47. package/widget-grid/README.md +48 -0
@@ -0,0 +1,317 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, TemplateRef, input, linkedSignal, Directive, ElementRef, effect, contentChildren, viewChild, computed, output, signal, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import { LayoutSettingsService } from '@yuuvis/client-components/common';
6
+ import * as i2 from 'angular-split';
7
+ import { SplitComponent, AngularSplitModule } from 'angular-split';
8
+
9
+ class SplitAreaDirective {
10
+ template = inject((TemplateRef));
11
+ size = input(...(ngDevMode ? [undefined, { debugName: "size" }] : /* istanbul ignore next */ []));
12
+ minSize = input(...(ngDevMode ? [undefined, { debugName: "minSize" }] : /* istanbul ignore next */ []));
13
+ maxSize = input(...(ngDevMode ? [undefined, { debugName: "maxSize" }] : /* istanbul ignore next */ []));
14
+ panelClass = input(...(ngDevMode ? [undefined, { debugName: "panelClass" }] : /* istanbul ignore next */ []));
15
+ visible = input(true, ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
16
+ lockSize = input(false, ...(ngDevMode ? [{ debugName: "lockSize" }] : /* istanbul ignore next */ []));
17
+ areaProperties = linkedSignal({ ...(ngDevMode ? { debugName: "areaProperties" } : /* istanbul ignore next */ {}), source: () => ({ size: this.size(), visible: this.visible(), lockSize: this.lockSize() }),
18
+ computation: ({ size, visible, lockSize }) => ({ size, visible, lockSize }) });
19
+ updateSettings(s) {
20
+ this.areaProperties.set({
21
+ size: s.size || this.size(),
22
+ visible: s.visible !== undefined ? !!s.visible : this.visible(),
23
+ lockSize: s.lockSize || this.lockSize()
24
+ });
25
+ }
26
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SplitAreaDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
27
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: SplitAreaDirective, isStandalone: true, selector: "[yuvSplitArea]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, maxSize: { classPropertyName: "maxSize", publicName: "maxSize", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, lockSize: { classPropertyName: "lockSize", publicName: "lockSize", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SplitAreaDirective, decorators: [{
30
+ type: Directive,
31
+ args: [{
32
+ selector: '[yuvSplitArea]'
33
+ }]
34
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], maxSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSize", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], lockSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "lockSize", required: false }] }] } });
35
+
36
+ /**
37
+ * Directive to add a cover overlay to a split area during dragging.
38
+ * This is useful when the split area contains elements like iframes
39
+ * that can capture drag events and interfere with the split view's
40
+ * dragging functionality.
41
+ * The overlay will be transparent and therefore not recognized by
42
+ * the user, but will capture the drag events.
43
+ */
44
+ class SplitAreaCoverDirective {
45
+ #elRef = inject(ElementRef);
46
+ yuvSplitAreaCover = input(false, ...(ngDevMode ? [{ debugName: "yuvSplitAreaCover" }] : /* istanbul ignore next */ []));
47
+ #draggingEffect = effect(() => {
48
+ this.#toggleCover(this.yuvSplitAreaCover());
49
+ }, ...(ngDevMode ? [{ debugName: "#draggingEffect" }] : /* istanbul ignore next */ []));
50
+ #coverElement;
51
+ #toggleCover(active) {
52
+ const el = this.#elRef.nativeElement;
53
+ if (this.#coverElement) {
54
+ el.style.position = 'initial';
55
+ this.#coverElement.remove();
56
+ this.#coverElement = undefined;
57
+ }
58
+ if (active) {
59
+ el.style.position = 'relative';
60
+ this.#coverElement = this.#createCoverElement();
61
+ el.append(this.#coverElement);
62
+ }
63
+ }
64
+ #createCoverElement() {
65
+ const coverElement = document.createElement('div');
66
+ coverElement.classList.add('yuv-split-area-cover');
67
+ coverElement.style.position = 'absolute';
68
+ coverElement.style.zIndex = '500';
69
+ coverElement.style.inset = '0';
70
+ return coverElement;
71
+ }
72
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SplitAreaCoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
73
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: SplitAreaCoverDirective, isStandalone: true, selector: "[yuvSplitAreaCover]", inputs: { yuvSplitAreaCover: { classPropertyName: "yuvSplitAreaCover", publicName: "yuvSplitAreaCover", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SplitAreaCoverDirective, decorators: [{
76
+ type: Directive,
77
+ args: [{
78
+ selector: '[yuvSplitAreaCover]'
79
+ }]
80
+ }], propDecorators: { yuvSplitAreaCover: [{ type: i0.Input, args: [{ isSignal: true, alias: "yuvSplitAreaCover", required: false }] }] } });
81
+
82
+ /**
83
+ * Component for creating a split view with resizable areas.
84
+ *
85
+ * Each area is defined using the `yuvSplitArea` directive on an `ng-template`.
86
+ * Areas can be resized by dragging the gutter between them.
87
+ *
88
+ * ### Basic usage
89
+ * ```html
90
+ * <yuv-split-view>
91
+ * <ng-template yuvSplitArea [size]="20">Aside</ng-template>
92
+ * <ng-template yuvSplitArea [size]="80">Main</ng-template>
93
+ * </yuv-split-view>
94
+ * ```
95
+ *
96
+ * ### Collapsible areas
97
+ * Areas can be shown, hidden, or toggled programmatically. Use a template
98
+ * reference variable to call the visibility methods from the template:
99
+ *
100
+ * ```html
101
+ * <yuv-split-view #sv>
102
+ * <ng-template yuvSplitArea [size]="25">
103
+ * <button (click)="sv.hideArea(0)">Collapse</button>
104
+ * Left pane
105
+ * </ng-template>
106
+ * <ng-template yuvSplitArea [size]="75">
107
+ * <button (click)="sv.showArea(0)">Expand left</button>
108
+ * Main pane
109
+ * </ng-template>
110
+ * </yuv-split-view>
111
+ * ```
112
+ *
113
+ * ### Persisting layout state
114
+ * Set `layoutSettingsID` to persist area sizes and visibility to
115
+ * localStorage. The saved state is automatically restored on init.
116
+ *
117
+ * ```html
118
+ * <yuv-split-view [layoutSettingsID]="'my-layout'">
119
+ * ...
120
+ * </yuv-split-view>
121
+ * ```
122
+ */
123
+ class SplitViewComponent {
124
+ #layoutSettings = inject(LayoutSettingsService);
125
+ splitAreas = contentChildren(SplitAreaDirective, ...(ngDevMode ? [{ debugName: "splitAreas" }] : /* istanbul ignore next */ []));
126
+ asSplitComponent = viewChild.required(SplitComponent);
127
+ splitAreaSizes = [];
128
+ /**
129
+ * The split views direction. Could be 'horizontal' or 'vertical'. Defaults to 'horizontal'.
130
+ */
131
+ direction = input('horizontal', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
132
+ isVertical = computed(() => this.direction() === 'vertical', ...(ngDevMode ? [{ debugName: "isVertical" }] : /* istanbul ignore next */ []));
133
+ isHorizontal = computed(() => this.direction() === 'horizontal', ...(ngDevMode ? [{ debugName: "isHorizontal" }] : /* istanbul ignore next */ []));
134
+ /**
135
+ * Size of the gutter in Pixel (defaults to 16).
136
+ */
137
+ gutterSize = input(16, ...(ngDevMode ? [{ debugName: "gutterSize" }] : /* istanbul ignore next */ []));
138
+ /**
139
+ * If true, the gutter can only be moved in steps of 1%.
140
+ */
141
+ restrictMove = input(false, ...(ngDevMode ? [{ debugName: "restrictMove" }] : /* istanbul ignore next */ []));
142
+ /**
143
+ * Disable the dragging feature (remove cursor/image on gutters).
144
+ */
145
+ disabledInput = input(false, { ...(ngDevMode ? { debugName: "disabledInput" } : /* istanbul ignore next */ {}), alias: 'disabled' });
146
+ disabled = linkedSignal(() => this.disabledInput(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
147
+ /**
148
+ * Layout settings are the state of the split view that could be persisted.
149
+ * Setting a `layoutSettingsID` will save the current state (split area sizes etc.)
150
+ * to the local storage. If the component is created, it will load those settings and
151
+ * re-apply them.
152
+ */
153
+ layoutSettingsID = input(...(ngDevMode ? [undefined, { debugName: "layoutSettingsID" }] : /* istanbul ignore next */ []));
154
+ /**
155
+ * Emitted when the state (split area sizes etc.) of the split view changed.
156
+ */
157
+ layoutSettingsChange = output();
158
+ /**
159
+ * Emitted when dragging the split gutter starts
160
+ */
161
+ dragStart = output();
162
+ /**
163
+ * Emitted when dragging the split gutter ends
164
+ */
165
+ dragEnd = output();
166
+ /**
167
+ * Emitted when the split gutter is clicked.
168
+ */
169
+ gutterClick = output();
170
+ /**
171
+ * Emitted when the split gutter is double clicked (you may also want to
172
+ * set a different click duration indicating a double click). This could be
173
+ * set using the `gutterDblClickDuration` to a value in milliseconds (default is 400ms)
174
+ */
175
+ gutterDblClick = output();
176
+ dragging = signal(false, ...(ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []));
177
+ onDragStart(e) {
178
+ this.dragging.set(true);
179
+ this.dragStart.emit(e);
180
+ }
181
+ onDragEnd(e) {
182
+ this.dragging.set(false);
183
+ this.splitAreas().forEach((splitArea, index) => {
184
+ splitArea.areaProperties.update((s) => ({ ...s, size: e.sizes[index] }));
185
+ });
186
+ this.#updateLayoutSettings(e.sizes);
187
+ this.dragEnd.emit(e);
188
+ }
189
+ /**
190
+ * Show a previously hidden split area, restoring it to its last known size.
191
+ *
192
+ * ```html
193
+ * <button (click)="sv.showArea(0)">Show left pane</button>
194
+ * ```
195
+ * @param index Zero-based index of the split area to show
196
+ */
197
+ showArea(index) {
198
+ this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: true }));
199
+ }
200
+ /**
201
+ * Hide a split area by collapsing it to zero width/height. The adjacent
202
+ * areas will expand to fill the freed space.
203
+ *
204
+ * ```html
205
+ * <button (click)="sv.hideArea(0)">Hide left pane</button>
206
+ * ```
207
+ * @param index Zero-based index of the split area to hide
208
+ */
209
+ hideArea(index) {
210
+ this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: false }));
211
+ }
212
+ /**
213
+ * Toggle the visibility of a split area. If the area is currently visible
214
+ * it will be collapsed; if it is hidden it will be restored.
215
+ *
216
+ * ```html
217
+ * <button (click)="sv.toggleArea(0)">Toggle left pane</button>
218
+ * ```
219
+ * @param index Zero-based index of the split area to toggle
220
+ */
221
+ toggleArea(index) {
222
+ this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: !s.visible }));
223
+ }
224
+ /**
225
+ * Returns whether a split area is currently visible. Useful for
226
+ * conditionally rendering expand/collapse buttons in the template.
227
+ *
228
+ * ```html
229
+ * @if (!sv.isAreaVisible(0)) {
230
+ * <button (click)="sv.showArea(0)">Expand left</button>
231
+ * }
232
+ * ```
233
+ * @param index Zero-based index of the split area to check
234
+ * @returns `true` if the area is visible, `false` if hidden
235
+ */
236
+ isAreaVisible(index) {
237
+ return this.splitAreas()[index].areaProperties().visible;
238
+ }
239
+ /** @deprecated Use `showArea()` / `hideArea()` instead */
240
+ splitAreaSetVisibility(index, visible) {
241
+ this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible }));
242
+ }
243
+ /** @deprecated Use `toggleArea()` instead */
244
+ splitAreaToggleVisibility(index) {
245
+ this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: !s.visible }));
246
+ }
247
+ #updateLayoutSettings(sizes) {
248
+ this.splitAreaSizes = sizes;
249
+ const layoutSettings = {
250
+ disabled: this.disabled(),
251
+ areas: this.splitAreas().map((a, idx) => ({
252
+ visible: a.visible(),
253
+ size: sizes[idx]
254
+ }))
255
+ };
256
+ this.layoutSettingsChange.emit(layoutSettings);
257
+ // save layout settings if persistence is enabled
258
+ const lsid = this.layoutSettingsID();
259
+ if (lsid) {
260
+ this.#layoutSettings.saveSettings(lsid, layoutSettings);
261
+ }
262
+ }
263
+ /**
264
+ * Programmatically apply layout settings (area sizes, visibility, disabled state).
265
+ * This is called automatically on init when `layoutSettingsID` is set, but can
266
+ * also be used to restore a specific layout configuration at any time.
267
+ * @param settings The layout settings to apply
268
+ */
269
+ applyLayoutSettings(settings) {
270
+ if (!this.#isLayoutSettingsObject(settings))
271
+ return;
272
+ this.disabled.set(!!settings.disabled);
273
+ this.splitAreaSizes = settings.areas.map((a) => a.size);
274
+ settings.areas.forEach((a, index) => {
275
+ this.splitAreas()[index].updateSettings(a);
276
+ });
277
+ }
278
+ #isLayoutSettingsObject(v) {
279
+ return v && 'disabled' in v && 'areas' in v;
280
+ }
281
+ ngAfterViewInit() {
282
+ // try to load layout settings if persistence is enabled
283
+ const lsid = this.layoutSettingsID();
284
+ if (lsid) {
285
+ this.applyLayoutSettings(this.#layoutSettings.getSettings(lsid));
286
+ }
287
+ }
288
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SplitViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
289
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SplitViewComponent, isStandalone: true, selector: "yuv-split-view", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, gutterSize: { classPropertyName: "gutterSize", publicName: "gutterSize", isSignal: true, isRequired: false, transformFunction: null }, restrictMove: { classPropertyName: "restrictMove", publicName: "restrictMove", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, layoutSettingsID: { classPropertyName: "layoutSettingsID", publicName: "layoutSettingsID", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { layoutSettingsChange: "layoutSettingsChange", dragStart: "dragStart", dragEnd: "dragEnd", gutterClick: "gutterClick", gutterDblClick: "gutterDblClick" }, host: { attributes: { "attr.data-gutter-size": "gutterSize()", "class.dragging": "dragging()" } }, queries: [{ propertyName: "splitAreas", predicate: SplitAreaDirective, isSignal: true }], viewQueries: [{ propertyName: "asSplitComponent", first: true, predicate: SplitComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<as-split\n [direction]=\"direction()\"\n [unit]=\"'percent'\"\n [gutterSize]=\"gutterSize()\"\n [gutterStep]=\"1\"\n [restrictMove]=\"restrictMove()\"\n [useTransition]=\"false\"\n [disabled]=\"disabled()\"\n (dragEnd)=\"onDragEnd($event)\"\n (dragStart)=\"onDragStart($event)\"\n (gutterDblClick)=\"gutterDblClick.emit($event)\"\n (gutterClick)=\"gutterClick.emit($event)\"\n>\n @if (gutterSize() === 1) {\n <div *asSplitGutter=\"let isDragged = isDragged\" class=\"shade-gutter\" [class.dragged]=\"isDragged\">\n <div class=\"shade-gutter-icon\" [class.vertical]=\"isVertical()\" [class.horizontal]=\"isHorizontal()\"></div>\n </div>\n } @else {\n <div *asSplitGutter class=\"split-gutter\">\n <div asSplitGutterDragHandle class=\"split-gutter-handle\" [class.vertical]=\"isVertical()\" [class.horizontal]=\"isHorizontal()\"></div>\n </div>\n }\n\n @for (a of splitAreas(); track a; let i = $index) {\n <as-split-area\n [yuvSplitAreaCover]=\"dragging()\"\n class=\"yuv-split-area {{ a.panelClass() }}\"\n [maxSize]=\"a.maxSize()\"\n [minSize]=\"a.minSize()\"\n [lockSize]=\"a.areaProperties().lockSize\"\n [size]=\"a.areaProperties().size\"\n [visible]=\"a.areaProperties().visible\"\n ><ng-template [ngTemplateOutlet]=\"a.template\"></ng-template\n ></as-split-area>\n }\n</as-split>\n", styles: [":host{--_split-gutter-background-color: var(--split-gutter-background-color, transparent);--_split-gutter-handle-border-radius: var(--split-gutter-handle-border-radius, 2px);--_split-gutter-handle-width: var(--split-gutter-handle-width, 2px);--_split-gutter-handle-height: var(--split-gutter-handle-height, var(--ymt-spacing-3xl));--_split-gutter-shade-background: var(--split-gutter-shade-background, var(--ymt-outline-variant));--_split-gutter-shade-hover-background: var(--split-gutter-shade-hover-background, currentColor);--_split-gutter-shade-size: var(--split-gutter-shade-size, 16px);overflow:hidden}:host as-split{--as-gutter-background-color: var(--_split-gutter-background-color)}:host .split-gutter{width:100%;height:100%}:host .split-gutter .split-gutter-handle{width:100%;height:100%;display:flex;align-items:center;justify-content:center}:host .split-gutter .split-gutter-handle:after{content:\"\";transition:background-color .3s ease-in-out;background-color:rgb(from var(--ymt-text-color) r g b/.2);display:block;width:var(--_split-gutter-handle-width);height:var(--_split-gutter-handle-height);border-radius:var(--_split-gutter-handle-border-radius)}:host .split-gutter .split-gutter-handle.vertical:after{width:var(--_split-gutter-handle-height);height:var(--_split-gutter-handle-width)}:host .split-gutter:hover .split-gutter-handle:after{background-color:rgb(from var(--ymt-text-color) r g b/.9)}:host .shade-gutter{width:100%;height:100%;background-color:var(--_split-gutter-shade-background);position:relative}:host .shade-gutter-icon{height:100%;width:100%;background-color:var(--_split-gutter-shade-hover-background);transition:opacity .3s;opacity:0;position:absolute;z-index:500}.dragged :host .shade-gutter-icon,:host .shade-gutter-icon:hover{opacity:.1}:host .shade-gutter-icon.horizontal{width:calc(var(--_split-gutter-shade-size) + 1px);inset-inline-start:calc(var(--_split-gutter-shade-size) / -2);inset-inline-end:var(--_split-gutter-shade-size)}:host .shade-gutter-icon.vertical{height:calc(var(--_split-gutter-shade-size) + 1px);inset-block-start:calc(var(--_split-gutter-shade-size) / -2);inset-block-end:var(--_split-gutter-shade-size)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i2.SplitComponent, selector: "as-split", inputs: ["gutterSize", "gutterStep", "disabled", "gutterClickDeltaPx", "direction", "dir", "unit", "gutterAriaLabel", "restrictMove", "useTransition", "gutterDblClickDuration"], outputs: ["gutterClick", "gutterDblClick", "dragStart", "dragEnd", "transitionEnd"], exportAs: ["asSplit"] }, { kind: "component", type: i2.SplitAreaComponent, selector: "as-split-area", inputs: ["size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "directive", type: i2.SplitGutterDirective, selector: "[asSplitGutter]" }, { kind: "directive", type: i2.SplitGutterDragHandleDirective, selector: "[asSplitGutterDragHandle]" }, { kind: "directive", type: SplitAreaCoverDirective, selector: "[yuvSplitAreaCover]", inputs: ["yuvSplitAreaCover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
290
+ }
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SplitViewComponent, decorators: [{
292
+ type: Component,
293
+ args: [{ selector: 'yuv-split-view', imports: [CommonModule, AngularSplitModule, SplitAreaCoverDirective], changeDetection: ChangeDetectionStrategy.OnPush, host: {
294
+ 'attr.data-gutter-size': 'gutterSize()',
295
+ 'class.dragging': 'dragging()'
296
+ }, template: "<as-split\n [direction]=\"direction()\"\n [unit]=\"'percent'\"\n [gutterSize]=\"gutterSize()\"\n [gutterStep]=\"1\"\n [restrictMove]=\"restrictMove()\"\n [useTransition]=\"false\"\n [disabled]=\"disabled()\"\n (dragEnd)=\"onDragEnd($event)\"\n (dragStart)=\"onDragStart($event)\"\n (gutterDblClick)=\"gutterDblClick.emit($event)\"\n (gutterClick)=\"gutterClick.emit($event)\"\n>\n @if (gutterSize() === 1) {\n <div *asSplitGutter=\"let isDragged = isDragged\" class=\"shade-gutter\" [class.dragged]=\"isDragged\">\n <div class=\"shade-gutter-icon\" [class.vertical]=\"isVertical()\" [class.horizontal]=\"isHorizontal()\"></div>\n </div>\n } @else {\n <div *asSplitGutter class=\"split-gutter\">\n <div asSplitGutterDragHandle class=\"split-gutter-handle\" [class.vertical]=\"isVertical()\" [class.horizontal]=\"isHorizontal()\"></div>\n </div>\n }\n\n @for (a of splitAreas(); track a; let i = $index) {\n <as-split-area\n [yuvSplitAreaCover]=\"dragging()\"\n class=\"yuv-split-area {{ a.panelClass() }}\"\n [maxSize]=\"a.maxSize()\"\n [minSize]=\"a.minSize()\"\n [lockSize]=\"a.areaProperties().lockSize\"\n [size]=\"a.areaProperties().size\"\n [visible]=\"a.areaProperties().visible\"\n ><ng-template [ngTemplateOutlet]=\"a.template\"></ng-template\n ></as-split-area>\n }\n</as-split>\n", styles: [":host{--_split-gutter-background-color: var(--split-gutter-background-color, transparent);--_split-gutter-handle-border-radius: var(--split-gutter-handle-border-radius, 2px);--_split-gutter-handle-width: var(--split-gutter-handle-width, 2px);--_split-gutter-handle-height: var(--split-gutter-handle-height, var(--ymt-spacing-3xl));--_split-gutter-shade-background: var(--split-gutter-shade-background, var(--ymt-outline-variant));--_split-gutter-shade-hover-background: var(--split-gutter-shade-hover-background, currentColor);--_split-gutter-shade-size: var(--split-gutter-shade-size, 16px);overflow:hidden}:host as-split{--as-gutter-background-color: var(--_split-gutter-background-color)}:host .split-gutter{width:100%;height:100%}:host .split-gutter .split-gutter-handle{width:100%;height:100%;display:flex;align-items:center;justify-content:center}:host .split-gutter .split-gutter-handle:after{content:\"\";transition:background-color .3s ease-in-out;background-color:rgb(from var(--ymt-text-color) r g b/.2);display:block;width:var(--_split-gutter-handle-width);height:var(--_split-gutter-handle-height);border-radius:var(--_split-gutter-handle-border-radius)}:host .split-gutter .split-gutter-handle.vertical:after{width:var(--_split-gutter-handle-height);height:var(--_split-gutter-handle-width)}:host .split-gutter:hover .split-gutter-handle:after{background-color:rgb(from var(--ymt-text-color) r g b/.9)}:host .shade-gutter{width:100%;height:100%;background-color:var(--_split-gutter-shade-background);position:relative}:host .shade-gutter-icon{height:100%;width:100%;background-color:var(--_split-gutter-shade-hover-background);transition:opacity .3s;opacity:0;position:absolute;z-index:500}.dragged :host .shade-gutter-icon,:host .shade-gutter-icon:hover{opacity:.1}:host .shade-gutter-icon.horizontal{width:calc(var(--_split-gutter-shade-size) + 1px);inset-inline-start:calc(var(--_split-gutter-shade-size) / -2);inset-inline-end:var(--_split-gutter-shade-size)}:host .shade-gutter-icon.vertical{height:calc(var(--_split-gutter-shade-size) + 1px);inset-block-start:calc(var(--_split-gutter-shade-size) / -2);inset-block-end:var(--_split-gutter-shade-size)}\n"] }]
297
+ }], propDecorators: { splitAreas: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SplitAreaDirective), { isSignal: true }] }], asSplitComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SplitComponent), { isSignal: true }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], gutterSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutterSize", required: false }] }], restrictMove: [{ type: i0.Input, args: [{ isSignal: true, alias: "restrictMove", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], layoutSettingsID: [{ type: i0.Input, args: [{ isSignal: true, alias: "layoutSettingsID", required: false }] }], layoutSettingsChange: [{ type: i0.Output, args: ["layoutSettingsChange"] }], dragStart: [{ type: i0.Output, args: ["dragStart"] }], dragEnd: [{ type: i0.Output, args: ["dragEnd"] }], gutterClick: [{ type: i0.Output, args: ["gutterClick"] }], gutterDblClick: [{ type: i0.Output, args: ["gutterDblClick"] }] } });
298
+
299
+ class YuvSplitViewModule {
300
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: YuvSplitViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
301
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: YuvSplitViewModule, imports: [SplitAreaDirective, SplitViewComponent], exports: [SplitAreaDirective, SplitViewComponent] });
302
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: YuvSplitViewModule, imports: [SplitViewComponent] });
303
+ }
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: YuvSplitViewModule, decorators: [{
305
+ type: NgModule,
306
+ args: [{
307
+ imports: [SplitAreaDirective, SplitViewComponent],
308
+ exports: [SplitAreaDirective, SplitViewComponent]
309
+ }]
310
+ }] });
311
+
312
+ /**
313
+ * Generated bundle index. Do not edit.
314
+ */
315
+
316
+ export { SplitAreaDirective, SplitViewComponent, YuvSplitViewModule };
317
+ //# sourceMappingURL=yuuvis-client-components-split-view.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yuuvis-client-components-split-view.mjs","sources":["../../../../../libs/yuuvis/client-components/split-view/src/lib/split-area.directive.ts","../../../../../libs/yuuvis/client-components/split-view/src/lib/split-area-cover.directive.ts","../../../../../libs/yuuvis/client-components/split-view/src/lib/split-view.component.ts","../../../../../libs/yuuvis/client-components/split-view/src/lib/split-view.component.html","../../../../../libs/yuuvis/client-components/split-view/src/lib/split-view.module.ts","../../../../../libs/yuuvis/client-components/split-view/src/yuuvis-client-components-split-view.ts"],"sourcesContent":["import { Directive, effect, inject, input, linkedSignal, signal, TemplateRef, untracked } from '@angular/core';\nimport { SplitAreaLayoutSettings } from './split-view.interface';\nimport { SplitAreaSize } from 'angular-split';\n\n@Directive({\n selector: '[yuvSplitArea]'\n})\nexport class SplitAreaDirective {\n template = inject(TemplateRef<any>);\n\n size = input<SplitAreaSize>();\n minSize = input<number>();\n maxSize = input<number>();\n panelClass = input<string>();\n visible = input<boolean>(true);\n lockSize = input<boolean>(false);\n\n areaProperties = linkedSignal({\n source: () => ({ size: this.size(), visible: this.visible(), lockSize: this.lockSize() }),\n computation: ({ size, visible, lockSize }) => ({ size, visible, lockSize })\n });\n\n updateSettings(s: SplitAreaLayoutSettings) {\n this.areaProperties.set({\n size: s.size || this.size(),\n visible: s.visible !== undefined ? !!s.visible : this.visible(),\n lockSize: s.lockSize || this.lockSize()\n });\n }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\n\n/**\n * Directive to add a cover overlay to a split area during dragging.\n * This is useful when the split area contains elements like iframes\n * that can capture drag events and interfere with the split view's\n * dragging functionality.\n * The overlay will be transparent and therefore not recognized by\n * the user, but will capture the drag events.\n */\n@Directive({\n selector: '[yuvSplitAreaCover]'\n})\nexport class SplitAreaCoverDirective {\n #elRef = inject(ElementRef);\n\n yuvSplitAreaCover = input<boolean>(false);\n #draggingEffect = effect(() => {\n this.#toggleCover(this.yuvSplitAreaCover());\n });\n\n #coverElement?: HTMLElement;\n\n #toggleCover(active: boolean) {\n const el: HTMLElement = this.#elRef.nativeElement as HTMLElement;\n\n if (this.#coverElement) {\n el.style.position = 'initial';\n this.#coverElement.remove();\n this.#coverElement = undefined;\n }\n if (active) {\n el.style.position = 'relative';\n this.#coverElement = this.#createCoverElement();\n el.append(this.#coverElement);\n }\n }\n\n #createCoverElement(): HTMLElement {\n const coverElement = document.createElement('div');\n coverElement.classList.add('yuv-split-area-cover');\n coverElement.style.position = 'absolute';\n coverElement.style.zIndex = '500';\n coverElement.style.inset = '0';\n return coverElement;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { LayoutSettingsService } from '@yuuvis/client-components/common';\nimport { AngularSplitModule, SplitAreaSize, SplitComponent, SplitDirection } from 'angular-split';\nimport { SplitAreaCoverDirective } from './split-area-cover.directive';\nimport { SplitAreaDirective } from './split-area.directive';\nimport { SplitAreaLayoutSettings, SplitViewLayoutSettings, SplitViewOutputData } from './split-view.interface';\n\n/**\n * Component for creating a split view with resizable areas.\n *\n * Each area is defined using the `yuvSplitArea` directive on an `ng-template`.\n * Areas can be resized by dragging the gutter between them.\n *\n * ### Basic usage\n * ```html\n * <yuv-split-view>\n * <ng-template yuvSplitArea [size]=\"20\">Aside</ng-template>\n * <ng-template yuvSplitArea [size]=\"80\">Main</ng-template>\n * </yuv-split-view>\n * ```\n *\n * ### Collapsible areas\n * Areas can be shown, hidden, or toggled programmatically. Use a template\n * reference variable to call the visibility methods from the template:\n *\n * ```html\n * <yuv-split-view #sv>\n * <ng-template yuvSplitArea [size]=\"25\">\n * <button (click)=\"sv.hideArea(0)\">Collapse</button>\n * Left pane\n * </ng-template>\n * <ng-template yuvSplitArea [size]=\"75\">\n * <button (click)=\"sv.showArea(0)\">Expand left</button>\n * Main pane\n * </ng-template>\n * </yuv-split-view>\n * ```\n *\n * ### Persisting layout state\n * Set `layoutSettingsID` to persist area sizes and visibility to\n * localStorage. The saved state is automatically restored on init.\n *\n * ```html\n * <yuv-split-view [layoutSettingsID]=\"'my-layout'\">\n * ...\n * </yuv-split-view>\n * ```\n */\n@Component({\n selector: 'yuv-split-view',\n imports: [CommonModule, AngularSplitModule, SplitAreaCoverDirective],\n templateUrl: './split-view.component.html',\n styleUrl: './split-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'attr.data-gutter-size': 'gutterSize()',\n 'class.dragging': 'dragging()'\n }\n})\nexport class SplitViewComponent implements AfterViewInit {\n #layoutSettings = inject(LayoutSettingsService);\n\n splitAreas = contentChildren<SplitAreaDirective>(SplitAreaDirective);\n asSplitComponent = viewChild.required<SplitComponent>(SplitComponent);\n\n splitAreaSizes: SplitAreaSize[] = [];\n\n /**\n * The split views direction. Could be 'horizontal' or 'vertical'. Defaults to 'horizontal'.\n */\n direction = input<SplitDirection>('horizontal');\n isVertical = computed(() => this.direction() === 'vertical');\n isHorizontal = computed(() => this.direction() === 'horizontal');\n\n /**\n * Size of the gutter in Pixel (defaults to 16).\n */\n gutterSize = input<number>(16);\n /**\n * If true, the gutter can only be moved in steps of 1%.\n */\n restrictMove = input<boolean>(false);\n /**\n * Disable the dragging feature (remove cursor/image on gutters).\n */\n disabledInput = input<boolean>(false, { alias: 'disabled' });\n disabled = linkedSignal(() => this.disabledInput());\n /**\n * Layout settings are the state of the split view that could be persisted.\n * Setting a `layoutSettingsID` will save the current state (split area sizes etc.)\n * to the local storage. If the component is created, it will load those settings and\n * re-apply them.\n */\n layoutSettingsID = input<string>();\n /**\n * Emitted when the state (split area sizes etc.) of the split view changed.\n */\n layoutSettingsChange = output<SplitViewLayoutSettings>();\n /**\n * Emitted when dragging the split gutter starts\n */\n dragStart = output<SplitViewOutputData>();\n /**\n * Emitted when dragging the split gutter ends\n */\n dragEnd = output<SplitViewOutputData>();\n\n /**\n * Emitted when the split gutter is clicked.\n */\n gutterClick = output<SplitViewOutputData>();\n /**\n * Emitted when the split gutter is double clicked (you may also want to\n * set a different click duration indicating a double click). This could be\n * set using the `gutterDblClickDuration` to a value in milliseconds (default is 400ms)\n */\n gutterDblClick = output<SplitViewOutputData>();\n\n dragging = signal<boolean>(false);\n\n onDragStart(e: SplitViewOutputData) {\n this.dragging.set(true);\n this.dragStart.emit(e);\n }\n\n onDragEnd(e: SplitViewOutputData) {\n this.dragging.set(false);\n this.splitAreas().forEach((splitArea, index) => {\n splitArea.areaProperties.update((s) => ({ ...s, size: e.sizes[index] }));\n });\n this.#updateLayoutSettings(e.sizes);\n this.dragEnd.emit(e);\n }\n\n /**\n * Show a previously hidden split area, restoring it to its last known size.\n *\n * ```html\n * <button (click)=\"sv.showArea(0)\">Show left pane</button>\n * ```\n * @param index Zero-based index of the split area to show\n */\n showArea(index: number) {\n this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: true }));\n }\n\n /**\n * Hide a split area by collapsing it to zero width/height. The adjacent\n * areas will expand to fill the freed space.\n *\n * ```html\n * <button (click)=\"sv.hideArea(0)\">Hide left pane</button>\n * ```\n * @param index Zero-based index of the split area to hide\n */\n hideArea(index: number) {\n this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: false }));\n }\n\n /**\n * Toggle the visibility of a split area. If the area is currently visible\n * it will be collapsed; if it is hidden it will be restored.\n *\n * ```html\n * <button (click)=\"sv.toggleArea(0)\">Toggle left pane</button>\n * ```\n * @param index Zero-based index of the split area to toggle\n */\n toggleArea(index: number) {\n this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: !s.visible }));\n }\n\n /**\n * Returns whether a split area is currently visible. Useful for\n * conditionally rendering expand/collapse buttons in the template.\n *\n * ```html\n * @if (!sv.isAreaVisible(0)) {\n * <button (click)=\"sv.showArea(0)\">Expand left</button>\n * }\n * ```\n * @param index Zero-based index of the split area to check\n * @returns `true` if the area is visible, `false` if hidden\n */\n isAreaVisible(index: number): boolean {\n return this.splitAreas()[index].areaProperties().visible;\n }\n\n /** @deprecated Use `showArea()` / `hideArea()` instead */\n splitAreaSetVisibility(index: number, visible: boolean) {\n this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible }));\n }\n\n /** @deprecated Use `toggleArea()` instead */\n splitAreaToggleVisibility(index: number) {\n this.splitAreas()[index].areaProperties.update((s) => ({ ...s, visible: !s.visible }));\n }\n\n #updateLayoutSettings(sizes: SplitAreaSize[]) {\n this.splitAreaSizes = sizes;\n const layoutSettings: SplitViewLayoutSettings = {\n disabled: this.disabled(),\n areas: this.splitAreas().map((a: SplitAreaDirective, idx: number) => ({\n visible: a.visible(),\n size: sizes[idx]\n }))\n };\n this.layoutSettingsChange.emit(layoutSettings);\n // save layout settings if persistence is enabled\n const lsid = this.layoutSettingsID();\n if (lsid) {\n this.#layoutSettings.saveSettings(lsid, layoutSettings);\n }\n }\n\n /**\n * Programmatically apply layout settings (area sizes, visibility, disabled state).\n * This is called automatically on init when `layoutSettingsID` is set, but can\n * also be used to restore a specific layout configuration at any time.\n * @param settings The layout settings to apply\n */\n applyLayoutSettings(settings: SplitViewLayoutSettings) {\n if (!this.#isLayoutSettingsObject(settings)) return;\n this.disabled.set(!!settings.disabled);\n this.splitAreaSizes = settings.areas.map((a) => a.size!);\n settings.areas.forEach((a: SplitAreaLayoutSettings, index: number) => {\n this.splitAreas()[index].updateSettings(a);\n });\n }\n\n #isLayoutSettingsObject(v: any): boolean {\n return v && 'disabled' in v && 'areas' in v;\n }\n\n ngAfterViewInit(): void {\n // try to load layout settings if persistence is enabled\n const lsid = this.layoutSettingsID();\n if (lsid) {\n this.applyLayoutSettings(this.#layoutSettings.getSettings(lsid) as SplitViewLayoutSettings);\n }\n }\n}\n","<as-split\n [direction]=\"direction()\"\n [unit]=\"'percent'\"\n [gutterSize]=\"gutterSize()\"\n [gutterStep]=\"1\"\n [restrictMove]=\"restrictMove()\"\n [useTransition]=\"false\"\n [disabled]=\"disabled()\"\n (dragEnd)=\"onDragEnd($event)\"\n (dragStart)=\"onDragStart($event)\"\n (gutterDblClick)=\"gutterDblClick.emit($event)\"\n (gutterClick)=\"gutterClick.emit($event)\"\n>\n @if (gutterSize() === 1) {\n <div *asSplitGutter=\"let isDragged = isDragged\" class=\"shade-gutter\" [class.dragged]=\"isDragged\">\n <div class=\"shade-gutter-icon\" [class.vertical]=\"isVertical()\" [class.horizontal]=\"isHorizontal()\"></div>\n </div>\n } @else {\n <div *asSplitGutter class=\"split-gutter\">\n <div asSplitGutterDragHandle class=\"split-gutter-handle\" [class.vertical]=\"isVertical()\" [class.horizontal]=\"isHorizontal()\"></div>\n </div>\n }\n\n @for (a of splitAreas(); track a; let i = $index) {\n <as-split-area\n [yuvSplitAreaCover]=\"dragging()\"\n class=\"yuv-split-area {{ a.panelClass() }}\"\n [maxSize]=\"a.maxSize()\"\n [minSize]=\"a.minSize()\"\n [lockSize]=\"a.areaProperties().lockSize\"\n [size]=\"a.areaProperties().size\"\n [visible]=\"a.areaProperties().visible\"\n ><ng-template [ngTemplateOutlet]=\"a.template\"></ng-template\n ></as-split-area>\n }\n</as-split>\n","import { NgModule } from '@angular/core';\nimport { SplitAreaDirective } from './split-area.directive';\nimport { SplitViewComponent } from './split-view.component';\n\n@NgModule({\n imports: [SplitAreaDirective, SplitViewComponent],\n exports: [SplitAreaDirective, SplitViewComponent]\n})\nexport class YuvSplitViewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAOa,kBAAkB,CAAA;AAC7B,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAgB,EAAC;IAEnC,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiB;IAC7B,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACzB,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;IACzB,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAC5B,IAAA,OAAO,GAAG,KAAK,CAAU,IAAI,8EAAC;AAC9B,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAEhC,IAAA,cAAc,GAAG,YAAY,CAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,8BAAA,EAAA,CAAA,EAC3B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzF,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAA,CAC3E;AAEF,IAAA,cAAc,CAAC,CAA0B,EAAA;AACvC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;YAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAC/D,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ;AACtC,SAAA,CAAC;IACJ;uGArBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE;AACX,iBAAA;;;ACJD;;;;;;;AAOG;MAIU,uBAAuB,CAAA;AAClC,IAAA,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;AAE3B,IAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,wFAAC;AACzC,IAAA,eAAe,GAAG,MAAM,CAAC,MAAK;QAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7C,IAAA,CAAC,sFAAC;AAEF,IAAA,aAAa;AAEb,IAAA,YAAY,CAAC,MAAe,EAAA;AAC1B,QAAA,MAAM,EAAE,GAAgB,IAAI,CAAC,MAAM,CAAC,aAA4B;AAEhE,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS;AAC7B,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAC3B,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAChC;QACA,IAAI,MAAM,EAAE;AACV,YAAA,EAAE,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AAC9B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC/C,YAAA,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC/B;IACF;IAEA,mBAAmB,GAAA;QACjB,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,QAAA,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC;AAClD,QAAA,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;AACxC,QAAA,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;AACjC,QAAA,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG;AAC9B,QAAA,OAAO,YAAY;IACrB;uGAhCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE;AACX,iBAAA;;;ACQD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCG;MAYU,kBAAkB,CAAA;AAC7B,IAAA,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAE/C,IAAA,UAAU,GAAG,eAAe,CAAqB,kBAAkB,iFAAC;AACpE,IAAA,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAiB,cAAc,CAAC;IAErE,cAAc,GAAoB,EAAE;AAEpC;;AAEG;AACH,IAAA,SAAS,GAAG,KAAK,CAAiB,YAAY,gFAAC;AAC/C,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,UAAU,iFAAC;AAC5D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,KAAK,YAAY,mFAAC;AAEhE;;AAEG;AACH,IAAA,UAAU,GAAG,KAAK,CAAS,EAAE,iFAAC;AAC9B;;AAEG;AACH,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC;;AAEG;IACH,aAAa,GAAG,KAAK,CAAU,KAAK,qFAAI,KAAK,EAAE,UAAU,EAAA,CAAG;IAC5D,QAAQ,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACnD;;;;;AAKG;IACH,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAU;AAClC;;AAEG;IACH,oBAAoB,GAAG,MAAM,EAA2B;AACxD;;AAEG;IACH,SAAS,GAAG,MAAM,EAAuB;AACzC;;AAEG;IACH,OAAO,GAAG,MAAM,EAAuB;AAEvC;;AAEG;IACH,WAAW,GAAG,MAAM,EAAuB;AAC3C;;;;AAIG;IACH,cAAc,GAAG,MAAM,EAAuB;AAE9C,IAAA,QAAQ,GAAG,MAAM,CAAU,KAAK,+EAAC;AAEjC,IAAA,WAAW,CAAC,CAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACxB;AAEA,IAAA,SAAS,CAAC,CAAsB,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,KAAI;YAC7C,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC1E,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtB;AAEA;;;;;;;AAOG;AACH,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF;AAEA;;;;;;;;AAQG;AACH,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF;AAEA;;;;;;;;AAQG;AACH,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF;AAEA;;;;;;;;;;;AAWG;AACH,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,OAAO;IAC1D;;IAGA,sBAAsB,CAAC,KAAa,EAAE,OAAgB,EAAA;QACpD,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E;;AAGA,IAAA,yBAAyB,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF;AAEA,IAAA,qBAAqB,CAAC,KAAsB,EAAA;AAC1C,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,MAAM,cAAc,GAA4B;AAC9C,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAqB,EAAE,GAAW,MAAM;AACpE,gBAAA,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;AACpB,gBAAA,IAAI,EAAE,KAAK,CAAC,GAAG;AAChB,aAAA,CAAC;SACH;AACD,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC;;AAE9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACpC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC;QACzD;IACF;AAEA;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,QAAiC,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC;YAAE;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAK,CAAC;QACxD,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAA0B,EAAE,KAAa,KAAI;YACnE,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAC5C,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,uBAAuB,CAAC,CAAM,EAAA;QAC5B,OAAO,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC;IAC7C;IAEA,eAAe,GAAA;;AAEb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACpC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAA4B,CAAC;QAC7F;IACF;uGArLW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAGoB,kBAAkB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACb,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5EtE,61CAoCA,EAAA,MAAA,EAAA,CAAA,+nEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED2BY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,KAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FASxD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAX9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB,CAAC,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,CAAC,EAAA,eAAA,EAGnD,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,uBAAuB,EAAE,cAAc;AACvC,wBAAA,gBAAgB,EAAE;AACnB,qBAAA,EAAA,QAAA,EAAA,61CAAA,EAAA,MAAA,EAAA,CAAA,+nEAAA,CAAA,EAAA;AAKgD,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,kBAAkB,+FACb,cAAc,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEpEzD,kBAAkB,CAAA;uGAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHnB,kBAAkB,EAAE,kBAAkB,CAAA,EAAA,OAAA,EAAA,CACtC,kBAAkB,EAAE,kBAAkB,CAAA,EAAA,CAAA;AAErC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHC,kBAAkB,CAAA,EAAA,CAAA;;2FAGrC,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;AACjD,oBAAA,OAAO,EAAE,CAAC,kBAAkB,EAAE,kBAAkB;AACjD,iBAAA;;;ACPD;;AAEG;;;;"}