bpmn-auto-layout 0.3.0 → 0.4.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 CHANGED
@@ -1,6 +1,3 @@
1
- > :warning: __This project is not officially maintained.__ You are still welcome to contribute, e.g. by fixing issues or creating enhancements.
2
-
3
-
4
1
  # bpmn-auto-layout
5
2
 
6
3
  [![CI](https://github.com/bpmn-io/bpmn-auto-layout/actions/workflows/CI.yml/badge.svg)](https://github.com/bpmn-io/bpmn-auto-layout/actions/workflows/CI.yml)
@@ -16,8 +16,34 @@ class Grid {
16
16
  this.grid = [];
17
17
  }
18
18
 
19
- add(element) {
20
- this._addStart(element);
19
+ add(element, position) {
20
+ if (!position) {
21
+ this._addStart(element);
22
+ return;
23
+ }
24
+
25
+ const [ row, col ] = position;
26
+ if (!row && !col) {
27
+ this._addStart(element);
28
+ }
29
+
30
+ if (!this.grid[row]) {
31
+ this.grid[row] = [];
32
+ }
33
+
34
+ if (this.grid[row][col]) {
35
+ throw new Error('Grid is occupied please ensure the place you insert at is not occupied');
36
+ }
37
+
38
+ this.grid[row][col] = element;
39
+ }
40
+
41
+ createRow(afterIndex) {
42
+ if (!afterIndex) {
43
+ this.grid.push([]);
44
+ }
45
+
46
+ this.grid.splice(afterIndex + 1, 0, []);
21
47
  }
22
48
 
23
49
  _addStart(element) {
@@ -217,7 +243,7 @@ function is(element, type) {
217
243
  }
218
244
 
219
245
  const DEFAULT_CELL_WIDTH = 150;
220
- const DEFAULT_CELL_HEIGHT = 110;
246
+ const DEFAULT_CELL_HEIGHT = 140;
221
247
 
222
248
  function getMid(bounds) {
223
249
  return {
@@ -283,18 +309,19 @@ function connectElements(source, target, layoutGrid) {
283
309
 
284
310
  // Source === Target ==> Build loop
285
311
  if (dX === 0 && dY === 0) {
312
+ const { x, y } = coordinatesToPosition(source.gridPosition.row, source.gridPosition.col);
286
313
  return [
287
314
  getDockingPoint(sourceMid, sourceBounds, 'r', dockingSource),
288
- { x: sourceMid.x + DEFAULT_CELL_WIDTH / 2, y: sourceMid.y },
289
- { x: sourceMid.x + DEFAULT_CELL_WIDTH / 2, y: sourceMid.y - DEFAULT_CELL_HEIGHT / 2 },
290
- { x: targetMid.x, y: sourceMid.y - DEFAULT_CELL_HEIGHT / 2 },
315
+ { x: x + DEFAULT_CELL_WIDTH, y: sourceMid.y },
316
+ { x: x + DEFAULT_CELL_WIDTH, y: y },
317
+ { x: targetMid.x, y: y },
291
318
  getDockingPoint(targetMid, targetBounds, 't', dockingTarget)
292
319
  ];
293
320
  }
294
321
 
295
322
  // connect horizontally
296
323
  if (dY === 0) {
297
- if (layoutGrid.getElementsInRange(source.gridPosition, target.gridPosition).length > 2) {
324
+ if (isDirectPathBlocked(source, target, layoutGrid)) {
298
325
 
299
326
  // Route on top
300
327
  return [
@@ -315,7 +342,7 @@ function connectElements(source, target, layoutGrid) {
315
342
 
316
343
  // connect vertically
317
344
  if (dX === 0) {
318
- if (layoutGrid.getElementsInRange(source.gridPosition, target.gridPosition).length > 2) {
345
+ if (isDirectPathBlocked(source, target, layoutGrid)) {
319
346
 
320
347
  // Route parallel
321
348
  const yOffset = -Math.sign(dY) * DEFAULT_CELL_HEIGHT / 2;
@@ -335,6 +362,20 @@ function connectElements(source, target, layoutGrid) {
335
362
  }
336
363
  }
337
364
 
365
+ const directManhattan = directManhattanConnect(source, target, layoutGrid);
366
+
367
+ if (directManhattan) {
368
+ const startPoint = getDockingPoint(sourceMid, sourceBounds, directManhattan[0], dockingSource);
369
+ const endPoint = getDockingPoint(targetMid, targetBounds, directManhattan[1], dockingTarget);
370
+
371
+ const midPoint = directManhattan[0] === 'h' ? { x: endPoint.x, y: startPoint.y } : { x: startPoint.x, y: endPoint.y };
372
+
373
+ return [
374
+ startPoint,
375
+ midPoint,
376
+ endPoint
377
+ ];
378
+ }
338
379
  const yOffset = -Math.sign(dY) * DEFAULT_CELL_HEIGHT / 2;
339
380
 
340
381
  return [
@@ -348,6 +389,15 @@ function connectElements(source, target, layoutGrid) {
348
389
  }
349
390
 
350
391
  // helpers /////
392
+ function coordinatesToPosition(row, col) {
393
+ return {
394
+ width: DEFAULT_CELL_WIDTH,
395
+ height: DEFAULT_CELL_HEIGHT,
396
+ x: col * DEFAULT_CELL_WIDTH,
397
+ y: row * DEFAULT_CELL_HEIGHT
398
+ };
399
+ }
400
+
351
401
  function getBounds(element, row, col, attachedTo) {
352
402
  const { width, height } = getDefaultSize(element);
353
403
 
@@ -369,10 +419,264 @@ function getBounds(element, row, col, attachedTo) {
369
419
  };
370
420
  }
371
421
 
422
+ function isDirectPathBlocked(source, target, layoutGrid) {
423
+ const { row: sourceRow, col: sourceCol } = source.gridPosition;
424
+ const { row: targetRow, col: targetCol } = target.gridPosition;
425
+
426
+ const dX = targetCol - sourceCol;
427
+ const dY = targetRow - sourceRow;
428
+
429
+ let totalElements = 0;
430
+
431
+ if (dX) {
432
+ totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: sourceCol }, { row: sourceRow, col: targetCol }).length;
433
+ }
434
+
435
+ if (dY) {
436
+ totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: targetCol }, { row: targetRow, col: targetCol }).length;
437
+ }
438
+
439
+ return totalElements > 2;
440
+ }
441
+
442
+ function directManhattanConnect(source, target, layoutGrid) {
443
+ const { row: sourceRow, col: sourceCol } = source.gridPosition;
444
+ const { row: targetRow, col: targetCol } = target.gridPosition;
445
+
446
+ const dX = targetCol - sourceCol;
447
+ const dY = targetRow - sourceRow;
448
+
449
+ // Only directly connect left-to-right flow
450
+ if (!(dX > 0 && dY !== 0)) {
451
+ return;
452
+ }
453
+
454
+ // If below, go down then horizontal
455
+ if (dY > 0) {
456
+ let totalElements = 0;
457
+ const bendPoint = { row: targetRow, col: sourceCol };
458
+ totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: sourceCol }, bendPoint).length;
459
+ totalElements += layoutGrid.getElementsInRange(bendPoint, { row: targetRow, col: targetCol }).length;
460
+
461
+ return totalElements > 2 ? false : [ 'v', 'h' ];
462
+ } else {
463
+
464
+ // If above, go horizontal than vertical
465
+ let totalElements = 0;
466
+ const bendPoint = { row: sourceRow, col: targetCol };
467
+
468
+ totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: sourceCol }, bendPoint).length;
469
+ totalElements += layoutGrid.getElementsInRange(bendPoint, { row: targetRow, col: targetCol }).length;
470
+
471
+ return totalElements > 2 ? false : [ 'h', 'v' ];
472
+ }
473
+ }
474
+
475
+ var attacherHandler = {
476
+ 'addToGrid': ({ element, grid, visited }) => {
477
+ const nextElements = [];
478
+
479
+ const attachedOutgoing = (element.attachers || [])
480
+ .map(att => att.outgoing.reverse())
481
+ .flat()
482
+ .map(out => out.targetRef);
483
+
484
+ // handle boundary events
485
+ attachedOutgoing.forEach((nextElement, index, arr) => {
486
+ if (visited.has(nextElement)) {
487
+ return;
488
+ }
489
+
490
+ // Add below and to the right of the element
491
+ insertIntoGrid(nextElement, element, grid);
492
+ nextElements.push(nextElement);
493
+ });
494
+
495
+ return nextElements;
496
+ },
497
+
498
+ 'createElementDi': ({ element, row, col, diFactory }) => {
499
+ const hostBounds = getBounds(element, row, col);
500
+
501
+ const DIs = [];
502
+ (element.attachers || []).forEach((att, i, arr) => {
503
+ att.gridPosition = { row, col };
504
+ const bounds = getBounds(att, row, col, element);
505
+
506
+ // distribute along lower edge
507
+ bounds.x = hostBounds.x + (i + 1) * (hostBounds.width / (arr.length + 1)) - bounds.width / 2;
508
+
509
+ const attacherDi = diFactory.createDiShape(att, bounds, {
510
+ id: att.id + '_di'
511
+ });
512
+ att.di = attacherDi;
513
+ att.gridPosition = { row, col };
514
+
515
+ DIs.push(attacherDi);
516
+ });
517
+
518
+ return DIs;
519
+ },
520
+
521
+ 'createConnectionDi': ({ element, row, col, layoutGrid, diFactory }) => {
522
+ const attachers = element.attachers || [];
523
+
524
+ return attachers.flatMap(att => {
525
+ const outgoing = att.outgoing || [];
526
+
527
+ return outgoing.map(out => {
528
+ const target = out.targetRef;
529
+ const waypoints = connectElements(att, target, layoutGrid);
530
+
531
+ // Correct waypoints if they don't automatically attach to the bottom
532
+ ensureExitBottom(att, waypoints, [ row, col ]);
533
+
534
+ const connectionDi = diFactory.createDiEdge(out, waypoints, {
535
+ id: out.id + '_di'
536
+ });
537
+
538
+ return connectionDi;
539
+ });
540
+ });
541
+ }
542
+ };
543
+
544
+
545
+ function insertIntoGrid(newElement, host, grid) {
546
+ const [ row, col ] = grid.find(host);
547
+
548
+ // Grid is occupied
549
+ if (grid.get(row + 1, col) || grid.get(row + 1, col + 1)) {
550
+ grid.createRow(row);
551
+ }
552
+
553
+ // Host has element directly after, add space
554
+ if (grid.get(row, col + 1)) {
555
+ grid.addAfter(host, null);
556
+ }
557
+
558
+ grid.add(newElement, [ row + 1, col + 1 ]);
559
+ }
560
+
561
+ function ensureExitBottom(source, waypoints, [ row, col ]) {
562
+
563
+ const sourceDi = source.di;
564
+ const sourceBounds = sourceDi.get('bounds');
565
+ const sourceMid = getMid(sourceBounds);
566
+
567
+ const dockingPoint = getDockingPoint(sourceMid, sourceBounds, 'b');
568
+ if (waypoints[0].x === dockingPoint.x && waypoints[0].y === dockingPoint.y) {
569
+ return;
570
+ }
571
+
572
+ if (waypoints.length === 2) {
573
+ const newStart = [
574
+ dockingPoint,
575
+ { x: dockingPoint.x, y: (row + 1) * DEFAULT_CELL_HEIGHT },
576
+ { x: (col + 1) * DEFAULT_CELL_WIDTH, y: (row + 1) * DEFAULT_CELL_HEIGHT },
577
+ { x: (col + 1) * DEFAULT_CELL_WIDTH, y: (row + 0.5) * DEFAULT_CELL_HEIGHT },
578
+ ];
579
+
580
+ waypoints.splice(0, 1, ...newStart);
581
+ return;
582
+ }
583
+
584
+ // add waypoints to exit bottom and connect to existing path
585
+ const newStart = [
586
+ dockingPoint,
587
+ { x: dockingPoint.x, y: (row + 1) * DEFAULT_CELL_HEIGHT },
588
+ { x: waypoints[1].x, y: (row + 1) * DEFAULT_CELL_HEIGHT },
589
+ ];
590
+
591
+ waypoints.splice(0, 1, ...newStart);
592
+ return;
593
+ }
594
+
595
+ var elementHandler = {
596
+ 'createElementDi': ({ element, row, col, diFactory }) => {
597
+
598
+ const bounds = getBounds(element, row, col);
599
+
600
+ const options = {
601
+ id: element.id + '_di'
602
+ };
603
+
604
+ if (is(element, 'bpmn:ExclusiveGateway')) {
605
+ options.isMarkerVisible = true;
606
+ }
607
+
608
+ const shapeDi = diFactory.createDiShape(element, bounds, options);
609
+ element.di = shapeDi;
610
+ element.gridPosition = { row, col };
611
+
612
+ return shapeDi;
613
+ }
614
+ };
615
+
616
+ var outgoingHandler = {
617
+ 'addToGrid': ({ element, grid, visited }) => {
618
+ const nextElements = [];
619
+
620
+ // Handle outgoing paths
621
+ const outgoing = (element.outgoing || [])
622
+ .map(out => out.targetRef)
623
+ .filter(el => el);
624
+
625
+ let previousElement = null;
626
+ outgoing.forEach((nextElement, index, arr) => {
627
+ if (visited.has(nextElement)) {
628
+ return;
629
+ }
630
+
631
+ if (!previousElement) {
632
+ grid.addAfter(element, nextElement);
633
+ }
634
+ else {
635
+ grid.addBelow(arr[index - 1], nextElement);
636
+ }
637
+
638
+ // Is self-looping
639
+ if (nextElement !== element) {
640
+ previousElement = nextElement;
641
+ }
642
+
643
+ nextElements.unshift(nextElement);
644
+ visited.add(nextElement);
645
+ });
646
+
647
+ return nextElements;
648
+ },
649
+ 'createConnectionDi': ({ element, row, col, layoutGrid, diFactory }) => {
650
+ const outgoing = element.outgoing || [];
651
+
652
+ return outgoing.map(out => {
653
+ const target = out.targetRef;
654
+ const waypoints = connectElements(element, target, layoutGrid);
655
+
656
+ const connectionDi = diFactory.createDiEdge(out, waypoints, {
657
+ id: out.id + '_di'
658
+ });
659
+
660
+ return connectionDi;
661
+ });
662
+
663
+ }
664
+ };
665
+
666
+ const handlers = [ elementHandler, outgoingHandler, attacherHandler ];
667
+
372
668
  class Layouter {
373
669
  constructor() {
374
670
  this.moddle = new BPMNModdle();
375
671
  this.diFactory = new DiFactory(this.moddle);
672
+ this._handlers = handlers;
673
+ }
674
+
675
+ handle(operation, options) {
676
+ return this._handlers
677
+ .filter(handler => minDash.isFunction(handler[operation]))
678
+ .map(handler => handler[operation](options));
679
+
376
680
  }
377
681
 
378
682
  async layoutProcess(xml) {
@@ -400,7 +704,6 @@ class Layouter {
400
704
  createGridLayout(root) {
401
705
  const grid = new Grid();
402
706
 
403
- // const process = this.getProcess();
404
707
  const flowElements = root.flowElements;
405
708
 
406
709
  const startingElements = flowElements.filter(el => {
@@ -431,54 +734,11 @@ class Layouter {
431
734
  this.handlePlane(currentElement);
432
735
  }
433
736
 
434
- // Handle outgoing paths
435
- const outgoing = (currentElement.outgoing || [])
436
- .map(out => out.targetRef)
437
- .filter(el => el);
438
-
439
- let previousElement = null;
440
- outgoing.forEach((nextElement, index, arr) => {
441
- if (visited.has(nextElement)) {
442
- return;
443
- }
444
-
445
- if (!previousElement) {
446
- grid.addAfter(currentElement, nextElement);
447
- }
448
- else {
449
- grid.addBelow(arr[index - 1], nextElement);
450
- }
451
-
452
- // Is self-looping
453
- if (nextElement !== currentElement) {
454
- previousElement = nextElement;
455
- }
456
- });
457
-
458
- const attachedOutgoing = (currentElement.attachers || [])
459
- .map(att => att.outgoing)
460
- .flat()
461
- .map(out => out.targetRef);
737
+ const nextElements = this.handle('addToGrid', { element: currentElement, grid, visited });
462
738
 
463
- // handle boundary events
464
- attachedOutgoing.forEach((nextElement, index, arr) => {
465
- if (visited.has(nextElement)) {
466
- return;
467
- }
468
-
469
- const below = arr[index - 1] || currentElement;
470
- grid.addBelow(below, nextElement);
471
- stack.push(nextElement);
472
- visited.add(nextElement);
473
- });
474
-
475
- // add to stack in reverse order: first element should be first of the stack
476
- outgoing.reverse().forEach(el => {
477
- if (visited.has(el)) {
478
- return;
479
- }
480
- visited.add(el);
739
+ nextElements.flat().forEach(el => {
481
740
  stack.push(el);
741
+ visited.add(el);
482
742
  });
483
743
  }
484
744
 
@@ -507,62 +767,20 @@ class Layouter {
507
767
 
508
768
  // Step 1: Create DI for all elements
509
769
  layoutGrid.elementsByPosition().forEach(({ element, row, col }) => {
510
- const bounds = getBounds(element, row, col);
770
+ const dis = this
771
+ .handle('createElementDi', { element, row, col, layoutGrid, diFactory })
772
+ .flat();
511
773
 
512
- const shapeDi = diFactory.createDiShape(element, bounds, {
513
- id: element.id + '_di'
514
- });
515
- element.di = shapeDi;
516
- element.gridPosition = { row, col };
517
-
518
- planeElement.push(shapeDi);
519
-
520
- // handle attachers
521
- (element.attachers || []).forEach(att => {
522
- att.gridPosition = { row, col };
523
- const attacherBounds = getBounds(att, row, col, element);
524
-
525
- const attacherDi = diFactory.createDiShape(att, attacherBounds, {
526
- id: att.id + '_di'
527
- });
528
- att.di = attacherDi;
529
- att.gridPosition = { row, col };
530
-
531
- planeElement.push(attacherDi);
532
- });
774
+ planeElement.push(...dis);
533
775
  });
534
776
 
535
777
  // Step 2: Create DI for all connections
536
778
  layoutGrid.elementsByPosition().forEach(({ element, row, col }) => {
537
- const outgoing = element.outgoing || [];
538
-
539
- outgoing.forEach(out => {
540
- const target = out.targetRef;
541
- const waypoints = connectElements(element, target, layoutGrid);
542
-
543
- const connectionDi = diFactory.createDiEdge(out, waypoints, {
544
- id: out.id + '_di'
545
- });
546
-
547
- planeElement.push(connectionDi);
548
- });
549
-
550
- // handle attachers
551
- (element.attachers || []).forEach(att => {
552
- const outgoing = att.outgoing || [];
553
-
554
- outgoing.forEach(out => {
555
- const target = out.targetRef;
556
- const waypoints = connectElements(att, target, layoutGrid);
557
-
558
- const connectionDi = diFactory.createDiEdge(out, waypoints, {
559
- id: out.id + '_di'
560
- });
561
-
562
- planeElement.push(connectionDi);
563
- });
564
- });
779
+ const dis = this
780
+ .handle('createConnectionDi', { element, row, col, layoutGrid, diFactory })
781
+ .flat();
565
782
 
783
+ planeElement.push(...dis);
566
784
  });
567
785
  }
568
786
 
@@ -577,4 +795,4 @@ function layoutProcess(xml) {
577
795
  }
578
796
 
579
797
  exports.layoutProcess = layoutProcess;
580
- //# sourceMappingURL=index.js.map
798
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../lib/utils/elementUtils.js","../lib/Grid.js","../lib/di/DiFactory.js","../lib/di/DiUtil.js","../lib/utils/layoutUtil.js","../lib/handler/attachersHandler.js","../lib/handler/elementHandler.js","../lib/handler/outgoingHandler.js","../lib/handler/index.js","../lib/Layouter.js","../lib/index.js"],"sourcesContent":["export function isConnection(element) {\n return !!element.sourceRef;\n}\n\nexport function isBoundaryEvent(element) {\n return !!element.attachedToRef;\n}","export class Grid {\n constructor() {\n this.grid = [];\n }\n\n add(element, position) {\n if (!position) {\n this._addStart(element);\n return;\n }\n\n const [ row, col ] = position;\n if (!row && !col) {\n this._addStart(element);\n }\n\n if (!this.grid[row]) {\n this.grid[row] = [];\n }\n\n if (this.grid[row][col]) {\n throw new Error('Grid is occupied please ensure the place you insert at is not occupied');\n }\n\n this.grid[row][col] = element;\n }\n\n createRow(afterIndex) {\n if (!afterIndex) {\n this.grid.push([]);\n }\n\n this.grid.splice(afterIndex + 1, 0, []);\n }\n\n _addStart(element) {\n this.grid.push([ element ]);\n }\n\n addAfter(element, newElement) {\n if (!element) {\n this._addStart(newElement);\n }\n\n const [ row, col ] = this.find(element);\n this.grid[row].splice(col + 1, 0, newElement);\n }\n\n addBelow(element, newElement) {\n if (!element) {\n this._addStart(newElement);\n }\n\n const [ row, col ] = this.find(element);\n\n // We are at the bottom of the current grid - add empty row below\n if (!this.grid[row + 1]) {\n this.grid[row + 1] = [];\n }\n\n // The element below is already occupied - insert new row\n if (this.grid[row + 1][col]) {\n this.grid.splice(row + 1, 0, []);\n }\n\n if (this.grid[row + 1][col]) {\n throw new Error('Grid is occupied and we could not find a place - this should not happen');\n }\n\n this.grid[row + 1][col] = newElement;\n }\n\n find(element) {\n let row, col;\n row = this.grid.findIndex((row) => {\n col = row.findIndex((el) => {\n return el === element;\n });\n\n return col !== -1;\n });\n\n return [ row, col ];\n }\n\n get(row, col) {\n return (this.grid[row] || [])[col];\n }\n\n getElementsInRange({ row: startRow, col: startCol }, { row: endRow, col: endCol }) {\n const elements = [];\n\n if (startRow > endRow) {\n [ startRow, endRow ] = [ endRow, startRow ];\n }\n\n if (startCol > endCol) {\n [ startCol, endCol ] = [ endCol, startCol ];\n }\n\n for (let row = startRow; row <= endRow; row++) {\n for (let col = startCol; col <= endCol; col++) {\n const element = this.get(row, col);\n\n if (element) {\n elements.push(element);\n }\n }\n }\n\n return elements;\n }\n\n elementsByPosition() {\n const elements = [];\n\n this.grid.forEach((row, rowIndex) => {\n row.forEach((element, colIndex) => {\n if (!element) {\n return;\n }\n elements.push({\n element,\n row: rowIndex,\n col: colIndex\n });\n });\n });\n\n return elements;\n }\n}\n\n","import { assign, map, pick } from 'min-dash';\n\n\nexport class DiFactory {\n constructor(moddle) {\n this.moddle = moddle;\n }\n\n create(type, attrs) {\n return this.moddle.create(type, attrs || {});\n }\n\n createDiBounds(bounds) {\n return this.create('dc:Bounds', bounds);\n }\n\n createDiLabel() {\n return this.create('bpmndi:BPMNLabel', {\n bounds: this.createDiBounds()\n });\n }\n\n createDiShape(semantic, bounds, attrs) {\n return this.create('bpmndi:BPMNShape', assign({\n bpmnElement: semantic,\n bounds: this.createDiBounds(bounds)\n }, attrs));\n }\n\n createDiWaypoints(waypoints) {\n var self = this;\n\n return map(waypoints, function(pos) {\n return self.createDiWaypoint(pos);\n });\n }\n\n createDiWaypoint(point) {\n return this.create('dc:Point', pick(point, [ 'x', 'y' ]));\n }\n\n createDiEdge(semantic, waypoints, attrs) {\n return this.create('bpmndi:BPMNEdge', assign({\n bpmnElement: semantic,\n waypoint: this.createDiWaypoints(waypoints)\n }, attrs));\n }\n\n createDiPlane(attrs) {\n return this.create('bpmndi:BPMNPlane', attrs);\n }\n\n createDiDiagram(attrs) {\n return this.create('bpmndi:BPMNDiagram', attrs);\n }\n}","export function getDefaultSize(element) {\n if (is(element, 'bpmn:SubProcess')) {\n return { width: 100, height: 80 };\n }\n\n if (is(element, 'bpmn:Task')) {\n return { width: 100, height: 80 };\n }\n\n if (is(element, 'bpmn:Gateway')) {\n return { width: 50, height: 50 };\n }\n\n if (is(element, 'bpmn:Event')) {\n return { width: 36, height: 36 };\n }\n\n if (is(element, 'bpmn:Participant')) {\n return { width: 400, height: 100 };\n }\n\n if (is(element, 'bpmn:Lane')) {\n return { width: 400, height: 100 };\n }\n\n if (is(element, 'bpmn:DataObjectReference')) {\n return { width: 36, height: 50 };\n }\n\n if (is(element, 'bpmn:DataStoreReference')) {\n return { width: 50, height: 50 };\n }\n\n if (is(element, 'bpmn:TextAnnotation')) {\n return { width: 100, height: 30 };\n }\n\n return { width: 100, height: 80 };\n}\n\nexport function is(element, type) {\n return element.$instanceOf(type);\n}\n","import { getDefaultSize } from '../di/DiUtil';\n\nexport const DEFAULT_CELL_WIDTH = 150;\nexport const DEFAULT_CELL_HEIGHT = 140;\n\nexport function getMid(bounds) {\n return {\n x: bounds.x + bounds.width / 2,\n y: bounds.y + bounds.height / 2\n };\n}\n\nexport function getDockingPoint(point, rectangle, dockingDirection = 'r', targetOrientation = 'top-left') {\n\n // ensure we end up with a specific docking direction\n // based on the targetOrientation, if <h|v> is being passed\n\n if (dockingDirection === 'h') {\n dockingDirection = /left/.test(targetOrientation) ? 'l' : 'r';\n }\n\n if (dockingDirection === 'v') {\n dockingDirection = /top/.test(targetOrientation) ? 't' : 'b';\n }\n\n if (dockingDirection === 't') {\n return { original: point, x: point.x, y: rectangle.y };\n }\n\n if (dockingDirection === 'r') {\n return { original: point, x: rectangle.x + rectangle.width, y: point.y };\n }\n\n if (dockingDirection === 'b') {\n return { original: point, x: point.x, y: rectangle.y + rectangle.height };\n }\n\n if (dockingDirection === 'l') {\n return { original: point, x: rectangle.x, y: point.y };\n }\n\n throw new Error('unexpected dockingDirection: <' + dockingDirection + '>');\n}\n\n/**\n * Modified Manhattan layout: Uses space between grid coloumns to route connections\n * if direct connection is not possible.\n * @param {*} source\n * @param {*} target\n * @returns waypoints\n */\nexport function connectElements(source, target, layoutGrid) {\n const sourceDi = source.di;\n const targetDi = target.di;\n\n const sourceBounds = sourceDi.get('bounds');\n const targetBounds = targetDi.get('bounds');\n\n const sourceMid = getMid(sourceBounds);\n const targetMid = getMid(targetBounds);\n\n const dX = target.gridPosition.col - source.gridPosition.col;\n const dY = target.gridPosition.row - source.gridPosition.row;\n\n const dockingSource = `${(dY > 0 ? 'bottom' : 'top')}-${dX > 0 ? 'right' : 'left'}`;\n const dockingTarget = `${(dY > 0 ? 'top' : 'bottom')}-${dX > 0 ? 'left' : 'right'}`;\n\n // Source === Target ==> Build loop\n if (dX === 0 && dY === 0) {\n const { x, y } = coordinatesToPosition(source.gridPosition.row, source.gridPosition.col);\n return [\n getDockingPoint(sourceMid, sourceBounds, 'r', dockingSource),\n { x: x + DEFAULT_CELL_WIDTH, y: sourceMid.y },\n { x: x + DEFAULT_CELL_WIDTH, y: y },\n { x: targetMid.x, y: y },\n getDockingPoint(targetMid, targetBounds, 't', dockingTarget)\n ];\n }\n\n // connect horizontally\n if (dY === 0) {\n if (isDirectPathBlocked(source, target, layoutGrid)) {\n\n // Route on top\n return [\n getDockingPoint(sourceMid, sourceBounds, 't'),\n { x: sourceMid.x, y: sourceMid.y - DEFAULT_CELL_HEIGHT / 2 },\n { x: targetMid.x, y: sourceMid.y - DEFAULT_CELL_HEIGHT / 2 },\n getDockingPoint(targetMid, targetBounds, 't')\n ];\n } else {\n\n // if space is clear, connect directly\n return [\n getDockingPoint(sourceMid, sourceBounds, 'h', dockingSource),\n getDockingPoint(targetMid, targetBounds, 'h', dockingTarget)\n ];\n }\n }\n\n // connect vertically\n if (dX === 0) {\n if (isDirectPathBlocked(source, target, layoutGrid)) {\n\n // Route parallel\n const yOffset = -Math.sign(dY) * DEFAULT_CELL_HEIGHT / 2;\n return [\n getDockingPoint(sourceMid, sourceBounds, 'r'),\n { x: sourceMid.x + DEFAULT_CELL_WIDTH / 2, y: sourceMid.y }, // out right\n { x: targetMid.x + DEFAULT_CELL_WIDTH / 2, y: targetMid.y + yOffset },\n { x: targetMid.x, y: targetMid.y + yOffset },\n getDockingPoint(targetMid, targetBounds, Math.sign(yOffset) > 0 ? 'b' : 't')\n ];\n } else {\n\n // if space is clear, connect directly\n return [ getDockingPoint(sourceMid, sourceBounds, 'v', dockingSource),\n getDockingPoint(targetMid, targetBounds, 'v', dockingTarget)\n ];\n }\n }\n\n const directManhattan = directManhattanConnect(source, target, layoutGrid);\n\n if (directManhattan) {\n const startPoint = getDockingPoint(sourceMid, sourceBounds, directManhattan[0], dockingSource);\n const endPoint = getDockingPoint(targetMid, targetBounds, directManhattan[1], dockingTarget);\n\n const midPoint = directManhattan[0] === 'h' ? { x: endPoint.x, y: startPoint.y } : { x: startPoint.x, y: endPoint.y };\n\n return [\n startPoint,\n midPoint,\n endPoint\n ];\n }\n const yOffset = -Math.sign(dY) * DEFAULT_CELL_HEIGHT / 2;\n\n return [\n getDockingPoint(sourceMid, sourceBounds, 'r', dockingSource),\n { x: sourceMid.x + DEFAULT_CELL_WIDTH / 2, y: sourceMid.y }, // out right\n { x: sourceMid.x + DEFAULT_CELL_WIDTH / 2, y: targetMid.y + yOffset }, // to target row\n { x: targetMid.x - DEFAULT_CELL_WIDTH / 2, y: targetMid.y + yOffset }, // to target column\n { x: targetMid.x - DEFAULT_CELL_WIDTH / 2, y: targetMid.y }, // to mid\n getDockingPoint(targetMid, targetBounds, 'l', dockingTarget)\n ];\n}\n\n// helpers /////\nexport function coordinatesToPosition(row, col) {\n return {\n width: DEFAULT_CELL_WIDTH,\n height: DEFAULT_CELL_HEIGHT,\n x: col * DEFAULT_CELL_WIDTH,\n y: row * DEFAULT_CELL_HEIGHT\n };\n}\n\nexport function getBounds(element, row, col, attachedTo) {\n const { width, height } = getDefaultSize(element);\n\n // Center in cell\n if (!attachedTo) {\n return {\n width, height,\n x: (col * DEFAULT_CELL_WIDTH) + (DEFAULT_CELL_WIDTH - width) / 2,\n y: row * DEFAULT_CELL_HEIGHT + (DEFAULT_CELL_HEIGHT - height) / 2\n };\n }\n\n const hostBounds = getBounds(attachedTo, row, col);\n\n return {\n width, height,\n x: Math.round(hostBounds.x + hostBounds.width / 2 - width / 2),\n y: Math.round(hostBounds.y + hostBounds.height - height / 2)\n };\n}\n\nfunction isDirectPathBlocked(source, target, layoutGrid) {\n const { row: sourceRow, col: sourceCol } = source.gridPosition;\n const { row: targetRow, col: targetCol } = target.gridPosition;\n\n const dX = targetCol - sourceCol;\n const dY = targetRow - sourceRow;\n\n let totalElements = 0;\n\n if (dX) {\n totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: sourceCol }, { row: sourceRow, col: targetCol }).length;\n }\n\n if (dY) {\n totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: targetCol }, { row: targetRow, col: targetCol }).length;\n }\n\n return totalElements > 2;\n}\n\nfunction directManhattanConnect(source, target, layoutGrid) {\n const { row: sourceRow, col: sourceCol } = source.gridPosition;\n const { row: targetRow, col: targetCol } = target.gridPosition;\n\n const dX = targetCol - sourceCol;\n const dY = targetRow - sourceRow;\n\n // Only directly connect left-to-right flow\n if (!(dX > 0 && dY !== 0)) {\n return;\n }\n\n // If below, go down then horizontal\n if (dY > 0) {\n let totalElements = 0;\n const bendPoint = { row: targetRow, col: sourceCol };\n totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: sourceCol }, bendPoint).length;\n totalElements += layoutGrid.getElementsInRange(bendPoint, { row: targetRow, col: targetCol }).length;\n\n return totalElements > 2 ? false : [ 'v', 'h' ];\n } else {\n\n // If above, go horizontal than vertical\n let totalElements = 0;\n const bendPoint = { row: sourceRow, col: targetCol };\n\n totalElements += layoutGrid.getElementsInRange({ row: sourceRow, col: sourceCol }, bendPoint).length;\n totalElements += layoutGrid.getElementsInRange(bendPoint, { row: targetRow, col: targetCol }).length;\n\n return totalElements > 2 ? false : [ 'h', 'v' ];\n }\n}\n","import {\n DEFAULT_CELL_HEIGHT,\n DEFAULT_CELL_WIDTH,\n connectElements,\n getBounds,\n getDockingPoint,\n getMid\n} from '../utils/layoutUtil';\n\nexport default {\n 'addToGrid': ({ element, grid, visited }) => {\n const nextElements = [];\n\n const attachedOutgoing = (element.attachers || [])\n .map(att => att.outgoing.reverse())\n .flat()\n .map(out => out.targetRef);\n\n // handle boundary events\n attachedOutgoing.forEach((nextElement, index, arr) => {\n if (visited.has(nextElement)) {\n return;\n }\n\n // Add below and to the right of the element\n insertIntoGrid(nextElement, element, grid);\n nextElements.push(nextElement);\n });\n\n return nextElements;\n },\n\n 'createElementDi': ({ element, row, col, diFactory }) => {\n const hostBounds = getBounds(element, row, col);\n\n const DIs = [];\n (element.attachers || []).forEach((att, i, arr) => {\n att.gridPosition = { row, col };\n const bounds = getBounds(att, row, col, element);\n\n // distribute along lower edge\n bounds.x = hostBounds.x + (i + 1) * (hostBounds.width / (arr.length + 1)) - bounds.width / 2;\n\n const attacherDi = diFactory.createDiShape(att, bounds, {\n id: att.id + '_di'\n });\n att.di = attacherDi;\n att.gridPosition = { row, col };\n\n DIs.push(attacherDi);\n });\n\n return DIs;\n },\n\n 'createConnectionDi': ({ element, row, col, layoutGrid, diFactory }) => {\n const attachers = element.attachers || [];\n\n return attachers.flatMap(att => {\n const outgoing = att.outgoing || [];\n\n return outgoing.map(out => {\n const target = out.targetRef;\n const waypoints = connectElements(att, target, layoutGrid);\n\n // Correct waypoints if they don't automatically attach to the bottom\n ensureExitBottom(att, waypoints, [ row, col ]);\n\n const connectionDi = diFactory.createDiEdge(out, waypoints, {\n id: out.id + '_di'\n });\n\n return connectionDi;\n });\n });\n }\n};\n\n\nfunction insertIntoGrid(newElement, host, grid) {\n const [ row, col ] = grid.find(host);\n\n // Grid is occupied\n if (grid.get(row + 1, col) || grid.get(row + 1, col + 1)) {\n grid.createRow(row);\n }\n\n // Host has element directly after, add space\n if (grid.get(row, col + 1)) {\n grid.addAfter(host, null);\n }\n\n grid.add(newElement, [ row + 1, col + 1 ]);\n}\n\nfunction ensureExitBottom(source, waypoints, [ row, col ]) {\n\n const sourceDi = source.di;\n const sourceBounds = sourceDi.get('bounds');\n const sourceMid = getMid(sourceBounds);\n\n const dockingPoint = getDockingPoint(sourceMid, sourceBounds, 'b');\n if (waypoints[0].x === dockingPoint.x && waypoints[0].y === dockingPoint.y) {\n return;\n }\n\n if (waypoints.length === 2) {\n const newStart = [\n dockingPoint,\n { x: dockingPoint.x, y: (row + 1) * DEFAULT_CELL_HEIGHT },\n { x: (col + 1) * DEFAULT_CELL_WIDTH, y: (row + 1) * DEFAULT_CELL_HEIGHT },\n { x: (col + 1) * DEFAULT_CELL_WIDTH, y: (row + 0.5) * DEFAULT_CELL_HEIGHT },\n ];\n\n waypoints.splice(0, 1, ...newStart);\n return;\n }\n\n // add waypoints to exit bottom and connect to existing path\n const newStart = [\n dockingPoint,\n { x: dockingPoint.x, y: (row + 1) * DEFAULT_CELL_HEIGHT },\n { x: waypoints[1].x, y: (row + 1) * DEFAULT_CELL_HEIGHT },\n ];\n\n waypoints.splice(0, 1, ...newStart);\n return;\n}","import { is } from '../di/DiUtil';\nimport { getBounds } from '../utils/layoutUtil';\n\nexport default {\n 'createElementDi': ({ element, row, col, diFactory }) => {\n\n const bounds = getBounds(element, row, col);\n\n const options = {\n id: element.id + '_di'\n };\n\n if (is(element, 'bpmn:ExclusiveGateway')) {\n options.isMarkerVisible = true;\n }\n\n const shapeDi = diFactory.createDiShape(element, bounds, options);\n element.di = shapeDi;\n element.gridPosition = { row, col };\n\n return shapeDi;\n }\n};","import { connectElements } from '../utils/layoutUtil';\n\nexport default {\n 'addToGrid': ({ element, grid, visited }) => {\n const nextElements = [];\n\n // Handle outgoing paths\n const outgoing = (element.outgoing || [])\n .map(out => out.targetRef)\n .filter(el => el);\n\n let previousElement = null;\n outgoing.forEach((nextElement, index, arr) => {\n if (visited.has(nextElement)) {\n return;\n }\n\n if (!previousElement) {\n grid.addAfter(element, nextElement);\n }\n else {\n grid.addBelow(arr[index - 1], nextElement);\n }\n\n // Is self-looping\n if (nextElement !== element) {\n previousElement = nextElement;\n }\n\n nextElements.unshift(nextElement);\n visited.add(nextElement);\n });\n\n return nextElements;\n },\n 'createConnectionDi': ({ element, row, col, layoutGrid, diFactory }) => {\n const outgoing = element.outgoing || [];\n\n return outgoing.map(out => {\n const target = out.targetRef;\n const waypoints = connectElements(element, target, layoutGrid);\n\n const connectionDi = diFactory.createDiEdge(out, waypoints, {\n id: out.id + '_di'\n });\n\n return connectionDi;\n });\n\n }\n};","import { default as attacherHandler } from './attachersHandler';\nimport { default as elementHandler } from './elementHandler';\nimport { default as outgoingHandler } from './outgoingHandler';\n\nexport const handlers = [ elementHandler, outgoingHandler, attacherHandler ];","import BPMNModdle from 'bpmn-moddle';\nimport { isBoundaryEvent, isConnection } from './utils/elementUtils';\nimport { Grid } from './Grid';\nimport { DiFactory } from './di/DiFactory';\nimport { is } from './di/DiUtil';\nimport { handlers } from './handler';\nimport { isFunction } from 'min-dash';\n\nexport class Layouter {\n constructor() {\n this.moddle = new BPMNModdle();\n this.diFactory = new DiFactory(this.moddle);\n this._handlers = handlers;\n }\n\n handle(operation, options) {\n return this._handlers\n .filter(handler => isFunction(handler[operation]))\n .map(handler => handler[operation](options));\n\n }\n\n async layoutProcess(xml) {\n const { rootElement } = await this.moddle.fromXML(xml);\n\n this.diagram = rootElement;\n\n const root = this.getProcess();\n\n this.cleanDi();\n this.handlePlane(root);\n\n return (await this.moddle.toXML(this.diagram, { format: true })).xml;\n }\n\n handlePlane(planeElement) {\n const layout = this.createGridLayout(planeElement);\n this.generateDi(planeElement, layout);\n }\n\n cleanDi() {\n this.diagram.diagrams = [];\n }\n\n createGridLayout(root) {\n const grid = new Grid();\n\n const flowElements = root.flowElements;\n\n const startingElements = flowElements.filter(el => {\n return !isConnection(el) && !isBoundaryEvent(el) && (!el.incoming || el.length === 0);\n });\n\n const boundaryEvents = flowElements.filter(el => isBoundaryEvent(el));\n boundaryEvents.forEach(boundaryEvent => {\n const attachedTask = boundaryEvent.attachedToRef;\n const attachers = attachedTask.attachers || [];\n attachers.push(boundaryEvent);\n attachedTask.attachers = attachers;\n });\n\n // Depth-first-search\n const stack = [ ...startingElements ];\n const visited = new Set();\n\n startingElements.forEach(el => {\n grid.add(el);\n visited.add(el);\n });\n\n while (stack.length > 0) {\n const currentElement = stack.pop();\n\n if (is(currentElement, 'bpmn:SubProcess')) {\n this.handlePlane(currentElement);\n }\n\n const nextElements = this.handle('addToGrid', { element: currentElement, grid, visited });\n\n nextElements.flat().forEach(el => {\n stack.push(el);\n visited.add(el);\n });\n }\n\n return grid;\n }\n\n generateDi(root, layoutGrid) {\n const diFactory = this.diFactory;\n\n // Step 0: Create Root element\n const diagram = this.diagram;\n\n var planeDi = diFactory.createDiPlane({\n id: 'BPMNPlane_' + root.id,\n bpmnElement: root\n });\n var diagramDi = diFactory.createDiDiagram({\n id: 'BPMNDiagram_' + root.id,\n plane: planeDi\n });\n\n // deepest subprocess is added first - insert at the front\n diagram.diagrams.unshift(diagramDi);\n\n const planeElement = planeDi.get('planeElement');\n\n // Step 1: Create DI for all elements\n layoutGrid.elementsByPosition().forEach(({ element, row, col }) => {\n const dis = this\n .handle('createElementDi', { element, row, col, layoutGrid, diFactory })\n .flat();\n\n planeElement.push(...dis);\n });\n\n // Step 2: Create DI for all connections\n layoutGrid.elementsByPosition().forEach(({ element, row, col }) => {\n const dis = this\n .handle('createConnectionDi', { element, row, col, layoutGrid, diFactory })\n .flat();\n\n planeElement.push(...dis);\n });\n }\n\n\n getProcess() {\n return this.diagram.get('rootElements').find(el => el.$type === 'bpmn:Process');\n }\n}\n","import { Layouter } from './Layouter';\n\nexport function layoutProcess(xml) {\n return new Layouter().layoutProcess(xml);\n}\n"],"names":["assign","map","pick","isFunction"],"mappings":";;;;;AAAO,SAAS,YAAY,CAAC,OAAO,EAAE;AACtC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;AAC7B,CAAC;AACD;AACO,SAAS,eAAe,CAAC,OAAO,EAAE;AACzC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;AACjC;;ACNO,MAAM,IAAI,CAAC;AAClB,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AACnB,GAAG;AACH;AACA,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE;AACzB,IAAI,IAAI,CAAC,QAAQ,EAAE;AACnB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC9B,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;AAClC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC9B,KAAK;AACL;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACzB,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AAC1B,KAAK;AACL;AACA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AAC7B,MAAM,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;AAChG,KAAK;AACL;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;AAClC,GAAG;AACH;AACA,EAAE,SAAS,CAAC,UAAU,EAAE;AACxB,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,KAAK;AACL;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5C,GAAG;AACH;AACA,EAAE,SAAS,CAAC,OAAO,EAAE;AACrB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAChC,GAAG;AACH;AACA,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE;AAChC,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACjC,KAAK;AACL;AACA,IAAI,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;AAClD,GAAG;AACH;AACA,EAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE;AAChC,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACjC,KAAK;AACL;AACA,IAAI,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C;AACA;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;AAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AAC9B,KAAK;AACL;AACA;AACA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACjC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACvC,KAAK;AACL;AACA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;AACjC,MAAM,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;AACjG,KAAK;AACL;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;AACzC,GAAG;AACH;AACA,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC;AACjB,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK;AACvC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK;AAClC,QAAQ,OAAO,EAAE,KAAK,OAAO,CAAC;AAC9B,OAAO,CAAC,CAAC;AACT;AACA,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;AACxB,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxB,GAAG;AACH;AACA,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;AACvC,GAAG;AACH;AACA,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;AACrF,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB;AACA,IAAI,IAAI,QAAQ,GAAG,MAAM,EAAE;AAC3B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,KAAK;AACL;AACA,IAAI,IAAI,QAAQ,GAAG,MAAM,EAAE;AAC3B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,KAAK;AACL;AACA,IAAI,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;AACnD,MAAM,KAAK,IAAI,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,EAAE;AACrD,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC3C;AACA,QAAQ,IAAI,OAAO,EAAE;AACrB,UAAU,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjC,SAAS;AACT,OAAO;AACP,KAAK;AACL;AACA,IAAI,OAAO,QAAQ,CAAC;AACpB,GAAG;AACH;AACA,EAAE,kBAAkB,GAAG;AACvB,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK;AACzC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK;AACzC,QAAQ,IAAI,CAAC,OAAO,EAAE;AACtB,UAAU,OAAO;AACjB,SAAS;AACT,QAAQ,QAAQ,CAAC,IAAI,CAAC;AACtB,UAAU,OAAO;AACjB,UAAU,GAAG,EAAE,QAAQ;AACvB,UAAU,GAAG,EAAE,QAAQ;AACvB,SAAS,CAAC,CAAC;AACX,OAAO,CAAC,CAAC;AACT,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,QAAQ,CAAC;AACpB,GAAG;AACH;;AChIO,MAAM,SAAS,CAAC;AACvB,EAAE,WAAW,CAAC,MAAM,EAAE;AACtB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG;AACH;AACA,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;AACtB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;AACjD,GAAG;AACH;AACA,EAAE,cAAc,CAAC,MAAM,EAAE;AACzB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC5C,GAAG;AACH;AACA,EAAE,aAAa,GAAG;AAClB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAC3C,MAAM,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE;AACnC,KAAK,CAAC,CAAC;AACP,GAAG;AACH;AACA,EAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;AACzC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAEA,cAAM,CAAC;AAClD,MAAM,WAAW,EAAE,QAAQ;AAC3B,MAAM,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;AACzC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACf,GAAG;AACH;AACA,EAAE,iBAAiB,CAAC,SAAS,EAAE;AAC/B,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AACpB;AACA,IAAI,OAAOC,WAAG,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE;AACxC,MAAM,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACxC,KAAK,CAAC,CAAC;AACP,GAAG;AACH;AACA,EAAE,gBAAgB,CAAC,KAAK,EAAE;AAC1B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAEC,YAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC9D,GAAG;AACH;AACA,EAAE,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE;AAC3C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAEF,cAAM,CAAC;AACjD,MAAM,WAAW,EAAE,QAAQ;AAC3B,MAAM,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;AACjD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACf,GAAG;AACH;AACA,EAAE,aAAa,CAAC,KAAK,EAAE;AACvB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAClD,GAAG;AACH;AACA,EAAE,eAAe,CAAC,KAAK,EAAE;AACzB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACpD,GAAG;AACH;;ACvDO,SAAS,cAAc,CAAC,OAAO,EAAE;AACxC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE;AACtC,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACtC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;AAChC,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACtC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;AACnC,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE;AACjC,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE;AACvC,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACvC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;AAChC,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACvC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,0BAA0B,CAAC,EAAE;AAC/C,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,yBAAyB,CAAC,EAAE;AAC9C,IAAI,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACrC,GAAG;AACH;AACA,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE;AAC1C,IAAI,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACtC,GAAG;AACH;AACA,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACpC,CAAC;AACD;AACO,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE;AAClC,EAAE,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACnC;;ACxCO,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC;AACO,SAAS,MAAM,CAAC,MAAM,EAAE;AAC/B,EAAE,OAAO;AACT,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC;AAClC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;AACnC,GAAG,CAAC;AACJ,CAAC;AACD;AACO,SAAS,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,GAAG,GAAG,EAAE,iBAAiB,GAAG,UAAU,EAAE;AAC1G;AACA;AACA;AACA;AACA,EAAE,IAAI,gBAAgB,KAAK,GAAG,EAAE;AAChC,IAAI,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AAClE,GAAG;AACH;AACA,EAAE,IAAI,gBAAgB,KAAK,GAAG,EAAE;AAChC,IAAI,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AACjE,GAAG;AACH;AACA,EAAE,IAAI,gBAAgB,KAAK,GAAG,EAAE;AAChC,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;AAC3D,GAAG;AACH;AACA,EAAE,IAAI,gBAAgB,KAAK,GAAG,EAAE;AAChC,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AAC7E,GAAG;AACH;AACA,EAAE,IAAI,gBAAgB,KAAK,GAAG,EAAE;AAChC,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;AAC9E,GAAG;AACH;AACA,EAAE,IAAI,gBAAgB,KAAK,GAAG,EAAE;AAChC,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AAC3D,GAAG;AACH;AACA,EAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,gBAAgB,GAAG,GAAG,CAAC,CAAC;AAC7E,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE;AAC5D,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;AAC7B,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;AAC7B;AACA,EAAE,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9C,EAAE,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9C;AACA,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACzC,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACzC;AACA,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;AAC/D,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;AAC/D;AACA,EAAE,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;AACtF,EAAE,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;AACtF;AACA;AACA,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;AAC5B,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAC7F,IAAI,OAAO;AACX,MAAM,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AAClE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;AACnD,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE;AACzC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAC9B,MAAM,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AAClE,KAAK,CAAC;AACN,GAAG;AACH;AACA;AACA,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;AAChB,IAAI,IAAI,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;AACzD;AACA;AACA,MAAM,OAAO;AACb,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC;AACrD,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,mBAAmB,GAAG,CAAC,EAAE;AACpE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,mBAAmB,GAAG,CAAC,EAAE;AACpE,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC;AACrD,OAAO,CAAC;AACR,KAAK,MAAM;AACX;AACA;AACA,MAAM,OAAO;AACb,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AACpE,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AACpE,OAAO,CAAC;AACR,KAAK;AACL,GAAG;AACH;AACA;AACA,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;AAChB,IAAI,IAAI,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;AACzD;AACA;AACA,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,mBAAmB,GAAG,CAAC,CAAC;AAC/D,MAAM,OAAO;AACb,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC;AACrD,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;AACnE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE;AAC7E,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE;AACpD,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;AACpF,OAAO,CAAC;AACR,KAAK,MAAM;AACX;AACA;AACA,MAAM,OAAO,EAAE,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AAC3E,QAAQ,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AACpE,OAAO,CAAC;AACR,KAAK;AACL,GAAG;AACH;AACA,EAAE,MAAM,eAAe,GAAG,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAC7E;AACA,EAAE,IAAI,eAAe,EAAE;AACvB,IAAI,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AACnG,IAAI,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;AACjG;AACA,IAAI,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC1H;AACA,IAAI,OAAO;AACX,MAAM,UAAU;AAChB,MAAM,QAAQ;AACd,MAAM,QAAQ;AACd,KAAK,CAAC;AACN,GAAG;AACH,EAAE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,mBAAmB,GAAG,CAAC,CAAC;AAC3D;AACA,EAAE,OAAO;AACT,IAAI,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AAChE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;AAC/D,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE;AACzE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE;AACzE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE;AAC/D,IAAI,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC;AAChE,GAAG,CAAC;AACJ,CAAC;AACD;AACA;AACO,SAAS,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE;AAChD,EAAE,OAAO;AACT,IAAI,KAAK,EAAE,kBAAkB;AAC7B,IAAI,MAAM,EAAE,mBAAmB;AAC/B,IAAI,CAAC,EAAE,GAAG,GAAG,kBAAkB;AAC/B,IAAI,CAAC,EAAE,GAAG,GAAG,mBAAmB;AAChC,GAAG,CAAC;AACJ,CAAC;AACD;AACO,SAAS,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE;AACzD,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;AACpD;AACA;AACA,EAAE,IAAI,CAAC,UAAU,EAAE;AACnB,IAAI,OAAO;AACX,MAAM,KAAK,EAAE,MAAM;AACnB,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,kBAAkB,IAAI,CAAC,kBAAkB,GAAG,KAAK,IAAI,CAAC;AACtE,MAAM,CAAC,EAAE,GAAG,GAAG,mBAAmB,GAAG,CAAC,mBAAmB,GAAG,MAAM,IAAI,CAAC;AACvE,KAAK,CAAC;AACN,GAAG;AACH;AACA,EAAE,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACrD;AACA,EAAE,OAAO;AACT,IAAI,KAAK,EAAE,MAAM;AACjB,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAClE,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;AAChE,GAAG,CAAC;AACJ,CAAC;AACD;AACA,SAAS,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE;AACzD,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;AACjE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;AACjE;AACA,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC;AACnC,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC;AACnC;AACA,EAAE,IAAI,aAAa,GAAG,CAAC,CAAC;AACxB;AACA,EAAE,IAAI,EAAE,EAAE;AACV,IAAI,aAAa,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;AAClI,GAAG;AACH;AACA,EAAE,IAAI,EAAE,EAAE;AACV,IAAI,aAAa,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;AAClI,GAAG;AACH;AACA,EAAE,OAAO,aAAa,GAAG,CAAC,CAAC;AAC3B,CAAC;AACD;AACA,SAAS,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE;AAC5D,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;AACjE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;AACjE;AACA,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC;AACnC,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC;AACnC;AACA;AACA,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;AAC7B,IAAI,OAAO;AACX,GAAG;AACH;AACA;AACA,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;AACd,IAAI,IAAI,aAAa,GAAG,CAAC,CAAC;AAC1B,IAAI,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACzD,IAAI,aAAa,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC;AACzG,IAAI,aAAa,IAAI,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;AACzG;AACA,IAAI,OAAO,aAAa,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACpD,GAAG,MAAM;AACT;AACA;AACA,IAAI,IAAI,aAAa,GAAG,CAAC,CAAC;AAC1B,IAAI,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACzD;AACA,IAAI,aAAa,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC;AACzG,IAAI,aAAa,IAAI,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;AACzG;AACA,IAAI,OAAO,aAAa,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACpD,GAAG;AACH;;AC7NA,sBAAe;AACf,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;AAC/C,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;AAC5B;AACA,IAAI,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE;AACrD,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;AACzC,OAAO,IAAI,EAAE;AACb,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC;AACA;AACA,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK;AAC1D,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;AACpC,QAAQ,OAAO;AACf,OAAO;AACP;AACA;AACA,MAAM,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AACjD,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACrC,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,YAAY,CAAC;AACxB,GAAG;AACH;AACA,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK;AAC3D,IAAI,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD;AACA,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;AACnB,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK;AACvD,MAAM,GAAG,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtC,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACvD;AACA;AACA,MAAM,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;AACnG;AACA,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE;AAC9D,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK;AAC1B,OAAO,CAAC,CAAC;AACT,MAAM,GAAG,CAAC,EAAE,GAAG,UAAU,CAAC;AAC1B,MAAM,GAAG,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtC;AACA,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC3B,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,GAAG,CAAC;AACf,GAAG;AACH;AACA,EAAE,oBAAoB,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK;AAC1E,IAAI,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;AAC9C;AACA,IAAI,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI;AACpC,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC1C;AACA,MAAM,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;AACjC,QAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;AACrC,QAAQ,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACnE;AACA;AACA,QAAQ,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACvD;AACA,QAAQ,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE;AACpE,UAAU,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK;AAC5B,SAAS,CAAC,CAAC;AACX;AACA,QAAQ,OAAO,YAAY,CAAC;AAC5B,OAAO,CAAC,CAAC;AACT,KAAK,CAAC,CAAC;AACP,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA,SAAS,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;AAChD,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC;AACA;AACA,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE;AAC5D,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACxB,GAAG;AACH;AACA;AACA,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE;AAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9B,GAAG;AACH;AACA,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AACD;AACA,SAAS,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;AAC3D;AACA,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;AAC7B,EAAE,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC9C,EAAE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACzC;AACA,EAAE,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;AACrE,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,EAAE;AAC9E,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,IAAI,MAAM,QAAQ,GAAG;AACrB,MAAM,YAAY;AAClB,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,mBAAmB,EAAE;AAC/D,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,kBAAkB,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,mBAAmB,EAAE;AAC/E,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,kBAAkB,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,mBAAmB,EAAE;AACjF,KAAK,CAAC;AACN;AACA,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACxC,IAAI,OAAO;AACX,GAAG;AACH;AACA;AACA,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,YAAY;AAChB,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,mBAAmB,EAAE;AAC7D,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,mBAAmB,EAAE;AAC7D,GAAG,CAAC;AACJ;AACA,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;AACtC,EAAE,OAAO;AACT;;AC5HA,qBAAe;AACf,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK;AAC3D;AACA,IAAI,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAChD;AACA,IAAI,MAAM,OAAO,GAAG;AACpB,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK;AAC5B,KAAK,CAAC;AACN;AACA,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC,EAAE;AAC9C,MAAM,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;AACrC,KAAK;AACL;AACA,IAAI,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACtE,IAAI,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC;AACzB,IAAI,OAAO,CAAC,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxC;AACA,IAAI,OAAO,OAAO,CAAC;AACnB,GAAG;AACH,CAAC;;ACpBD,sBAAe;AACf,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;AAC/C,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;AAC5B;AACA;AACA,IAAI,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE;AAC5C,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC;AAChC,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;AACxB;AACA,IAAI,IAAI,eAAe,GAAG,IAAI,CAAC;AAC/B,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK;AAClD,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;AACpC,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,CAAC,eAAe,EAAE;AAC5B,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC5C,OAAO;AACP,WAAW;AACX,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACnD,OAAO;AACP;AACA;AACA,MAAM,IAAI,WAAW,KAAK,OAAO,EAAE;AACnC,QAAQ,eAAe,GAAG,WAAW,CAAC;AACtC,OAAO;AACP;AACA,MAAM,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACxC,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC/B,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,YAAY,CAAC;AACxB,GAAG;AACH,EAAE,oBAAoB,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK;AAC1E,IAAI,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC5C;AACA,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI;AAC/B,MAAM,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;AACnC,MAAM,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACrE;AACA,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE;AAClE,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK;AAC1B,OAAO,CAAC,CAAC;AACT;AACA,MAAM,OAAO,YAAY,CAAC;AAC1B,KAAK,CAAC,CAAC;AACP;AACA,GAAG;AACH,CAAC;;AC9CM,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE;;ACIrE,MAAM,QAAQ,CAAC;AACtB,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AACnC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChD,IAAI,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;AAC9B,GAAG;AACH;AACA,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE;AAC7B,IAAI,OAAO,IAAI,CAAC,SAAS;AACzB,OAAO,MAAM,CAAC,OAAO,IAAIG,kBAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AACxD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnD;AACA,GAAG;AACH;AACA,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE;AAC3B,IAAI,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3D;AACA,IAAI,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;AAC/B;AACA,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AACnC;AACA,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AACnB,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B;AACA,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC;AACzE,GAAG;AACH;AACA,EAAE,WAAW,CAAC,YAAY,EAAE;AAC5B,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACvD,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAC1C,GAAG;AACH;AACA,EAAE,OAAO,GAAG;AACZ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;AAC/B,GAAG;AACH;AACA,EAAE,gBAAgB,CAAC,IAAI,EAAE;AACzB,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5B;AACA,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;AAC3C;AACA,IAAI,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI;AACvD,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAC5F,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,IAAI,cAAc,CAAC,OAAO,CAAC,aAAa,IAAI;AAC5C,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,aAAa,CAAC;AACvD,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,IAAI,EAAE,CAAC;AACrD,MAAM,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACpC,MAAM,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC;AACzC,KAAK,CAAC,CAAC;AACP;AACA;AACA,IAAI,MAAM,KAAK,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;AAC1C,IAAI,MAAM,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;AAC9B;AACA,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,IAAI;AACnC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnB,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACtB,KAAK,CAAC,CAAC;AACP;AACA,IAAI,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;AACzC;AACA,MAAM,IAAI,EAAE,CAAC,cAAc,EAAE,iBAAiB,CAAC,EAAE;AACjD,QAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;AACzC,OAAO;AACP;AACA,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAChG;AACA,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI;AACxC,QAAQ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,QAAQ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxB,OAAO,CAAC,CAAC;AACT,KAAK;AACL;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE;AAC/B,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;AACrC;AACA;AACA,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AACjC;AACA,IAAI,IAAI,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC;AAC1C,MAAM,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC,EAAE;AAChC,MAAM,WAAW,EAAE,IAAI;AACvB,KAAK,CAAC,CAAC;AACP,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC,eAAe,CAAC;AAC9C,MAAM,EAAE,EAAE,cAAc,GAAG,IAAI,CAAC,EAAE;AAClC,MAAM,KAAK,EAAE,OAAO;AACpB,KAAK,CAAC,CAAC;AACP;AACA;AACA,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACxC;AACA,IAAI,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACrD;AACA;AACA,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK;AACvE,MAAM,MAAM,GAAG,GAAG,IAAI;AACtB,SAAS,MAAM,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAChF,SAAS,IAAI,EAAE,CAAC;AAChB;AACA,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AAChC,KAAK,CAAC,CAAC;AACP;AACA;AACA,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK;AACvE,MAAM,MAAM,GAAG,GAAG,IAAI;AACtB,SAAS,MAAM,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnF,SAAS,IAAI,EAAE,CAAC;AAChB;AACA,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;AAChC,KAAK,CAAC,CAAC;AACP,GAAG;AACH;AACA;AACA,EAAE,UAAU,GAAG;AACf,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC;AACpF,GAAG;AACH;;ACjIO,SAAS,aAAa,CAAC,GAAG,EAAE;AACnC,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC3C;;;;"}