@babylonjs/shared-ui-components 5.45.0 → 5.45.2
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/nodeGraphSystem/graphCanvas.d.ts +3 -0
- package/nodeGraphSystem/graphCanvas.js +99 -37
- package/nodeGraphSystem/graphCanvas.js.map +1 -1
- package/nodeGraphSystem/graphCanvas.modules.scss +1 -0
- package/nodeGraphSystem/graphNode.modules.scss +5 -2
- package/nodeGraphSystem/nodeLedger.d.ts +4 -0
- package/nodeGraphSystem/nodeLedger.js +5 -0
- package/nodeGraphSystem/nodeLedger.js.map +1 -0
- package/nodeGraphSystem/nodeLink.js +5 -4
- package/nodeGraphSystem/nodeLink.js.map +1 -1
- package/nodeGraphSystem/searchBox.d.ts +24 -0
- package/nodeGraphSystem/searchBox.js +84 -0
- package/nodeGraphSystem/searchBox.js.map +1 -0
- package/nodeGraphSystem/searchBox.scss +65 -0
- package/nodeGraphSystem/stateManager.d.ts +6 -0
- package/nodeGraphSystem/stateManager.js +1 -0
- package/nodeGraphSystem/stateManager.js.map +1 -1
- package/package.json +1 -1
@@ -85,6 +85,9 @@ export declare class GraphCanvasComponent extends React.Component<IGraphCanvasCo
|
|
85
85
|
constructor(props: IGraphCanvasComponentProps);
|
86
86
|
populateConnectedEntriesBeforeRemoval(item: GraphNode, items: GraphNode[], inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[]): void;
|
87
87
|
automaticRewire(inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[], firstOnly?: boolean): void;
|
88
|
+
smartAddOverLink(node: GraphNode, link: NodeLink): void;
|
89
|
+
smartAddOverNode(node: GraphNode, source: GraphNode): void;
|
90
|
+
deleteSelection(onRemove: (nodeData: INodeData) => void, autoReconnect?: boolean): void;
|
88
91
|
handleKeyDown(evt: KeyboardEvent, onRemove: (nodeData: INodeData) => void, mouseLocationX: number, mouseLocationY: number, dataGenerator: (nodeData: INodeData) => any, rootElement: HTMLDivElement): void;
|
89
92
|
pasteSelection(copiedNodes: GraphNode[], currentX: number, currentY: number, dataGenerator: (nodeData: INodeData) => any, selectNew?: boolean): GraphNode[];
|
90
93
|
reconnectNewNodes(nodeIndex: number, newNodes: GraphNode[], sourceNodes: GraphNode[], done: boolean[]): void;
|
@@ -13,6 +13,7 @@ import styles from "./graphCanvas.modules.scss";
|
|
13
13
|
import commonStyles from "./common.modules.scss";
|
14
14
|
import { TypeLedger } from "./typeLedger.js";
|
15
15
|
import { RefreshNode } from "./tools.js";
|
16
|
+
import { SearchBoxComponent } from "./searchBox.js";
|
16
17
|
export class GraphCanvasComponent extends React.Component {
|
17
18
|
constructor(props) {
|
18
19
|
super(props);
|
@@ -279,47 +280,96 @@ export class GraphCanvasComponent extends React.Component {
|
|
279
280
|
});
|
280
281
|
}
|
281
282
|
}
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
283
|
+
smartAddOverLink(node, link) {
|
284
|
+
// Connect the ports
|
285
|
+
const inputs = [];
|
286
|
+
const outputs = [];
|
287
|
+
const availableNodeInputs = [];
|
288
|
+
const availableNodeOutputs = [];
|
289
|
+
const leftNode = link.nodeA;
|
290
|
+
const rightNode = link.nodeB;
|
291
|
+
// Delete previous
|
292
|
+
link.dispose();
|
293
|
+
// Get the ports
|
294
|
+
availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));
|
295
|
+
availableNodeOutputs.push(...node.content.outputs);
|
296
|
+
inputs.push(...leftNode.content.outputs);
|
297
|
+
outputs.push(...rightNode.content.inputs.filter((i) => !i.isConnected));
|
298
|
+
// Reconnect
|
299
|
+
this.automaticRewire(inputs, availableNodeInputs, true);
|
300
|
+
this.automaticRewire(availableNodeOutputs, outputs, true);
|
301
|
+
this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
|
302
|
+
}
|
303
|
+
smartAddOverNode(node, source) {
|
304
|
+
// Connect the ports
|
305
|
+
const inputs = [];
|
306
|
+
const availableNodeInputs = [];
|
307
|
+
// Get the ports
|
308
|
+
availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));
|
309
|
+
inputs.push(...source.content.outputs);
|
310
|
+
// Reconnect
|
311
|
+
this.automaticRewire(inputs, availableNodeInputs, true);
|
312
|
+
this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
|
313
|
+
}
|
314
|
+
deleteSelection(onRemove, autoReconnect = false) {
|
315
|
+
// Delete
|
316
|
+
const selectedItems = this.selectedNodes;
|
317
|
+
const inputs = [];
|
318
|
+
const outputs = [];
|
319
|
+
let needRebuild = false;
|
320
|
+
if (selectedItems.length > 0) {
|
321
|
+
needRebuild = true;
|
322
|
+
for (const selectedItem of selectedItems) {
|
323
|
+
if (autoReconnect) {
|
324
|
+
this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);
|
296
325
|
}
|
326
|
+
selectedItem.dispose();
|
327
|
+
onRemove(selectedItem.content);
|
328
|
+
this.removeDataFromCache(selectedItem.content.data);
|
297
329
|
}
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
frame.
|
310
|
-
|
311
|
-
else {
|
312
|
-
frame.nodes.forEach((node) => {
|
313
|
-
node.enclosingFrameId = -1;
|
314
|
-
});
|
330
|
+
}
|
331
|
+
if (this.selectedLink) {
|
332
|
+
needRebuild = true;
|
333
|
+
this.selectedLink.dispose();
|
334
|
+
}
|
335
|
+
if (this.selectedFrames.length) {
|
336
|
+
needRebuild = true;
|
337
|
+
for (const frame of this.selectedFrames) {
|
338
|
+
if (frame.isCollapsed) {
|
339
|
+
while (frame.nodes.length > 0) {
|
340
|
+
onRemove(frame.nodes[0].content);
|
341
|
+
this.removeDataFromCache(frame.nodes[0].content.data);
|
342
|
+
frame.nodes[0].dispose();
|
315
343
|
}
|
316
|
-
frame.
|
344
|
+
frame.isCollapsed = false;
|
345
|
+
}
|
346
|
+
else {
|
347
|
+
frame.nodes.forEach((node) => {
|
348
|
+
node.enclosingFrameId = -1;
|
349
|
+
});
|
317
350
|
}
|
351
|
+
frame.dispose();
|
318
352
|
}
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
353
|
+
}
|
354
|
+
if (!needRebuild) {
|
355
|
+
return;
|
356
|
+
}
|
357
|
+
// Reconnect if required
|
358
|
+
this.automaticRewire(inputs, outputs);
|
359
|
+
this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);
|
360
|
+
this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);
|
361
|
+
}
|
362
|
+
handleKeyDown(evt, onRemove, mouseLocationX, mouseLocationY, dataGenerator, rootElement) {
|
363
|
+
if (this.stateManager.modalIsDisplayed) {
|
364
|
+
return;
|
365
|
+
}
|
366
|
+
if (evt.code === "Space" && evt.target === this.props.stateManager.hostDocument.body) {
|
367
|
+
this.stateManager.modalIsDisplayed = true;
|
368
|
+
this.props.stateManager.onSearchBoxRequiredObservable.notifyObservers({ x: mouseLocationX, y: mouseLocationY });
|
369
|
+
return;
|
370
|
+
}
|
371
|
+
if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {
|
372
|
+
this.deleteSelection(onRemove, evt.altKey);
|
323
373
|
return;
|
324
374
|
}
|
325
375
|
if ((!evt.ctrlKey && !evt.metaKey) || this.props.stateManager.lockObject.lock) {
|
@@ -684,6 +734,9 @@ export class GraphCanvasComponent extends React.Component {
|
|
684
734
|
this.updateTransform();
|
685
735
|
}
|
686
736
|
onMove(evt) {
|
737
|
+
if (this.stateManager.modalIsDisplayed) {
|
738
|
+
return;
|
739
|
+
}
|
687
740
|
// Selection box
|
688
741
|
if (this._selectionBox) {
|
689
742
|
const rootRect = this.canvasContainer.getBoundingClientRect();
|
@@ -772,6 +825,9 @@ export class GraphCanvasComponent extends React.Component {
|
|
772
825
|
this._mouseStartPointY = evt.clientY;
|
773
826
|
}
|
774
827
|
onDown(evt) {
|
828
|
+
if (this.stateManager.modalIsDisplayed) {
|
829
|
+
return;
|
830
|
+
}
|
775
831
|
this._rootContainer.setPointerCapture(evt.pointerId);
|
776
832
|
// Port dragging
|
777
833
|
if (evt.nativeEvent.srcElement && evt.nativeEvent.srcElement.nodeName === "IMG") {
|
@@ -840,6 +896,9 @@ export class GraphCanvasComponent extends React.Component {
|
|
840
896
|
this._mouseStartPointY = evt.clientY;
|
841
897
|
}
|
842
898
|
onUp(evt) {
|
899
|
+
if (this.stateManager.modalIsDisplayed) {
|
900
|
+
return;
|
901
|
+
}
|
843
902
|
this._mouseStartPointX = null;
|
844
903
|
this._mouseStartPointY = null;
|
845
904
|
this._rootContainer.releasePointerCapture(evt.pointerId);
|
@@ -884,6 +943,9 @@ export class GraphCanvasComponent extends React.Component {
|
|
884
943
|
}
|
885
944
|
}
|
886
945
|
onWheel(evt) {
|
946
|
+
if (this.stateManager.modalIsDisplayed) {
|
947
|
+
return;
|
948
|
+
}
|
887
949
|
const delta = evt.deltaY < 0 ? 0.1 : -0.1;
|
888
950
|
const oldZoom = this.zoom;
|
889
951
|
this.zoom = Math.min(Math.max(this._minZoom, this.zoom + delta * this.zoom), this._maxZoom);
|
@@ -1132,7 +1194,7 @@ export class GraphCanvasComponent extends React.Component {
|
|
1132
1194
|
this.stateManager.onSelectionChangedObservable.notifyObservers({ selection: frame });
|
1133
1195
|
}
|
1134
1196
|
render() {
|
1135
|
-
return (
|
1197
|
+
return (_jsxs("div", { ref: this._hostCanvasRef, id: "graph-canvas", className: styles["graph-canvas"], onWheel: (evt) => this.onWheel(evt), onPointerMove: (evt) => this.onMove(evt), onPointerDown: (evt) => this.onDown(evt), onPointerUp: (evt) => this.onUp(evt), children: [_jsxs("div", { id: "graph-container", className: styles["graph-container"], ref: this._rootContainerRef, children: [_jsx("div", { id: "graph-canvas-container", className: styles["graph-canvas-container"], ref: this._graphCanvasRef }), _jsx("div", { id: "frame-container", className: styles["frame-container"], ref: this._frameContainerRef }), _jsx("svg", { id: "graph-svg-container", className: styles["graph-svg-container"], ref: this._svgCanvasRef }), _jsx("div", { id: "selection-container", className: styles["selection-container"], ref: this._selectionContainerRef })] }), _jsx(SearchBoxComponent, { stateManager: this.stateManager })] }));
|
1136
1198
|
}
|
1137
1199
|
}
|
1138
1200
|
GraphCanvasComponent.NodeWidth = 100;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"graphCanvas.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/graphCanvas.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport { GraphNode } from \"./graphNode\";\r\nimport * as dagre from \"dagre\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { NodeLink } from \"./nodeLink\";\r\nimport { NodePort } from \"./nodePort\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { DataStorage } from \"core/Misc/dataStorage\";\r\nimport { GraphFrame } from \"./graphFrame\";\r\nimport type { IEditorData, IFrameData } from \"./interfaces/nodeLocationInfo\";\r\nimport { FrameNodePort } from \"./frameNodePort\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport type { FramePortData } from \"./types/framePortData\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport { PortDataDirection } from \"./interfaces/portData\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport styles from \"./graphCanvas.modules.scss\";\r\nimport commonStyles from \"./common.modules.scss\";\r\n\r\nimport { TypeLedger } from \"./typeLedger\";\r\nimport { RefreshNode } from \"./tools\";\r\n\r\nexport interface IGraphCanvasComponentProps {\r\n stateManager: StateManager;\r\n onEmitNewNode: (nodeData: INodeData) => GraphNode;\r\n}\r\n\r\nexport class GraphCanvasComponent extends React.Component<IGraphCanvasComponentProps> implements INodeContainer {\r\n public static readonly NodeWidth = 100;\r\n private readonly _minZoom = 0.1;\r\n private readonly _maxZoom = 4;\r\n\r\n private _hostCanvasRef = React.createRef<HTMLDivElement>();\r\n private _hostCanvas: HTMLDivElement;\r\n private _graphCanvasRef = React.createRef<HTMLDivElement>();\r\n private _graphCanvas: HTMLDivElement;\r\n private _selectionContainerRef = React.createRef<HTMLDivElement>();\r\n private _selectionContainer: HTMLDivElement;\r\n private _frameContainerRef = React.createRef<HTMLDivElement>();\r\n private _frameContainer: HTMLDivElement;\r\n private _svgCanvasRef = React.createRef<SVGSVGElement>();\r\n private _svgCanvas: HTMLElement;\r\n private _rootContainerRef = React.createRef<HTMLDivElement>();\r\n private _rootContainer: HTMLDivElement;\r\n private _nodes: GraphNode[] = [];\r\n private _links: NodeLink[] = [];\r\n private _mouseStartPointX: Nullable<number> = null;\r\n private _mouseStartPointY: Nullable<number> = null;\r\n private _dropPointX = 0;\r\n private _dropPointY = 0;\r\n private _selectionStartX = 0;\r\n private _selectionStartY = 0;\r\n private _candidateLinkedHasMoved = false;\r\n private _x = 0;\r\n private _y = 0;\r\n private _zoom = 1;\r\n private _selectedNodes: GraphNode[] = [];\r\n private _selectedLink: Nullable<NodeLink> = null;\r\n private _selectedPort: Nullable<NodePort> = null;\r\n private _candidateLink: Nullable<NodeLink> = null;\r\n private _candidatePort: Nullable<NodePort | FrameNodePort> = null;\r\n private _gridSize = 20;\r\n private _selectionBox: Nullable<HTMLDivElement> = null;\r\n private _selectedFrames: GraphFrame[] = [];\r\n private _frameCandidate: Nullable<HTMLDivElement> = null;\r\n private _frames: GraphFrame[] = [];\r\n private _nodeDataContentList = new Array<any>();\r\n\r\n private _altKeyIsPressed = false;\r\n private _multiKeyIsPressed = false;\r\n private _oldY = -1;\r\n\r\n public _frameIsMoving = false;\r\n public _isLoading = false;\r\n public _targetLinkCandidate: Nullable<NodeLink> = null;\r\n\r\n private _copiedNodes: GraphNode[] = [];\r\n private _copiedFrames: GraphFrame[] = [];\r\n\r\n public get gridSize() {\r\n return this._gridSize;\r\n }\r\n\r\n public set gridSize(value: number) {\r\n this._gridSize = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get stateManager() {\r\n return this.props.stateManager;\r\n }\r\n\r\n public get nodes() {\r\n return this._nodes;\r\n }\r\n\r\n public get links() {\r\n return this._links;\r\n }\r\n\r\n public get frames() {\r\n return this._frames;\r\n }\r\n\r\n public get zoom() {\r\n return this._zoom;\r\n }\r\n\r\n public set zoom(value: number) {\r\n if (this._zoom === value) {\r\n return;\r\n }\r\n\r\n this._zoom = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get selectedNodes() {\r\n return this._selectedNodes;\r\n }\r\n\r\n public get selectedLink() {\r\n return this._selectedLink;\r\n }\r\n public get selectedFrames() {\r\n return this._selectedFrames;\r\n }\r\n\r\n public get selectedPort() {\r\n return this._selectedPort;\r\n }\r\n\r\n public get canvasContainer() {\r\n return this._graphCanvas;\r\n }\r\n\r\n public get hostCanvas() {\r\n return this._hostCanvas;\r\n }\r\n\r\n public get svgCanvas() {\r\n return this._svgCanvas;\r\n }\r\n\r\n public get selectionContainer() {\r\n return this._selectionContainer;\r\n }\r\n\r\n public get frameContainer() {\r\n return this._frameContainer;\r\n }\r\n\r\n // There is a selection conflict between nodes and frames if any selected node is inside any selected frame\r\n private _selectedFrameAndNodesConflict(frameSelection: GraphFrame[], nodeSelection: GraphNode[]) {\r\n for (const frame of frameSelection) {\r\n for (const node of nodeSelection) {\r\n if (frame.nodes.includes(node)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n constructor(props: IGraphCanvasComponentProps) {\r\n super(props);\r\n\r\n props.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection, forceKeepSelection, marqueeSelection = false } = options || {};\r\n if (!selection) {\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedFrames = [];\r\n this._selectedPort = null;\r\n } else {\r\n if (selection instanceof NodeLink) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = selection;\r\n this._selectedPort = null;\r\n } else if (selection instanceof NodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof FrameNodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof GraphNode || selection instanceof GraphFrame) {\r\n // If in marquee selection mode, always prioritize selecting nodes. Otherwise, always prioritize selecting the type of\r\n // the selected element\r\n if (marqueeSelection) {\r\n if (selection instanceof GraphFrame && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n } else if (selection instanceof GraphNode && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n if (this._selectedFrameAndNodesConflict(this.selectedFrames, this.selectedNodes)) {\r\n const framesToRemove = new Set();\r\n for (const selectedNode of this._selectedNodes) {\r\n for (const selectedFrame of this._selectedFrames) {\r\n if (selectedFrame.nodes.includes(selectedNode)) {\r\n framesToRemove.add(selectedFrame);\r\n }\r\n }\r\n }\r\n this._selectedFrames = this._selectedFrames.filter((f) => !framesToRemove.has(f));\r\n }\r\n } else {\r\n if (selection instanceof GraphFrame) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict([selection], this._selectedNodes) && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [selection];\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n } else if (selection instanceof GraphNode) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict(this._selectedFrames, [selection]) && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [];\r\n this._selectedNodes = [selection];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n props.stateManager.onCandidatePortSelectedObservable.add((port) => {\r\n this._candidatePort = port;\r\n });\r\n\r\n props.stateManager.onGridSizeChanged.add(() => {\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n });\r\n\r\n this.props.stateManager.hostDocument!.addEventListener(\"keyup\", () => this.onKeyUp(), false);\r\n this.props.stateManager.hostDocument!.addEventListener(\r\n \"keydown\",\r\n (evt) => {\r\n this._altKeyIsPressed = evt.altKey;\r\n this._multiKeyIsPressed = evt.ctrlKey || evt.metaKey;\r\n },\r\n false\r\n );\r\n this.props.stateManager.hostDocument!.defaultView!.addEventListener(\r\n \"blur\",\r\n () => {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n },\r\n false\r\n );\r\n\r\n // Store additional data to serialization object\r\n this.props.stateManager.storeEditorData = (editorData, graphFrame) => {\r\n editorData.frames = [];\r\n if (graphFrame) {\r\n editorData.frames.push(graphFrame!.serialize(false));\r\n } else {\r\n editorData.x = this.x;\r\n editorData.y = this.y;\r\n editorData.zoom = this.zoom;\r\n for (const frame of this._frames) {\r\n editorData.frames.push(frame.serialize(true));\r\n }\r\n }\r\n };\r\n }\r\n\r\n populateConnectedEntriesBeforeRemoval(item: GraphNode, items: GraphNode[], inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[]) {\r\n inputs.push(\r\n ...item.content.inputs.filter((i) => i.isConnected && items.every((selected) => selected.content.data !== i.connectedPort?.ownerData)).map((i) => i.connectedPort)\r\n );\r\n\r\n outputs.push(\r\n ...item.content.outputs\r\n .filter((i) => i.isConnected)\r\n .map((i) => i.endpoints)\r\n .flat()\r\n .filter((i) => i && items.every((selected) => selected.content.data !== i.ownerData))\r\n );\r\n }\r\n\r\n automaticRewire(inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[], firstOnly = false) {\r\n let oneConnectionFound = false;\r\n if (outputs.length && inputs.length) {\r\n inputs.forEach((input) => {\r\n if (oneConnectionFound) {\r\n return;\r\n }\r\n if (!input) {\r\n return;\r\n }\r\n const output = outputs[0];\r\n if (output && input.canConnectTo(output)) {\r\n const nodeInput = this.findNodeFromData(input.ownerData);\r\n const nodeOutput = this.findNodeFromData(output.ownerData);\r\n this.connectNodes(nodeInput, input, nodeOutput, output);\r\n outputs.shift();\r\n if (firstOnly) {\r\n oneConnectionFound = true;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n handleKeyDown(\r\n evt: KeyboardEvent,\r\n onRemove: (nodeData: INodeData) => void,\r\n mouseLocationX: number,\r\n mouseLocationY: number,\r\n dataGenerator: (nodeData: INodeData) => any,\r\n rootElement: HTMLDivElement\r\n ) {\r\n if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {\r\n // Delete\r\n const selectedItems = this.selectedNodes;\r\n const inputs: Nullable<IPortData>[] = [];\r\n const outputs: Nullable<IPortData>[] = [];\r\n\r\n if (selectedItems.length > 0) {\r\n for (const selectedItem of selectedItems) {\r\n if (evt.altKey) {\r\n this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);\r\n }\r\n\r\n selectedItem.dispose();\r\n\r\n onRemove(selectedItem.content);\r\n this.removeDataFromCache(selectedItem.content.data);\r\n }\r\n }\r\n\r\n if (this.selectedLink) {\r\n this.selectedLink.dispose();\r\n }\r\n\r\n if (this.selectedFrames.length) {\r\n for (const frame of this.selectedFrames) {\r\n if (frame.isCollapsed) {\r\n while (frame.nodes.length > 0) {\r\n onRemove(frame.nodes[0].content);\r\n this.removeDataFromCache(frame.nodes[0].content.data);\r\n frame.nodes[0].dispose();\r\n }\r\n frame.isCollapsed = false;\r\n } else {\r\n frame.nodes.forEach((node) => {\r\n node.enclosingFrameId = -1;\r\n });\r\n }\r\n frame.dispose();\r\n }\r\n }\r\n\r\n // Reconnect if required\r\n this.automaticRewire(inputs, outputs);\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n return;\r\n }\r\n\r\n if ((!evt.ctrlKey && !evt.metaKey) || this.props.stateManager.lockObject.lock) {\r\n return;\r\n }\r\n\r\n if (evt.key === \"c\" || evt.key === \"C\") {\r\n // Copy\r\n this._copiedNodes = [];\r\n this._copiedFrames = [];\r\n\r\n if (this.selectedFrames.length) {\r\n for (const frame of this.selectedFrames) {\r\n frame.serialize(true);\r\n this._copiedFrames.push(frame);\r\n }\r\n return;\r\n }\r\n\r\n const selectedItems = this.selectedNodes;\r\n if (!selectedItems.length) {\r\n return;\r\n }\r\n\r\n const selectedItem = selectedItems[0] as GraphNode;\r\n\r\n if (!selectedItem.content.data) {\r\n return;\r\n }\r\n\r\n this._copiedNodes = selectedItems.slice(0);\r\n } else if (evt.key === \"v\" || evt.key === \"V\") {\r\n // Paste\r\n const zoomLevel = this.zoom;\r\n let currentY = (mouseLocationY - rootElement.offsetTop - this.y - 20) / zoomLevel;\r\n\r\n if (this._copiedFrames.length) {\r\n for (const frame of this._copiedFrames) {\r\n // New frame\r\n const newFrame = new GraphFrame(null, this, true);\r\n this.frames.push(newFrame);\r\n\r\n newFrame.width = frame.width;\r\n newFrame.height = frame.height;\r\n newFrame.width / 2;\r\n newFrame.name = frame.name;\r\n newFrame.color = frame.color;\r\n\r\n let currentX = (mouseLocationX - rootElement.offsetLeft - this.x) / zoomLevel;\r\n newFrame.x = currentX - newFrame.width / 2;\r\n newFrame.y = currentY;\r\n\r\n // Paste nodes\r\n if (frame.nodes.length) {\r\n currentX = newFrame.x + frame.nodes[0].x - frame.x;\r\n currentY = newFrame.y + frame.nodes[0].y - frame.y;\r\n\r\n this._frameIsMoving = true;\r\n const newNodes = this.pasteSelection(frame.nodes, currentX, currentY, dataGenerator);\r\n if (newNodes) {\r\n for (const node of newNodes) {\r\n newFrame.syncNode(node);\r\n }\r\n }\r\n this._frameIsMoving = false;\r\n }\r\n\r\n newFrame.adjustPorts();\r\n\r\n if (frame.isCollapsed) {\r\n newFrame.isCollapsed = true;\r\n }\r\n\r\n // Select\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame, forceKeepSelection: true });\r\n return;\r\n }\r\n }\r\n\r\n if (!this._copiedNodes.length) {\r\n return;\r\n }\r\n\r\n const currentX = (mouseLocationX - rootElement.offsetLeft - this.x - GraphCanvasComponent.NodeWidth) / zoomLevel;\r\n this.pasteSelection(this._copiedNodes, currentX, currentY, dataGenerator, true);\r\n }\r\n }\r\n\r\n pasteSelection(copiedNodes: GraphNode[], currentX: number, currentY: number, dataGenerator: (nodeData: INodeData) => any, selectNew = false) {\r\n let originalNode: Nullable<GraphNode> = null;\r\n\r\n const newNodes: GraphNode[] = [];\r\n\r\n // Copy to prevent recursive side effects while creating nodes.\r\n copiedNodes = copiedNodes.slice();\r\n\r\n // Cancel selection\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n\r\n // Create new nodes\r\n for (const node of copiedNodes) {\r\n const data = node.content.data;\r\n\r\n if (!data) {\r\n continue;\r\n }\r\n\r\n const newNode = dataGenerator(node.content);\r\n\r\n let x = 0;\r\n let y = 0;\r\n if (originalNode) {\r\n x = currentX + node.x - originalNode.x;\r\n y = currentY + node.y - originalNode.y;\r\n } else {\r\n originalNode = node;\r\n x = currentX;\r\n y = currentY;\r\n }\r\n\r\n newNode.x = x;\r\n newNode.y = y;\r\n newNode.cleanAccumulation();\r\n\r\n newNodes.push(newNode);\r\n\r\n if (selectNew) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode, forceKeepSelection: true });\r\n }\r\n }\r\n\r\n // Relink\r\n const done = new Array<boolean>(newNodes.length);\r\n for (let index = 0; index < newNodes.length; index++) {\r\n this.reconnectNewNodes(index, newNodes, copiedNodes, done);\r\n }\r\n\r\n return newNodes;\r\n }\r\n\r\n reconnectNewNodes(nodeIndex: number, newNodes: GraphNode[], sourceNodes: GraphNode[], done: boolean[]) {\r\n if (done[nodeIndex]) {\r\n return;\r\n }\r\n\r\n const currentNode = newNodes[nodeIndex];\r\n const sourceNode = sourceNodes[nodeIndex];\r\n\r\n for (let inputIndex = 0; inputIndex < sourceNode.content.inputs.length; inputIndex++) {\r\n const sourceInput = sourceNode.content.inputs[inputIndex];\r\n const currentInput = currentNode.content.inputs[inputIndex];\r\n if (!sourceInput.isConnected) {\r\n continue;\r\n }\r\n const sourceContent = this.findNodeFromData(sourceInput.connectedPort!.ownerData).content;\r\n const activeNodes = sourceNodes.filter((s) => s.content === sourceContent);\r\n\r\n if (activeNodes.length > 0) {\r\n const activeNode = activeNodes[0];\r\n const indexInList = sourceNodes.indexOf(activeNode);\r\n\r\n // First make sure to connect the other one\r\n this.reconnectNewNodes(indexInList, newNodes, sourceNodes, done);\r\n\r\n // Then reconnect\r\n const outputIndex = sourceContent.outputs.indexOf(sourceInput.connectedPort!);\r\n const newOutput = newNodes[indexInList].content.data.outputs[outputIndex];\r\n\r\n newOutput.connectTo(currentInput.data);\r\n } else {\r\n // Connect with outside nodes\r\n sourceInput.connectedPort!.connectTo(currentInput);\r\n }\r\n\r\n this.connectPorts(currentInput.connectedPort!, currentInput);\r\n }\r\n\r\n currentNode.refresh();\r\n\r\n done[nodeIndex] = true;\r\n }\r\n\r\n public getCachedData(): any[] {\r\n return this._nodeDataContentList;\r\n }\r\n\r\n public removeDataFromCache(data: any) {\r\n const dataIndex = this._nodeDataContentList.indexOf(data);\r\n\r\n if (dataIndex > -1) {\r\n this._nodeDataContentList.splice(dataIndex, 1);\r\n }\r\n }\r\n\r\n public createNodeFromObject(nodeData: INodeData, onNodeCreated: (data: any) => void, recursion = true) {\r\n if (this._nodeDataContentList.indexOf(nodeData.data) !== -1) {\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n return this.nodes.filter((n) => n.content.data === nodeData.data)[0];\r\n }\r\n\r\n onNodeCreated(nodeData.data);\r\n\r\n // Connections\r\n if (nodeData.inputs.length) {\r\n for (const input of nodeData.inputs) {\r\n if (input.connectedPort && recursion) {\r\n this.createNodeFromObject(TypeLedger.NodeDataBuilder(input.connectedPort.ownerData, this), onNodeCreated);\r\n }\r\n }\r\n }\r\n\r\n // Graph\r\n const node = this.appendNode(nodeData);\r\n\r\n node.addClassToVisual(nodeData.getClassName());\r\n\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getGridPosition(position: number, useCeil = false) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n if (useCeil) {\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n return gridSize * Math.floor(position / gridSize);\r\n }\r\n\r\n public getGridPositionCeil(position: number) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n\r\n updateTransform() {\r\n this._rootContainer.style.transform = `translate(${this._x}px, ${this._y}px) scale(${this._zoom})`;\r\n\r\n if (DataStorage.ReadBoolean(\"ShowGrid\", true)) {\r\n this._hostCanvas.style.backgroundSize = `${this._gridSize * this._zoom}px ${this._gridSize * this._zoom}px`;\r\n this._hostCanvas.style.backgroundPosition = `${this._x}px ${this._y}px`;\r\n } else {\r\n this._hostCanvas.style.backgroundSize = `0`;\r\n }\r\n }\r\n\r\n onKeyUp() {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n this._oldY = -1;\r\n }\r\n\r\n findNodeFromData(data: any) {\r\n return this.nodes.filter((n) => n.content.data === data)[0];\r\n }\r\n\r\n reset() {\r\n this._nodeDataContentList = [];\r\n\r\n for (const node of this._nodes) {\r\n node.dispose();\r\n }\r\n\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n this._nodes = [];\r\n this._frames = [];\r\n this._links = [];\r\n this._graphCanvas.innerHTML = \"\";\r\n this._svgCanvas.innerHTML = \"\";\r\n }\r\n\r\n connectPorts(pointA: IPortData, pointB: IPortData) {\r\n if (!pointA || !pointB) {\r\n return;\r\n }\r\n\r\n const ownerDataA = pointA.ownerData;\r\n const ownerDataB = pointB.ownerData;\r\n const nodeA = this.findNodeFromData(ownerDataA);\r\n const nodeB = this.findNodeFromData(ownerDataB);\r\n\r\n if (!nodeA || !nodeB) {\r\n return;\r\n }\r\n\r\n const portA = nodeA.getPortForPortData(pointA);\r\n const portB = nodeB.getPortForPortData(pointB);\r\n\r\n if (!portA || !portB) {\r\n return;\r\n }\r\n\r\n for (const currentLink of this._links) {\r\n if (currentLink.portA === portA && currentLink.portB === portB) {\r\n return;\r\n }\r\n if (currentLink.portA === portB && currentLink.portB === portA) {\r\n return;\r\n }\r\n }\r\n\r\n const link = new NodeLink(this, portA, nodeA, portB, nodeB);\r\n this._links.push(link);\r\n\r\n nodeA.links.push(link);\r\n nodeB.links.push(link);\r\n }\r\n\r\n removeLink(link: NodeLink) {\r\n const index = this._links.indexOf(link);\r\n\r\n if (index > -1) {\r\n this._links.splice(index, 1);\r\n }\r\n\r\n link.dispose();\r\n }\r\n\r\n appendNode(nodeData: INodeData) {\r\n const newNode = new GraphNode(nodeData, this.props.stateManager);\r\n\r\n newNode.appendVisual(this._graphCanvas, this);\r\n\r\n this._nodes.push(newNode);\r\n this._nodeDataContentList.push(nodeData.data);\r\n\r\n return newNode;\r\n }\r\n\r\n distributeGraph() {\r\n this.x = 0;\r\n this.y = 0;\r\n this.zoom = 1;\r\n\r\n const graph = new dagre.graphlib.Graph();\r\n graph.setGraph({});\r\n graph.setDefaultEdgeLabel(() => ({}));\r\n graph.graph().rankdir = \"LR\";\r\n\r\n // Build dagre graph\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n graph.setNode(node.id.toString(), {\r\n id: node.id,\r\n type: \"node\",\r\n width: node.width,\r\n height: node.height,\r\n });\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n graph.setNode(frame.id.toString(), {\r\n id: frame.id,\r\n type: \"frame\",\r\n width: frame.element.clientWidth,\r\n height: frame.element.clientHeight,\r\n });\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.content.outputs.forEach((output) => {\r\n if (!output.hasEndpoints) {\r\n return;\r\n }\r\n\r\n output.endpoints!.forEach((endpoint) => {\r\n const sourceFrames = this._frames.filter((f) => f.nodes.indexOf(node) !== -1);\r\n const targetFrames = this._frames.filter((f) => f.nodes.some((n) => n.content.data === endpoint.ownerData));\r\n\r\n const sourceId = sourceFrames.length > 0 ? sourceFrames[0].id : node.id;\r\n const targetId = targetFrames.length > 0 ? targetFrames[0].id : endpoint.ownerData.uniqueId;\r\n\r\n graph.setEdge(sourceId.toString(), targetId.toString());\r\n });\r\n });\r\n });\r\n\r\n // Distribute\r\n dagre.layout(graph);\r\n\r\n // Update graph\r\n const dagreNodes = graph.nodes().map((node) => graph.node(node));\r\n dagreNodes.forEach((dagreNode: any) => {\r\n if (!dagreNode) {\r\n return;\r\n }\r\n if (dagreNode.type === \"node\") {\r\n for (const node of this._nodes) {\r\n if (node.id === dagreNode.id) {\r\n node.x = dagreNode.x - dagreNode.width / 2;\r\n node.y = dagreNode.y - dagreNode.height / 2;\r\n node.cleanAccumulation();\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n for (const frame of this._frames) {\r\n if (frame.id === dagreNode.id) {\r\n this._frameIsMoving = true;\r\n frame.move(dagreNode.x - dagreNode.width / 2, dagreNode.y - dagreNode.height / 2, false);\r\n frame.cleanAccumulation();\r\n this._frameIsMoving = false;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n this._hostCanvas = this._hostCanvasRef.current!;\r\n this._rootContainer = this._rootContainerRef.current!;\r\n this._graphCanvas = this._graphCanvasRef.current!;\r\n this._svgCanvas = this._svgCanvasRef.current! as unknown as HTMLElement;\r\n this._selectionContainer = this._selectionContainerRef.current!;\r\n this._frameContainer = this._frameContainerRef.current!;\r\n\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n this.updateTransform();\r\n }\r\n\r\n onMove(evt: React.PointerEvent) {\r\n // Selection box\r\n if (this._selectionBox) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.left = `${localX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.top = `${localY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n this.props.stateManager.onSelectionBoxMoved.notifyObservers(this._selectionBox.getBoundingClientRect());\r\n\r\n return;\r\n }\r\n\r\n // Candidate frame box\r\n if (this._frameCandidate) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.left = `${localX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.top = `${localY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Candidate link\r\n if (this._candidateLink) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._candidatePort = null;\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(new Vector2(evt.pageX, evt.pageY));\r\n this._dropPointX = (evt.pageX - rootRect.left) / this.zoom;\r\n this._dropPointY = (evt.pageY - rootRect.top) / this.zoom;\r\n\r\n this._candidateLink.update(this._dropPointX, this._dropPointY, true);\r\n this._candidateLinkedHasMoved = true;\r\n\r\n return;\r\n }\r\n\r\n // Zoom with mouse + alt\r\n if (this._altKeyIsPressed && evt.buttons === 1) {\r\n if (this._oldY < 0) {\r\n this._oldY = evt.pageY;\r\n }\r\n\r\n const zoomDelta = (evt.pageY - this._oldY) / 10;\r\n if (Math.abs(zoomDelta) > 5) {\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.max(Math.min(this._maxZoom, this.zoom + zoomDelta / 100), this._minZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n\r\n this._oldY = evt.pageY;\r\n }\r\n return;\r\n }\r\n\r\n // Move canvas\r\n this._rootContainer.style.cursor = \"move\";\r\n\r\n if (this._mouseStartPointX === null || this._mouseStartPointY === null) {\r\n return;\r\n }\r\n this.x += evt.clientX - this._mouseStartPointX;\r\n this.y += evt.clientY - this._mouseStartPointY;\r\n\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onDown(evt: React.PointerEvent<HTMLElement>) {\r\n this._rootContainer.setPointerCapture(evt.pointerId);\r\n\r\n // Port dragging\r\n if (evt.nativeEvent.srcElement && (evt.nativeEvent.srcElement as HTMLElement).nodeName === \"IMG\") {\r\n if (!this._candidateLink) {\r\n const portElement = ((evt.nativeEvent.srcElement as HTMLElement).parentElement as any).port as NodePort;\r\n if (this._altKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n // Delete connection\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n\r\n // Pick the first one as target port\r\n const targetNode = links[0].nodeA === node ? links[0].nodeB : links[0].nodeA;\r\n const targetPort = links[0].nodeA === node ? links[0].portB : links[0].portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else if (this._multiKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n // Pick the first one as target port\r\n const linkToConsider = this._selectedLink || links[0];\r\n const targetNode = linkToConsider.nodeA === node ? linkToConsider.nodeB : linkToConsider.nodeA;\r\n const targetPort = linkToConsider.nodeA === node ? linkToConsider.portB : linkToConsider.portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else {\r\n this._candidateLink = new NodeLink(this, portElement, portElement.node);\r\n }\r\n this._candidateLinkedHasMoved = false;\r\n }\r\n return;\r\n }\r\n\r\n // Selection?\r\n if (evt.currentTarget === this._hostCanvas && this._multiKeyIsPressed) {\r\n this._selectionBox = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._selectionBox.classList.add(styles[\"selection-box\"]);\r\n this._selectionContainer.appendChild(this._selectionBox);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.width = \"0px\";\r\n this._selectionBox.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n // Frame?\r\n if (evt.currentTarget === this._hostCanvas && evt.shiftKey) {\r\n this._frameCandidate = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._frameCandidate.classList.add(commonStyles[\"frame-box\"]);\r\n this._frameContainer.appendChild(this._frameCandidate);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.width = \"0px\";\r\n this._frameCandidate.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onUp(evt: React.PointerEvent) {\r\n this._mouseStartPointX = null;\r\n this._mouseStartPointY = null;\r\n this._rootContainer.releasePointerCapture(evt.pointerId);\r\n this._oldY = -1;\r\n if (this._candidateLink) {\r\n if (this._candidateLinkedHasMoved) {\r\n this.processCandidatePort();\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(null);\r\n } else {\r\n // is a click event on NodePort\r\n if (this._candidateLink.portA instanceof FrameNodePort) {\r\n //only on Frame Node Ports\r\n const port = this._candidateLink.portA;\r\n const frame = this.frames.find((frame: GraphFrame) => frame.id === port.parentFrameId);\r\n if (frame) {\r\n const data: FramePortData = {\r\n frame,\r\n port,\r\n };\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: data });\r\n }\r\n } else if (this._candidateLink.portA instanceof NodePort) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: this._candidateLink.portA });\r\n }\r\n }\r\n this._candidateLink.dispose();\r\n this._candidateLink = null;\r\n this._candidatePort = null;\r\n }\r\n\r\n if (this._selectionBox) {\r\n this._selectionBox.parentElement!.removeChild(this._selectionBox);\r\n this._selectionBox = null;\r\n }\r\n\r\n if (this._frameCandidate) {\r\n const newFrame = new GraphFrame(this._frameCandidate, this);\r\n this._frames.push(newFrame);\r\n\r\n this._frameCandidate.parentElement!.removeChild(this._frameCandidate);\r\n this._frameCandidate = null;\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame });\r\n }\r\n }\r\n\r\n onWheel(evt: React.WheelEvent) {\r\n const delta = evt.deltaY < 0 ? 0.1 : -0.1;\r\n\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.min(Math.max(this._minZoom, this.zoom + delta * this.zoom), this._maxZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const clientHeight = boundingRect.height;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const heightDiff = clientHeight * this.zoom - clientHeight * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n const clientY = evt.clientY - boundingRect.top;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n const yFactor = (clientY - this.y) / oldZoom / clientHeight;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n this.y = this.y - heightDiff * yFactor;\r\n }\r\n\r\n zoomToFit() {\r\n // Get negative offset\r\n let minX = 0;\r\n let minY = 0;\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n if (node.x < minX) {\r\n minX = node.x;\r\n }\r\n if (node.y < minY) {\r\n minY = node.y;\r\n }\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n if (frame.x < minX) {\r\n minX = frame.x;\r\n }\r\n if (frame.y < minY) {\r\n minY = frame.y;\r\n }\r\n });\r\n\r\n // Restore to 0\r\n this._frames.forEach((frame) => {\r\n frame.x += -minX;\r\n frame.y += -minY;\r\n frame.cleanAccumulation();\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.x += -minX;\r\n node.y += -minY;\r\n node.cleanAccumulation();\r\n });\r\n\r\n // Get correct zoom\r\n const xFactor = this._rootContainer.clientWidth / this._rootContainer.scrollWidth;\r\n const yFactor = this._rootContainer.clientHeight / this._rootContainer.scrollHeight;\r\n const zoomFactor = xFactor < yFactor ? xFactor : yFactor;\r\n\r\n this.zoom = zoomFactor;\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n processCandidatePort() {\r\n let pointB = this._candidateLink!.portA.portData;\r\n let nodeB = this._candidateLink!.portA.node;\r\n let pointA: IPortData;\r\n let nodeA: GraphNode;\r\n\r\n if (this._candidatePort) {\r\n pointA = this._candidatePort.portData;\r\n nodeA = this._candidatePort.node;\r\n } else {\r\n if (pointB.direction === PortDataDirection.Output) {\r\n return;\r\n }\r\n\r\n // No destination so let's spin a new input node\r\n const newDefaultInput = this.props.stateManager.createDefaultInputData(this.props.stateManager.data, this._candidateLink!.portA.portData, this);\r\n if (!newDefaultInput) {\r\n return;\r\n }\r\n const pointName = newDefaultInput.name;\r\n const emittedNodeData = newDefaultInput.data;\r\n\r\n pointA = emittedNodeData.getPortByName(pointName)!;\r\n if (!emittedNodeData.isInput) {\r\n nodeA = this.props.onEmitNewNode(emittedNodeData);\r\n } else {\r\n nodeA = this.appendNode(emittedNodeData as any);\r\n }\r\n nodeA.x = this._dropPointX - 200;\r\n nodeA.y = this._dropPointY - 50;\r\n\r\n const x = nodeA.x - 250;\r\n let y = nodeA.y;\r\n\r\n emittedNodeData.inputs.forEach((portData: IPortData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x;\r\n connectedNode.y = y;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (pointA.direction === PortDataDirection.Input) {\r\n const temp = pointB;\r\n pointB = pointA;\r\n pointA = temp;\r\n\r\n const tempNode = nodeA;\r\n nodeA = nodeB;\r\n nodeB = tempNode;\r\n }\r\n\r\n if (pointB.connectedPort === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB.direction === pointA.direction) {\r\n return;\r\n }\r\n\r\n if (pointB.ownerData === pointA.ownerData) {\r\n return;\r\n }\r\n\r\n // Check compatibility\r\n let compatibilityState = pointA.checkCompatibilityState(pointB);\r\n if ((pointA.needDualDirectionValidation || pointB.needDualDirectionValidation) && !compatibilityState) {\r\n compatibilityState = pointB.checkCompatibilityState(pointA);\r\n }\r\n\r\n const message = pointA.getCompatibilityIssueMessage(compatibilityState, nodeB, pointB);\r\n\r\n if (message) {\r\n this.props.stateManager.onErrorMessageDialogRequiredObservable.notifyObservers(message);\r\n return;\r\n }\r\n\r\n let linksToNotifyForDispose: Nullable<NodeLink[]> = null;\r\n\r\n if (pointB.isConnected) {\r\n const links = nodeB.getLinksForPortData(pointB);\r\n\r\n linksToNotifyForDispose = links.slice();\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n }\r\n\r\n if (pointB.ownerData.inputsAreExclusive) {\r\n // Disconnect all inputs if node has exclusive inputs\r\n pointB.ownerData.inputs.forEach((i: any) => {\r\n const links = nodeB.getLinksForPortData(i);\r\n\r\n if (!linksToNotifyForDispose) {\r\n linksToNotifyForDispose = links.slice();\r\n } else {\r\n linksToNotifyForDispose.push(...links.slice());\r\n }\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n });\r\n }\r\n\r\n this.connectNodes(nodeA, pointA, nodeB, pointB);\r\n\r\n linksToNotifyForDispose?.forEach((link) => {\r\n link.onDisposedObservable.notifyObservers(link);\r\n link.onDisposedObservable.clear();\r\n });\r\n\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n }\r\n\r\n connectNodes(nodeA: GraphNode, pointA: IPortData, nodeB: GraphNode, pointB: IPortData) {\r\n pointA.connectTo(pointB);\r\n this.connectPorts(pointA, pointB);\r\n\r\n // Need to potentially propagate the type of pointA to other ports of nodes connected to owner of pointB\r\n // We also need to check if we want to display the promotion warning\r\n\r\n const visitedNodes = new Set<GraphNode>([nodeA]);\r\n const visitedLinks = new Set<NodeLink>([nodeB.links[nodeB.links.length - 1]]);\r\n\r\n RefreshNode(nodeB, visitedNodes, visitedLinks);\r\n }\r\n\r\n drop(newNode: GraphNode, targetX: number, targetY: number, offsetX: number, offsetY: number) {\r\n let x = targetX - this.x - offsetX * this.zoom;\r\n let y = targetY - this.y - offsetY * this.zoom;\r\n\r\n newNode.x = x / this.zoom;\r\n newNode.y = y / this.zoom;\r\n newNode.cleanAccumulation();\r\n\r\n this.props.stateManager.onNewNodeCreatedObservable.notifyObservers(newNode);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode });\r\n\r\n x -= GraphCanvasComponent.NodeWidth + 150;\r\n\r\n newNode.content.inputs.forEach((portData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x / this.zoom;\r\n connectedNode.y = y / this.zoom;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n processEditorData(editorData: IEditorData) {\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n\r\n this._frames = [];\r\n this.x = editorData.x || 0;\r\n this.y = editorData.y || 0;\r\n this.zoom = editorData.zoom || 1;\r\n\r\n // Frames\r\n if (editorData.frames) {\r\n for (const frameData of editorData.frames) {\r\n const frame = GraphFrame.Parse(frameData, this, editorData.map);\r\n this._frames.push(frame);\r\n }\r\n }\r\n }\r\n\r\n reOrganize(editorData: Nullable<IEditorData> = null, isImportingAFrame = false) {\r\n if (!editorData || !editorData.locations) {\r\n this.distributeGraph();\r\n } else {\r\n // Locations\r\n for (const location of editorData.locations) {\r\n for (const node of this.nodes) {\r\n const data = node.content.data;\r\n if (data && data.uniqueId === location.blockId) {\r\n node.x = location.x;\r\n node.y = location.y;\r\n node.cleanAccumulation();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!isImportingAFrame) {\r\n this.processEditorData(editorData);\r\n }\r\n }\r\n\r\n this._isLoading = false;\r\n for (const node of this.nodes) {\r\n node._refreshLinks();\r\n }\r\n }\r\n\r\n addFrame(frameData: IFrameData) {\r\n const frame = GraphFrame.Parse(frameData, this, this.props.stateManager.getEditorDataMap());\r\n this._frames.push(frame);\r\n this.stateManager.onSelectionChangedObservable.notifyObservers({ selection: frame });\r\n }\r\n\r\n render() {\r\n return (\r\n <div\r\n ref={this._hostCanvasRef}\r\n id=\"graph-canvas\"\r\n className={styles[\"graph-canvas\"]}\r\n onWheel={(evt) => this.onWheel(evt)}\r\n onPointerMove={(evt) => this.onMove(evt)}\r\n onPointerDown={(evt) => this.onDown(evt)}\r\n onPointerUp={(evt) => this.onUp(evt)}\r\n >\r\n <div id=\"graph-container\" className={styles[\"graph-container\"]} ref={this._rootContainerRef}>\r\n <div id=\"graph-canvas-container\" className={styles[\"graph-canvas-container\"]} ref={this._graphCanvasRef}></div>\r\n <div id=\"frame-container\" className={styles[\"frame-container\"]} ref={this._frameContainerRef}></div>\r\n <svg id=\"graph-svg-container\" className={styles[\"graph-svg-container\"]} ref={this._svgCanvasRef}></svg>\r\n <div id=\"selection-container\" className={styles[\"selection-container\"]} ref={this._selectionContainerRef}></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
1
|
+
{"version":3,"file":"graphCanvas.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/graphCanvas.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,6CAA+B;AACjD,OAAO,EAAE,WAAW,EAAE,4CAA8B;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,MAAM,MAAM,4BAA4B,CAAC;AAChD,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAOjD,MAAM,OAAO,oBAAqB,SAAQ,KAAK,CAAC,SAAqC;IA+JjF,YAAY,KAAiC;QACzC,KAAK,CAAC,KAAK,CAAC,CAAC;QA9JA,aAAQ,GAAG,GAAG,CAAC;QACf,aAAQ,GAAG,CAAC,CAAC;QAEtB,mBAAc,GAAG,KAAK,CAAC,SAAS,EAAkB,CAAC;QAEnD,oBAAe,GAAG,KAAK,CAAC,SAAS,EAAkB,CAAC;QAEpD,2BAAsB,GAAG,KAAK,CAAC,SAAS,EAAkB,CAAC;QAE3D,uBAAkB,GAAG,KAAK,CAAC,SAAS,EAAkB,CAAC;QAEvD,kBAAa,GAAG,KAAK,CAAC,SAAS,EAAiB,CAAC;QAEjD,sBAAiB,GAAG,KAAK,CAAC,SAAS,EAAkB,CAAC;QAEtD,WAAM,GAAgB,EAAE,CAAC;QACzB,WAAM,GAAe,EAAE,CAAC;QACxB,sBAAiB,GAAqB,IAAI,CAAC;QAC3C,sBAAiB,GAAqB,IAAI,CAAC;QAC3C,gBAAW,GAAG,CAAC,CAAC;QAChB,gBAAW,GAAG,CAAC,CAAC;QAChB,qBAAgB,GAAG,CAAC,CAAC;QACrB,qBAAgB,GAAG,CAAC,CAAC;QACrB,6BAAwB,GAAG,KAAK,CAAC;QACjC,OAAE,GAAG,CAAC,CAAC;QACP,OAAE,GAAG,CAAC,CAAC;QACP,UAAK,GAAG,CAAC,CAAC;QACV,mBAAc,GAAgB,EAAE,CAAC;QACjC,kBAAa,GAAuB,IAAI,CAAC;QACzC,kBAAa,GAAuB,IAAI,CAAC;QACzC,mBAAc,GAAuB,IAAI,CAAC;QAC1C,mBAAc,GAAuC,IAAI,CAAC;QAC1D,cAAS,GAAG,EAAE,CAAC;QACf,kBAAa,GAA6B,IAAI,CAAC;QAC/C,oBAAe,GAAiB,EAAE,CAAC;QACnC,oBAAe,GAA6B,IAAI,CAAC;QACjD,YAAO,GAAiB,EAAE,CAAC;QAC3B,yBAAoB,GAAG,IAAI,KAAK,EAAO,CAAC;QAExC,qBAAgB,GAAG,KAAK,CAAC;QACzB,uBAAkB,GAAG,KAAK,CAAC;QAC3B,UAAK,GAAG,CAAC,CAAC,CAAC;QAEZ,mBAAc,GAAG,KAAK,CAAC;QACvB,eAAU,GAAG,KAAK,CAAC;QACnB,yBAAoB,GAAuB,IAAI,CAAC;QAE/C,iBAAY,GAAgB,EAAE,CAAC;QAC/B,kBAAa,GAAiB,EAAE,CAAC;QAgHrC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5D,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;YAClF,IAAI,CAAC,SAAS,EAAE;gBACZ,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gBACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;aAC7B;iBAAM;gBACH,IAAI,SAAS,YAAY,QAAQ,EAAE;oBAC/B,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;oBACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;oBAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;iBAC7B;qBAAM,IAAI,SAAS,YAAY,QAAQ,EAAE;oBACtC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;oBACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;iBAClC;qBAAM,IAAI,SAAS,YAAY,aAAa,EAAE;oBAC3C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;oBACzB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;iBAClC;qBAAM,IAAI,SAAS,YAAY,SAAS,IAAI,SAAS,YAAY,UAAU,EAAE;oBAC1E,sHAAsH;oBACtH,uBAAuB;oBACvB,IAAI,gBAAgB,EAAE;wBAClB,IAAI,SAAS,YAAY,UAAU,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;4BAC9E,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;yBACxC;6BAAM,IAAI,SAAS,YAAY,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;4BACnF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;yBACvC;wBACD,IAAI,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE;4BAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;4BACjC,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,cAAc,EAAE;gCAC5C,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,eAAe,EAAE;oCAC9C,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;wCAC5C,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;qCACrC;iCACJ;6BACJ;4BACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;yBACrF;qBACJ;yBAAM;wBACH,IAAI,SAAS,YAAY,UAAU,EAAE;4BACjC,IAAI,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,EAAE;gCAC/C,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;oCACrH,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iCACxC;6BACJ;iCAAM;gCACH,IAAI,CAAC,eAAe,GAAG,CAAC,SAAS,CAAC,CAAC;gCACnC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gCACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gCAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;6BAC7B;yBACJ;6BAAM,IAAI,SAAS,YAAY,SAAS,EAAE;4BACvC,IAAI,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,EAAE;gCAC/C,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;oCACrH,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iCACvC;6BACJ;iCAAM;gCACH,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;gCAC1B,IAAI,CAAC,cAAc,GAAG,CAAC,SAAS,CAAC,CAAC;gCAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gCAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;6BAC7B;yBACJ;qBACJ;iBACJ;aACJ;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,YAAY,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;QAC7F,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAa,CAAC,gBAAgB,CAClD,SAAS,EACT,CAAC,GAAG,EAAE,EAAE;YACJ,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC;QACzD,CAAC,EACD,KAAK,CACR,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAa,CAAC,WAAY,CAAC,gBAAgB,CAC/D,MAAM,EACN,GAAG,EAAE;YACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QACpC,CAAC,EACD,KAAK,CACR,CAAC;QAEF,gDAAgD;QAChD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE;YACjE,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;YACvB,IAAI,UAAU,EAAE;gBACZ,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;aACxD;iBAAM;gBACH,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBACtB,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBACtB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;oBAC9B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;iBACjD;aACJ;QACL,CAAC,CAAC;IACN,CAAC;IA9ND,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ,CAAC,KAAa;QAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,IAAI,CAAC,KAAa;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;YACtB,OAAO;SACV;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,IAAW,CAAC;QACR,OAAO,IAAI,CAAC,EAAE,CAAC;IACnB,CAAC;IAED,IAAW,CAAC,CAAC,KAAa;QACtB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;QAEhB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,IAAW,CAAC;QACR,OAAO,IAAI,CAAC,EAAE,CAAC;IACnB,CAAC;IAED,IAAW,CAAC,CAAC,KAAa;QACtB,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;QAEhB,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IACD,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAED,2GAA2G;IACnG,8BAA8B,CAAC,cAA4B,EAAE,aAA0B;QAC3F,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE;YAChC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;gBAC9B,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC5B,OAAO,IAAI,CAAC;iBACf;aACJ;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAuHD,qCAAqC,CAAC,IAAe,EAAE,KAAkB,EAAE,MAA6B,EAAE,OAA8B;QACpI,MAAM,CAAC,IAAI,CACP,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,WAAC,OAAA,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAK,MAAA,CAAC,CAAC,aAAa,0CAAE,SAAS,CAAA,CAAA,EAAA,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CACrK,CAAC;QAEF,OAAO,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;aACvB,IAAI,EAAE;aACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAC5F,CAAC;IACN,CAAC;IAED,eAAe,CAAC,MAA6B,EAAE,OAA8B,EAAE,SAAS,GAAG,KAAK;QAC5F,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,kBAAkB,EAAE;oBACpB,OAAO;iBACV;gBACD,IAAI,CAAC,KAAK,EAAE;oBACR,OAAO;iBACV;gBACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;oBACtC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACzD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC3D,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;oBACxD,OAAO,CAAC,KAAK,EAAE,CAAC;oBAChB,IAAI,SAAS,EAAE;wBACX,kBAAkB,GAAG,IAAI,CAAC;wBAC1B,OAAO;qBACV;iBACJ;YACL,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAED,gBAAgB,CAAC,IAAe,EAAE,IAAc;QAC5C,oBAAoB;QACpB,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,MAAM,mBAAmB,GAA0B,EAAE,CAAC;QACtD,MAAM,oBAAoB,GAA0B,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAM,CAAC;QAE9B,kBAAkB;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,gBAAgB;QAChB,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAE/E,oBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAExE,YAAY;QACZ,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,2BAA2B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,gBAAgB,CAAC,IAAe,EAAE,MAAiB;QAC/C,oBAAoB;QACpB,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,MAAM,mBAAmB,GAA0B,EAAE,CAAC;QAEtD,gBAAgB;QAChB,mBAAmB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAE/E,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEvC,YAAY;QACZ,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,2BAA2B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,eAAe,CAAC,QAAuC,EAAE,aAAa,GAAG,KAAK;QAC1E,SAAS;QACT,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,WAAW,GAAG,IAAI,CAAC;YACnB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;gBACtC,IAAI,aAAa,EAAE;oBACf,IAAI,CAAC,qCAAqC,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;iBAC5F;gBAED,YAAY,CAAC,OAAO,EAAE,CAAC;gBAEvB,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC/B,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aACvD;SACJ;QAED,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;SAC/B;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YAC5B,WAAW,GAAG,IAAI,CAAC;YACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;gBACrC,IAAI,KAAK,CAAC,WAAW,EAAE;oBACnB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC3B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;wBACjC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACtD,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC5B;oBACD,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;iBAC7B;qBAAM;oBACH,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBACzB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;oBAC/B,CAAC,CAAC,CAAC;iBACN;gBACD,KAAK,CAAC,OAAO,EAAE,CAAC;aACnB;SACJ;QAED,IAAI,CAAC,WAAW,EAAE;YACd,OAAO;SACV;QAED,wBAAwB;QACxB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEtC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,2BAA2B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,aAAa,CACT,GAAkB,EAClB,QAAuC,EACvC,cAAsB,EACtB,cAAsB,EACtB,aAA2C,EAC3C,WAA2B;QAE3B,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACpC,OAAO;SACV;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAa,CAAC,IAAI,EAAE;YACnF,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;YAChH,OAAO;SACV;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE;YACvF,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO;SACV;QAED,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE;YAC3E,OAAO;SACV;QAED,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE;YACpC,OAAO;YACP,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YAExB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;gBAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE;oBACrC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBAClC;gBACD,OAAO;aACV;YAED,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;gBACvB,OAAO;aACV;YAED,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAc,CAAC;YAEnD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC9C;aAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,EAAE;YAC3C,QAAQ;YACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;YAC5B,IAAI,QAAQ,GAAG,CAAC,cAAc,GAAG,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC;YAElF,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;gBAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE;oBACpC,YAAY;oBACZ,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAE3B,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;oBAC7B,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBAC/B,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;oBACnB,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBAC3B,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;oBAE7B,IAAI,QAAQ,GAAG,CAAC,cAAc,GAAG,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;oBAC9E,QAAQ,CAAC,CAAC,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;oBAC3C,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC;oBAEtB,cAAc;oBACd,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;wBACpB,QAAQ,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;wBACnD,QAAQ,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;wBAEnD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;wBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;wBACrF,IAAI,QAAQ,EAAE;4BACV,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;gCACzB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;6BAC3B;yBACJ;wBACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;qBAC/B;oBAED,QAAQ,CAAC,WAAW,EAAE,CAAC;oBAEvB,IAAI,KAAK,CAAC,WAAW,EAAE;wBACnB,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;qBAC/B;oBAED,SAAS;oBACT,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxH,OAAO;iBACV;aACJ;YAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;gBAC3B,OAAO;aACV;YAED,MAAM,QAAQ,GAAG,CAAC,cAAc,GAAG,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;YACjH,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;SACnF;IACL,CAAC;IAED,cAAc,CAAC,WAAwB,EAAE,QAAgB,EAAE,QAAgB,EAAE,aAA2C,EAAE,SAAS,GAAG,KAAK;QACvI,IAAI,YAAY,GAAwB,IAAI,CAAC;QAE7C,MAAM,QAAQ,GAAgB,EAAE,CAAC;QAEjC,+DAA+D;QAC/D,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QAElC,mBAAmB;QACnB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE3E,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAE/B,IAAI,CAAC,IAAI,EAAE;gBACP,SAAS;aACZ;YAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,YAAY,EAAE;gBACd,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;gBACvC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;aAC1C;iBAAM;gBACH,YAAY,GAAG,IAAI,CAAC;gBACpB,CAAC,GAAG,QAAQ,CAAC;gBACb,CAAC,GAAG,QAAQ,CAAC;aAChB;YAED,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAE5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEvB,IAAI,SAAS,EAAE;gBACX,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;aAC1H;SACJ;QAED,SAAS;QACT,MAAM,IAAI,GAAG,IAAI,KAAK,CAAU,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAClD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;SAC9D;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,QAAqB,EAAE,WAAwB,EAAE,IAAe;QACjG,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE;YACjB,OAAO;SACV;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QAE1C,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;YAClF,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;gBAC1B,SAAS;aACZ;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,aAAc,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YAC1F,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;YAE3E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAEpD,2CAA2C;gBAC3C,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;gBAEjE,iBAAiB;gBACjB,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAc,CAAC,CAAC;gBAC9E,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAE1E,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aAC1C;iBAAM;gBACH,6BAA6B;gBAC7B,WAAW,CAAC,aAAc,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;aACtD;YAED,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,aAAc,EAAE,YAAY,CAAC,CAAC;SAChE;QAED,WAAW,CAAC,OAAO,EAAE,CAAC;QAEtB,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAC3B,CAAC;IAEM,aAAa;QAChB,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAEM,mBAAmB,CAAC,IAAS;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE1D,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE;YAChB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;SAClD;IACL,CAAC;IAEM,oBAAoB,CAAC,QAAmB,EAAE,aAAkC,EAAE,SAAS,GAAG,IAAI;QACjG,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACzD,QAAQ;YACR,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE;gBACrC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;oBACjC,IAAI,KAAK,CAAC,WAAW,EAAE;wBACnB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAc,EAAE,KAAK,CAAC,CAAC;qBAClD;iBACJ;aACJ;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACxE;QAED,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE7B,cAAc;QACd,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;YACxB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACjC,IAAI,KAAK,CAAC,aAAa,IAAI,SAAS,EAAE;oBAClC,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;iBAC7G;aACJ;SACJ;QAED,QAAQ;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAE/C,QAAQ;QACR,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE;YACrC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACjC,IAAI,KAAK,CAAC,WAAW,EAAE;oBACnB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,aAAc,EAAE,KAAK,CAAC,CAAC;iBAClD;aACJ;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,eAAe,CAAC,QAAgB,EAAE,OAAO,GAAG,KAAK;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,QAAQ,KAAK,CAAC,EAAE;YAChB,OAAO,QAAQ,CAAC;SACnB;QACD,IAAI,OAAO,EAAE;YACT,OAAO,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;SACpD;QACD,OAAO,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEM,mBAAmB,CAAC,QAAgB;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,QAAQ,KAAK,CAAC,EAAE;YAChB,OAAO,QAAQ,CAAC;SACnB;QACD,OAAO,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,eAAe;QACX,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,aAAa,IAAI,CAAC,KAAK,GAAG,CAAC;QAEnG,IAAI,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE;YAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;YAC5G,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,GAAG,GAAG,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC;SAC3E;aAAM;YACH,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC;SAC/C;IACL,CAAC;IAED,OAAO;QACH,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,gBAAgB,CAAC,IAAS;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,KAAK;QACD,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;SAClB;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YACxB,KAAK,CAAC,OAAO,EAAE,CAAC;SACnB;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;IACnC,CAAC;IAED,YAAY,CAAC,MAAiB,EAAE,MAAiB;QAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE;YACpB,OAAO;SACV;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACpC,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;YAClB,OAAO;SACV;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE/C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;YAClB,OAAO;SACV;QAED,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE;YACnC,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,EAAE;gBAC5D,OAAO;aACV;YACD,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,EAAE;gBAC5D,OAAO;aACV;SACJ;QAED,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,UAAU,CAAC,IAAc;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAChC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,UAAU,CAAC,QAAmB;QAC1B,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEjE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,eAAe;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAEd,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACnB,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;QAE7B,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACxD,OAAO;aACV;YAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC9B,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACtB,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC/B,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;gBAChC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;aACrC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACpC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;oBACtB,OAAO;iBACV;gBAED,MAAM,CAAC,SAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACnC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;oBAE5G,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;oBAE5F,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,aAAa;QACb,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEpB,eAAe;QACf,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,UAAU,CAAC,OAAO,CAAC,CAAC,SAAc,EAAE,EAAE;YAClC,IAAI,CAAC,SAAS,EAAE;gBACZ,OAAO;aACV;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE;gBAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;oBAC5B,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,EAAE;wBAC1B,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;wBAC3C,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC5C,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACzB,OAAO;qBACV;iBACJ;gBACD,OAAO;aACV;YAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE;gBAC9B,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,EAAE;oBAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;oBACzF,KAAK,CAAC,iBAAiB,EAAE,CAAC;oBAC1B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;oBAC5B,OAAO;iBACV;aACJ;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,iBAAiB;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAQ,CAAC;QAChD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAQ,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAQ,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAkC,CAAC;QACxE,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAQ,CAAC;QAChE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAQ,CAAC;QAExD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,GAAuB;QAC1B,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACpC,OAAO;SACV;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAE9D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;YACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;YAExC,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBACzE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aACxF;iBAAM;gBACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aACxF;YAED,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBAChC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBACxE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aACzF;iBAAM;gBACH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBACzD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aACzF;YAED,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC;YAExG,OAAO;SACV;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAE9D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;YACzC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;YAExC,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBAChC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBAC3E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aAC1F;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBAC5D,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aAC1F;YAED,IAAI,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE;gBAChC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBAC1E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aAC3F;iBAAM;gBACH,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;gBAC3D,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;aAC3F;YAED,OAAO;SACV;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAChG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3D,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;YAE1D,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACrE,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;YAErC,OAAO;SACV;QAED,wBAAwB;QACxB,IAAI,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE;YAC5C,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;gBAChB,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;aAC1B;YAED,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAE1F,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;gBAC/D,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;gBACvC,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;gBAClE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC;gBAEhD,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,WAAW,CAAC;gBAE3D,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC;gBAEtC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;aAC1B;YACD,OAAO;SACV;QAED,cAAc;QACd,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAE1C,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE;YACpE,OAAO;SACV;QACD,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC/C,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAE/C,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,GAAoC;QACvC,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACpC,OAAO;SACV;QAED,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAErD,gBAAgB;QAChB,IAAI,GAAG,CAAC,WAAW,CAAC,UAAU,IAAK,GAAG,CAAC,WAAW,CAAC,UAA0B,CAAC,QAAQ,KAAK,KAAK,EAAE;YAC9F,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBACtB,MAAM,WAAW,GAAK,GAAG,CAAC,WAAW,CAAC,UAA0B,CAAC,aAAqB,CAAC,IAAgB,CAAC;gBACxG,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;oBAClG,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;oBAC9B,oBAAoB;oBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAE7D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;wBACnB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACxB,CAAC,CAAC,CAAC;oBAEH,oCAAoC;oBACpC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBAE7E,kBAAkB;oBAClB,IAAI,CAAC,cAAc,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,UAAW,EAAE,UAAW,CAAC,CAAC;iBACtE;qBAAM,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;oBAC3G,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;oBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAE7D,oCAAoC;oBACpC,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtD,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;oBAC/F,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC;oBAE/F,kBAAkB;oBAClB,IAAI,CAAC,cAAc,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,UAAW,EAAE,UAAW,CAAC,CAAC;iBACtE;qBAAM;oBACH,IAAI,CAAC,cAAc,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;iBAC3E;gBACD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;aACzC;YACD,OAAO;SACV;QAED,aAAa;QACb,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACnE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/E,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAC9D,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;YAClD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;YACjD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;YACzE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YACxC,OAAO;SACV;QAED,SAAS;QACT,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,EAAE;YACxD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAC9D,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;YAClD,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;YAC3E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;YAC1E,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACzC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YAC1C,OAAO;SACV;QAED,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,GAAuB;QACxB,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACpC,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,IAAI,CAAC,wBAAwB,EAAE;gBAC/B,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;aACtE;iBAAM;gBACH,+BAA+B;gBAC/B,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,YAAY,aAAa,EAAE;oBACpD,0BAA0B;oBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;oBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC;oBACvF,IAAI,KAAK,EAAE;wBACP,MAAM,IAAI,GAAkB;4BACxB,KAAK;4BACL,IAAI;yBACP,CAAC;wBACF,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7F;iBACJ;qBAAM,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,YAAY,QAAQ,EAAE;oBACtD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;iBAClH;aACJ;YACD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC9B;QAED,IAAI,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC,aAAc,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;SAC7B;QAED,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE5B,IAAI,CAAC,eAAe,CAAC,aAAc,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACtE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAE5B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;SACjG;IACL,CAAC;IAED,OAAO,CAAC,GAAqB;QACzB,IAAI,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACpC,OAAO;SACV;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5F,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC/D,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;QACvC,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;QACzC,MAAM,SAAS,GAAG,WAAW,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW,GAAG,OAAO,CAAC;QAClE,MAAM,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC;QACrE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC;QAE/C,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,WAAW,CAAC;QAC3D,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,YAAY,CAAC;QAE5D,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC;IAC3C,CAAC;IAED,SAAS;QACL,sBAAsB;QACtB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACxD,OAAO;aACV;YAED,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE;gBACf,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;aACjB;YACD,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE;gBACf,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;aACjB;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE;gBAChB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;aAClB;YACD,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE;gBAChB,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;aAClB;QACL,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACjB,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACjB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAChB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;QACpF,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAEzD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,oBAAoB;QAChB,IAAI,MAAM,GAAG,IAAI,CAAC,cAAe,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,IAAI,KAAK,GAAG,IAAI,CAAC,cAAe,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5C,IAAI,MAAiB,CAAC;QACtB,IAAI,KAAgB,CAAC;QAErB,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;YACtC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;SACpC;aAAM;YACH,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB,CAAC,MAAM,EAAE;gBAC/C,OAAO;aACV;YAED,gDAAgD;YAChD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,cAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAChJ,IAAI,CAAC,eAAe,EAAE;gBAClB,OAAO;aACV;YACD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC;YACvC,MAAM,eAAe,GAAG,eAAe,CAAC,IAAI,CAAC;YAE7C,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,SAAS,CAAE,CAAC;YACnD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE;gBAC1B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;aACrD;iBAAM;gBACH,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,eAAsB,CAAC,CAAC;aACnD;YACD,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACjC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YAEhC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;YACxB,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAEhB,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAmB,EAAE,EAAE;gBACnD,IAAI,QAAQ,CAAC,aAAa,EAAE;oBACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;;wBAC1C,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,MAAK,MAAA,QAAQ,CAAC,aAAa,0CAAE,SAAS,CAAA,CAAC;oBAChE,CAAC,CAAC,CAAC;oBACH,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;oBAEvC,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE;wBAChD,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC;wBACpB,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC;wBACpB,aAAa,CAAC,iBAAiB,EAAE,CAAC;wBAClC,CAAC,IAAI,EAAE,CAAC;qBACX;iBACJ;YACL,CAAC,CAAC,CAAC;SACN;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB,CAAC,KAAK,EAAE;YAC9C,MAAM,IAAI,GAAG,MAAM,CAAC;YACpB,MAAM,GAAG,MAAM,CAAC;YAChB,MAAM,GAAG,IAAI,CAAC;YAEd,MAAM,QAAQ,GAAG,KAAK,CAAC;YACvB,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,GAAG,QAAQ,CAAC;SACpB;QAED,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE;YACjC,OAAO;SACV;QAED,IAAI,MAAM,KAAK,MAAM,EAAE;YACnB,OAAO;SACV;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE;YACvC,OAAO;SACV;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,EAAE;YACvC,OAAO;SACV;QAED,sBAAsB;QACtB,IAAI,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,2BAA2B,IAAI,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACnG,kBAAkB,GAAG,MAAM,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;SAC/D;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,4BAA4B,CAAC,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEvF,IAAI,OAAO,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,sCAAsC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACxF,OAAO;SACV;QAED,IAAI,uBAAuB,GAAyB,IAAI,CAAC;QAEzD,IAAI,MAAM,CAAC,WAAW,EAAE;YACpB,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAEhD,uBAAuB,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAExC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;SACN;QAED,IAAI,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE;YACrC,qDAAqD;YACrD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;gBACvC,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAE3C,IAAI,CAAC,uBAAuB,EAAE;oBAC1B,uBAAuB,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;iBAC3C;qBAAM;oBACH,uBAAuB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;iBAClD;gBAED,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACnB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;SACN;QAED,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAEhD,uBAAuB,aAAvB,uBAAuB,uBAAvB,uBAAuB,CAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;IAED,YAAY,CAAC,KAAgB,EAAE,MAAiB,EAAE,KAAgB,EAAE,MAAiB;QACjF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAElC,wGAAwG;QACxG,oEAAoE;QAEpE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAW,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9E,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,OAAkB,EAAE,OAAe,EAAE,OAAe,EAAE,OAAe,EAAE,OAAe;QACvF,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAE/C,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,0BAA0B,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAE7F,CAAC,IAAI,oBAAoB,CAAC,SAAS,GAAG,GAAG,CAAC;QAE1C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACxC,IAAI,QAAQ,CAAC,aAAa,EAAE;gBACxB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;;oBAC1C,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,MAAK,MAAA,QAAQ,CAAC,aAAa,0CAAE,SAAS,CAAA,CAAC;gBAChE,CAAC,CAAC,CAAC;gBACH,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAEvC,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE;oBAChD,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;oBAChC,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;oBAChC,aAAa,CAAC,iBAAiB,EAAE,CAAC;oBAClC,CAAC,IAAI,EAAE,CAAC;iBACX;aACJ;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,iBAAiB,CAAC,UAAuB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YACxB,KAAK,CAAC,OAAO,EAAE,CAAC;SACnB;QAED,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;QAEjC,SAAS;QACT,IAAI,UAAU,CAAC,MAAM,EAAE;YACnB,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE;gBACvC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC5B;SACJ;IACL,CAAC;IAED,UAAU,CAAC,aAAoC,IAAI,EAAE,iBAAiB,GAAG,KAAK;QAC1E,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;YACtC,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;aAAM;YACH,YAAY;YACZ,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE;gBACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;oBAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC/B,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,OAAO,EAAE;wBAC5C,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;wBACpB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;wBACpB,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACzB,MAAM;qBACT;iBACJ;aACJ;YAED,IAAI,CAAC,iBAAiB,EAAE;gBACpB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;aACtC;SACJ;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;SACxB;IACL,CAAC;IAED,QAAQ,CAAC,SAAqB;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM;QACF,OAAO,CACH,eACI,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,EAAE,EAAC,cAAc,EACjB,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EACjC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EACnC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EACxC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EACxC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAEpC,eAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,iBAAiB,aACvF,cAAK,EAAE,EAAC,wBAAwB,EAAC,SAAS,EAAE,MAAM,CAAC,wBAAwB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,GAAQ,EAC/G,cAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,kBAAkB,GAAQ,EACpG,cAAK,EAAE,EAAC,qBAAqB,EAAC,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,GAAQ,EACvG,cAAK,EAAE,EAAC,qBAAqB,EAAC,SAAS,EAAE,MAAM,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,sBAAsB,GAAQ,IAC9G,EACN,KAAC,kBAAkB,IAAC,YAAY,EAAE,IAAI,CAAC,YAAY,GAAI,IACrD,CACT,CAAC;IACN,CAAC;;AAp6CsB,8BAAS,GAAG,GAAG,CAAC","sourcesContent":["import * as React from \"react\";\r\nimport { GraphNode } from \"./graphNode\";\r\nimport * as dagre from \"dagre\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { NodeLink } from \"./nodeLink\";\r\nimport { NodePort } from \"./nodePort\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { DataStorage } from \"core/Misc/dataStorage\";\r\nimport { GraphFrame } from \"./graphFrame\";\r\nimport type { IEditorData, IFrameData } from \"./interfaces/nodeLocationInfo\";\r\nimport { FrameNodePort } from \"./frameNodePort\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport type { FramePortData } from \"./types/framePortData\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport { PortDataDirection } from \"./interfaces/portData\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport styles from \"./graphCanvas.modules.scss\";\r\nimport commonStyles from \"./common.modules.scss\";\r\n\r\nimport { TypeLedger } from \"./typeLedger\";\r\nimport { RefreshNode } from \"./tools\";\r\nimport { SearchBoxComponent } from \"./searchBox\";\r\n\r\nexport interface IGraphCanvasComponentProps {\r\n stateManager: StateManager;\r\n onEmitNewNode: (nodeData: INodeData) => GraphNode;\r\n}\r\n\r\nexport class GraphCanvasComponent extends React.Component<IGraphCanvasComponentProps> implements INodeContainer {\r\n public static readonly NodeWidth = 100;\r\n private readonly _minZoom = 0.1;\r\n private readonly _maxZoom = 4;\r\n\r\n private _hostCanvasRef = React.createRef<HTMLDivElement>();\r\n private _hostCanvas: HTMLDivElement;\r\n private _graphCanvasRef = React.createRef<HTMLDivElement>();\r\n private _graphCanvas: HTMLDivElement;\r\n private _selectionContainerRef = React.createRef<HTMLDivElement>();\r\n private _selectionContainer: HTMLDivElement;\r\n private _frameContainerRef = React.createRef<HTMLDivElement>();\r\n private _frameContainer: HTMLDivElement;\r\n private _svgCanvasRef = React.createRef<SVGSVGElement>();\r\n private _svgCanvas: HTMLElement;\r\n private _rootContainerRef = React.createRef<HTMLDivElement>();\r\n private _rootContainer: HTMLDivElement;\r\n private _nodes: GraphNode[] = [];\r\n private _links: NodeLink[] = [];\r\n private _mouseStartPointX: Nullable<number> = null;\r\n private _mouseStartPointY: Nullable<number> = null;\r\n private _dropPointX = 0;\r\n private _dropPointY = 0;\r\n private _selectionStartX = 0;\r\n private _selectionStartY = 0;\r\n private _candidateLinkedHasMoved = false;\r\n private _x = 0;\r\n private _y = 0;\r\n private _zoom = 1;\r\n private _selectedNodes: GraphNode[] = [];\r\n private _selectedLink: Nullable<NodeLink> = null;\r\n private _selectedPort: Nullable<NodePort> = null;\r\n private _candidateLink: Nullable<NodeLink> = null;\r\n private _candidatePort: Nullable<NodePort | FrameNodePort> = null;\r\n private _gridSize = 20;\r\n private _selectionBox: Nullable<HTMLDivElement> = null;\r\n private _selectedFrames: GraphFrame[] = [];\r\n private _frameCandidate: Nullable<HTMLDivElement> = null;\r\n private _frames: GraphFrame[] = [];\r\n private _nodeDataContentList = new Array<any>();\r\n\r\n private _altKeyIsPressed = false;\r\n private _multiKeyIsPressed = false;\r\n private _oldY = -1;\r\n\r\n public _frameIsMoving = false;\r\n public _isLoading = false;\r\n public _targetLinkCandidate: Nullable<NodeLink> = null;\r\n\r\n private _copiedNodes: GraphNode[] = [];\r\n private _copiedFrames: GraphFrame[] = [];\r\n\r\n public get gridSize() {\r\n return this._gridSize;\r\n }\r\n\r\n public set gridSize(value: number) {\r\n this._gridSize = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get stateManager() {\r\n return this.props.stateManager;\r\n }\r\n\r\n public get nodes() {\r\n return this._nodes;\r\n }\r\n\r\n public get links() {\r\n return this._links;\r\n }\r\n\r\n public get frames() {\r\n return this._frames;\r\n }\r\n\r\n public get zoom() {\r\n return this._zoom;\r\n }\r\n\r\n public set zoom(value: number) {\r\n if (this._zoom === value) {\r\n return;\r\n }\r\n\r\n this._zoom = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get x() {\r\n return this._x;\r\n }\r\n\r\n public set x(value: number) {\r\n this._x = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get y() {\r\n return this._y;\r\n }\r\n\r\n public set y(value: number) {\r\n this._y = value;\r\n\r\n this.updateTransform();\r\n }\r\n\r\n public get selectedNodes() {\r\n return this._selectedNodes;\r\n }\r\n\r\n public get selectedLink() {\r\n return this._selectedLink;\r\n }\r\n public get selectedFrames() {\r\n return this._selectedFrames;\r\n }\r\n\r\n public get selectedPort() {\r\n return this._selectedPort;\r\n }\r\n\r\n public get canvasContainer() {\r\n return this._graphCanvas;\r\n }\r\n\r\n public get hostCanvas() {\r\n return this._hostCanvas;\r\n }\r\n\r\n public get svgCanvas() {\r\n return this._svgCanvas;\r\n }\r\n\r\n public get selectionContainer() {\r\n return this._selectionContainer;\r\n }\r\n\r\n public get frameContainer() {\r\n return this._frameContainer;\r\n }\r\n\r\n // There is a selection conflict between nodes and frames if any selected node is inside any selected frame\r\n private _selectedFrameAndNodesConflict(frameSelection: GraphFrame[], nodeSelection: GraphNode[]) {\r\n for (const frame of frameSelection) {\r\n for (const node of nodeSelection) {\r\n if (frame.nodes.includes(node)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n constructor(props: IGraphCanvasComponentProps) {\r\n super(props);\r\n\r\n props.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection, forceKeepSelection, marqueeSelection = false } = options || {};\r\n if (!selection) {\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedFrames = [];\r\n this._selectedPort = null;\r\n } else {\r\n if (selection instanceof NodeLink) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = selection;\r\n this._selectedPort = null;\r\n } else if (selection instanceof NodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof FrameNodePort) {\r\n this._selectedNodes = [];\r\n this._selectedFrames = [];\r\n this._selectedLink = null;\r\n this._selectedPort = selection;\r\n } else if (selection instanceof GraphNode || selection instanceof GraphFrame) {\r\n // If in marquee selection mode, always prioritize selecting nodes. Otherwise, always prioritize selecting the type of\r\n // the selected element\r\n if (marqueeSelection) {\r\n if (selection instanceof GraphFrame && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n } else if (selection instanceof GraphNode && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n if (this._selectedFrameAndNodesConflict(this.selectedFrames, this.selectedNodes)) {\r\n const framesToRemove = new Set();\r\n for (const selectedNode of this._selectedNodes) {\r\n for (const selectedFrame of this._selectedFrames) {\r\n if (selectedFrame.nodes.includes(selectedNode)) {\r\n framesToRemove.add(selectedFrame);\r\n }\r\n }\r\n }\r\n this._selectedFrames = this._selectedFrames.filter((f) => !framesToRemove.has(f));\r\n }\r\n } else {\r\n if (selection instanceof GraphFrame) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict([selection], this._selectedNodes) && !this._selectedFrames.includes(selection)) {\r\n this._selectedFrames.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [selection];\r\n this._selectedNodes = [];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n } else if (selection instanceof GraphNode) {\r\n if (this._multiKeyIsPressed || forceKeepSelection) {\r\n if (!this._selectedFrameAndNodesConflict(this._selectedFrames, [selection]) && !this._selectedNodes.includes(selection)) {\r\n this._selectedNodes.push(selection);\r\n }\r\n } else {\r\n this._selectedFrames = [];\r\n this._selectedNodes = [selection];\r\n this._selectedLink = null;\r\n this._selectedPort = null;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n props.stateManager.onCandidatePortSelectedObservable.add((port) => {\r\n this._candidatePort = port;\r\n });\r\n\r\n props.stateManager.onGridSizeChanged.add(() => {\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n });\r\n\r\n this.props.stateManager.hostDocument!.addEventListener(\"keyup\", () => this.onKeyUp(), false);\r\n this.props.stateManager.hostDocument!.addEventListener(\r\n \"keydown\",\r\n (evt) => {\r\n this._altKeyIsPressed = evt.altKey;\r\n this._multiKeyIsPressed = evt.ctrlKey || evt.metaKey;\r\n },\r\n false\r\n );\r\n this.props.stateManager.hostDocument!.defaultView!.addEventListener(\r\n \"blur\",\r\n () => {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n },\r\n false\r\n );\r\n\r\n // Store additional data to serialization object\r\n this.props.stateManager.storeEditorData = (editorData, graphFrame) => {\r\n editorData.frames = [];\r\n if (graphFrame) {\r\n editorData.frames.push(graphFrame!.serialize(false));\r\n } else {\r\n editorData.x = this.x;\r\n editorData.y = this.y;\r\n editorData.zoom = this.zoom;\r\n for (const frame of this._frames) {\r\n editorData.frames.push(frame.serialize(true));\r\n }\r\n }\r\n };\r\n }\r\n\r\n populateConnectedEntriesBeforeRemoval(item: GraphNode, items: GraphNode[], inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[]) {\r\n inputs.push(\r\n ...item.content.inputs.filter((i) => i.isConnected && items.every((selected) => selected.content.data !== i.connectedPort?.ownerData)).map((i) => i.connectedPort)\r\n );\r\n\r\n outputs.push(\r\n ...item.content.outputs\r\n .filter((i) => i.isConnected)\r\n .map((i) => i.endpoints)\r\n .flat()\r\n .filter((i) => i && items.every((selected) => selected.content.data !== i.ownerData))\r\n );\r\n }\r\n\r\n automaticRewire(inputs: Nullable<IPortData>[], outputs: Nullable<IPortData>[], firstOnly = false) {\r\n let oneConnectionFound = false;\r\n if (outputs.length && inputs.length) {\r\n inputs.forEach((input) => {\r\n if (oneConnectionFound) {\r\n return;\r\n }\r\n if (!input) {\r\n return;\r\n }\r\n const output = outputs[0];\r\n if (output && input.canConnectTo(output)) {\r\n const nodeInput = this.findNodeFromData(input.ownerData);\r\n const nodeOutput = this.findNodeFromData(output.ownerData);\r\n this.connectNodes(nodeInput, input, nodeOutput, output);\r\n outputs.shift();\r\n if (firstOnly) {\r\n oneConnectionFound = true;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n smartAddOverLink(node: GraphNode, link: NodeLink) {\r\n // Connect the ports\r\n const inputs: Nullable<IPortData>[] = [];\r\n const outputs: Nullable<IPortData>[] = [];\r\n const availableNodeInputs: Nullable<IPortData>[] = [];\r\n const availableNodeOutputs: Nullable<IPortData>[] = [];\r\n const leftNode = link.nodeA;\r\n const rightNode = link.nodeB!;\r\n\r\n // Delete previous\r\n link.dispose();\r\n\r\n // Get the ports\r\n availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));\r\n\r\n availableNodeOutputs.push(...node.content.outputs);\r\n\r\n inputs.push(...leftNode.content.outputs);\r\n\r\n outputs.push(...rightNode.content.inputs.filter((i) => !i.isConnected));\r\n\r\n // Reconnect\r\n this.automaticRewire(inputs, availableNodeInputs, true);\r\n this.automaticRewire(availableNodeOutputs, outputs, true);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n }\r\n\r\n smartAddOverNode(node: GraphNode, source: GraphNode) {\r\n // Connect the ports\r\n const inputs: Nullable<IPortData>[] = [];\r\n const availableNodeInputs: Nullable<IPortData>[] = [];\r\n\r\n // Get the ports\r\n availableNodeInputs.push(...node.content.inputs.filter((i) => !i.isConnected));\r\n\r\n inputs.push(...source.content.outputs);\r\n\r\n // Reconnect\r\n this.automaticRewire(inputs, availableNodeInputs, true);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n }\r\n\r\n deleteSelection(onRemove: (nodeData: INodeData) => void, autoReconnect = false) {\r\n // Delete\r\n const selectedItems = this.selectedNodes;\r\n const inputs: Nullable<IPortData>[] = [];\r\n const outputs: Nullable<IPortData>[] = [];\r\n let needRebuild = false;\r\n\r\n if (selectedItems.length > 0) {\r\n needRebuild = true;\r\n for (const selectedItem of selectedItems) {\r\n if (autoReconnect) {\r\n this.populateConnectedEntriesBeforeRemoval(selectedItem, selectedItems, inputs, outputs);\r\n }\r\n\r\n selectedItem.dispose();\r\n\r\n onRemove(selectedItem.content);\r\n this.removeDataFromCache(selectedItem.content.data);\r\n }\r\n }\r\n\r\n if (this.selectedLink) {\r\n needRebuild = true;\r\n this.selectedLink.dispose();\r\n }\r\n\r\n if (this.selectedFrames.length) {\r\n needRebuild = true;\r\n for (const frame of this.selectedFrames) {\r\n if (frame.isCollapsed) {\r\n while (frame.nodes.length > 0) {\r\n onRemove(frame.nodes[0].content);\r\n this.removeDataFromCache(frame.nodes[0].content.data);\r\n frame.nodes[0].dispose();\r\n }\r\n frame.isCollapsed = false;\r\n } else {\r\n frame.nodes.forEach((node) => {\r\n node.enclosingFrameId = -1;\r\n });\r\n }\r\n frame.dispose();\r\n }\r\n }\r\n\r\n if (!needRebuild) {\r\n return;\r\n }\r\n\r\n // Reconnect if required\r\n this.automaticRewire(inputs, outputs);\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(false);\r\n }\r\n\r\n handleKeyDown(\r\n evt: KeyboardEvent,\r\n onRemove: (nodeData: INodeData) => void,\r\n mouseLocationX: number,\r\n mouseLocationY: number,\r\n dataGenerator: (nodeData: INodeData) => any,\r\n rootElement: HTMLDivElement\r\n ) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n if (evt.code === \"Space\" && evt.target === this.props.stateManager.hostDocument!.body) {\r\n this.stateManager.modalIsDisplayed = true;\r\n this.props.stateManager.onSearchBoxRequiredObservable.notifyObservers({ x: mouseLocationX, y: mouseLocationY });\r\n return;\r\n }\r\n if ((evt.keyCode === 46 || evt.keyCode === 8) && !this.props.stateManager.lockObject.lock) {\r\n this.deleteSelection(onRemove, evt.altKey);\r\n return;\r\n }\r\n\r\n if ((!evt.ctrlKey && !evt.metaKey) || this.props.stateManager.lockObject.lock) {\r\n return;\r\n }\r\n\r\n if (evt.key === \"c\" || evt.key === \"C\") {\r\n // Copy\r\n this._copiedNodes = [];\r\n this._copiedFrames = [];\r\n\r\n if (this.selectedFrames.length) {\r\n for (const frame of this.selectedFrames) {\r\n frame.serialize(true);\r\n this._copiedFrames.push(frame);\r\n }\r\n return;\r\n }\r\n\r\n const selectedItems = this.selectedNodes;\r\n if (!selectedItems.length) {\r\n return;\r\n }\r\n\r\n const selectedItem = selectedItems[0] as GraphNode;\r\n\r\n if (!selectedItem.content.data) {\r\n return;\r\n }\r\n\r\n this._copiedNodes = selectedItems.slice(0);\r\n } else if (evt.key === \"v\" || evt.key === \"V\") {\r\n // Paste\r\n const zoomLevel = this.zoom;\r\n let currentY = (mouseLocationY - rootElement.offsetTop - this.y - 20) / zoomLevel;\r\n\r\n if (this._copiedFrames.length) {\r\n for (const frame of this._copiedFrames) {\r\n // New frame\r\n const newFrame = new GraphFrame(null, this, true);\r\n this.frames.push(newFrame);\r\n\r\n newFrame.width = frame.width;\r\n newFrame.height = frame.height;\r\n newFrame.width / 2;\r\n newFrame.name = frame.name;\r\n newFrame.color = frame.color;\r\n\r\n let currentX = (mouseLocationX - rootElement.offsetLeft - this.x) / zoomLevel;\r\n newFrame.x = currentX - newFrame.width / 2;\r\n newFrame.y = currentY;\r\n\r\n // Paste nodes\r\n if (frame.nodes.length) {\r\n currentX = newFrame.x + frame.nodes[0].x - frame.x;\r\n currentY = newFrame.y + frame.nodes[0].y - frame.y;\r\n\r\n this._frameIsMoving = true;\r\n const newNodes = this.pasteSelection(frame.nodes, currentX, currentY, dataGenerator);\r\n if (newNodes) {\r\n for (const node of newNodes) {\r\n newFrame.syncNode(node);\r\n }\r\n }\r\n this._frameIsMoving = false;\r\n }\r\n\r\n newFrame.adjustPorts();\r\n\r\n if (frame.isCollapsed) {\r\n newFrame.isCollapsed = true;\r\n }\r\n\r\n // Select\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame, forceKeepSelection: true });\r\n return;\r\n }\r\n }\r\n\r\n if (!this._copiedNodes.length) {\r\n return;\r\n }\r\n\r\n const currentX = (mouseLocationX - rootElement.offsetLeft - this.x - GraphCanvasComponent.NodeWidth) / zoomLevel;\r\n this.pasteSelection(this._copiedNodes, currentX, currentY, dataGenerator, true);\r\n }\r\n }\r\n\r\n pasteSelection(copiedNodes: GraphNode[], currentX: number, currentY: number, dataGenerator: (nodeData: INodeData) => any, selectNew = false) {\r\n let originalNode: Nullable<GraphNode> = null;\r\n\r\n const newNodes: GraphNode[] = [];\r\n\r\n // Copy to prevent recursive side effects while creating nodes.\r\n copiedNodes = copiedNodes.slice();\r\n\r\n // Cancel selection\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n\r\n // Create new nodes\r\n for (const node of copiedNodes) {\r\n const data = node.content.data;\r\n\r\n if (!data) {\r\n continue;\r\n }\r\n\r\n const newNode = dataGenerator(node.content);\r\n\r\n let x = 0;\r\n let y = 0;\r\n if (originalNode) {\r\n x = currentX + node.x - originalNode.x;\r\n y = currentY + node.y - originalNode.y;\r\n } else {\r\n originalNode = node;\r\n x = currentX;\r\n y = currentY;\r\n }\r\n\r\n newNode.x = x;\r\n newNode.y = y;\r\n newNode.cleanAccumulation();\r\n\r\n newNodes.push(newNode);\r\n\r\n if (selectNew) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode, forceKeepSelection: true });\r\n }\r\n }\r\n\r\n // Relink\r\n const done = new Array<boolean>(newNodes.length);\r\n for (let index = 0; index < newNodes.length; index++) {\r\n this.reconnectNewNodes(index, newNodes, copiedNodes, done);\r\n }\r\n\r\n return newNodes;\r\n }\r\n\r\n reconnectNewNodes(nodeIndex: number, newNodes: GraphNode[], sourceNodes: GraphNode[], done: boolean[]) {\r\n if (done[nodeIndex]) {\r\n return;\r\n }\r\n\r\n const currentNode = newNodes[nodeIndex];\r\n const sourceNode = sourceNodes[nodeIndex];\r\n\r\n for (let inputIndex = 0; inputIndex < sourceNode.content.inputs.length; inputIndex++) {\r\n const sourceInput = sourceNode.content.inputs[inputIndex];\r\n const currentInput = currentNode.content.inputs[inputIndex];\r\n if (!sourceInput.isConnected) {\r\n continue;\r\n }\r\n const sourceContent = this.findNodeFromData(sourceInput.connectedPort!.ownerData).content;\r\n const activeNodes = sourceNodes.filter((s) => s.content === sourceContent);\r\n\r\n if (activeNodes.length > 0) {\r\n const activeNode = activeNodes[0];\r\n const indexInList = sourceNodes.indexOf(activeNode);\r\n\r\n // First make sure to connect the other one\r\n this.reconnectNewNodes(indexInList, newNodes, sourceNodes, done);\r\n\r\n // Then reconnect\r\n const outputIndex = sourceContent.outputs.indexOf(sourceInput.connectedPort!);\r\n const newOutput = newNodes[indexInList].content.data.outputs[outputIndex];\r\n\r\n newOutput.connectTo(currentInput.data);\r\n } else {\r\n // Connect with outside nodes\r\n sourceInput.connectedPort!.connectTo(currentInput);\r\n }\r\n\r\n this.connectPorts(currentInput.connectedPort!, currentInput);\r\n }\r\n\r\n currentNode.refresh();\r\n\r\n done[nodeIndex] = true;\r\n }\r\n\r\n public getCachedData(): any[] {\r\n return this._nodeDataContentList;\r\n }\r\n\r\n public removeDataFromCache(data: any) {\r\n const dataIndex = this._nodeDataContentList.indexOf(data);\r\n\r\n if (dataIndex > -1) {\r\n this._nodeDataContentList.splice(dataIndex, 1);\r\n }\r\n }\r\n\r\n public createNodeFromObject(nodeData: INodeData, onNodeCreated: (data: any) => void, recursion = true) {\r\n if (this._nodeDataContentList.indexOf(nodeData.data) !== -1) {\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n return this.nodes.filter((n) => n.content.data === nodeData.data)[0];\r\n }\r\n\r\n onNodeCreated(nodeData.data);\r\n\r\n // Connections\r\n if (nodeData.inputs.length) {\r\n for (const input of nodeData.inputs) {\r\n if (input.connectedPort && recursion) {\r\n this.createNodeFromObject(TypeLedger.NodeDataBuilder(input.connectedPort.ownerData, this), onNodeCreated);\r\n }\r\n }\r\n }\r\n\r\n // Graph\r\n const node = this.appendNode(nodeData);\r\n\r\n node.addClassToVisual(nodeData.getClassName());\r\n\r\n // Links\r\n if (nodeData.inputs.length && recursion) {\r\n for (const input of nodeData.inputs) {\r\n if (input.isConnected) {\r\n this.connectPorts(input.connectedPort!, input);\r\n }\r\n }\r\n }\r\n\r\n return node;\r\n }\r\n\r\n public getGridPosition(position: number, useCeil = false) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n if (useCeil) {\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n return gridSize * Math.floor(position / gridSize);\r\n }\r\n\r\n public getGridPositionCeil(position: number) {\r\n const gridSize = this.gridSize;\r\n if (gridSize === 0) {\r\n return position;\r\n }\r\n return gridSize * Math.ceil(position / gridSize);\r\n }\r\n\r\n updateTransform() {\r\n this._rootContainer.style.transform = `translate(${this._x}px, ${this._y}px) scale(${this._zoom})`;\r\n\r\n if (DataStorage.ReadBoolean(\"ShowGrid\", true)) {\r\n this._hostCanvas.style.backgroundSize = `${this._gridSize * this._zoom}px ${this._gridSize * this._zoom}px`;\r\n this._hostCanvas.style.backgroundPosition = `${this._x}px ${this._y}px`;\r\n } else {\r\n this._hostCanvas.style.backgroundSize = `0`;\r\n }\r\n }\r\n\r\n onKeyUp() {\r\n this._altKeyIsPressed = false;\r\n this._multiKeyIsPressed = false;\r\n this._oldY = -1;\r\n }\r\n\r\n findNodeFromData(data: any) {\r\n return this.nodes.filter((n) => n.content.data === data)[0];\r\n }\r\n\r\n reset() {\r\n this._nodeDataContentList = [];\r\n\r\n for (const node of this._nodes) {\r\n node.dispose();\r\n }\r\n\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n this._nodes = [];\r\n this._frames = [];\r\n this._links = [];\r\n this._graphCanvas.innerHTML = \"\";\r\n this._svgCanvas.innerHTML = \"\";\r\n }\r\n\r\n connectPorts(pointA: IPortData, pointB: IPortData) {\r\n if (!pointA || !pointB) {\r\n return;\r\n }\r\n\r\n const ownerDataA = pointA.ownerData;\r\n const ownerDataB = pointB.ownerData;\r\n const nodeA = this.findNodeFromData(ownerDataA);\r\n const nodeB = this.findNodeFromData(ownerDataB);\r\n\r\n if (!nodeA || !nodeB) {\r\n return;\r\n }\r\n\r\n const portA = nodeA.getPortForPortData(pointA);\r\n const portB = nodeB.getPortForPortData(pointB);\r\n\r\n if (!portA || !portB) {\r\n return;\r\n }\r\n\r\n for (const currentLink of this._links) {\r\n if (currentLink.portA === portA && currentLink.portB === portB) {\r\n return;\r\n }\r\n if (currentLink.portA === portB && currentLink.portB === portA) {\r\n return;\r\n }\r\n }\r\n\r\n const link = new NodeLink(this, portA, nodeA, portB, nodeB);\r\n this._links.push(link);\r\n\r\n nodeA.links.push(link);\r\n nodeB.links.push(link);\r\n }\r\n\r\n removeLink(link: NodeLink) {\r\n const index = this._links.indexOf(link);\r\n\r\n if (index > -1) {\r\n this._links.splice(index, 1);\r\n }\r\n\r\n link.dispose();\r\n }\r\n\r\n appendNode(nodeData: INodeData) {\r\n const newNode = new GraphNode(nodeData, this.props.stateManager);\r\n\r\n newNode.appendVisual(this._graphCanvas, this);\r\n\r\n this._nodes.push(newNode);\r\n this._nodeDataContentList.push(nodeData.data);\r\n\r\n return newNode;\r\n }\r\n\r\n distributeGraph() {\r\n this.x = 0;\r\n this.y = 0;\r\n this.zoom = 1;\r\n\r\n const graph = new dagre.graphlib.Graph();\r\n graph.setGraph({});\r\n graph.setDefaultEdgeLabel(() => ({}));\r\n graph.graph().rankdir = \"LR\";\r\n\r\n // Build dagre graph\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n graph.setNode(node.id.toString(), {\r\n id: node.id,\r\n type: \"node\",\r\n width: node.width,\r\n height: node.height,\r\n });\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n graph.setNode(frame.id.toString(), {\r\n id: frame.id,\r\n type: \"frame\",\r\n width: frame.element.clientWidth,\r\n height: frame.element.clientHeight,\r\n });\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.content.outputs.forEach((output) => {\r\n if (!output.hasEndpoints) {\r\n return;\r\n }\r\n\r\n output.endpoints!.forEach((endpoint) => {\r\n const sourceFrames = this._frames.filter((f) => f.nodes.indexOf(node) !== -1);\r\n const targetFrames = this._frames.filter((f) => f.nodes.some((n) => n.content.data === endpoint.ownerData));\r\n\r\n const sourceId = sourceFrames.length > 0 ? sourceFrames[0].id : node.id;\r\n const targetId = targetFrames.length > 0 ? targetFrames[0].id : endpoint.ownerData.uniqueId;\r\n\r\n graph.setEdge(sourceId.toString(), targetId.toString());\r\n });\r\n });\r\n });\r\n\r\n // Distribute\r\n dagre.layout(graph);\r\n\r\n // Update graph\r\n const dagreNodes = graph.nodes().map((node) => graph.node(node));\r\n dagreNodes.forEach((dagreNode: any) => {\r\n if (!dagreNode) {\r\n return;\r\n }\r\n if (dagreNode.type === \"node\") {\r\n for (const node of this._nodes) {\r\n if (node.id === dagreNode.id) {\r\n node.x = dagreNode.x - dagreNode.width / 2;\r\n node.y = dagreNode.y - dagreNode.height / 2;\r\n node.cleanAccumulation();\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n for (const frame of this._frames) {\r\n if (frame.id === dagreNode.id) {\r\n this._frameIsMoving = true;\r\n frame.move(dagreNode.x - dagreNode.width / 2, dagreNode.y - dagreNode.height / 2, false);\r\n frame.cleanAccumulation();\r\n this._frameIsMoving = false;\r\n return;\r\n }\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n this._hostCanvas = this._hostCanvasRef.current!;\r\n this._rootContainer = this._rootContainerRef.current!;\r\n this._graphCanvas = this._graphCanvasRef.current!;\r\n this._svgCanvas = this._svgCanvasRef.current! as unknown as HTMLElement;\r\n this._selectionContainer = this._selectionContainerRef.current!;\r\n this._frameContainer = this._frameContainerRef.current!;\r\n\r\n this.gridSize = DataStorage.ReadNumber(\"GridSize\", 20);\r\n this.updateTransform();\r\n }\r\n\r\n onMove(evt: React.PointerEvent) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n // Selection box\r\n if (this._selectionBox) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.left = `${localX / this.zoom}px`;\r\n this._selectionBox.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._selectionBox.style.top = `${localY / this.zoom}px`;\r\n this._selectionBox.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n this.props.stateManager.onSelectionBoxMoved.notifyObservers(this._selectionBox.getBoundingClientRect());\r\n\r\n return;\r\n }\r\n\r\n // Candidate frame box\r\n if (this._frameCandidate) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n\r\n const localX = evt.pageX - rootRect.left;\r\n const localY = evt.pageY - rootRect.top;\r\n\r\n if (localX > this._selectionStartX) {\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(localX - this._selectionStartX) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.left = `${localX / this.zoom}px`;\r\n this._frameCandidate.style.width = `${(this._selectionStartX - localX) / this.zoom}px`;\r\n }\r\n\r\n if (localY > this._selectionStartY) {\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(localY - this._selectionStartY) / this.zoom}px`;\r\n } else {\r\n this._frameCandidate.style.top = `${localY / this.zoom}px`;\r\n this._frameCandidate.style.height = `${(this._selectionStartY - localY) / this.zoom}px`;\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Candidate link\r\n if (this._candidateLink) {\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._candidatePort = null;\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(new Vector2(evt.pageX, evt.pageY));\r\n this._dropPointX = (evt.pageX - rootRect.left) / this.zoom;\r\n this._dropPointY = (evt.pageY - rootRect.top) / this.zoom;\r\n\r\n this._candidateLink.update(this._dropPointX, this._dropPointY, true);\r\n this._candidateLinkedHasMoved = true;\r\n\r\n return;\r\n }\r\n\r\n // Zoom with mouse + alt\r\n if (this._altKeyIsPressed && evt.buttons === 1) {\r\n if (this._oldY < 0) {\r\n this._oldY = evt.pageY;\r\n }\r\n\r\n const zoomDelta = (evt.pageY - this._oldY) / 10;\r\n if (Math.abs(zoomDelta) > 5) {\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.max(Math.min(this._maxZoom, this.zoom + zoomDelta / 100), this._minZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n\r\n this._oldY = evt.pageY;\r\n }\r\n return;\r\n }\r\n\r\n // Move canvas\r\n this._rootContainer.style.cursor = \"move\";\r\n\r\n if (this._mouseStartPointX === null || this._mouseStartPointY === null) {\r\n return;\r\n }\r\n this.x += evt.clientX - this._mouseStartPointX;\r\n this.y += evt.clientY - this._mouseStartPointY;\r\n\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onDown(evt: React.PointerEvent<HTMLElement>) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n this._rootContainer.setPointerCapture(evt.pointerId);\r\n\r\n // Port dragging\r\n if (evt.nativeEvent.srcElement && (evt.nativeEvent.srcElement as HTMLElement).nodeName === \"IMG\") {\r\n if (!this._candidateLink) {\r\n const portElement = ((evt.nativeEvent.srcElement as HTMLElement).parentElement as any).port as NodePort;\r\n if (this._altKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n // Delete connection\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n\r\n // Pick the first one as target port\r\n const targetNode = links[0].nodeA === node ? links[0].nodeB : links[0].nodeA;\r\n const targetPort = links[0].nodeA === node ? links[0].portB : links[0].portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else if (this._multiKeyIsPressed && (portElement.portData.isConnected || portElement.portData.hasEndpoints)) {\r\n const node = portElement.node;\r\n const links = node.getLinksForPortData(portElement.portData);\r\n\r\n // Pick the first one as target port\r\n const linkToConsider = this._selectedLink || links[0];\r\n const targetNode = linkToConsider.nodeA === node ? linkToConsider.nodeB : linkToConsider.nodeA;\r\n const targetPort = linkToConsider.nodeA === node ? linkToConsider.portB : linkToConsider.portA;\r\n\r\n // Start a new one\r\n this._candidateLink = new NodeLink(this, targetPort!, targetNode!);\r\n } else {\r\n this._candidateLink = new NodeLink(this, portElement, portElement.node);\r\n }\r\n this._candidateLinkedHasMoved = false;\r\n }\r\n return;\r\n }\r\n\r\n // Selection?\r\n if (evt.currentTarget === this._hostCanvas && this._multiKeyIsPressed) {\r\n this._selectionBox = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._selectionBox.classList.add(styles[\"selection-box\"]);\r\n this._selectionContainer.appendChild(this._selectionBox);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._selectionBox.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._selectionBox.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._selectionBox.style.width = \"0px\";\r\n this._selectionBox.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n // Frame?\r\n if (evt.currentTarget === this._hostCanvas && evt.shiftKey) {\r\n this._frameCandidate = this.props.stateManager.hostDocument.createElement(\"div\");\r\n this._frameCandidate.classList.add(commonStyles[\"frame-box\"]);\r\n this._frameContainer.appendChild(this._frameCandidate);\r\n\r\n const rootRect = this.canvasContainer.getBoundingClientRect();\r\n this._selectionStartX = evt.pageX - rootRect.left;\r\n this._selectionStartY = evt.pageY - rootRect.top;\r\n this._frameCandidate.style.left = `${this._selectionStartX / this.zoom}px`;\r\n this._frameCandidate.style.top = `${this._selectionStartY / this.zoom}px`;\r\n this._frameCandidate.style.width = \"0px\";\r\n this._frameCandidate.style.height = \"0px\";\r\n return;\r\n }\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this._mouseStartPointX = evt.clientX;\r\n this._mouseStartPointY = evt.clientY;\r\n }\r\n\r\n onUp(evt: React.PointerEvent) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n this._mouseStartPointX = null;\r\n this._mouseStartPointY = null;\r\n this._rootContainer.releasePointerCapture(evt.pointerId);\r\n this._oldY = -1;\r\n if (this._candidateLink) {\r\n if (this._candidateLinkedHasMoved) {\r\n this.processCandidatePort();\r\n this.props.stateManager.onCandidateLinkMoved.notifyObservers(null);\r\n } else {\r\n // is a click event on NodePort\r\n if (this._candidateLink.portA instanceof FrameNodePort) {\r\n //only on Frame Node Ports\r\n const port = this._candidateLink.portA;\r\n const frame = this.frames.find((frame: GraphFrame) => frame.id === port.parentFrameId);\r\n if (frame) {\r\n const data: FramePortData = {\r\n frame,\r\n port,\r\n };\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: data });\r\n }\r\n } else if (this._candidateLink.portA instanceof NodePort) {\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: this._candidateLink.portA });\r\n }\r\n }\r\n this._candidateLink.dispose();\r\n this._candidateLink = null;\r\n this._candidatePort = null;\r\n }\r\n\r\n if (this._selectionBox) {\r\n this._selectionBox.parentElement!.removeChild(this._selectionBox);\r\n this._selectionBox = null;\r\n }\r\n\r\n if (this._frameCandidate) {\r\n const newFrame = new GraphFrame(this._frameCandidate, this);\r\n this._frames.push(newFrame);\r\n\r\n this._frameCandidate.parentElement!.removeChild(this._frameCandidate);\r\n this._frameCandidate = null;\r\n\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newFrame });\r\n }\r\n }\r\n\r\n onWheel(evt: React.WheelEvent) {\r\n if (this.stateManager.modalIsDisplayed) {\r\n return;\r\n }\r\n\r\n const delta = evt.deltaY < 0 ? 0.1 : -0.1;\r\n\r\n const oldZoom = this.zoom;\r\n this.zoom = Math.min(Math.max(this._minZoom, this.zoom + delta * this.zoom), this._maxZoom);\r\n\r\n const boundingRect = evt.currentTarget.getBoundingClientRect();\r\n const clientWidth = boundingRect.width;\r\n const clientHeight = boundingRect.height;\r\n const widthDiff = clientWidth * this.zoom - clientWidth * oldZoom;\r\n const heightDiff = clientHeight * this.zoom - clientHeight * oldZoom;\r\n const clientX = evt.clientX - boundingRect.left;\r\n const clientY = evt.clientY - boundingRect.top;\r\n\r\n const xFactor = (clientX - this.x) / oldZoom / clientWidth;\r\n const yFactor = (clientY - this.y) / oldZoom / clientHeight;\r\n\r\n this.x = this.x - widthDiff * xFactor;\r\n this.y = this.y - heightDiff * yFactor;\r\n }\r\n\r\n zoomToFit() {\r\n // Get negative offset\r\n let minX = 0;\r\n let minY = 0;\r\n this._nodes.forEach((node) => {\r\n if (this._frames.some((f) => f.nodes.indexOf(node) !== -1)) {\r\n return;\r\n }\r\n\r\n if (node.x < minX) {\r\n minX = node.x;\r\n }\r\n if (node.y < minY) {\r\n minY = node.y;\r\n }\r\n });\r\n\r\n this._frames.forEach((frame) => {\r\n if (frame.x < minX) {\r\n minX = frame.x;\r\n }\r\n if (frame.y < minY) {\r\n minY = frame.y;\r\n }\r\n });\r\n\r\n // Restore to 0\r\n this._frames.forEach((frame) => {\r\n frame.x += -minX;\r\n frame.y += -minY;\r\n frame.cleanAccumulation();\r\n });\r\n\r\n this._nodes.forEach((node) => {\r\n node.x += -minX;\r\n node.y += -minY;\r\n node.cleanAccumulation();\r\n });\r\n\r\n // Get correct zoom\r\n const xFactor = this._rootContainer.clientWidth / this._rootContainer.scrollWidth;\r\n const yFactor = this._rootContainer.clientHeight / this._rootContainer.scrollHeight;\r\n const zoomFactor = xFactor < yFactor ? xFactor : yFactor;\r\n\r\n this.zoom = zoomFactor;\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n processCandidatePort() {\r\n let pointB = this._candidateLink!.portA.portData;\r\n let nodeB = this._candidateLink!.portA.node;\r\n let pointA: IPortData;\r\n let nodeA: GraphNode;\r\n\r\n if (this._candidatePort) {\r\n pointA = this._candidatePort.portData;\r\n nodeA = this._candidatePort.node;\r\n } else {\r\n if (pointB.direction === PortDataDirection.Output) {\r\n return;\r\n }\r\n\r\n // No destination so let's spin a new input node\r\n const newDefaultInput = this.props.stateManager.createDefaultInputData(this.props.stateManager.data, this._candidateLink!.portA.portData, this);\r\n if (!newDefaultInput) {\r\n return;\r\n }\r\n const pointName = newDefaultInput.name;\r\n const emittedNodeData = newDefaultInput.data;\r\n\r\n pointA = emittedNodeData.getPortByName(pointName)!;\r\n if (!emittedNodeData.isInput) {\r\n nodeA = this.props.onEmitNewNode(emittedNodeData);\r\n } else {\r\n nodeA = this.appendNode(emittedNodeData as any);\r\n }\r\n nodeA.x = this._dropPointX - 200;\r\n nodeA.y = this._dropPointY - 50;\r\n\r\n const x = nodeA.x - 250;\r\n let y = nodeA.y;\r\n\r\n emittedNodeData.inputs.forEach((portData: IPortData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x;\r\n connectedNode.y = y;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (pointA.direction === PortDataDirection.Input) {\r\n const temp = pointB;\r\n pointB = pointA;\r\n pointA = temp;\r\n\r\n const tempNode = nodeA;\r\n nodeA = nodeB;\r\n nodeB = tempNode;\r\n }\r\n\r\n if (pointB.connectedPort === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB === pointA) {\r\n return;\r\n }\r\n\r\n if (pointB.direction === pointA.direction) {\r\n return;\r\n }\r\n\r\n if (pointB.ownerData === pointA.ownerData) {\r\n return;\r\n }\r\n\r\n // Check compatibility\r\n let compatibilityState = pointA.checkCompatibilityState(pointB);\r\n if ((pointA.needDualDirectionValidation || pointB.needDualDirectionValidation) && !compatibilityState) {\r\n compatibilityState = pointB.checkCompatibilityState(pointA);\r\n }\r\n\r\n const message = pointA.getCompatibilityIssueMessage(compatibilityState, nodeB, pointB);\r\n\r\n if (message) {\r\n this.props.stateManager.onErrorMessageDialogRequiredObservable.notifyObservers(message);\r\n return;\r\n }\r\n\r\n let linksToNotifyForDispose: Nullable<NodeLink[]> = null;\r\n\r\n if (pointB.isConnected) {\r\n const links = nodeB.getLinksForPortData(pointB);\r\n\r\n linksToNotifyForDispose = links.slice();\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n }\r\n\r\n if (pointB.ownerData.inputsAreExclusive) {\r\n // Disconnect all inputs if node has exclusive inputs\r\n pointB.ownerData.inputs.forEach((i: any) => {\r\n const links = nodeB.getLinksForPortData(i);\r\n\r\n if (!linksToNotifyForDispose) {\r\n linksToNotifyForDispose = links.slice();\r\n } else {\r\n linksToNotifyForDispose.push(...links.slice());\r\n }\r\n\r\n links.forEach((link) => {\r\n link.dispose(false);\r\n });\r\n });\r\n }\r\n\r\n this.connectNodes(nodeA, pointA, nodeB, pointB);\r\n\r\n linksToNotifyForDispose?.forEach((link) => {\r\n link.onDisposedObservable.notifyObservers(link);\r\n link.onDisposedObservable.clear();\r\n });\r\n\r\n this.props.stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n }\r\n\r\n connectNodes(nodeA: GraphNode, pointA: IPortData, nodeB: GraphNode, pointB: IPortData) {\r\n pointA.connectTo(pointB);\r\n this.connectPorts(pointA, pointB);\r\n\r\n // Need to potentially propagate the type of pointA to other ports of nodes connected to owner of pointB\r\n // We also need to check if we want to display the promotion warning\r\n\r\n const visitedNodes = new Set<GraphNode>([nodeA]);\r\n const visitedLinks = new Set<NodeLink>([nodeB.links[nodeB.links.length - 1]]);\r\n\r\n RefreshNode(nodeB, visitedNodes, visitedLinks);\r\n }\r\n\r\n drop(newNode: GraphNode, targetX: number, targetY: number, offsetX: number, offsetY: number) {\r\n let x = targetX - this.x - offsetX * this.zoom;\r\n let y = targetY - this.y - offsetY * this.zoom;\r\n\r\n newNode.x = x / this.zoom;\r\n newNode.y = y / this.zoom;\r\n newNode.cleanAccumulation();\r\n\r\n this.props.stateManager.onNewNodeCreatedObservable.notifyObservers(newNode);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers(null);\r\n this.props.stateManager.onSelectionChangedObservable.notifyObservers({ selection: newNode });\r\n\r\n x -= GraphCanvasComponent.NodeWidth + 150;\r\n\r\n newNode.content.inputs.forEach((portData) => {\r\n if (portData.connectedPort) {\r\n const existingNodes = this.nodes.filter((n) => {\r\n return n.content.data === portData.connectedPort?.ownerData;\r\n });\r\n const connectedNode = existingNodes[0];\r\n\r\n if (connectedNode.x === 0 && connectedNode.y === 0) {\r\n connectedNode.x = x / this.zoom;\r\n connectedNode.y = y / this.zoom;\r\n connectedNode.cleanAccumulation();\r\n y += 80;\r\n }\r\n }\r\n });\r\n }\r\n\r\n processEditorData(editorData: IEditorData) {\r\n const frames = this._frames.splice(0);\r\n for (const frame of frames) {\r\n frame.dispose();\r\n }\r\n\r\n this._frames = [];\r\n this.x = editorData.x || 0;\r\n this.y = editorData.y || 0;\r\n this.zoom = editorData.zoom || 1;\r\n\r\n // Frames\r\n if (editorData.frames) {\r\n for (const frameData of editorData.frames) {\r\n const frame = GraphFrame.Parse(frameData, this, editorData.map);\r\n this._frames.push(frame);\r\n }\r\n }\r\n }\r\n\r\n reOrganize(editorData: Nullable<IEditorData> = null, isImportingAFrame = false) {\r\n if (!editorData || !editorData.locations) {\r\n this.distributeGraph();\r\n } else {\r\n // Locations\r\n for (const location of editorData.locations) {\r\n for (const node of this.nodes) {\r\n const data = node.content.data;\r\n if (data && data.uniqueId === location.blockId) {\r\n node.x = location.x;\r\n node.y = location.y;\r\n node.cleanAccumulation();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!isImportingAFrame) {\r\n this.processEditorData(editorData);\r\n }\r\n }\r\n\r\n this._isLoading = false;\r\n for (const node of this.nodes) {\r\n node._refreshLinks();\r\n }\r\n }\r\n\r\n addFrame(frameData: IFrameData) {\r\n const frame = GraphFrame.Parse(frameData, this, this.props.stateManager.getEditorDataMap());\r\n this._frames.push(frame);\r\n this.stateManager.onSelectionChangedObservable.notifyObservers({ selection: frame });\r\n }\r\n\r\n render() {\r\n return (\r\n <div\r\n ref={this._hostCanvasRef}\r\n id=\"graph-canvas\"\r\n className={styles[\"graph-canvas\"]}\r\n onWheel={(evt) => this.onWheel(evt)}\r\n onPointerMove={(evt) => this.onMove(evt)}\r\n onPointerDown={(evt) => this.onDown(evt)}\r\n onPointerUp={(evt) => this.onUp(evt)}\r\n >\r\n <div id=\"graph-container\" className={styles[\"graph-container\"]} ref={this._rootContainerRef}>\r\n <div id=\"graph-canvas-container\" className={styles[\"graph-canvas-container\"]} ref={this._graphCanvasRef}></div>\r\n <div id=\"frame-container\" className={styles[\"frame-container\"]} ref={this._frameContainerRef}></div>\r\n <svg id=\"graph-svg-container\" className={styles[\"graph-svg-container\"]} ref={this._svgCanvasRef}></svg>\r\n <div id=\"selection-container\" className={styles[\"selection-container\"]} ref={this._selectionContainerRef}></div>\r\n </div>\r\n <SearchBoxComponent stateManager={this.stateManager} />\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
@@ -25,6 +25,9 @@
|
|
25
25
|
color: white;
|
26
26
|
transform: scaleX(1.01) translateY(-0.5px);
|
27
27
|
transform-origin: center;
|
28
|
+
display: grid;
|
29
|
+
grid-template-columns: 1fr auto;
|
30
|
+
grid-template-rows: 100%;
|
28
31
|
}
|
29
32
|
|
30
33
|
.headerIcon {
|
@@ -34,12 +37,11 @@
|
|
34
37
|
z-index: 10;
|
35
38
|
justify-self: end;
|
36
39
|
align-self: center;
|
37
|
-
margin-right: 5px;
|
38
40
|
user-select: none;
|
39
41
|
pointer-events: none;
|
40
42
|
width: 20px;
|
41
43
|
display: grid;
|
42
|
-
margin-left:
|
44
|
+
margin-left: 6px;
|
43
45
|
}
|
44
46
|
|
45
47
|
.header {
|
@@ -48,6 +50,7 @@
|
|
48
50
|
white-space: nowrap;
|
49
51
|
text-overflow: ellipsis;
|
50
52
|
overflow: hidden;
|
53
|
+
max-width: 190px;
|
51
54
|
}
|
52
55
|
|
53
56
|
.connections {
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"nodeLedger.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/nodeLedger.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;;AACL,8BAAmB,GAAa,EAAE,CAAC;AACnC,wBAAa,GAA6B,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC","sourcesContent":["export class NodeLedger {\r\n public static RegisteredNodeNames: string[] = [];\r\n public static NameFormatter: (name: string) => string = (name: string) => name;\r\n}\r\n"]}
|
@@ -87,12 +87,13 @@ export class NodeLink {
|
|
87
87
|
if (rect.left > locatRect.right || rect.right < locatRect.left || rect.top > locatRect.bottom || rect.bottom < locatRect.top) {
|
88
88
|
return false;
|
89
89
|
}
|
90
|
+
const zoom = this._graphCanvas.zoom;
|
90
91
|
const svg = this._graphCanvas.svgCanvas;
|
91
92
|
const rootRect = svg.getBoundingClientRect();
|
92
|
-
const left = rect.x - rootRect.x;
|
93
|
-
const top = rect.y - rootRect.y;
|
94
|
-
const right = left + rect.width;
|
95
|
-
const bottom = top + rect.height;
|
93
|
+
const left = (rect.x - rootRect.x) / zoom;
|
94
|
+
const top = (rect.y - rootRect.y) / zoom;
|
95
|
+
const right = left + rect.width / zoom;
|
96
|
+
const bottom = top + rect.height / zoom;
|
96
97
|
const sampleRate = 10; // Checking 10 times on the path should be enough
|
97
98
|
for (let index = 0; index < 1; index += 1 / sampleRate) {
|
98
99
|
const point = this._path.getPointAtLength(index * this._path.getTotalLength());
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nodeLink.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/nodeLink.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { NodePort } from \"./nodePort\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { GraphCanvasComponent } from \"./graphCanvas\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport { RefreshNode } from \"./tools\";\r\nimport commonStyles from \"./common.modules.scss\";\r\nimport styles from \"./nodeLink.modules.scss\";\r\n\r\nexport class NodeLink {\r\n private _graphCanvas: GraphCanvasComponent;\r\n private _portA: NodePort | FrameNodePort;\r\n private _portB?: NodePort | FrameNodePort;\r\n private _nodeA: GraphNode;\r\n private _nodeB?: GraphNode;\r\n private _path: SVGPathElement;\r\n private _selectionPath: SVGPathElement;\r\n private _onSelectionChangedObserver: Nullable<Observer<Nullable<ISelectionChangedOptions>>>;\r\n private _isVisible = true;\r\n private _isTargetCandidate = false;\r\n\r\n public onDisposedObservable = new Observable<NodeLink>();\r\n\r\n public get isTargetCandidate() {\r\n return this._isTargetCandidate;\r\n }\r\n\r\n public set isTargetCandidate(value: boolean) {\r\n if (this._isTargetCandidate === value) {\r\n return;\r\n }\r\n\r\n this._isTargetCandidate = value;\r\n\r\n if (value) {\r\n this._path.classList.add(styles[\"target-candidate\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"target-candidate\"]);\r\n }\r\n }\r\n\r\n public get isVisible() {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n this._isVisible = value;\r\n\r\n if (!value) {\r\n this._path.classList.add(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.add(commonStyles[\"hidden\"]);\r\n } else {\r\n this._path.classList.remove(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.remove(commonStyles[\"hidden\"]);\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n public get portA() {\r\n return this._portA;\r\n }\r\n\r\n public get portB() {\r\n return this._portB;\r\n }\r\n\r\n public get nodeA() {\r\n return this._nodeA;\r\n }\r\n\r\n public get nodeB() {\r\n return this._nodeB;\r\n }\r\n\r\n public intersectsWith(rect: DOMRect) {\r\n const locatRect = this._path.getBoundingClientRect();\r\n if (rect.left > locatRect.right || rect.right < locatRect.left || rect.top > locatRect.bottom || rect.bottom < locatRect.top) {\r\n return false;\r\n }\r\n\r\n const svg = this._graphCanvas.svgCanvas as any as SVGSVGElement;\r\n const rootRect = svg.getBoundingClientRect();\r\n\r\n const left = rect.x - rootRect.x;\r\n const top = rect.y - rootRect.y;\r\n const right = left + rect.width;\r\n const bottom = top + rect.height;\r\n\r\n const sampleRate = 10; // Checking 10 times on the path should be enough\r\n\r\n for (let index = 0; index < 1; index += 1 / sampleRate) {\r\n const point = this._path.getPointAtLength(index * this._path.getTotalLength());\r\n if (left < point.x && right > point.x && top < point.y && bottom > point.y) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public update(endX = 0, endY = 0, straight = false) {\r\n const rectA = this._portA.element.getBoundingClientRect();\r\n const rootRect = this._graphCanvas.canvasContainer.getBoundingClientRect();\r\n const zoom = this._graphCanvas.zoom;\r\n const xOffset = rootRect.left;\r\n const yOffset = rootRect.top;\r\n\r\n const startX = (rectA.left - xOffset + 0.5 * rectA.width) / zoom;\r\n const startY = (rectA.top - yOffset + 0.5 * rectA.height) / zoom;\r\n\r\n if (this._portB) {\r\n const rectB = this._portB.element.getBoundingClientRect();\r\n endX = (rectB.left - xOffset + 0.5 * rectB.width) / zoom;\r\n endY = (rectB.top - yOffset + 0.5 * rectB.height) / zoom;\r\n }\r\n\r\n if (straight) {\r\n this._path.setAttribute(\"d\", `M${startX},${startY} L${endX},${endY}`);\r\n this._path.setAttribute(\"stroke-dasharray\", \"10, 10\");\r\n this._path.setAttribute(\"stroke-linecap\", \"round\");\r\n } else {\r\n const deltaX = endX - startX;\r\n const deltaY = endY - startY;\r\n const tangentLength = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 0.5, 300);\r\n this._path.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n this._selectionPath.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n }\r\n this._path.setAttribute(\"stroke\", this._portA.element.style.backgroundColor!);\r\n }\r\n\r\n public constructor(graphCanvas: GraphCanvasComponent, portA: NodePort, nodeA: GraphNode, portB?: NodePort, nodeB?: GraphNode) {\r\n this._portA = portA;\r\n this._portB = portB;\r\n this._nodeA = nodeA;\r\n this._nodeB = nodeB;\r\n this._graphCanvas = graphCanvas;\r\n\r\n const document = portA.element.ownerDocument!;\r\n const svg = graphCanvas.svgCanvas;\r\n\r\n // Create path\r\n this._path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._path.setAttribute(\"fill\", \"none\");\r\n this._path.classList.add(styles[\"link\"]);\r\n\r\n svg.appendChild(this._path);\r\n\r\n this._selectionPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._selectionPath.setAttribute(\"fill\", \"none\");\r\n this._selectionPath.classList.add(styles[\"selection-link\"]);\r\n\r\n svg.appendChild(this._selectionPath);\r\n\r\n this._selectionPath.onmousedown = (evt: MouseEvent) => this.onClick(evt);\r\n\r\n if (this._portB) {\r\n // Update\r\n this.update();\r\n }\r\n\r\n this._onSelectionChangedObserver = this._graphCanvas.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection } = options || {};\r\n if (selection === this) {\r\n this._path.classList.add(styles[\"selected\"]);\r\n this._selectionPath.classList.add(styles[\"selected\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"selected\"]);\r\n this._selectionPath.classList.remove(styles[\"selected\"]);\r\n }\r\n });\r\n }\r\n\r\n onClick(evt: MouseEvent) {\r\n const stateManager = this._graphCanvas.stateManager;\r\n if (evt.altKey) {\r\n const nodeA = this._nodeA;\r\n const pointA = this._portA.portData;\r\n const nodeB = this._nodeB!;\r\n const pointB = this._portB!.portData;\r\n\r\n if (!stateManager.isElbowConnectionAllowed(this._portA, this._portB!)) {\r\n return;\r\n }\r\n\r\n // Create an elbow at the clicked location\r\n stateManager.onNewNodeCreatedObservable.addOnce((newNode) => {\r\n const newElbowBlock = newNode.content.data as any;\r\n\r\n // Delete previous link\r\n this.dispose();\r\n\r\n // Connect to Elbow block\r\n this._graphCanvas.connectNodes(nodeA, pointA, newNode, newNode.getPortDataForPortDataContent(newElbowBlock.input)!);\r\n this._graphCanvas.connectNodes(newNode, newNode.getPortDataForPortDataContent(newElbowBlock.output)!, nodeB, pointB);\r\n\r\n stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n });\r\n\r\n stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: \"ElbowBlock\",\r\n targetX: evt.clientX,\r\n targetY: evt.clientY,\r\n needRepositioning: true,\r\n });\r\n return;\r\n }\r\n\r\n stateManager.onSelectionChangedObservable.notifyObservers({ selection: this });\r\n }\r\n\r\n public dispose(notify = true) {\r\n this._graphCanvas.stateManager.onSelectionChangedObservable.remove(this._onSelectionChangedObserver);\r\n\r\n if (this._path.parentElement) {\r\n this._path.parentElement.removeChild(this._path);\r\n }\r\n\r\n if (this._selectionPath.parentElement) {\r\n this._selectionPath.parentElement.removeChild(this._selectionPath);\r\n }\r\n\r\n if (this._nodeB) {\r\n this._nodeA.links.splice(this._nodeA.links.indexOf(this), 1);\r\n this._nodeB.links.splice(this._nodeB.links.indexOf(this), 1);\r\n this._graphCanvas.links.splice(this._graphCanvas.links.indexOf(this), 1);\r\n\r\n this._portA.portData.disconnectFrom(this._portB!.portData);\r\n\r\n RefreshNode(this._nodeB);\r\n }\r\n\r\n if (notify) {\r\n this.onDisposedObservable.notifyObservers(this);\r\n\r\n this.onDisposedObservable.clear();\r\n }\r\n }\r\n}\r\n"]}
|
1
|
+
{"version":3,"file":"nodeLink.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/nodeLink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAMlD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAE7C,MAAM,OAAO,QAAQ;IA2HjB,YAAmB,WAAiC,EAAE,KAAe,EAAE,KAAgB,EAAE,KAAgB,EAAE,KAAiB;QAlHpH,eAAU,GAAG,IAAI,CAAC;QAClB,uBAAkB,GAAG,KAAK,CAAC;QAE5B,yBAAoB,GAAG,IAAI,UAAU,EAAY,CAAC;QAgHrD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAc,CAAC;QAC9C,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC;QAElC,cAAc;QACd,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACrF,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE5D,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAErC,IAAI,CAAC,cAAc,CAAC,WAAW,GAAG,CAAC,GAAe,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEzE,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,SAAS;YACT,IAAI,CAAC,MAAM,EAAE,CAAC;SACjB;QAED,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3G,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;YACpC,IAAI,SAAS,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;aACzD;iBAAM;gBACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;aAC5D;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IArJD,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACnC,CAAC;IAED,IAAW,iBAAiB,CAAC,KAAc;QACvC,IAAI,IAAI,CAAC,kBAAkB,KAAK,KAAK,EAAE;YACnC,OAAO;SACV;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAEhC,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;SACxD;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;SAC3D;IACL,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAW,SAAS,CAAC,KAAc;QAC/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,KAAK,EAAE;YACR,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;SAC7D;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;SAChE;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAEM,cAAc,CAAC,IAAa;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE;YAC1H,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAiC,CAAC;QAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;QAE7C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACvC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAExC,MAAM,UAAU,GAAG,EAAE,CAAC,CAAC,iDAAiD;QAExE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,UAAU,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE;gBACxE,OAAO,IAAI,CAAC;aACf;SACJ;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC;QAE7B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAEjE,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;YAC1D,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YACzD,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;SAC5D;QAED,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;SACtD;aAAM;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;YAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;YACxF,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,GAAG,aAAa,IAAI,MAAM,IAAI,IAAI,GAAG,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1I,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,GAAG,aAAa,IAAI,MAAM,IAAI,IAAI,GAAG,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;SACtJ;QACD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAgB,CAAC,CAAC;IAClF,CAAC;IA4CD,OAAO,CAAC,GAAe;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;QACpD,IAAI,GAAG,CAAC,MAAM,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAO,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC;YAErC,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAO,CAAC,EAAE;gBACnE,OAAO;aACV;YAED,0CAA0C;YAC1C,YAAY,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACxD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,IAAW,CAAC;gBAElD,uBAAuB;gBACvB,IAAI,CAAC,OAAO,EAAE,CAAC;gBAEf,yBAAyB;gBACzB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,6BAA6B,CAAC,aAAa,CAAC,KAAK,CAAE,CAAC,CAAC;gBACpH,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,6BAA6B,CAAC,aAAa,CAAC,MAAM,CAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAErH,YAAY,CAAC,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC;gBACtD,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,iBAAiB,EAAE,IAAI;aAC1B,CAAC,CAAC;YACH,OAAO;SACV;QAED,YAAY,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IAEM,OAAO,CAAC,MAAM,GAAG,IAAI;QACxB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAErG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpD;QAED,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;YACnC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACtE;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAEzE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC;YAE3D,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAEhD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;SACrC;IACL,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { NodePort } from \"./nodePort\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { GraphCanvasComponent } from \"./graphCanvas\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport { RefreshNode } from \"./tools\";\r\nimport commonStyles from \"./common.modules.scss\";\r\nimport styles from \"./nodeLink.modules.scss\";\r\n\r\nexport class NodeLink {\r\n private _graphCanvas: GraphCanvasComponent;\r\n private _portA: NodePort | FrameNodePort;\r\n private _portB?: NodePort | FrameNodePort;\r\n private _nodeA: GraphNode;\r\n private _nodeB?: GraphNode;\r\n private _path: SVGPathElement;\r\n private _selectionPath: SVGPathElement;\r\n private _onSelectionChangedObserver: Nullable<Observer<Nullable<ISelectionChangedOptions>>>;\r\n private _isVisible = true;\r\n private _isTargetCandidate = false;\r\n\r\n public onDisposedObservable = new Observable<NodeLink>();\r\n\r\n public get isTargetCandidate() {\r\n return this._isTargetCandidate;\r\n }\r\n\r\n public set isTargetCandidate(value: boolean) {\r\n if (this._isTargetCandidate === value) {\r\n return;\r\n }\r\n\r\n this._isTargetCandidate = value;\r\n\r\n if (value) {\r\n this._path.classList.add(styles[\"target-candidate\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"target-candidate\"]);\r\n }\r\n }\r\n\r\n public get isVisible() {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n this._isVisible = value;\r\n\r\n if (!value) {\r\n this._path.classList.add(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.add(commonStyles[\"hidden\"]);\r\n } else {\r\n this._path.classList.remove(commonStyles[\"hidden\"]);\r\n this._selectionPath.classList.remove(commonStyles[\"hidden\"]);\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n public get portA() {\r\n return this._portA;\r\n }\r\n\r\n public get portB() {\r\n return this._portB;\r\n }\r\n\r\n public get nodeA() {\r\n return this._nodeA;\r\n }\r\n\r\n public get nodeB() {\r\n return this._nodeB;\r\n }\r\n\r\n public intersectsWith(rect: DOMRect) {\r\n const locatRect = this._path.getBoundingClientRect();\r\n if (rect.left > locatRect.right || rect.right < locatRect.left || rect.top > locatRect.bottom || rect.bottom < locatRect.top) {\r\n return false;\r\n }\r\n\r\n const zoom = this._graphCanvas.zoom;\r\n const svg = this._graphCanvas.svgCanvas as any as SVGSVGElement;\r\n const rootRect = svg.getBoundingClientRect();\r\n\r\n const left = (rect.x - rootRect.x) / zoom;\r\n const top = (rect.y - rootRect.y) / zoom;\r\n const right = left + rect.width / zoom;\r\n const bottom = top + rect.height / zoom;\r\n\r\n const sampleRate = 10; // Checking 10 times on the path should be enough\r\n\r\n for (let index = 0; index < 1; index += 1 / sampleRate) {\r\n const point = this._path.getPointAtLength(index * this._path.getTotalLength());\r\n if (left < point.x && right > point.x && top < point.y && bottom > point.y) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public update(endX = 0, endY = 0, straight = false) {\r\n const rectA = this._portA.element.getBoundingClientRect();\r\n const rootRect = this._graphCanvas.canvasContainer.getBoundingClientRect();\r\n const zoom = this._graphCanvas.zoom;\r\n const xOffset = rootRect.left;\r\n const yOffset = rootRect.top;\r\n\r\n const startX = (rectA.left - xOffset + 0.5 * rectA.width) / zoom;\r\n const startY = (rectA.top - yOffset + 0.5 * rectA.height) / zoom;\r\n\r\n if (this._portB) {\r\n const rectB = this._portB.element.getBoundingClientRect();\r\n endX = (rectB.left - xOffset + 0.5 * rectB.width) / zoom;\r\n endY = (rectB.top - yOffset + 0.5 * rectB.height) / zoom;\r\n }\r\n\r\n if (straight) {\r\n this._path.setAttribute(\"d\", `M${startX},${startY} L${endX},${endY}`);\r\n this._path.setAttribute(\"stroke-dasharray\", \"10, 10\");\r\n this._path.setAttribute(\"stroke-linecap\", \"round\");\r\n } else {\r\n const deltaX = endX - startX;\r\n const deltaY = endY - startY;\r\n const tangentLength = Math.min(Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 0.5, 300);\r\n this._path.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n this._selectionPath.setAttribute(\"d\", `M${startX},${startY} C${startX + tangentLength},${startY} ${endX - tangentLength},${endY} ${endX},${endY}`);\r\n }\r\n this._path.setAttribute(\"stroke\", this._portA.element.style.backgroundColor!);\r\n }\r\n\r\n public constructor(graphCanvas: GraphCanvasComponent, portA: NodePort, nodeA: GraphNode, portB?: NodePort, nodeB?: GraphNode) {\r\n this._portA = portA;\r\n this._portB = portB;\r\n this._nodeA = nodeA;\r\n this._nodeB = nodeB;\r\n this._graphCanvas = graphCanvas;\r\n\r\n const document = portA.element.ownerDocument!;\r\n const svg = graphCanvas.svgCanvas;\r\n\r\n // Create path\r\n this._path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._path.setAttribute(\"fill\", \"none\");\r\n this._path.classList.add(styles[\"link\"]);\r\n\r\n svg.appendChild(this._path);\r\n\r\n this._selectionPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\r\n this._selectionPath.setAttribute(\"fill\", \"none\");\r\n this._selectionPath.classList.add(styles[\"selection-link\"]);\r\n\r\n svg.appendChild(this._selectionPath);\r\n\r\n this._selectionPath.onmousedown = (evt: MouseEvent) => this.onClick(evt);\r\n\r\n if (this._portB) {\r\n // Update\r\n this.update();\r\n }\r\n\r\n this._onSelectionChangedObserver = this._graphCanvas.stateManager.onSelectionChangedObservable.add((options) => {\r\n const { selection } = options || {};\r\n if (selection === this) {\r\n this._path.classList.add(styles[\"selected\"]);\r\n this._selectionPath.classList.add(styles[\"selected\"]);\r\n } else {\r\n this._path.classList.remove(styles[\"selected\"]);\r\n this._selectionPath.classList.remove(styles[\"selected\"]);\r\n }\r\n });\r\n }\r\n\r\n onClick(evt: MouseEvent) {\r\n const stateManager = this._graphCanvas.stateManager;\r\n if (evt.altKey) {\r\n const nodeA = this._nodeA;\r\n const pointA = this._portA.portData;\r\n const nodeB = this._nodeB!;\r\n const pointB = this._portB!.portData;\r\n\r\n if (!stateManager.isElbowConnectionAllowed(this._portA, this._portB!)) {\r\n return;\r\n }\r\n\r\n // Create an elbow at the clicked location\r\n stateManager.onNewNodeCreatedObservable.addOnce((newNode) => {\r\n const newElbowBlock = newNode.content.data as any;\r\n\r\n // Delete previous link\r\n this.dispose();\r\n\r\n // Connect to Elbow block\r\n this._graphCanvas.connectNodes(nodeA, pointA, newNode, newNode.getPortDataForPortDataContent(newElbowBlock.input)!);\r\n this._graphCanvas.connectNodes(newNode, newNode.getPortDataForPortDataContent(newElbowBlock.output)!, nodeB, pointB);\r\n\r\n stateManager.onRebuildRequiredObservable.notifyObservers(true);\r\n });\r\n\r\n stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: \"ElbowBlock\",\r\n targetX: evt.clientX,\r\n targetY: evt.clientY,\r\n needRepositioning: true,\r\n });\r\n return;\r\n }\r\n\r\n stateManager.onSelectionChangedObservable.notifyObservers({ selection: this });\r\n }\r\n\r\n public dispose(notify = true) {\r\n this._graphCanvas.stateManager.onSelectionChangedObservable.remove(this._onSelectionChangedObserver);\r\n\r\n if (this._path.parentElement) {\r\n this._path.parentElement.removeChild(this._path);\r\n }\r\n\r\n if (this._selectionPath.parentElement) {\r\n this._selectionPath.parentElement.removeChild(this._selectionPath);\r\n }\r\n\r\n if (this._nodeB) {\r\n this._nodeA.links.splice(this._nodeA.links.indexOf(this), 1);\r\n this._nodeB.links.splice(this._nodeB.links.indexOf(this), 1);\r\n this._graphCanvas.links.splice(this._graphCanvas.links.indexOf(this), 1);\r\n\r\n this._portA.portData.disconnectFrom(this._portB!.portData);\r\n\r\n RefreshNode(this._nodeB);\r\n }\r\n\r\n if (notify) {\r\n this.onDisposedObservable.notifyObservers(this);\r\n\r\n this.onDisposedObservable.clear();\r\n }\r\n }\r\n}\r\n"]}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import * as React from "react";
|
2
|
+
import type { StateManager } from "./stateManager";
|
3
|
+
import "./searchBox.scss";
|
4
|
+
export interface ISearchBoxComponentProps {
|
5
|
+
stateManager: StateManager;
|
6
|
+
}
|
7
|
+
/**
|
8
|
+
* The search box component.
|
9
|
+
*/
|
10
|
+
export declare class SearchBoxComponent extends React.Component<ISearchBoxComponentProps, {
|
11
|
+
isVisible: boolean;
|
12
|
+
filter: string;
|
13
|
+
}> {
|
14
|
+
private _handleEscKey;
|
15
|
+
private _targetX;
|
16
|
+
private _targetY;
|
17
|
+
private _nodes;
|
18
|
+
constructor(props: ISearchBoxComponentProps);
|
19
|
+
hide(): void;
|
20
|
+
onFilterChange(evt: React.ChangeEvent<HTMLInputElement>): void;
|
21
|
+
onNewNodeRequested(name: string): void;
|
22
|
+
onKeyDown(evt: React.KeyboardEvent): void;
|
23
|
+
render(): JSX.Element | null;
|
24
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
import * as React from "react";
|
3
|
+
import "./searchBox.scss";
|
4
|
+
import { NodeLedger } from "./nodeLedger.js";
|
5
|
+
/**
|
6
|
+
* The search box component.
|
7
|
+
*/
|
8
|
+
export class SearchBoxComponent extends React.Component {
|
9
|
+
constructor(props) {
|
10
|
+
super(props);
|
11
|
+
this.state = { isVisible: false, filter: "" };
|
12
|
+
this._handleEscKey = (evt) => {
|
13
|
+
if (evt.key === "Escape") {
|
14
|
+
this.hide();
|
15
|
+
}
|
16
|
+
};
|
17
|
+
this.props.stateManager.onSearchBoxRequiredObservable.add((loc) => {
|
18
|
+
this._targetX = loc.x;
|
19
|
+
this._targetY = loc.y;
|
20
|
+
this.setState({ isVisible: true, filter: "" });
|
21
|
+
this.props.stateManager.hostDocument.addEventListener("keydown", this._handleEscKey);
|
22
|
+
});
|
23
|
+
}
|
24
|
+
hide() {
|
25
|
+
this.setState({ isVisible: false });
|
26
|
+
this.props.stateManager.modalIsDisplayed = false;
|
27
|
+
this.props.stateManager.hostDocument.removeEventListener("keydown", this._handleEscKey);
|
28
|
+
}
|
29
|
+
onFilterChange(evt) {
|
30
|
+
this.setState({ filter: evt.target.value });
|
31
|
+
}
|
32
|
+
onNewNodeRequested(name) {
|
33
|
+
this.props.stateManager.onNewBlockRequiredObservable.notifyObservers({
|
34
|
+
type: name,
|
35
|
+
targetX: this._targetX,
|
36
|
+
targetY: this._targetY,
|
37
|
+
needRepositioning: true,
|
38
|
+
smartAdd: true,
|
39
|
+
});
|
40
|
+
this.hide();
|
41
|
+
}
|
42
|
+
onKeyDown(evt) {
|
43
|
+
if (evt.code === "Enter" && this._nodes.length > 0) {
|
44
|
+
this.onNewNodeRequested(this._nodes[0]);
|
45
|
+
return;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
render() {
|
49
|
+
if (!this.state.isVisible) {
|
50
|
+
return null;
|
51
|
+
}
|
52
|
+
const expectedWidth = 300;
|
53
|
+
const expectedHeight = 400;
|
54
|
+
// Sort and deduplicate the node names.
|
55
|
+
this._nodes = Array.from(new Set(NodeLedger.RegisteredNodeNames.sort()));
|
56
|
+
if (this.state.filter) {
|
57
|
+
const filter = this.state.filter.toLowerCase().trim();
|
58
|
+
this._nodes = this._nodes.filter((name) => NodeLedger.NameFormatter(name).toLowerCase().includes(filter));
|
59
|
+
}
|
60
|
+
const containerRect = this.props.stateManager.hostDocument.getElementById("graph-canvas").getBoundingClientRect();
|
61
|
+
const targetX = this._targetX - (expectedWidth / 2 + containerRect.x);
|
62
|
+
const targetY = this._targetY - (expectedHeight / 2 + containerRect.y);
|
63
|
+
const locStyle = {
|
64
|
+
left: targetX + "px",
|
65
|
+
top: targetY + "px",
|
66
|
+
};
|
67
|
+
if (targetX + expectedWidth > containerRect.width) {
|
68
|
+
locStyle.left = containerRect.width - expectedWidth - 10 + "px";
|
69
|
+
}
|
70
|
+
else if (targetX < 10) {
|
71
|
+
locStyle.left = "10px";
|
72
|
+
}
|
73
|
+
if (targetY + expectedHeight > containerRect.height) {
|
74
|
+
locStyle.top = containerRect.height - expectedHeight - 10 + "px";
|
75
|
+
}
|
76
|
+
else if (targetY < 10) {
|
77
|
+
locStyle.top = "10px";
|
78
|
+
}
|
79
|
+
return (_jsxs("div", { id: "graph-search-container", children: [_jsx("div", { id: "graph-search-picking-blocker", onClick: () => this.hide() }), _jsxs("div", { id: "graph-search-box", style: locStyle, children: [_jsx("div", { className: "graph-search-box-title", children: "Add a node" }), _jsx("input", { type: "text", placeholder: "Search...", onChange: (evt) => this.onFilterChange(evt), onKeyDown: (evt) => this.onKeyDown(evt), value: this.state.filter, className: "graph-search-box-filter", autoFocus: true, tabIndex: 0 }), _jsx("div", { className: "graph-search-box-list", children: this._nodes.map((name) => {
|
80
|
+
return (_jsx("div", { className: "graph-search-box-list-item ", onClick: () => this.onNewNodeRequested(name), children: NodeLedger.NameFormatter(name) }, name));
|
81
|
+
}) })] })] }));
|
82
|
+
}
|
83
|
+
}
|
84
|
+
//# sourceMappingURL=searchBox.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"searchBox.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/searchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport \"./searchBox.scss\";\r\nimport { NodeLedger } from \"./nodeLedger\";\r\n\r\nexport interface ISearchBoxComponentProps {\r\n stateManager: StateManager;\r\n}\r\n\r\n/**\r\n * The search box component.\r\n */\r\nexport class SearchBoxComponent extends React.Component<ISearchBoxComponentProps, { isVisible: boolean; filter: string }> {\r\n private _handleEscKey: (evt: KeyboardEvent) => void;\r\n private _targetX: number;\r\n private _targetY: number;\r\n private _nodes: string[];\r\n\r\n constructor(props: ISearchBoxComponentProps) {\r\n super(props);\r\n\r\n this.state = { isVisible: false, filter: \"\" };\r\n\r\n this._handleEscKey = (evt: KeyboardEvent) => {\r\n if (evt.key === \"Escape\") {\r\n this.hide();\r\n }\r\n };\r\n\r\n this.props.stateManager.onSearchBoxRequiredObservable.add((loc) => {\r\n this._targetX = loc.x;\r\n this._targetY = loc.y;\r\n this.setState({ isVisible: true, filter: \"\" });\r\n this.props.stateManager.hostDocument!.addEventListener(\"keydown\", this._handleEscKey);\r\n });\r\n }\r\n\r\n hide() {\r\n this.setState({ isVisible: false });\r\n this.props.stateManager.modalIsDisplayed = false;\r\n this.props.stateManager.hostDocument!.removeEventListener(\"keydown\", this._handleEscKey);\r\n }\r\n\r\n onFilterChange(evt: React.ChangeEvent<HTMLInputElement>) {\r\n this.setState({ filter: evt.target.value });\r\n }\r\n\r\n onNewNodeRequested(name: string) {\r\n this.props.stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: name,\r\n targetX: this._targetX,\r\n targetY: this._targetY,\r\n needRepositioning: true,\r\n smartAdd: true,\r\n });\r\n\r\n this.hide();\r\n }\r\n\r\n onKeyDown(evt: React.KeyboardEvent) {\r\n if (evt.code === \"Enter\" && this._nodes.length > 0) {\r\n this.onNewNodeRequested(this._nodes[0]);\r\n return;\r\n }\r\n }\r\n\r\n render() {\r\n if (!this.state.isVisible) {\r\n return null;\r\n }\r\n\r\n const expectedWidth = 300;\r\n const expectedHeight = 400;\r\n\r\n // Sort and deduplicate the node names.\r\n this._nodes = Array.from(new Set(NodeLedger.RegisteredNodeNames.sort()));\r\n\r\n if (this.state.filter) {\r\n const filter = this.state.filter.toLowerCase().trim();\r\n this._nodes = this._nodes.filter((name) => NodeLedger.NameFormatter(name).toLowerCase().includes(filter));\r\n }\r\n\r\n const containerRect = this.props.stateManager.hostDocument.getElementById(\"graph-canvas\")!.getBoundingClientRect();\r\n const targetX = this._targetX - (expectedWidth / 2 + containerRect.x);\r\n const targetY = this._targetY - (expectedHeight / 2 + containerRect.y);\r\n const locStyle = {\r\n left: targetX + \"px\",\r\n top: targetY + \"px\",\r\n };\r\n\r\n if (targetX + expectedWidth > containerRect.width) {\r\n locStyle.left = containerRect.width - expectedWidth - 10 + \"px\";\r\n } else if (targetX < 10) {\r\n locStyle.left = \"10px\";\r\n }\r\n\r\n if (targetY + expectedHeight > containerRect.height) {\r\n locStyle.top = containerRect.height - expectedHeight - 10 + \"px\";\r\n } else if (targetY < 10) {\r\n locStyle.top = \"10px\";\r\n }\r\n\r\n return (\r\n <div id=\"graph-search-container\">\r\n <div id=\"graph-search-picking-blocker\" onClick={() => this.hide()}></div>\r\n <div id=\"graph-search-box\" style={locStyle}>\r\n <div className=\"graph-search-box-title\">Add a node</div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n onChange={(evt) => this.onFilterChange(evt)}\r\n onKeyDown={(evt) => this.onKeyDown(evt)}\r\n value={this.state.filter}\r\n className=\"graph-search-box-filter\"\r\n autoFocus={true}\r\n tabIndex={0}\r\n />\r\n <div className=\"graph-search-box-list\">\r\n {this._nodes.map((name) => {\r\n return (\r\n <div className=\"graph-search-box-list-item \" onClick={() => this.onNewNodeRequested(name)} key={name}>\r\n {NodeLedger.NameFormatter(name)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#graph-search-container {
|
2
|
+
position: absolute;
|
3
|
+
width: 100%;
|
4
|
+
height: 100%;
|
5
|
+
left: 0;
|
6
|
+
top: 0;
|
7
|
+
|
8
|
+
#graph-search-picking-blocker {
|
9
|
+
position: absolute;
|
10
|
+
width: 100%;
|
11
|
+
height: 100%;
|
12
|
+
left: 0;
|
13
|
+
top: 0;
|
14
|
+
cursor: default;
|
15
|
+
}
|
16
|
+
|
17
|
+
#graph-search-box {
|
18
|
+
width: 300px;
|
19
|
+
height: 400px;
|
20
|
+
position: absolute;
|
21
|
+
left: calc(50% - 150px);
|
22
|
+
top: calc(50% - 200px);
|
23
|
+
background: rgb(72, 72, 72);
|
24
|
+
border: 2px solid black;
|
25
|
+
z-index: 100;
|
26
|
+
cursor: auto;
|
27
|
+
display: grid;
|
28
|
+
grid-template-rows: auto auto 1fr;
|
29
|
+
|
30
|
+
.graph-search-box-title {
|
31
|
+
border-bottom: 1px solid rgb(40, 40, 40);
|
32
|
+
margin: 4px;
|
33
|
+
padding-bottom: 4px;
|
34
|
+
color: white;
|
35
|
+
grid-row: 1;
|
36
|
+
}
|
37
|
+
|
38
|
+
.graph-search-box-filter {
|
39
|
+
margin: 4px;
|
40
|
+
padding-bottom: 4px;
|
41
|
+
border-radius: 4px;
|
42
|
+
width: calc(100% - 16px);
|
43
|
+
grid-row: 2;
|
44
|
+
}
|
45
|
+
|
46
|
+
.graph-search-box-list {
|
47
|
+
grid-row: 3;
|
48
|
+
overflow-y: auto;
|
49
|
+
display: flex;
|
50
|
+
flex-direction: column;
|
51
|
+
|
52
|
+
.graph-search-box-list-item {
|
53
|
+
margin-left: 4px;
|
54
|
+
cursor: pointer;
|
55
|
+
color: white;
|
56
|
+
margin-top: 4px;
|
57
|
+
margin-bottom: 4px;
|
58
|
+
|
59
|
+
&:hover {
|
60
|
+
background: rgb(30, 30, 30);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
@@ -13,6 +13,11 @@ export declare class StateManager {
|
|
13
13
|
data: any;
|
14
14
|
hostDocument: Document;
|
15
15
|
lockObject: any;
|
16
|
+
modalIsDisplayed: boolean;
|
17
|
+
onSearchBoxRequiredObservable: Observable<{
|
18
|
+
x: number;
|
19
|
+
y: number;
|
20
|
+
}>;
|
16
21
|
onSelectionChangedObservable: Observable<Nullable<ISelectionChangedOptions>>;
|
17
22
|
onFrameCreatedObservable: Observable<GraphFrame>;
|
18
23
|
onUpdateRequiredObservable: Observable<any>;
|
@@ -30,6 +35,7 @@ export declare class StateManager {
|
|
30
35
|
targetX: number;
|
31
36
|
targetY: number;
|
32
37
|
needRepositioning?: boolean | undefined;
|
38
|
+
smartAdd?: boolean | undefined;
|
33
39
|
}>;
|
34
40
|
exportData: (data: any, frame?: Nullable<GraphFrame>) => string;
|
35
41
|
isElbowConnectionAllowed: (nodeA: FrameNodePort | NodePort, nodeB: FrameNodePort | NodePort) => boolean;
|
@@ -1,6 +1,7 @@
|
|
1
1
|
import { Observable } from "@babylonjs/core/Misc/observable.js";
|
2
2
|
export class StateManager {
|
3
3
|
constructor() {
|
4
|
+
this.onSearchBoxRequiredObservable = new Observable();
|
4
5
|
this.onSelectionChangedObservable = new Observable();
|
5
6
|
this.onFrameCreatedObservable = new Observable();
|
6
7
|
this.onUpdateRequiredObservable = new Observable();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stateManager.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/stateManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAWlD,MAAM,OAAO,YAAY;IAAzB;
|
1
|
+
{"version":3,"file":"stateManager.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/stateManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,2CAA6B;AAWlD,MAAM,OAAO,YAAY;IAAzB;QAMI,kCAA6B,GAAG,IAAI,UAAU,EAA4B,CAAC;QAC3E,iCAA4B,GAAG,IAAI,UAAU,EAAsC,CAAC;QACpF,6BAAwB,GAAG,IAAI,UAAU,EAAc,CAAC;QACxD,+BAA0B,GAAG,IAAI,UAAU,EAAiB,CAAC;QAC7D,iCAA4B,GAAG,IAAI,UAAU,EAAa,CAAC;QAC3D,wBAAmB,GAAG,IAAI,UAAU,EAAwB,CAAC;QAC7D,yBAAoB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAC3D,sCAAiC,GAAG,IAAI,UAAU,EAAsC,CAAC;QACzF,+BAA0B,GAAG,IAAI,UAAU,EAAa,CAAC;QACzD,gCAA2B,GAAG,IAAI,UAAU,EAAW,CAAC;QACxD,2CAAsC,GAAG,IAAI,UAAU,EAAU,CAAC;QAClE,kCAA6B,GAAG,IAAI,UAAU,EAAa,CAAC;QAC5D,sBAAiB,GAAG,IAAI,UAAU,EAAQ,CAAC;QAC3C,iCAA4B,GAAG,IAAI,UAAU,EAAuG,CAAC;IAWzJ,CAAC;CAAA","sourcesContent":["import type { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport type { Nullable } from \"core/types\";\r\nimport type { FrameNodePort } from \"./frameNodePort\";\r\nimport type { GraphFrame } from \"./graphFrame\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { INodeContainer } from \"./interfaces/nodeContainer\";\r\nimport type { INodeData } from \"./interfaces/nodeData\";\r\nimport type { IPortData } from \"./interfaces/portData\";\r\nimport type { ISelectionChangedOptions } from \"./interfaces/selectionChangedOptions\";\r\nimport type { NodePort } from \"./nodePort\";\r\n\r\nexport class StateManager {\r\n data: any;\r\n hostDocument: Document;\r\n lockObject: any;\r\n modalIsDisplayed: boolean;\r\n\r\n onSearchBoxRequiredObservable = new Observable<{ x: number; y: number }>();\r\n onSelectionChangedObservable = new Observable<Nullable<ISelectionChangedOptions>>();\r\n onFrameCreatedObservable = new Observable<GraphFrame>();\r\n onUpdateRequiredObservable = new Observable<Nullable<any>>();\r\n onGraphNodeRemovalObservable = new Observable<GraphNode>();\r\n onSelectionBoxMoved = new Observable<ClientRect | DOMRect>();\r\n onCandidateLinkMoved = new Observable<Nullable<Vector2>>();\r\n onCandidatePortSelectedObservable = new Observable<Nullable<NodePort | FrameNodePort>>();\r\n onNewNodeCreatedObservable = new Observable<GraphNode>();\r\n onRebuildRequiredObservable = new Observable<boolean>();\r\n onErrorMessageDialogRequiredObservable = new Observable<string>();\r\n onExposePortOnFrameObservable = new Observable<GraphNode>();\r\n onGridSizeChanged = new Observable<void>();\r\n onNewBlockRequiredObservable = new Observable<{ type: string; targetX: number; targetY: number; needRepositioning?: boolean; smartAdd?: boolean }>();\r\n\r\n exportData: (data: any, frame?: Nullable<GraphFrame>) => string;\r\n isElbowConnectionAllowed: (nodeA: FrameNodePort | NodePort, nodeB: FrameNodePort | NodePort) => boolean;\r\n applyNodePortDesign: (data: IPortData, element: HTMLElement, img: HTMLImageElement) => void;\r\n\r\n storeEditorData: (serializationObject: any, frame?: Nullable<GraphFrame>) => void;\r\n\r\n getEditorDataMap: () => { [key: number]: number };\r\n\r\n createDefaultInputData: (rootData: any, portData: IPortData, nodeContainer: INodeContainer) => Nullable<{ data: INodeData; name: string }>;\r\n}\r\n"]}
|