@plait/angular-board 0.62.0-next.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 +1 -0
- package/board/board.component.d.ts +57 -0
- package/board/board.component.interface.d.ts +9 -0
- package/esm2022/board/board.component.interface.mjs +2 -0
- package/esm2022/board/board.component.mjs +433 -0
- package/esm2022/island/island-base.component.mjs +72 -0
- package/esm2022/plait-angular-board.mjs +5 -0
- package/esm2022/plugins/angular-board.mjs +2 -0
- package/esm2022/plugins/with-angular.mjs +50 -0
- package/esm2022/public-api.mjs +8 -0
- package/esm2022/utils/weak-maps.mjs +2 -0
- package/fesm2022/plait-angular-board.mjs +561 -0
- package/fesm2022/plait-angular-board.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/island/island-base.component.d.ts +35 -0
- package/package.json +32 -0
- package/plugins/angular-board.d.ts +18 -0
- package/plugins/with-angular.d.ts +4 -0
- package/public-api.d.ts +4 -0
- package/styles/mixins.scss +18 -0
- package/styles/styles.scss +84 -0
- package/utils/weak-maps.d.ts +3 -0
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Directive, Input, EventEmitter, ElementRef, Component, ChangeDetectionStrategy, Output, HostBinding, ViewChild, ContentChildren } from '@angular/core';
|
|
3
|
+
import rough from 'roughjs/bin/rough';
|
|
4
|
+
import { Subject, fromEvent } from 'rxjs';
|
|
5
|
+
import { takeUntil, filter, tap } from 'rxjs/operators';
|
|
6
|
+
import { HOST_CLASS_NAME, IS_SAFARI, IS_CHROME, IS_FIREFOX, PlaitBoard, BOARD_TO_MOVING_POINT, BOARD_TO_ROUGH_SVG, BOARD_TO_HOST, IS_BOARD_ALIVE, BOARD_TO_ELEMENT_HOST, BOARD_TO_ON_CHANGE, BOARD_TO_AFTER_CHANGE, PlaitBoardContext, BOARD_TO_CONTEXT, initializeViewportContainer, initializeViewBox, initializeViewportOffset, withRelatedFragment, withHotkey, withHandPointer, withHistory, withSelection, withMoving, withBoard, withViewport, withOptions, createBoard, BOARD_TO_MOVING_POINT_IN_BOARD, hasInputOrTextareaTarget, setFragment, WritableClipboardOperationType, toViewBoxPoint, toHostPoint, getClipboardData, deleteFragment, ListRender, isFromViewportChange, setIsFromViewportChange, updateViewportByScrolling, isPreventTouchMove, updateViewportOffset, ZOOM_STEP, BoardTransforms } from '@plait/core';
|
|
7
|
+
import { PlaitTextComponent } from '@plait/angular-text';
|
|
8
|
+
import { AngularEditor } from 'slate-angular';
|
|
9
|
+
import { withImage, withText } from '@plait/common';
|
|
10
|
+
|
|
11
|
+
const BOARD_TO_COMPONENT = new WeakMap();
|
|
12
|
+
|
|
13
|
+
class PlaitIslandBaseComponent {
|
|
14
|
+
constructor(cdr) {
|
|
15
|
+
this.cdr = cdr;
|
|
16
|
+
}
|
|
17
|
+
initialize(board) {
|
|
18
|
+
this.board = board;
|
|
19
|
+
this.markForCheck();
|
|
20
|
+
}
|
|
21
|
+
markForCheck() {
|
|
22
|
+
this.cdr.markForCheck();
|
|
23
|
+
}
|
|
24
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitIslandBaseComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
25
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.2.4", type: PlaitIslandBaseComponent, host: { classAttribute: "plait-island-container" }, ngImport: i0 }); }
|
|
26
|
+
}
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitIslandBaseComponent, decorators: [{
|
|
28
|
+
type: Directive,
|
|
29
|
+
args: [{
|
|
30
|
+
host: {
|
|
31
|
+
class: 'plait-island-container'
|
|
32
|
+
}
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
|
|
35
|
+
class PlaitIslandPopoverBaseComponent {
|
|
36
|
+
constructor(cdr) {
|
|
37
|
+
this.cdr = cdr;
|
|
38
|
+
}
|
|
39
|
+
initialize(board) {
|
|
40
|
+
this.board = board;
|
|
41
|
+
const boardComponent = BOARD_TO_COMPONENT.get(board);
|
|
42
|
+
this.subscription = boardComponent.onChange.subscribe(() => {
|
|
43
|
+
if (hasOnBoardChange(this)) {
|
|
44
|
+
this.onBoardChange();
|
|
45
|
+
}
|
|
46
|
+
this.cdr.markForCheck();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
ngOnInit() {
|
|
50
|
+
if (!this.board) {
|
|
51
|
+
throw new Error('can not find board instance');
|
|
52
|
+
}
|
|
53
|
+
this.initialize(this.board);
|
|
54
|
+
this.islandOnInit();
|
|
55
|
+
}
|
|
56
|
+
ngOnDestroy() {
|
|
57
|
+
this.subscription?.unsubscribe();
|
|
58
|
+
this.islandOnDestroy();
|
|
59
|
+
}
|
|
60
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitIslandPopoverBaseComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
61
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.2.4", type: PlaitIslandPopoverBaseComponent, inputs: { board: "board" }, host: { classAttribute: "plait-island-popover-container" }, ngImport: i0 }); }
|
|
62
|
+
}
|
|
63
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitIslandPopoverBaseComponent, decorators: [{
|
|
64
|
+
type: Directive,
|
|
65
|
+
args: [{
|
|
66
|
+
host: {
|
|
67
|
+
class: 'plait-island-popover-container'
|
|
68
|
+
}
|
|
69
|
+
}]
|
|
70
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { board: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}] } });
|
|
73
|
+
const hasOnBoardChange = (value) => {
|
|
74
|
+
if (value.onBoardChange) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const withAngular = (board) => {
|
|
83
|
+
const newBoard = board;
|
|
84
|
+
newBoard.renderComponent = (type, container, props) => {
|
|
85
|
+
const boardComponent = BOARD_TO_COMPONENT.get(board);
|
|
86
|
+
const componentRef = boardComponent.viewContainerRef.createComponent(type);
|
|
87
|
+
for (const key in props) {
|
|
88
|
+
const value = props[key];
|
|
89
|
+
componentRef.instance[key] = value;
|
|
90
|
+
}
|
|
91
|
+
container.appendChild(componentRef.instance.nativeElement());
|
|
92
|
+
componentRef.changeDetectorRef.detectChanges();
|
|
93
|
+
const ref = {
|
|
94
|
+
destroy: () => {
|
|
95
|
+
componentRef.destroy();
|
|
96
|
+
},
|
|
97
|
+
update: (props) => {
|
|
98
|
+
for (const key in props) {
|
|
99
|
+
const value = props[key];
|
|
100
|
+
componentRef.instance[key] = value;
|
|
101
|
+
}
|
|
102
|
+
// solve image lose on move node
|
|
103
|
+
if (container.children.length === 0) {
|
|
104
|
+
container.append(componentRef.instance.nativeElement());
|
|
105
|
+
}
|
|
106
|
+
componentRef.changeDetectorRef.detectChanges();
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
return { ref, componentRef };
|
|
110
|
+
};
|
|
111
|
+
newBoard.renderText = (container, props) => {
|
|
112
|
+
const { ref, componentRef } = newBoard.renderComponent(PlaitTextComponent, container, props);
|
|
113
|
+
const { update } = ref;
|
|
114
|
+
ref.update = props => {
|
|
115
|
+
const beforeReadonly = componentRef.instance.readonly;
|
|
116
|
+
update(props);
|
|
117
|
+
if (beforeReadonly === true && props.readonly === false) {
|
|
118
|
+
AngularEditor.focus(componentRef.instance.editor);
|
|
119
|
+
}
|
|
120
|
+
else if (beforeReadonly === false && props.readonly === true) {
|
|
121
|
+
AngularEditor.blur(componentRef.instance.editor);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
return ref;
|
|
125
|
+
};
|
|
126
|
+
return newBoard;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const ElementLowerHostClass = 'element-lower-host';
|
|
130
|
+
const ElementHostClass = 'element-host';
|
|
131
|
+
const ElementUpperHostClass = 'element-upper-host';
|
|
132
|
+
const ElementActiveHostClass = 'element-active-host';
|
|
133
|
+
class PlaitBoardComponent {
|
|
134
|
+
get host() {
|
|
135
|
+
return this.svg.nativeElement;
|
|
136
|
+
}
|
|
137
|
+
get hostClass() {
|
|
138
|
+
return `${HOST_CLASS_NAME} theme-${this.board.theme.themeColorMode} ${this.getBrowserClassName()}`;
|
|
139
|
+
}
|
|
140
|
+
getBrowserClassName() {
|
|
141
|
+
if (IS_SAFARI) {
|
|
142
|
+
return 'safari';
|
|
143
|
+
}
|
|
144
|
+
if (IS_CHROME) {
|
|
145
|
+
return 'chrome';
|
|
146
|
+
}
|
|
147
|
+
if (IS_FIREFOX) {
|
|
148
|
+
return 'firefox';
|
|
149
|
+
}
|
|
150
|
+
return '';
|
|
151
|
+
}
|
|
152
|
+
get readonly() {
|
|
153
|
+
return this.board.options.readonly;
|
|
154
|
+
}
|
|
155
|
+
get isFocused() {
|
|
156
|
+
return PlaitBoard.isFocus(this.board);
|
|
157
|
+
}
|
|
158
|
+
get disabledScrollOnNonFocus() {
|
|
159
|
+
return this.board.options.disabledScrollOnNonFocus && !PlaitBoard.isFocus(this.board);
|
|
160
|
+
}
|
|
161
|
+
get nativeElement() {
|
|
162
|
+
return this.elementRef.nativeElement;
|
|
163
|
+
}
|
|
164
|
+
constructor(cdr, viewContainerRef, elementRef, ngZone) {
|
|
165
|
+
this.cdr = cdr;
|
|
166
|
+
this.viewContainerRef = viewContainerRef;
|
|
167
|
+
this.elementRef = elementRef;
|
|
168
|
+
this.ngZone = ngZone;
|
|
169
|
+
this.hasInitialized = false;
|
|
170
|
+
this.destroy$ = new Subject();
|
|
171
|
+
this.plaitValue = [];
|
|
172
|
+
this.plaitPlugins = [];
|
|
173
|
+
this.onChange = new EventEmitter();
|
|
174
|
+
this.plaitBoardInitialized = new EventEmitter();
|
|
175
|
+
this.trackBy = (index, element) => {
|
|
176
|
+
return element.id;
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
ngOnInit() {
|
|
180
|
+
const elementLowerHost = this.host.querySelector(`.${ElementLowerHostClass}`);
|
|
181
|
+
const elementHost = this.host.querySelector(`.${ElementHostClass}`);
|
|
182
|
+
const elementUpperHost = this.host.querySelector(`.${ElementUpperHostClass}`);
|
|
183
|
+
const elementActiveHost = this.host.querySelector(`.${ElementActiveHostClass}`);
|
|
184
|
+
const roughSVG = rough.svg(this.host, {
|
|
185
|
+
options: { roughness: 0, strokeWidth: 1 }
|
|
186
|
+
});
|
|
187
|
+
this.roughSVG = roughSVG;
|
|
188
|
+
this.initializePlugins();
|
|
189
|
+
this.ngZone.runOutsideAngular(() => {
|
|
190
|
+
this.initializeHookListener();
|
|
191
|
+
this.viewportScrollListener();
|
|
192
|
+
this.wheelZoomListener();
|
|
193
|
+
this.elementResizeListener();
|
|
194
|
+
fromEvent(document, 'mouseleave')
|
|
195
|
+
.pipe(takeUntil(this.destroy$))
|
|
196
|
+
.subscribe((event) => {
|
|
197
|
+
BOARD_TO_MOVING_POINT.delete(this.board);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
BOARD_TO_COMPONENT.set(this.board, this);
|
|
201
|
+
BOARD_TO_ROUGH_SVG.set(this.board, roughSVG);
|
|
202
|
+
BOARD_TO_HOST.set(this.board, this.host);
|
|
203
|
+
IS_BOARD_ALIVE.set(this.board, true);
|
|
204
|
+
BOARD_TO_ELEMENT_HOST.set(this.board, {
|
|
205
|
+
lowerHost: elementLowerHost,
|
|
206
|
+
host: elementHost,
|
|
207
|
+
upperHost: elementUpperHost,
|
|
208
|
+
activeHost: elementActiveHost,
|
|
209
|
+
container: this.elementRef.nativeElement,
|
|
210
|
+
viewportContainer: this.viewportContainer.nativeElement
|
|
211
|
+
});
|
|
212
|
+
BOARD_TO_ON_CHANGE.set(this.board, () => {
|
|
213
|
+
this.ngZone.run(() => {
|
|
214
|
+
this.updateListRender();
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
BOARD_TO_AFTER_CHANGE.set(this.board, () => {
|
|
218
|
+
this.ngZone.run(() => {
|
|
219
|
+
const data = {
|
|
220
|
+
children: this.board.children,
|
|
221
|
+
operations: this.board.operations,
|
|
222
|
+
viewport: this.board.viewport,
|
|
223
|
+
selection: this.board.selection,
|
|
224
|
+
theme: this.board.theme
|
|
225
|
+
};
|
|
226
|
+
this.updateIslands();
|
|
227
|
+
this.onChange.emit(data);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
const context = new PlaitBoardContext();
|
|
231
|
+
BOARD_TO_CONTEXT.set(this.board, context);
|
|
232
|
+
this.initializeListRender();
|
|
233
|
+
this.elementRef.nativeElement.classList.add(`pointer-${this.board.pointer}`);
|
|
234
|
+
this.hasInitialized = true;
|
|
235
|
+
}
|
|
236
|
+
ngAfterContentInit() {
|
|
237
|
+
this.initializeIslands();
|
|
238
|
+
}
|
|
239
|
+
ngOnChanges(changes) {
|
|
240
|
+
if (this.hasInitialized) {
|
|
241
|
+
const valueChange = changes['plaitValue'];
|
|
242
|
+
const options = changes['plaitOptions'];
|
|
243
|
+
if (valueChange) {
|
|
244
|
+
this.board.children = valueChange.currentValue;
|
|
245
|
+
this.updateListRender();
|
|
246
|
+
}
|
|
247
|
+
if (options) {
|
|
248
|
+
this.board.options = options.currentValue;
|
|
249
|
+
}
|
|
250
|
+
this.cdr.markForCheck();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
ngAfterViewInit() {
|
|
254
|
+
this.plaitBoardInitialized.emit(this.board);
|
|
255
|
+
initializeViewportContainer(this.board);
|
|
256
|
+
initializeViewBox(this.board);
|
|
257
|
+
initializeViewportOffset(this.board);
|
|
258
|
+
}
|
|
259
|
+
initializePlugins() {
|
|
260
|
+
let board = withRelatedFragment(withHotkey(withHandPointer(withHistory(withSelection(withMoving(withBoard(withViewport(withOptions(withAngular(withImage(withText(createBoard(this.plaitValue, this.plaitOptions)))))))))))));
|
|
261
|
+
this.plaitPlugins.forEach(plugin => {
|
|
262
|
+
board = plugin(board);
|
|
263
|
+
});
|
|
264
|
+
this.board = board;
|
|
265
|
+
if (this.plaitViewport) {
|
|
266
|
+
this.board.viewport = this.plaitViewport;
|
|
267
|
+
}
|
|
268
|
+
if (this.plaitTheme) {
|
|
269
|
+
this.board.theme = this.plaitTheme;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
initializeHookListener() {
|
|
273
|
+
fromEvent(this.host, 'mousedown')
|
|
274
|
+
.pipe(takeUntil(this.destroy$))
|
|
275
|
+
.subscribe((event) => {
|
|
276
|
+
this.board.mousedown(event);
|
|
277
|
+
});
|
|
278
|
+
fromEvent(this.host, 'pointerdown')
|
|
279
|
+
.pipe(takeUntil(this.destroy$))
|
|
280
|
+
.subscribe((event) => {
|
|
281
|
+
this.board.pointerDown(event);
|
|
282
|
+
});
|
|
283
|
+
fromEvent(this.host, 'mousemove')
|
|
284
|
+
.pipe(takeUntil(this.destroy$))
|
|
285
|
+
.subscribe((event) => {
|
|
286
|
+
BOARD_TO_MOVING_POINT_IN_BOARD.set(this.board, [event.x, event.y]);
|
|
287
|
+
this.board.mousemove(event);
|
|
288
|
+
});
|
|
289
|
+
fromEvent(this.host, 'pointermove')
|
|
290
|
+
.pipe(takeUntil(this.destroy$))
|
|
291
|
+
.subscribe((event) => {
|
|
292
|
+
BOARD_TO_MOVING_POINT_IN_BOARD.set(this.board, [event.x, event.y]);
|
|
293
|
+
this.board.pointerMove(event);
|
|
294
|
+
});
|
|
295
|
+
fromEvent(this.host, 'mouseleave')
|
|
296
|
+
.pipe(takeUntil(this.destroy$))
|
|
297
|
+
.subscribe((event) => {
|
|
298
|
+
BOARD_TO_MOVING_POINT_IN_BOARD.delete(this.board);
|
|
299
|
+
this.board.mouseleave(event);
|
|
300
|
+
});
|
|
301
|
+
fromEvent(this.host, 'pointerleave')
|
|
302
|
+
.pipe(takeUntil(this.destroy$))
|
|
303
|
+
.subscribe((event) => {
|
|
304
|
+
BOARD_TO_MOVING_POINT_IN_BOARD.delete(this.board);
|
|
305
|
+
this.board.pointerLeave(event);
|
|
306
|
+
});
|
|
307
|
+
fromEvent(document, 'mousemove')
|
|
308
|
+
.pipe(takeUntil(this.destroy$))
|
|
309
|
+
.subscribe((event) => {
|
|
310
|
+
BOARD_TO_MOVING_POINT.set(this.board, [event.x, event.y]);
|
|
311
|
+
this.board.globalMousemove(event);
|
|
312
|
+
});
|
|
313
|
+
fromEvent(document, 'pointermove')
|
|
314
|
+
.pipe(takeUntil(this.destroy$))
|
|
315
|
+
.subscribe((event) => {
|
|
316
|
+
BOARD_TO_MOVING_POINT.set(this.board, [event.x, event.y]);
|
|
317
|
+
this.board.globalPointerMove(event);
|
|
318
|
+
});
|
|
319
|
+
fromEvent(this.host, 'mouseup')
|
|
320
|
+
.pipe(takeUntil(this.destroy$))
|
|
321
|
+
.subscribe((event) => {
|
|
322
|
+
this.board.mouseup(event);
|
|
323
|
+
});
|
|
324
|
+
fromEvent(this.host, 'pointerup')
|
|
325
|
+
.pipe(takeUntil(this.destroy$))
|
|
326
|
+
.subscribe((event) => {
|
|
327
|
+
this.board.pointerUp(event);
|
|
328
|
+
});
|
|
329
|
+
fromEvent(document, 'mouseup')
|
|
330
|
+
.pipe(takeUntil(this.destroy$))
|
|
331
|
+
.subscribe((event) => {
|
|
332
|
+
this.board.globalMouseup(event);
|
|
333
|
+
});
|
|
334
|
+
fromEvent(document, 'pointerup')
|
|
335
|
+
.pipe(takeUntil(this.destroy$))
|
|
336
|
+
.subscribe((event) => {
|
|
337
|
+
this.board.globalPointerUp(event);
|
|
338
|
+
});
|
|
339
|
+
fromEvent(this.host, 'dblclick')
|
|
340
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board)))
|
|
341
|
+
.subscribe((event) => {
|
|
342
|
+
this.board.dblClick(event);
|
|
343
|
+
});
|
|
344
|
+
fromEvent(document, 'keydown')
|
|
345
|
+
.pipe(takeUntil(this.destroy$), tap(event => {
|
|
346
|
+
this.board.globalKeyDown(event);
|
|
347
|
+
}), filter(event => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board) && !hasInputOrTextareaTarget(event.target)))
|
|
348
|
+
.subscribe((event) => {
|
|
349
|
+
this.board.keyDown(event);
|
|
350
|
+
});
|
|
351
|
+
fromEvent(document, 'keyup')
|
|
352
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board)))
|
|
353
|
+
.subscribe((event) => {
|
|
354
|
+
this.board?.keyUp(event);
|
|
355
|
+
});
|
|
356
|
+
fromEvent(document, 'copy')
|
|
357
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board)))
|
|
358
|
+
.subscribe((event) => {
|
|
359
|
+
event.preventDefault();
|
|
360
|
+
setFragment(this.board, WritableClipboardOperationType.copy, event.clipboardData);
|
|
361
|
+
});
|
|
362
|
+
fromEvent(document, 'paste')
|
|
363
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.isReadonly(this.board) && !PlaitBoard.hasBeenTextEditing(this.board)))
|
|
364
|
+
.subscribe(async (clipboardEvent) => {
|
|
365
|
+
const mousePoint = PlaitBoard.getMovingPointInBoard(this.board);
|
|
366
|
+
if (mousePoint) {
|
|
367
|
+
const targetPoint = toViewBoxPoint(this.board, toHostPoint(this.board, mousePoint[0], mousePoint[1]));
|
|
368
|
+
const clipboardData = await getClipboardData(clipboardEvent.clipboardData);
|
|
369
|
+
this.board.insertFragment(clipboardData, targetPoint, WritableClipboardOperationType.paste);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
fromEvent(document, 'cut')
|
|
373
|
+
.pipe(takeUntil(this.destroy$), filter(() => this.isFocused && !PlaitBoard.isReadonly(this.board) && !PlaitBoard.hasBeenTextEditing(this.board)))
|
|
374
|
+
.subscribe((event) => {
|
|
375
|
+
event.preventDefault();
|
|
376
|
+
setFragment(this.board, WritableClipboardOperationType.cut, event.clipboardData);
|
|
377
|
+
deleteFragment(this.board);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
initializeListRender() {
|
|
381
|
+
this.listRender = new ListRender(this.board);
|
|
382
|
+
this.listRender.initialize(this.board.children, this.initializeChildrenContext());
|
|
383
|
+
}
|
|
384
|
+
updateListRender() {
|
|
385
|
+
this.listRender.update(this.board.children, this.initializeChildrenContext());
|
|
386
|
+
PlaitBoard.getBoardContext(this.board).nextStable();
|
|
387
|
+
}
|
|
388
|
+
initializeChildrenContext() {
|
|
389
|
+
return {
|
|
390
|
+
board: this.board,
|
|
391
|
+
parent: this.board,
|
|
392
|
+
parentG: PlaitBoard.getElementHost(this.board)
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
viewportScrollListener() {
|
|
396
|
+
fromEvent(this.viewportContainer.nativeElement, 'scroll')
|
|
397
|
+
.pipe(takeUntil(this.destroy$), filter(() => {
|
|
398
|
+
if (isFromViewportChange(this.board)) {
|
|
399
|
+
setIsFromViewportChange(this.board, false);
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
return true;
|
|
403
|
+
}))
|
|
404
|
+
.subscribe((event) => {
|
|
405
|
+
const { scrollLeft, scrollTop } = event.target;
|
|
406
|
+
updateViewportByScrolling(this.board, scrollLeft, scrollTop);
|
|
407
|
+
});
|
|
408
|
+
fromEvent(this.viewportContainer.nativeElement, 'touchmove', { passive: false })
|
|
409
|
+
.pipe(takeUntil(this.destroy$))
|
|
410
|
+
.subscribe((event) => {
|
|
411
|
+
if (isPreventTouchMove(this.board)) {
|
|
412
|
+
event.preventDefault();
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
elementResizeListener() {
|
|
417
|
+
this.resizeObserver = new ResizeObserver(() => {
|
|
418
|
+
initializeViewportContainer(this.board);
|
|
419
|
+
initializeViewBox(this.board);
|
|
420
|
+
updateViewportOffset(this.board);
|
|
421
|
+
});
|
|
422
|
+
this.resizeObserver.observe(this.nativeElement);
|
|
423
|
+
}
|
|
424
|
+
initializeIslands() {
|
|
425
|
+
this.islands?.forEach(island => {
|
|
426
|
+
island.initialize(this.board);
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
updateIslands() {
|
|
430
|
+
this.islands?.forEach(island => {
|
|
431
|
+
if (hasOnBoardChange(island)) {
|
|
432
|
+
island.onBoardChange();
|
|
433
|
+
}
|
|
434
|
+
island.markForCheck();
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
wheelZoomListener() {
|
|
438
|
+
fromEvent(this.host, 'wheel', { passive: false })
|
|
439
|
+
.pipe(takeUntil(this.destroy$))
|
|
440
|
+
.subscribe((event) => {
|
|
441
|
+
// Credits to excalidraw
|
|
442
|
+
// https://github.com/excalidraw/excalidraw/blob/b7d7ccc929696cc17b4cc34452e4afd846d59f4f/src/components/App.tsx#L9060
|
|
443
|
+
if (event.metaKey || event.ctrlKey) {
|
|
444
|
+
event.preventDefault();
|
|
445
|
+
const { deltaX, deltaY } = event;
|
|
446
|
+
const zoom = this.board.viewport.zoom;
|
|
447
|
+
const sign = Math.sign(deltaY);
|
|
448
|
+
const MAX_STEP = ZOOM_STEP * 100;
|
|
449
|
+
const absDelta = Math.abs(deltaY);
|
|
450
|
+
let delta = deltaY;
|
|
451
|
+
if (absDelta > MAX_STEP) {
|
|
452
|
+
delta = MAX_STEP * sign;
|
|
453
|
+
}
|
|
454
|
+
let newZoom = zoom - delta / 100;
|
|
455
|
+
// increase zoom steps the more zoomed-in we are (applies to >100% only)
|
|
456
|
+
newZoom +=
|
|
457
|
+
Math.log10(Math.max(1, zoom)) *
|
|
458
|
+
-sign *
|
|
459
|
+
// reduced amplification for small deltas (small movements on a trackpad)
|
|
460
|
+
Math.min(1, absDelta / 20);
|
|
461
|
+
BoardTransforms.updateZoom(this.board, newZoom, false);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
ngOnDestroy() {
|
|
466
|
+
this.destroy$.next();
|
|
467
|
+
this.destroy$.complete();
|
|
468
|
+
this.resizeObserver && this.resizeObserver?.disconnect();
|
|
469
|
+
BOARD_TO_ROUGH_SVG.delete(this.board);
|
|
470
|
+
BOARD_TO_COMPONENT.delete(this.board);
|
|
471
|
+
BOARD_TO_ROUGH_SVG.delete(this.board);
|
|
472
|
+
BOARD_TO_HOST.delete(this.board);
|
|
473
|
+
BOARD_TO_ELEMENT_HOST.delete(this.board);
|
|
474
|
+
IS_BOARD_ALIVE.set(this.board, false);
|
|
475
|
+
BOARD_TO_ON_CHANGE.delete(this.board);
|
|
476
|
+
BOARD_TO_AFTER_CHANGE.set(this.board, () => { });
|
|
477
|
+
}
|
|
478
|
+
markForCheck() {
|
|
479
|
+
this.cdr.markForCheck();
|
|
480
|
+
this.ngZone.run(() => {
|
|
481
|
+
this.updateIslands();
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitBoardComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
485
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: PlaitBoardComponent, isStandalone: true, selector: "plait-board", inputs: { plaitValue: "plaitValue", plaitViewport: "plaitViewport", plaitPlugins: "plaitPlugins", plaitOptions: "plaitOptions", plaitTheme: "plaitTheme" }, outputs: { onChange: "onChange", plaitBoardInitialized: "plaitBoardInitialized" }, host: { properties: { "class": "this.hostClass", "class.readonly": "this.readonly", "class.focused": "this.isFocused", "class.disabled-scroll": "this.disabledScrollOnNonFocus" } }, queries: [{ propertyName: "islands", predicate: PlaitIslandBaseComponent, descendants: true }], viewQueries: [{ propertyName: "svg", first: true, predicate: ["svg"], descendants: true, static: true }, { propertyName: "viewportContainer", first: true, predicate: ["viewportContainer"], descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
486
|
+
<div class="viewport-container" #viewportContainer>
|
|
487
|
+
<svg #svg width="100%" height="100%" style="position: relative;" class="board-host-svg">
|
|
488
|
+
<g class="element-lower-host"></g>
|
|
489
|
+
<g class="element-host"></g>
|
|
490
|
+
<g class="element-upper-host"></g>
|
|
491
|
+
<g class="element-active-host"></g>
|
|
492
|
+
</svg>
|
|
493
|
+
</div>
|
|
494
|
+
<ng-content></ng-content>
|
|
495
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
496
|
+
}
|
|
497
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlaitBoardComponent, decorators: [{
|
|
498
|
+
type: Component,
|
|
499
|
+
args: [{
|
|
500
|
+
selector: 'plait-board',
|
|
501
|
+
template: `
|
|
502
|
+
<div class="viewport-container" #viewportContainer>
|
|
503
|
+
<svg #svg width="100%" height="100%" style="position: relative;" class="board-host-svg">
|
|
504
|
+
<g class="element-lower-host"></g>
|
|
505
|
+
<g class="element-host"></g>
|
|
506
|
+
<g class="element-upper-host"></g>
|
|
507
|
+
<g class="element-active-host"></g>
|
|
508
|
+
</svg>
|
|
509
|
+
</div>
|
|
510
|
+
<ng-content></ng-content>
|
|
511
|
+
`,
|
|
512
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
513
|
+
standalone: true
|
|
514
|
+
}]
|
|
515
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { plaitValue: [{
|
|
516
|
+
type: Input
|
|
517
|
+
}], plaitViewport: [{
|
|
518
|
+
type: Input
|
|
519
|
+
}], plaitPlugins: [{
|
|
520
|
+
type: Input
|
|
521
|
+
}], plaitOptions: [{
|
|
522
|
+
type: Input
|
|
523
|
+
}], plaitTheme: [{
|
|
524
|
+
type: Input
|
|
525
|
+
}], onChange: [{
|
|
526
|
+
type: Output
|
|
527
|
+
}], plaitBoardInitialized: [{
|
|
528
|
+
type: Output
|
|
529
|
+
}], hostClass: [{
|
|
530
|
+
type: HostBinding,
|
|
531
|
+
args: ['class']
|
|
532
|
+
}], readonly: [{
|
|
533
|
+
type: HostBinding,
|
|
534
|
+
args: ['class.readonly']
|
|
535
|
+
}], isFocused: [{
|
|
536
|
+
type: HostBinding,
|
|
537
|
+
args: ['class.focused']
|
|
538
|
+
}], disabledScrollOnNonFocus: [{
|
|
539
|
+
type: HostBinding,
|
|
540
|
+
args: ['class.disabled-scroll']
|
|
541
|
+
}], svg: [{
|
|
542
|
+
type: ViewChild,
|
|
543
|
+
args: ['svg', { static: true }]
|
|
544
|
+
}], viewportContainer: [{
|
|
545
|
+
type: ViewChild,
|
|
546
|
+
args: ['viewportContainer', { read: ElementRef, static: true }]
|
|
547
|
+
}], islands: [{
|
|
548
|
+
type: ContentChildren,
|
|
549
|
+
args: [PlaitIslandBaseComponent, { descendants: true }]
|
|
550
|
+
}] } });
|
|
551
|
+
|
|
552
|
+
/*
|
|
553
|
+
* Public API Surface of plait
|
|
554
|
+
*/
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Generated bundle index. Do not edit.
|
|
558
|
+
*/
|
|
559
|
+
|
|
560
|
+
export { PlaitBoardComponent, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, hasOnBoardChange };
|
|
561
|
+
//# sourceMappingURL=plait-angular-board.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plait-angular-board.mjs","sources":["../../../packages/angular-board/src/utils/weak-maps.ts","../../../packages/angular-board/src/island/island-base.component.ts","../../../packages/angular-board/src/plugins/with-angular.ts","../../../packages/angular-board/src/board/board.component.ts","../../../packages/angular-board/src/public-api.ts","../../../packages/angular-board/src/plait-angular-board.ts"],"sourcesContent":["import { PlaitBoard } from '@plait/core';\nimport { BoardComponentInterface } from '../board/board.component.interface';\n\nexport const BOARD_TO_COMPONENT = new WeakMap<PlaitBoard, BoardComponentInterface>();\n","import { ChangeDetectorRef, Directive, Input, OnDestroy, OnInit } from '@angular/core';\nimport { PlaitBoard } from '@plait/core';\nimport { Subscription } from 'rxjs';\nimport { BOARD_TO_COMPONENT } from '../utils/weak-maps';\nimport { BoardComponentInterface } from '../board/board.component.interface';\n\n@Directive({\n host: {\n class: 'plait-island-container'\n }\n})\nexport abstract class PlaitIslandBaseComponent {\n board!: PlaitBoard;\n\n constructor(protected cdr: ChangeDetectorRef) {}\n\n initialize(board: PlaitBoard) {\n this.board = board;\n this.markForCheck();\n }\n\n markForCheck() {\n this.cdr.markForCheck();\n }\n}\n\n@Directive({\n host: {\n class: 'plait-island-popover-container'\n }\n})\nexport abstract class PlaitIslandPopoverBaseComponent implements OnInit, OnDestroy {\n @Input() board!: PlaitBoard;\n\n private subscription?: Subscription;\n\n constructor(public cdr: ChangeDetectorRef) {}\n\n initialize(board: PlaitBoard) {\n this.board = board;\n const boardComponent = BOARD_TO_COMPONENT.get(board) as BoardComponentInterface;\n this.subscription = boardComponent.onChange.subscribe(() => {\n if (hasOnBoardChange(this)) {\n this.onBoardChange();\n }\n this.cdr.markForCheck();\n });\n }\n\n ngOnInit(): void {\n if (!this.board) {\n throw new Error('can not find board instance');\n }\n this.initialize(this.board);\n this.islandOnInit();\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.islandOnDestroy();\n }\n\n /**\n * use islandOnInit replace ngOnInit to avoid ngOnInit being overridden\n */\n abstract islandOnInit(): void;\n\n /**\n * use islandOnDestroy replace ngOnDestroy to avoid ngOnDestroy being overridden\n */\n abstract islandOnDestroy(): void;\n}\n\nexport interface OnBoardChange {\n onBoardChange: () => void;\n}\n\nexport const hasOnBoardChange = (value: any): value is OnBoardChange => {\n if (value.onBoardChange) {\n return true;\n } else {\n return false;\n }\n};\n","import { ComponentType, PlaitBoard } from '@plait/core';\nimport { AngularBoard } from './angular-board';\nimport { PlaitTextBoard, TextComponentRef, TextProps } from '@plait/common';\nimport { PlaitTextComponent } from '@plait/angular-text';\nimport { AngularEditor } from 'slate-angular';\nimport { BOARD_TO_COMPONENT } from '../utils/weak-maps';\nimport { BoardComponentInterface } from '../board/board.component.interface';\n\nexport const withAngular = (board: PlaitBoard & PlaitTextBoard) => {\n const newBoard = board as PlaitBoard & PlaitTextBoard & AngularBoard;\n\n newBoard.renderComponent = <T, K extends { nativeElement: () => HTMLElement }>(\n type: ComponentType<K>,\n container: Element | DocumentFragment,\n props: T\n ) => {\n const boardComponent = BOARD_TO_COMPONENT.get(board) as BoardComponentInterface;\n const componentRef = boardComponent.viewContainerRef.createComponent<K>(type);\n for (const key in props) {\n const value = props[key as keyof T];\n (componentRef.instance as any)[key as keyof TextProps] = value as any;\n }\n container.appendChild(componentRef.instance.nativeElement());\n componentRef.changeDetectorRef.detectChanges();\n const ref: TextComponentRef = {\n destroy: () => {\n componentRef.destroy();\n },\n update: (props: Partial<TextProps>) => {\n for (const key in props) {\n const value = props[key as keyof TextProps];\n (componentRef.instance as any)[key] = value;\n }\n // solve image lose on move node\n if (container.children.length === 0) {\n container.append(componentRef.instance.nativeElement());\n }\n componentRef.changeDetectorRef.detectChanges();\n }\n };\n return { ref, componentRef };\n };\n\n newBoard.renderText = (container: Element | DocumentFragment, props: TextProps) => {\n const { ref, componentRef } = newBoard.renderComponent(PlaitTextComponent, container, props);\n const { update } = ref;\n ref.update = props => {\n const beforeReadonly = componentRef.instance.readonly;\n update(props);\n if (beforeReadonly === true && props.readonly === false) {\n AngularEditor.focus(componentRef.instance.editor);\n } else if (beforeReadonly === false && props.readonly === true) {\n AngularEditor.blur(componentRef.instance.editor);\n }\n };\n return ref;\n };\n\n return newBoard;\n};\n","import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n SimpleChanges,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport rough from 'roughjs/bin/rough';\nimport { RoughSVG } from 'roughjs/bin/svg';\nimport { fromEvent, Subject } from 'rxjs';\nimport { filter, takeUntil, tap } from 'rxjs/operators';\nimport { BoardComponentInterface } from './board.component.interface';\nimport {\n BOARD_TO_AFTER_CHANGE,\n BOARD_TO_CONTEXT,\n BOARD_TO_ELEMENT_HOST,\n BOARD_TO_HOST,\n BOARD_TO_MOVING_POINT,\n BOARD_TO_MOVING_POINT_IN_BOARD,\n BOARD_TO_ON_CHANGE,\n BOARD_TO_ROUGH_SVG,\n BoardTransforms,\n HOST_CLASS_NAME,\n IS_BOARD_ALIVE,\n IS_CHROME,\n IS_FIREFOX,\n IS_SAFARI,\n ListRender,\n PlaitBoard,\n PlaitBoardContext,\n PlaitBoardOptions,\n PlaitChildrenContext,\n PlaitElement,\n PlaitPlugin,\n PlaitTheme,\n Viewport,\n WritableClipboardOperationType,\n ZOOM_STEP,\n createBoard,\n deleteFragment,\n getClipboardData,\n hasInputOrTextareaTarget,\n initializeViewBox,\n initializeViewportContainer,\n initializeViewportOffset,\n isFromViewportChange,\n isPreventTouchMove,\n setFragment,\n setIsFromViewportChange,\n toHostPoint,\n toViewBoxPoint,\n updateViewportByScrolling,\n updateViewportOffset,\n withBoard,\n withHandPointer,\n withHistory,\n withHotkey,\n withMoving,\n withOptions,\n withRelatedFragment,\n withSelection,\n withViewport\n} from '@plait/core';\nimport { PlaitIslandBaseComponent, hasOnBoardChange } from '../island/island-base.component';\nimport { BOARD_TO_COMPONENT } from '../utils/weak-maps';\nimport { withAngular } from '../plugins/with-angular';\nimport { withImage, withText } from '@plait/common';\nimport { OnChangeData } from '../plugins/angular-board';\n\nconst ElementLowerHostClass = 'element-lower-host';\nconst ElementHostClass = 'element-host';\nconst ElementUpperHostClass = 'element-upper-host';\nconst ElementActiveHostClass = 'element-active-host';\n\n@Component({\n selector: 'plait-board',\n template: `\n <div class=\"viewport-container\" #viewportContainer>\n <svg #svg width=\"100%\" height=\"100%\" style=\"position: relative;\" class=\"board-host-svg\">\n <g class=\"element-lower-host\"></g>\n <g class=\"element-host\"></g>\n <g class=\"element-upper-host\"></g>\n <g class=\"element-active-host\"></g>\n </svg>\n </div>\n <ng-content></ng-content>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true\n})\nexport class PlaitBoardComponent implements BoardComponentInterface, OnInit, OnChanges, AfterViewInit, AfterContentInit, OnDestroy {\n hasInitialized = false;\n\n board!: PlaitBoard;\n\n roughSVG!: RoughSVG;\n\n destroy$ = new Subject<void>();\n\n private resizeObserver!: ResizeObserver;\n\n @Input() plaitValue: PlaitElement[] = [];\n\n @Input() plaitViewport!: Viewport;\n\n @Input() plaitPlugins: PlaitPlugin[] = [];\n\n @Input() plaitOptions?: PlaitBoardOptions;\n\n @Input() plaitTheme?: PlaitTheme;\n\n @Output() onChange: EventEmitter<OnChangeData> = new EventEmitter();\n\n @Output() plaitBoardInitialized: EventEmitter<PlaitBoard> = new EventEmitter();\n\n get host(): SVGSVGElement {\n return this.svg.nativeElement;\n }\n\n @HostBinding('class')\n get hostClass() {\n return `${HOST_CLASS_NAME} theme-${this.board.theme.themeColorMode} ${this.getBrowserClassName()}`;\n }\n\n getBrowserClassName() {\n if (IS_SAFARI) {\n return 'safari';\n }\n if (IS_CHROME) {\n return 'chrome';\n }\n if (IS_FIREFOX) {\n return 'firefox';\n }\n return '';\n }\n\n @HostBinding('class.readonly')\n get readonly() {\n return this.board.options.readonly;\n }\n\n @HostBinding('class.focused')\n get isFocused() {\n return PlaitBoard.isFocus(this.board);\n }\n\n @HostBinding('class.disabled-scroll')\n get disabledScrollOnNonFocus() {\n return this.board.options.disabledScrollOnNonFocus && !PlaitBoard.isFocus(this.board);\n }\n\n get nativeElement(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n @ViewChild('svg', { static: true })\n svg!: ElementRef;\n\n @ViewChild('viewportContainer', { read: ElementRef, static: true })\n viewportContainer!: ElementRef;\n\n @ContentChildren(PlaitIslandBaseComponent, { descendants: true }) islands?: QueryList<PlaitIslandBaseComponent>;\n\n listRender!: ListRender;\n\n constructor(\n public cdr: ChangeDetectorRef,\n public viewContainerRef: ViewContainerRef,\n private elementRef: ElementRef<HTMLElement>,\n private ngZone: NgZone\n ) {}\n\n ngOnInit(): void {\n const elementLowerHost = this.host.querySelector(`.${ElementLowerHostClass}`) as SVGGElement;\n const elementHost = this.host.querySelector(`.${ElementHostClass}`) as SVGGElement;\n const elementUpperHost = this.host.querySelector(`.${ElementUpperHostClass}`) as SVGGElement;\n const elementActiveHost = this.host.querySelector(`.${ElementActiveHostClass}`) as SVGGElement;\n const roughSVG = rough.svg(this.host as SVGSVGElement, {\n options: { roughness: 0, strokeWidth: 1 }\n });\n this.roughSVG = roughSVG;\n this.initializePlugins();\n this.ngZone.runOutsideAngular(() => {\n this.initializeHookListener();\n this.viewportScrollListener();\n this.wheelZoomListener();\n this.elementResizeListener();\n fromEvent<MouseEvent>(document, 'mouseleave')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n BOARD_TO_MOVING_POINT.delete(this.board);\n });\n });\n BOARD_TO_COMPONENT.set(this.board, this);\n BOARD_TO_ROUGH_SVG.set(this.board, roughSVG);\n BOARD_TO_HOST.set(this.board, this.host);\n IS_BOARD_ALIVE.set(this.board, true);\n BOARD_TO_ELEMENT_HOST.set(this.board, {\n lowerHost: elementLowerHost,\n host: elementHost,\n upperHost: elementUpperHost,\n activeHost: elementActiveHost,\n container: this.elementRef.nativeElement,\n viewportContainer: this.viewportContainer.nativeElement\n });\n BOARD_TO_ON_CHANGE.set(this.board, () => {\n this.ngZone.run(() => {\n this.updateListRender();\n });\n });\n BOARD_TO_AFTER_CHANGE.set(this.board, () => {\n this.ngZone.run(() => {\n const data: OnChangeData = {\n children: this.board.children,\n operations: this.board.operations,\n viewport: this.board.viewport,\n selection: this.board.selection,\n theme: this.board.theme\n };\n this.updateIslands();\n this.onChange.emit(data);\n });\n });\n const context = new PlaitBoardContext();\n BOARD_TO_CONTEXT.set(this.board, context);\n this.initializeListRender();\n this.elementRef.nativeElement.classList.add(`pointer-${this.board.pointer}`);\n this.hasInitialized = true;\n }\n\n ngAfterContentInit(): void {\n this.initializeIslands();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.hasInitialized) {\n const valueChange = changes['plaitValue'];\n const options = changes['plaitOptions'];\n\n if (valueChange) {\n this.board.children = valueChange.currentValue;\n this.updateListRender();\n }\n if (options) {\n this.board.options = options.currentValue;\n }\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n this.plaitBoardInitialized.emit(this.board);\n initializeViewportContainer(this.board);\n initializeViewBox(this.board);\n initializeViewportOffset(this.board);\n }\n\n private initializePlugins() {\n let board = withRelatedFragment(\n withHotkey(\n withHandPointer(\n withHistory(\n withSelection(\n withMoving(\n withBoard(\n withViewport(\n withOptions(withAngular(withImage(withText(createBoard(this.plaitValue, this.plaitOptions)))))\n )\n )\n )\n )\n )\n )\n )\n );\n this.plaitPlugins.forEach(plugin => {\n board = plugin(board);\n });\n this.board = board;\n\n if (this.plaitViewport) {\n this.board.viewport = this.plaitViewport;\n }\n\n if (this.plaitTheme) {\n this.board.theme = this.plaitTheme;\n }\n }\n\n private initializeHookListener() {\n fromEvent<MouseEvent>(this.host, 'mousedown')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n this.board.mousedown(event);\n });\n\n fromEvent<PointerEvent>(this.host, 'pointerdown')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: PointerEvent) => {\n this.board.pointerDown(event);\n });\n\n fromEvent<MouseEvent>(this.host, 'mousemove')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n BOARD_TO_MOVING_POINT_IN_BOARD.set(this.board, [event.x, event.y]);\n this.board.mousemove(event);\n });\n\n fromEvent<PointerEvent>(this.host, 'pointermove')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: PointerEvent) => {\n BOARD_TO_MOVING_POINT_IN_BOARD.set(this.board, [event.x, event.y]);\n this.board.pointerMove(event);\n });\n\n fromEvent<MouseEvent>(this.host, 'mouseleave')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n BOARD_TO_MOVING_POINT_IN_BOARD.delete(this.board);\n this.board.mouseleave(event);\n });\n\n fromEvent<PointerEvent>(this.host, 'pointerleave')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: PointerEvent) => {\n BOARD_TO_MOVING_POINT_IN_BOARD.delete(this.board);\n this.board.pointerLeave(event);\n });\n\n fromEvent<MouseEvent>(document, 'mousemove')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n BOARD_TO_MOVING_POINT.set(this.board, [event.x, event.y]);\n this.board.globalMousemove(event);\n });\n\n fromEvent<PointerEvent>(document, 'pointermove')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: PointerEvent) => {\n BOARD_TO_MOVING_POINT.set(this.board, [event.x, event.y]);\n this.board.globalPointerMove(event);\n });\n\n fromEvent<MouseEvent>(this.host, 'mouseup')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n this.board.mouseup(event);\n });\n\n fromEvent<PointerEvent>(this.host, 'pointerup')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: PointerEvent) => {\n this.board.pointerUp(event);\n });\n\n fromEvent<MouseEvent>(document, 'mouseup')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: MouseEvent) => {\n this.board.globalMouseup(event);\n });\n\n fromEvent<PointerEvent>(document, 'pointerup')\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: PointerEvent) => {\n this.board.globalPointerUp(event);\n });\n\n fromEvent<MouseEvent>(this.host, 'dblclick')\n .pipe(\n takeUntil(this.destroy$),\n filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board))\n )\n .subscribe((event: MouseEvent) => {\n this.board.dblClick(event);\n });\n\n fromEvent<KeyboardEvent>(document, 'keydown')\n .pipe(\n takeUntil(this.destroy$),\n tap(event => {\n this.board.globalKeyDown(event);\n }),\n filter(event => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board) && !hasInputOrTextareaTarget(event.target))\n )\n .subscribe((event: KeyboardEvent) => {\n this.board.keyDown(event);\n });\n\n fromEvent<KeyboardEvent>(document, 'keyup')\n .pipe(\n takeUntil(this.destroy$),\n filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board))\n )\n .subscribe((event: KeyboardEvent) => {\n this.board?.keyUp(event);\n });\n\n fromEvent<ClipboardEvent>(document, 'copy')\n .pipe(\n takeUntil(this.destroy$),\n filter(() => this.isFocused && !PlaitBoard.hasBeenTextEditing(this.board))\n )\n .subscribe((event: ClipboardEvent) => {\n event.preventDefault();\n setFragment(this.board, WritableClipboardOperationType.copy, event.clipboardData);\n });\n\n fromEvent<ClipboardEvent>(document, 'paste')\n .pipe(\n takeUntil(this.destroy$),\n filter(() => this.isFocused && !PlaitBoard.isReadonly(this.board) && !PlaitBoard.hasBeenTextEditing(this.board))\n )\n .subscribe(async (clipboardEvent: ClipboardEvent) => {\n const mousePoint = PlaitBoard.getMovingPointInBoard(this.board);\n if (mousePoint) {\n const targetPoint = toViewBoxPoint(this.board, toHostPoint(this.board, mousePoint[0], mousePoint[1]));\n const clipboardData = await getClipboardData(clipboardEvent.clipboardData);\n this.board.insertFragment(clipboardData, targetPoint, WritableClipboardOperationType.paste);\n }\n });\n\n fromEvent<ClipboardEvent>(document, 'cut')\n .pipe(\n takeUntil(this.destroy$),\n filter(() => this.isFocused && !PlaitBoard.isReadonly(this.board) && !PlaitBoard.hasBeenTextEditing(this.board))\n )\n .subscribe((event: ClipboardEvent) => {\n event.preventDefault();\n setFragment(this.board, WritableClipboardOperationType.cut, event.clipboardData);\n deleteFragment(this.board);\n });\n }\n\n private initializeListRender() {\n this.listRender = new ListRender(this.board);\n this.listRender.initialize(this.board.children, this.initializeChildrenContext());\n }\n\n private updateListRender() {\n this.listRender.update(this.board.children, this.initializeChildrenContext());\n PlaitBoard.getBoardContext(this.board).nextStable();\n }\n\n private initializeChildrenContext(): PlaitChildrenContext {\n return {\n board: this.board,\n parent: this.board,\n parentG: PlaitBoard.getElementHost(this.board)\n };\n }\n\n private viewportScrollListener() {\n fromEvent<MouseEvent>(this.viewportContainer.nativeElement, 'scroll')\n .pipe(\n takeUntil(this.destroy$),\n filter(() => {\n if (isFromViewportChange(this.board)) {\n setIsFromViewportChange(this.board, false);\n return false;\n }\n return true;\n })\n )\n .subscribe((event: Event) => {\n const { scrollLeft, scrollTop } = event.target as HTMLElement;\n updateViewportByScrolling(this.board, scrollLeft, scrollTop);\n });\n fromEvent<MouseEvent>(this.viewportContainer.nativeElement, 'touchmove', { passive: false })\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: Event) => {\n if (isPreventTouchMove(this.board)) {\n event.preventDefault();\n }\n });\n }\n\n private elementResizeListener() {\n this.resizeObserver = new ResizeObserver(() => {\n initializeViewportContainer(this.board);\n initializeViewBox(this.board);\n updateViewportOffset(this.board);\n });\n this.resizeObserver.observe(this.nativeElement);\n }\n\n private initializeIslands() {\n this.islands?.forEach(island => {\n island.initialize(this.board);\n });\n }\n\n private updateIslands() {\n this.islands?.forEach(island => {\n if (hasOnBoardChange(island)) {\n island.onBoardChange();\n }\n island.markForCheck();\n });\n }\n\n private wheelZoomListener() {\n fromEvent<WheelEvent>(this.host, 'wheel', { passive: false })\n .pipe(takeUntil(this.destroy$))\n .subscribe((event: WheelEvent) => {\n // Credits to excalidraw\n // https://github.com/excalidraw/excalidraw/blob/b7d7ccc929696cc17b4cc34452e4afd846d59f4f/src/components/App.tsx#L9060\n if (event.metaKey || event.ctrlKey) {\n event.preventDefault();\n const { deltaX, deltaY } = event;\n const zoom = this.board.viewport.zoom;\n const sign = Math.sign(deltaY);\n const MAX_STEP = ZOOM_STEP * 100;\n const absDelta = Math.abs(deltaY);\n let delta = deltaY;\n if (absDelta > MAX_STEP) {\n delta = MAX_STEP * sign;\n }\n let newZoom = zoom - delta / 100;\n // increase zoom steps the more zoomed-in we are (applies to >100% only)\n newZoom +=\n Math.log10(Math.max(1, zoom)) *\n -sign *\n // reduced amplification for small deltas (small movements on a trackpad)\n Math.min(1, absDelta / 20);\n BoardTransforms.updateZoom(this.board, newZoom, false);\n }\n });\n }\n\n trackBy = (index: number, element: PlaitElement) => {\n return element.id;\n };\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.resizeObserver && this.resizeObserver?.disconnect();\n BOARD_TO_ROUGH_SVG.delete(this.board);\n BOARD_TO_COMPONENT.delete(this.board);\n BOARD_TO_ROUGH_SVG.delete(this.board);\n BOARD_TO_HOST.delete(this.board);\n BOARD_TO_ELEMENT_HOST.delete(this.board);\n IS_BOARD_ALIVE.set(this.board, false);\n BOARD_TO_ON_CHANGE.delete(this.board);\n BOARD_TO_AFTER_CHANGE.set(this.board, () => {});\n }\n\n markForCheck() {\n this.cdr.markForCheck();\n this.ngZone.run(() => {\n this.updateIslands();\n });\n }\n}\n","/*\n * Public API Surface of plait\n */\n\nexport * from './board/board.component';\nexport * from './board/board.component.interface';\nexport * from './plugins/angular-board';\nexport * from './island/island-base.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;AAGO,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAuC;;MCQ9D,wBAAwB,CAAA;AAG1C,IAAA,WAAA,CAAsB,GAAsB,EAAA;QAAtB,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;KAAI;AAEhD,IAAA,UAAU,CAAC,KAAiB,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;KACvB;IAED,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;KAC3B;8GAZiB,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAL7C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,IAAI,EAAE;AACF,wBAAA,KAAK,EAAE,wBAAwB;AAClC,qBAAA;AACJ,iBAAA,CAAA;;MAqBqB,+BAA+B,CAAA;AAKjD,IAAA,WAAA,CAAmB,GAAsB,EAAA;QAAtB,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;KAAI;AAE7C,IAAA,UAAU,CAAC,KAAiB,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAA4B,CAAC;QAChF,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;AACvD,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;aACxB;AACD,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AAC5B,SAAC,CAAC,CAAC;KACN;IAED,QAAQ,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAClD;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;KACvB;IAED,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,EAAE,CAAC;KAC1B;8GA7BiB,+BAA+B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAA/B,+BAA+B,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gCAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBALpD,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,IAAI,EAAE;AACF,wBAAA,KAAK,EAAE,gCAAgC;AAC1C,qBAAA;AACJ,iBAAA,CAAA;sFAEY,KAAK,EAAA,CAAA;sBAAb,KAAK;;AA6CG,MAAA,gBAAgB,GAAG,CAAC,KAAU,KAA4B;AACnE,IAAA,IAAI,KAAK,CAAC,aAAa,EAAE;AACrB,QAAA,OAAO,IAAI,CAAC;KACf;SAAM;AACH,QAAA,OAAO,KAAK,CAAC;KAChB;AACL;;AC3EO,MAAM,WAAW,GAAG,CAAC,KAAkC,KAAI;IAC9D,MAAM,QAAQ,GAAG,KAAmD,CAAC;IAErE,QAAQ,CAAC,eAAe,GAAG,CACvB,IAAsB,EACtB,SAAqC,EACrC,KAAQ,KACR;QACA,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAA4B,CAAC;QAChF,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC,eAAe,CAAI,IAAI,CAAC,CAAC;AAC9E,QAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACrB,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAc,CAAC,CAAC;AACnC,YAAA,YAAY,CAAC,QAAgB,CAAC,GAAsB,CAAC,GAAG,KAAY,CAAC;SACzE;QACD,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;AAC7D,QAAA,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;AAC/C,QAAA,MAAM,GAAG,GAAqB;YAC1B,OAAO,EAAE,MAAK;gBACV,YAAY,CAAC,OAAO,EAAE,CAAC;aAC1B;AACD,YAAA,MAAM,EAAE,CAAC,KAAyB,KAAI;AAClC,gBAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACrB,oBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAsB,CAAC,CAAC;AAC3C,oBAAA,YAAY,CAAC,QAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;iBAC/C;;gBAED,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;oBACjC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;iBAC3D;AACD,gBAAA,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;aAClD;SACJ,CAAC;AACF,QAAA,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;AACjC,KAAC,CAAC;IAEF,QAAQ,CAAC,UAAU,GAAG,CAAC,SAAqC,EAAE,KAAgB,KAAI;AAC9E,QAAA,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAC7F,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;AACvB,QAAA,GAAG,CAAC,MAAM,GAAG,KAAK,IAAG;AACjB,YAAA,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,IAAI,cAAc,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,EAAE;gBACrD,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACrD;iBAAM,IAAI,cAAc,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE;gBAC5D,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aACpD;AACL,SAAC,CAAC;AACF,QAAA,OAAO,GAAG,CAAC;AACf,KAAC,CAAC;AAEF,IAAA,OAAO,QAAQ,CAAC;AACpB,CAAC;;ACwBD,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;AACnD,MAAM,gBAAgB,GAAG,cAAc,CAAC;AACxC,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;AACnD,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;MAkBxC,mBAAmB,CAAA;AAyB5B,IAAA,IAAI,IAAI,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;KACjC;AAED,IAAA,IACI,SAAS,GAAA;AACT,QAAA,OAAO,GAAG,eAAe,CAAA,OAAA,EAAU,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;KACtG;IAED,mBAAmB,GAAA;QACf,IAAI,SAAS,EAAE;AACX,YAAA,OAAO,QAAQ,CAAC;SACnB;QACD,IAAI,SAAS,EAAE;AACX,YAAA,OAAO,QAAQ,CAAC;SACnB;QACD,IAAI,UAAU,EAAE;AACZ,YAAA,OAAO,SAAS,CAAC;SACpB;AACD,QAAA,OAAO,EAAE,CAAC;KACb;AAED,IAAA,IACI,QAAQ,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;KACtC;AAED,IAAA,IACI,SAAS,GAAA;QACT,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzC;AAED,IAAA,IACI,wBAAwB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzF;AAED,IAAA,IAAI,aAAa,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;KACxC;AAYD,IAAA,WAAA,CACW,GAAsB,EACtB,gBAAkC,EACjC,UAAmC,EACnC,MAAc,EAAA;QAHf,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QACtB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QACjC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAyB;QACnC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;QA/E1B,IAAc,CAAA,cAAA,GAAG,KAAK,CAAC;AAMvB,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;QAItB,IAAU,CAAA,UAAA,GAAmB,EAAE,CAAC;QAIhC,IAAY,CAAA,YAAA,GAAkB,EAAE,CAAC;AAMhC,QAAA,IAAA,CAAA,QAAQ,GAA+B,IAAI,YAAY,EAAE,CAAC;AAE1D,QAAA,IAAA,CAAA,qBAAqB,GAA6B,IAAI,YAAY,EAAE,CAAC;AAka/E,QAAA,IAAA,CAAA,OAAO,GAAG,CAAC,KAAa,EAAE,OAAqB,KAAI;YAC/C,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,SAAC,CAAC;KA1WE;IAEJ,QAAQ,GAAA;AACJ,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAI,CAAA,EAAA,qBAAqB,CAAE,CAAA,CAAgB,CAAC;AAC7F,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAI,CAAA,EAAA,gBAAgB,CAAE,CAAA,CAAgB,CAAC;AACnF,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAI,CAAA,EAAA,qBAAqB,CAAE,CAAA,CAAgB,CAAC;AAC7F,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAI,CAAA,EAAA,sBAAsB,CAAE,CAAA,CAAgB,CAAC;QAC/F,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAqB,EAAE;YACnD,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;AAC5C,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;YAC/B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC7B,YAAA,SAAS,CAAa,QAAQ,EAAE,YAAY,CAAC;AACxC,iBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,iBAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,gBAAA,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7C,aAAC,CAAC,CAAC;AACX,SAAC,CAAC,CAAC;QACH,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;AAClC,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,UAAU,EAAE,iBAAiB;AAC7B,YAAA,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa;AACxC,YAAA,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa;AAC1D,SAAA,CAAC,CAAC;QACH,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAK;AACpC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;gBACjB,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC5B,aAAC,CAAC,CAAC;AACP,SAAC,CAAC,CAAC;QACH,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAK;AACvC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;AACjB,gBAAA,MAAM,IAAI,GAAiB;AACvB,oBAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;AAC7B,oBAAA,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;AACjC,oBAAA,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;AAC7B,oBAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;iBAC1B,CAAC;gBACF,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,aAAC,CAAC,CAAC;AACP,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;AAC7E,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC9B;IAED,kBAAkB,GAAA;QACd,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC5B;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAC1C,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;YAExC,IAAI,WAAW,EAAE;gBACb,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC;gBAC/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;aAC3B;YACD,IAAI,OAAO,EAAE;gBACT,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;aAC7C;AACD,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;SAC3B;KACJ;IAED,eAAe,GAAA;QACX,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,QAAA,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,QAAA,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,QAAA,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACxC;IAEO,iBAAiB,GAAA;QACrB,IAAI,KAAK,GAAG,mBAAmB,CAC3B,UAAU,CACN,eAAe,CACX,WAAW,CACP,aAAa,CACT,UAAU,CACN,SAAS,CACL,YAAY,CACR,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CACjG,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,IAAG;AAC/B,YAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AAEnB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;SAC5C;AAED,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;SACtC;KACJ;IAEO,sBAAsB,GAAA;AAC1B,QAAA,SAAS,CAAa,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;AACxC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAe,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;AAC5C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAmB,KAAI;AAC/B,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAClC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAa,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;AACxC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAe,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;AAC5C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAmB,KAAI;AAC/B,YAAA,8BAA8B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAClC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAa,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;AACzC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACjC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAe,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;AAC7C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAmB,KAAI;AAC/B,YAAA,8BAA8B,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAa,QAAQ,EAAE,WAAW,CAAC;AACvC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AACtC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAe,QAAQ,EAAE,aAAa,CAAC;AAC3C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAmB,KAAI;AAC/B,YAAA,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACxC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAa,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;AACtC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAe,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;AAC1C,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAmB,KAAI;AAC/B,YAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAChC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAa,QAAQ,EAAE,SAAS,CAAC;AACrC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAe,QAAQ,EAAE,WAAW,CAAC;AACzC,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAmB,KAAI;AAC/B,YAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AACtC,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAa,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;aACvC,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC7E;AACA,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC/B,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAgB,QAAQ,EAAE,SAAS,CAAC;AACxC,aAAA,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,GAAG,CAAC,KAAK,IAAG;AACR,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpC,SAAC,CAAC,EACF,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAC3H;AACA,aAAA,SAAS,CAAC,CAAC,KAAoB,KAAI;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAgB,QAAQ,EAAE,OAAO,CAAC;aACtC,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC7E;AACA,aAAA,SAAS,CAAC,CAAC,KAAoB,KAAI;AAChC,YAAA,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAiB,QAAQ,EAAE,MAAM,CAAC;aACtC,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC7E;AACA,aAAA,SAAS,CAAC,CAAC,KAAqB,KAAI;YACjC,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,YAAA,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,8BAA8B,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;AACtF,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAiB,QAAQ,EAAE,OAAO,CAAC;AACvC,aAAA,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACnH;AACA,aAAA,SAAS,CAAC,OAAO,cAA8B,KAAI;YAChD,MAAM,UAAU,GAAG,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChE,IAAI,UAAU,EAAE;gBACZ,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtG,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AAC3E,gBAAA,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,WAAW,EAAE,8BAA8B,CAAC,KAAK,CAAC,CAAC;aAC/F;AACL,SAAC,CAAC,CAAC;AAEP,QAAA,SAAS,CAAiB,QAAQ,EAAE,KAAK,CAAC;AACrC,aAAA,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACnH;AACA,aAAA,SAAS,CAAC,CAAC,KAAqB,KAAI;YACjC,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,YAAA,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,8BAA8B,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;AACjF,YAAA,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,SAAC,CAAC,CAAC;KACV;IAEO,oBAAoB,GAAA;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;KACrF;IAEO,gBAAgB,GAAA;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAC9E,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;KACvD;IAEO,yBAAyB,GAAA;QAC7B,OAAO;YACH,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,KAAK;YAClB,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;SACjD,CAAC;KACL;IAEO,sBAAsB,GAAA;QAC1B,SAAS,CAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC;aAChE,IAAI,CACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,MAAK;AACR,YAAA,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAClC,gBAAA,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3C,gBAAA,OAAO,KAAK,CAAC;aAChB;AACD,YAAA,OAAO,IAAI,CAAC;AAChB,SAAC,CAAC,CACL;AACA,aAAA,SAAS,CAAC,CAAC,KAAY,KAAI;YACxB,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,MAAqB,CAAC;YAC9D,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACjE,SAAC,CAAC,CAAC;AACP,QAAA,SAAS,CAAa,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACvF,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAY,KAAI;AACxB,YAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAChC,KAAK,CAAC,cAAc,EAAE,CAAC;aAC1B;AACL,SAAC,CAAC,CAAC;KACV;IAEO,qBAAqB,GAAA;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAK;AAC1C,YAAA,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,YAAA,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,YAAA,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACnD;IAEO,iBAAiB,GAAA;AACrB,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAG;AAC3B,YAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClC,SAAC,CAAC,CAAC;KACN;IAEO,aAAa,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,IAAG;AAC3B,YAAA,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE;gBAC1B,MAAM,CAAC,aAAa,EAAE,CAAC;aAC1B;YACD,MAAM,CAAC,YAAY,EAAE,CAAC;AAC1B,SAAC,CAAC,CAAC;KACN;IAEO,iBAAiB,GAAA;AACrB,QAAA,SAAS,CAAa,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACxD,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,aAAA,SAAS,CAAC,CAAC,KAAiB,KAAI;;;YAG7B,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;gBAChC,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,gBAAA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,gBAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,KAAK,GAAG,MAAM,CAAC;AACnB,gBAAA,IAAI,QAAQ,GAAG,QAAQ,EAAE;AACrB,oBAAA,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;iBAC3B;AACD,gBAAA,IAAI,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC;;gBAEjC,OAAO;oBACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7B,wBAAA,CAAC,IAAI;;wBAEL,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;gBAC/B,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;aAC1D;AACL,SAAC,CAAC,CAAC;KACV;IAMD,WAAW,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;AACzD,QAAA,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,QAAA,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACtC,QAAA,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtC,QAAA,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAK,GAAG,CAAC,CAAC;KACnD;IAED,YAAY,GAAA;AACR,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;YACjB,IAAI,CAAC,aAAa,EAAE,CAAC;AACzB,SAAC,CAAC,CAAC;KACN;8GAhdQ,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAwEX,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,uBAAA,EAAA,+BAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAAA,wBAAwB,EAHD,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAA,UAAU,EAnFxC,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;AAUT,IAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;2FAIQ,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAhB/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;AAUT,IAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,UAAU,EAAE,IAAI;AACnB,iBAAA,CAAA;mKAYY,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAEG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAEG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAEG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBAEG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBAEI,QAAQ,EAAA,CAAA;sBAAjB,MAAM;gBAEG,qBAAqB,EAAA,CAAA;sBAA9B,MAAM;gBAOH,SAAS,EAAA,CAAA;sBADZ,WAAW;uBAAC,OAAO,CAAA;gBAmBhB,QAAQ,EAAA,CAAA;sBADX,WAAW;uBAAC,gBAAgB,CAAA;gBAMzB,SAAS,EAAA,CAAA;sBADZ,WAAW;uBAAC,eAAe,CAAA;gBAMxB,wBAAwB,EAAA,CAAA;sBAD3B,WAAW;uBAAC,uBAAuB,CAAA;gBAUpC,GAAG,EAAA,CAAA;sBADF,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAIlC,iBAAiB,EAAA,CAAA;sBADhB,SAAS;uBAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAGA,OAAO,EAAA,CAAA;sBAAxE,eAAe;AAAC,gBAAA,IAAA,EAAA,CAAA,wBAAwB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;;;AChLpE;;AAEG;;ACFH;;AAEG;;;;"}
|