lexgui 8.1.1 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/components/Avatar.d.ts +15 -0
- package/build/components/NodeTree.d.ts +51 -26
- package/build/components/Vector.d.ts +10 -9
- package/build/core/Event.d.ts +6 -26
- package/build/core/Namespace.js +1 -1
- package/build/core/Namespace.js.map +1 -1
- package/build/core/Panel.d.ts +538 -538
- package/build/extensions/AssetView.d.ts +7 -6
- package/build/extensions/AssetView.js +194 -155
- package/build/extensions/AssetView.js.map +1 -1
- package/build/extensions/Audio.js.map +1 -1
- package/build/extensions/CodeEditor.d.ts +358 -350
- package/build/extensions/CodeEditor.js +5054 -5022
- package/build/extensions/CodeEditor.js.map +1 -1
- package/build/extensions/DocMaker.js +330 -327
- package/build/extensions/DocMaker.js.map +1 -1
- package/build/extensions/GraphEditor.js +2754 -2760
- package/build/extensions/GraphEditor.js.map +1 -1
- package/build/extensions/Timeline.d.ts +668 -670
- package/build/extensions/Timeline.js +3948 -3955
- package/build/extensions/Timeline.js.map +1 -1
- package/build/extensions/VideoEditor.d.ts +128 -128
- package/build/extensions/VideoEditor.js +893 -898
- package/build/extensions/VideoEditor.js.map +1 -1
- package/build/index.css.d.ts +3 -4
- package/build/index.d.ts +57 -56
- package/build/lexgui.all.js +1587 -1369
- package/build/lexgui.all.js.map +1 -1
- package/build/lexgui.all.min.js +1 -1
- package/build/lexgui.all.module.js +1584 -1364
- package/build/lexgui.all.module.js.map +1 -1
- package/build/lexgui.all.module.min.js +1 -1
- package/build/lexgui.css +6157 -5583
- package/build/lexgui.js +977 -815
- package/build/lexgui.js.map +1 -1
- package/build/lexgui.min.css +2 -3
- package/build/lexgui.min.js +1 -1
- package/build/lexgui.module.js +975 -811
- package/build/lexgui.module.js.map +1 -1
- package/build/lexgui.module.min.js +1 -1
- package/changelog.md +52 -1
- package/demo.js +167 -65
- package/examples/all-components.html +38 -52
- package/examples/asset-view.html +27 -0
- package/examples/code-editor.html +1 -1
- package/examples/editor.html +10 -95
- package/examples/index.html +2 -2
- package/examples/side-bar.html +1 -1
- package/examples/timeline.html +2 -2
- package/examples/video-editor.html +1 -1
- package/examples/video-editor2.html +2 -2
- package/package.json +7 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphEditor.js","sources":["../../src/extensions/GraphEditor.ts"],"sourcesContent":["// GraphEditor.ts @jxarco\r\n\r\nimport { LX } from '../core/Namespace';\r\n\r\nif ( !LX )\r\n{\r\n throw ( 'Missing LX namespace!' );\r\n}\r\n\r\nLX.extensions.push( 'GraphEditor' );\r\n\r\nconst g = globalThis as any;\r\nconst vec2 = LX.vec2;\r\nconst Area = LX.Area;\r\nconst Panel = LX.Panel;\r\nconst Sidebar = LX.Sidebar;\r\nconst ContextMenu = LX.ContextMenu;\r\nconst PocketDialog = LX.PocketDialog;\r\n\r\nexport class BoundingBox\r\n{\r\n origin: typeof vec2;\r\n size: typeof vec2;\r\n\r\n constructor( o: typeof vec2, s: typeof vec2 )\r\n {\r\n this.origin = o ?? new vec2( 0, 0 );\r\n this.size = s ?? new vec2( 0, 0 );\r\n }\r\n\r\n merge( bb: BoundingBox )\r\n {\r\n console.assert( bb.constructor == BoundingBox );\r\n\r\n const min0 = this.origin;\r\n const max0 = this.origin.add( this.size );\r\n\r\n const min1 = bb.origin;\r\n const max1 = bb.origin.add( bb.size );\r\n\r\n const mergeMin = new vec2( Math.min( min0.x, min1.x ), Math.min( min0.y, min1.y ) );\r\n const mergeMax = new vec2( Math.max( max0.x, max1.x ), Math.max( max0.y, max1.y ) );\r\n\r\n this.origin = mergeMin;\r\n this.size = mergeMax.sub( mergeMin );\r\n }\r\n\r\n inside( bb: BoundingBox, full: boolean = true )\r\n {\r\n const min0 = this.origin;\r\n const max0 = this.origin.add( this.size );\r\n\r\n const min1 = bb.origin;\r\n const max1 = bb.origin.add( bb.size );\r\n\r\n if ( full )\r\n {\r\n return min1.x >= min0.x && max1.x <= max0.x\r\n && min1.y >= min0.y && max1.y <= max0.y;\r\n }\r\n else\r\n {\r\n return max1.x >= min0.x && min1.x <= max0.x\r\n && max1.y >= min0.y && min1.y <= max0.y;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @class GraphEditor\r\n */\r\n\r\nexport class GraphEditor\r\n{\r\n static __instances: GraphEditor[] = [];\r\n\r\n // Editor\r\n\r\n static MIN_SCALE: number = 0.25;\r\n static MAX_SCALE: number = 4.0;\r\n\r\n static EVENT_MOUSEMOVE: number = 0;\r\n static EVENT_MOUSEWHEEL: number = 1;\r\n\r\n static LAST_GROUP_ID: number = 0;\r\n static LAST_FUNCTION_ID: number = 0;\r\n\r\n static STOPPED: number = 0;\r\n static RUNNING: number = 1;\r\n\r\n // Node Drawing\r\n\r\n static NODE_IO_INPUT: number = 0;\r\n static NODE_IO_OUTPUT: number = 1;\r\n\r\n static NODE_TYPES: Record<string, GraphNode> = {};\r\n\r\n static onCustomNodeRegistered: ( s: string, n: GraphNode ) => void = () => {};\r\n static onNodeTypeReplaced: ( s: string, n: GraphNode, p: GraphNode ) => void = () => {};\r\n\r\n root: HTMLElement;\r\n area: typeof Area;\r\n propertiesDialog: typeof PocketDialog;\r\n\r\n currentGraph: Graph | null = null;\r\n keys: any = {};\r\n graphs: Record<string, any> = {};\r\n nodes: Record<string, any> = {};\r\n variables: Record<string, any> = {};\r\n groups: any = {};\r\n supportedCastTypes: any = {};\r\n selectedNodes: any[] = [];\r\n main: string = '';\r\n mustStop: boolean = false;\r\n state: number = GraphEditor.STOPPED;\r\n isFocused: boolean = false;\r\n\r\n _graphContainer: HTMLElement;\r\n _sidebarDom: HTMLElement;\r\n _sidebarActive: boolean = true;\r\n _sidebar: typeof Sidebar;\r\n _domLinks: HTMLElement;\r\n _domNodes: HTMLElement;\r\n _mousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _deltaMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _snappedDeltaMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _lastMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _lastSnappedMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _generatingLink: any;\r\n _snapToGrid: boolean = false;\r\n _snapValue: number = 1.0;\r\n _nodeBackgroundOpacity: number = 0.8;\r\n _patternSizeF: number = 15.0;\r\n _patternSize: typeof vec2 = new vec2( this._patternSizeF );\r\n _circlePatternSize = this._patternSizeF * 0.04;\r\n _circlePatternColor: string = '#71717a9c';\r\n _background: SVGSVGElement | undefined;\r\n _undoSteps: any[] = [];\r\n _redoSteps: any[] = [];\r\n _clipboardData: any;\r\n _lastMouseDown: number = 0.0;\r\n _boxSelecting: any;\r\n _boxSelectRemoving: any;\r\n _currentBoxSelectionSVG: SVGSVGElement | undefined;\r\n\r\n constructor( area: typeof Area, options: any = {} )\r\n {\r\n GraphEditor.__instances.push( this );\r\n\r\n this._sidebar = area.addSidebar( ( m: typeof Sidebar ) => {\r\n }, {\r\n displaySelected: true,\r\n headerIcon: 'EllipsisVertical',\r\n headerTitle: 'Create',\r\n headerSubtitle: 'Press to rename',\r\n onHeaderPressed: () => this._showRenameGraphDialog(),\r\n footerIcon: 'Plus',\r\n footerTitle: 'Create',\r\n footerSubtitle: 'Graph or Function',\r\n onFooterPressed: ( e: any ) => this._onSidebarCreate( e )\r\n } );\r\n\r\n this.area = new Area( { className: 'lexgraph' } );\r\n\r\n area.root.classList.add( 'grapharea' );\r\n\r\n this.root = this.area.root;\r\n this.root.tabIndex = -1;\r\n\r\n area.attach( this.root );\r\n\r\n this._graphContainer = area.sections[1].root;\r\n this._sidebarDom = area.sections[0].root;\r\n this._sidebarActive = options.sidebar ?? this._sidebarActive;\r\n\r\n // Set sidebar state depending on options..\r\n LX.doAsync( () => {\r\n this._sidebar.toggleCollapsed( !this._sidebarActive );\r\n }, 50 );\r\n\r\n // Bind resize\r\n\r\n area.onresize = ( bb: any ) => {\r\n };\r\n\r\n area.addOverlayButtons( [\r\n [\r\n {\r\n name: 'Start Graph',\r\n icon: 'Play@solid',\r\n callback: () => this.start(),\r\n selectable: true\r\n },\r\n {\r\n name: 'Stop Graph',\r\n icon: 'Stop@solid',\r\n callback: () => this.stop(),\r\n selectable: true\r\n }\r\n ],\r\n [\r\n {\r\n name: 'Enable Snapping',\r\n icon: 'Frame',\r\n callback: () => this._toggleSnapping(),\r\n selectable: true\r\n },\r\n {\r\n name: 1,\r\n options: [ 1, 2, 3 ],\r\n callback: ( value: number ) => this._setSnappingValue( value )\r\n }\r\n ],\r\n [\r\n {\r\n name: 'Import',\r\n icon: 'Upload',\r\n callback: () => {\r\n this.loadGraph( '../../data/graph_sample.json' );\r\n }\r\n },\r\n {\r\n name: 'Export',\r\n icon: 'ArrowRightFromLine',\r\n callback: () => this.currentGraph?.export()\r\n }\r\n ]\r\n ], { float: 'htc' } );\r\n\r\n this.root.addEventListener( 'keydown', this._processKeyDown.bind( this ), true );\r\n this.root.addEventListener( 'keyup', this._processKeyUp.bind( this ), true );\r\n this.root.addEventListener( 'mousedown', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mouseup', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mousemove', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mousewheel', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mouseleave', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'click', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'contextmenu', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'focus', this._processFocus.bind( this, true ) );\r\n this.root.addEventListener( 'focusout', this._processFocus.bind( this, false ) );\r\n\r\n this.propertiesDialog = new PocketDialog( 'Properties', null, {\r\n size: [ '350px', null ],\r\n position: [ '8px', '8px' ],\r\n float: 'left',\r\n class: 'lexgraphpropdialog'\r\n } );\r\n\r\n // Avoid closing the dialog on click..\r\n\r\n this.propertiesDialog.root.addEventListener( 'mousedown', function( e: MouseEvent )\r\n {\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n } );\r\n\r\n this.propertiesDialog.root.addEventListener( 'mouseup', function( e: MouseEvent )\r\n {\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n } );\r\n\r\n // Move to root..\r\n this.root.appendChild( this.propertiesDialog.root );\r\n\r\n this.addCastType( 'float', 'vec2', ( v: number ) => {\r\n return [ v, v ];\r\n } );\r\n this.addCastType( 'float', 'vec3', ( v: number ) => {\r\n return [ v, v, v ];\r\n } );\r\n this.addCastType( 'float', 'vec4', ( v: number ) => {\r\n return [ v, v, v, v ];\r\n } );\r\n this.addCastType( 'float', 'bool', ( v: number ) => {\r\n return !!v;\r\n } );\r\n\r\n this.addCastType( 'vec4', 'vec3', ( v: number[] ) => {\r\n v.slice( 0, 3 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec4', 'vec2', ( v: number[] ) => {\r\n v.slice( 0, 2 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec3', 'vec2', ( v: number[] ) => {\r\n v.slice( 0, 2 );\r\n return v;\r\n } );\r\n\r\n this.addCastType( 'vec3', 'vec4', ( v: number[] ) => {\r\n v.push( 1 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec2', 'vec3', ( v: number[] ) => {\r\n v.push( 1 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec2', 'vec4', ( v: number[] ) => {\r\n v.push( 0, 1 );\r\n return v;\r\n } );\r\n\r\n this._nodeBackgroundOpacity = options.disableNodeOpacity ? 1.0 : this._nodeBackgroundOpacity;\r\n\r\n // Back pattern\r\n this._generatePattern();\r\n\r\n // Links\r\n\r\n this._domLinks = document.createElement( 'div' );\r\n this._domLinks.classList.add( 'lexgraphlinks' );\r\n this.root.appendChild( this._domLinks );\r\n\r\n // Nodes\r\n\r\n this._domNodes = document.createElement( 'div' );\r\n this._domNodes.classList.add( 'lexgraphnodes' );\r\n this.root.appendChild( this._domNodes );\r\n\r\n g.ge = this;\r\n }\r\n\r\n static getInstances()\r\n {\r\n return GraphEditor.__instances;\r\n }\r\n\r\n /**\r\n * Register a node class so it can be listed when the user wants to create a new one\r\n * @method registerCustomNode\r\n * @param {String} type: name of the node and path\r\n * @param {Class} baseClass class containing the structure of the custom node\r\n */\r\n\r\n static registerCustomNode( type: string, baseClass: any )\r\n {\r\n if ( !baseClass.prototype )\r\n {\r\n throw 'Cannot register a simple object, it must be a class with a prototype!';\r\n }\r\n\r\n // Get info from path\r\n const pos = type.lastIndexOf( '/' );\r\n\r\n baseClass.category = type.substring( 0, pos );\r\n baseClass.title = baseClass.title ?? type.substring( pos + 1 );\r\n baseClass.type = type;\r\n\r\n if ( !baseClass.prototype.onExecute )\r\n {\r\n console.warn( `GraphNode [${baseClass.title}] does not have a callback attached.` );\r\n }\r\n\r\n const prev = GraphEditor.NODE_TYPES[type];\r\n if ( prev )\r\n {\r\n console.warn( `Replacing node type [${type}]` );\r\n }\r\n\r\n GraphEditor.NODE_TYPES[type] = baseClass;\r\n\r\n // Some callbacks..\r\n\r\n if ( GraphEditor.onCustomNodeRegistered )\r\n {\r\n GraphEditor.onCustomNodeRegistered( type, baseClass );\r\n }\r\n\r\n if ( prev && GraphEditor.onNodeTypeReplaced )\r\n {\r\n GraphEditor.onNodeTypeReplaced( type, baseClass, prev );\r\n }\r\n }\r\n\r\n /**\r\n * Create a node of a given type with a name. The node is not attached to any graph yet.\r\n * @method createNode\r\n * @param {String} type full name of the node class. p.e. \"math/sin\"\r\n * @param {String} title a name to distinguish from other nodes\r\n * @param {Object} options Store node options\r\n */\r\n\r\n static addNode( type: string, title?: string, options: any = {} )\r\n {\r\n var baseClass: any = GraphEditor.NODE_TYPES[type];\r\n\r\n if ( !baseClass )\r\n {\r\n console.warn( `GraphNode type [${type}] not registered.` );\r\n return null;\r\n }\r\n\r\n title = title ?? baseClass.title;\r\n\r\n const node = new baseClass( title );\r\n\r\n if ( node.onCreate )\r\n {\r\n node.onCreate();\r\n }\r\n\r\n node.type = type;\r\n node.title = title;\r\n node.position = new vec2( 0, 0 );\r\n node.color = null;\r\n\r\n if ( baseClass.name == 'NodeFunction' )\r\n {\r\n node.gid = baseClass.gid;\r\n }\r\n\r\n // Extra options\r\n if ( options )\r\n {\r\n for ( var i in options )\r\n {\r\n node[i] = options[i];\r\n }\r\n }\r\n\r\n if ( node.onNodeCreated )\r\n {\r\n node.onNodeCreated();\r\n }\r\n\r\n return node;\r\n }\r\n\r\n /**\r\n * @method setGraph\r\n * @param {Graph} graph\r\n */\r\n\r\n setGraph( graph: Graph )\r\n {\r\n // Nothing to do, already there...\r\n if ( this.currentGraph && graph.id == this.currentGraph.id )\r\n {\r\n return;\r\n }\r\n\r\n this.clear();\r\n\r\n graph.id = graph.id ?? graph.constructor.name + '-' + LX.guidGenerator();\r\n\r\n this.graphs[graph.id] = graph;\r\n\r\n if ( !graph.nodes )\r\n {\r\n console.warn( 'Graph does not contain any node!' );\r\n return;\r\n }\r\n\r\n this.currentGraph = graph;\r\n\r\n this._updatePattern();\r\n\r\n for ( let node of graph.nodes )\r\n {\r\n this._createNodeDOM( node );\r\n }\r\n\r\n for ( let group of graph.groups )\r\n {\r\n const groupDom: any = this._createGroup( group );\r\n groupDom.querySelector( '.lexgraphgrouptitle' ).value = group.name;\r\n this._domNodes.prepend( groupDom );\r\n }\r\n\r\n for ( let linkId in graph.links )\r\n {\r\n const links = graph.links[linkId];\r\n\r\n for ( let link of links )\r\n {\r\n this._createLink( link );\r\n }\r\n }\r\n\r\n this._updateGraphName( graph.name );\r\n this._togglePropertiesDialog( false );\r\n }\r\n\r\n /**\r\n * @method loadGraph\r\n * @param {String} url\r\n * @param {Function} callback Function to call once the graph is loaded\r\n */\r\n\r\n loadGraph( url: string, callback?: ( g: Graph ) => void )\r\n {\r\n const onComplete = ( json: any ) => {\r\n let graph: Graph | GraphFunction = ( json.type == 'Graph' )\r\n ? this.addGraph( json )\r\n : this.addGraphFunction( json );\r\n\r\n if ( callback )\r\n {\r\n callback( graph );\r\n }\r\n };\r\n\r\n const onError = ( v: any ) => console.error( v );\r\n\r\n LX.requestJSON( url, onComplete, onError );\r\n }\r\n\r\n /**\r\n * @method addGraph\r\n * @param {Object} o Options to configure the graph\r\n */\r\n\r\n addGraph( o?: any )\r\n {\r\n let graph = new Graph();\r\n graph.editor = this;\r\n\r\n if ( o )\r\n {\r\n // Load functions first if any..\r\n\r\n for ( let fn of o.functions ?? [] )\r\n {\r\n this.addGraphFunction( fn );\r\n }\r\n\r\n graph.configure( o );\r\n }\r\n\r\n this.setGraph( graph );\r\n\r\n this._sidebar.add( graph.name, { icon: 'CircleNodes', className: graph.id, callback: () => {\r\n this.setGraph( graph );\r\n } } );\r\n this._sidebar.update();\r\n this._sidebar.select( graph.name );\r\n\r\n return graph;\r\n }\r\n\r\n /**\r\n * @method addGraphFunction\r\n * @param {Object} o Options to configure the graph\r\n */\r\n\r\n addGraphFunction( o?: any )\r\n {\r\n let func = new GraphFunction();\r\n func.editor = this;\r\n\r\n if ( o )\r\n {\r\n // Load other inner functions first if any..\r\n\r\n for ( let fn of o.functions ?? [] )\r\n {\r\n this.addGraphFunction( fn );\r\n }\r\n\r\n func.configure( o );\r\n }\r\n\r\n this.setGraph( func );\r\n\r\n // Add a new node to use this function..\r\n\r\n class NodeFunction extends GraphNode\r\n {\r\n static func: GraphFunction;\r\n static gid: string;\r\n\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n const func = NodeFunction.func;\r\n const value = func.getOutputData( this.getInput( 0 ) );\r\n this.setOutput( 0, value );\r\n }\r\n }\r\n\r\n NodeFunction.func = func;\r\n NodeFunction.gid = func.id;\r\n GraphEditor.registerCustomNode( 'function/' + func.name, NodeFunction );\r\n\r\n this._sidebar.add( func.name, { icon: 'Function', className: func.id, callback: () => {\r\n this.setGraph( func );\r\n } } );\r\n this._sidebar.update();\r\n this._sidebar.select( func.name );\r\n\r\n return func;\r\n }\r\n\r\n /**\r\n * @method clear\r\n */\r\n\r\n clear()\r\n {\r\n this._domNodes.innerHTML = '';\r\n this._domLinks.innerHTML = '';\r\n\r\n this.nodes = {};\r\n }\r\n\r\n setVariable( name: string, value: any )\r\n {\r\n this.variables[name] = value;\r\n }\r\n\r\n getVariable( name: string )\r\n {\r\n return this.variables[name];\r\n }\r\n\r\n propagateEventToAllNodes( eventName: string, params?: any )\r\n {\r\n if ( !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const nodes = this.currentGraph.nodes as any[];\r\n for ( let node of nodes )\r\n {\r\n if ( !node[eventName] )\r\n {\r\n continue;\r\n }\r\n\r\n node[eventName].apply( this, params );\r\n }\r\n }\r\n\r\n /**\r\n * @method addCastType\r\n * @param {String} type: Type to cast\r\n * @param {String} targetType: Types to be casted from original type\r\n * @param {Function} fn: Function to know how to cast\r\n */\r\n\r\n addCastType( type: string, targetType: string, fn: any )\r\n {\r\n this.supportedCastTypes[type + '@' + targetType] = fn;\r\n }\r\n\r\n /**\r\n * @method unSelectAll\r\n */\r\n\r\n unSelectAll( keepPropDialog: boolean = false )\r\n {\r\n this._domNodes.querySelectorAll( '.lexgraphnode' ).forEach( ( v ) => v.classList.remove( 'selected' ) );\r\n\r\n this.selectedNodes.length = 0;\r\n\r\n if ( !keepPropDialog )\r\n {\r\n this._togglePropertiesDialog( false );\r\n }\r\n }\r\n\r\n _createNodeDOM( node: any )\r\n {\r\n node.editor = this;\r\n node.graphID = this.currentGraph?.id;\r\n\r\n var nodeContainer = document.createElement( 'div' );\r\n nodeContainer.classList.add( 'lexgraphnode' );\r\n nodeContainer.style.left = '0';\r\n nodeContainer.style.top = '0';\r\n\r\n this._translateNode( nodeContainer, node.position );\r\n\r\n var color;\r\n\r\n // Get color from type if color if not manually specified\r\n if ( node.type && GraphEditor.NODE_TYPES[node.type] )\r\n {\r\n const category = node.constructor.category;\r\n nodeContainer.classList.add( category );\r\n }\r\n else\r\n {\r\n const pos = node.type.lastIndexOf( '/' );\r\n const category = node.type.substring( 0, pos );\r\n nodeContainer.classList.add( category );\r\n }\r\n\r\n // Update with manual color\r\n\r\n color = node.color ?? color;\r\n\r\n if ( color )\r\n {\r\n // RGB\r\n if ( color.constructor == Array )\r\n {\r\n color = color.join( ',' );\r\n }\r\n // Hex color..\r\n else\r\n {\r\n color = LX.hexToRgb( color );\r\n color.forEach( ( v: number, i: number ) => color[i] = v * 255 );\r\n }\r\n\r\n nodeContainer.style.backgroundColor = 'rgba(' + color + ', ' + this._nodeBackgroundOpacity + ')';\r\n }\r\n\r\n nodeContainer.addEventListener( 'mousedown', ( e: MouseEvent ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n\r\n if ( e.altKey )\r\n {\r\n this._unSelectNode( nodeContainer );\r\n }\r\n else\r\n {\r\n if ( this.selectedNodes.length > 1 && ( !e.ctrlKey && !e.shiftKey ) )\r\n {\r\n this.unSelectAll( true );\r\n }\r\n\r\n if ( !nodeContainer.classList.contains( 'selected' ) )\r\n {\r\n this._selectNode( nodeContainer, e.ctrlKey || e.shiftKey );\r\n }\r\n }\r\n } );\r\n\r\n nodeContainer.addEventListener( 'contextmenu', ( e ) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n LX.addContextMenu( null, e, ( m: typeof ContextMenu ) => {\r\n m.add( 'Copy', () => {\r\n this._clipboardData = {\r\n id: node.id,\r\n gid: this.currentGraph?.id\r\n };\r\n } );\r\n\r\n // TODO\r\n // m.add( \"Paste\", () => {\r\n\r\n // } );\r\n\r\n m.add( '' );\r\n\r\n m.add( 'Delete', () => {\r\n this._deleteNode( nodeContainer.dataset['id'] as string );\r\n } );\r\n } );\r\n } );\r\n\r\n nodeContainer.addEventListener( 'dblclick', ( e ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n\r\n // Open graph function..\r\n if ( node.constructor.func )\r\n {\r\n this._sidebar.select( node.constructor.func.name );\r\n }\r\n } );\r\n\r\n // Title header\r\n var nodeHeader = document.createElement( 'div' );\r\n nodeHeader.classList.add( 'lexgraphnodeheader' );\r\n nodeHeader.innerText = node.title;\r\n nodeContainer.appendChild( nodeHeader );\r\n\r\n // Properties\r\n // if( node.properties.length )\r\n // {\r\n // var nodeProperties = document.createElement( 'div' );\r\n // nodeProperties.classList.add( 'lexgraphnodeproperties' );\r\n\r\n // for( let p of node.properties )\r\n // {\r\n // var panel = new LX.Panel();\r\n\r\n // p.signal = \"@\" + LX.guidGenerator() + node.title;\r\n\r\n // switch( p.type )\r\n // {\r\n // case 'float':\r\n // case 'int':\r\n // panel.addNumber( p.name, p.value, (v) => p.value = v, { signal: p.signal } );\r\n // break;\r\n // case 'string':\r\n // panel.addText( p.name, p.value, (v) => p.value = v, { signal: p.signal } );\r\n // break;\r\n // }\r\n\r\n // // var prop = document.createElement( 'div' );\r\n // // prop.innerText = p.type;\r\n // // prop.classList.add( 'lexgraphnodeproperty' );\r\n // nodeProperties.appendChild( panel.root );\r\n // }\r\n\r\n // nodeContainer.appendChild( nodeProperties );\r\n // }\r\n\r\n // Inputs and outputs\r\n var nodeIO = document.createElement( 'div' );\r\n nodeIO.classList.add( 'lexgraphnodeios' );\r\n nodeContainer.appendChild( nodeIO );\r\n\r\n const hasInputs = node.inputs && node.inputs.length;\r\n const hasOutputs = node.outputs && node.outputs.length;\r\n\r\n // Inputs\r\n if ( hasInputs )\r\n {\r\n const nodeInputs = document.createElement( 'div' );\r\n nodeInputs.classList.add( 'lexgraphnodeinputs' );\r\n nodeInputs.style.width = hasOutputs ? '50%' : '100%';\r\n nodeIO.appendChild( nodeInputs );\r\n\r\n for ( let i of node.inputs )\r\n {\r\n if ( !i.type )\r\n {\r\n console.warn( `Missing type for node [${node.title}], skipping...` );\r\n continue;\r\n }\r\n\r\n var input = document.createElement( 'div' );\r\n input.className = 'lexgraphnodeio ioinput';\r\n input.dataset['index'] = nodeInputs.childElementCount.toString();\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type input ' + i.type;\r\n type.dataset['type'] = i.type;\r\n type.innerHTML = '<span>' + i.type[0].toUpperCase() + '</span>';\r\n input.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc input ' + i.type;\r\n typeDesc.innerHTML = i.type;\r\n input.appendChild( typeDesc );\r\n\r\n if ( i.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = i.name;\r\n input.appendChild( name );\r\n }\r\n\r\n nodeInputs.appendChild( input );\r\n }\r\n }\r\n\r\n // Outputs\r\n if ( hasOutputs )\r\n {\r\n const nodeOutputs = document.createElement( 'div' );\r\n nodeOutputs.classList.add( 'lexgraphnodeoutputs' );\r\n nodeOutputs.style.width = hasInputs ? '50%' : '100%';\r\n nodeIO.appendChild( nodeOutputs );\r\n\r\n for ( let o of node.outputs )\r\n {\r\n if ( !o.type )\r\n {\r\n console.warn( `Missing type for node [${node.title}], skipping...` );\r\n }\r\n\r\n var output = document.createElement( 'div' );\r\n output.className = 'lexgraphnodeio iooutput';\r\n output.dataset['index'] = nodeOutputs.childElementCount.toString();\r\n\r\n if ( o.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = o.name;\r\n output.appendChild( name );\r\n }\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type output ' + o.type;\r\n type.dataset['type'] = o.type;\r\n type.innerHTML = '<span>' + o.type[0].toUpperCase() + '</span>';\r\n output.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc output ' + o.type;\r\n typeDesc.innerHTML = o.type;\r\n output.appendChild( typeDesc );\r\n\r\n nodeOutputs.appendChild( output );\r\n }\r\n }\r\n\r\n // Move nodes\r\n\r\n LX.makeDraggable( nodeContainer, {\r\n onMove: this._onMoveNodes.bind( this ),\r\n onDragStart: this._onDragNode.bind( this )\r\n } );\r\n\r\n this._addNodeIOEvents( nodeContainer );\r\n\r\n const id = node.id ?? node.title.toLowerCase().replaceAll( /\\s/g, '-' ) + '-' + LX.guidGenerator();\r\n this.nodes[id] = { data: node, dom: nodeContainer };\r\n\r\n node.id = id;\r\n nodeContainer.dataset['id'] = id;\r\n\r\n this._domNodes.appendChild( nodeContainer );\r\n\r\n // Only 1 main per graph!\r\n if ( node.title == 'Main' )\r\n {\r\n this.main = id;\r\n }\r\n\r\n node.size = new vec2( nodeContainer.offsetWidth, nodeContainer.offsetHeight );\r\n\r\n node.resizeObserver = new ResizeObserver( ( entries ) => {\r\n for ( const entry of entries )\r\n {\r\n const bb = entry.contentRect;\r\n if ( !bb.width || !bb.height )\r\n {\r\n continue;\r\n }\r\n node.size = new vec2( nodeContainer.offsetWidth, nodeContainer.offsetHeight );\r\n }\r\n } );\r\n\r\n node.resizeObserver.observe( nodeContainer );\r\n\r\n return nodeContainer;\r\n }\r\n\r\n _updateNodeDOMIOs( dom: HTMLElement, node: GraphNode )\r\n {\r\n // Inputs and outputs\r\n var nodeIO = dom.querySelector( '.lexgraphnodeios' );\r\n\r\n const hasInputs = node.inputs && node.inputs.length;\r\n const hasOutputs = node.outputs && node.outputs.length;\r\n\r\n // Inputs\r\n if ( hasInputs )\r\n {\r\n const nodeInputs = nodeIO?.querySelector( '.lexgraphnodeinputs' )!;\r\n nodeInputs.innerHTML = '';\r\n\r\n for ( let i of node.inputs )\r\n {\r\n if ( !i.type )\r\n {\r\n console.warn( `Missing type for node [${node.constructor.name}], skipping...` );\r\n continue;\r\n }\r\n\r\n var input = document.createElement( 'div' );\r\n input.className = 'lexgraphnodeio ioinput';\r\n input.dataset['index'] = nodeInputs.childElementCount.toString();\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type input ' + i.type;\r\n type.innerHTML = '<span>' + i.type[0].toUpperCase() + '</span>';\r\n input.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc input ' + i.type;\r\n typeDesc.innerHTML = i.type;\r\n input.appendChild( typeDesc );\r\n\r\n if ( i.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = i.name;\r\n input.appendChild( name );\r\n }\r\n\r\n nodeInputs.appendChild( input );\r\n }\r\n }\r\n\r\n // Outputs\r\n if ( hasOutputs )\r\n {\r\n const nodeOutputs = nodeIO?.querySelector( '.lexgraphnodeoutputs' )!;\r\n nodeOutputs.innerHTML = '';\r\n\r\n for ( let o of node.outputs )\r\n {\r\n if ( !o.type )\r\n {\r\n console.warn( `Missing type for node [${node.constructor.name}], skipping...` );\r\n }\r\n\r\n var output = document.createElement( 'div' );\r\n output.className = 'lexgraphnodeio iooutput';\r\n output.dataset['index'] = nodeOutputs.childElementCount.toString();\r\n\r\n if ( o.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = o.name;\r\n output.appendChild( name );\r\n }\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type output ' + o.type;\r\n type.innerHTML = '<span>' + o.type[0].toUpperCase() + '</span>';\r\n output.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc output ' + o.type;\r\n typeDesc.innerHTML = o.type;\r\n output.appendChild( typeDesc );\r\n\r\n nodeOutputs.appendChild( output );\r\n }\r\n }\r\n\r\n this._addNodeIOEvents( dom );\r\n }\r\n\r\n _addNodeIOEvents( nodeContainer: HTMLElement )\r\n {\r\n const nodeIO = nodeContainer.querySelector( '.lexgraphnodeios' );\r\n\r\n // Manage links\r\n\r\n nodeIO?.querySelectorAll( '.lexgraphnodeio' ).forEach( ( el: any ) => {\r\n el.addEventListener( 'mousedown', ( e: MouseEvent ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n\r\n this._lastMouseDown = LX.getTime();\r\n\r\n this._generatingLink = {\r\n index: parseInt( el.dataset['index'] ),\r\n io: el,\r\n ioType: el.classList.contains( 'ioinput' ) ? GraphEditor.NODE_IO_INPUT : GraphEditor.NODE_IO_OUTPUT,\r\n domEl: nodeContainer\r\n };\r\n\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n } );\r\n\r\n el.addEventListener( 'mouseup', ( e: MouseEvent ) => {\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n // Single click..\r\n if ( ( LX.getTime() - this._lastMouseDown ) < 200 )\r\n {\r\n delete this._generatingLink;\r\n return;\r\n }\r\n\r\n if ( this._generatingLink )\r\n {\r\n // Check for IO\r\n if ( !this._onLink( e ) )\r\n {\r\n // Delete entire SVG if not a successful connection..\r\n LX.deleteElement( this._generatingLink.path ? this._generatingLink.path.parentElement : null );\r\n }\r\n\r\n delete this._generatingLink;\r\n }\r\n } );\r\n\r\n el.addEventListener( 'click', ( e: MouseEvent ) => {\r\n if ( !el.links )\r\n {\r\n return;\r\n }\r\n\r\n const nodeId = nodeContainer.dataset['id'] as string;\r\n this._deleteLinks( nodeId, el );\r\n } );\r\n } );\r\n }\r\n\r\n _getAllDOMNodes( includeGroups: boolean = false, exclude?: HTMLElement )\r\n {\r\n var elements = null;\r\n\r\n if ( includeGroups )\r\n {\r\n elements = Array.from( this._domNodes.childNodes );\r\n }\r\n else\r\n {\r\n elements = Array.from( this._domNodes.childNodes ).filter( ( v: any ) =>\r\n v.classList.contains( 'lexgraphnode' )\r\n );\r\n }\r\n\r\n if ( exclude )\r\n {\r\n elements = elements.filter( ( v ) => v != exclude );\r\n }\r\n\r\n return elements;\r\n }\r\n\r\n _onMoveNodes( target: HTMLElement )\r\n {\r\n let dT = this._snapToGrid ? this._snappedDeltaMousePosition : this._deltaMousePosition;\r\n dT.div( this.currentGraph?.scale, dT );\r\n\r\n for ( let nodeId of this.selectedNodes )\r\n {\r\n const el = this._getNodeDOMElement( nodeId );\r\n\r\n this._translateNode( el, dT );\r\n\r\n this._updateNodeLinks( nodeId );\r\n }\r\n }\r\n\r\n _onDragNode( target: HTMLElement, e: DragEvent )\r\n {\r\n if ( !e.shiftKey )\r\n {\r\n return;\r\n }\r\n\r\n this._cloneNodes();\r\n }\r\n\r\n _onMoveGroup( target: any )\r\n {\r\n // Move nodes inside the group\r\n\r\n const groupNodeIds = target.nodes;\r\n\r\n if ( !groupNodeIds )\r\n {\r\n return;\r\n }\r\n\r\n let dT = this._snapToGrid ? this._snappedDeltaMousePosition : this._deltaMousePosition;\r\n dT.div( this.currentGraph?.scale, dT );\r\n\r\n this._translateNode( target, dT );\r\n\r\n for ( let nodeId of groupNodeIds )\r\n {\r\n const isGroup = nodeId.constructor !== String;\r\n\r\n const el = isGroup ? nodeId : this._getNodeDOMElement( nodeId as string );\r\n\r\n this._translateNode( el, dT, !isGroup );\r\n\r\n if ( !isGroup )\r\n {\r\n this._updateNodeLinks( nodeId as string );\r\n }\r\n }\r\n }\r\n\r\n _onDragGroup( target: any )\r\n {\r\n // Get nodes inside the group to be moved\r\n\r\n const group_bb = this._getBoundingFromGroup( target );\r\n\r\n const groupNodeIds = [];\r\n\r\n for ( let dom of ( this._getAllDOMNodes( true, target ) as HTMLElement[] ) )\r\n {\r\n const x = parseFloat( dom.style.left );\r\n const y = parseFloat( dom.style.top );\r\n const node_bb = new BoundingBox( new vec2( x, y ), new vec2( dom.offsetWidth - 6, dom.offsetHeight - 6 ) );\r\n\r\n if ( !group_bb.inside( node_bb ) )\r\n {\r\n continue;\r\n }\r\n\r\n groupNodeIds.push( dom.dataset['id'] ?? dom );\r\n }\r\n\r\n target.nodes = groupNodeIds;\r\n }\r\n\r\n _selectNode( dom: HTMLElement, multiSelection: boolean = false, forceOrder: boolean = true )\r\n {\r\n if ( !multiSelection )\r\n {\r\n this.unSelectAll( true );\r\n }\r\n\r\n dom.classList.add( 'selected' );\r\n\r\n const id = dom.dataset['id'] as string;\r\n\r\n this.selectedNodes.push( id );\r\n\r\n if ( forceOrder )\r\n {\r\n // Reorder nodes to draw on top..\r\n this._domNodes.appendChild( dom );\r\n }\r\n\r\n const node = this.nodes[id].data;\r\n\r\n this.propertiesDialog.setTitle( node.title );\r\n\r\n var panel = this.propertiesDialog.panel;\r\n panel.clear();\r\n\r\n // Add description\r\n if ( node.constructor.description )\r\n {\r\n panel.addText( null, node.constructor.description, null, { disabled: true } );\r\n }\r\n\r\n // Allow change name if input\r\n if ( node.constructor.category == 'inputs' )\r\n {\r\n panel.addText( 'Name', node.title, ( v: string ) => {\r\n node.title = v;\r\n const header: any = dom.querySelector( '.lexgraphnodeheader' );\r\n header.innerText = v;\r\n } );\r\n }\r\n\r\n for ( let p of node.properties )\r\n {\r\n switch ( p.type )\r\n {\r\n case 'float':\r\n case 'int':\r\n panel.addNumber( p.name, p.value, ( v: number ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'string':\r\n panel.addText( p.name, p.value, ( v: string ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'vec2':\r\n panel.addVector2( p.name, p.value, ( v: number[] ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'vec3':\r\n panel.addVector3( p.name, p.value, ( v: number[] ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'vec4':\r\n panel.addVector4( p.name, p.value, ( v: number[] ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'select':\r\n panel.addSelect( p.name, p.options, p.value, ( v: any ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'array':\r\n panel.addArray( p.name, p.value, ( v: any[] ) => {\r\n p.value = v;\r\n if ( node.type == 'function/Input' )\r\n {\r\n node.setOutputs( v );\r\n this._updateNodeDOMIOs( dom, node );\r\n }\r\n }, { innerValues: p.options } );\r\n break;\r\n }\r\n }\r\n\r\n this._togglePropertiesDialog( true );\r\n }\r\n\r\n _unSelectNode( dom: HTMLElement )\r\n {\r\n dom.classList.remove( 'selected' );\r\n\r\n // Delete from selected..\r\n const idx = this.selectedNodes.indexOf( dom.dataset['id'] );\r\n this.selectedNodes.splice( idx, 1 );\r\n\r\n if ( !this.selectedNodes.length )\r\n {\r\n this._togglePropertiesDialog( false );\r\n }\r\n }\r\n\r\n _translateNode( dom: any, deltaTranslation: typeof vec2, updateBasePosition: boolean = true )\r\n {\r\n const translation = deltaTranslation.add(\r\n new vec2( parseFloat( dom.style.left ), parseFloat( dom.style.top ) )\r\n );\r\n\r\n if ( this._snapToGrid && dom.mustSnap )\r\n {\r\n const snapSize = this._patternSize.x * this._snapValue * this._snapValue;\r\n translation.x = Math.floor( translation.x / snapSize ) * snapSize;\r\n translation.y = Math.floor( translation.y / snapSize ) * snapSize;\r\n dom.mustSnap = false;\r\n }\r\n\r\n dom.style.left = ( translation.x ) + 'px';\r\n dom.style.top = ( translation.y ) + 'px';\r\n\r\n // Update base node position..\r\n if ( updateBasePosition && dom.dataset['id'] )\r\n {\r\n let baseNode = this.nodes[dom.dataset['id']];\r\n baseNode.data.position = translation;\r\n }\r\n }\r\n\r\n _deleteNode( nodeId: string )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const nodeInfo = this.nodes[nodeId];\r\n const node = nodeInfo.data;\r\n const el = nodeInfo.dom;\r\n\r\n console.assert( el );\r\n\r\n if ( node.constructor.blockDelete )\r\n {\r\n console.warn( `Can't delete node!` );\r\n return;\r\n }\r\n\r\n LX.deleteElement( el );\r\n\r\n // Delete from the editor\r\n\r\n delete this.nodes[nodeId];\r\n\r\n // Delete from the graph data\r\n\r\n const idx = this.currentGraph.nodes.findIndex( ( v ) => v.id === nodeId );\r\n console.assert( idx >= 0 );\r\n this.currentGraph.nodes.splice( idx, 1 );\r\n\r\n // Delete connected links..\r\n\r\n for ( let key in this.currentGraph.links )\r\n {\r\n if ( !key.includes( nodeId ) )\r\n {\r\n continue;\r\n }\r\n\r\n const aIdx = key.indexOf( '@' );\r\n const targetIsInput = key.substring( aIdx + 1 ) != nodeId;\r\n\r\n // Remove the connection from the other before deleting..\r\n\r\n const numLinks = this.currentGraph.links[key].length;\r\n\r\n for ( var i = 0; i < numLinks; ++i )\r\n {\r\n var link = this.currentGraph.links[key][i];\r\n\r\n LX.deleteElement( link.path.parentElement );\r\n\r\n const targetNodeId = targetIsInput ? link.inputNode : link.outputNode;\r\n\r\n const targetNodeDOM = this._getNodeDOMElement( targetNodeId );\r\n const ios = targetNodeDOM.querySelector(\r\n targetIsInput ? '.lexgraphnodeinputs' : '.lexgraphnodeoutputs'\r\n );\r\n const io = ios.childNodes[targetIsInput ? link.inputIdx : link.outputIdx];\r\n\r\n const ioIndex = targetIsInput ? link.outputIdx : link.inputIdx;\r\n const nodelinkidx = io.links[ioIndex].indexOf( nodeId );\r\n io.links[ioIndex].splice( nodelinkidx, 1 );\r\n\r\n // Unique link, so it's done..\r\n if ( targetIsInput )\r\n {\r\n delete io.dataset['active'];\r\n }\r\n // Check if any link left in case of output\r\n else\r\n {\r\n var active = false;\r\n for ( var links of io.links )\r\n {\r\n if ( !links )\r\n {\r\n continue;\r\n }\r\n for ( var j of links )\r\n {\r\n active = active || ( !!j );\r\n }\r\n }\r\n if ( !active )\r\n {\r\n delete io.dataset['active'];\r\n }\r\n }\r\n }\r\n\r\n delete this.currentGraph.links[key];\r\n }\r\n }\r\n\r\n _deleteGroup( groupId: string )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const dom = this.groups[groupId];\r\n LX.deleteElement( dom );\r\n\r\n // Delete from the editor\r\n\r\n delete this.groups[groupId];\r\n\r\n // Delete from the graph data\r\n\r\n const idx = this.currentGraph.groups.findIndex( ( v ) => v.id === groupId );\r\n console.assert( idx >= 0 );\r\n this.currentGraph.groups.splice( idx, 1 );\r\n }\r\n\r\n _cloneNode( nodeId: string, graphId?: string, position?: typeof vec2 )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const graph = this.graphs[graphId ?? this.currentGraph.id];\r\n\r\n const nodeData = graph.getNodeById( nodeId );\r\n\r\n if ( !nodeData )\r\n {\r\n return;\r\n }\r\n\r\n const el = this._getNodeDOMElement( nodeId );\r\n const newNode = GraphEditor.addNode( nodeData.type );\r\n newNode.properties = LX.deepCopy( nodeData.properties );\r\n\r\n const newDom = this._createNodeDOM( newNode );\r\n\r\n this._translateNode( newDom, position ?? this._getNodePosition( el ) );\r\n\r\n this._selectNode( newDom, true );\r\n\r\n this.currentGraph.nodes.push( newNode );\r\n }\r\n\r\n _cloneNodes()\r\n {\r\n // Clone all selected nodes\r\n const selectedIds = LX.deepCopy( this.selectedNodes );\r\n\r\n this.unSelectAll();\r\n\r\n for ( let nodeId of selectedIds )\r\n {\r\n this._cloneNode( nodeId );\r\n }\r\n }\r\n\r\n // This is in pattern space!\r\n _getNodePosition( dom: HTMLElement )\r\n {\r\n return new vec2( parseFloat( dom.style.left ), parseFloat( dom.style.top ) );\r\n }\r\n\r\n _getNodeDOMElement( nodeId: string )\r\n {\r\n return this.nodes[nodeId] ? this.nodes[nodeId].dom : null;\r\n }\r\n\r\n _getLinks( nodeSrcId: string, nodeDstId: string )\r\n {\r\n const str = nodeSrcId + '@' + nodeDstId;\r\n return this.currentGraph?.links[str];\r\n }\r\n\r\n _deleteLinks( nodeId: string, io: any )\r\n {\r\n const isInput = io.classList.contains( 'ioinput' );\r\n const srcIndex = parseInt( io.dataset['index'] );\r\n\r\n if ( isInput )\r\n { // Only one \"link to output\" to delete\r\n let targetIndex: number = -1;\r\n\r\n const targets = io.links.filter( ( v: any, i: number ) => {\r\n targetIndex = i;\r\n return v !== undefined;\r\n } )[0];\r\n const targetId = targets[0];\r\n\r\n // It has been deleted..\r\n if ( !targetId )\r\n {\r\n return;\r\n }\r\n\r\n var links = this._getLinks( targetId, nodeId );\r\n\r\n var linkIdx = links.findIndex( ( i: any ) => ( i.inputIdx == srcIndex && i.outputIdx == targetIndex ) );\r\n LX.deleteElement( links[linkIdx].path.parentElement );\r\n links.splice( linkIdx, 1 );\r\n\r\n // Input has no longer any connected link\r\n\r\n delete io.links;\r\n delete io.dataset['active'];\r\n\r\n // Remove a connection from the target connections\r\n\r\n const targetDOM = this._getNodeDOMElement( targetId );\r\n const ios = targetDOM.querySelector( '.lexgraphnodeoutputs' );\r\n const targetIO = ios.childNodes[targetIndex];\r\n\r\n const idx = targetIO.links[srcIndex].findIndex( ( v: any ) => v == nodeId );\r\n targetIO.links[srcIndex].splice( idx, 1 );\r\n\r\n let active = false;\r\n\r\n for ( var ls of targetIO.links )\r\n {\r\n if ( !ls ) continue;\r\n // Check links left per io\r\n active = active || ls.reduce( ( c: any ) => c !== undefined, 0 );\r\n }\r\n\r\n if ( !active )\r\n {\r\n delete targetIO.links;\r\n delete targetIO.dataset['active'];\r\n }\r\n }\r\n // Delete ALL \"to input links\"\r\n else\r\n {\r\n const numLinks = io.links.length;\r\n\r\n for ( let targetIndex = 0; targetIndex < numLinks; ++targetIndex )\r\n {\r\n const targets = io.links[targetIndex];\r\n\r\n if ( !targets )\r\n {\r\n continue;\r\n }\r\n\r\n for ( let it = targets.length - 1; it >= 0; --it )\r\n {\r\n const targetId = targets[it];\r\n var links = this._getLinks( nodeId, targetId );\r\n\r\n var linkIdx = links.findIndex( (\r\n i: any\r\n ) => ( i.inputIdx == targetIndex && i.outputIdx == srcIndex ) );\r\n LX.deleteElement( links[linkIdx].path.parentElement );\r\n links.splice( linkIdx, 1 );\r\n\r\n // Remove a connection from the output connections\r\n\r\n io.links[targetIndex].splice( it, 1 );\r\n\r\n // Input has no longer any connected link\r\n\r\n const targetDOM = this._getNodeDOMElement( targetId );\r\n const ios = targetDOM.querySelector( '.lexgraphnodeinputs' );\r\n const targetIO = ios.childNodes[targetIndex];\r\n\r\n delete targetIO.links;\r\n delete targetIO.dataset['active'];\r\n }\r\n }\r\n\r\n delete io.links;\r\n delete io.dataset['active'];\r\n }\r\n }\r\n\r\n _processFocus( active: boolean = false )\r\n {\r\n this.isFocused = active;\r\n }\r\n\r\n _processKeyDown( e: KeyboardEvent )\r\n {\r\n // Prevent processing keys on inputs and others\r\n if ( document.activeElement != this.root )\r\n {\r\n return;\r\n }\r\n\r\n const detail: any = e.detail;\r\n var key = e.key ?? detail.key;\r\n\r\n switch ( key )\r\n {\r\n case 'Escape':\r\n this.unSelectAll();\r\n break;\r\n case 'Delete':\r\n case 'Backspace':\r\n e.preventDefault();\r\n this._deleteSelection( e );\r\n break;\r\n case 'g':\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._createGroup();\r\n }\r\n break;\r\n case 'y':\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._doRedo();\r\n }\r\n break;\r\n case 'z':\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._doUndo();\r\n }\r\n break;\r\n }\r\n\r\n this.keys[key] = true;\r\n }\r\n\r\n _processKeyUp( e: KeyboardEvent )\r\n {\r\n // Prevent processing keys on inputs and others\r\n if ( document.activeElement != this.root )\r\n {\r\n return;\r\n }\r\n\r\n const detail: any = e.detail;\r\n const key = e.key ?? detail.key;\r\n\r\n delete this.keys[key];\r\n }\r\n\r\n _processMouse( e: any )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const rect = this.root.getBoundingClientRect();\r\n\r\n this._mousePosition = new vec2( e.clientX - rect.x, e.clientY - rect.y );\r\n\r\n const snapPosition = new vec2( this._mousePosition.x, this._mousePosition.y );\r\n\r\n if ( this._snapToGrid )\r\n {\r\n const snapSize = this._patternSize.x * this._snapValue * this.currentGraph.scale;\r\n snapPosition.x = Math.floor( snapPosition.x / snapSize ) * snapSize;\r\n snapPosition.y = Math.floor( snapPosition.y / snapSize ) * snapSize;\r\n this._snappedDeltaMousePosition = snapPosition.sub( this._lastSnappedMousePosition );\r\n }\r\n\r\n this._deltaMousePosition = this._mousePosition.sub( this._lastMousePosition );\r\n\r\n if ( e.type == 'mousedown' )\r\n {\r\n this._lastMouseDown = LX.getTime();\r\n\r\n this._processMouseDown( e );\r\n }\r\n else if ( e.type == 'mouseup' )\r\n {\r\n if ( ( LX.getTime() - this._lastMouseDown ) < 200 )\r\n {\r\n this._processClick( e );\r\n }\r\n\r\n this._processMouseUp( e );\r\n }\r\n else if ( e.type == 'mousemove' )\r\n {\r\n this._processMouseMove( e );\r\n }\r\n else if ( e.type == 'click' )\r\n { // trick\r\n switch ( e.detail )\r\n {\r\n case LX.MOUSE_DOUBLE_CLICK:\r\n break;\r\n case LX.MOUSE_TRIPLE_CLICK:\r\n break;\r\n }\r\n }\r\n else if ( e.type == 'mousewheel' )\r\n {\r\n e.preventDefault();\r\n this._processWheel( e );\r\n }\r\n else if ( e.type == 'contextmenu' )\r\n {\r\n e.preventDefault();\r\n\r\n if ( ( LX.getTime() - this._lastMouseDown ) < 300 )\r\n {\r\n this._processContextMenu( e );\r\n }\r\n }\r\n else if ( e.type == 'mouseleave' )\r\n {\r\n if ( this._generatingLink )\r\n {\r\n this._processMouseUp( e );\r\n }\r\n }\r\n\r\n if ( this._snapToGrid )\r\n {\r\n this._lastSnappedMousePosition = snapPosition;\r\n }\r\n\r\n this._lastMousePosition = this._mousePosition;\r\n }\r\n\r\n _processClick( e: MouseEvent )\r\n {\r\n const target: any = e.target;\r\n if ( target.classList.contains( 'lexgraphnodes' ) || target.classList.contains( 'lexgraphgroup' ) )\r\n {\r\n this._processBackgroundClick( e );\r\n return;\r\n }\r\n }\r\n\r\n _processBackgroundClick( e: MouseEvent )\r\n {\r\n this.unSelectAll();\r\n }\r\n\r\n _processMouseDown( e: MouseEvent )\r\n {\r\n const target: any = e.target;\r\n\r\n // Don't box select over a node..\r\n if ( !target.classList.contains( 'lexgraphnode' ) && !target.classList.contains( 'lexgraphgroup' )\r\n && e.button == LX.MOUSE_LEFT_CLICK )\r\n {\r\n this._boxSelecting = this._mousePosition;\r\n this._boxSelectRemoving = e.altKey;\r\n }\r\n }\r\n\r\n _processMouseUp( e: MouseEvent )\r\n {\r\n // It the event reaches this, the link isn't valid..\r\n if ( this._generatingLink )\r\n {\r\n const linkInfo = Object.assign( {}, this._generatingLink );\r\n\r\n // Delete old link\r\n LX.deleteElement( this._generatingLink.path ? this._generatingLink.path.parentElement : null );\r\n delete this._generatingLink;\r\n\r\n // Open contextmenu to auto-connect something..\r\n this._processContextMenu( e, linkInfo );\r\n }\r\n else if ( this._boxSelecting )\r\n {\r\n if ( !e.ctrlKey && !e.altKey )\r\n {\r\n this.unSelectAll();\r\n }\r\n\r\n this._selectNodesInBox( this._boxSelecting, this._mousePosition, e.altKey );\r\n\r\n LX.deleteElement( this._currentBoxSelectionSVG );\r\n\r\n delete this._currentBoxSelectionSVG;\r\n delete this._boxSelecting;\r\n delete this._boxSelectRemoving;\r\n }\r\n }\r\n\r\n _processMouseMove( e: MouseEvent )\r\n {\r\n if ( !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const rightPressed = e.which == 3;\r\n\r\n if ( rightPressed )\r\n {\r\n this.currentGraph.translation.add( this._deltaMousePosition.div( this.currentGraph.scale ),\r\n this.currentGraph.translation );\r\n\r\n this._updatePattern();\r\n\r\n return;\r\n }\r\n else if ( this._generatingLink )\r\n {\r\n this._updatePreviewLink( e );\r\n\r\n return;\r\n }\r\n else if ( this._boxSelecting )\r\n {\r\n this._drawBoxSelection( e );\r\n\r\n return;\r\n }\r\n }\r\n\r\n _processWheel( e: WheelEvent )\r\n {\r\n if ( this._boxSelecting || !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n // Compute zoom center in pattern space using current scale\r\n\r\n const rect = this.root.getBoundingClientRect();\r\n const zoomCenter = this._mousePosition ?? new vec2( rect.width * 0.5, rect.height * 0.5 );\r\n\r\n const center = this._getPatternPosition( zoomCenter );\r\n\r\n const delta = e.deltaY;\r\n\r\n if ( delta > 0.0 ) this.currentGraph.scale *= 0.9;\r\n else this.currentGraph.scale *= 1.0 / 0.9;\r\n\r\n this.currentGraph.scale = LX.clamp( this.currentGraph.scale, GraphEditor.MIN_SCALE, GraphEditor.MAX_SCALE );\r\n\r\n // Compute zoom center in pattern space using new scale\r\n // and get delta..\r\n\r\n const newCenter = this._getPatternPosition( zoomCenter );\r\n\r\n const deltaCenter = newCenter.sub( center );\r\n\r\n this.currentGraph.translation.add( deltaCenter, this.currentGraph.translation );\r\n\r\n this._updatePattern();\r\n }\r\n\r\n _processContextMenu( e: any, autoConnect?: any )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n LX.addContextMenu( null, e, ( m: typeof ContextMenu ) => {\r\n var eventPosition: any = null;\r\n\r\n if ( e )\r\n {\r\n const rect = this.root.getBoundingClientRect();\r\n\r\n const localPosition = new vec2( e.clientX - rect.x, e.clientY - rect.y );\r\n\r\n eventPosition = this._getPatternPosition( localPosition );\r\n }\r\n\r\n if ( this._clipboardData )\r\n {\r\n m.add( 'Paste', () => {\r\n const nodeId = this._clipboardData.id;\r\n const graphId = this._clipboardData.gid;\r\n\r\n this._cloneNode( nodeId, graphId, eventPosition );\r\n } );\r\n m.add( '' );\r\n }\r\n\r\n for ( let type in GraphEditor.NODE_TYPES )\r\n {\r\n const baseClass: any = GraphEditor.NODE_TYPES[type];\r\n\r\n if ( baseClass.blockAdd )\r\n {\r\n continue;\r\n }\r\n\r\n m.add( type, () => {\r\n const newNode = GraphEditor.addNode( type );\r\n\r\n const dom: any = this._createNodeDOM( newNode );\r\n\r\n if ( this._snapToGrid )\r\n {\r\n dom.mustSnap = true;\r\n }\r\n\r\n if ( eventPosition )\r\n {\r\n this._translateNode( dom, eventPosition );\r\n }\r\n\r\n this.currentGraph?.nodes.push( newNode );\r\n\r\n if ( autoConnect && newNode.inputs.length )\r\n {\r\n const srcId = autoConnect.domEl.dataset['id'];\r\n const srcType = autoConnect.io.childNodes[autoConnect.index].dataset['type'];\r\n const srcIsInput = autoConnect.ioType == GraphEditor.NODE_IO_INPUT;\r\n\r\n const newLink = {\r\n inputNode: srcIsInput ? srcId : newNode.id,\r\n inputIdx: srcIsInput ? autoConnect.index : 0,\r\n inputType: srcIsInput ? srcType : newNode.inputs[0].type,\r\n outputNode: srcIsInput ? newNode.id : srcId,\r\n outputIdx: srcIsInput ? 0 : autoConnect.index,\r\n outputType: srcIsInput ? newNode.inputs[0].type : srcType\r\n };\r\n\r\n // Store link\r\n\r\n const pathId = newLink.outputNode + '@' + newLink.inputNode;\r\n\r\n if ( !this.currentGraph?.links[pathId] ) this.currentGraph!.links[pathId] = [];\r\n\r\n this.currentGraph?.links[pathId].push( newLink );\r\n\r\n this._createLink( newLink );\r\n }\r\n } );\r\n }\r\n } );\r\n }\r\n\r\n /**\r\n * @method start\r\n */\r\n\r\n start()\r\n {\r\n this.mustStop = false;\r\n this.state = GraphEditor.RUNNING;\r\n\r\n this.propagateEventToAllNodes( 'onStart' );\r\n\r\n requestAnimationFrame( this._frame.bind( this ) );\r\n }\r\n\r\n /**\r\n * @method stop\r\n */\r\n\r\n stop()\r\n {\r\n this.mustStop = true;\r\n this.state = GraphEditor.STOPPED;\r\n\r\n this.propagateEventToAllNodes( 'onStop' );\r\n }\r\n\r\n /**\r\n * @method _frame\r\n */\r\n\r\n _frame()\r\n {\r\n if ( this.mustStop || !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n requestAnimationFrame( this._frame.bind( this ) );\r\n\r\n // Only run here main graph!\r\n this.currentGraph._runStep( this.main );\r\n }\r\n\r\n _generatePattern()\r\n {\r\n // Generate pattern\r\n {\r\n var pattern = document.createElementNS( 'http://www.w3.org/2000/svg', 'pattern' );\r\n pattern.setAttribute( 'id', 'pattern-0' );\r\n pattern.setAttribute( 'x', `${0.0}` );\r\n pattern.setAttribute( 'y', `${0.0}` );\r\n pattern.setAttribute( 'width', this._patternSize.x.toString() );\r\n pattern.setAttribute( 'height', this._patternSize.y.toString() );\r\n pattern.setAttribute( 'patternUnits', 'userSpaceOnUse' );\r\n\r\n var circle = document.createElementNS( 'http://www.w3.org/2000/svg', 'circle' );\r\n circle.setAttribute( 'cx', this._circlePatternSize.toString() );\r\n circle.setAttribute( 'cy', this._circlePatternSize.toString() );\r\n circle.setAttribute( 'r', this._circlePatternSize.toString() );\r\n circle.setAttribute( 'fill', this._circlePatternColor );\r\n\r\n pattern.appendChild( circle );\r\n }\r\n\r\n var svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'background-svg' );\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n svg.style.stroke = 'none';\r\n\r\n svg.appendChild( pattern );\r\n\r\n var rect = document.createElementNS( 'http://www.w3.org/2000/svg', 'rect' );\r\n rect.setAttribute( 'x', '0' );\r\n rect.setAttribute( 'y', '0' );\r\n rect.setAttribute( 'width', '100%' );\r\n rect.setAttribute( 'height', '100%' );\r\n rect.setAttribute( 'fill', 'url(#pattern-0)' );\r\n\r\n svg.appendChild( rect );\r\n\r\n this._background = svg;\r\n\r\n this.root.appendChild( this._background );\r\n }\r\n\r\n _updatePattern()\r\n {\r\n if ( !this._background || !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const patternSize = this._patternSize.mul( this.currentGraph.scale );\r\n const circlePatternSize = this._circlePatternSize * this.currentGraph.scale;\r\n const patternPosition = this.currentGraph.translation.mul( this.currentGraph.scale );\r\n\r\n let pattern = this._background.querySelector( 'pattern' )!;\r\n pattern.setAttribute( 'x', patternPosition.x.toString() );\r\n pattern.setAttribute( 'y', patternPosition.y.toString() );\r\n pattern.setAttribute( 'width', patternSize.x.toString() );\r\n pattern.setAttribute( 'height', patternSize.y.toString() );\r\n\r\n var circle = this._background.querySelector( 'circle' )!;\r\n circle.setAttribute( 'cx', circlePatternSize.toString() );\r\n circle.setAttribute( 'cy', circlePatternSize.toString() );\r\n circle.setAttribute( 'r', circlePatternSize.toString() );\r\n\r\n // Nodes\r\n\r\n const w = this._domNodes.offsetWidth * 0.5;\r\n const h = this._domNodes.offsetHeight * 0.5;\r\n\r\n const dw = w - w * this.currentGraph.scale;\r\n const dh = h - h * this.currentGraph.scale;\r\n\r\n this._domNodes.style.transform = `\r\n translate(` + ( patternPosition.x - dw ) + `px, ` + ( patternPosition.y - dh ) + `px)\r\n scale(` + this.currentGraph.scale + `)\r\n `;\r\n this._domLinks.style.transform = this._domNodes.style.transform;\r\n\r\n // Hide nodes outside the viewport\r\n\r\n const nodesOutsideViewport = this._getNonVisibleNodes();\r\n\r\n for ( let node of nodesOutsideViewport )\r\n {\r\n let dom = this._getNodeDOMElement( node.id );\r\n dom.classList.toggle( 'hidden-opacity', true );\r\n }\r\n }\r\n\r\n _getPatternPosition( renderPosition: typeof vec2 )\r\n {\r\n if ( !this.currentGraph ) return;\r\n return renderPosition.div( this.currentGraph.scale ).sub( this.currentGraph.translation );\r\n }\r\n\r\n _getRenderPosition( patternPosition: typeof vec2 )\r\n {\r\n if ( !this.currentGraph ) return;\r\n return patternPosition.add( this.currentGraph.translation ).mul( this.currentGraph.scale );\r\n }\r\n\r\n _onLink( e: any )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const linkData = this._generatingLink;\r\n const ioType = e.target.classList.contains( 'input' ) ? GraphEditor.NODE_IO_INPUT : GraphEditor.NODE_IO_OUTPUT;\r\n\r\n // Discard same IO type\r\n if ( linkData.ioType == ioType )\r\n {\r\n console.warn( `Can't link same type of data` );\r\n return;\r\n }\r\n\r\n // Info about src node\r\n const src_nodeContainer = linkData.domEl;\r\n const src_nodeId = src_nodeContainer.dataset['id'];\r\n const src_node = this.nodes[src_nodeId].data;\r\n const src_ioIndex = this._generatingLink.index;\r\n\r\n // Info about dst node\r\n const dst_nodeContainer = e.target.offsetParent;\r\n const dst_nodeId = dst_nodeContainer.dataset['id'];\r\n const dst_node = this.nodes[dst_nodeId].data;\r\n const dst_ioIndex = parseInt( e.target.parentElement.dataset['index'] );\r\n\r\n // Discard different types\r\n const srcIsInput = linkData.ioType == GraphEditor.NODE_IO_INPUT;\r\n const src_ios = src_node[srcIsInput ? 'inputs' : 'outputs'];\r\n const src_ioType = src_ios[src_ioIndex].type;\r\n\r\n const dst_ios = dst_node[ioType == GraphEditor.NODE_IO_INPUT ? 'inputs' : 'outputs'];\r\n const dst_ioType = dst_ios[dst_ioIndex].type;\r\n\r\n if ( src_ioType != dst_ioType && src_ioType != 'any' && dst_ioType != 'any' )\r\n {\r\n // Different types, but it might be possible to cast types\r\n\r\n const inputType = srcIsInput ? src_ioType : dst_ioType;\r\n const outputType = srcIsInput ? dst_ioType : src_ioType;\r\n\r\n if ( !this.supportedCastTypes[outputType + '@' + inputType] )\r\n {\r\n console.warn( `Can't link ${src_ioType} to ${dst_ioType}.` );\r\n return;\r\n }\r\n }\r\n\r\n // Check if target it's an active input and remove the old link\r\n\r\n if ( ioType == GraphEditor.NODE_IO_INPUT && e.target.parentElement.dataset['active'] )\r\n {\r\n this._deleteLinks( dst_nodeId, e.target.parentElement );\r\n }\r\n // Check if source it's an active input and remove the old link\r\n\r\n else if ( linkData.ioType == GraphEditor.NODE_IO_INPUT && linkData.io.dataset['active'] )\r\n {\r\n this._deleteLinks( src_nodeId, linkData.io );\r\n }\r\n\r\n // Store the end io..\r\n\r\n var srcDom = linkData.io;\r\n srcDom.links = srcDom.links ?? [];\r\n srcDom.links[dst_ioIndex] = srcDom.links[dst_ioIndex] ?? [];\r\n srcDom.links[dst_ioIndex].push( dst_nodeId );\r\n\r\n var dstDom = e.target.parentElement;\r\n dstDom.links = dstDom.links ?? [];\r\n dstDom.links[src_ioIndex] = dstDom.links[src_ioIndex] ?? [];\r\n dstDom.links[src_ioIndex].push( src_nodeId );\r\n\r\n // Call this using the io target to set the connection to the center of the input DOM element..\r\n\r\n let path = this._updatePreviewLink( null, e.target.parentElement );\r\n\r\n // Store link\r\n\r\n const pathId = ( srcIsInput ? dst_nodeId : src_nodeId ) + '@' + ( srcIsInput ? src_nodeId : dst_nodeId );\r\n\r\n if ( !this.currentGraph.links[pathId] ) this.currentGraph.links[pathId] = [];\r\n\r\n this.currentGraph.links[pathId].push( {\r\n path: path,\r\n inputNode: srcIsInput ? src_nodeId : dst_nodeId,\r\n inputIdx: srcIsInput ? src_ioIndex : dst_ioIndex,\r\n inputType: srcIsInput ? src_ioType : dst_ioType,\r\n outputNode: srcIsInput ? dst_nodeId : src_nodeId,\r\n outputIdx: srcIsInput ? dst_ioIndex : src_ioIndex,\r\n outputType: srcIsInput ? dst_ioType : src_ioType\r\n } );\r\n\r\n path.dataset['id'] = pathId;\r\n\r\n // Mark as active links...\r\n\r\n linkData.io.dataset['active'] = true;\r\n e.target.parentElement.dataset['active'] = true;\r\n\r\n // Successful link..\r\n return true;\r\n }\r\n\r\n _updatePreviewLink( e: any, endIO?: any )\r\n {\r\n var path = this._generatingLink.path;\r\n\r\n if ( !path )\r\n {\r\n var svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'link-svg' );\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n this._domLinks.appendChild( svg );\r\n\r\n path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\r\n path.setAttribute( 'fill', 'none' );\r\n svg.appendChild( path );\r\n this._generatingLink.path = path;\r\n }\r\n\r\n // Generate bezier curve\r\n\r\n const index = this._generatingLink.index;\r\n const type = this._generatingLink.ioType;\r\n const domEl = this._generatingLink.domEl;\r\n\r\n const offsetX = this.root.getBoundingClientRect().x;\r\n const offsetY = this.root.getBoundingClientRect().y;\r\n\r\n const ios = domEl.querySelector(\r\n type == GraphEditor.NODE_IO_INPUT ? '.lexgraphnodeinputs' : '.lexgraphnodeoutputs'\r\n );\r\n const ioEl = ios.childNodes[index].querySelector( '.io__type' );\r\n const startRect = ioEl.getBoundingClientRect();\r\n\r\n let startPos = new vec2( startRect.x - offsetX, startRect.y - offsetY );\r\n let endPos = null;\r\n let endioEl = null;\r\n\r\n if ( e )\r\n {\r\n endPos = new vec2( e.offsetX, e.offsetY );\r\n\r\n // Add node position, since I can't get the correct position directly from the event..\r\n if ( LX.hasClass( e.target, [ 'lexgraphnode', 'lexgraphgroup' ] ) )\r\n {\r\n endPos.add( this._getNodePosition( e.target ), endPos );\r\n endPos.add( new vec2( 3, 3 ), endPos );\r\n }\r\n else if ( LX.hasClass( e.target, [ 'io__type', 'lexgraphgroupresizer' ] ) )\r\n {\r\n var parent = e.target.offsetParent;\r\n // Add parent offset\r\n endPos.add( this._getNodePosition( parent ), endPos );\r\n // Add own offset\r\n endPos.add( new vec2( e.target.offsetLeft, e.target.offsetTop ), endPos );\r\n endPos.add( new vec2( 3, 3 ), endPos );\r\n }\r\n\r\n endPos = this._getRenderPosition( endPos );\r\n }\r\n else\r\n {\r\n endioEl = endIO.querySelector( '.io__type' );\r\n const ioRect = endioEl.getBoundingClientRect();\r\n endPos = new vec2( ioRect.x - offsetX, ioRect.y - offsetY );\r\n }\r\n\r\n if ( type == GraphEditor.NODE_IO_INPUT )\r\n {\r\n var tmp = endPos;\r\n endPos = startPos;\r\n startPos = tmp;\r\n }\r\n\r\n let color = getComputedStyle( ioEl ).backgroundColor;\r\n\r\n if ( type == GraphEditor.NODE_IO_OUTPUT && endioEl )\r\n {\r\n color = getComputedStyle( endioEl ).backgroundColor;\r\n }\r\n\r\n this._createLinkPath( path, startPos, endPos, color, !!e );\r\n\r\n return path;\r\n }\r\n\r\n _createLink( link: any )\r\n {\r\n var svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'link-svg' );\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n this._domLinks.appendChild( svg );\r\n\r\n var path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\r\n path.setAttribute( 'fill', 'none' );\r\n svg.appendChild( path );\r\n\r\n const inputNodeDom = this._getNodeDOMElement( link.inputNode );\r\n const outputNodeDom = this._getNodeDOMElement( link.outputNode );\r\n\r\n // Start pos\r\n\r\n const offsetX = this.root.getBoundingClientRect().x;\r\n const offsetY = this.root.getBoundingClientRect().y;\r\n\r\n const outputs = outputNodeDom.querySelector( '.lexgraphnodeoutputs' );\r\n const io0 = outputs.childNodes[link.outputIdx];\r\n const startRect = io0.querySelector( '.io__type' ).getBoundingClientRect();\r\n\r\n let startPos = new vec2( startRect.x - offsetX, startRect.y - offsetY + 6 );\r\n\r\n // End pos\r\n\r\n const inputs = inputNodeDom.querySelector( '.lexgraphnodeinputs' );\r\n const io1 = inputs.childNodes[link.inputIdx];\r\n const endRect = io1.querySelector( '.io__type' ).getBoundingClientRect();\r\n\r\n let endPos = new vec2( endRect.x - offsetX, endRect.y - offsetY + 6 );\r\n\r\n // Generate bezier curve\r\n\r\n const color = getComputedStyle( io1.querySelector( '.io__type' ) ).backgroundColor;\r\n this._createLinkPath( path, startPos, endPos, color );\r\n\r\n link.path = path;\r\n\r\n // Store data in each IO\r\n\r\n io0.links = [];\r\n io0.links[link.inputIdx] = io0.links[link.inputIdx] ?? [];\r\n io0.links[link.inputIdx].push( link.inputNode );\r\n\r\n io1.links = [];\r\n io1.links[link.outputIdx] = io1.links[link.outputIdx] ?? [];\r\n io1.links[link.outputIdx].push( link.outputNode );\r\n\r\n io0.dataset['active'] = true;\r\n io1.dataset['active'] = true;\r\n }\r\n\r\n _createLinkPath( path: any, startPos: typeof vec2, endPos: typeof vec2, color?: any, exactEnd: boolean = false )\r\n {\r\n if ( !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const dist = 6 * this.currentGraph.scale;\r\n startPos.add( new vec2( dist, dist ), startPos );\r\n\r\n if ( !exactEnd )\r\n {\r\n endPos.add( new vec2( dist, dist ), endPos );\r\n }\r\n\r\n startPos = this._getPatternPosition( startPos );\r\n endPos = this._getPatternPosition( endPos );\r\n\r\n const distanceX = LX.clamp( Math.abs( startPos.x - endPos.x ), 0.0, 256.0 );\r\n const cPDistance = 128.0 * Math.pow( distanceX / 256.0, 0.5 );\r\n\r\n let cPoint1 = startPos.add( new vec2( cPDistance, 0 ) );\r\n let cPoint2 = endPos.sub( new vec2( cPDistance, 0 ) );\r\n\r\n path.setAttribute( 'd', `\r\n M ${startPos.x},${startPos.y}\r\n C ${cPoint1.x},${cPoint1.y} ${cPoint2.x},${cPoint2.y} ${endPos.x},${endPos.y}\r\n ` );\r\n\r\n path.parentElement.style.color = color;\r\n }\r\n\r\n _updateNodeLinks( nodeId: string )\r\n {\r\n var node = this.nodes[nodeId] ? this.nodes[nodeId].data : null;\r\n\r\n if ( !node )\r\n {\r\n console.warn( `Can't finde node [${nodeId}]` );\r\n return;\r\n }\r\n\r\n const nodeDOM = this._getNodeDOMElement( nodeId );\r\n\r\n // Update input links\r\n\r\n for ( let input of nodeDOM.querySelectorAll( '.ioinput' ) )\r\n {\r\n if ( !input.links )\r\n {\r\n continue;\r\n }\r\n\r\n // Get first and only target output..\r\n const targets = input.links.filter( ( v: any ) => v !== undefined )[0];\r\n const targetNodeId = targets[0];\r\n\r\n // It has been deleted..\r\n if ( !targetNodeId )\r\n {\r\n continue;\r\n }\r\n\r\n const ioIndex = parseInt( input.dataset['index'] );\r\n\r\n var links = this._getLinks( targetNodeId, nodeId );\r\n\r\n // Inputs only have 1 possible output connected\r\n var link = links.find( ( i: any ) => ( i.inputIdx == ioIndex ) );\r\n\r\n this._generatingLink = {\r\n index: ioIndex,\r\n io: input,\r\n ioType: GraphEditor.NODE_IO_INPUT,\r\n domEl: nodeDOM,\r\n path: link.path\r\n };\r\n\r\n // Get end io\r\n\r\n const outputNode = this._getNodeDOMElement( targetNodeId );\r\n const io = outputNode.querySelector( '.lexgraphnodeoutputs' ).childNodes[link.outputIdx];\r\n\r\n this._updatePreviewLink( null, io );\r\n }\r\n\r\n // Update output links\r\n\r\n for ( let output of nodeDOM.querySelectorAll( '.iooutput' ) )\r\n {\r\n if ( !output.links )\r\n {\r\n continue;\r\n }\r\n\r\n const srcIndex = parseInt( output.dataset['index'] );\r\n\r\n for ( let targetIndex = 0; targetIndex < output.links.length; ++targetIndex )\r\n {\r\n const targets = output.links[targetIndex];\r\n\r\n if ( !targets )\r\n {\r\n continue;\r\n }\r\n\r\n for ( let targetId of targets )\r\n {\r\n var links = this._getLinks( nodeId, targetId );\r\n var link = links.find( ( i: any ) => ( i.inputIdx == targetIndex && i.outputIdx == srcIndex ) );\r\n\r\n // Outputs can have different inputs connected\r\n this._generatingLink = {\r\n index: link.outputIdx,\r\n io: output,\r\n ioType: GraphEditor.NODE_IO_OUTPUT,\r\n domEl: nodeDOM,\r\n path: link.path\r\n };\r\n\r\n // Get end io\r\n\r\n const inputNode = this._getNodeDOMElement( targetId );\r\n const io = inputNode.querySelector( '.lexgraphnodeinputs' ).childNodes[link.inputIdx];\r\n\r\n this._updatePreviewLink( null, io );\r\n }\r\n }\r\n }\r\n\r\n delete this._generatingLink;\r\n }\r\n\r\n _drawBoxSelection( e: MouseEvent )\r\n {\r\n var svg = this._currentBoxSelectionSVG;\r\n\r\n if ( !svg )\r\n {\r\n var svg: SVGSVGElement | undefined = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'box-selection-svg' );\r\n if ( this._boxSelectRemoving )\r\n {\r\n svg.classList.add( 'removing' );\r\n }\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n this._domLinks.appendChild( svg );\r\n this._currentBoxSelectionSVG = svg;\r\n }\r\n\r\n // Generate box\r\n\r\n let startPos = this._getPatternPosition( this._boxSelecting );\r\n let size = this._getPatternPosition( this._mousePosition ).sub( startPos );\r\n\r\n if ( size.x < 0 ) startPos.x += size.x;\r\n if ( size.y < 0 ) startPos.y += size.y;\r\n\r\n size = size.abs();\r\n\r\n svg.innerHTML = `<rect\r\n x=\"${startPos.x}\" y=\"${startPos.y}\"\r\n rx=\"${6}\" ry=\"${6}\"\r\n width=\"${size.x}\" height=\"${size.y}\"\r\n \"/>`;\r\n }\r\n\r\n _getNonVisibleNodes()\r\n {\r\n const nonVisibleNodes = [];\r\n\r\n if ( !this.currentGraph )\r\n {\r\n console.warn( 'No graph set' );\r\n return [];\r\n }\r\n\r\n const graph_bb = new BoundingBox( new vec2( 0, 0 ), new vec2( this.root.offsetWidth, this.root.offsetHeight ) );\r\n\r\n for ( let node of this.currentGraph.nodes )\r\n {\r\n let pos = this._getRenderPosition( node.position );\r\n let dom = this._getNodeDOMElement( node.id );\r\n if ( !dom )\r\n {\r\n continue;\r\n }\r\n\r\n const node_bb = new BoundingBox( pos, node.size.mul( this.currentGraph.scale ) );\r\n\r\n if ( graph_bb.inside( node_bb, false ) )\r\n {\r\n // Show if node in viewport..\r\n dom.classList.toggle( 'hidden-opacity', false );\r\n\r\n // And hide content if scale is very small..\r\n dom.childNodes[1].classList.toggle( 'hidden-opacity', this.currentGraph.scale < 0.5 );\r\n\r\n continue;\r\n }\r\n\r\n nonVisibleNodes.push( node );\r\n }\r\n\r\n return nonVisibleNodes;\r\n }\r\n\r\n _selectNodesInBox( lt: typeof vec2, rb: typeof vec2, remove: boolean = false )\r\n {\r\n lt = this._getPatternPosition( lt );\r\n rb = this._getPatternPosition( rb );\r\n\r\n let size = rb.sub( lt );\r\n\r\n if ( size.x < 0 )\r\n {\r\n var tmp = lt.x;\r\n lt.x = rb.x;\r\n rb.x = tmp;\r\n }\r\n\r\n if ( size.y < 0 )\r\n {\r\n var tmp = lt.y;\r\n lt.y = rb.y;\r\n rb.y = tmp;\r\n }\r\n\r\n const nodes = this._getAllDOMNodes() as HTMLElement[];\r\n for ( let nodeEl of nodes )\r\n {\r\n let pos = this._getNodePosition( nodeEl );\r\n let size = new vec2( nodeEl.offsetWidth, nodeEl.offsetHeight );\r\n\r\n if ( ( !( pos.x < lt.x && ( pos.x + size.x ) < lt.x ) && !( pos.x > rb.x && ( pos.x + size.x ) > rb.x ) )\r\n && ( !( pos.y < lt.y && ( pos.y + size.y ) < lt.y )\r\n && !( pos.y > rb.y && ( pos.y + size.y ) > rb.y ) ) )\r\n {\r\n if ( remove )\r\n {\r\n this._unSelectNode( nodeEl );\r\n }\r\n else\r\n {\r\n this._selectNode( nodeEl, true, false );\r\n }\r\n }\r\n }\r\n }\r\n\r\n _deleteSelection( e?: any )\r\n {\r\n const lastNodeCount = this._domNodes.childElementCount;\r\n\r\n for ( let nodeId of this.selectedNodes )\r\n {\r\n this._deleteNode( nodeId );\r\n }\r\n\r\n this.selectedNodes.length = 0;\r\n\r\n // We delete something, so add undo step..\r\n\r\n if ( this._domNodes.childElementCount != lastNodeCount )\r\n {\r\n this._addUndoStep();\r\n }\r\n }\r\n\r\n _getBoundingFromGroup( groupDOM: HTMLElement )\r\n {\r\n const x = parseFloat( groupDOM.style.left );\r\n const y = parseFloat( groupDOM.style.top );\r\n\r\n return new BoundingBox( new vec2( x, y ), new vec2( groupDOM.offsetWidth - 2, groupDOM.offsetHeight - 2 ) );\r\n }\r\n\r\n _getBoundingFromNodes( nodeIds: string[] )\r\n {\r\n let group_bb = null;\r\n\r\n for ( let nodeId of nodeIds )\r\n {\r\n const node = this.nodes[nodeId].data;\r\n const node_bb = new BoundingBox( node.position, node.size );\r\n\r\n if ( group_bb )\r\n {\r\n group_bb.merge( node_bb );\r\n }\r\n else\r\n {\r\n group_bb = node_bb;\r\n }\r\n }\r\n\r\n if ( group_bb )\r\n {\r\n // Add padding\r\n\r\n const groupContentPadding = 8;\r\n\r\n group_bb.origin.sub( new vec2( groupContentPadding ), group_bb.origin );\r\n group_bb.origin.sub( new vec2( groupContentPadding ), group_bb.origin );\r\n\r\n group_bb.size.add( new vec2( groupContentPadding * 2.0 ), group_bb.size );\r\n group_bb.size.add( new vec2( groupContentPadding * 2.0 ), group_bb.size );\r\n }\r\n\r\n return group_bb;\r\n }\r\n\r\n /**\r\n * @method _createGroup\r\n * @description Creates a node group from the bounding box of the selected nodes\r\n * @returns JSON data from the serialized graph\r\n */\r\n\r\n _createGroup( bb?: BoundingBox )\r\n {\r\n const group_bb: any = bb ?? this._getBoundingFromNodes( this.selectedNodes );\r\n if ( !group_bb )\r\n {\r\n return;\r\n }\r\n\r\n const group_id = group_bb.id ?? `group-${LX.guidGenerator()}`;\r\n\r\n let groupDOM = document.createElement( 'div' );\r\n groupDOM.id = group_id;\r\n groupDOM.classList.add( 'lexgraphgroup' );\r\n groupDOM.style.left = group_bb.origin.x + 'px';\r\n groupDOM.style.top = group_bb.origin.y + 'px';\r\n groupDOM.style.width = group_bb.size.x + 'px';\r\n groupDOM.style.height = group_bb.size.y + 'px';\r\n\r\n let groupResizer = document.createElement( 'div' );\r\n groupResizer.classList.add( 'lexgraphgroupresizer' );\r\n\r\n groupResizer.addEventListener( 'mousedown', inner_mousedown );\r\n\r\n this.groups[group_id] = groupDOM;\r\n\r\n var that = this;\r\n var lastPos = [ 0, 0 ];\r\n\r\n function inner_mousedown( e: MouseEvent )\r\n {\r\n var doc = that.root.ownerDocument;\r\n doc.addEventListener( 'mousemove', inner_mousemove );\r\n doc.addEventListener( 'mouseup', inner_mouseup );\r\n lastPos[0] = e.x;\r\n lastPos[1] = e.y;\r\n e.stopPropagation();\r\n e.preventDefault();\r\n document.body.classList.add( 'nocursor' );\r\n groupResizer.classList.add( 'nocursor' );\r\n }\r\n\r\n function inner_mousemove( e: MouseEvent )\r\n {\r\n let dt = new vec2( lastPos[0] - e.x, lastPos[1] - e.y );\r\n dt.div( that.currentGraph?.scale, dt );\r\n\r\n groupDOM.style.width = ( parseFloat( groupDOM.style.width ) - dt.x ) + 'px';\r\n groupDOM.style.height = ( parseFloat( groupDOM.style.height ) - dt.y ) + 'px';\r\n\r\n lastPos[0] = e.x;\r\n lastPos[1] = e.y;\r\n\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n\r\n function inner_mouseup( e: MouseEvent )\r\n {\r\n var doc = that.root.ownerDocument;\r\n doc.removeEventListener( 'mousemove', inner_mousemove );\r\n doc.removeEventListener( 'mouseup', inner_mouseup );\r\n document.body.classList.remove( 'nocursor' );\r\n groupResizer.classList.remove( 'nocursor' );\r\n }\r\n\r\n let groupTitle = document.createElement( 'input' );\r\n let defaultName = `Group ${GraphEditor.LAST_GROUP_ID}`;\r\n groupTitle.value = defaultName;\r\n groupTitle.classList.add( 'lexgraphgrouptitle' );\r\n groupTitle.disabled = true;\r\n\r\n // Dbl click to rename\r\n\r\n groupTitle.addEventListener( 'mousedown', ( e ) => {\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n } );\r\n\r\n groupTitle.addEventListener( 'focusout', ( e ) => {\r\n groupTitle.disabled = true;\r\n if ( !groupTitle.value.length )\r\n {\r\n groupTitle.value = defaultName;\r\n }\r\n } );\r\n\r\n groupTitle.addEventListener( 'keyup', ( e ) => {\r\n if ( e.key == 'Enter' )\r\n {\r\n groupTitle.blur();\r\n }\r\n else if ( e.key == 'Escape' )\r\n {\r\n groupTitle.value = '';\r\n groupTitle.blur();\r\n }\r\n } );\r\n\r\n groupDOM.addEventListener( 'dblclick', ( e ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n groupTitle.disabled = false;\r\n groupTitle.focus();\r\n } );\r\n\r\n groupDOM.addEventListener( 'contextmenu', ( e ) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n LX.addContextMenu( null, e, ( m: typeof ContextMenu ) => {\r\n m.add( 'Delete', () => {\r\n this._deleteGroup( group_id );\r\n } );\r\n } );\r\n } );\r\n\r\n groupDOM.appendChild( groupResizer );\r\n groupDOM.appendChild( groupTitle );\r\n\r\n this._domNodes.prepend( groupDOM );\r\n\r\n // Move group!!\r\n\r\n LX.makeDraggable( groupDOM, {\r\n onMove: this._onMoveGroup.bind( this ),\r\n onDragStart: this._onDragGroup.bind( this ),\r\n updateLayers: false\r\n } );\r\n\r\n GraphEditor.LAST_GROUP_ID++;\r\n\r\n return groupDOM;\r\n }\r\n\r\n _addUndoStep( deleteRedo = true )\r\n {\r\n if ( deleteRedo )\r\n {\r\n // Remove all redo steps\r\n this._redoSteps.length = 0;\r\n }\r\n\r\n this._undoSteps.push( {\r\n // TODO: Add graph state\r\n } );\r\n }\r\n\r\n _doUndo()\r\n {\r\n if ( !this._undoSteps.length )\r\n {\r\n return;\r\n }\r\n\r\n this._addRedoStep();\r\n\r\n // Extract info from the last state\r\n const step = this._undoSteps.pop();\r\n\r\n // Set old state\r\n // TODO\r\n\r\n console.log( 'Undo!!' );\r\n }\r\n\r\n _addRedoStep()\r\n {\r\n this._redoSteps.push( {\r\n // TODO: Add graph state\r\n } );\r\n }\r\n\r\n _doRedo()\r\n {\r\n if ( !this._redoSteps.length )\r\n {\r\n return;\r\n }\r\n\r\n this._addUndoStep( false );\r\n\r\n // Extract info from the next saved code state\r\n const step = this._redoSteps.pop();\r\n\r\n // Set old state\r\n // TODO\r\n\r\n console.log( 'Redo!!' );\r\n }\r\n\r\n _togglePropertiesDialog( force: boolean = false )\r\n {\r\n this.propertiesDialog.root.classList.toggle( 'opened', force );\r\n\r\n if ( !force )\r\n {\r\n this.propertiesDialog.panel.clear();\r\n }\r\n }\r\n\r\n _setSnappingValue( value: number )\r\n {\r\n this._snapValue = value;\r\n }\r\n\r\n _toggleSnapping()\r\n {\r\n this._snapToGrid = !this._snapToGrid;\r\n\r\n // Trigger position snapping for each node if needed\r\n\r\n if ( this._snapToGrid )\r\n {\r\n for ( let nodeDom of ( this._getAllDOMNodes( true ) as any[] ) )\r\n {\r\n nodeDom.mustSnap = true;\r\n }\r\n }\r\n }\r\n\r\n _onSidebarCreate( e: Event )\r\n {\r\n new LX.DropdownMenu( e.target, [\r\n { name: 'Create Graph', icon: 'Workflow', callback: () => this.addGraph() },\r\n { name: 'Create Function', icon: 'Function', callback: () => this.addGraphFunction() }\r\n ], { side: 'right', align: 'start' } );\r\n }\r\n\r\n _showRenameGraphDialog()\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const dialog = new LX.Dialog( this.currentGraph.constructor.name, ( p: typeof Panel ) => {\r\n p.addText( 'Name', this.currentGraph?.name, ( v: string ) => {\r\n this._updateGraphName( v );\r\n dialog.close();\r\n } );\r\n }, { modal: true, size: [ '350px', null ] } );\r\n }\r\n\r\n _updateGraphName( name: string )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const newNameKey = name.replace( /\\s/g, '' ).replaceAll( '.', '' );\r\n\r\n // Change graph name button\r\n const nameDom = this._sidebar.root.querySelectorAll( '.lexsidebarheader span' )[1];\r\n console.assert( nameDom );\r\n nameDom.innerText = name;\r\n\r\n // Change name in sidebar\r\n const sidebarItem = this._sidebar.items.find( ( v: any ) => v.name === this.currentGraph?.name );\r\n if ( sidebarItem )\r\n {\r\n const oldName = sidebarItem.name;\r\n sidebarItem.name = name;\r\n sidebarItem.dom.id = newNameKey;\r\n sidebarItem.dom.innerHTML = sidebarItem.dom.innerHTML.replace( oldName, name );\r\n }\r\n\r\n // Change registered nodes function\r\n const oldType = 'function/' + this.currentGraph.name;\r\n const nodeClass = GraphEditor.NODE_TYPES[oldType];\r\n\r\n if ( nodeClass )\r\n {\r\n delete GraphEditor.NODE_TYPES[oldType];\r\n\r\n nodeClass.title = name;\r\n\r\n GraphEditor.registerCustomNode( 'function/' + name, nodeClass );\r\n }\r\n\r\n this.currentGraph.name = name;\r\n }\r\n\r\n _addGlobalActions()\r\n {\r\n }\r\n}\r\n\r\nLX.GraphEditor = GraphEditor;\r\n\r\n/**\r\n * @class Graph\r\n */\r\n\r\nclass Graph\r\n{\r\n name: string = 'Unnamed Graph';\r\n type: string = 'Graph';\r\n id: string = '';\r\n\r\n editor: GraphEditor | undefined;\r\n nodes: GraphNode[] = [];\r\n groups: any[] = [];\r\n variables: any = {};\r\n links: any = {};\r\n\r\n scale: number = 1.0;\r\n translation: typeof vec2 = new vec2( 0, 0 );\r\n\r\n _executionNodes: string[] = [];\r\n\r\n constructor( name?: string, options: any = {} )\r\n {\r\n this.name = name ?? this.name;\r\n }\r\n\r\n configure( o: any )\r\n {\r\n this.id = o.id;\r\n this.name = o.name;\r\n\r\n this.nodes.length = 0;\r\n\r\n for ( let node of o.nodes )\r\n {\r\n const newNode = GraphEditor.addNode( node.type );\r\n\r\n newNode.id = node.id;\r\n newNode.title = node.title;\r\n newNode.color = node.color;\r\n newNode.position = new vec2( node.position.x, node.position.y );\r\n newNode.type = node.type;\r\n newNode.properties = node.properties;\r\n\r\n this.nodes.push( newNode );\r\n }\r\n\r\n this.groups = o.groups;\r\n this.links = o.links;\r\n\r\n // editor options?\r\n\r\n // zoom/translation ??\r\n }\r\n\r\n /**\r\n * @method getNodeById\r\n */\r\n\r\n getNodeById( id: string )\r\n {\r\n for ( let node of this.nodes )\r\n {\r\n if ( node.id == id ) return node;\r\n }\r\n }\r\n\r\n /**\r\n * @method _runStep\r\n */\r\n\r\n _runStep( mainId: string )\r\n {\r\n if ( !mainId )\r\n {\r\n return;\r\n }\r\n\r\n const nodes: any = this.nodes.reduce( ( ac, a ) => ( { ...ac, [a.id]: a } ), {} );\r\n\r\n // Not main graph..\r\n if ( !nodes[mainId] )\r\n {\r\n return;\r\n }\r\n\r\n const visitedNodes: any = {};\r\n\r\n this._executionNodes = [];\r\n\r\n // Reser variables each step?\r\n this.variables = {};\r\n\r\n const addNode = ( id: string ) => {\r\n if ( visitedNodes[id] )\r\n {\r\n return;\r\n }\r\n\r\n visitedNodes[id] = true;\r\n\r\n for ( let linkId in this.links )\r\n {\r\n const idx = linkId.indexOf( '@' + id );\r\n\r\n if ( idx < 0 )\r\n {\r\n continue;\r\n }\r\n\r\n const preNodeId = linkId.substring( 0, idx );\r\n\r\n this._executionNodes.push( preNodeId );\r\n\r\n addNode( preNodeId );\r\n }\r\n };\r\n\r\n // TODO: Search \"no output\" nodes and add to the executable list (same as main)..\r\n // ...\r\n\r\n this._executionNodes.push( mainId );\r\n\r\n addNode( mainId );\r\n\r\n for ( var i = this._executionNodes.length - 1; i >= 0; --i )\r\n {\r\n const node = nodes[this._executionNodes[i]];\r\n\r\n if ( node.onBeforeStep )\r\n {\r\n node.onBeforeStep();\r\n }\r\n\r\n node.execute();\r\n\r\n if ( node.onBeforeStep )\r\n {\r\n node.onAfterStep();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @method serialize\r\n * @param {Boolean} prettify\r\n * @returns JSON data from the serialized graph\r\n */\r\n\r\n serialize( prettify = true )\r\n {\r\n var o: any = {};\r\n\r\n o.id = this.id;\r\n o.name = this.name;\r\n o.type = this.type;\r\n\r\n o.nodes = [];\r\n o.groups = [];\r\n o.functions = [];\r\n o.links = {};\r\n\r\n for ( let node of ( this.nodes as any[] ) )\r\n {\r\n o.nodes.push( node.serialize() );\r\n\r\n const fnOrigin = this.editor?.graphs[node.gid];\r\n\r\n if ( fnOrigin )\r\n {\r\n o.functions.push( JSON.parse( fnOrigin.serialize() ) );\r\n }\r\n }\r\n\r\n for ( let linkId in this.links )\r\n {\r\n const ioLinks = LX.deepCopy( this.links[linkId] );\r\n ioLinks.forEach( ( v: any ) => delete v.path );\r\n o.links[linkId] = ioLinks;\r\n }\r\n\r\n for ( let group of this.groups )\r\n {\r\n const groupDom = this.editor?.groups[group.id];\r\n const group_bb: any = this.editor?._getBoundingFromGroup( groupDom );\r\n group_bb.id = group.id;\r\n group_bb.name = group.name;\r\n o.groups.push( group_bb );\r\n }\r\n\r\n // editor options?\r\n\r\n // zoom/translation ??\r\n\r\n try\r\n {\r\n o = JSON.stringify( o, undefined, prettify ? 2 : undefined );\r\n }\r\n catch ( e )\r\n {\r\n o = null;\r\n console.error( `Can't export Graph [${this.name}] of type [${this.type}].` );\r\n }\r\n\r\n return o;\r\n }\r\n\r\n /**\r\n * @method export\r\n */\r\n\r\n export()\r\n {\r\n const o = this.serialize();\r\n LX.downloadFile( this.name + '.json', o );\r\n }\r\n}\r\n\r\nLX.Graph = Graph;\r\n\r\n/**\r\n * @class GraphNode\r\n */\r\n\r\nexport class GraphNode\r\n{\r\n static title: string;\r\n static blockDelete: boolean = false;\r\n static blockAdd: boolean = false;\r\n static description: string = '';\r\n\r\n id: string = '';\r\n type: string = '';\r\n title: string = '';\r\n inputs: any[] = [];\r\n outputs: any[] = [];\r\n properties: any[] = [];\r\n position: typeof vec2 = new vec2( 0, 0 );\r\n size: typeof vec2 = new vec2( 0, 0 );\r\n color: any;\r\n\r\n editor: GraphEditor | undefined;\r\n graphID: string | undefined;\r\n\r\n constructor()\r\n {\r\n }\r\n\r\n _hasOutputsConnected()\r\n {\r\n return true;\r\n }\r\n\r\n onExecute()\r\n {\r\n // This should be empty\r\n }\r\n\r\n execute()\r\n {\r\n if ( !this._hasOutputsConnected() )\r\n {\r\n return;\r\n }\r\n\r\n if ( this.onExecute )\r\n {\r\n this.onExecute();\r\n }\r\n }\r\n\r\n addInput( name: string | null, type: string )\r\n {\r\n this.inputs.push( { name: name, type: type } );\r\n }\r\n\r\n addOutput( name: string | null, type: string )\r\n {\r\n this.outputs.push( { name: name, type: type } );\r\n }\r\n\r\n addProperty( name: string | null, type: string, value: any, selectOptions?: any )\r\n {\r\n this.properties.push( { name, type, value, options: selectOptions } );\r\n }\r\n\r\n getInput( index: number )\r\n {\r\n if ( !this.inputs || !this.inputs.length || !this.inputs[index] )\r\n {\r\n return;\r\n }\r\n\r\n const graph = this.editor?.graphs[this.graphID as string];\r\n\r\n // Get data from link\r\n\r\n for ( let linkId in graph.links )\r\n {\r\n const idx = linkId.indexOf( '@' + this.id );\r\n\r\n if ( idx < 0 )\r\n {\r\n continue;\r\n }\r\n\r\n const nodeLinks = graph.links[linkId];\r\n\r\n for ( var link of nodeLinks )\r\n {\r\n if ( link.inputIdx != index )\r\n {\r\n continue;\r\n }\r\n\r\n // This is the value!!\r\n return link.data;\r\n }\r\n }\r\n }\r\n\r\n setOutput( index: number, data: any )\r\n {\r\n if ( !this.outputs || !this.outputs.length || !this.outputs[index] )\r\n {\r\n return;\r\n }\r\n\r\n const graph = this.editor?.graphs[this.graphID as string];\r\n\r\n // Set data in link\r\n\r\n for ( let linkId in graph.links )\r\n {\r\n const idx = linkId.indexOf( this.id + '@' );\r\n\r\n if ( idx < 0 )\r\n {\r\n continue;\r\n }\r\n\r\n const nodeLinks = graph.links[linkId];\r\n\r\n for ( var link of nodeLinks )\r\n {\r\n if ( link.outputIdx != index )\r\n {\r\n continue;\r\n }\r\n\r\n let innerData = data;\r\n\r\n if ( innerData != undefined && link.inputType != link.outputType && link.inputType != 'any'\r\n && link.outputType != 'any' )\r\n {\r\n // In case of supported casting, use function to cast..\r\n\r\n var fn = this.editor?.supportedCastTypes[link.outputType + '@' + link.inputType];\r\n\r\n // Use function if it's possible to cast!\r\n\r\n innerData = fn ? fn( LX.deepCopy( innerData ) ) : null;\r\n }\r\n\r\n link.data = innerData;\r\n }\r\n }\r\n }\r\n\r\n serialize()\r\n {\r\n var o: any = {};\r\n o.id = this.id;\r\n o.title = this.title;\r\n o.color = this.color;\r\n o.position = this.position;\r\n o.type = this.type;\r\n o.inputs = this.inputs;\r\n o.outputs = this.outputs;\r\n o.properties = this.properties;\r\n return o;\r\n }\r\n}\r\n\r\nLX.GraphNode = GraphNode;\r\n\r\n/**\r\n * @class GraphFunction\r\n */\r\n\r\nclass GraphFunction extends Graph\r\n{\r\n constructor( name?: string, options: any = {} )\r\n {\r\n super();\r\n\r\n this.name = name ?? ( 'GraphFunction' + GraphEditor.LAST_FUNCTION_ID );\r\n this.type = 'GraphFunction';\r\n\r\n GraphEditor.LAST_FUNCTION_ID++;\r\n\r\n const nodeInput = GraphEditor.addNode( 'function/Input' );\r\n nodeInput.position = new vec2( 150, 250 );\r\n\r\n const nodeOutput = GraphEditor.addNode( 'function/Output' );\r\n nodeOutput.position = new vec2( 650, 350 );\r\n\r\n this.nodes.push( nodeInput, nodeOutput );\r\n }\r\n\r\n getOutputData( inputValue: any )\r\n {\r\n const inputNode = this.nodes[0];\r\n inputNode.setOutput( 0, inputValue );\r\n\r\n const outputNode = this.nodes[1];\r\n\r\n this._runStep( outputNode.id );\r\n\r\n return outputNode.getInput( 0 );\r\n }\r\n}\r\n\r\nLX.GraphFunction = GraphFunction;\r\n\r\n/*\r\n ************ PREDEFINED NODES ************\r\n\r\n Nodes can override the following methods:\r\n\r\n - onCreate: Add inputs, outputs and properties\r\n - onStart: Callback on graph starts\r\n - onStop: Callback on graph stops\r\n - onExecute: Callback for node execution\r\n*/\r\n\r\n/*\r\n Function nodes\r\n*/\r\n\r\nclass NodeFuncInput extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'Outputs', 'array', [ 'float' ], [ 'float', 'int', 'bool', 'vec2', 'vec3', 'vec4',\r\n 'mat44' ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n // var a = this.getInput( 0 ) ?? this.properties[ 0 ].value;\r\n // var b = this.getInput( 1 ) ?? this.properties[ 1 ].value;\r\n // this.setOutput( 0, a + b );\r\n }\r\n\r\n setOutputs( v: any[] )\r\n {\r\n this.outputs.length = 0;\r\n\r\n for ( var i of v )\r\n {\r\n this.outputs.push( { name: null, type: i } );\r\n }\r\n }\r\n}\r\n\r\nNodeFuncInput.blockDelete = true;\r\nNodeFuncInput.blockAdd = true;\r\nGraphEditor.registerCustomNode( 'function/Input', NodeFuncInput );\r\n\r\nclass NodeFuncOutput extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n // var a = this.getInput( 0 ) ?? this.properties[ 0 ].value;\r\n // var b = this.getInput( 1 ) ?? this.properties[ 1 ].value;\r\n // this.setOutput( 0, a + b );\r\n }\r\n}\r\n\r\nNodeFuncOutput.blockDelete = true;\r\nNodeFuncOutput.blockAdd = true;\r\nGraphEditor.registerCustomNode( 'function/Output', NodeFuncOutput );\r\n\r\n/*\r\n Math nodes\r\n*/\r\n\r\nclass NodeAdd extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a + b );\r\n }\r\n}\r\n\r\nNodeAdd.description = 'Addition of 2 values (A+B).';\r\nGraphEditor.registerCustomNode( 'math/Add', NodeAdd );\r\n\r\nclass NodeSubstract extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a - b );\r\n }\r\n}\r\n\r\nNodeSubstract.description = 'Substraction of 2 values (A-B).';\r\nGraphEditor.registerCustomNode( 'math/Substract', NodeSubstract );\r\n\r\nclass NodeMultiply extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a * b );\r\n }\r\n}\r\n\r\nNodeMultiply.description = 'Multiplication of 2 values (A*B).';\r\nGraphEditor.registerCustomNode( 'math/Multiply', NodeMultiply );\r\n\r\nclass NodeDivide extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a / b );\r\n }\r\n}\r\n\r\nNodeDivide.description = 'Division of 2 values (A/B).';\r\nGraphEditor.registerCustomNode( 'math/Divide', NodeDivide );\r\n\r\nclass NodeSqrt extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'Value', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n this.setOutput( 0, Math.sqrt( a ) );\r\n }\r\n}\r\n\r\nNodeSqrt.description = 'Square root of a scalar.';\r\nGraphEditor.registerCustomNode( 'math/SQRT', NodeSqrt );\r\n\r\n/*\r\nMath Missing:\r\n- abs\r\n- ceil\r\n- clamp\r\n- floor\r\n- fract\r\n- lerp\r\n- log\r\n- max\r\n- min\r\n- negate\r\n- pow\r\n- remainder\r\n- round\r\n- remap range\r\n- saturate\r\n- step\r\n*/\r\n\r\n/*\r\n Logical operator nodes\r\n*/\r\n\r\nclass NodeAnd extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'bool' );\r\n this.addInput( null, 'bool' );\r\n this.addOutput( null, 'bool' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 );\r\n if ( a == undefined || b == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, !!a && !!b );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/And', NodeAnd );\r\n\r\nclass NodeOr extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'bool' );\r\n this.addInput( null, 'bool' );\r\n this.addOutput( null, 'bool' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 );\r\n if ( a == undefined || b == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, !!a || !!b );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Or', NodeOr );\r\n\r\nclass NodeEqual extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'bool' );\r\n }\r\n\r\n logicOp( a: number, b: number )\r\n {\r\n return a == b;\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 );\r\n if ( a == undefined || b == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, this.logicOp( a, b ) );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Equal', NodeEqual );\r\n\r\nclass NodeNotEqual extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a != b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/NotEqual', NodeNotEqual );\r\n\r\nclass NodeLess extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a < b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Less', NodeLess );\r\n\r\nclass NodeLessEqual extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a <= b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/LessEqual', NodeLessEqual );\r\n\r\nclass NodeGreater extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a > b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Greater', NodeGreater );\r\n\r\nclass NodeGreaterEqual extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a >= b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/GreaterEqual', NodeGreaterEqual );\r\n\r\nclass NodeSelect extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'True', 'any' );\r\n this.addInput( 'False', 'any' );\r\n this.addInput( 'Condition', 'bool' );\r\n this.addOutput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 ), cond = this.getInput( 2 );\r\n if ( a == undefined || b == undefined || cond == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, cond ? a : b );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Select', NodeSelect );\r\n\r\nclass NodeCompare extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'A', 'any' );\r\n this.addInput( 'B', 'any' );\r\n this.addInput( 'True', 'any' );\r\n this.addInput( 'False', 'any' );\r\n this.addProperty( 'Condition', 'select', 'Equal', [ 'Equal', 'Not Equal', 'Less', 'Less Equal', 'Greater',\r\n 'Greater Equal' ] );\r\n this.addOutput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 ), TrueVal = this.getInput( 2 ), FalseVal = this.getInput( 3 );\r\n var cond = this.properties[0].value;\r\n if ( a == undefined || b == undefined || TrueVal == undefined || FalseVal == undefined )\r\n {\r\n return;\r\n }\r\n var output;\r\n switch ( cond )\r\n {\r\n case 'Equal':\r\n output = a == b ? TrueVal : FalseVal;\r\n break;\r\n case 'Not Equal':\r\n output = a != b ? TrueVal : FalseVal;\r\n break;\r\n case 'Less':\r\n output = a < b ? TrueVal : FalseVal;\r\n break;\r\n case 'Less Equal':\r\n output = a <= b ? TrueVal : FalseVal;\r\n break;\r\n case 'Greater':\r\n output = a > b ? TrueVal : FalseVal;\r\n break;\r\n case 'Greater Equal':\r\n output = a >= b ? TrueVal : FalseVal;\r\n break;\r\n }\r\n this.setOutput( 0, output );\r\n }\r\n}\r\nNodeCompare.description =\r\n 'Compare A to B given the selected operator. If true, return value of True else return value of False.';\r\nGraphEditor.registerCustomNode( 'logic/Compare', NodeCompare );\r\n\r\n/*\r\n Event nodes\r\n*/\r\n\r\nclass NodeKeyDown extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'bool' );\r\n this.addProperty( 'Key', 'string', ' ' );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, !!this.editor?.keys[this.properties[0].value] );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'events/KeyDown', NodeKeyDown );\r\n\r\n/*\r\n Input nodes\r\n*/\r\n\r\nclass NodeString extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'string' );\r\n this.addProperty( null, 'string', 'text' );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/String', NodeString );\r\n\r\nclass NodeFloat extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'float' );\r\n this.addProperty( null, 'float', 0.0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Float', NodeFloat );\r\n\r\nclass NodeVector2 extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( 'Value', 'vec2' );\r\n this.addProperty( 'Value', 'vec2', [ 0, 0 ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Vector2', NodeVector2 );\r\n\r\nclass NodeVector3 extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( 'Value', 'vec3' );\r\n this.addProperty( 'Value', 'vec3', [ 0, 0, 0 ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Vector3', NodeVector3 );\r\n\r\nclass NodeVector4 extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( 'Value', 'vec4' );\r\n this.addProperty( 'Value', 'vec4', [ 0, 0, 0, 0 ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Vector4', NodeVector4 );\r\n\r\n/*\r\n Variable nodes\r\n*/\r\n\r\nclass NodeSetVariable extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'Value', 'any' );\r\n this.addOutput( null, 'any' );\r\n this.addProperty( 'Name', 'string', '' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var varName = this.getInput( 0 );\r\n if ( varName == undefined )\r\n {\r\n return;\r\n }\r\n var varValue = this.getInput( 1 );\r\n if ( varValue == undefined )\r\n {\r\n return;\r\n }\r\n this.editor?.setVariable( varName, varValue );\r\n this.setOutput( 0, varValue );\r\n }\r\n}\r\n\r\nNodeSetVariable.title = 'Set Variable';\r\nGraphEditor.registerCustomNode( 'variables/SetVariable', NodeSetVariable );\r\n\r\nclass NodeGetVariable extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'any' );\r\n this.addProperty( 'Name', 'string', '' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var varName = this.getInput( 0 );\r\n if ( varName == undefined )\r\n {\r\n return;\r\n }\r\n var data = this.editor?.getVariable( varName );\r\n if ( data != undefined )\r\n {\r\n this.setOutput( 0, data );\r\n }\r\n }\r\n}\r\n\r\nNodeGetVariable.title = 'Get Variable';\r\nGraphEditor.registerCustomNode( 'variables/GetVariable', NodeGetVariable );\r\n\r\n/*\r\n System nodes\r\n*/\r\n\r\nclass NodeConsoleLog extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var data = this.getInput( 0 );\r\n if ( data == undefined )\r\n {\r\n return;\r\n }\r\n console.log( data );\r\n }\r\n}\r\n\r\nNodeConsoleLog.title = 'Console Log';\r\nGraphEditor.registerCustomNode( 'system/ConsoleLog', NodeConsoleLog );\r\n\r\nclass NodeMain extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'a', 'float' );\r\n this.addInput( 'b', 'bool' );\r\n this.addInput( 'Color', 'vec4' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var data = this.getInput( 2 );\r\n if ( data == undefined )\r\n {\r\n return;\r\n }\r\n console.log( data );\r\n }\r\n}\r\n\r\nNodeMain.blockDelete = true;\r\nGraphEditor.registerCustomNode( 'system/Main', NodeMain );\r\n"],"names":[],"mappings":";;;AAAA;AAIA,IAAK,CAAC,EAAE,EACR;IACI,OAAQ,uBAAuB;AACnC;AAEA,EAAE,CAAC,UAAU,CAAC,IAAI,CAAE,aAAa,CAAE;AAEnC,MAAM,CAAC,GAAG,UAAiB;AAC3B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI;AACpB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI;AACN,EAAE,CAAC;AACD,EAAE,CAAC;AACC,EAAE,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,CAAC,YAAY;MAEvB,WAAW,CAAA;AAEpB,IAAA,MAAM;AACN,IAAA,IAAI;IAEJ,WAAA,CAAa,CAAc,EAAE,CAAc,EAAA;AAEvC,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;AACnC,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IACrC;AAEA,IAAA,KAAK,CAAE,EAAe,EAAA;QAElB,OAAO,CAAC,MAAM,CAAE,EAAE,CAAC,WAAW,IAAI,WAAW,CAAE;AAE/C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE;AAEzC,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM;AACtB,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAE,EAAE,CAAC,IAAI,CAAE;AAErC,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAE,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,CAAE;AACnF,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAE,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAE,CAAE;AAEnF,QAAA,IAAI,CAAC,MAAM,GAAG,QAAQ;QACtB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAE,QAAQ,CAAE;IACxC;AAEA,IAAA,MAAM,CAAE,EAAe,EAAE,IAAA,GAAgB,IAAI,EAAA;AAEzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAE;AAEzC,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM;AACtB,QAAA,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAE,EAAE,CAAC,IAAI,CAAE;QAErC,IAAK,IAAI,EACT;AACI,YAAA,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;AACnC,mBAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC/C;aAEA;AACI,YAAA,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;AACnC,mBAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC/C;IACJ;AACH;AAED;;AAEG;MAEU,WAAW,CAAA;AAEpB,IAAA,OAAO,WAAW,GAAkB,EAAE;;AAItC,IAAA,OAAO,SAAS,GAAW,IAAI;AAC/B,IAAA,OAAO,SAAS,GAAW,GAAG;AAE9B,IAAA,OAAO,eAAe,GAAW,CAAC;AAClC,IAAA,OAAO,gBAAgB,GAAW,CAAC;AAEnC,IAAA,OAAO,aAAa,GAAW,CAAC;AAChC,IAAA,OAAO,gBAAgB,GAAW,CAAC;AAEnC,IAAA,OAAO,OAAO,GAAW,CAAC;AAC1B,IAAA,OAAO,OAAO,GAAW,CAAC;;AAI1B,IAAA,OAAO,aAAa,GAAW,CAAC;AAChC,IAAA,OAAO,cAAc,GAAW,CAAC;AAEjC,IAAA,OAAO,UAAU,GAA8B,EAAE;AAEjD,IAAA,OAAO,sBAAsB,GAAwC,MAAK,EAAE,CAAC;AAC7E,IAAA,OAAO,kBAAkB,GAAsD,MAAK,EAAE,CAAC;AAEvF,IAAA,IAAI;AACJ,IAAA,IAAI;AACJ,IAAA,gBAAgB;IAEhB,YAAY,GAAiB,IAAI;IACjC,IAAI,GAAQ,EAAE;IACd,MAAM,GAAwB,EAAE;IAChC,KAAK,GAAwB,EAAE;IAC/B,SAAS,GAAwB,EAAE;IACnC,MAAM,GAAQ,EAAE;IAChB,kBAAkB,GAAQ,EAAE;IAC5B,aAAa,GAAU,EAAE;IACzB,IAAI,GAAW,EAAE;IACjB,QAAQ,GAAY,KAAK;AACzB,IAAA,KAAK,GAAW,WAAW,CAAC,OAAO;IACnC,SAAS,GAAY,KAAK;AAE1B,IAAA,eAAe;AACf,IAAA,WAAW;IACX,cAAc,GAAY,IAAI;AAC9B,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,SAAS;IACT,cAAc,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IAC9C,mBAAmB,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IACnD,0BAA0B,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IAC1D,kBAAkB,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IAClD,yBAAyB,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;AACzD,IAAA,eAAe;IACf,WAAW,GAAY,KAAK;IAC5B,UAAU,GAAW,GAAG;IACxB,sBAAsB,GAAW,GAAG;IACpC,aAAa,GAAW,IAAI;IAC5B,YAAY,GAAgB,IAAI,IAAI,CAAE,IAAI,CAAC,aAAa,CAAE;AAC1D,IAAA,kBAAkB,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI;IAC9C,mBAAmB,GAAW,WAAW;AACzC,IAAA,WAAW;IACX,UAAU,GAAU,EAAE;IACtB,UAAU,GAAU,EAAE;AACtB,IAAA,cAAc;IACd,cAAc,GAAW,GAAG;AAC5B,IAAA,aAAa;AACb,IAAA,kBAAkB;AAClB,IAAA,uBAAuB;IAEvB,WAAA,CAAa,IAAiB,EAAE,OAAA,GAAe,EAAE,EAAA;AAE7C,QAAA,WAAW,CAAC,WAAW,CAAC,IAAI,CAAE,IAAI,CAAE;QAEpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAE,CAAE,CAAiB,KAAK;AACzD,QAAA,CAAC,EAAE;AACC,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,UAAU,EAAE,kBAAkB;AAC9B,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,cAAc,EAAE,iBAAiB;AACjC,YAAA,eAAe,EAAE,MAAM,IAAI,CAAC,sBAAsB,EAAE;AACpD,YAAA,UAAU,EAAE,MAAM;AAClB,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,CAAE,CAAM,KAAM,IAAI,CAAC,gBAAgB,CAAE,CAAC;AAC1D,SAAA,CAAE;AAEH,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAE;QAEjD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAE,WAAW,CAAE;QAEtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE;AAEvB,QAAA,IAAI,CAAC,MAAM,CAAE,IAAI,CAAC,IAAI,CAAE;QAExB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACxC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc;;AAG5D,QAAA,EAAE,CAAC,OAAO,CAAE,MAAK;YACb,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAE,CAAC,IAAI,CAAC,cAAc,CAAE;QACzD,CAAC,EAAE,EAAE,CAAE;;AAIP,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAE,EAAO,KAAK;AAC9B,QAAA,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAE;AACpB,YAAA;AACI,gBAAA;AACI,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE;AAC5B,oBAAA,UAAU,EAAE;AACf,iBAAA;AACD,gBAAA;AACI,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,IAAI,EAAE,YAAY;AAClB,oBAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE;AAC3B,oBAAA,UAAU,EAAE;AACf;AACJ,aAAA;AACD,YAAA;AACI,gBAAA;AACI,oBAAA,IAAI,EAAE,iBAAiB;AACvB,oBAAA,IAAI,EAAE,OAAO;AACb,oBAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,eAAe,EAAE;AACtC,oBAAA,UAAU,EAAE;AACf,iBAAA;AACD,gBAAA;AACI,oBAAA,IAAI,EAAE,CAAC;AACP,oBAAA,OAAO,EAAE,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;oBACpB,QAAQ,EAAE,CAAE,KAAa,KAAM,IAAI,CAAC,iBAAiB,CAAE,KAAK;AAC/D;AACJ,aAAA;AACD,YAAA;AACI,gBAAA;AACI,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,MAAK;AACX,wBAAA,IAAI,CAAC,SAAS,CAAE,8BAA8B,CAAE;oBACpD;AACH,iBAAA;AACD,gBAAA;AACI,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,IAAI,EAAE,oBAAoB;oBAC1B,QAAQ,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE,MAAM;AAC5C;AACJ;AACJ,SAAA,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAE;AAErB,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAE,IAAI,CAAE,EAAE,IAAI,CAAE;AAChF,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,EAAE,IAAI,CAAE;AAC5E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AAC1E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AACxE,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AAC1E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AAC3E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AAC3E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AACtE,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;AAC5E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,EAAE,IAAI,CAAE,CAAE;AAC5E,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,IAAI,EAAE,KAAK,CAAE,CAAE;QAEhF,IAAI,CAAC,gBAAgB,GAAG,IAAI,YAAY,CAAE,YAAY,EAAE,IAAI,EAAE;AAC1D,YAAA,IAAI,EAAE,CAAE,OAAO,EAAE,IAAI,CAAE;AACvB,YAAA,QAAQ,EAAE,CAAE,KAAK,EAAE,KAAK,CAAE;AAC1B,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,KAAK,EAAE;AACV,SAAA,CAAE;;QAIH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAE,WAAW,EAAE,UAAU,CAAa,EAAA;YAE7E,CAAC,CAAC,wBAAwB,EAAE;YAC5B,CAAC,CAAC,eAAe,EAAE;AACvB,QAAA,CAAC,CAAE;QAEH,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAE,SAAS,EAAE,UAAU,CAAa,EAAA;YAE3E,CAAC,CAAC,wBAAwB,EAAE;YAC5B,CAAC,CAAC,eAAe,EAAE;AACvB,QAAA,CAAC,CAAE;;QAGH,IAAI,CAAC,IAAI,CAAC,WAAW,CAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAE;QAEnD,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAS,KAAK;AAC/C,YAAA,OAAO,CAAE,CAAC,EAAE,CAAC,CAAE;AACnB,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAS,KAAK;AAC/C,YAAA,OAAO,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;AACtB,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAS,KAAK;YAC/C,OAAO,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE;AACzB,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAS,KAAK;YAC/C,OAAO,CAAC,CAAC,CAAC;AACd,QAAA,CAAC,CAAE;QAEH,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,CAAE,CAAW,KAAK;AAChD,YAAA,CAAC,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,CAAE;AACf,YAAA,OAAO,CAAC;AACZ,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,CAAE,CAAW,KAAK;AAChD,YAAA,CAAC,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,CAAE;AACf,YAAA,OAAO,CAAC;AACZ,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,CAAE,CAAW,KAAK;AAChD,YAAA,CAAC,CAAC,KAAK,CAAE,CAAC,EAAE,CAAC,CAAE;AACf,YAAA,OAAO,CAAC;AACZ,QAAA,CAAC,CAAE;QAEH,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,CAAE,CAAW,KAAK;AAChD,YAAA,CAAC,CAAC,IAAI,CAAE,CAAC,CAAE;AACX,YAAA,OAAO,CAAC;AACZ,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,CAAE,CAAW,KAAK;AAChD,YAAA,CAAC,CAAC,IAAI,CAAE,CAAC,CAAE;AACX,YAAA,OAAO,CAAC;AACZ,QAAA,CAAC,CAAE;QACH,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,MAAM,EAAE,CAAE,CAAW,KAAK;AAChD,YAAA,CAAC,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;AACd,YAAA,OAAO,CAAC;AACZ,QAAA,CAAC,CAAE;AAEH,QAAA,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,GAAG,GAAG,GAAG,IAAI,CAAC,sBAAsB;;QAG5F,IAAI,CAAC,gBAAgB,EAAE;;QAIvB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;QAChD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAE,eAAe,CAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAE,IAAI,CAAC,SAAS,CAAE;;QAIvC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;QAChD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAE,eAAe,CAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAE,IAAI,CAAC,SAAS,CAAE;AAEvC,QAAA,CAAC,CAAC,EAAE,GAAG,IAAI;IACf;AAEA,IAAA,OAAO,YAAY,GAAA;QAEf,OAAO,WAAW,CAAC,WAAW;IAClC;AAEA;;;;;AAKG;AAEH,IAAA,OAAO,kBAAkB,CAAE,IAAY,EAAE,SAAc,EAAA;AAEnD,QAAA,IAAK,CAAC,SAAS,CAAC,SAAS,EACzB;AACI,YAAA,MAAM,uEAAuE;QACjF;;QAGA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAE,GAAG,CAAE;QAEnC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,GAAG,CAAE;AAC7C,QAAA,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAE,GAAG,GAAG,CAAC,CAAE;AAC9D,QAAA,SAAS,CAAC,IAAI,GAAG,IAAI;AAErB,QAAA,IAAK,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,EACnC;YACI,OAAO,CAAC,IAAI,CAAE,CAAA,WAAA,EAAc,SAAS,CAAC,KAAK,CAAA,oCAAA,CAAsC,CAAE;QACvF;QAEA,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;QACzC,IAAK,IAAI,EACT;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,wBAAwB,IAAI,CAAA,CAAA,CAAG,CAAE;QACnD;AAEA,QAAA,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS;;AAIxC,QAAA,IAAK,WAAW,CAAC,sBAAsB,EACvC;AACI,YAAA,WAAW,CAAC,sBAAsB,CAAE,IAAI,EAAE,SAAS,CAAE;QACzD;AAEA,QAAA,IAAK,IAAI,IAAI,WAAW,CAAC,kBAAkB,EAC3C;YACI,WAAW,CAAC,kBAAkB,CAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAE;QAC3D;IACJ;AAEA;;;;;;AAMG;IAEH,OAAO,OAAO,CAAE,IAAY,EAAE,KAAc,EAAE,UAAe,EAAE,EAAA;QAE3D,IAAI,SAAS,GAAQ,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;QAEjD,IAAK,CAAC,SAAS,EACf;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,mBAAmB,IAAI,CAAA,iBAAA,CAAmB,CAAE;AAC1D,YAAA,OAAO,IAAI;QACf;AAEA,QAAA,KAAK,GAAG,KAAK,IAAI,SAAS,CAAC,KAAK;AAEhC,QAAA,MAAM,IAAI,GAAG,IAAI,SAAS,CAAE,KAAK,CAAE;AAEnC,QAAA,IAAK,IAAI,CAAC,QAAQ,EAClB;YACI,IAAI,CAAC,QAAQ,EAAE;QACnB;AAEA,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AAEjB,QAAA,IAAK,SAAS,CAAC,IAAI,IAAI,cAAc,EACrC;AACI,YAAA,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG;QAC5B;;QAGA,IAAK,OAAO,EACZ;AACI,YAAA,KAAM,IAAI,CAAC,IAAI,OAAO,EACtB;gBACI,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YACxB;QACJ;AAEA,QAAA,IAAK,IAAI,CAAC,aAAa,EACvB;YACI,IAAI,CAAC,aAAa,EAAE;QACxB;AAEA,QAAA,OAAO,IAAI;IACf;AAEA;;;AAGG;AAEH,IAAA,QAAQ,CAAE,KAAY,EAAA;;AAGlB,QAAA,IAAK,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,EAC1D;YACI;QACJ;QAEA,IAAI,CAAC,KAAK,EAAE;AAEZ,QAAA,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE;QAExE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK;AAE7B,QAAA,IAAK,CAAC,KAAK,CAAC,KAAK,EACjB;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,kCAAkC,CAAE;YAClD;QACJ;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QAEzB,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,KAAM,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,EAC7B;AACI,YAAA,IAAI,CAAC,cAAc,CAAE,IAAI,CAAE;QAC/B;AAEA,QAAA,KAAM,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAC/B;YACI,MAAM,QAAQ,GAAQ,IAAI,CAAC,YAAY,CAAE,KAAK,CAAE;YAChD,QAAQ,CAAC,aAAa,CAAE,qBAAqB,CAAE,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI;AAClE,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAE,QAAQ,CAAE;QACtC;AAEA,QAAA,KAAM,IAAI,MAAM,IAAI,KAAK,CAAC,KAAK,EAC/B;YACI,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;AAEjC,YAAA,KAAM,IAAI,IAAI,IAAI,KAAK,EACvB;AACI,gBAAA,IAAI,CAAC,WAAW,CAAE,IAAI,CAAE;YAC5B;QACJ;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAE,KAAK,CAAC,IAAI,CAAE;AACnC,QAAA,IAAI,CAAC,uBAAuB,CAAE,KAAK,CAAE;IACzC;AAEA;;;;AAIG;IAEH,SAAS,CAAE,GAAW,EAAE,QAA+B,EAAA;AAEnD,QAAA,MAAM,UAAU,GAAG,CAAE,IAAS,KAAK;YAC/B,IAAI,KAAK,GAA0B,CAAE,IAAI,CAAC,IAAI,IAAI,OAAO;AACrD,kBAAE,IAAI,CAAC,QAAQ,CAAE,IAAI;AACrB,kBAAE,IAAI,CAAC,gBAAgB,CAAE,IAAI,CAAE;YAEnC,IAAK,QAAQ,EACb;gBACI,QAAQ,CAAE,KAAK,CAAE;YACrB;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,OAAO,GAAG,CAAE,CAAM,KAAM,OAAO,CAAC,KAAK,CAAE,CAAC,CAAE;QAEhD,EAAE,CAAC,WAAW,CAAE,GAAG,EAAE,UAAU,EAAE,OAAO,CAAE;IAC9C;AAEA;;;AAGG;AAEH,IAAA,QAAQ,CAAE,CAAO,EAAA;AAEb,QAAA,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,KAAK,CAAC,MAAM,GAAG,IAAI;QAEnB,IAAK,CAAC,EACN;;YAGI,KAAM,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EACjC;AACI,gBAAA,IAAI,CAAC,gBAAgB,CAAE,EAAE,CAAE;YAC/B;AAEA,YAAA,KAAK,CAAC,SAAS,CAAE,CAAC,CAAE;QACxB;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAE,KAAK,CAAE;QAEtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAE,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAK;AACtF,gBAAA,IAAI,CAAC,QAAQ,CAAE,KAAK,CAAE;YAC1B,CAAC,EAAE,CAAE;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAE,KAAK,CAAC,IAAI,CAAE;AAElC,QAAA,OAAO,KAAK;IAChB;AAEA;;;AAGG;AAEH,IAAA,gBAAgB,CAAE,CAAO,EAAA;AAErB,QAAA,IAAI,IAAI,GAAG,IAAI,aAAa,EAAE;AAC9B,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QAElB,IAAK,CAAC,EACN;;YAGI,KAAM,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EACjC;AACI,gBAAA,IAAI,CAAC,gBAAgB,CAAE,EAAE,CAAE;YAC/B;AAEA,YAAA,IAAI,CAAC,SAAS,CAAE,CAAC,CAAE;QACvB;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,CAAE;;QAIrB,MAAM,YAAa,SAAQ,SAAS,CAAA;YAEhC,OAAO,IAAI;YACX,OAAO,GAAG;YAEV,QAAQ,GAAA;AAEJ,gBAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,gBAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,KAAK,CAAE;YACjC;YAEA,SAAS,GAAA;AAEL,gBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI;AAC9B,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAE,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,CAAE;AACtD,gBAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,KAAK,CAAE;YAC9B;AACH;AAED,QAAA,YAAY,CAAC,IAAI,GAAG,IAAI;AACxB,QAAA,YAAY,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE;QAC1B,WAAW,CAAC,kBAAkB,CAAE,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAE;QAEvE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAK;AACjF,gBAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,CAAE;YACzB,CAAC,EAAE,CAAE;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAE,IAAI,CAAC,IAAI,CAAE;AAEjC,QAAA,OAAO,IAAI;IACf;AAEA;;AAEG;IAEH,KAAK,GAAA;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE;AAE7B,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;IACnB;IAEA,WAAW,CAAE,IAAY,EAAE,KAAU,EAAA;AAEjC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK;IAChC;AAEA,IAAA,WAAW,CAAE,IAAY,EAAA;AAErB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC/B;IAEA,wBAAwB,CAAE,SAAiB,EAAE,MAAY,EAAA;AAErD,QAAA,IAAK,CAAC,IAAI,CAAC,YAAY,EACvB;YACI;QACJ;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAc;AAC9C,QAAA,KAAM,IAAI,IAAI,IAAI,KAAK,EACvB;AACI,YAAA,IAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EACrB;gBACI;YACJ;YAEA,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAE,IAAI,EAAE,MAAM,CAAE;QACzC;IACJ;AAEA;;;;;AAKG;AAEH,IAAA,WAAW,CAAE,IAAY,EAAE,UAAkB,EAAE,EAAO,EAAA;QAElD,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE;IACzD;AAEA;;AAEG;IAEH,WAAW,CAAE,iBAA0B,KAAK,EAAA;QAExC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAE,eAAe,CAAE,CAAC,OAAO,CAAE,CAAE,CAAC,KAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAE,UAAU,CAAE,CAAE;AAEvG,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;QAE7B,IAAK,CAAC,cAAc,EACpB;AACI,YAAA,IAAI,CAAC,uBAAuB,CAAE,KAAK,CAAE;QACzC;IACJ;AAEA,IAAA,cAAc,CAAE,IAAS,EAAA;AAErB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE;QAEpC,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AACnD,QAAA,aAAa,CAAC,SAAS,CAAC,GAAG,CAAE,cAAc,CAAE;AAC7C,QAAA,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;AAC9B,QAAA,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;QAE7B,IAAI,CAAC,cAAc,CAAE,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAE;AAEnD,QAAA,IAAI,KAAK;;AAGT,QAAA,IAAK,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EACnD;AACI,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;AAC1C,YAAA,aAAa,CAAC,SAAS,CAAC,GAAG,CAAE,QAAQ,CAAE;QAC3C;aAEA;YACI,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAE,GAAG,CAAE;AACxC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,GAAG,CAAE;AAC9C,YAAA,aAAa,CAAC,SAAS,CAAC,GAAG,CAAE,QAAQ,CAAE;QAC3C;;AAIA,QAAA,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK;QAE3B,IAAK,KAAK,EACV;;AAEI,YAAA,IAAK,KAAK,CAAC,WAAW,IAAI,KAAK,EAC/B;AACI,gBAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CAAE,GAAG,CAAE;YAC7B;;iBAGA;AACI,gBAAA,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAE,KAAK,CAAE;AAC5B,gBAAA,KAAK,CAAC,OAAO,CAAE,CAAE,CAAS,EAAE,CAAS,KAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAE;YACnE;AAEA,YAAA,aAAa,CAAC,KAAK,CAAC,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,sBAAsB,GAAG,GAAG;QACpG;QAEA,aAAa,CAAC,gBAAgB,CAAE,WAAW,EAAE,CAAE,CAAa,KAAK;;YAE7D,IAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB,EACpC;gBACI;YACJ;AAEA,YAAA,IAAK,CAAC,CAAC,MAAM,EACb;AACI,gBAAA,IAAI,CAAC,aAAa,CAAE,aAAa,CAAE;YACvC;iBAEA;gBACI,IAAK,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,KAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAE,EACnE;AACI,oBAAA,IAAI,CAAC,WAAW,CAAE,IAAI,CAAE;gBAC5B;gBAEA,IAAK,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAE,UAAU,CAAE,EACpD;AACI,oBAAA,IAAI,CAAC,WAAW,CAAE,aAAa,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAE;gBAC9D;YACJ;AACJ,QAAA,CAAC,CAAE;QAEH,aAAa,CAAC,gBAAgB,CAAE,aAAa,EAAE,CAAE,CAAC,KAAK;YACnD,CAAC,CAAC,cAAc,EAAE;YAClB,CAAC,CAAC,eAAe,EAAE;YACnB,CAAC,CAAC,wBAAwB,EAAE;YAE5B,EAAE,CAAC,cAAc,CAAE,IAAI,EAAE,CAAC,EAAE,CAAE,CAAqB,KAAK;AACpD,gBAAA,CAAC,CAAC,GAAG,CAAE,MAAM,EAAE,MAAK;oBAChB,IAAI,CAAC,cAAc,GAAG;wBAClB,EAAE,EAAE,IAAI,CAAC,EAAE;AACX,wBAAA,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE;qBAC3B;AACL,gBAAA,CAAC,CAAE;;;;AAOH,gBAAA,CAAC,CAAC,GAAG,CAAE,EAAE,CAAE;AAEX,gBAAA,CAAC,CAAC,GAAG,CAAE,QAAQ,EAAE,MAAK;oBAClB,IAAI,CAAC,WAAW,CAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAW,CAAE;AAC7D,gBAAA,CAAC,CAAE;AACP,YAAA,CAAC,CAAE;AACP,QAAA,CAAC,CAAE;QAEH,aAAa,CAAC,gBAAgB,CAAE,UAAU,EAAE,CAAE,CAAC,KAAK;;YAEhD,IAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB,EACpC;gBACI;YACJ;;AAGA,YAAA,IAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAC1B;AACI,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAE;YACtD;AACJ,QAAA,CAAC,CAAE;;QAGH,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAChD,QAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAE,oBAAoB,CAAE;AAChD,QAAA,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK;AACjC,QAAA,aAAa,CAAC,WAAW,CAAE,UAAU,CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAmCvC,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAC5C,QAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAE,iBAAiB,CAAE;AACzC,QAAA,aAAa,CAAC,WAAW,CAAE,MAAM,CAAE;QAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;;QAGtD,IAAK,SAAS,EACd;YACI,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAClD,YAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAE,oBAAoB,CAAE;AAChD,YAAA,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM;AACpD,YAAA,MAAM,CAAC,WAAW,CAAE,UAAU,CAAE;AAEhC,YAAA,KAAM,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAC1B;AACI,gBAAA,IAAK,CAAC,CAAC,CAAC,IAAI,EACZ;oBACI,OAAO,CAAC,IAAI,CAAE,CAAA,uBAAA,EAA0B,IAAI,CAAC,KAAK,CAAA,cAAA,CAAgB,CAAE;oBACpE;gBACJ;gBAEA,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAC3C,gBAAA,KAAK,CAAC,SAAS,GAAG,wBAAwB;AAC1C,gBAAA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAC,QAAQ,EAAE;gBAEhE,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC3C,IAAI,CAAC,SAAS,GAAG,iBAAiB,GAAG,CAAC,CAAC,IAAI;gBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI;AAC7B,gBAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS;AAC/D,gBAAA,KAAK,CAAC,WAAW,CAAE,IAAI,CAAE;gBAEzB,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC/C,QAAQ,CAAC,SAAS,GAAG,qBAAqB,GAAG,CAAC,CAAC,IAAI;AACnD,gBAAA,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AAC3B,gBAAA,KAAK,CAAC,WAAW,CAAE,QAAQ,CAAE;AAE7B,gBAAA,IAAK,CAAC,CAAC,IAAI,EACX;oBACI,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;AAC3C,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AAChC,oBAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AACvB,oBAAA,KAAK,CAAC,WAAW,CAAE,IAAI,CAAE;gBAC7B;AAEA,gBAAA,UAAU,CAAC,WAAW,CAAE,KAAK,CAAE;YACnC;QACJ;;QAGA,IAAK,UAAU,EACf;YACI,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AACnD,YAAA,WAAW,CAAC,SAAS,CAAC,GAAG,CAAE,qBAAqB,CAAE;AAClD,YAAA,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM;AACpD,YAAA,MAAM,CAAC,WAAW,CAAE,WAAW,CAAE;AAEjC,YAAA,KAAM,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAC3B;AACI,gBAAA,IAAK,CAAC,CAAC,CAAC,IAAI,EACZ;oBACI,OAAO,CAAC,IAAI,CAAE,CAAA,uBAAA,EAA0B,IAAI,CAAC,KAAK,CAAA,cAAA,CAAgB,CAAE;gBACxE;gBAEA,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAC5C,gBAAA,MAAM,CAAC,SAAS,GAAG,yBAAyB;AAC5C,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AAElE,gBAAA,IAAK,CAAC,CAAC,IAAI,EACX;oBACI,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;AAC3C,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AAChC,oBAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AACvB,oBAAA,MAAM,CAAC,WAAW,CAAE,IAAI,CAAE;gBAC9B;gBAEA,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC3C,IAAI,CAAC,SAAS,GAAG,kBAAkB,GAAG,CAAC,CAAC,IAAI;gBAC5C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI;AAC7B,gBAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS;AAC/D,gBAAA,MAAM,CAAC,WAAW,CAAE,IAAI,CAAE;gBAE1B,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC/C,QAAQ,CAAC,SAAS,GAAG,sBAAsB,GAAG,CAAC,CAAC,IAAI;AACpD,gBAAA,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AAC3B,gBAAA,MAAM,CAAC,WAAW,CAAE,QAAQ,CAAE;AAE9B,gBAAA,WAAW,CAAC,WAAW,CAAE,MAAM,CAAE;YACrC;QACJ;;AAIA,QAAA,EAAE,CAAC,aAAa,CAAE,aAAa,EAAE;YAC7B,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAE,IAAI,CAAE;YACtC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAE,IAAI;AAC3C,SAAA,CAAE;AAEH,QAAA,IAAI,CAAC,gBAAgB,CAAE,aAAa,CAAE;QAEtC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAE,KAAK,EAAE,GAAG,CAAE,GAAG,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE;AAClG,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE;AAEnD,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;AACZ,QAAA,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;AAEhC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAE,aAAa,CAAE;;AAG3C,QAAA,IAAK,IAAI,CAAC,KAAK,IAAI,MAAM,EACzB;AACI,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE;QAClB;AAEA,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAE,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,CAAE;QAE7E,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAE,CAAE,OAAO,KAAK;AACpD,YAAA,KAAM,MAAM,KAAK,IAAI,OAAO,EAC5B;AACI,gBAAA,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW;gBAC5B,IAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,MAAM,EAC5B;oBACI;gBACJ;AACA,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAE,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,YAAY,CAAE;YACjF;AACJ,QAAA,CAAC,CAAE;AAEH,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAE,aAAa,CAAE;AAE5C,QAAA,OAAO,aAAa;IACxB;IAEA,iBAAiB,CAAE,GAAgB,EAAE,IAAe,EAAA;;QAGhD,IAAI,MAAM,GAAG,GAAG,CAAC,aAAa,CAAE,kBAAkB,CAAE;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;;QAGtD,IAAK,SAAS,EACd;YACI,MAAM,UAAU,GAAG,MAAM,EAAE,aAAa,CAAE,qBAAqB,CAAG;AAClE,YAAA,UAAU,CAAC,SAAS,GAAG,EAAE;AAEzB,YAAA,KAAM,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAC1B;AACI,gBAAA,IAAK,CAAC,CAAC,CAAC,IAAI,EACZ;oBACI,OAAO,CAAC,IAAI,CAAE,CAAA,uBAAA,EAA0B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA,cAAA,CAAgB,CAAE;oBAC/E;gBACJ;gBAEA,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAC3C,gBAAA,KAAK,CAAC,SAAS,GAAG,wBAAwB;AAC1C,gBAAA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,iBAAiB,CAAC,QAAQ,EAAE;gBAEhE,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC3C,IAAI,CAAC,SAAS,GAAG,iBAAiB,GAAG,CAAC,CAAC,IAAI;AAC3C,gBAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS;AAC/D,gBAAA,KAAK,CAAC,WAAW,CAAE,IAAI,CAAE;gBAEzB,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC/C,QAAQ,CAAC,SAAS,GAAG,qBAAqB,GAAG,CAAC,CAAC,IAAI;AACnD,gBAAA,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AAC3B,gBAAA,KAAK,CAAC,WAAW,CAAE,QAAQ,CAAE;AAE7B,gBAAA,IAAK,CAAC,CAAC,IAAI,EACX;oBACI,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;AAC3C,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AAChC,oBAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AACvB,oBAAA,KAAK,CAAC,WAAW,CAAE,IAAI,CAAE;gBAC7B;AAEA,gBAAA,UAAU,CAAC,WAAW,CAAE,KAAK,CAAE;YACnC;QACJ;;QAGA,IAAK,UAAU,EACf;YACI,MAAM,WAAW,GAAG,MAAM,EAAE,aAAa,CAAE,sBAAsB,CAAG;AACpE,YAAA,WAAW,CAAC,SAAS,GAAG,EAAE;AAE1B,YAAA,KAAM,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,EAC3B;AACI,gBAAA,IAAK,CAAC,CAAC,CAAC,IAAI,EACZ;oBACI,OAAO,CAAC,IAAI,CAAE,CAAA,uBAAA,EAA0B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA,cAAA,CAAgB,CAAE;gBACnF;gBAEA,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAC5C,gBAAA,MAAM,CAAC,SAAS,GAAG,yBAAyB;AAC5C,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE;AAElE,gBAAA,IAAK,CAAC,CAAC,IAAI,EACX;oBACI,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;AAC3C,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AAChC,oBAAA,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AACvB,oBAAA,MAAM,CAAC,WAAW,CAAE,IAAI,CAAE;gBAC9B;gBAEA,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC3C,IAAI,CAAC,SAAS,GAAG,kBAAkB,GAAG,CAAC,CAAC,IAAI;AAC5C,gBAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS;AAC/D,gBAAA,MAAM,CAAC,WAAW,CAAE,IAAI,CAAE;gBAE1B,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAE,MAAM,CAAE;gBAC/C,QAAQ,CAAC,SAAS,GAAG,sBAAsB,GAAG,CAAC,CAAC,IAAI;AACpD,gBAAA,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI;AAC3B,gBAAA,MAAM,CAAC,WAAW,CAAE,QAAQ,CAAE;AAE9B,gBAAA,WAAW,CAAC,WAAW,CAAE,MAAM,CAAE;YACrC;QACJ;AAEA,QAAA,IAAI,CAAC,gBAAgB,CAAE,GAAG,CAAE;IAChC;AAEA,IAAA,gBAAgB,CAAE,aAA0B,EAAA;QAExC,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAE,kBAAkB,CAAE;;QAIhE,MAAM,EAAE,gBAAgB,CAAE,iBAAiB,CAAE,CAAC,OAAO,CAAE,CAAE,EAAO,KAAK;YACjE,EAAE,CAAC,gBAAgB,CAAE,WAAW,EAAE,CAAE,CAAa,KAAK;;gBAElD,IAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB,EACpC;oBACI;gBACJ;AAEA,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,EAAE;gBAElC,IAAI,CAAC,eAAe,GAAG;oBACnB,KAAK,EAAE,QAAQ,CAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAE;AACtC,oBAAA,EAAE,EAAE,EAAE;oBACN,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAE,SAAS,CAAE,GAAG,WAAW,CAAC,aAAa,GAAG,WAAW,CAAC,cAAc;AACnG,oBAAA,KAAK,EAAE;iBACV;gBAED,CAAC,CAAC,eAAe,EAAE;gBACnB,CAAC,CAAC,wBAAwB,EAAE;AAChC,YAAA,CAAC,CAAE;YAEH,EAAE,CAAC,gBAAgB,CAAE,SAAS,EAAE,CAAE,CAAa,KAAK;gBAChD,CAAC,CAAC,eAAe,EAAE;gBACnB,CAAC,CAAC,wBAAwB,EAAE;;AAG5B,gBAAA,IAAK,CAAE,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,IAAK,GAAG,EACjD;oBACI,OAAO,IAAI,CAAC,eAAe;oBAC3B;gBACJ;AAEA,gBAAA,IAAK,IAAI,CAAC,eAAe,EACzB;;oBAEI,IAAK,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC,CAAE,EACvB;;wBAEI,EAAE,CAAC,aAAa,CAAE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAE;oBAClG;oBAEA,OAAO,IAAI,CAAC,eAAe;gBAC/B;AACJ,YAAA,CAAC,CAAE;YAEH,EAAE,CAAC,gBAAgB,CAAE,OAAO,EAAE,CAAE,CAAa,KAAK;AAC9C,gBAAA,IAAK,CAAC,EAAE,CAAC,KAAK,EACd;oBACI;gBACJ;gBAEA,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAW;AACpD,gBAAA,IAAI,CAAC,YAAY,CAAE,MAAM,EAAE,EAAE,CAAE;AACnC,YAAA,CAAC,CAAE;AACP,QAAA,CAAC,CAAE;IACP;AAEA,IAAA,eAAe,CAAE,aAAA,GAAyB,KAAK,EAAE,OAAqB,EAAA;QAElE,IAAI,QAAQ,GAAG,IAAI;QAEnB,IAAK,aAAa,EAClB;YACI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAE;QACtD;aAEA;AACI,YAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAE,CAAC,MAAM,CAAE,CAAE,CAAM,KAC/D,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAE,cAAc,CAAE,CACzC;QACL;QAEA,IAAK,OAAO,EACZ;AACI,YAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAE,CAAE,CAAC,KAAM,CAAC,IAAI,OAAO,CAAE;QACvD;AAEA,QAAA,OAAO,QAAQ;IACnB;AAEA,IAAA,YAAY,CAAE,MAAmB,EAAA;AAE7B,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,mBAAmB;QACtF,EAAE,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAE;AAEtC,QAAA,KAAM,IAAI,MAAM,IAAI,IAAI,CAAC,aAAa,EACtC;YACI,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAE,MAAM,CAAE;AAE5C,YAAA,IAAI,CAAC,cAAc,CAAE,EAAE,EAAE,EAAE,CAAE;AAE7B,YAAA,IAAI,CAAC,gBAAgB,CAAE,MAAM,CAAE;QACnC;IACJ;IAEA,WAAW,CAAE,MAAmB,EAAE,CAAY,EAAA;AAE1C,QAAA,IAAK,CAAC,CAAC,CAAC,QAAQ,EAChB;YACI;QACJ;QAEA,IAAI,CAAC,WAAW,EAAE;IACtB;AAEA,IAAA,YAAY,CAAE,MAAW,EAAA;;AAIrB,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK;QAEjC,IAAK,CAAC,YAAY,EAClB;YACI;QACJ;AAEA,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,mBAAmB;QACtF,EAAE,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAE;AAEtC,QAAA,IAAI,CAAC,cAAc,CAAE,MAAM,EAAE,EAAE,CAAE;AAEjC,QAAA,KAAM,IAAI,MAAM,IAAI,YAAY,EAChC;AACI,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,KAAK,MAAM;AAE7C,YAAA,MAAM,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAE,MAAgB,CAAE;YAEzE,IAAI,CAAC,cAAc,CAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,CAAE;YAEvC,IAAK,CAAC,OAAO,EACb;AACI,gBAAA,IAAI,CAAC,gBAAgB,CAAE,MAAgB,CAAE;YAC7C;QACJ;IACJ;AAEA,IAAA,YAAY,CAAE,MAAW,EAAA;;QAIrB,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAE,MAAM,CAAE;QAErD,MAAM,YAAY,GAAG,EAAE;AAEvB,QAAA,KAAM,IAAI,GAAG,IAAM,IAAI,CAAC,eAAe,CAAE,IAAI,EAAE,MAAM,CAAqB,EAC1E;YACI,MAAM,CAAC,GAAG,UAAU,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE;YACtC,MAAM,CAAC,GAAG,UAAU,CAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAE;AACrC,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAE,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE,EAAE,IAAI,IAAI,CAAE,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,CAAC,CAAE,CAAE;YAE1G,IAAK,CAAC,QAAQ,CAAC,MAAM,CAAE,OAAO,CAAE,EAChC;gBACI;YACJ;AAEA,YAAA,YAAY,CAAC,IAAI,CAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAE;QACjD;AAEA,QAAA,MAAM,CAAC,KAAK,GAAG,YAAY;IAC/B;AAEA,IAAA,WAAW,CAAE,GAAgB,EAAE,iBAA0B,KAAK,EAAE,aAAsB,IAAI,EAAA;QAEtF,IAAK,CAAC,cAAc,EACpB;AACI,YAAA,IAAI,CAAC,WAAW,CAAE,IAAI,CAAE;QAC5B;AAEA,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;QAE/B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAW;AAEtC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAE,EAAE,CAAE;QAE7B,IAAK,UAAU,EACf;;AAEI,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAE,GAAG,CAAE;QACrC;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI;QAEhC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAE,IAAI,CAAC,KAAK,CAAE;AAE5C,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;QACvC,KAAK,CAAC,KAAK,EAAE;;AAGb,QAAA,IAAK,IAAI,CAAC,WAAW,CAAC,WAAW,EACjC;AACI,YAAA,KAAK,CAAC,OAAO,CAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAE;QACjF;;QAGA,IAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,QAAQ,EAC1C;AACI,YAAA,KAAK,CAAC,OAAO,CAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAE,CAAS,KAAK;AAC/C,gBAAA,IAAI,CAAC,KAAK,GAAG,CAAC;gBACd,MAAM,MAAM,GAAQ,GAAG,CAAC,aAAa,CAAE,qBAAqB,CAAE;AAC9D,gBAAA,MAAM,CAAC,SAAS,GAAG,CAAC;AACxB,YAAA,CAAC,CAAE;QACP;AAEA,QAAA,KAAM,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAC9B;AACI,YAAA,QAAS,CAAC,CAAC,IAAI;AAEX,gBAAA,KAAK,OAAO;AACZ,gBAAA,KAAK,KAAK;AACN,oBAAA,KAAK,CAAC,SAAS,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAS,KAAK;AAC9C,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACf,oBAAA,CAAC,CAAE;oBACH;AACJ,gBAAA,KAAK,QAAQ;AACT,oBAAA,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAS,KAAK;AAC5C,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACf,oBAAA,CAAC,CAAE;oBACH;AACJ,gBAAA,KAAK,MAAM;AACP,oBAAA,KAAK,CAAC,UAAU,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAW,KAAK;AACjD,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACf,oBAAA,CAAC,CAAE;oBACH;AACJ,gBAAA,KAAK,MAAM;AACP,oBAAA,KAAK,CAAC,UAAU,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAW,KAAK;AACjD,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACf,oBAAA,CAAC,CAAE;oBACH;AACJ,gBAAA,KAAK,MAAM;AACP,oBAAA,KAAK,CAAC,UAAU,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAW,KAAK;AACjD,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACf,oBAAA,CAAC,CAAE;oBACH;AACJ,gBAAA,KAAK,QAAQ;AACT,oBAAA,KAAK,CAAC,SAAS,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAM,KAAK;AACtD,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACf,oBAAA,CAAC,CAAE;oBACH;AACJ,gBAAA,KAAK,OAAO;AACR,oBAAA,KAAK,CAAC,QAAQ,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAE,CAAQ,KAAK;AAC5C,wBAAA,CAAC,CAAC,KAAK,GAAG,CAAC;AACX,wBAAA,IAAK,IAAI,CAAC,IAAI,IAAI,gBAAgB,EAClC;AACI,4BAAA,IAAI,CAAC,UAAU,CAAE,CAAC,CAAE;AACpB,4BAAA,IAAI,CAAC,iBAAiB,CAAE,GAAG,EAAE,IAAI,CAAE;wBACvC;oBACJ,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAE;oBAC/B;;QAEZ;AAEA,QAAA,IAAI,CAAC,uBAAuB,CAAE,IAAI,CAAE;IACxC;AAEA,IAAA,aAAa,CAAE,GAAgB,EAAA;AAE3B,QAAA,GAAG,CAAC,SAAS,CAAC,MAAM,CAAE,UAAU,CAAE;;AAGlC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAE;QAC3D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAE,GAAG,EAAE,CAAC,CAAE;AAEnC,QAAA,IAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAC/B;AACI,YAAA,IAAI,CAAC,uBAAuB,CAAE,KAAK,CAAE;QACzC;IACJ;AAEA,IAAA,cAAc,CAAE,GAAQ,EAAE,gBAA6B,EAAE,qBAA8B,IAAI,EAAA;AAEvF,QAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CACpC,IAAI,IAAI,CAAE,UAAU,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,EAAE,UAAU,CAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAE,CAAE,CACxE;QAED,IAAK,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,QAAQ,EACrC;AACI,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AACxE,YAAA,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAE,WAAW,CAAC,CAAC,GAAG,QAAQ,CAAE,GAAG,QAAQ;AACjE,YAAA,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAE,WAAW,CAAC,CAAC,GAAG,QAAQ,CAAE,GAAG,QAAQ;AACjE,YAAA,GAAG,CAAC,QAAQ,GAAG,KAAK;QACxB;AAEA,QAAA,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAE,WAAW,CAAC,CAAC,IAAK,IAAI;AACzC,QAAA,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAE,WAAW,CAAC,CAAC,IAAK,IAAI;;QAGxC,IAAK,kBAAkB,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAC5C;AACI,YAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5C,YAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW;QACxC;IACJ;AAEA,IAAA,WAAW,CAAE,MAAc,EAAA;QAEvB,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACnC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,QAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG;AAEvB,QAAA,OAAO,CAAC,MAAM,CAAE,EAAE,CAAE;AAEpB,QAAA,IAAK,IAAI,CAAC,WAAW,CAAC,WAAW,EACjC;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,CAAA,kBAAA,CAAoB,CAAE;YACpC;QACJ;AAEA,QAAA,EAAE,CAAC,aAAa,CAAE,EAAE,CAAE;;AAItB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;QAIzB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,CAAE,CAAE,CAAC,KAAM,CAAC,CAAC,EAAE,KAAK,MAAM,CAAE;AACzE,QAAA,OAAO,CAAC,MAAM,CAAE,GAAG,IAAI,CAAC,CAAE;QAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAE,GAAG,EAAE,CAAC,CAAE;;QAIxC,KAAM,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EACxC;YACI,IAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,MAAM,CAAE,EAC5B;gBACI;YACJ;YAEA,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAE,GAAG,CAAE;AAC/B,YAAA,MAAM,aAAa,GAAG,GAAG,CAAC,SAAS,CAAE,IAAI,GAAG,CAAC,CAAE,IAAI,MAAM;;AAIzD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM;AAEpD,YAAA,KAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,EAAE,CAAC,EAClC;AACI,gBAAA,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAE1C,EAAE,CAAC,aAAa,CAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAE;AAE3C,gBAAA,MAAM,YAAY,GAAG,aAAa,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU;gBAErE,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAE,YAAY,CAAE;AAC7D,gBAAA,MAAM,GAAG,GAAG,aAAa,CAAC,aAAa,CACnC,aAAa,GAAG,qBAAqB,GAAG,sBAAsB,CACjE;gBACD,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;AAEzE,gBAAA,MAAM,OAAO,GAAG,aAAa,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ;AAC9D,gBAAA,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAE,MAAM,CAAE;AACvD,gBAAA,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAE,WAAW,EAAE,CAAC,CAAE;;gBAG1C,IAAK,aAAa,EAClB;AACI,oBAAA,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC/B;;qBAGA;oBACI,IAAI,MAAM,GAAG,KAAK;AAClB,oBAAA,KAAM,IAAI,KAAK,IAAI,EAAE,CAAC,KAAK,EAC3B;wBACI,IAAK,CAAC,KAAK,EACX;4BACI;wBACJ;AACA,wBAAA,KAAM,IAAI,CAAC,IAAI,KAAK,EACpB;4BACI,MAAM,GAAG,MAAM,KAAM,CAAC,CAAC,CAAC,CAAE;wBAC9B;oBACJ;oBACA,IAAK,CAAC,MAAM,EACZ;AACI,wBAAA,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC/B;gBACJ;YACJ;YAEA,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;QACvC;IACJ;AAEA,IAAA,YAAY,CAAE,OAAe,EAAA;QAEzB,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;AAChC,QAAA,EAAE,CAAC,aAAa,CAAE,GAAG,CAAE;;AAIvB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;QAI3B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAE,CAAE,CAAC,KAAM,CAAC,CAAC,EAAE,KAAK,OAAO,CAAE;AAC3E,QAAA,OAAO,CAAC,MAAM,CAAE,GAAG,IAAI,CAAC,CAAE;QAC1B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAE,GAAG,EAAE,CAAC,CAAE;IAC7C;AAEA,IAAA,UAAU,CAAE,MAAc,EAAE,OAAgB,EAAE,QAAsB,EAAA;QAEhE,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;AAE1B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAE1D,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAE,MAAM,CAAE;QAE5C,IAAK,CAAC,QAAQ,EACd;YACI;QACJ;QAEA,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAE,MAAM,CAAE;QAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAE,QAAQ,CAAC,IAAI,CAAE;QACpD,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAE,QAAQ,CAAC,UAAU,CAAE;QAEvD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAE,OAAO,CAAE;AAE7C,QAAA,IAAI,CAAC,cAAc,CAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAE,EAAE,CAAE,CAAE;AAEtE,QAAA,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,IAAI,CAAE;QAEhC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAE,OAAO,CAAE;IAC3C;IAEA,WAAW,GAAA;;QAGP,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAE,IAAI,CAAC,aAAa,CAAE;QAErD,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,KAAM,IAAI,MAAM,IAAI,WAAW,EAC/B;AACI,YAAA,IAAI,CAAC,UAAU,CAAE,MAAM,CAAE;QAC7B;IACJ;;AAGA,IAAA,gBAAgB,CAAE,GAAgB,EAAA;QAE9B,OAAO,IAAI,IAAI,CAAE,UAAU,CAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,EAAE,UAAU,CAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAE,CAAE;IAChF;AAEA,IAAA,kBAAkB,CAAE,MAAc,EAAA;QAE9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI;IAC7D;IAEA,SAAS,CAAE,SAAiB,EAAE,SAAiB,EAAA;AAE3C,QAAA,MAAM,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS;QACvC,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC;IACxC;IAEA,YAAY,CAAE,MAAc,EAAE,EAAO,EAAA;QAEjC,MAAM,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAE,SAAS,CAAE;QAClD,MAAM,QAAQ,GAAG,QAAQ,CAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAE;AAEhD,QAAA,IAAK,OAAO,EACZ;AACI,YAAA,IAAI,WAAW,GAAW,EAAE;AAE5B,YAAA,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAE,CAAE,CAAM,EAAE,CAAS,KAAK;gBACrD,WAAW,GAAG,CAAC;gBACf,OAAO,CAAC,KAAK,SAAS;AAC1B,YAAA,CAAC,CAAE,CAAC,CAAC,CAAC;AACN,YAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;;YAG3B,IAAK,CAAC,QAAQ,EACd;gBACI;YACJ;YAEA,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAE,QAAQ,EAAE,MAAM,CAAE;YAE9C,IAAI,OAAO,GAAG,KAAK,CAAC,SAAS,CAAE,CAAE,CAAM,MAAQ,CAAC,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,WAAW,CAAE,CAAE;AACvG,YAAA,EAAE,CAAC,aAAa,CAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAE;AACrD,YAAA,KAAK,CAAC,MAAM,CAAE,OAAO,EAAE,CAAC,CAAE;;YAI1B,OAAO,EAAE,CAAC,KAAK;AACf,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;;YAI3B,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAE,QAAQ,CAAE;YACrD,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAE,sBAAsB,CAAE;YAC7D,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;YAE5C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAE,CAAE,CAAM,KAAM,CAAC,IAAI,MAAM,CAAE;AAC3E,YAAA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAE,GAAG,EAAE,CAAC,CAAE;YAEzC,IAAI,MAAM,GAAG,KAAK;AAElB,YAAA,KAAM,IAAI,EAAE,IAAI,QAAQ,CAAC,KAAK,EAC9B;AACI,gBAAA,IAAK,CAAC,EAAE;oBAAG;;AAEX,gBAAA,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,CAAE,CAAE,CAAM,KAAM,CAAC,KAAK,SAAS,EAAE,CAAC,CAAE;YACpE;YAEA,IAAK,CAAC,MAAM,EACZ;gBACI,OAAO,QAAQ,CAAC,KAAK;AACrB,gBAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;YACrC;QACJ;;aAGA;AACI,YAAA,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM;AAEhC,YAAA,KAAM,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,QAAQ,EAAE,EAAE,WAAW,EAChE;gBACI,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;gBAErC,IAAK,CAAC,OAAO,EACb;oBACI;gBACJ;AAEA,gBAAA,KAAM,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAChD;AACI,oBAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;oBAC5B,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAE,MAAM,EAAE,QAAQ,CAAE;oBAE9C,IAAI,OAAO,GAAG,KAAK,CAAC,SAAS,CAAE,CAC3B,CAAM,MACH,CAAC,CAAC,QAAQ,IAAI,WAAW,IAAI,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAE,CAAE;AAC/D,oBAAA,EAAE,CAAC,aAAa,CAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAE;AACrD,oBAAA,KAAK,CAAC,MAAM,CAAE,OAAO,EAAE,CAAC,CAAE;;AAI1B,oBAAA,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAE,EAAE,EAAE,CAAC,CAAE;;oBAIrC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAE,QAAQ,CAAE;oBACrD,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAE,qBAAqB,CAAE;oBAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;oBAE5C,OAAO,QAAQ,CAAC,KAAK;AACrB,oBAAA,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACrC;YACJ;YAEA,OAAO,EAAE,CAAC,KAAK;AACf,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC/B;IACJ;IAEA,aAAa,CAAE,SAAkB,KAAK,EAAA;AAElC,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM;IAC3B;AAEA,IAAA,eAAe,CAAE,CAAgB,EAAA;;QAG7B,IAAK,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EACxC;YACI;QACJ;AAEA,QAAA,MAAM,MAAM,GAAQ,CAAC,CAAC,MAAM;QAC5B,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG;QAE7B,QAAS,GAAG;AAER,YAAA,KAAK,QAAQ;gBACT,IAAI,CAAC,WAAW,EAAE;gBAClB;AACJ,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,WAAW;gBACZ,CAAC,CAAC,cAAc,EAAE;AAClB,gBAAA,IAAI,CAAC,gBAAgB,CAAE,CAAC,CAAE;gBAC1B;AACJ,YAAA,KAAK,GAAG;AACJ,gBAAA,IAAK,CAAC,CAAC,OAAO,EACd;oBACI,CAAC,CAAC,cAAc,EAAE;oBAClB,IAAI,CAAC,YAAY,EAAE;gBACvB;gBACA;AACJ,YAAA,KAAK,GAAG;AACJ,gBAAA,IAAK,CAAC,CAAC,OAAO,EACd;oBACI,CAAC,CAAC,cAAc,EAAE;oBAClB,IAAI,CAAC,OAAO,EAAE;gBAClB;gBACA;AACJ,YAAA,KAAK,GAAG;AACJ,gBAAA,IAAK,CAAC,CAAC,OAAO,EACd;oBACI,CAAC,CAAC,cAAc,EAAE;oBAClB,IAAI,CAAC,OAAO,EAAE;gBAClB;gBACA;;AAGR,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;IACzB;AAEA,IAAA,aAAa,CAAE,CAAgB,EAAA;;QAG3B,IAAK,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,EACxC;YACI;QACJ;AAEA,QAAA,MAAM,MAAM,GAAQ,CAAC,CAAC,MAAM;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG;AAE/B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACzB;AAEA,IAAA,aAAa,CAAE,CAAM,EAAA;QAEjB,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;QAE1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAE9C,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,CAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE;AAExE,QAAA,MAAM,YAAY,GAAG,IAAI,IAAI,CAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAE;AAE7E,QAAA,IAAK,IAAI,CAAC,WAAW,EACrB;AACI,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AAChF,YAAA,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAE,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAE,GAAG,QAAQ;AACnE,YAAA,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAE,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAE,GAAG,QAAQ;YACnE,IAAI,CAAC,0BAA0B,GAAG,YAAY,CAAC,GAAG,CAAE,IAAI,CAAC,yBAAyB,CAAE;QACxF;AAEA,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAE,IAAI,CAAC,kBAAkB,CAAE;AAE7E,QAAA,IAAK,CAAC,CAAC,IAAI,IAAI,WAAW,EAC1B;AACI,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,EAAE;AAElC,YAAA,IAAI,CAAC,iBAAiB,CAAE,CAAC,CAAE;QAC/B;AACK,aAAA,IAAK,CAAC,CAAC,IAAI,IAAI,SAAS,EAC7B;AACI,YAAA,IAAK,CAAE,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,IAAK,GAAG,EACjD;AACI,gBAAA,IAAI,CAAC,aAAa,CAAE,CAAC,CAAE;YAC3B;AAEA,YAAA,IAAI,CAAC,eAAe,CAAE,CAAC,CAAE;QAC7B;AACK,aAAA,IAAK,CAAC,CAAC,IAAI,IAAI,WAAW,EAC/B;AACI,YAAA,IAAI,CAAC,iBAAiB,CAAE,CAAC,CAAE;QAC/B;aACK,IAAK,CAAC,CAAC,IAAI,IAAI,OAAO,EAC3B;AACI,YAAA,QAAS,CAAC,CAAC,MAAM;gBAEb,KAAK,EAAE,CAAC,kBAAkB;oBACtB;gBACJ,KAAK,EAAE,CAAC,kBAAkB;oBACtB;;QAEZ;AACK,aAAA,IAAK,CAAC,CAAC,IAAI,IAAI,YAAY,EAChC;YACI,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,IAAI,CAAC,aAAa,CAAE,CAAC,CAAE;QAC3B;AACK,aAAA,IAAK,CAAC,CAAC,IAAI,IAAI,aAAa,EACjC;YACI,CAAC,CAAC,cAAc,EAAE;AAElB,YAAA,IAAK,CAAE,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,IAAK,GAAG,EACjD;AACI,gBAAA,IAAI,CAAC,mBAAmB,CAAE,CAAC,CAAE;YACjC;QACJ;AACK,aAAA,IAAK,CAAC,CAAC,IAAI,IAAI,YAAY,EAChC;AACI,YAAA,IAAK,IAAI,CAAC,eAAe,EACzB;AACI,gBAAA,IAAI,CAAC,eAAe,CAAE,CAAC,CAAE;YAC7B;QACJ;AAEA,QAAA,IAAK,IAAI,CAAC,WAAW,EACrB;AACI,YAAA,IAAI,CAAC,yBAAyB,GAAG,YAAY;QACjD;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc;IACjD;AAEA,IAAA,aAAa,CAAE,CAAa,EAAA;AAExB,QAAA,MAAM,MAAM,GAAQ,CAAC,CAAC,MAAM;AAC5B,QAAA,IAAK,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAE,eAAe,CAAE,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAE,eAAe,CAAE,EACjG;AACI,YAAA,IAAI,CAAC,uBAAuB,CAAE,CAAC,CAAE;YACjC;QACJ;IACJ;AAEA,IAAA,uBAAuB,CAAE,CAAa,EAAA;QAElC,IAAI,CAAC,WAAW,EAAE;IACtB;AAEA,IAAA,iBAAiB,CAAE,CAAa,EAAA;AAE5B,QAAA,MAAM,MAAM,GAAQ,CAAC,CAAC,MAAM;;AAG5B,QAAA,IAAK,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAE,cAAc,CAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAE,eAAe;AACzF,eAAA,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB,EACtC;AACI,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc;AACxC,YAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,MAAM;QACtC;IACJ;AAEA,IAAA,eAAe,CAAE,CAAa,EAAA;;AAG1B,QAAA,IAAK,IAAI,CAAC,eAAe,EACzB;AACI,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAE,EAAE,EAAE,IAAI,CAAC,eAAe,CAAE;;YAG1D,EAAE,CAAC,aAAa,CAAE,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAE;YAC9F,OAAO,IAAI,CAAC,eAAe;;AAG3B,YAAA,IAAI,CAAC,mBAAmB,CAAE,CAAC,EAAE,QAAQ,CAAE;QAC3C;AACK,aAAA,IAAK,IAAI,CAAC,aAAa,EAC5B;YACI,IAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,EAC5B;gBACI,IAAI,CAAC,WAAW,EAAE;YACtB;AAEA,YAAA,IAAI,CAAC,iBAAiB,CAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAE;AAE3E,YAAA,EAAE,CAAC,aAAa,CAAE,IAAI,CAAC,uBAAuB,CAAE;YAEhD,OAAO,IAAI,CAAC,uBAAuB;YACnC,OAAO,IAAI,CAAC,aAAa;YACzB,OAAO,IAAI,CAAC,kBAAkB;QAClC;IACJ;AAEA,IAAA,iBAAiB,CAAE,CAAa,EAAA;AAE5B,QAAA,IAAK,CAAC,IAAI,CAAC,YAAY,EACvB;YACI;QACJ;AAEA,QAAA,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;QAEjC,IAAK,YAAY,EACjB;YACI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE,EACtF,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE;YAEnC,IAAI,CAAC,cAAc,EAAE;YAErB;QACJ;AACK,aAAA,IAAK,IAAI,CAAC,eAAe,EAC9B;AACI,YAAA,IAAI,CAAC,kBAAkB,CAAE,CAAC,CAAE;YAE5B;QACJ;AACK,aAAA,IAAK,IAAI,CAAC,aAAa,EAC5B;AACI,YAAA,IAAI,CAAC,iBAAiB,CAAE,CAAC,CAAE;YAE3B;QACJ;IACJ;AAEA,IAAA,aAAa,CAAE,CAAa,EAAA;QAExB,IAAK,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,EAC7C;YACI;QACJ;;QAIA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,CAAE,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAE;QAEzF,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAE,UAAU,CAAE;AAErD,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;QAEtB,IAAK,KAAK,GAAG,GAAG;AAAG,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,GAAG;;YAC5C,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,GAAG,GAAG,GAAG;QAEzC,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAE;;;QAK3G,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAE,UAAU,CAAE;QAExD,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAE,MAAM,CAAE;AAE3C,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAE,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE;QAE/E,IAAI,CAAC,cAAc,EAAE;IACzB;IAEA,mBAAmB,CAAE,CAAM,EAAE,WAAiB,EAAA;QAE1C,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;QAE1B,EAAE,CAAC,cAAc,CAAE,IAAI,EAAE,CAAC,EAAE,CAAE,CAAqB,KAAK;YACpD,IAAI,aAAa,GAAQ,IAAI;YAE7B,IAAK,CAAC,EACN;gBACI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;gBAE9C,MAAM,aAAa,GAAG,IAAI,IAAI,CAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE;AAExE,gBAAA,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAE,aAAa,CAAE;YAC7D;AAEA,YAAA,IAAK,IAAI,CAAC,cAAc,EACxB;AACI,gBAAA,CAAC,CAAC,GAAG,CAAE,OAAO,EAAE,MAAK;AACjB,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE;AACrC,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG;oBAEvC,IAAI,CAAC,UAAU,CAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAE;AACrD,gBAAA,CAAC,CAAE;AACH,gBAAA,CAAC,CAAC,GAAG,CAAE,EAAE,CAAE;YACf;AAEA,YAAA,KAAM,IAAI,IAAI,IAAI,WAAW,CAAC,UAAU,EACxC;gBACI,MAAM,SAAS,GAAQ,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;AAEnD,gBAAA,IAAK,SAAS,CAAC,QAAQ,EACvB;oBACI;gBACJ;AAEA,gBAAA,CAAC,CAAC,GAAG,CAAE,IAAI,EAAE,MAAK;oBACd,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAE,IAAI,CAAE;oBAE3C,MAAM,GAAG,GAAQ,IAAI,CAAC,cAAc,CAAE,OAAO,CAAE;AAE/C,oBAAA,IAAK,IAAI,CAAC,WAAW,EACrB;AACI,wBAAA,GAAG,CAAC,QAAQ,GAAG,IAAI;oBACvB;oBAEA,IAAK,aAAa,EAClB;AACI,wBAAA,IAAI,CAAC,cAAc,CAAE,GAAG,EAAE,aAAa,CAAE;oBAC7C;oBAEA,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAE,OAAO,CAAE;oBAExC,IAAK,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EACzC;wBACI,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAC7C,wBAAA,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;wBAC5E,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,aAAa;AAElE,wBAAA,MAAM,OAAO,GAAG;4BACZ,SAAS,EAAE,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC,EAAE;4BAC1C,QAAQ,EAAE,UAAU,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;AAC5C,4BAAA,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;4BACxD,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,EAAE,GAAG,KAAK;4BAC3C,SAAS,EAAE,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK;AAC7C,4BAAA,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;yBACrD;;wBAID,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,OAAO,CAAC,SAAS;wBAE3D,IAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC;4BAAG,IAAI,CAAC,YAAa,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;AAE9E,wBAAA,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAE,OAAO,CAAE;AAEhD,wBAAA,IAAI,CAAC,WAAW,CAAE,OAAO,CAAE;oBAC/B;AACJ,gBAAA,CAAC,CAAE;YACP;AACJ,QAAA,CAAC,CAAE;IACP;AAEA;;AAEG;IAEH,KAAK,GAAA;AAED,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO;AAEhC,QAAA,IAAI,CAAC,wBAAwB,CAAE,SAAS,CAAE;QAE1C,qBAAqB,CAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;IACrD;AAEA;;AAEG;IAEH,IAAI,GAAA;AAEA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,OAAO;AAEhC,QAAA,IAAI,CAAC,wBAAwB,CAAE,QAAQ,CAAE;IAC7C;AAEA;;AAEG;IAEH,MAAM,GAAA;QAEF,IAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EACxC;YACI;QACJ;QAEA,qBAAqB,CAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,IAAI,CAAE,CAAE;;QAGjD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAE,IAAI,CAAC,IAAI,CAAE;IAC3C;IAEA,gBAAgB,GAAA;;QAGZ;YACI,IAAI,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,SAAS,CAAE;AACjF,YAAA,OAAO,CAAC,YAAY,CAAE,IAAI,EAAE,WAAW,CAAE;YACzC,OAAO,CAAC,YAAY,CAAE,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAE;YACrC,OAAO,CAAC,YAAY,CAAE,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,CAAE,CAAE;AACrC,YAAA,OAAO,CAAC,YAAY,CAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAE;AAC/D,YAAA,OAAO,CAAC,YAAY,CAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAE;AAChE,YAAA,OAAO,CAAC,YAAY,CAAE,cAAc,EAAE,gBAAgB,CAAE;YAExD,IAAI,MAAM,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,QAAQ,CAAE;AAC/E,YAAA,MAAM,CAAC,YAAY,CAAE,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAE;AAC/D,YAAA,MAAM,CAAC,YAAY,CAAE,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAE;AAC/D,YAAA,MAAM,CAAC,YAAY,CAAE,GAAG,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAE;YAC9D,MAAM,CAAC,YAAY,CAAE,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAE;AAEvD,YAAA,OAAO,CAAC,WAAW,CAAE,MAAM,CAAE;QACjC;QAEA,IAAI,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,KAAK,CAAE;AACzE,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAE,gBAAgB,CAAE;AACrC,QAAA,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxB,QAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AACzB,QAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAEzB,QAAA,GAAG,CAAC,WAAW,CAAE,OAAO,CAAE;QAE1B,IAAI,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,MAAM,CAAE;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAE,GAAG,EAAE,GAAG,CAAE;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAE,GAAG,EAAE,GAAG,CAAE;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAE,OAAO,EAAE,MAAM,CAAE;AACpC,QAAA,IAAI,CAAC,YAAY,CAAE,QAAQ,EAAE,MAAM,CAAE;AACrC,QAAA,IAAI,CAAC,YAAY,CAAE,MAAM,EAAE,iBAAiB,CAAE;AAE9C,QAAA,GAAG,CAAC,WAAW,CAAE,IAAI,CAAE;AAEvB,QAAA,IAAI,CAAC,WAAW,GAAG,GAAG;QAEtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAE,IAAI,CAAC,WAAW,CAAE;IAC7C;IAEA,cAAc,GAAA;QAEV,IAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,EAC5C;YACI;QACJ;AAEA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE;QACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AAC3E,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE;QAEpF,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAE,SAAS,CAAG;AAC1D,QAAA,OAAO,CAAC,YAAY,CAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAE;AACzD,QAAA,OAAO,CAAC,YAAY,CAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAE;AACzD,QAAA,OAAO,CAAC,YAAY,CAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAE;AACzD,QAAA,OAAO,CAAC,YAAY,CAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAE;QAE1D,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAE,QAAQ,CAAG;QACxD,MAAM,CAAC,YAAY,CAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAE;QACzD,MAAM,CAAC,YAAY,CAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAE;QACzD,MAAM,CAAC,YAAY,CAAE,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAE;;QAIxD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,GAAG;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,GAAG;QAE3C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;QAC1C,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AAE1C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA;AAClB,sBAAA,CAAA,IAAK,eAAe,CAAC,CAAC,GAAG,EAAE,CAAE,GAAG,CAAA,IAAA,CAAM,IAAK,eAAe,CAAC,CAAC,GAAG,EAAE,CAAE,GAAG,CAAA;AAC1E,kBAAA,CAAA,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,CAAA;SACvC;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS;;AAI/D,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAEvD,QAAA,KAAM,IAAI,IAAI,IAAI,oBAAoB,EACtC;YACI,IAAI,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAE,IAAI,CAAC,EAAE,CAAE;YAC5C,GAAG,CAAC,SAAS,CAAC,MAAM,CAAE,gBAAgB,EAAE,IAAI,CAAE;QAClD;IACJ;AAEA,IAAA,mBAAmB,CAAE,cAA2B,EAAA;QAE5C,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;AAC1B,QAAA,OAAO,cAAc,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE;IAC7F;AAEA,IAAA,kBAAkB,CAAE,eAA4B,EAAA;QAE5C,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;AAC1B,QAAA,OAAO,eAAe,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE;IAC9F;AAEA,IAAA,OAAO,CAAE,CAAM,EAAA;QAEX,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;AAE1B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe;QACrC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAE,OAAO,CAAE,GAAG,WAAW,CAAC,aAAa,GAAG,WAAW,CAAC,cAAc;;AAG9G,QAAA,IAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,EAC9B;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,CAAA,4BAAA,CAA8B,CAAE;YAC9C;QACJ;;AAGA,QAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,KAAK;QACxC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;AAC5C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;;AAG9C,QAAA,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY;QAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI;AAC5C,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAE;;QAGvE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,aAAa;AAC/D,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;QAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI;AAE5C,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;QACpF,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI;AAE5C,QAAA,IAAK,UAAU,IAAI,UAAU,IAAI,UAAU,IAAI,KAAK,IAAI,UAAU,IAAI,KAAK,EAC3E;;YAGI,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU;YACtD,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU;AAEvD,YAAA,IAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,GAAG,GAAG,GAAG,SAAS,CAAC,EAC3D;gBACI,OAAO,CAAC,IAAI,CAAE,CAAA,WAAA,EAAc,UAAU,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,CAAG,CAAE;gBAC5D;YACJ;QACJ;;AAIA,QAAA,IAAK,MAAM,IAAI,WAAW,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,EACpF;YACI,IAAI,CAAC,YAAY,CAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAE;QAC3D;;AAGK,aAAA,IAAK,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,aAAa,IAAI,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EACvF;YACI,IAAI,CAAC,YAAY,CAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAE;QAChD;;AAIA,QAAA,IAAI,MAAM,GAAG,QAAQ,CAAC,EAAE;QACxB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;AACjC,QAAA,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;QAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAE,UAAU,CAAE;AAE5C,QAAA,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa;QACnC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;AACjC,QAAA,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;QAC3D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAE,UAAU,CAAE;;AAI5C,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAE;;QAIlE,MAAM,MAAM,GAAG,CAAE,UAAU,GAAG,UAAU,GAAG,UAAU,IAAK,GAAG,IAAK,UAAU,GAAG,UAAU,GAAG,UAAU,CAAE;QAExG,IAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;YAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;QAE5E,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAE;AAClC,YAAA,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU;YAC/C,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW;YAChD,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU;YAC/C,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU;YAChD,SAAS,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW;YACjD,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG;AACzC,SAAA,CAAE;AAEH,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM;;QAI3B,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;QACpC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;;AAG/C,QAAA,OAAO,IAAI;IACf;IAEA,kBAAkB,CAAE,CAAM,EAAE,KAAW,EAAA;AAEnC,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI;QAEpC,IAAK,CAAC,IAAI,EACV;YACI,IAAI,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,KAAK,CAAE;AACzE,YAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AAC/B,YAAA,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxB,YAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAE,GAAG,CAAE;YAEjC,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,MAAM,CAAE;AACvE,YAAA,IAAI,CAAC,YAAY,CAAE,MAAM,EAAE,MAAM,CAAE;AACnC,YAAA,GAAG,CAAC,WAAW,CAAE,IAAI,CAAE;AACvB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI;QACpC;;AAIA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;AACxC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM;AACxC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK;QAExC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAC3B,IAAI,IAAI,WAAW,CAAC,aAAa,GAAG,qBAAqB,GAAG,sBAAsB,CACrF;AACD,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,aAAa,CAAE,WAAW,CAAE;AAC/D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAE9C,QAAA,IAAI,QAAQ,GAAG,IAAI,IAAI,CAAE,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,CAAE;QACvE,IAAI,MAAM,GAAG,IAAI;QACjB,IAAI,OAAO,GAAG,IAAI;QAElB,IAAK,CAAC,EACN;AACI,YAAA,MAAM,GAAG,IAAI,IAAI,CAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAE;;AAGzC,YAAA,IAAK,EAAE,CAAC,QAAQ,CAAE,CAAC,CAAC,MAAM,EAAE,CAAE,cAAc,EAAE,eAAe,CAAE,CAAE,EACjE;AACI,gBAAA,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,gBAAgB,CAAE,CAAC,CAAC,MAAM,CAAE,EAAE,MAAM,CAAE;AACvD,gBAAA,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE,EAAE,MAAM,CAAE;YAC1C;AACK,iBAAA,IAAK,EAAE,CAAC,QAAQ,CAAE,CAAC,CAAC,MAAM,EAAE,CAAE,UAAU,EAAE,sBAAsB,CAAE,CAAE,EACzE;AACI,gBAAA,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY;;AAElC,gBAAA,MAAM,CAAC,GAAG,CAAE,IAAI,CAAC,gBAAgB,CAAE,MAAM,CAAE,EAAE,MAAM,CAAE;;gBAErD,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAE,EAAE,MAAM,CAAE;AACzE,gBAAA,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE,EAAE,MAAM,CAAE;YAC1C;AAEA,YAAA,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAE,MAAM,CAAE;QAC9C;aAEA;AACI,YAAA,OAAO,GAAG,KAAK,CAAC,aAAa,CAAE,WAAW,CAAE;AAC5C,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE;AAC9C,YAAA,MAAM,GAAG,IAAI,IAAI,CAAE,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAE;QAC/D;AAEA,QAAA,IAAK,IAAI,IAAI,WAAW,CAAC,aAAa,EACtC;YACI,IAAI,GAAG,GAAG,MAAM;YAChB,MAAM,GAAG,QAAQ;YACjB,QAAQ,GAAG,GAAG;QAClB;QAEA,IAAI,KAAK,GAAG,gBAAgB,CAAE,IAAI,CAAE,CAAC,eAAe;QAEpD,IAAK,IAAI,IAAI,WAAW,CAAC,cAAc,IAAI,OAAO,EAClD;AACI,YAAA,KAAK,GAAG,gBAAgB,CAAE,OAAO,CAAE,CAAC,eAAe;QACvD;AAEA,QAAA,IAAI,CAAC,eAAe,CAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAE;AAE1D,QAAA,OAAO,IAAI;IACf;AAEA,IAAA,WAAW,CAAE,IAAS,EAAA;QAElB,IAAI,GAAG,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,KAAK,CAAE;AACzE,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AAC/B,QAAA,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxB,QAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAE,GAAG,CAAE;QAEjC,IAAI,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,MAAM,CAAE;AAC3E,QAAA,IAAI,CAAC,YAAY,CAAE,MAAM,EAAE,MAAM,CAAE;AACnC,QAAA,GAAG,CAAC,WAAW,CAAE,IAAI,CAAE;QAEvB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAE,IAAI,CAAC,SAAS,CAAE;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAE,IAAI,CAAC,UAAU,CAAE;;QAIhE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAEnD,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAE,sBAAsB,CAAE;QACrE,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAE,WAAW,CAAE,CAAC,qBAAqB,EAAE;AAE1E,QAAA,IAAI,QAAQ,GAAG,IAAI,IAAI,CAAE,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAE;;QAI3E,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAE,qBAAqB,CAAE;QAClE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAE,WAAW,CAAE,CAAC,qBAAqB,EAAE;AAExE,QAAA,IAAI,MAAM,GAAG,IAAI,IAAI,CAAE,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAE;;AAIrE,QAAA,MAAM,KAAK,GAAG,gBAAgB,CAAE,GAAG,CAAC,aAAa,CAAE,WAAW,CAAE,CAAE,CAAC,eAAe;QAClF,IAAI,CAAC,eAAe,CAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAE;AAErD,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;AAIhB,QAAA,GAAG,CAAC,KAAK,GAAG,EAAE;AACd,QAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACzD,QAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAE,IAAI,CAAC,SAAS,CAAE;AAE/C,QAAA,GAAG,CAAC,KAAK,GAAG,EAAE;AACd,QAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AAC3D,QAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAE,IAAI,CAAC,UAAU,CAAE;AAEjD,QAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;AAC5B,QAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;IAChC;IAEA,eAAe,CAAE,IAAS,EAAE,QAAqB,EAAE,MAAmB,EAAE,KAAW,EAAE,QAAA,GAAoB,KAAK,EAAA;AAE1G,QAAA,IAAK,CAAC,IAAI,CAAC,YAAY,EACvB;YACI;QACJ;QAEA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACxC,QAAA,QAAQ,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,IAAI,EAAE,IAAI,CAAE,EAAE,QAAQ,CAAE;QAEhD,IAAK,CAAC,QAAQ,EACd;AACI,YAAA,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,IAAI,EAAE,IAAI,CAAE,EAAE,MAAM,CAAE;QAChD;AAEA,QAAA,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAE,QAAQ,CAAE;AAC/C,QAAA,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAE,MAAM,CAAE;QAE3C,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAE,IAAI,CAAC,GAAG,CAAE,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,EAAE,GAAG,EAAE,KAAK,CAAE;AAC3E,QAAA,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAE,SAAS,GAAG,KAAK,EAAE,GAAG,CAAE;AAE7D,QAAA,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,UAAU,EAAE,CAAC,CAAE,CAAE;AACvD,QAAA,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,UAAU,EAAE,CAAC,CAAE,CAAE;AAErD,QAAA,IAAI,CAAC,YAAY,CAAE,GAAG,EAAE,CAAA;AAChB,cAAA,EAAA,QAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAC,CAAC,CAAA;gBACxB,OAAO,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,CAAC,CAAA;AAC/E,QAAA,CAAA,CAAE;QAEH,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;IAC1C;AAEA,IAAA,gBAAgB,CAAE,MAAc,EAAA;QAE5B,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI;QAE9D,IAAK,CAAC,IAAI,EACV;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,qBAAqB,MAAM,CAAA,CAAA,CAAG,CAAE;YAC9C;QACJ;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAE,MAAM,CAAE;;QAIjD,KAAM,IAAI,KAAK,IAAI,OAAO,CAAC,gBAAgB,CAAE,UAAU,CAAE,EACzD;AACI,YAAA,IAAK,CAAC,KAAK,CAAC,KAAK,EACjB;gBACI;YACJ;;YAGA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAE,CAAE,CAAM,KAAM,CAAC,KAAK,SAAS,CAAE,CAAC,CAAC,CAAC;AACtE,YAAA,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;;YAG/B,IAAK,CAAC,YAAY,EAClB;gBACI;YACJ;YAEA,MAAM,OAAO,GAAG,QAAQ,CAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAE;YAElD,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAE,YAAY,EAAE,MAAM,CAAE;;AAGlD,YAAA,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAE,CAAE,CAAM,MAAQ,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAE,CAAE;YAEhE,IAAI,CAAC,eAAe,GAAG;AACnB,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,WAAW,CAAC,aAAa;AACjC,gBAAA,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,IAAI,CAAC;aACd;;YAID,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAE,YAAY,CAAE;AAC1D,YAAA,MAAM,EAAE,GAAG,UAAU,CAAC,aAAa,CAAE,sBAAsB,CAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;AAExF,YAAA,IAAI,CAAC,kBAAkB,CAAE,IAAI,EAAE,EAAE,CAAE;QACvC;;QAIA,KAAM,IAAI,MAAM,IAAI,OAAO,CAAC,gBAAgB,CAAE,WAAW,CAAE,EAC3D;AACI,YAAA,IAAK,CAAC,MAAM,CAAC,KAAK,EAClB;gBACI;YACJ;YAEA,MAAM,QAAQ,GAAG,QAAQ,CAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAE;AAEpD,YAAA,KAAM,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,WAAW,EAC3E;gBACI,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;gBAEzC,IAAK,CAAC,OAAO,EACb;oBACI;gBACJ;AAEA,gBAAA,KAAM,IAAI,QAAQ,IAAI,OAAO,EAC7B;oBACI,IAAI,KAAK,GAAG,IAAI,CAAC,SAAS,CAAE,MAAM,EAAE,QAAQ,CAAE;oBAC9C,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAE,CAAE,CAAM,MAAQ,CAAC,CAAC,QAAQ,IAAI,WAAW,IAAI,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAE,CAAE;;oBAG/F,IAAI,CAAC,eAAe,GAAG;wBACnB,KAAK,EAAE,IAAI,CAAC,SAAS;AACrB,wBAAA,EAAE,EAAE,MAAM;wBACV,MAAM,EAAE,WAAW,CAAC,cAAc;AAClC,wBAAA,KAAK,EAAE,OAAO;wBACd,IAAI,EAAE,IAAI,CAAC;qBACd;;oBAID,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAE,QAAQ,CAAE;AACrD,oBAAA,MAAM,EAAE,GAAG,SAAS,CAAC,aAAa,CAAE,qBAAqB,CAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;AAErF,oBAAA,IAAI,CAAC,kBAAkB,CAAE,IAAI,EAAE,EAAE,CAAE;gBACvC;YACJ;QACJ;QAEA,OAAO,IAAI,CAAC,eAAe;IAC/B;AAEA,IAAA,iBAAiB,CAAE,CAAa,EAAA;AAE5B,QAAA,IAAI,GAAG,GAAG,IAAI,CAAC,uBAAuB;QAEtC,IAAK,CAAC,GAAG,EACT;YACI,IAAI,GAAG,GAA8B,QAAQ,CAAC,eAAe,CAAE,4BAA4B,EAAE,KAAK,CAAE;AACpG,YAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAE,mBAAmB,CAAE;AACxC,YAAA,IAAK,IAAI,CAAC,kBAAkB,EAC5B;AACI,gBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;YACnC;AACA,YAAA,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;AACxB,YAAA,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AACzB,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CAAE,GAAG,CAAE;AACjC,YAAA,IAAI,CAAC,uBAAuB,GAAG,GAAG;QACtC;;QAIA,IAAI,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAE,IAAI,CAAC,aAAa,CAAE;AAC7D,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAE,IAAI,CAAC,cAAc,CAAE,CAAC,GAAG,CAAE,QAAQ,CAAE;AAE1E,QAAA,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC;AAAG,YAAA,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AACtC,QAAA,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC;AAAG,YAAA,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAEtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;QAEjB,GAAG,CAAC,SAAS,GAAG,CAAA;AACP,eAAA,EAAA,QAAQ,CAAC,CAAC,CAAA,KAAA,EAAQ,QAAQ,CAAC,CAAC,CAAA;AAC3B,gBAAA,EAAA,CAAC,SAAS,CAAC,CAAA;AACR,mBAAA,EAAA,IAAI,CAAC,CAAC,CAAA,UAAA,EAAa,IAAI,CAAC,CAAC,CAAA;YAClC;IACR;IAEA,mBAAmB,GAAA;QAEf,MAAM,eAAe,GAAG,EAAE;AAE1B,QAAA,IAAK,CAAC,IAAI,CAAC,YAAY,EACvB;AACI,YAAA,OAAO,CAAC,IAAI,CAAE,cAAc,CAAE;AAC9B,YAAA,OAAO,EAAE;QACb;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAE,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE,EAAE,IAAI,IAAI,CAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAE,CAAE;QAE/G,KAAM,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EACzC;YACI,IAAI,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAE,IAAI,CAAC,QAAQ,CAAE;YAClD,IAAI,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAE,IAAI,CAAC,EAAE,CAAE;YAC5C,IAAK,CAAC,GAAG,EACT;gBACI;YACJ;YAEA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAE,CAAE;YAEhF,IAAK,QAAQ,CAAC,MAAM,CAAE,OAAO,EAAE,KAAK,CAAE,EACtC;;gBAEI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAE,gBAAgB,EAAE,KAAK,CAAE;;gBAG/C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAE,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,GAAG,CAAE;gBAErF;YACJ;AAEA,YAAA,eAAe,CAAC,IAAI,CAAE,IAAI,CAAE;QAChC;AAEA,QAAA,OAAO,eAAe;IAC1B;AAEA,IAAA,iBAAiB,CAAE,EAAe,EAAE,EAAe,EAAE,SAAkB,KAAK,EAAA;AAExE,QAAA,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAE,EAAE,CAAE;AACnC,QAAA,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAE,EAAE,CAAE;QAEnC,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,CAAE,EAAE,CAAE;AAEvB,QAAA,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EACf;AACI,YAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;AACd,YAAA,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACX,YAAA,EAAE,CAAC,CAAC,GAAG,GAAG;QACd;AAEA,QAAA,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EACf;AACI,YAAA,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;AACd,YAAA,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AACX,YAAA,EAAE,CAAC,CAAC,GAAG,GAAG;QACd;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAmB;AACrD,QAAA,KAAM,IAAI,MAAM,IAAI,KAAK,EACzB;YACI,IAAI,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAE,MAAM,CAAE;AACzC,YAAA,IAAI,IAAI,GAAG,IAAI,IAAI,CAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAE;YAE9D,IAAK,CAAE,EAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAK,EAAE,CAAC,CAAC,CAAE,IAAI,EAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAK,EAAE,CAAC,CAAC,CAAE;oBAC9F,EAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAK,EAAE,CAAC,CAAC;uBAC1C,EAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAK,EAAE,CAAC,CAAC,CAAE,CAAE,EAC3D;gBACI,IAAK,MAAM,EACX;AACI,oBAAA,IAAI,CAAC,aAAa,CAAE,MAAM,CAAE;gBAChC;qBAEA;oBACI,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAE;gBAC3C;YACJ;QACJ;IACJ;AAEA,IAAA,gBAAgB,CAAE,CAAO,EAAA;AAErB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAEtD,QAAA,KAAM,IAAI,MAAM,IAAI,IAAI,CAAC,aAAa,EACtC;AACI,YAAA,IAAI,CAAC,WAAW,CAAE,MAAM,CAAE;QAC9B;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;;QAI7B,IAAK,IAAI,CAAC,SAAS,CAAC,iBAAiB,IAAI,aAAa,EACtD;YACI,IAAI,CAAC,YAAY,EAAE;QACvB;IACJ;AAEA,IAAA,qBAAqB,CAAE,QAAqB,EAAA;QAExC,MAAM,CAAC,GAAG,UAAU,CAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAE;QAC3C,MAAM,CAAC,GAAG,UAAU,CAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAE;QAE1C,OAAO,IAAI,WAAW,CAAE,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE,EAAE,IAAI,IAAI,CAAE,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAE,CAAE;IAC/G;AAEA,IAAA,qBAAqB,CAAE,OAAiB,EAAA;QAEpC,IAAI,QAAQ,GAAG,IAAI;AAEnB,QAAA,KAAM,IAAI,MAAM,IAAI,OAAO,EAC3B;YACI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI;AACpC,YAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAE;YAE3D,IAAK,QAAQ,EACb;AACI,gBAAA,QAAQ,CAAC,KAAK,CAAE,OAAO,CAAE;YAC7B;iBAEA;gBACI,QAAQ,GAAG,OAAO;YACtB;QACJ;QAEA,IAAK,QAAQ,EACb;;YAGI,MAAM,mBAAmB,GAAG,CAAC;AAE7B,YAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,mBAAmB,CAAE,EAAE,QAAQ,CAAC,MAAM,CAAE;AACvE,YAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,mBAAmB,CAAE,EAAE,QAAQ,CAAC,MAAM,CAAE;AAEvE,YAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,mBAAmB,GAAG,GAAG,CAAE,EAAE,QAAQ,CAAC,IAAI,CAAE;AACzE,YAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAE,IAAI,IAAI,CAAE,mBAAmB,GAAG,GAAG,CAAE,EAAE,QAAQ,CAAC,IAAI,CAAE;QAC7E;AAEA,QAAA,OAAO,QAAQ;IACnB;AAEA;;;;AAIG;AAEH,IAAA,YAAY,CAAE,EAAgB,EAAA;AAE1B,QAAA,MAAM,QAAQ,GAAQ,EAAE,IAAI,IAAI,CAAC,qBAAqB,CAAE,IAAI,CAAC,aAAa,CAAE;QAC5E,IAAK,CAAC,QAAQ,EACd;YACI;QACJ;AAEA,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,IAAI,CAAA,MAAA,EAAS,EAAE,CAAC,aAAa,EAAE,CAAA,CAAE;QAE7D,IAAI,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAC9C,QAAA,QAAQ,CAAC,EAAE,GAAG,QAAQ;AACtB,QAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAE,eAAe,CAAE;AACzC,QAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;AAC9C,QAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI;AAC7C,QAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI;AAC7C,QAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI;QAE9C,IAAI,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAE,KAAK,CAAE;AAClD,QAAA,YAAY,CAAC,SAAS,CAAC,GAAG,CAAE,sBAAsB,CAAE;AAEpD,QAAA,YAAY,CAAC,gBAAgB,CAAE,WAAW,EAAE,eAAe,CAAE;AAE7D,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ;QAEhC,IAAI,IAAI,GAAG,IAAI;AACf,QAAA,IAAI,OAAO,GAAG,CAAE,CAAC,EAAE,CAAC,CAAE;QAEtB,SAAS,eAAe,CAAE,CAAa,EAAA;AAEnC,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AACjC,YAAA,GAAG,CAAC,gBAAgB,CAAE,WAAW,EAAE,eAAe,CAAE;AACpD,YAAA,GAAG,CAAC,gBAAgB,CAAE,SAAS,EAAE,aAAa,CAAE;AAChD,YAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,eAAe,EAAE;YACnB,CAAC,CAAC,cAAc,EAAE;YAClB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;AACzC,YAAA,YAAY,CAAC,SAAS,CAAC,GAAG,CAAE,UAAU,CAAE;QAC5C;QAEA,SAAS,eAAe,CAAE,CAAa,EAAA;YAEnC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE;YACvD,EAAE,CAAC,GAAG,CAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAE;YAEtC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAE,UAAU,CAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAE,GAAG,EAAE,CAAC,CAAC,IAAK,IAAI;YAC3E,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAE,UAAU,CAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAE,GAAG,EAAE,CAAC,CAAC,IAAK,IAAI;AAE7E,YAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChB,YAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEhB,CAAC,CAAC,eAAe,EAAE;YACnB,CAAC,CAAC,cAAc,EAAE;QACtB;QAEA,SAAS,aAAa,CAAE,CAAa,EAAA;AAEjC,YAAA,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;AACjC,YAAA,GAAG,CAAC,mBAAmB,CAAE,WAAW,EAAE,eAAe,CAAE;AACvD,YAAA,GAAG,CAAC,mBAAmB,CAAE,SAAS,EAAE,aAAa,CAAE;YACnD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAE,UAAU,CAAE;AAC5C,YAAA,YAAY,CAAC,SAAS,CAAC,MAAM,CAAE,UAAU,CAAE;QAC/C;QAEA,IAAI,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAE,OAAO,CAAE;AAClD,QAAA,IAAI,WAAW,GAAG,CAAA,MAAA,EAAS,WAAW,CAAC,aAAa,EAAE;AACtD,QAAA,UAAU,CAAC,KAAK,GAAG,WAAW;AAC9B,QAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAE,oBAAoB,CAAE;AAChD,QAAA,UAAU,CAAC,QAAQ,GAAG,IAAI;;QAI1B,UAAU,CAAC,gBAAgB,CAAE,WAAW,EAAE,CAAE,CAAC,KAAK;YAC9C,CAAC,CAAC,eAAe,EAAE;YACnB,CAAC,CAAC,wBAAwB,EAAE;AAChC,QAAA,CAAC,CAAE;QAEH,UAAU,CAAC,gBAAgB,CAAE,UAAU,EAAE,CAAE,CAAC,KAAK;AAC7C,YAAA,UAAU,CAAC,QAAQ,GAAG,IAAI;AAC1B,YAAA,IAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAC7B;AACI,gBAAA,UAAU,CAAC,KAAK,GAAG,WAAW;YAClC;AACJ,QAAA,CAAC,CAAE;QAEH,UAAU,CAAC,gBAAgB,CAAE,OAAO,EAAE,CAAE,CAAC,KAAK;AAC1C,YAAA,IAAK,CAAC,CAAC,GAAG,IAAI,OAAO,EACrB;gBACI,UAAU,CAAC,IAAI,EAAE;YACrB;AACK,iBAAA,IAAK,CAAC,CAAC,GAAG,IAAI,QAAQ,EAC3B;AACI,gBAAA,UAAU,CAAC,KAAK,GAAG,EAAE;gBACrB,UAAU,CAAC,IAAI,EAAE;YACrB;AACJ,QAAA,CAAC,CAAE;QAEH,QAAQ,CAAC,gBAAgB,CAAE,UAAU,EAAE,CAAE,CAAC,KAAK;;YAE3C,IAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,gBAAgB,EACpC;gBACI;YACJ;AACA,YAAA,UAAU,CAAC,QAAQ,GAAG,KAAK;YAC3B,UAAU,CAAC,KAAK,EAAE;AACtB,QAAA,CAAC,CAAE;QAEH,QAAQ,CAAC,gBAAgB,CAAE,aAAa,EAAE,CAAE,CAAC,KAAK;YAC9C,CAAC,CAAC,cAAc,EAAE;YAClB,CAAC,CAAC,eAAe,EAAE;YACnB,CAAC,CAAC,wBAAwB,EAAE;YAE5B,EAAE,CAAC,cAAc,CAAE,IAAI,EAAE,CAAC,EAAE,CAAE,CAAqB,KAAK;AACpD,gBAAA,CAAC,CAAC,GAAG,CAAE,QAAQ,EAAE,MAAK;AAClB,oBAAA,IAAI,CAAC,YAAY,CAAE,QAAQ,CAAE;AACjC,gBAAA,CAAC,CAAE;AACP,YAAA,CAAC,CAAE;AACP,QAAA,CAAC,CAAE;AAEH,QAAA,QAAQ,CAAC,WAAW,CAAE,YAAY,CAAE;AACpC,QAAA,QAAQ,CAAC,WAAW,CAAE,UAAU,CAAE;AAElC,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAE,QAAQ,CAAE;;AAIlC,QAAA,EAAE,CAAC,aAAa,CAAE,QAAQ,EAAE;YACxB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAE,IAAI,CAAE;YACtC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAE,IAAI,CAAE;AAC3C,YAAA,YAAY,EAAE;AACjB,SAAA,CAAE;QAEH,WAAW,CAAC,aAAa,EAAE;AAE3B,QAAA,OAAO,QAAQ;IACnB;IAEA,YAAY,CAAE,UAAU,GAAG,IAAI,EAAA;QAE3B,IAAK,UAAU,EACf;;AAEI,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QAC9B;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE;;AAErB,SAAA,CAAE;IACP;IAEA,OAAO,GAAA;AAEH,QAAA,IAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAC5B;YACI;QACJ;QAEA,IAAI,CAAC,YAAY,EAAE;;QAGN,IAAI,CAAC,UAAU,CAAC,GAAG;;;AAKhC,QAAA,OAAO,CAAC,GAAG,CAAE,QAAQ,CAAE;IAC3B;IAEA,YAAY,GAAA;AAER,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE;;AAErB,SAAA,CAAE;IACP;IAEA,OAAO,GAAA;AAEH,QAAA,IAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAC5B;YACI;QACJ;AAEA,QAAA,IAAI,CAAC,YAAY,CAAE,KAAK,CAAE;;QAGb,IAAI,CAAC,UAAU,CAAC,GAAG;;;AAKhC,QAAA,OAAO,CAAC,GAAG,CAAE,QAAQ,CAAE;IAC3B;IAEA,uBAAuB,CAAE,QAAiB,KAAK,EAAA;AAE3C,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAE,QAAQ,EAAE,KAAK,CAAE;QAE9D,IAAK,CAAC,KAAK,EACX;AACI,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE;QACvC;IACJ;AAEA,IAAA,iBAAiB,CAAE,KAAa,EAAA;AAE5B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IAC3B;IAEA,eAAe,GAAA;AAEX,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;;AAIpC,QAAA,IAAK,IAAI,CAAC,WAAW,EACrB;YACI,KAAM,IAAI,OAAO,IAAM,IAAI,CAAC,eAAe,CAAE,IAAI,CAAa,EAC9D;AACI,gBAAA,OAAO,CAAC,QAAQ,GAAG,IAAI;YAC3B;QACJ;IACJ;AAEA,IAAA,gBAAgB,CAAE,CAAQ,EAAA;AAEtB,QAAA,IAAI,EAAE,CAAC,YAAY,CAAE,CAAC,CAAC,MAAM,EAAE;AAC3B,YAAA,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE;AAC3E,YAAA,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE;SACvF,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAE;IAC1C;IAEA,sBAAsB,GAAA;QAElB,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAE,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAE,CAAe,KAAK;AACpF,YAAA,CAAC,CAAC,OAAO,CAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAE,CAAS,KAAK;AACxD,gBAAA,IAAI,CAAC,gBAAgB,CAAE,CAAC,CAAE;gBAC1B,MAAM,CAAC,KAAK,EAAE;AAClB,YAAA,CAAC,CAAE;AACP,QAAA,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAE,OAAO,EAAE,IAAI,CAAE,EAAE,CAAE;IACjD;AAEA,IAAA,gBAAgB,CAAE,IAAY,EAAA;QAE1B,IAAK,CAAC,IAAI,CAAC,YAAY;YAAG;AAE1B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAE,KAAK,EAAE,EAAE,CAAE,CAAC,UAAU,CAAE,GAAG,EAAE,EAAE,CAAE;;AAGlE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAE,wBAAwB,CAAE,CAAC,CAAC,CAAC;AAClF,QAAA,OAAO,CAAC,MAAM,CAAE,OAAO,CAAE;AACzB,QAAA,OAAO,CAAC,SAAS,GAAG,IAAI;;QAGxB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAE,CAAE,CAAM,KAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,IAAI,CAAE;QAChG,IAAK,WAAW,EAChB;AACI,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI;AAChC,YAAA,WAAW,CAAC,IAAI,GAAG,IAAI;AACvB,YAAA,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,UAAU;AAC/B,YAAA,WAAW,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAE,OAAO,EAAE,IAAI,CAAE;QAClF;;QAGA,MAAM,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI;QACpD,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;QAEjD,IAAK,SAAS,EACd;AACI,YAAA,OAAO,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC;AAEtC,YAAA,SAAS,CAAC,KAAK,GAAG,IAAI;YAEtB,WAAW,CAAC,kBAAkB,CAAE,WAAW,GAAG,IAAI,EAAE,SAAS,CAAE;QACnE;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI;IACjC;IAEA,iBAAiB,GAAA;IAEjB;;AAGJ,EAAE,CAAC,WAAW,GAAG,WAAW;AAE5B;;AAEG;AAEH,MAAM,KAAK,CAAA;IAEP,IAAI,GAAW,eAAe;IAC9B,IAAI,GAAW,OAAO;IACtB,EAAE,GAAW,EAAE;AAEf,IAAA,MAAM;IACN,KAAK,GAAgB,EAAE;IACvB,MAAM,GAAU,EAAE;IAClB,SAAS,GAAQ,EAAE;IACnB,KAAK,GAAQ,EAAE;IAEf,KAAK,GAAW,GAAG;IACnB,WAAW,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IAE3C,eAAe,GAAa,EAAE;IAE9B,WAAA,CAAa,IAAa,EAAE,OAAA,GAAe,EAAE,EAAA;QAEzC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI;IACjC;AAEA,IAAA,SAAS,CAAE,CAAM,EAAA;AAEb,QAAA,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAElB,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AAErB,QAAA,KAAM,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,EACzB;YACI,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAE,IAAI,CAAC,IAAI,CAAE;AAEhD,YAAA,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AAC1B,YAAA,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AAC1B,YAAA,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE;AAC/D,YAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;AACxB,YAAA,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AAEpC,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAE,OAAO,CAAE;QAC9B;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;AACtB,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;;;IAKxB;AAEA;;AAEG;AAEH,IAAA,WAAW,CAAE,EAAU,EAAA;AAEnB,QAAA,KAAM,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAC5B;AACI,YAAA,IAAK,IAAI,CAAC,EAAE,IAAI,EAAE;AAAG,gBAAA,OAAO,IAAI;QACpC;IACJ;AAEA;;AAEG;AAEH,IAAA,QAAQ,CAAE,MAAc,EAAA;QAEpB,IAAK,CAAC,MAAM,EACZ;YACI;QACJ;AAEA,QAAA,MAAM,KAAK,GAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAE,CAAE,EAAE,EAAE,CAAC,MAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAE,EAAE,EAAE,CAAE;;AAGjF,QAAA,IAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EACnB;YACI;QACJ;QAEA,MAAM,YAAY,GAAQ,EAAE;AAE5B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;;AAGzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AAEnB,QAAA,MAAM,OAAO,GAAG,CAAE,EAAU,KAAK;AAC7B,YAAA,IAAK,YAAY,CAAC,EAAE,CAAC,EACrB;gBACI;YACJ;AAEA,YAAA,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;AAEvB,YAAA,KAAM,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,EAC9B;gBACI,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAE,GAAG,GAAG,EAAE,CAAE;AAEtC,gBAAA,IAAK,GAAG,GAAG,CAAC,EACZ;oBACI;gBACJ;gBAEA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAE,CAAC,EAAE,GAAG,CAAE;AAE5C,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAE,SAAS,CAAE;gBAEtC,OAAO,CAAE,SAAS,CAAE;YACxB;AACJ,QAAA,CAAC;;;AAKD,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAE,MAAM,CAAE;QAEnC,OAAO,CAAE,MAAM,CAAE;AAEjB,QAAA,KAAM,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAC1D;YACI,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAE3C,YAAA,IAAK,IAAI,CAAC,YAAY,EACtB;gBACI,IAAI,CAAC,YAAY,EAAE;YACvB;YAEA,IAAI,CAAC,OAAO,EAAE;AAEd,YAAA,IAAK,IAAI,CAAC,YAAY,EACtB;gBACI,IAAI,CAAC,WAAW,EAAE;YACtB;QACJ;IACJ;AAEA;;;;AAIG;IAEH,SAAS,CAAE,QAAQ,GAAG,IAAI,EAAA;QAEtB,IAAI,CAAC,GAAQ,EAAE;AAEf,QAAA,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;AACd,QAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;AAClB,QAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;AAElB,QAAA,CAAC,CAAC,KAAK,GAAG,EAAE;AACZ,QAAA,CAAC,CAAC,MAAM,GAAG,EAAE;AACb,QAAA,CAAC,CAAC,SAAS,GAAG,EAAE;AAChB,QAAA,CAAC,CAAC,KAAK,GAAG,EAAE;AAEZ,QAAA,KAAM,IAAI,IAAI,IAAM,IAAI,CAAC,KAAgB,EACzC;YACI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,CAAC,SAAS,EAAE,CAAE;AAEhC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAE9C,IAAK,QAAQ,EACb;AACI,gBAAA,CAAC,CAAC,SAAS,CAAC,IAAI,CAAE,IAAI,CAAC,KAAK,CAAE,QAAQ,CAAC,SAAS,EAAE,CAAE,CAAE;YAC1D;QACJ;AAEA,QAAA,KAAM,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,EAC9B;AACI,YAAA,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAE;AACjD,YAAA,OAAO,CAAC,OAAO,CAAE,CAAE,CAAM,KAAM,OAAO,CAAC,CAAC,IAAI,CAAE;AAC9C,YAAA,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO;QAC7B;AAEA,QAAA,KAAM,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAC9B;AACI,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAQ,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAE,QAAQ,CAAE;AACpE,YAAA,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE;AACtB,YAAA,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AAC1B,YAAA,CAAC,CAAC,MAAM,CAAC,IAAI,CAAE,QAAQ,CAAE;QAC7B;;;AAMA,QAAA,IACA;AACI,YAAA,CAAC,GAAG,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAE;QAChE;QACA,OAAQ,CAAC,EACT;YACI,CAAC,GAAG,IAAI;AACR,YAAA,OAAO,CAAC,KAAK,CAAE,CAAA,oBAAA,EAAuB,IAAI,CAAC,IAAI,CAAA,WAAA,EAAc,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI,CAAE;QAChF;AAEA,QAAA,OAAO,CAAC;IACZ;AAEA;;AAEG;IAEH,MAAM,GAAA;AAEF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;QAC1B,EAAE,CAAC,YAAY,CAAE,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAE;IAC7C;AACH;AAED,EAAE,CAAC,KAAK,GAAG,KAAK;AAEhB;;AAEG;MAEU,SAAS,CAAA;IAElB,OAAO,KAAK;AACZ,IAAA,OAAO,WAAW,GAAY,KAAK;AACnC,IAAA,OAAO,QAAQ,GAAY,KAAK;AAChC,IAAA,OAAO,WAAW,GAAW,EAAE;IAE/B,EAAE,GAAW,EAAE;IACf,IAAI,GAAW,EAAE;IACjB,KAAK,GAAW,EAAE;IAClB,MAAM,GAAU,EAAE;IAClB,OAAO,GAAU,EAAE;IACnB,UAAU,GAAU,EAAE;IACtB,QAAQ,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;IACxC,IAAI,GAAgB,IAAI,IAAI,CAAE,CAAC,EAAE,CAAC,CAAE;AACpC,IAAA,KAAK;AAEL,IAAA,MAAM;AACN,IAAA,OAAO;AAEP,IAAA,WAAA,GAAA;IAEA;IAEA,oBAAoB,GAAA;AAEhB,QAAA,OAAO,IAAI;IACf;IAEA,SAAS,GAAA;;IAGT;IAEA,OAAO,GAAA;AAEH,QAAA,IAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EACjC;YACI;QACJ;AAEA,QAAA,IAAK,IAAI,CAAC,SAAS,EACnB;YACI,IAAI,CAAC,SAAS,EAAE;QACpB;IACJ;IAEA,QAAQ,CAAE,IAAmB,EAAE,IAAY,EAAA;AAEvC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAE;IAClD;IAEA,SAAS,CAAE,IAAmB,EAAE,IAAY,EAAA;AAExC,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAE;IACnD;AAEA,IAAA,WAAW,CAAE,IAAmB,EAAE,IAAY,EAAE,KAAU,EAAE,aAAmB,EAAA;AAE3E,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAE;IACzE;AAEA,IAAA,QAAQ,CAAE,KAAa,EAAA;QAEnB,IAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/D;YACI;QACJ;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAiB,CAAC;;AAIzD,QAAA,KAAM,IAAI,MAAM,IAAI,KAAK,CAAC,KAAK,EAC/B;AACI,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAE,GAAG,GAAG,IAAI,CAAC,EAAE,CAAE;AAE3C,YAAA,IAAK,GAAG,GAAG,CAAC,EACZ;gBACI;YACJ;YAEA,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;AAErC,YAAA,KAAM,IAAI,IAAI,IAAI,SAAS,EAC3B;AACI,gBAAA,IAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,EAC3B;oBACI;gBACJ;;gBAGA,OAAO,IAAI,CAAC,IAAI;YACpB;QACJ;IACJ;IAEA,SAAS,CAAE,KAAa,EAAE,IAAS,EAAA;QAE/B,IAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAClE;YACI;QACJ;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAiB,CAAC;;AAIzD,QAAA,KAAM,IAAI,MAAM,IAAI,KAAK,CAAC,KAAK,EAC/B;AACI,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAE;AAE3C,YAAA,IAAK,GAAG,GAAG,CAAC,EACZ;gBACI;YACJ;YAEA,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;AAErC,YAAA,KAAM,IAAI,IAAI,IAAI,SAAS,EAC3B;AACI,gBAAA,IAAK,IAAI,CAAC,SAAS,IAAI,KAAK,EAC5B;oBACI;gBACJ;gBAEA,IAAI,SAAS,GAAG,IAAI;AAEpB,gBAAA,IAAK,SAAS,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI;AAC/E,uBAAA,IAAI,CAAC,UAAU,IAAI,KAAK,EAC/B;;AAGI,oBAAA,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;;AAIhF,oBAAA,SAAS,GAAG,EAAE,GAAG,EAAE,CAAE,EAAE,CAAC,QAAQ,CAAE,SAAS,CAAE,CAAE,GAAG,IAAI;gBAC1D;AAEA,gBAAA,IAAI,CAAC,IAAI,GAAG,SAAS;YACzB;QACJ;IACJ;IAEA,SAAS,GAAA;QAEL,IAAI,CAAC,GAAQ,EAAE;AACf,QAAA,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;AACd,QAAA,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC1B,QAAA,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;AAClB,QAAA,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;AACtB,QAAA,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AACxB,QAAA,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AAC9B,QAAA,OAAO,CAAC;IACZ;;AAGJ,EAAE,CAAC,SAAS,GAAG,SAAS;AAExB;;AAEG;AAEH,MAAM,aAAc,SAAQ,KAAK,CAAA;IAE7B,WAAA,CAAa,IAAa,EAAE,OAAA,GAAe,EAAE,EAAA;AAEzC,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,KAAM,eAAe,GAAG,WAAW,CAAC,gBAAgB,CAAE;AACtE,QAAA,IAAI,CAAC,IAAI,GAAG,eAAe;QAE3B,WAAW,CAAC,gBAAgB,EAAE;QAE9B,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAE,gBAAgB,CAAE;QACzD,SAAS,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAE,GAAG,EAAE,GAAG,CAAE;QAEzC,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAE,iBAAiB,CAAE;QAC3D,UAAU,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAE,GAAG,EAAE,GAAG,CAAE;QAE1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAE,SAAS,EAAE,UAAU,CAAE;IAC5C;AAEA,IAAA,aAAa,CAAE,UAAe,EAAA;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,QAAA,SAAS,CAAC,SAAS,CAAE,CAAC,EAAE,UAAU,CAAE;QAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAEhC,QAAA,IAAI,CAAC,QAAQ,CAAE,UAAU,CAAC,EAAE,CAAE;AAE9B,QAAA,OAAO,UAAU,CAAC,QAAQ,CAAE,CAAC,CAAE;IACnC;AACH;AAED,EAAE,CAAC,aAAa,GAAG,aAAa;AAEhC;;;;;;;;;AASE;AAEF;;AAEE;AAEF,MAAM,aAAc,SAAQ,SAAS,CAAA;IAEjC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,SAAS,EAAE,OAAO,EAAE,CAAE,OAAO,CAAE,EAAE,CAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;YAC/F,OAAO,CAAE,CAAE;IACnB;IAEA,SAAS,GAAA;;;;IAKT;AAEA,IAAA,UAAU,CAAE,CAAQ,EAAA;AAEhB,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;AAEvB,QAAA,KAAM,IAAI,CAAC,IAAI,CAAC,EAChB;AACI,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAE;QAChD;IACJ;AACH;AAED,aAAa,CAAC,WAAW,GAAG,IAAI;AAChC,aAAa,CAAC,QAAQ,GAAG,IAAI;AAC7B,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,aAAa,CAAE;AAEjE,MAAM,cAAe,SAAQ,SAAS,CAAA;IAElC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,KAAK,CAAE;IAChC;IAEA,SAAS,GAAA;;;;IAKT;AACH;AAED,cAAc,CAAC,WAAW,GAAG,IAAI;AACjC,cAAc,CAAC,QAAQ,GAAG,IAAI;AAC9B,WAAW,CAAC,kBAAkB,CAAE,iBAAiB,EAAE,cAAc,CAAE;AAEnE;;AAEE;AAEF,MAAM,OAAQ,SAAQ,SAAS,CAAA;IAE3B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;QACnC,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;IACvC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;QACtD,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE;IAC9B;AACH;AAED,OAAO,CAAC,WAAW,GAAG,6BAA6B;AACnD,WAAW,CAAC,kBAAkB,CAAE,UAAU,EAAE,OAAO,CAAE;AAErD,MAAM,aAAc,SAAQ,SAAS,CAAA;IAEjC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;QACnC,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;IACvC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;QACtD,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE;IAC9B;AACH;AAED,aAAa,CAAC,WAAW,GAAG,iCAAiC;AAC7D,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,aAAa,CAAE;AAEjE,MAAM,YAAa,SAAQ,SAAS,CAAA;IAEhC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;QACnC,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;IACvC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;QACtD,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE;IAC9B;AACH;AAED,YAAY,CAAC,WAAW,GAAG,mCAAmC;AAC9D,WAAW,CAAC,kBAAkB,CAAE,eAAe,EAAE,YAAY,CAAE;AAE/D,MAAM,UAAW,SAAQ,SAAS,CAAA;IAE9B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;QACnC,IAAI,CAAC,WAAW,CAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAE;IACvC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;QACtD,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAE;IAC9B;AACH;AAED,UAAU,CAAC,WAAW,GAAG,6BAA6B;AACtD,WAAW,CAAC,kBAAkB,CAAE,aAAa,EAAE,UAAU,CAAE;AAE3D,MAAM,QAAS,SAAQ,SAAS,CAAA;IAE5B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAE;IAC3C;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAE,CAAC,CAAE,CAAE;IACvC;AACH;AAED,QAAQ,CAAC,WAAW,GAAG,0BAA0B;AACjD,WAAW,CAAC,kBAAkB,CAAE,WAAW,EAAE,QAAQ,CAAE;AAEvD;;;;;;;;;;;;;;;;;;AAkBE;AAEF;;AAEE;AAEF,MAAM,OAAQ,SAAQ,SAAS,CAAA;IAE3B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,MAAM,CAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,MAAM,CAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,MAAM,CAAE;IAClC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;QAClD,IAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,EACrC;YACI;QACJ;AACA,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE;IACnC;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,WAAW,EAAE,OAAO,CAAE;AAEtD,MAAM,MAAO,SAAQ,SAAS,CAAA;IAE1B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,MAAM,CAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,MAAM,CAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,MAAM,CAAE;IAClC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;QAClD,IAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,EACrC;YACI;QACJ;AACA,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE;IACnC;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,UAAU,EAAE,MAAM,CAAE;AAEpD,MAAM,SAAU,SAAQ,SAAS,CAAA;IAE7B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,OAAO,CAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,MAAM,CAAE;IAClC;IAEA,OAAO,CAAE,CAAS,EAAE,CAAS,EAAA;QAEzB,OAAO,CAAC,IAAI,CAAC;IACjB;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;QAClD,IAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,EACrC;YACI;QACJ;AACA,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAE,CAAC,EAAE,CAAC,CAAE,CAAE;IAC7C;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,aAAa,EAAE,SAAS,CAAE;AAE1D,MAAM,YAAa,SAAQ,SAAS,CAAA;IAEhC,OAAO,CAAE,CAAS,EAAE,CAAS,EAAA;QAEzB,OAAO,CAAC,IAAI,CAAC;IACjB;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,YAAY,CAAE;AAEhE,MAAM,QAAS,SAAQ,SAAS,CAAA;IAE5B,OAAO,CAAE,CAAS,EAAE,CAAS,EAAA;QAEzB,OAAO,CAAC,GAAG,CAAC;IAChB;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,YAAY,EAAE,QAAQ,CAAE;AAExD,MAAM,aAAc,SAAQ,SAAS,CAAA;IAEjC,OAAO,CAAE,CAAS,EAAE,CAAS,EAAA;QAEzB,OAAO,CAAC,IAAI,CAAC;IACjB;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,iBAAiB,EAAE,aAAa,CAAE;AAElE,MAAM,WAAY,SAAQ,SAAS,CAAA;IAE/B,OAAO,CAAE,CAAS,EAAE,CAAS,EAAA;QAEzB,OAAO,CAAC,GAAG,CAAC;IAChB;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,eAAe,EAAE,WAAW,CAAE;AAE9D,MAAM,gBAAiB,SAAQ,SAAS,CAAA;IAEpC,OAAO,CAAE,CAAS,EAAE,CAAS,EAAA;QAEzB,OAAO,CAAC,IAAI,CAAC;IACjB;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,oBAAoB,EAAE,gBAAgB,CAAE;AAExE,MAAM,UAAW,SAAQ,SAAS,CAAA;IAE9B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,MAAM,EAAE,KAAK,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,OAAO,EAAE,KAAK,CAAE;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAE,WAAW,EAAE,MAAM,CAAE;AACpC,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,KAAK,CAAE;IACjC;IAEA,SAAS,GAAA;QAEL,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;AAC7E,QAAA,IAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,EAC1D;YACI;QACJ;AACA,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAE;IACrC;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,cAAc,EAAE,UAAU,CAAE;AAE5D,MAAM,WAAY,SAAQ,SAAS,CAAA;IAE/B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,GAAG,EAAE,KAAK,CAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAE,GAAG,EAAE,KAAK,CAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAE,MAAM,EAAE,KAAK,CAAE;AAC9B,QAAA,IAAI,CAAC,QAAQ,CAAE,OAAO,EAAE,KAAK,CAAE;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS;YACrG,eAAe,CAAE,CAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,KAAK,CAAE;IACjC;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;QAC/G,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;AACnC,QAAA,IAAK,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS,IAAI,QAAQ,IAAI,SAAS,EACtF;YACI;QACJ;AACA,QAAA,IAAI,MAAM;QACV,QAAS,IAAI;AAET,YAAA,KAAK,OAAO;AACR,gBAAA,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,QAAQ;gBACpC;AACJ,YAAA,KAAK,WAAW;AACZ,gBAAA,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,QAAQ;gBACpC;AACJ,YAAA,KAAK,MAAM;AACP,gBAAA,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,QAAQ;gBACnC;AACJ,YAAA,KAAK,YAAY;AACb,gBAAA,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,QAAQ;gBACpC;AACJ,YAAA,KAAK,SAAS;AACV,gBAAA,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,QAAQ;gBACnC;AACJ,YAAA,KAAK,eAAe;AAChB,gBAAA,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,QAAQ;gBACpC;;AAER,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,MAAM,CAAE;IAC/B;AACH;AACD,WAAW,CAAC,WAAW;AACnB,IAAA,uGAAuG;AAC3G,WAAW,CAAC,kBAAkB,CAAE,eAAe,EAAE,WAAW,CAAE;AAE9D;;AAEE;AAEF,MAAM,WAAY,SAAQ,SAAS,CAAA;IAE/B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,MAAM,CAAE;QAC9B,IAAI,CAAC,WAAW,CAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAE;IAC5C;IAEA,SAAS,GAAA;QAEL,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAE;IACtE;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,WAAW,CAAE;AAE/D;;AAEE;AAEF,MAAM,UAAW,SAAQ,SAAS,CAAA;IAE9B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,QAAQ,CAAE;QAChC,IAAI,CAAC,WAAW,CAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAE;IAC9C;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE;IACjD;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,eAAe,EAAE,UAAU,CAAE;AAE7D,MAAM,SAAU,SAAQ,SAAS,CAAA;IAE7B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,OAAO,CAAE;QAC/B,IAAI,CAAC,WAAW,CAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAE;IAC1C;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE;IACjD;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,cAAc,EAAE,SAAS,CAAE;AAE3D,MAAM,WAAY,SAAQ,SAAS,CAAA;IAE/B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,OAAO,EAAE,MAAM,CAAE;AACjC,QAAA,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAC,EAAE,CAAC,CAAE,CAAE;IACjD;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE;IACjD;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,WAAW,CAAE;AAE/D,MAAM,WAAY,SAAQ,SAAS,CAAA;IAE/B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,OAAO,EAAE,MAAM,CAAE;AACjC,QAAA,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,CAAE;IACpD;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE;IACjD;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,WAAW,CAAE;AAE/D,MAAM,WAAY,SAAQ,SAAS,CAAA;IAE/B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,OAAO,EAAE,MAAM,CAAE;AACjC,QAAA,IAAI,CAAC,WAAW,CAAE,OAAO,EAAE,MAAM,EAAE,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,CAAE;IACvD;IAEA,SAAS,GAAA;AAEL,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAE;IACjD;AACH;AAED,WAAW,CAAC,kBAAkB,CAAE,gBAAgB,EAAE,WAAW,CAAE;AAE/D;;AAEE;AAEF,MAAM,eAAgB,SAAQ,SAAS,CAAA;IAEnC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,OAAO,EAAE,KAAK,CAAE;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,KAAK,CAAE;QAC7B,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAE;IAC5C;IAEA,SAAS,GAAA;QAEL,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;AAChC,QAAA,IAAK,OAAO,IAAI,SAAS,EACzB;YACI;QACJ;QACA,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;AACjC,QAAA,IAAK,QAAQ,IAAI,SAAS,EAC1B;YACI;QACJ;QACA,IAAI,CAAC,MAAM,EAAE,WAAW,CAAE,OAAO,EAAE,QAAQ,CAAE;AAC7C,QAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,QAAQ,CAAE;IACjC;AACH;AAED,eAAe,CAAC,KAAK,GAAG,cAAc;AACtC,WAAW,CAAC,kBAAkB,CAAE,uBAAuB,EAAE,eAAe,CAAE;AAE1E,MAAM,eAAgB,SAAQ,SAAS,CAAA;IAEnC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAE,IAAI,EAAE,KAAK,CAAE;QAC7B,IAAI,CAAC,WAAW,CAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAE;IAC5C;IAEA,SAAS,GAAA;QAEL,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;AAChC,QAAA,IAAK,OAAO,IAAI,SAAS,EACzB;YACI;QACJ;QACA,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAE,OAAO,CAAE;AAC9C,QAAA,IAAK,IAAI,IAAI,SAAS,EACtB;AACI,YAAA,IAAI,CAAC,SAAS,CAAE,CAAC,EAAE,IAAI,CAAE;QAC7B;IACJ;AACH;AAED,eAAe,CAAC,KAAK,GAAG,cAAc;AACtC,WAAW,CAAC,kBAAkB,CAAE,uBAAuB,EAAE,eAAe,CAAE;AAE1E;;AAEE;AAEF,MAAM,cAAe,SAAQ,SAAS,CAAA;IAElC,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,IAAI,EAAE,KAAK,CAAE;IAChC;IAEA,SAAS,GAAA;QAEL,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;AAC7B,QAAA,IAAK,IAAI,IAAI,SAAS,EACtB;YACI;QACJ;AACA,QAAA,OAAO,CAAC,GAAG,CAAE,IAAI,CAAE;IACvB;AACH;AAED,cAAc,CAAC,KAAK,GAAG,aAAa;AACpC,WAAW,CAAC,kBAAkB,CAAE,mBAAmB,EAAE,cAAc,CAAE;AAErE,MAAM,QAAS,SAAQ,SAAS,CAAA;IAE5B,QAAQ,GAAA;AAEJ,QAAA,IAAI,CAAC,QAAQ,CAAE,GAAG,EAAE,OAAO,CAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAE,GAAG,EAAE,MAAM,CAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAE,OAAO,EAAE,MAAM,CAAE;IACpC;IAEA,SAAS,GAAA;QAEL,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAE;AAC7B,QAAA,IAAK,IAAI,IAAI,SAAS,EACtB;YACI;QACJ;AACA,QAAA,OAAO,CAAC,GAAG,CAAE,IAAI,CAAE;IACvB;AACH;AAED,QAAQ,CAAC,WAAW,GAAG,IAAI;AAC3B,WAAW,CAAC,kBAAkB,CAAE,aAAa,EAAE,QAAQ,CAAE;;;;"}
|
|
1
|
+
{"version":3,"file":"GraphEditor.js","sources":["../../src/extensions/GraphEditor.ts"],"sourcesContent":["// GraphEditor.ts @jxarco\r\n\r\nimport { LX } from '../core/Namespace';\r\n\r\nif ( !LX )\r\n{\r\n throw ( 'Missing LX namespace!' );\r\n}\r\n\r\nLX.extensions.push( 'GraphEditor' );\r\n\r\nconst g = globalThis as any;\r\nconst vec2 = LX.vec2;\r\nconst Area = LX.Area;\r\nconst Panel = LX.Panel;\r\nconst Sidebar = LX.Sidebar;\r\nconst ContextMenu = LX.ContextMenu;\r\nconst PocketDialog = LX.PocketDialog;\r\n\r\nexport class BoundingBox\r\n{\r\n origin: typeof vec2;\r\n size: typeof vec2;\r\n\r\n constructor( o: typeof vec2, s: typeof vec2 )\r\n {\r\n this.origin = o ?? new vec2( 0, 0 );\r\n this.size = s ?? new vec2( 0, 0 );\r\n }\r\n\r\n merge( bb: BoundingBox )\r\n {\r\n console.assert( bb.constructor == BoundingBox );\r\n\r\n const min0 = this.origin;\r\n const max0 = this.origin.add( this.size );\r\n\r\n const min1 = bb.origin;\r\n const max1 = bb.origin.add( bb.size );\r\n\r\n const mergeMin = new vec2( Math.min( min0.x, min1.x ), Math.min( min0.y, min1.y ) );\r\n const mergeMax = new vec2( Math.max( max0.x, max1.x ), Math.max( max0.y, max1.y ) );\r\n\r\n this.origin = mergeMin;\r\n this.size = mergeMax.sub( mergeMin );\r\n }\r\n\r\n inside( bb: BoundingBox, full: boolean = true )\r\n {\r\n const min0 = this.origin;\r\n const max0 = this.origin.add( this.size );\r\n\r\n const min1 = bb.origin;\r\n const max1 = bb.origin.add( bb.size );\r\n\r\n if ( full )\r\n {\r\n return min1.x >= min0.x && max1.x <= max0.x\r\n && min1.y >= min0.y && max1.y <= max0.y;\r\n }\r\n else\r\n {\r\n return max1.x >= min0.x && min1.x <= max0.x\r\n && max1.y >= min0.y && min1.y <= max0.y;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @class GraphEditor\r\n */\r\n\r\nexport class GraphEditor\r\n{\r\n static __instances: GraphEditor[] = [];\r\n\r\n // Editor\r\n\r\n static MIN_SCALE: number = 0.25;\r\n static MAX_SCALE: number = 4.0;\r\n\r\n static EVENT_MOUSEMOVE: number = 0;\r\n static EVENT_MOUSEWHEEL: number = 1;\r\n\r\n static LAST_GROUP_ID: number = 0;\r\n static LAST_FUNCTION_ID: number = 0;\r\n\r\n static STOPPED: number = 0;\r\n static RUNNING: number = 1;\r\n\r\n // Node Drawing\r\n\r\n static NODE_IO_INPUT: number = 0;\r\n static NODE_IO_OUTPUT: number = 1;\r\n\r\n static NODE_TYPES: Record<string, GraphNode> = {};\r\n\r\n static onCustomNodeRegistered: ( s: string, n: GraphNode ) => void = () => {};\r\n static onNodeTypeReplaced: ( s: string, n: GraphNode, p: GraphNode ) => void = () => {};\r\n\r\n root: HTMLElement;\r\n area: typeof Area;\r\n propertiesDialog: typeof PocketDialog;\r\n\r\n currentGraph: Graph | null = null;\r\n keys: any = {};\r\n graphs: Record<string, any> = {};\r\n nodes: Record<string, any> = {};\r\n variables: Record<string, any> = {};\r\n groups: any = {};\r\n supportedCastTypes: any = {};\r\n selectedNodes: any[] = [];\r\n main: string = '';\r\n mustStop: boolean = false;\r\n state: number = GraphEditor.STOPPED;\r\n isFocused: boolean = false;\r\n\r\n _graphContainer: HTMLElement;\r\n _sidebarDom: HTMLElement;\r\n _sidebarActive: boolean = true;\r\n _sidebar: typeof Sidebar;\r\n _domLinks: HTMLElement;\r\n _domNodes: HTMLElement;\r\n _mousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _deltaMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _snappedDeltaMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _lastMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _lastSnappedMousePosition: typeof vec2 = new vec2( 0, 0 );\r\n _generatingLink: any;\r\n _snapToGrid: boolean = false;\r\n _snapValue: number = 1.0;\r\n _nodeBackgroundOpacity: number = 0.8;\r\n _patternSizeF: number = 15.0;\r\n _patternSize: typeof vec2 = new vec2( this._patternSizeF );\r\n _circlePatternSize = this._patternSizeF * 0.04;\r\n _circlePatternColor: string = '#71717a9c';\r\n _background: SVGSVGElement | undefined;\r\n _undoSteps: any[] = [];\r\n _redoSteps: any[] = [];\r\n _clipboardData: any;\r\n _lastMouseDown: number = 0.0;\r\n _boxSelecting: any;\r\n _boxSelectRemoving: any;\r\n _currentBoxSelectionSVG: SVGSVGElement | undefined;\r\n\r\n constructor( area: typeof Area, options: any = {} )\r\n {\r\n GraphEditor.__instances.push( this );\r\n\r\n this._sidebar = area.addSidebar( ( m: typeof Sidebar ) => {\r\n }, {\r\n displaySelected: true,\r\n headerIcon: 'EllipsisVertical',\r\n headerTitle: 'Create',\r\n headerSubtitle: 'Press to rename',\r\n onHeaderPressed: () => this._showRenameGraphDialog(),\r\n footerIcon: 'Plus',\r\n footerTitle: 'Create',\r\n footerSubtitle: 'Graph or Function',\r\n onFooterPressed: ( e: any ) => this._onSidebarCreate( e )\r\n } );\r\n\r\n this.area = new Area( { className: 'lexgraph' } );\r\n\r\n area.root.classList.add( 'grapharea' );\r\n\r\n this.root = this.area.root;\r\n this.root.tabIndex = -1;\r\n\r\n area.attach( this.root );\r\n\r\n this._graphContainer = area.sections[1].root;\r\n this._sidebarDom = area.sections[0].root;\r\n this._sidebarActive = options.sidebar ?? this._sidebarActive;\r\n\r\n // Set sidebar state depending on options..\r\n LX.doAsync( () => {\r\n this._sidebar.toggleCollapsed( !this._sidebarActive );\r\n }, 50 );\r\n\r\n // Bind resize\r\n\r\n area.onresize = ( bb: any ) => {\r\n };\r\n\r\n area.addOverlayButtons( [\r\n [\r\n {\r\n name: 'Start Graph',\r\n icon: 'Play@solid',\r\n callback: () => this.start(),\r\n selectable: true\r\n },\r\n {\r\n name: 'Stop Graph',\r\n icon: 'Stop@solid',\r\n callback: () => this.stop(),\r\n selectable: true\r\n }\r\n ],\r\n [\r\n {\r\n name: 'Enable Snapping',\r\n icon: 'Frame',\r\n callback: () => this._toggleSnapping(),\r\n selectable: true\r\n },\r\n {\r\n name: 1,\r\n options: [ 1, 2, 3 ],\r\n callback: ( value: number ) => this._setSnappingValue( value )\r\n }\r\n ],\r\n [\r\n {\r\n name: 'Import',\r\n icon: 'Upload',\r\n callback: () => {\r\n this.loadGraph( '../../data/graph_sample.json' );\r\n }\r\n },\r\n {\r\n name: 'Export',\r\n icon: 'ArrowRightFromLine',\r\n callback: () => this.currentGraph?.export()\r\n }\r\n ]\r\n ], { float: 'htc' } );\r\n\r\n this.root.addEventListener( 'keydown', this._processKeyDown.bind( this ), true );\r\n this.root.addEventListener( 'keyup', this._processKeyUp.bind( this ), true );\r\n this.root.addEventListener( 'mousedown', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mouseup', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mousemove', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mousewheel', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'mouseleave', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'click', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'contextmenu', this._processMouse.bind( this ) );\r\n this.root.addEventListener( 'focus', this._processFocus.bind( this, true ) );\r\n this.root.addEventListener( 'focusout', this._processFocus.bind( this, false ) );\r\n\r\n this.propertiesDialog = new PocketDialog( 'Properties', null, {\r\n size: [ '350px', null ],\r\n position: [ '8px', '8px' ],\r\n float: 'left',\r\n class: 'lexgraphpropdialog'\r\n } );\r\n\r\n // Avoid closing the dialog on click..\r\n\r\n this.propertiesDialog.root.addEventListener( 'mousedown', function( e: MouseEvent )\r\n {\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n } );\r\n\r\n this.propertiesDialog.root.addEventListener( 'mouseup', function( e: MouseEvent )\r\n {\r\n e.stopImmediatePropagation();\r\n e.stopPropagation();\r\n } );\r\n\r\n // Move to root..\r\n this.root.appendChild( this.propertiesDialog.root );\r\n\r\n this.addCastType( 'float', 'vec2', ( v: number ) => {\r\n return [ v, v ];\r\n } );\r\n this.addCastType( 'float', 'vec3', ( v: number ) => {\r\n return [ v, v, v ];\r\n } );\r\n this.addCastType( 'float', 'vec4', ( v: number ) => {\r\n return [ v, v, v, v ];\r\n } );\r\n this.addCastType( 'float', 'bool', ( v: number ) => {\r\n return !!v;\r\n } );\r\n\r\n this.addCastType( 'vec4', 'vec3', ( v: number[] ) => {\r\n v.slice( 0, 3 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec4', 'vec2', ( v: number[] ) => {\r\n v.slice( 0, 2 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec3', 'vec2', ( v: number[] ) => {\r\n v.slice( 0, 2 );\r\n return v;\r\n } );\r\n\r\n this.addCastType( 'vec3', 'vec4', ( v: number[] ) => {\r\n v.push( 1 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec2', 'vec3', ( v: number[] ) => {\r\n v.push( 1 );\r\n return v;\r\n } );\r\n this.addCastType( 'vec2', 'vec4', ( v: number[] ) => {\r\n v.push( 0, 1 );\r\n return v;\r\n } );\r\n\r\n this._nodeBackgroundOpacity = options.disableNodeOpacity ? 1.0 : this._nodeBackgroundOpacity;\r\n\r\n // Back pattern\r\n this._generatePattern();\r\n\r\n // Links\r\n\r\n this._domLinks = document.createElement( 'div' );\r\n this._domLinks.classList.add( 'lexgraphlinks' );\r\n this.root.appendChild( this._domLinks );\r\n\r\n // Nodes\r\n\r\n this._domNodes = document.createElement( 'div' );\r\n this._domNodes.classList.add( 'lexgraphnodes' );\r\n this.root.appendChild( this._domNodes );\r\n\r\n g.ge = this;\r\n }\r\n\r\n static getInstances()\r\n {\r\n return GraphEditor.__instances;\r\n }\r\n\r\n /**\r\n * Register a node class so it can be listed when the user wants to create a new one\r\n * @method registerCustomNode\r\n * @param {String} type: name of the node and path\r\n * @param {Class} baseClass class containing the structure of the custom node\r\n */\r\n\r\n static registerCustomNode( type: string, baseClass: any )\r\n {\r\n if ( !baseClass.prototype )\r\n {\r\n throw 'Cannot register a simple object, it must be a class with a prototype!';\r\n }\r\n\r\n // Get info from path\r\n const pos = type.lastIndexOf( '/' );\r\n\r\n baseClass.category = type.substring( 0, pos );\r\n baseClass.title = baseClass.title ?? type.substring( pos + 1 );\r\n baseClass.type = type;\r\n\r\n if ( !baseClass.prototype.onExecute )\r\n {\r\n console.warn( `GraphNode [${baseClass.title}] does not have a callback attached.` );\r\n }\r\n\r\n const prev = GraphEditor.NODE_TYPES[type];\r\n if ( prev )\r\n {\r\n console.warn( `Replacing node type [${type}]` );\r\n }\r\n\r\n GraphEditor.NODE_TYPES[type] = baseClass;\r\n\r\n // Some callbacks..\r\n\r\n if ( GraphEditor.onCustomNodeRegistered )\r\n {\r\n GraphEditor.onCustomNodeRegistered( type, baseClass );\r\n }\r\n\r\n if ( prev && GraphEditor.onNodeTypeReplaced )\r\n {\r\n GraphEditor.onNodeTypeReplaced( type, baseClass, prev );\r\n }\r\n }\r\n\r\n /**\r\n * Create a node of a given type with a name. The node is not attached to any graph yet.\r\n * @method createNode\r\n * @param {String} type full name of the node class. p.e. \"math/sin\"\r\n * @param {String} title a name to distinguish from other nodes\r\n * @param {Object} options Store node options\r\n */\r\n\r\n static addNode( type: string, title?: string, options: any = {} )\r\n {\r\n var baseClass: any = GraphEditor.NODE_TYPES[type];\r\n\r\n if ( !baseClass )\r\n {\r\n console.warn( `GraphNode type [${type}] not registered.` );\r\n return null;\r\n }\r\n\r\n title = title ?? baseClass.title;\r\n\r\n const node = new baseClass( title );\r\n\r\n if ( node.onCreate )\r\n {\r\n node.onCreate();\r\n }\r\n\r\n node.type = type;\r\n node.title = title;\r\n node.position = new vec2( 0, 0 );\r\n node.color = null;\r\n\r\n if ( baseClass.name == 'NodeFunction' )\r\n {\r\n node.gid = baseClass.gid;\r\n }\r\n\r\n // Extra options\r\n if ( options )\r\n {\r\n for ( var i in options )\r\n {\r\n node[i] = options[i];\r\n }\r\n }\r\n\r\n if ( node.onNodeCreated )\r\n {\r\n node.onNodeCreated();\r\n }\r\n\r\n return node;\r\n }\r\n\r\n /**\r\n * @method setGraph\r\n * @param {Graph} graph\r\n */\r\n\r\n setGraph( graph: Graph )\r\n {\r\n // Nothing to do, already there...\r\n if ( this.currentGraph && graph.id == this.currentGraph.id )\r\n {\r\n return;\r\n }\r\n\r\n this.clear();\r\n\r\n graph.id = graph.id ?? graph.constructor.name + '-' + LX.guidGenerator();\r\n\r\n this.graphs[graph.id] = graph;\r\n\r\n if ( !graph.nodes )\r\n {\r\n console.warn( 'Graph does not contain any node!' );\r\n return;\r\n }\r\n\r\n this.currentGraph = graph;\r\n\r\n this._updatePattern();\r\n\r\n for ( let node of graph.nodes )\r\n {\r\n this._createNodeDOM( node );\r\n }\r\n\r\n for ( let group of graph.groups )\r\n {\r\n const groupDom: any = this._createGroup( group );\r\n groupDom.querySelector( '.lexgraphgrouptitle' ).value = group.name;\r\n this._domNodes.prepend( groupDom );\r\n }\r\n\r\n for ( let linkId in graph.links )\r\n {\r\n const links = graph.links[linkId];\r\n\r\n for ( let link of links )\r\n {\r\n this._createLink( link );\r\n }\r\n }\r\n\r\n this._updateGraphName( graph.name );\r\n this._togglePropertiesDialog( false );\r\n }\r\n\r\n /**\r\n * @method loadGraph\r\n * @param {String} url\r\n * @param {Function} callback Function to call once the graph is loaded\r\n */\r\n\r\n loadGraph( url: string, callback?: ( g: Graph ) => void )\r\n {\r\n const onComplete = ( json: any ) => {\r\n let graph: Graph | GraphFunction = ( json.type == 'Graph' )\r\n ? this.addGraph( json )\r\n : this.addGraphFunction( json );\r\n\r\n if ( callback )\r\n {\r\n callback( graph );\r\n }\r\n };\r\n\r\n const onError = ( v: any ) => console.error( v );\r\n\r\n LX.requestJSON( url, onComplete, onError );\r\n }\r\n\r\n /**\r\n * @method addGraph\r\n * @param {Object} o Options to configure the graph\r\n */\r\n\r\n addGraph( o?: any )\r\n {\r\n let graph = new Graph();\r\n graph.editor = this;\r\n\r\n if ( o )\r\n {\r\n // Load functions first if any..\r\n\r\n for ( let fn of o.functions ?? [] )\r\n {\r\n this.addGraphFunction( fn );\r\n }\r\n\r\n graph.configure( o );\r\n }\r\n\r\n this.setGraph( graph );\r\n\r\n this._sidebar.add( graph.name, { icon: 'CircleNodes', className: graph.id, callback: () => {\r\n this.setGraph( graph );\r\n } } );\r\n this._sidebar.update();\r\n this._sidebar.select( graph.name );\r\n\r\n return graph;\r\n }\r\n\r\n /**\r\n * @method addGraphFunction\r\n * @param {Object} o Options to configure the graph\r\n */\r\n\r\n addGraphFunction( o?: any )\r\n {\r\n let func = new GraphFunction();\r\n func.editor = this;\r\n\r\n if ( o )\r\n {\r\n // Load other inner functions first if any..\r\n\r\n for ( let fn of o.functions ?? [] )\r\n {\r\n this.addGraphFunction( fn );\r\n }\r\n\r\n func.configure( o );\r\n }\r\n\r\n this.setGraph( func );\r\n\r\n // Add a new node to use this function..\r\n\r\n class NodeFunction extends GraphNode\r\n {\r\n static func: GraphFunction;\r\n static gid: string;\r\n\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n const func = NodeFunction.func;\r\n const value = func.getOutputData( this.getInput( 0 ) );\r\n this.setOutput( 0, value );\r\n }\r\n }\r\n\r\n NodeFunction.func = func;\r\n NodeFunction.gid = func.id;\r\n GraphEditor.registerCustomNode( 'function/' + func.name, NodeFunction );\r\n\r\n this._sidebar.add( func.name, { icon: 'Function', className: func.id, callback: () => {\r\n this.setGraph( func );\r\n } } );\r\n this._sidebar.update();\r\n this._sidebar.select( func.name );\r\n\r\n return func;\r\n }\r\n\r\n /**\r\n * @method clear\r\n */\r\n\r\n clear()\r\n {\r\n this._domNodes.innerHTML = '';\r\n this._domLinks.innerHTML = '';\r\n\r\n this.nodes = {};\r\n }\r\n\r\n setVariable( name: string, value: any )\r\n {\r\n this.variables[name] = value;\r\n }\r\n\r\n getVariable( name: string )\r\n {\r\n return this.variables[name];\r\n }\r\n\r\n propagateEventToAllNodes( eventName: string, params?: any )\r\n {\r\n if ( !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const nodes = this.currentGraph.nodes as any[];\r\n for ( let node of nodes )\r\n {\r\n if ( !node[eventName] )\r\n {\r\n continue;\r\n }\r\n\r\n node[eventName].apply( this, params );\r\n }\r\n }\r\n\r\n /**\r\n * @method addCastType\r\n * @param {String} type: Type to cast\r\n * @param {String} targetType: Types to be casted from original type\r\n * @param {Function} fn: Function to know how to cast\r\n */\r\n\r\n addCastType( type: string, targetType: string, fn: any )\r\n {\r\n this.supportedCastTypes[type + '@' + targetType] = fn;\r\n }\r\n\r\n /**\r\n * @method unSelectAll\r\n */\r\n\r\n unSelectAll( keepPropDialog: boolean = false )\r\n {\r\n this._domNodes.querySelectorAll( '.lexgraphnode' ).forEach( ( v ) => v.classList.remove( 'selected' ) );\r\n\r\n this.selectedNodes.length = 0;\r\n\r\n if ( !keepPropDialog )\r\n {\r\n this._togglePropertiesDialog( false );\r\n }\r\n }\r\n\r\n _createNodeDOM( node: any )\r\n {\r\n node.editor = this;\r\n node.graphID = this.currentGraph?.id;\r\n\r\n var nodeContainer = document.createElement( 'div' );\r\n nodeContainer.classList.add( 'lexgraphnode' );\r\n nodeContainer.style.left = '0';\r\n nodeContainer.style.top = '0';\r\n\r\n this._translateNode( nodeContainer, node.position );\r\n\r\n var color;\r\n\r\n // Get color from type if color if not manually specified\r\n if ( node.type && GraphEditor.NODE_TYPES[node.type] )\r\n {\r\n const category = node.constructor.category;\r\n nodeContainer.classList.add( category );\r\n }\r\n else\r\n {\r\n const pos = node.type.lastIndexOf( '/' );\r\n const category = node.type.substring( 0, pos );\r\n nodeContainer.classList.add( category );\r\n }\r\n\r\n // Update with manual color\r\n\r\n color = node.color ?? color;\r\n\r\n if ( color )\r\n {\r\n // RGB\r\n if ( color.constructor == Array )\r\n {\r\n color = color.join( ',' );\r\n }\r\n // Hex color..\r\n else\r\n {\r\n color = LX.hexToRgb( color );\r\n color.forEach( ( v: number, i: number ) => color[i] = v * 255 );\r\n }\r\n\r\n nodeContainer.style.backgroundColor = 'rgba(' + color + ', ' + this._nodeBackgroundOpacity + ')';\r\n }\r\n\r\n nodeContainer.addEventListener( 'mousedown', ( e: MouseEvent ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n\r\n if ( e.altKey )\r\n {\r\n this._unSelectNode( nodeContainer );\r\n }\r\n else\r\n {\r\n if ( this.selectedNodes.length > 1 && ( !e.ctrlKey && !e.shiftKey ) )\r\n {\r\n this.unSelectAll( true );\r\n }\r\n\r\n if ( !nodeContainer.classList.contains( 'selected' ) )\r\n {\r\n this._selectNode( nodeContainer, e.ctrlKey || e.shiftKey );\r\n }\r\n }\r\n } );\r\n\r\n nodeContainer.addEventListener( 'contextmenu', ( e ) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n LX.addContextMenu( null, e, ( m: typeof ContextMenu ) => {\r\n m.add( 'Copy', () => {\r\n this._clipboardData = {\r\n id: node.id,\r\n gid: this.currentGraph?.id\r\n };\r\n } );\r\n\r\n // TODO\r\n // m.add( \"Paste\", () => {\r\n\r\n // } );\r\n\r\n m.add( '' );\r\n\r\n m.add( 'Delete', () => {\r\n this._deleteNode( nodeContainer.dataset['id'] as string );\r\n } );\r\n } );\r\n } );\r\n\r\n nodeContainer.addEventListener( 'dblclick', ( e ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n\r\n // Open graph function..\r\n if ( node.constructor.func )\r\n {\r\n this._sidebar.select( node.constructor.func.name );\r\n }\r\n } );\r\n\r\n // Title header\r\n var nodeHeader = document.createElement( 'div' );\r\n nodeHeader.classList.add( 'lexgraphnodeheader' );\r\n nodeHeader.innerText = node.title;\r\n nodeContainer.appendChild( nodeHeader );\r\n\r\n // Properties\r\n // if( node.properties.length )\r\n // {\r\n // var nodeProperties = document.createElement( 'div' );\r\n // nodeProperties.classList.add( 'lexgraphnodeproperties' );\r\n\r\n // for( let p of node.properties )\r\n // {\r\n // var panel = new LX.Panel();\r\n\r\n // p.signal = \"@\" + LX.guidGenerator() + node.title;\r\n\r\n // switch( p.type )\r\n // {\r\n // case 'float':\r\n // case 'int':\r\n // panel.addNumber( p.name, p.value, (v) => p.value = v, { signal: p.signal } );\r\n // break;\r\n // case 'string':\r\n // panel.addText( p.name, p.value, (v) => p.value = v, { signal: p.signal } );\r\n // break;\r\n // }\r\n\r\n // // var prop = document.createElement( 'div' );\r\n // // prop.innerText = p.type;\r\n // // prop.classList.add( 'lexgraphnodeproperty' );\r\n // nodeProperties.appendChild( panel.root );\r\n // }\r\n\r\n // nodeContainer.appendChild( nodeProperties );\r\n // }\r\n\r\n // Inputs and outputs\r\n var nodeIO = document.createElement( 'div' );\r\n nodeIO.classList.add( 'lexgraphnodeios' );\r\n nodeContainer.appendChild( nodeIO );\r\n\r\n const hasInputs = node.inputs && node.inputs.length;\r\n const hasOutputs = node.outputs && node.outputs.length;\r\n\r\n // Inputs\r\n if ( hasInputs )\r\n {\r\n const nodeInputs = document.createElement( 'div' );\r\n nodeInputs.classList.add( 'lexgraphnodeinputs' );\r\n // nodeInputs.style.width = hasOutputs ? '50%' : '100%';\r\n nodeIO.appendChild( nodeInputs );\r\n\r\n for ( let i of node.inputs )\r\n {\r\n if ( !i.type )\r\n {\r\n console.warn( `Missing type for node [${node.title}], skipping...` );\r\n continue;\r\n }\r\n\r\n var input = document.createElement( 'div' );\r\n input.className = 'lexgraphnodeio ioinput';\r\n input.dataset['index'] = nodeInputs.childElementCount.toString();\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type input ' + i.type;\r\n type.dataset['type'] = i.type;\r\n type.innerHTML = '<span>' + i.type[0].toUpperCase() + '</span>';\r\n input.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc input ' + i.type;\r\n typeDesc.innerHTML = i.type;\r\n input.appendChild( typeDesc );\r\n\r\n if ( i.name )\r\n {\r\n LX.makeElement( 'span', 'io__name', i.name, input );\r\n }\r\n\r\n nodeInputs.appendChild( input );\r\n }\r\n }\r\n\r\n // Outputs\r\n if ( hasOutputs )\r\n {\r\n const nodeOutputs = document.createElement( 'div' );\r\n nodeOutputs.classList.add( 'lexgraphnodeoutputs' );\r\n // nodeOutputs.style.width = hasInputs ? '50%' : '100%';\r\n nodeIO.appendChild( nodeOutputs );\r\n\r\n for ( let o of node.outputs )\r\n {\r\n if ( !o.type )\r\n {\r\n console.warn( `Missing type for node [${node.title}], skipping...` );\r\n }\r\n\r\n var output = document.createElement( 'div' );\r\n output.className = 'lexgraphnodeio iooutput';\r\n output.dataset['index'] = nodeOutputs.childElementCount.toString();\r\n\r\n if ( o.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = o.name;\r\n output.appendChild( name );\r\n }\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type output ' + o.type;\r\n type.dataset['type'] = o.type;\r\n type.innerHTML = '<span>' + o.type[0].toUpperCase() + '</span>';\r\n output.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc output ' + o.type;\r\n typeDesc.innerHTML = o.type;\r\n output.appendChild( typeDesc );\r\n\r\n nodeOutputs.appendChild( output );\r\n }\r\n }\r\n\r\n // Move nodes\r\n\r\n LX.makeDraggable( nodeContainer, {\r\n onMove: this._onMoveNodes.bind( this ),\r\n onDragStart: this._onDragNode.bind( this )\r\n } );\r\n\r\n this._addNodeIOEvents( nodeContainer );\r\n\r\n const id = node.id ?? node.title.toLowerCase().replaceAll( /\\s/g, '-' ) + '-' + LX.guidGenerator();\r\n this.nodes[id] = { data: node, dom: nodeContainer };\r\n\r\n node.id = id;\r\n nodeContainer.dataset['id'] = id;\r\n\r\n this._domNodes.appendChild( nodeContainer );\r\n\r\n // Only 1 main per graph!\r\n if ( node.title == 'Main' )\r\n {\r\n this.main = id;\r\n }\r\n\r\n node.size = new vec2( nodeContainer.offsetWidth, nodeContainer.offsetHeight );\r\n\r\n node.resizeObserver = new ResizeObserver( ( entries ) => {\r\n for ( const entry of entries )\r\n {\r\n const bb = entry.contentRect;\r\n if ( !bb.width || !bb.height )\r\n {\r\n continue;\r\n }\r\n node.size = new vec2( nodeContainer.offsetWidth, nodeContainer.offsetHeight );\r\n }\r\n } );\r\n\r\n node.resizeObserver.observe( nodeContainer );\r\n\r\n return nodeContainer;\r\n }\r\n\r\n _updateNodeDOMIOs( dom: HTMLElement, node: GraphNode )\r\n {\r\n // Inputs and outputs\r\n var nodeIO = dom.querySelector( '.lexgraphnodeios' );\r\n\r\n const hasInputs = node.inputs && node.inputs.length;\r\n const hasOutputs = node.outputs && node.outputs.length;\r\n\r\n // Inputs\r\n if ( hasInputs )\r\n {\r\n const nodeInputs = nodeIO?.querySelector( '.lexgraphnodeinputs' )!;\r\n nodeInputs.innerHTML = '';\r\n\r\n for ( let i of node.inputs )\r\n {\r\n if ( !i.type )\r\n {\r\n console.warn( `Missing type for node [${node.constructor.name}], skipping...` );\r\n continue;\r\n }\r\n\r\n var input = document.createElement( 'div' );\r\n input.className = 'lexgraphnodeio ioinput';\r\n input.dataset['index'] = nodeInputs.childElementCount.toString();\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type input ' + i.type;\r\n type.innerHTML = '<span>' + i.type[0].toUpperCase() + '</span>';\r\n input.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc input ' + i.type;\r\n typeDesc.innerHTML = i.type;\r\n input.appendChild( typeDesc );\r\n\r\n if ( i.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = i.name;\r\n input.appendChild( name );\r\n }\r\n\r\n nodeInputs.appendChild( input );\r\n }\r\n }\r\n\r\n // Outputs\r\n if ( hasOutputs )\r\n {\r\n const nodeOutputs = nodeIO?.querySelector( '.lexgraphnodeoutputs' )!;\r\n nodeOutputs.innerHTML = '';\r\n\r\n for ( let o of node.outputs )\r\n {\r\n if ( !o.type )\r\n {\r\n console.warn( `Missing type for node [${node.constructor.name}], skipping...` );\r\n }\r\n\r\n var output = document.createElement( 'div' );\r\n output.className = 'lexgraphnodeio iooutput';\r\n output.dataset['index'] = nodeOutputs.childElementCount.toString();\r\n\r\n if ( o.name )\r\n {\r\n var name = document.createElement( 'span' );\r\n name.classList.add( 'io__name' );\r\n name.innerText = o.name;\r\n output.appendChild( name );\r\n }\r\n\r\n var type = document.createElement( 'span' );\r\n type.className = 'io__type output ' + o.type;\r\n type.innerHTML = '<span>' + o.type[0].toUpperCase() + '</span>';\r\n output.appendChild( type );\r\n\r\n var typeDesc = document.createElement( 'span' );\r\n typeDesc.className = 'io__typedesc output ' + o.type;\r\n typeDesc.innerHTML = o.type;\r\n output.appendChild( typeDesc );\r\n\r\n nodeOutputs.appendChild( output );\r\n }\r\n }\r\n\r\n this._addNodeIOEvents( dom );\r\n }\r\n\r\n _addNodeIOEvents( nodeContainer: HTMLElement )\r\n {\r\n const nodeIO = nodeContainer.querySelector( '.lexgraphnodeios' );\r\n\r\n // Manage links\r\n\r\n nodeIO?.querySelectorAll( '.lexgraphnodeio' ).forEach( ( el: any ) => {\r\n el.addEventListener( 'mousedown', ( e: MouseEvent ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n\r\n this._lastMouseDown = LX.getTime();\r\n\r\n this._generatingLink = {\r\n index: parseInt( el.dataset['index'] ),\r\n io: el,\r\n ioType: el.classList.contains( 'ioinput' ) ? GraphEditor.NODE_IO_INPUT : GraphEditor.NODE_IO_OUTPUT,\r\n domEl: nodeContainer\r\n };\r\n\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n } );\r\n\r\n el.addEventListener( 'mouseup', ( e: MouseEvent ) => {\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n // Single click..\r\n if ( ( LX.getTime() - this._lastMouseDown ) < 200 )\r\n {\r\n delete this._generatingLink;\r\n return;\r\n }\r\n\r\n if ( this._generatingLink )\r\n {\r\n // Check for IO\r\n if ( !this._onLink( e ) )\r\n {\r\n // Delete entire SVG if not a successful connection..\r\n LX.deleteElement( this._generatingLink.path ? this._generatingLink.path.parentElement : null );\r\n }\r\n\r\n delete this._generatingLink;\r\n }\r\n } );\r\n\r\n el.addEventListener( 'click', ( e: MouseEvent ) => {\r\n if ( !el.links )\r\n {\r\n return;\r\n }\r\n\r\n const nodeId = nodeContainer.dataset['id'] as string;\r\n this._deleteLinks( nodeId, el );\r\n } );\r\n } );\r\n }\r\n\r\n _getAllDOMNodes( includeGroups: boolean = false, exclude?: HTMLElement )\r\n {\r\n var elements = null;\r\n\r\n if ( includeGroups )\r\n {\r\n elements = Array.from( this._domNodes.childNodes );\r\n }\r\n else\r\n {\r\n elements = Array.from( this._domNodes.childNodes ).filter( ( v: any ) => v.classList.contains( 'lexgraphnode' ) );\r\n }\r\n\r\n if ( exclude )\r\n {\r\n elements = elements.filter( ( v ) => v != exclude );\r\n }\r\n\r\n return elements;\r\n }\r\n\r\n _onMoveNodes( target: HTMLElement )\r\n {\r\n let dT = this._snapToGrid ? this._snappedDeltaMousePosition : this._deltaMousePosition;\r\n dT.div( this.currentGraph?.scale, dT );\r\n\r\n for ( let nodeId of this.selectedNodes )\r\n {\r\n const el = this._getNodeDOMElement( nodeId );\r\n\r\n this._translateNode( el, dT );\r\n\r\n this._updateNodeLinks( nodeId );\r\n }\r\n }\r\n\r\n _onDragNode( target: HTMLElement, e: DragEvent )\r\n {\r\n if ( !e.shiftKey )\r\n {\r\n return;\r\n }\r\n\r\n this._cloneNodes();\r\n }\r\n\r\n _onMoveGroup( target: any )\r\n {\r\n // Move nodes inside the group\r\n\r\n const groupNodeIds = target.nodes;\r\n\r\n if ( !groupNodeIds )\r\n {\r\n return;\r\n }\r\n\r\n let dT = this._snapToGrid ? this._snappedDeltaMousePosition : this._deltaMousePosition;\r\n dT.div( this.currentGraph?.scale, dT );\r\n\r\n this._translateNode( target, dT );\r\n\r\n for ( let nodeId of groupNodeIds )\r\n {\r\n const isGroup = nodeId.constructor !== String;\r\n\r\n const el = isGroup ? nodeId : this._getNodeDOMElement( nodeId as string );\r\n\r\n this._translateNode( el, dT, !isGroup );\r\n\r\n if ( !isGroup )\r\n {\r\n this._updateNodeLinks( nodeId as string );\r\n }\r\n }\r\n }\r\n\r\n _onDragGroup( target: any )\r\n {\r\n // Get nodes inside the group to be moved\r\n\r\n const group_bb = this._getBoundingFromGroup( target );\r\n\r\n const groupNodeIds = [];\r\n\r\n for ( let dom of ( this._getAllDOMNodes( true, target ) as HTMLElement[] ) )\r\n {\r\n const x = parseFloat( dom.style.left );\r\n const y = parseFloat( dom.style.top );\r\n const node_bb = new BoundingBox( new vec2( x, y ), new vec2( dom.offsetWidth - 6, dom.offsetHeight - 6 ) );\r\n\r\n if ( !group_bb.inside( node_bb ) )\r\n {\r\n continue;\r\n }\r\n\r\n groupNodeIds.push( dom.dataset['id'] ?? dom );\r\n }\r\n\r\n target.nodes = groupNodeIds;\r\n }\r\n\r\n _selectNode( dom: HTMLElement, multiSelection: boolean = false, forceOrder: boolean = true )\r\n {\r\n if ( !multiSelection )\r\n {\r\n this.unSelectAll( true );\r\n }\r\n\r\n dom.classList.add( 'selected' );\r\n\r\n const id = dom.dataset['id'] as string;\r\n\r\n this.selectedNodes.push( id );\r\n\r\n if ( forceOrder )\r\n {\r\n // Reorder nodes to draw on top..\r\n this._domNodes.appendChild( dom );\r\n }\r\n\r\n const node = this.nodes[id].data;\r\n\r\n this.propertiesDialog.setTitle( node.title );\r\n\r\n var panel = this.propertiesDialog.panel;\r\n panel.clear();\r\n\r\n // Add description\r\n if ( node.constructor.description )\r\n {\r\n panel.addText( null, node.constructor.description, null, { disabled: true } );\r\n }\r\n\r\n // Allow change name if input\r\n if ( node.constructor.category == 'inputs' )\r\n {\r\n panel.addText( 'Name', node.title, ( v: string ) => {\r\n node.title = v;\r\n const header: any = dom.querySelector( '.lexgraphnodeheader' );\r\n header.innerText = v;\r\n } );\r\n }\r\n\r\n for ( let p of node.properties )\r\n {\r\n switch ( p.type )\r\n {\r\n case 'float':\r\n case 'int':\r\n panel.addNumber( p.name, p.value, ( v: number ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'string':\r\n panel.addText( p.name, p.value, ( v: string ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'vec2':\r\n panel.addVector2( p.name, p.value, ( v: number[] ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'vec3':\r\n panel.addVector3( p.name, p.value, ( v: number[] ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'vec4':\r\n panel.addVector4( p.name, p.value, ( v: number[] ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'select':\r\n panel.addSelect( p.name, p.options, p.value, ( v: any ) => {\r\n p.value = v;\r\n } );\r\n break;\r\n case 'array':\r\n panel.addArray( p.name, p.value, ( v: any[] ) => {\r\n p.value = v;\r\n if ( node.type == 'function/Input' )\r\n {\r\n node.setOutputs( v );\r\n this._updateNodeDOMIOs( dom, node );\r\n }\r\n }, { innerValues: p.options } );\r\n break;\r\n }\r\n }\r\n\r\n this._togglePropertiesDialog( true );\r\n }\r\n\r\n _unSelectNode( dom: HTMLElement )\r\n {\r\n dom.classList.remove( 'selected' );\r\n\r\n // Delete from selected..\r\n const idx = this.selectedNodes.indexOf( dom.dataset['id'] );\r\n this.selectedNodes.splice( idx, 1 );\r\n\r\n if ( !this.selectedNodes.length )\r\n {\r\n this._togglePropertiesDialog( false );\r\n }\r\n }\r\n\r\n _translateNode( dom: any, deltaTranslation: typeof vec2, updateBasePosition: boolean = true )\r\n {\r\n const translation = deltaTranslation.add(\r\n new vec2( parseFloat( dom.style.left ), parseFloat( dom.style.top ) )\r\n );\r\n\r\n if ( this._snapToGrid && dom.mustSnap )\r\n {\r\n const snapSize = this._patternSize.x * this._snapValue * this._snapValue;\r\n translation.x = Math.floor( translation.x / snapSize ) * snapSize;\r\n translation.y = Math.floor( translation.y / snapSize ) * snapSize;\r\n dom.mustSnap = false;\r\n }\r\n\r\n dom.style.left = ( translation.x ) + 'px';\r\n dom.style.top = ( translation.y ) + 'px';\r\n\r\n // Update base node position..\r\n if ( updateBasePosition && dom.dataset['id'] )\r\n {\r\n let baseNode = this.nodes[dom.dataset['id']];\r\n baseNode.data.position = translation;\r\n }\r\n }\r\n\r\n _deleteNode( nodeId: string )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const nodeInfo = this.nodes[nodeId];\r\n const node = nodeInfo.data;\r\n const el = nodeInfo.dom;\r\n\r\n console.assert( el );\r\n\r\n if ( node.constructor.blockDelete )\r\n {\r\n console.warn( `Can't delete node!` );\r\n return;\r\n }\r\n\r\n LX.deleteElement( el );\r\n\r\n // Delete from the editor\r\n\r\n delete this.nodes[nodeId];\r\n\r\n // Delete from the graph data\r\n\r\n const idx = this.currentGraph.nodes.findIndex( ( v ) => v.id === nodeId );\r\n console.assert( idx >= 0 );\r\n this.currentGraph.nodes.splice( idx, 1 );\r\n\r\n // Delete connected links..\r\n\r\n for ( let key in this.currentGraph.links )\r\n {\r\n if ( !key.includes( nodeId ) )\r\n {\r\n continue;\r\n }\r\n\r\n const aIdx = key.indexOf( '@' );\r\n const targetIsInput = key.substring( aIdx + 1 ) != nodeId;\r\n\r\n // Remove the connection from the other before deleting..\r\n\r\n const numLinks = this.currentGraph.links[key].length;\r\n\r\n for ( var i = 0; i < numLinks; ++i )\r\n {\r\n var link = this.currentGraph.links[key][i];\r\n\r\n LX.deleteElement( link.path.parentElement );\r\n\r\n const targetNodeId = targetIsInput ? link.inputNode : link.outputNode;\r\n\r\n const targetNodeDOM = this._getNodeDOMElement( targetNodeId );\r\n const ios = targetNodeDOM.querySelector(\r\n targetIsInput ? '.lexgraphnodeinputs' : '.lexgraphnodeoutputs'\r\n );\r\n const io = ios.childNodes[targetIsInput ? link.inputIdx : link.outputIdx];\r\n\r\n const ioIndex = targetIsInput ? link.outputIdx : link.inputIdx;\r\n const nodelinkidx = io.links[ioIndex].indexOf( nodeId );\r\n io.links[ioIndex].splice( nodelinkidx, 1 );\r\n\r\n // Unique link, so it's done..\r\n if ( targetIsInput )\r\n {\r\n delete io.dataset['active'];\r\n }\r\n // Check if any link left in case of output\r\n else\r\n {\r\n var active = false;\r\n for ( var links of io.links )\r\n {\r\n if ( !links )\r\n {\r\n continue;\r\n }\r\n for ( var j of links )\r\n {\r\n active = active || ( !!j );\r\n }\r\n }\r\n if ( !active )\r\n {\r\n delete io.dataset['active'];\r\n }\r\n }\r\n }\r\n\r\n delete this.currentGraph.links[key];\r\n }\r\n }\r\n\r\n _deleteGroup( groupId: string )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const dom = this.groups[groupId];\r\n LX.deleteElement( dom );\r\n\r\n // Delete from the editor\r\n\r\n delete this.groups[groupId];\r\n\r\n // Delete from the graph data\r\n\r\n const idx = this.currentGraph.groups.findIndex( ( v ) => v.id === groupId );\r\n console.assert( idx >= 0 );\r\n this.currentGraph.groups.splice( idx, 1 );\r\n }\r\n\r\n _cloneNode( nodeId: string, graphId?: string, position?: typeof vec2 )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const graph = this.graphs[graphId ?? this.currentGraph.id];\r\n\r\n const nodeData = graph.getNodeById( nodeId );\r\n\r\n if ( !nodeData )\r\n {\r\n return;\r\n }\r\n\r\n const el = this._getNodeDOMElement( nodeId );\r\n const newNode = GraphEditor.addNode( nodeData.type );\r\n newNode.properties = LX.deepCopy( nodeData.properties );\r\n\r\n const newDom = this._createNodeDOM( newNode );\r\n\r\n this._translateNode( newDom, position ?? this._getNodePosition( el ) );\r\n\r\n this._selectNode( newDom, true );\r\n\r\n this.currentGraph.nodes.push( newNode );\r\n }\r\n\r\n _cloneNodes()\r\n {\r\n // Clone all selected nodes\r\n const selectedIds = LX.deepCopy( this.selectedNodes );\r\n\r\n this.unSelectAll();\r\n\r\n for ( let nodeId of selectedIds )\r\n {\r\n this._cloneNode( nodeId );\r\n }\r\n }\r\n\r\n // This is in pattern space!\r\n _getNodePosition( dom: HTMLElement )\r\n {\r\n return new vec2( parseFloat( dom.style.left ), parseFloat( dom.style.top ) );\r\n }\r\n\r\n _getNodeDOMElement( nodeId: string )\r\n {\r\n return this.nodes[nodeId] ? this.nodes[nodeId].dom : null;\r\n }\r\n\r\n _getLinks( nodeSrcId: string, nodeDstId: string )\r\n {\r\n const str = nodeSrcId + '@' + nodeDstId;\r\n return this.currentGraph?.links[str];\r\n }\r\n\r\n _deleteLinks( nodeId: string, io: any )\r\n {\r\n const isInput = io.classList.contains( 'ioinput' );\r\n const srcIndex = parseInt( io.dataset['index'] );\r\n\r\n if ( isInput )\r\n { // Only one \"link to output\" to delete\r\n let targetIndex: number = -1;\r\n\r\n const targets = io.links.filter( ( v: any, i: number ) => {\r\n targetIndex = i;\r\n return v !== undefined;\r\n } )[0];\r\n const targetId = targets[0];\r\n\r\n // It has been deleted..\r\n if ( !targetId )\r\n {\r\n return;\r\n }\r\n\r\n var links = this._getLinks( targetId, nodeId );\r\n\r\n var linkIdx = links.findIndex( ( i: any ) => ( i.inputIdx == srcIndex && i.outputIdx == targetIndex ) );\r\n LX.deleteElement( links[linkIdx].path.parentElement );\r\n links.splice( linkIdx, 1 );\r\n\r\n // Input has no longer any connected link\r\n\r\n delete io.links;\r\n delete io.dataset['active'];\r\n\r\n // Remove a connection from the target connections\r\n\r\n const targetDOM = this._getNodeDOMElement( targetId );\r\n const ios = targetDOM.querySelector( '.lexgraphnodeoutputs' );\r\n const targetIO = ios.childNodes[targetIndex];\r\n\r\n const idx = targetIO.links[srcIndex].findIndex( ( v: any ) => v == nodeId );\r\n targetIO.links[srcIndex].splice( idx, 1 );\r\n\r\n let active = false;\r\n\r\n for ( var ls of targetIO.links )\r\n {\r\n if ( !ls ) continue;\r\n // Check links left per io\r\n active = active || ls.reduce( ( c: any ) => c !== undefined, 0 );\r\n }\r\n\r\n if ( !active )\r\n {\r\n delete targetIO.links;\r\n delete targetIO.dataset['active'];\r\n }\r\n }\r\n // Delete ALL \"to input links\"\r\n else\r\n {\r\n const numLinks = io.links.length;\r\n\r\n for ( let targetIndex = 0; targetIndex < numLinks; ++targetIndex )\r\n {\r\n const targets = io.links[targetIndex];\r\n\r\n if ( !targets )\r\n {\r\n continue;\r\n }\r\n\r\n for ( let it = targets.length - 1; it >= 0; --it )\r\n {\r\n const targetId = targets[it];\r\n var links = this._getLinks( nodeId, targetId );\r\n\r\n var linkIdx = links.findIndex( (\r\n i: any\r\n ) => ( i.inputIdx == targetIndex && i.outputIdx == srcIndex ) );\r\n LX.deleteElement( links[linkIdx].path.parentElement );\r\n links.splice( linkIdx, 1 );\r\n\r\n // Remove a connection from the output connections\r\n\r\n io.links[targetIndex].splice( it, 1 );\r\n\r\n // Input has no longer any connected link\r\n\r\n const targetDOM = this._getNodeDOMElement( targetId );\r\n const ios = targetDOM.querySelector( '.lexgraphnodeinputs' );\r\n const targetIO = ios.childNodes[targetIndex];\r\n\r\n delete targetIO.links;\r\n delete targetIO.dataset['active'];\r\n }\r\n }\r\n\r\n delete io.links;\r\n delete io.dataset['active'];\r\n }\r\n }\r\n\r\n _processFocus( active: boolean = false )\r\n {\r\n this.isFocused = active;\r\n }\r\n\r\n _processKeyDown( e: KeyboardEvent )\r\n {\r\n // Prevent processing keys on inputs and others\r\n if ( document.activeElement != this.root )\r\n {\r\n return;\r\n }\r\n\r\n const detail: any = e.detail;\r\n var key = e.key ?? detail.key;\r\n\r\n switch ( key )\r\n {\r\n case 'Escape':\r\n this.unSelectAll();\r\n break;\r\n case 'Delete':\r\n case 'Backspace':\r\n e.preventDefault();\r\n this._deleteSelection( e );\r\n break;\r\n case 'g':\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._createGroup();\r\n }\r\n break;\r\n case 'y':\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._doRedo();\r\n }\r\n break;\r\n case 'z':\r\n if ( e.ctrlKey )\r\n {\r\n e.preventDefault();\r\n this._doUndo();\r\n }\r\n break;\r\n }\r\n\r\n this.keys[key] = true;\r\n }\r\n\r\n _processKeyUp( e: KeyboardEvent )\r\n {\r\n // Prevent processing keys on inputs and others\r\n if ( document.activeElement != this.root )\r\n {\r\n return;\r\n }\r\n\r\n const detail: any = e.detail;\r\n const key = e.key ?? detail.key;\r\n\r\n delete this.keys[key];\r\n }\r\n\r\n _processMouse( e: any )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const rect = this.root.getBoundingClientRect();\r\n\r\n this._mousePosition = new vec2( e.clientX - rect.x, e.clientY - rect.y );\r\n\r\n const snapPosition = new vec2( this._mousePosition.x, this._mousePosition.y );\r\n\r\n if ( this._snapToGrid )\r\n {\r\n const snapSize = this._patternSize.x * this._snapValue * this.currentGraph.scale;\r\n snapPosition.x = Math.floor( snapPosition.x / snapSize ) * snapSize;\r\n snapPosition.y = Math.floor( snapPosition.y / snapSize ) * snapSize;\r\n this._snappedDeltaMousePosition = snapPosition.sub( this._lastSnappedMousePosition );\r\n }\r\n\r\n this._deltaMousePosition = this._mousePosition.sub( this._lastMousePosition );\r\n\r\n if ( e.type == 'mousedown' )\r\n {\r\n this._lastMouseDown = LX.getTime();\r\n\r\n this._processMouseDown( e );\r\n }\r\n else if ( e.type == 'mouseup' )\r\n {\r\n if ( ( LX.getTime() - this._lastMouseDown ) < 200 )\r\n {\r\n this._processClick( e );\r\n }\r\n\r\n this._processMouseUp( e );\r\n }\r\n else if ( e.type == 'mousemove' )\r\n {\r\n this._processMouseMove( e );\r\n }\r\n else if ( e.type == 'click' )\r\n { // trick\r\n switch ( e.detail )\r\n {\r\n case LX.MOUSE_DOUBLE_CLICK:\r\n break;\r\n case LX.MOUSE_TRIPLE_CLICK:\r\n break;\r\n }\r\n }\r\n else if ( e.type == 'mousewheel' )\r\n {\r\n e.preventDefault();\r\n this._processWheel( e );\r\n }\r\n else if ( e.type == 'contextmenu' )\r\n {\r\n e.preventDefault();\r\n\r\n if ( ( LX.getTime() - this._lastMouseDown ) < 300 )\r\n {\r\n this._processContextMenu( e );\r\n }\r\n }\r\n else if ( e.type == 'mouseleave' )\r\n {\r\n if ( this._generatingLink )\r\n {\r\n this._processMouseUp( e );\r\n }\r\n }\r\n\r\n if ( this._snapToGrid )\r\n {\r\n this._lastSnappedMousePosition = snapPosition;\r\n }\r\n\r\n this._lastMousePosition = this._mousePosition;\r\n }\r\n\r\n _processClick( e: MouseEvent )\r\n {\r\n const target: any = e.target;\r\n if ( target.classList.contains( 'lexgraphnodes' ) || target.classList.contains( 'lexgraphgroup' ) )\r\n {\r\n this._processBackgroundClick( e );\r\n return;\r\n }\r\n }\r\n\r\n _processBackgroundClick( e: MouseEvent )\r\n {\r\n this.unSelectAll();\r\n }\r\n\r\n _processMouseDown( e: MouseEvent )\r\n {\r\n const target: any = e.target;\r\n\r\n // Don't box select over a node..\r\n if ( !target.classList.contains( 'lexgraphnode' ) && !target.classList.contains( 'lexgraphgroup' )\r\n && e.button == LX.MOUSE_LEFT_CLICK )\r\n {\r\n this._boxSelecting = this._mousePosition;\r\n this._boxSelectRemoving = e.altKey;\r\n }\r\n }\r\n\r\n _processMouseUp( e: MouseEvent )\r\n {\r\n // It the event reaches this, the link isn't valid..\r\n if ( this._generatingLink )\r\n {\r\n const linkInfo = Object.assign( {}, this._generatingLink );\r\n\r\n // Delete old link\r\n LX.deleteElement( this._generatingLink.path ? this._generatingLink.path.parentElement : null );\r\n delete this._generatingLink;\r\n\r\n // Open contextmenu to auto-connect something..\r\n this._processContextMenu( e, linkInfo );\r\n }\r\n else if ( this._boxSelecting )\r\n {\r\n if ( !e.ctrlKey && !e.altKey )\r\n {\r\n this.unSelectAll();\r\n }\r\n\r\n this._selectNodesInBox( this._boxSelecting, this._mousePosition, e.altKey );\r\n\r\n LX.deleteElement( this._currentBoxSelectionSVG );\r\n\r\n delete this._currentBoxSelectionSVG;\r\n delete this._boxSelecting;\r\n delete this._boxSelectRemoving;\r\n }\r\n }\r\n\r\n _processMouseMove( e: MouseEvent )\r\n {\r\n if ( !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const rightPressed = e.which == 3;\r\n\r\n if ( rightPressed )\r\n {\r\n this.currentGraph.translation.add( this._deltaMousePosition.div( this.currentGraph.scale ), this.currentGraph.translation );\r\n\r\n this._updatePattern();\r\n\r\n return;\r\n }\r\n else if ( this._generatingLink )\r\n {\r\n this._updatePreviewLink( e );\r\n\r\n return;\r\n }\r\n else if ( this._boxSelecting )\r\n {\r\n this._drawBoxSelection( e );\r\n\r\n return;\r\n }\r\n }\r\n\r\n _processWheel( e: WheelEvent )\r\n {\r\n if ( this._boxSelecting || !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n // Compute zoom center in pattern space using current scale\r\n\r\n const rect = this.root.getBoundingClientRect();\r\n const zoomCenter = this._mousePosition ?? new vec2( rect.width * 0.5, rect.height * 0.5 );\r\n\r\n const center = this._getPatternPosition( zoomCenter );\r\n\r\n const delta = e.deltaY;\r\n\r\n if ( delta > 0.0 ) this.currentGraph.scale *= 0.9;\r\n else this.currentGraph.scale *= 1.0 / 0.9;\r\n\r\n this.currentGraph.scale = LX.clamp( this.currentGraph.scale, GraphEditor.MIN_SCALE, GraphEditor.MAX_SCALE );\r\n\r\n // Compute zoom center in pattern space using new scale\r\n // and get delta..\r\n\r\n const newCenter = this._getPatternPosition( zoomCenter );\r\n\r\n const deltaCenter = newCenter.sub( center );\r\n\r\n this.currentGraph.translation.add( deltaCenter, this.currentGraph.translation );\r\n\r\n this._updatePattern();\r\n }\r\n\r\n _processContextMenu( e: any, autoConnect?: any )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n LX.addContextMenu( null, e, ( m: typeof ContextMenu ) => {\r\n var eventPosition: any = null;\r\n\r\n if ( e )\r\n {\r\n const rect = this.root.getBoundingClientRect();\r\n\r\n const localPosition = new vec2( e.clientX - rect.x, e.clientY - rect.y );\r\n\r\n eventPosition = this._getPatternPosition( localPosition );\r\n }\r\n\r\n if ( this._clipboardData )\r\n {\r\n m.add( 'Paste', () => {\r\n const nodeId = this._clipboardData.id;\r\n const graphId = this._clipboardData.gid;\r\n\r\n this._cloneNode( nodeId, graphId, eventPosition );\r\n } );\r\n m.add( '' );\r\n }\r\n\r\n for ( let type in GraphEditor.NODE_TYPES )\r\n {\r\n const baseClass: any = GraphEditor.NODE_TYPES[type];\r\n\r\n if ( baseClass.blockAdd )\r\n {\r\n continue;\r\n }\r\n\r\n m.add( type, () => {\r\n const newNode = GraphEditor.addNode( type );\r\n\r\n const dom: any = this._createNodeDOM( newNode );\r\n\r\n if ( this._snapToGrid )\r\n {\r\n dom.mustSnap = true;\r\n }\r\n\r\n if ( eventPosition )\r\n {\r\n this._translateNode( dom, eventPosition );\r\n }\r\n\r\n this.currentGraph?.nodes.push( newNode );\r\n\r\n if ( autoConnect && newNode.inputs.length )\r\n {\r\n const srcId = autoConnect.domEl.dataset['id'];\r\n const srcType = autoConnect.io.childNodes[autoConnect.index].dataset['type'];\r\n const srcIsInput = autoConnect.ioType == GraphEditor.NODE_IO_INPUT;\r\n\r\n const newLink = {\r\n inputNode: srcIsInput ? srcId : newNode.id,\r\n inputIdx: srcIsInput ? autoConnect.index : 0,\r\n inputType: srcIsInput ? srcType : newNode.inputs[0].type,\r\n outputNode: srcIsInput ? newNode.id : srcId,\r\n outputIdx: srcIsInput ? 0 : autoConnect.index,\r\n outputType: srcIsInput ? newNode.inputs[0].type : srcType\r\n };\r\n\r\n // Store link\r\n\r\n const pathId = newLink.outputNode + '@' + newLink.inputNode;\r\n\r\n if ( !this.currentGraph?.links[pathId] ) this.currentGraph!.links[pathId] = [];\r\n\r\n this.currentGraph?.links[pathId].push( newLink );\r\n\r\n this._createLink( newLink );\r\n }\r\n } );\r\n }\r\n } );\r\n }\r\n\r\n /**\r\n * @method start\r\n */\r\n\r\n start()\r\n {\r\n this.mustStop = false;\r\n this.state = GraphEditor.RUNNING;\r\n\r\n this.propagateEventToAllNodes( 'onStart' );\r\n\r\n requestAnimationFrame( this._frame.bind( this ) );\r\n }\r\n\r\n /**\r\n * @method stop\r\n */\r\n\r\n stop()\r\n {\r\n this.mustStop = true;\r\n this.state = GraphEditor.STOPPED;\r\n\r\n this.propagateEventToAllNodes( 'onStop' );\r\n }\r\n\r\n /**\r\n * @method _frame\r\n */\r\n\r\n _frame()\r\n {\r\n if ( this.mustStop || !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n requestAnimationFrame( this._frame.bind( this ) );\r\n\r\n // Only run here main graph!\r\n this.currentGraph._runStep( this.main );\r\n }\r\n\r\n _generatePattern()\r\n {\r\n // Generate pattern\r\n {\r\n var pattern = document.createElementNS( 'http://www.w3.org/2000/svg', 'pattern' );\r\n pattern.setAttribute( 'id', 'pattern-0' );\r\n pattern.setAttribute( 'x', `${0.0}` );\r\n pattern.setAttribute( 'y', `${0.0}` );\r\n pattern.setAttribute( 'width', this._patternSize.x.toString() );\r\n pattern.setAttribute( 'height', this._patternSize.y.toString() );\r\n pattern.setAttribute( 'patternUnits', 'userSpaceOnUse' );\r\n\r\n var circle = document.createElementNS( 'http://www.w3.org/2000/svg', 'circle' );\r\n circle.setAttribute( 'cx', this._circlePatternSize.toString() );\r\n circle.setAttribute( 'cy', this._circlePatternSize.toString() );\r\n circle.setAttribute( 'r', this._circlePatternSize.toString() );\r\n circle.setAttribute( 'fill', this._circlePatternColor );\r\n\r\n pattern.appendChild( circle );\r\n }\r\n\r\n var svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'background-svg' );\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n svg.style.stroke = 'none';\r\n\r\n svg.appendChild( pattern );\r\n\r\n var rect = document.createElementNS( 'http://www.w3.org/2000/svg', 'rect' );\r\n rect.setAttribute( 'x', '0' );\r\n rect.setAttribute( 'y', '0' );\r\n rect.setAttribute( 'width', '100%' );\r\n rect.setAttribute( 'height', '100%' );\r\n rect.setAttribute( 'fill', 'url(#pattern-0)' );\r\n\r\n svg.appendChild( rect );\r\n\r\n this._background = svg;\r\n\r\n this.root.appendChild( this._background );\r\n }\r\n\r\n _updatePattern()\r\n {\r\n if ( !this._background || !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const patternSize = this._patternSize.mul( this.currentGraph.scale );\r\n const circlePatternSize = this._circlePatternSize * this.currentGraph.scale;\r\n const patternPosition = this.currentGraph.translation.mul( this.currentGraph.scale );\r\n\r\n let pattern = this._background.querySelector( 'pattern' )!;\r\n pattern.setAttribute( 'x', patternPosition.x.toString() );\r\n pattern.setAttribute( 'y', patternPosition.y.toString() );\r\n pattern.setAttribute( 'width', patternSize.x.toString() );\r\n pattern.setAttribute( 'height', patternSize.y.toString() );\r\n\r\n var circle = this._background.querySelector( 'circle' )!;\r\n circle.setAttribute( 'cx', circlePatternSize.toString() );\r\n circle.setAttribute( 'cy', circlePatternSize.toString() );\r\n circle.setAttribute( 'r', circlePatternSize.toString() );\r\n\r\n // Nodes\r\n\r\n const w = this._domNodes.offsetWidth * 0.5;\r\n const h = this._domNodes.offsetHeight * 0.5;\r\n\r\n const dw = w - w * this.currentGraph.scale;\r\n const dh = h - h * this.currentGraph.scale;\r\n\r\n this._domNodes.style.transform = `\r\n translate(` + ( patternPosition.x - dw ) + `px, ` + ( patternPosition.y - dh ) + `px)\r\n scale(` + this.currentGraph.scale + `)\r\n `;\r\n this._domLinks.style.transform = this._domNodes.style.transform;\r\n\r\n // Hide nodes outside the viewport\r\n\r\n const nodesOutsideViewport = this._getNonVisibleNodes();\r\n\r\n for ( let node of nodesOutsideViewport )\r\n {\r\n let dom = this._getNodeDOMElement( node.id );\r\n dom.classList.toggle( 'hidden-opacity', true );\r\n }\r\n }\r\n\r\n _getPatternPosition( renderPosition: typeof vec2 )\r\n {\r\n if ( !this.currentGraph ) return;\r\n return renderPosition.div( this.currentGraph.scale ).sub( this.currentGraph.translation );\r\n }\r\n\r\n _getRenderPosition( patternPosition: typeof vec2 )\r\n {\r\n if ( !this.currentGraph ) return;\r\n return patternPosition.add( this.currentGraph.translation ).mul( this.currentGraph.scale );\r\n }\r\n\r\n _onLink( e: any )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const linkData = this._generatingLink;\r\n const ioType = e.target.classList.contains( 'input' ) ? GraphEditor.NODE_IO_INPUT : GraphEditor.NODE_IO_OUTPUT;\r\n\r\n // Discard same IO type\r\n if ( linkData.ioType == ioType )\r\n {\r\n console.warn( `Can't link same type of data` );\r\n return;\r\n }\r\n\r\n // Info about src node\r\n const src_nodeContainer = linkData.domEl;\r\n const src_nodeId = src_nodeContainer.dataset['id'];\r\n const src_node = this.nodes[src_nodeId].data;\r\n const src_ioIndex = this._generatingLink.index;\r\n\r\n // Info about dst node\r\n const dst_nodeContainer = e.target.offsetParent;\r\n const dst_nodeId = dst_nodeContainer.dataset['id'];\r\n const dst_node = this.nodes[dst_nodeId].data;\r\n const dst_ioIndex = parseInt( e.target.parentElement.dataset['index'] );\r\n\r\n // Discard different types\r\n const srcIsInput = linkData.ioType == GraphEditor.NODE_IO_INPUT;\r\n const src_ios = src_node[srcIsInput ? 'inputs' : 'outputs'];\r\n const src_ioType = src_ios[src_ioIndex].type;\r\n\r\n const dst_ios = dst_node[ioType == GraphEditor.NODE_IO_INPUT ? 'inputs' : 'outputs'];\r\n const dst_ioType = dst_ios[dst_ioIndex].type;\r\n\r\n if ( src_ioType != dst_ioType && src_ioType != 'any' && dst_ioType != 'any' )\r\n {\r\n // Different types, but it might be possible to cast types\r\n\r\n const inputType = srcIsInput ? src_ioType : dst_ioType;\r\n const outputType = srcIsInput ? dst_ioType : src_ioType;\r\n\r\n if ( !this.supportedCastTypes[outputType + '@' + inputType] )\r\n {\r\n console.warn( `Can't link ${src_ioType} to ${dst_ioType}.` );\r\n return;\r\n }\r\n }\r\n\r\n // Check if target it's an active input and remove the old link\r\n\r\n if ( ioType == GraphEditor.NODE_IO_INPUT && e.target.parentElement.dataset['active'] )\r\n {\r\n this._deleteLinks( dst_nodeId, e.target.parentElement );\r\n }\r\n // Check if source it's an active input and remove the old link\r\n\r\n else if ( linkData.ioType == GraphEditor.NODE_IO_INPUT && linkData.io.dataset['active'] )\r\n {\r\n this._deleteLinks( src_nodeId, linkData.io );\r\n }\r\n\r\n // Store the end io..\r\n\r\n var srcDom = linkData.io;\r\n srcDom.links = srcDom.links ?? [];\r\n srcDom.links[dst_ioIndex] = srcDom.links[dst_ioIndex] ?? [];\r\n srcDom.links[dst_ioIndex].push( dst_nodeId );\r\n\r\n var dstDom = e.target.parentElement;\r\n dstDom.links = dstDom.links ?? [];\r\n dstDom.links[src_ioIndex] = dstDom.links[src_ioIndex] ?? [];\r\n dstDom.links[src_ioIndex].push( src_nodeId );\r\n\r\n // Call this using the io target to set the connection to the center of the input DOM element..\r\n\r\n let path = this._updatePreviewLink( null, e.target.parentElement );\r\n\r\n // Store link\r\n\r\n const pathId = ( srcIsInput ? dst_nodeId : src_nodeId ) + '@' + ( srcIsInput ? src_nodeId : dst_nodeId );\r\n\r\n if ( !this.currentGraph.links[pathId] ) this.currentGraph.links[pathId] = [];\r\n\r\n this.currentGraph.links[pathId].push( {\r\n path: path,\r\n inputNode: srcIsInput ? src_nodeId : dst_nodeId,\r\n inputIdx: srcIsInput ? src_ioIndex : dst_ioIndex,\r\n inputType: srcIsInput ? src_ioType : dst_ioType,\r\n outputNode: srcIsInput ? dst_nodeId : src_nodeId,\r\n outputIdx: srcIsInput ? dst_ioIndex : src_ioIndex,\r\n outputType: srcIsInput ? dst_ioType : src_ioType\r\n } );\r\n\r\n path.dataset['id'] = pathId;\r\n\r\n // Mark as active links...\r\n\r\n linkData.io.dataset['active'] = true;\r\n e.target.parentElement.dataset['active'] = true;\r\n\r\n // Successful link..\r\n return true;\r\n }\r\n\r\n _updatePreviewLink( e: any, endIO?: any )\r\n {\r\n var path = this._generatingLink.path;\r\n\r\n if ( !path )\r\n {\r\n var svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'link-svg' );\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n this._domLinks.appendChild( svg );\r\n\r\n path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\r\n path.setAttribute( 'fill', 'none' );\r\n svg.appendChild( path );\r\n this._generatingLink.path = path;\r\n }\r\n\r\n // Generate bezier curve\r\n\r\n const index = this._generatingLink.index;\r\n const type = this._generatingLink.ioType;\r\n const domEl = this._generatingLink.domEl;\r\n\r\n const offsetX = this.root.getBoundingClientRect().x;\r\n const offsetY = this.root.getBoundingClientRect().y;\r\n\r\n const ios = domEl.querySelector(\r\n type == GraphEditor.NODE_IO_INPUT ? '.lexgraphnodeinputs' : '.lexgraphnodeoutputs'\r\n );\r\n const ioEl = ios.childNodes[index].querySelector( '.io__type' );\r\n const startRect = ioEl.getBoundingClientRect();\r\n\r\n let startPos = new vec2( startRect.x - offsetX, startRect.y - offsetY );\r\n let endPos = null;\r\n let endioEl = null;\r\n\r\n if ( e )\r\n {\r\n endPos = new vec2( e.offsetX, e.offsetY );\r\n\r\n // Add node position, since I can't get the correct position directly from the event..\r\n if ( LX.hasClass( e.target, [ 'lexgraphnode', 'lexgraphgroup' ] ) )\r\n {\r\n endPos.add( this._getNodePosition( e.target ), endPos );\r\n endPos.add( new vec2( 3, 3 ), endPos );\r\n }\r\n else if ( LX.hasClass( e.target, [ 'io__type', 'lexgraphgroupresizer' ] ) )\r\n {\r\n var parent = e.target.offsetParent;\r\n // Add parent offset\r\n endPos.add( this._getNodePosition( parent ), endPos );\r\n // Add own offset\r\n endPos.add( new vec2( e.target.offsetLeft, e.target.offsetTop ), endPos );\r\n endPos.add( new vec2( 3, 3 ), endPos );\r\n }\r\n\r\n endPos = this._getRenderPosition( endPos );\r\n }\r\n else\r\n {\r\n endioEl = endIO.querySelector( '.io__type' );\r\n const ioRect = endioEl.getBoundingClientRect();\r\n endPos = new vec2( ioRect.x - offsetX, ioRect.y - offsetY );\r\n }\r\n\r\n if ( type == GraphEditor.NODE_IO_INPUT )\r\n {\r\n var tmp = endPos;\r\n endPos = startPos;\r\n startPos = tmp;\r\n }\r\n\r\n let color = getComputedStyle( ioEl ).backgroundColor;\r\n\r\n if ( type == GraphEditor.NODE_IO_OUTPUT && endioEl )\r\n {\r\n color = getComputedStyle( endioEl ).backgroundColor;\r\n }\r\n\r\n this._createLinkPath( path, startPos, endPos, color, !!e );\r\n\r\n return path;\r\n }\r\n\r\n _createLink( link: any )\r\n {\r\n var svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'link-svg' );\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n this._domLinks.appendChild( svg );\r\n\r\n var path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\r\n path.setAttribute( 'fill', 'none' );\r\n svg.appendChild( path );\r\n\r\n const inputNodeDom = this._getNodeDOMElement( link.inputNode );\r\n const outputNodeDom = this._getNodeDOMElement( link.outputNode );\r\n\r\n // Start pos\r\n\r\n const offsetX = this.root.getBoundingClientRect().x;\r\n const offsetY = this.root.getBoundingClientRect().y;\r\n\r\n const outputs = outputNodeDom.querySelector( '.lexgraphnodeoutputs' );\r\n const io0 = outputs.childNodes[link.outputIdx];\r\n const startRect = io0.querySelector( '.io__type' ).getBoundingClientRect();\r\n\r\n let startPos = new vec2( startRect.x - offsetX, startRect.y - offsetY + 6 );\r\n\r\n // End pos\r\n\r\n const inputs = inputNodeDom.querySelector( '.lexgraphnodeinputs' );\r\n const io1 = inputs.childNodes[link.inputIdx];\r\n const endRect = io1.querySelector( '.io__type' ).getBoundingClientRect();\r\n\r\n let endPos = new vec2( endRect.x - offsetX, endRect.y - offsetY + 6 );\r\n\r\n // Generate bezier curve\r\n\r\n const color = getComputedStyle( io1.querySelector( '.io__type' ) ).backgroundColor;\r\n this._createLinkPath( path, startPos, endPos, color );\r\n\r\n link.path = path;\r\n\r\n // Store data in each IO\r\n\r\n io0.links = [];\r\n io0.links[link.inputIdx] = io0.links[link.inputIdx] ?? [];\r\n io0.links[link.inputIdx].push( link.inputNode );\r\n\r\n io1.links = [];\r\n io1.links[link.outputIdx] = io1.links[link.outputIdx] ?? [];\r\n io1.links[link.outputIdx].push( link.outputNode );\r\n\r\n io0.dataset['active'] = true;\r\n io1.dataset['active'] = true;\r\n }\r\n\r\n _createLinkPath( path: any, startPos: typeof vec2, endPos: typeof vec2, color?: any, exactEnd: boolean = false )\r\n {\r\n if ( !this.currentGraph )\r\n {\r\n return;\r\n }\r\n\r\n const dist = 6 * this.currentGraph.scale;\r\n startPos.add( new vec2( dist, dist ), startPos );\r\n\r\n if ( !exactEnd )\r\n {\r\n endPos.add( new vec2( dist, dist ), endPos );\r\n }\r\n\r\n startPos = this._getPatternPosition( startPos );\r\n endPos = this._getPatternPosition( endPos );\r\n\r\n const distanceX = LX.clamp( Math.abs( startPos.x - endPos.x ), 0.0, 256.0 );\r\n const cPDistance = 128.0 * Math.pow( distanceX / 256.0, 0.5 );\r\n\r\n let cPoint1 = startPos.add( new vec2( cPDistance, 0 ) );\r\n let cPoint2 = endPos.sub( new vec2( cPDistance, 0 ) );\r\n\r\n path.setAttribute( 'd', `\r\n M ${startPos.x},${startPos.y}\r\n C ${cPoint1.x},${cPoint1.y} ${cPoint2.x},${cPoint2.y} ${endPos.x},${endPos.y}\r\n ` );\r\n\r\n path.parentElement.style.color = color;\r\n }\r\n\r\n _updateNodeLinks( nodeId: string )\r\n {\r\n var node = this.nodes[nodeId] ? this.nodes[nodeId].data : null;\r\n\r\n if ( !node )\r\n {\r\n console.warn( `Can't finde node [${nodeId}]` );\r\n return;\r\n }\r\n\r\n const nodeDOM = this._getNodeDOMElement( nodeId );\r\n\r\n // Update input links\r\n\r\n for ( let input of nodeDOM.querySelectorAll( '.ioinput' ) )\r\n {\r\n if ( !input.links )\r\n {\r\n continue;\r\n }\r\n\r\n // Get first and only target output..\r\n const targets = input.links.filter( ( v: any ) => v !== undefined )[0];\r\n const targetNodeId = targets[0];\r\n\r\n // It has been deleted..\r\n if ( !targetNodeId )\r\n {\r\n continue;\r\n }\r\n\r\n const ioIndex = parseInt( input.dataset['index'] );\r\n\r\n var links = this._getLinks( targetNodeId, nodeId );\r\n\r\n // Inputs only have 1 possible output connected\r\n var link = links.find( ( i: any ) => ( i.inputIdx == ioIndex ) );\r\n\r\n this._generatingLink = {\r\n index: ioIndex,\r\n io: input,\r\n ioType: GraphEditor.NODE_IO_INPUT,\r\n domEl: nodeDOM,\r\n path: link.path\r\n };\r\n\r\n // Get end io\r\n\r\n const outputNode = this._getNodeDOMElement( targetNodeId );\r\n const io = outputNode.querySelector( '.lexgraphnodeoutputs' ).childNodes[link.outputIdx];\r\n\r\n this._updatePreviewLink( null, io );\r\n }\r\n\r\n // Update output links\r\n\r\n for ( let output of nodeDOM.querySelectorAll( '.iooutput' ) )\r\n {\r\n if ( !output.links )\r\n {\r\n continue;\r\n }\r\n\r\n const srcIndex = parseInt( output.dataset['index'] );\r\n\r\n for ( let targetIndex = 0; targetIndex < output.links.length; ++targetIndex )\r\n {\r\n const targets = output.links[targetIndex];\r\n\r\n if ( !targets )\r\n {\r\n continue;\r\n }\r\n\r\n for ( let targetId of targets )\r\n {\r\n var links = this._getLinks( nodeId, targetId );\r\n var link = links.find( ( i: any ) => ( i.inputIdx == targetIndex && i.outputIdx == srcIndex ) );\r\n\r\n // Outputs can have different inputs connected\r\n this._generatingLink = {\r\n index: link.outputIdx,\r\n io: output,\r\n ioType: GraphEditor.NODE_IO_OUTPUT,\r\n domEl: nodeDOM,\r\n path: link.path\r\n };\r\n\r\n // Get end io\r\n\r\n const inputNode = this._getNodeDOMElement( targetId );\r\n const io = inputNode.querySelector( '.lexgraphnodeinputs' ).childNodes[link.inputIdx];\r\n\r\n this._updatePreviewLink( null, io );\r\n }\r\n }\r\n }\r\n\r\n delete this._generatingLink;\r\n }\r\n\r\n _drawBoxSelection( e: MouseEvent )\r\n {\r\n var svg = this._currentBoxSelectionSVG;\r\n\r\n if ( !svg )\r\n {\r\n var svg: SVGSVGElement | undefined = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\r\n svg.classList.add( 'box-selection-svg' );\r\n if ( this._boxSelectRemoving )\r\n {\r\n svg.classList.add( 'removing' );\r\n }\r\n svg.style.width = '100%';\r\n svg.style.height = '100%';\r\n this._domLinks.appendChild( svg );\r\n this._currentBoxSelectionSVG = svg;\r\n }\r\n\r\n // Generate box\r\n\r\n let startPos = this._getPatternPosition( this._boxSelecting );\r\n let size = this._getPatternPosition( this._mousePosition ).sub( startPos );\r\n\r\n if ( size.x < 0 ) startPos.x += size.x;\r\n if ( size.y < 0 ) startPos.y += size.y;\r\n\r\n size = size.abs();\r\n\r\n svg.innerHTML = `<rect\r\n x=\"${startPos.x}\" y=\"${startPos.y}\"\r\n rx=\"${6}\" ry=\"${6}\"\r\n width=\"${size.x}\" height=\"${size.y}\"\r\n \"/>`;\r\n }\r\n\r\n _getNonVisibleNodes()\r\n {\r\n const nonVisibleNodes = [];\r\n\r\n if ( !this.currentGraph )\r\n {\r\n console.warn( 'No graph set' );\r\n return [];\r\n }\r\n\r\n const graph_bb = new BoundingBox( new vec2( 0, 0 ), new vec2( this.root.offsetWidth, this.root.offsetHeight ) );\r\n\r\n for ( let node of this.currentGraph.nodes )\r\n {\r\n let pos = this._getRenderPosition( node.position );\r\n let dom = this._getNodeDOMElement( node.id );\r\n if ( !dom )\r\n {\r\n continue;\r\n }\r\n\r\n const node_bb = new BoundingBox( pos, node.size.mul( this.currentGraph.scale ) );\r\n\r\n if ( graph_bb.inside( node_bb, false ) )\r\n {\r\n // Show if node in viewport..\r\n dom.classList.toggle( 'hidden-opacity', false );\r\n\r\n // And hide content if scale is very small..\r\n dom.childNodes[1].classList.toggle( 'hidden-opacity', this.currentGraph.scale < 0.5 );\r\n\r\n continue;\r\n }\r\n\r\n nonVisibleNodes.push( node );\r\n }\r\n\r\n return nonVisibleNodes;\r\n }\r\n\r\n _selectNodesInBox( lt: typeof vec2, rb: typeof vec2, remove: boolean = false )\r\n {\r\n lt = this._getPatternPosition( lt );\r\n rb = this._getPatternPosition( rb );\r\n\r\n let size = rb.sub( lt );\r\n\r\n if ( size.x < 0 )\r\n {\r\n var tmp = lt.x;\r\n lt.x = rb.x;\r\n rb.x = tmp;\r\n }\r\n\r\n if ( size.y < 0 )\r\n {\r\n var tmp = lt.y;\r\n lt.y = rb.y;\r\n rb.y = tmp;\r\n }\r\n\r\n const nodes = this._getAllDOMNodes() as HTMLElement[];\r\n for ( let nodeEl of nodes )\r\n {\r\n let pos = this._getNodePosition( nodeEl );\r\n let size = new vec2( nodeEl.offsetWidth, nodeEl.offsetHeight );\r\n\r\n if ( ( !( pos.x < lt.x && ( pos.x + size.x ) < lt.x ) && !( pos.x > rb.x && ( pos.x + size.x ) > rb.x ) )\r\n && ( !( pos.y < lt.y && ( pos.y + size.y ) < lt.y )\r\n && !( pos.y > rb.y && ( pos.y + size.y ) > rb.y ) ) )\r\n {\r\n if ( remove )\r\n {\r\n this._unSelectNode( nodeEl );\r\n }\r\n else\r\n {\r\n this._selectNode( nodeEl, true, false );\r\n }\r\n }\r\n }\r\n }\r\n\r\n _deleteSelection( e?: any )\r\n {\r\n const lastNodeCount = this._domNodes.childElementCount;\r\n\r\n for ( let nodeId of this.selectedNodes )\r\n {\r\n this._deleteNode( nodeId );\r\n }\r\n\r\n this.selectedNodes.length = 0;\r\n\r\n // We delete something, so add undo step..\r\n\r\n if ( this._domNodes.childElementCount != lastNodeCount )\r\n {\r\n this._addUndoStep();\r\n }\r\n }\r\n\r\n _getBoundingFromGroup( groupDOM: HTMLElement )\r\n {\r\n const x = parseFloat( groupDOM.style.left );\r\n const y = parseFloat( groupDOM.style.top );\r\n\r\n return new BoundingBox( new vec2( x, y ), new vec2( groupDOM.offsetWidth - 2, groupDOM.offsetHeight - 2 ) );\r\n }\r\n\r\n _getBoundingFromNodes( nodeIds: string[] )\r\n {\r\n let group_bb = null;\r\n\r\n for ( let nodeId of nodeIds )\r\n {\r\n const node = this.nodes[nodeId].data;\r\n const node_bb = new BoundingBox( node.position, node.size );\r\n\r\n if ( group_bb )\r\n {\r\n group_bb.merge( node_bb );\r\n }\r\n else\r\n {\r\n group_bb = node_bb;\r\n }\r\n }\r\n\r\n if ( group_bb )\r\n {\r\n // Add padding\r\n\r\n const groupContentPadding = 8;\r\n\r\n group_bb.origin.sub( new vec2( groupContentPadding ), group_bb.origin );\r\n group_bb.origin.sub( new vec2( groupContentPadding ), group_bb.origin );\r\n\r\n group_bb.size.add( new vec2( groupContentPadding * 2.0 ), group_bb.size );\r\n group_bb.size.add( new vec2( groupContentPadding * 2.0 ), group_bb.size );\r\n }\r\n\r\n return group_bb;\r\n }\r\n\r\n /**\r\n * @method _createGroup\r\n * @description Creates a node group from the bounding box of the selected nodes\r\n * @returns JSON data from the serialized graph\r\n */\r\n\r\n _createGroup( bb?: BoundingBox )\r\n {\r\n const group_bb: any = bb ?? this._getBoundingFromNodes( this.selectedNodes );\r\n if ( !group_bb )\r\n {\r\n return;\r\n }\r\n\r\n const group_id = group_bb.id ?? `group-${LX.guidGenerator()}`;\r\n\r\n let groupDOM = document.createElement( 'div' );\r\n groupDOM.id = group_id;\r\n groupDOM.classList.add( 'lexgraphgroup' );\r\n groupDOM.style.left = group_bb.origin.x + 'px';\r\n groupDOM.style.top = group_bb.origin.y + 'px';\r\n groupDOM.style.width = group_bb.size.x + 'px';\r\n groupDOM.style.height = group_bb.size.y + 'px';\r\n\r\n let groupResizer = document.createElement( 'div' );\r\n groupResizer.classList.add( 'lexgraphgroupresizer' );\r\n\r\n groupResizer.addEventListener( 'mousedown', inner_mousedown );\r\n\r\n this.groups[group_id] = groupDOM;\r\n\r\n var that = this;\r\n var lastPos = [ 0, 0 ];\r\n\r\n function inner_mousedown( e: MouseEvent )\r\n {\r\n var doc = that.root.ownerDocument;\r\n doc.addEventListener( 'mousemove', inner_mousemove );\r\n doc.addEventListener( 'mouseup', inner_mouseup );\r\n lastPos[0] = e.x;\r\n lastPos[1] = e.y;\r\n e.stopPropagation();\r\n e.preventDefault();\r\n document.body.classList.add( 'nocursor' );\r\n groupResizer.classList.add( 'nocursor' );\r\n }\r\n\r\n function inner_mousemove( e: MouseEvent )\r\n {\r\n let dt = new vec2( lastPos[0] - e.x, lastPos[1] - e.y );\r\n dt.div( that.currentGraph?.scale, dt );\r\n\r\n groupDOM.style.width = ( parseFloat( groupDOM.style.width ) - dt.x ) + 'px';\r\n groupDOM.style.height = ( parseFloat( groupDOM.style.height ) - dt.y ) + 'px';\r\n\r\n lastPos[0] = e.x;\r\n lastPos[1] = e.y;\r\n\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n\r\n function inner_mouseup( e: MouseEvent )\r\n {\r\n var doc = that.root.ownerDocument;\r\n doc.removeEventListener( 'mousemove', inner_mousemove );\r\n doc.removeEventListener( 'mouseup', inner_mouseup );\r\n document.body.classList.remove( 'nocursor' );\r\n groupResizer.classList.remove( 'nocursor' );\r\n }\r\n\r\n let groupTitle = document.createElement( 'input' );\r\n let defaultName = `Group ${GraphEditor.LAST_GROUP_ID}`;\r\n groupTitle.value = defaultName;\r\n groupTitle.classList.add( 'lexgraphgrouptitle' );\r\n groupTitle.disabled = true;\r\n\r\n // Dbl click to rename\r\n\r\n groupTitle.addEventListener( 'mousedown', ( e ) => {\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n } );\r\n\r\n groupTitle.addEventListener( 'focusout', ( e ) => {\r\n groupTitle.disabled = true;\r\n if ( !groupTitle.value.length )\r\n {\r\n groupTitle.value = defaultName;\r\n }\r\n } );\r\n\r\n groupTitle.addEventListener( 'keyup', ( e ) => {\r\n if ( e.key == 'Enter' )\r\n {\r\n groupTitle.blur();\r\n }\r\n else if ( e.key == 'Escape' )\r\n {\r\n groupTitle.value = '';\r\n groupTitle.blur();\r\n }\r\n } );\r\n\r\n groupDOM.addEventListener( 'dblclick', ( e ) => {\r\n // Only for left click..\r\n if ( e.button != LX.MOUSE_LEFT_CLICK )\r\n {\r\n return;\r\n }\r\n groupTitle.disabled = false;\r\n groupTitle.focus();\r\n } );\r\n\r\n groupDOM.addEventListener( 'contextmenu', ( e ) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n\r\n LX.addContextMenu( null, e, ( m: typeof ContextMenu ) => {\r\n m.add( 'Delete', () => {\r\n this._deleteGroup( group_id );\r\n } );\r\n } );\r\n } );\r\n\r\n groupDOM.appendChild( groupResizer );\r\n groupDOM.appendChild( groupTitle );\r\n\r\n this._domNodes.prepend( groupDOM );\r\n\r\n // Move group!!\r\n\r\n LX.makeDraggable( groupDOM, {\r\n onMove: this._onMoveGroup.bind( this ),\r\n onDragStart: this._onDragGroup.bind( this ),\r\n updateLayers: false\r\n } );\r\n\r\n GraphEditor.LAST_GROUP_ID++;\r\n\r\n return groupDOM;\r\n }\r\n\r\n _addUndoStep( deleteRedo = true )\r\n {\r\n if ( deleteRedo )\r\n {\r\n // Remove all redo steps\r\n this._redoSteps.length = 0;\r\n }\r\n\r\n this._undoSteps.push( {\r\n // TODO: Add graph state\r\n } );\r\n }\r\n\r\n _doUndo()\r\n {\r\n if ( !this._undoSteps.length )\r\n {\r\n return;\r\n }\r\n\r\n this._addRedoStep();\r\n\r\n // Extract info from the last state\r\n const step = this._undoSteps.pop();\r\n\r\n // Set old state\r\n // TODO\r\n\r\n console.log( 'Undo!!' );\r\n }\r\n\r\n _addRedoStep()\r\n {\r\n this._redoSteps.push( {\r\n // TODO: Add graph state\r\n } );\r\n }\r\n\r\n _doRedo()\r\n {\r\n if ( !this._redoSteps.length )\r\n {\r\n return;\r\n }\r\n\r\n this._addUndoStep( false );\r\n\r\n // Extract info from the next saved code state\r\n const step = this._redoSteps.pop();\r\n\r\n // Set old state\r\n // TODO\r\n\r\n console.log( 'Redo!!' );\r\n }\r\n\r\n _togglePropertiesDialog( force: boolean = false )\r\n {\r\n this.propertiesDialog.root.classList.toggle( 'opened', force );\r\n\r\n if ( !force )\r\n {\r\n this.propertiesDialog.panel.clear();\r\n }\r\n }\r\n\r\n _setSnappingValue( value: number )\r\n {\r\n this._snapValue = value;\r\n }\r\n\r\n _toggleSnapping()\r\n {\r\n this._snapToGrid = !this._snapToGrid;\r\n\r\n // Trigger position snapping for each node if needed\r\n\r\n if ( this._snapToGrid )\r\n {\r\n for ( let nodeDom of ( this._getAllDOMNodes( true ) as any[] ) )\r\n {\r\n nodeDom.mustSnap = true;\r\n }\r\n }\r\n }\r\n\r\n _onSidebarCreate( e: Event )\r\n {\r\n new LX.DropdownMenu( e.target, [\r\n { name: 'Create Graph', icon: 'Workflow', callback: () => this.addGraph() },\r\n { name: 'Create Function', icon: 'Function', callback: () => this.addGraphFunction() }\r\n ], { side: 'right', align: 'start' } );\r\n }\r\n\r\n _showRenameGraphDialog()\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const dialog = new LX.Dialog( this.currentGraph.constructor.name, ( p: typeof Panel ) => {\r\n p.addText( 'Name', this.currentGraph?.name, ( v: string ) => {\r\n this._updateGraphName( v );\r\n dialog.close();\r\n } );\r\n }, { modal: true, size: [ '350px', null ] } );\r\n }\r\n\r\n _updateGraphName( name: string )\r\n {\r\n if ( !this.currentGraph ) return;\r\n\r\n const newNameKey = name.replace( /\\s/g, '' ).replaceAll( '.', '' );\r\n\r\n // Change graph name button\r\n const nameDom = this._sidebar.root.querySelectorAll( '.lexsidebarheader span' )[1];\r\n console.assert( nameDom );\r\n nameDom.innerText = name;\r\n\r\n // Change name in sidebar\r\n const sidebarItem = this._sidebar.items.find( ( v: any ) => v.name === this.currentGraph?.name );\r\n if ( sidebarItem )\r\n {\r\n const oldName = sidebarItem.name;\r\n sidebarItem.name = name;\r\n sidebarItem.dom.id = newNameKey;\r\n sidebarItem.dom.innerHTML = sidebarItem.dom.innerHTML.replace( oldName, name );\r\n }\r\n\r\n // Change registered nodes function\r\n const oldType = 'function/' + this.currentGraph.name;\r\n const nodeClass = GraphEditor.NODE_TYPES[oldType];\r\n\r\n if ( nodeClass )\r\n {\r\n delete GraphEditor.NODE_TYPES[oldType];\r\n\r\n nodeClass.title = name;\r\n\r\n GraphEditor.registerCustomNode( 'function/' + name, nodeClass );\r\n }\r\n\r\n this.currentGraph.name = name;\r\n }\r\n\r\n _addGlobalActions()\r\n {\r\n }\r\n}\r\n\r\nLX.GraphEditor = GraphEditor;\r\n\r\n/**\r\n * @class Graph\r\n */\r\n\r\nclass Graph\r\n{\r\n name: string = 'Unnamed Graph';\r\n type: string = 'Graph';\r\n id: string = '';\r\n\r\n editor: GraphEditor | undefined;\r\n nodes: GraphNode[] = [];\r\n groups: any[] = [];\r\n variables: any = {};\r\n links: any = {};\r\n\r\n scale: number = 1.0;\r\n translation: typeof vec2 = new vec2( 0, 0 );\r\n\r\n _executionNodes: string[] = [];\r\n\r\n constructor( name?: string, options: any = {} )\r\n {\r\n this.name = name ?? this.name;\r\n }\r\n\r\n configure( o: any )\r\n {\r\n this.id = o.id;\r\n this.name = o.name;\r\n\r\n this.nodes.length = 0;\r\n\r\n for ( let node of o.nodes )\r\n {\r\n const newNode = GraphEditor.addNode( node.type );\r\n\r\n newNode.id = node.id;\r\n newNode.title = node.title;\r\n newNode.color = node.color;\r\n newNode.position = new vec2( node.position.x, node.position.y );\r\n newNode.type = node.type;\r\n newNode.properties = node.properties;\r\n\r\n this.nodes.push( newNode );\r\n }\r\n\r\n this.groups = o.groups;\r\n this.links = o.links;\r\n\r\n // editor options?\r\n\r\n // zoom/translation ??\r\n }\r\n\r\n /**\r\n * @method getNodeById\r\n */\r\n\r\n getNodeById( id: string )\r\n {\r\n for ( let node of this.nodes )\r\n {\r\n if ( node.id == id ) return node;\r\n }\r\n }\r\n\r\n /**\r\n * @method _runStep\r\n */\r\n\r\n _runStep( mainId: string )\r\n {\r\n if ( !mainId )\r\n {\r\n return;\r\n }\r\n\r\n const nodes: any = this.nodes.reduce( ( ac, a ) => ( { ...ac, [a.id]: a } ), {} );\r\n\r\n // Not main graph..\r\n if ( !nodes[mainId] )\r\n {\r\n return;\r\n }\r\n\r\n const visitedNodes: any = {};\r\n\r\n this._executionNodes = [];\r\n\r\n // Reser variables each step?\r\n this.variables = {};\r\n\r\n const addNode = ( id: string ) => {\r\n if ( visitedNodes[id] )\r\n {\r\n return;\r\n }\r\n\r\n visitedNodes[id] = true;\r\n\r\n for ( let linkId in this.links )\r\n {\r\n const idx = linkId.indexOf( '@' + id );\r\n\r\n if ( idx < 0 )\r\n {\r\n continue;\r\n }\r\n\r\n const preNodeId = linkId.substring( 0, idx );\r\n\r\n this._executionNodes.push( preNodeId );\r\n\r\n addNode( preNodeId );\r\n }\r\n };\r\n\r\n // TODO: Search \"no output\" nodes and add to the executable list (same as main)..\r\n // ...\r\n\r\n this._executionNodes.push( mainId );\r\n\r\n addNode( mainId );\r\n\r\n for ( var i = this._executionNodes.length - 1; i >= 0; --i )\r\n {\r\n const node = nodes[this._executionNodes[i]];\r\n\r\n if ( node.onBeforeStep )\r\n {\r\n node.onBeforeStep();\r\n }\r\n\r\n node.execute();\r\n\r\n if ( node.onBeforeStep )\r\n {\r\n node.onAfterStep();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @method serialize\r\n * @param {Boolean} prettify\r\n * @returns JSON data from the serialized graph\r\n */\r\n\r\n serialize( prettify = true )\r\n {\r\n var o: any = {};\r\n\r\n o.id = this.id;\r\n o.name = this.name;\r\n o.type = this.type;\r\n\r\n o.nodes = [];\r\n o.groups = [];\r\n o.functions = [];\r\n o.links = {};\r\n\r\n for ( let node of ( this.nodes as any[] ) )\r\n {\r\n o.nodes.push( node.serialize() );\r\n\r\n const fnOrigin = this.editor?.graphs[node.gid];\r\n\r\n if ( fnOrigin )\r\n {\r\n o.functions.push( JSON.parse( fnOrigin.serialize() ) );\r\n }\r\n }\r\n\r\n for ( let linkId in this.links )\r\n {\r\n const ioLinks = LX.deepCopy( this.links[linkId] );\r\n ioLinks.forEach( ( v: any ) => delete v.path );\r\n o.links[linkId] = ioLinks;\r\n }\r\n\r\n for ( let group of this.groups )\r\n {\r\n const groupDom = this.editor?.groups[group.id];\r\n const group_bb: any = this.editor?._getBoundingFromGroup( groupDom );\r\n group_bb.id = group.id;\r\n group_bb.name = group.name;\r\n o.groups.push( group_bb );\r\n }\r\n\r\n // editor options?\r\n\r\n // zoom/translation ??\r\n\r\n try\r\n {\r\n o = JSON.stringify( o, undefined, prettify ? 2 : undefined );\r\n }\r\n catch ( e )\r\n {\r\n o = null;\r\n console.error( `Can't export Graph [${this.name}] of type [${this.type}].` );\r\n }\r\n\r\n return o;\r\n }\r\n\r\n /**\r\n * @method export\r\n */\r\n\r\n export()\r\n {\r\n const o = this.serialize();\r\n LX.downloadFile( this.name + '.json', o );\r\n }\r\n}\r\n\r\nLX.Graph = Graph;\r\n\r\n/**\r\n * @class GraphNode\r\n */\r\n\r\nexport class GraphNode\r\n{\r\n static title: string;\r\n static blockDelete: boolean = false;\r\n static blockAdd: boolean = false;\r\n static description: string = '';\r\n\r\n id: string = '';\r\n type: string = '';\r\n title: string = '';\r\n inputs: any[] = [];\r\n outputs: any[] = [];\r\n properties: any[] = [];\r\n position: typeof vec2 = new vec2( 0, 0 );\r\n size: typeof vec2 = new vec2( 0, 0 );\r\n color: any;\r\n\r\n editor: GraphEditor | undefined;\r\n graphID: string | undefined;\r\n\r\n constructor()\r\n {\r\n }\r\n\r\n _hasOutputsConnected()\r\n {\r\n return true;\r\n }\r\n\r\n onExecute()\r\n {\r\n // This should be empty\r\n }\r\n\r\n execute()\r\n {\r\n if ( !this._hasOutputsConnected() )\r\n {\r\n return;\r\n }\r\n\r\n if ( this.onExecute )\r\n {\r\n this.onExecute();\r\n }\r\n }\r\n\r\n addInput( name: string | null, type: string )\r\n {\r\n this.inputs.push( { name: name, type: type } );\r\n }\r\n\r\n addOutput( name: string | null, type: string )\r\n {\r\n this.outputs.push( { name: name, type: type } );\r\n }\r\n\r\n addProperty( name: string | null, type: string, value: any, selectOptions?: any )\r\n {\r\n this.properties.push( { name, type, value, options: selectOptions } );\r\n }\r\n\r\n getInput( index: number )\r\n {\r\n if ( !this.inputs || !this.inputs.length || !this.inputs[index] )\r\n {\r\n return;\r\n }\r\n\r\n const graph = this.editor?.graphs[this.graphID as string];\r\n\r\n // Get data from link\r\n\r\n for ( let linkId in graph.links )\r\n {\r\n const idx = linkId.indexOf( '@' + this.id );\r\n\r\n if ( idx < 0 )\r\n {\r\n continue;\r\n }\r\n\r\n const nodeLinks = graph.links[linkId];\r\n\r\n for ( var link of nodeLinks )\r\n {\r\n if ( link.inputIdx != index )\r\n {\r\n continue;\r\n }\r\n\r\n // This is the value!!\r\n return link.data;\r\n }\r\n }\r\n }\r\n\r\n setOutput( index: number, data: any )\r\n {\r\n if ( !this.outputs || !this.outputs.length || !this.outputs[index] )\r\n {\r\n return;\r\n }\r\n\r\n const graph = this.editor?.graphs[this.graphID as string];\r\n\r\n // Set data in link\r\n\r\n for ( let linkId in graph.links )\r\n {\r\n const idx = linkId.indexOf( this.id + '@' );\r\n\r\n if ( idx < 0 )\r\n {\r\n continue;\r\n }\r\n\r\n const nodeLinks = graph.links[linkId];\r\n\r\n for ( var link of nodeLinks )\r\n {\r\n if ( link.outputIdx != index )\r\n {\r\n continue;\r\n }\r\n\r\n let innerData = data;\r\n\r\n if ( innerData != undefined && link.inputType != link.outputType && link.inputType != 'any'\r\n && link.outputType != 'any' )\r\n {\r\n // In case of supported casting, use function to cast..\r\n\r\n var fn = this.editor?.supportedCastTypes[link.outputType + '@' + link.inputType];\r\n\r\n // Use function if it's possible to cast!\r\n\r\n innerData = fn ? fn( LX.deepCopy( innerData ) ) : null;\r\n }\r\n\r\n link.data = innerData;\r\n }\r\n }\r\n }\r\n\r\n serialize()\r\n {\r\n var o: any = {};\r\n o.id = this.id;\r\n o.title = this.title;\r\n o.color = this.color;\r\n o.position = this.position;\r\n o.type = this.type;\r\n o.inputs = this.inputs;\r\n o.outputs = this.outputs;\r\n o.properties = this.properties;\r\n return o;\r\n }\r\n}\r\n\r\nLX.GraphNode = GraphNode;\r\n\r\n/**\r\n * @class GraphFunction\r\n */\r\n\r\nclass GraphFunction extends Graph\r\n{\r\n constructor( name?: string, options: any = {} )\r\n {\r\n super();\r\n\r\n this.name = name ?? ( 'GraphFunction' + GraphEditor.LAST_FUNCTION_ID );\r\n this.type = 'GraphFunction';\r\n\r\n GraphEditor.LAST_FUNCTION_ID++;\r\n\r\n const nodeInput = GraphEditor.addNode( 'function/Input' );\r\n nodeInput.position = new vec2( 150, 250 );\r\n\r\n const nodeOutput = GraphEditor.addNode( 'function/Output' );\r\n nodeOutput.position = new vec2( 650, 350 );\r\n\r\n this.nodes.push( nodeInput, nodeOutput );\r\n }\r\n\r\n getOutputData( inputValue: any )\r\n {\r\n const inputNode = this.nodes[0];\r\n inputNode.setOutput( 0, inputValue );\r\n\r\n const outputNode = this.nodes[1];\r\n\r\n this._runStep( outputNode.id );\r\n\r\n return outputNode.getInput( 0 );\r\n }\r\n}\r\n\r\nLX.GraphFunction = GraphFunction;\r\n\r\n/*\r\n ************ PREDEFINED NODES ************\r\n\r\n Nodes can override the following methods:\r\n\r\n - onCreate: Add inputs, outputs and properties\r\n - onStart: Callback on graph starts\r\n - onStop: Callback on graph stops\r\n - onExecute: Callback for node execution\r\n*/\r\n\r\n/*\r\n Function nodes\r\n*/\r\n\r\nclass NodeFuncInput extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'Outputs', 'array', [ 'float' ], [ 'float', 'int', 'bool', 'vec2', 'vec3', 'vec4', 'mat44' ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n // var a = this.getInput( 0 ) ?? this.properties[ 0 ].value;\r\n // var b = this.getInput( 1 ) ?? this.properties[ 1 ].value;\r\n // this.setOutput( 0, a + b );\r\n }\r\n\r\n setOutputs( v: any[] )\r\n {\r\n this.outputs.length = 0;\r\n\r\n for ( var i of v )\r\n {\r\n this.outputs.push( { name: null, type: i } );\r\n }\r\n }\r\n}\r\n\r\nNodeFuncInput.blockDelete = true;\r\nNodeFuncInput.blockAdd = true;\r\nGraphEditor.registerCustomNode( 'function/Input', NodeFuncInput );\r\n\r\nclass NodeFuncOutput extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n // var a = this.getInput( 0 ) ?? this.properties[ 0 ].value;\r\n // var b = this.getInput( 1 ) ?? this.properties[ 1 ].value;\r\n // this.setOutput( 0, a + b );\r\n }\r\n}\r\n\r\nNodeFuncOutput.blockDelete = true;\r\nNodeFuncOutput.blockAdd = true;\r\nGraphEditor.registerCustomNode( 'function/Output', NodeFuncOutput );\r\n\r\n/*\r\n Math nodes\r\n*/\r\n\r\nclass NodeAdd extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a + b );\r\n }\r\n}\r\n\r\nNodeAdd.description = 'Addition of 2 values (A+B).';\r\nGraphEditor.registerCustomNode( 'math/Add', NodeAdd );\r\n\r\nclass NodeSubstract extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a - b );\r\n }\r\n}\r\n\r\nNodeSubstract.description = 'Substraction of 2 values (A-B).';\r\nGraphEditor.registerCustomNode( 'math/Substract', NodeSubstract );\r\n\r\nclass NodeMultiply extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a * b );\r\n }\r\n}\r\n\r\nNodeMultiply.description = 'Multiplication of 2 values (A*B).';\r\nGraphEditor.registerCustomNode( 'math/Multiply', NodeMultiply );\r\n\r\nclass NodeDivide extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'A', 'float', 0 );\r\n this.addProperty( 'B', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n var b = this.getInput( 1 ) ?? this.properties[1].value;\r\n this.setOutput( 0, a / b );\r\n }\r\n}\r\n\r\nNodeDivide.description = 'Division of 2 values (A/B).';\r\nGraphEditor.registerCustomNode( 'math/Divide', NodeDivide );\r\n\r\nclass NodeSqrt extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'float' );\r\n this.addProperty( 'Value', 'float', 0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ) ?? this.properties[0].value;\r\n this.setOutput( 0, Math.sqrt( a ) );\r\n }\r\n}\r\n\r\nNodeSqrt.description = 'Square root of a scalar.';\r\nGraphEditor.registerCustomNode( 'math/SQRT', NodeSqrt );\r\n\r\n/*\r\nMath Missing:\r\n- abs\r\n- ceil\r\n- clamp\r\n- floor\r\n- fract\r\n- lerp\r\n- log\r\n- max\r\n- min\r\n- negate\r\n- pow\r\n- remainder\r\n- round\r\n- remap range\r\n- saturate\r\n- step\r\n*/\r\n\r\n/*\r\n Logical operator nodes\r\n*/\r\n\r\nclass NodeAnd extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'bool' );\r\n this.addInput( null, 'bool' );\r\n this.addOutput( null, 'bool' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 );\r\n if ( a == undefined || b == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, !!a && !!b );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/And', NodeAnd );\r\n\r\nclass NodeOr extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'bool' );\r\n this.addInput( null, 'bool' );\r\n this.addOutput( null, 'bool' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 );\r\n if ( a == undefined || b == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, !!a || !!b );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Or', NodeOr );\r\n\r\nclass NodeEqual extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'float' );\r\n this.addInput( null, 'float' );\r\n this.addOutput( null, 'bool' );\r\n }\r\n\r\n logicOp( a: number, b: number )\r\n {\r\n return a == b;\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 );\r\n if ( a == undefined || b == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, this.logicOp( a, b ) );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Equal', NodeEqual );\r\n\r\nclass NodeNotEqual extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a != b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/NotEqual', NodeNotEqual );\r\n\r\nclass NodeLess extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a < b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Less', NodeLess );\r\n\r\nclass NodeLessEqual extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a <= b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/LessEqual', NodeLessEqual );\r\n\r\nclass NodeGreater extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a > b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Greater', NodeGreater );\r\n\r\nclass NodeGreaterEqual extends NodeEqual\r\n{\r\n logicOp( a: number, b: number )\r\n {\r\n return a >= b;\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/GreaterEqual', NodeGreaterEqual );\r\n\r\nclass NodeSelect extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'True', 'any' );\r\n this.addInput( 'False', 'any' );\r\n this.addInput( 'Condition', 'bool' );\r\n this.addOutput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 ), cond = this.getInput( 2 );\r\n if ( a == undefined || b == undefined || cond == undefined )\r\n {\r\n return;\r\n }\r\n this.setOutput( 0, cond ? a : b );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'logic/Select', NodeSelect );\r\n\r\nclass NodeCompare extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'A', 'any' );\r\n this.addInput( 'B', 'any' );\r\n this.addInput( 'True', 'any' );\r\n this.addInput( 'False', 'any' );\r\n this.addProperty( 'Condition', 'select', 'Equal', [ 'Equal', 'Not Equal', 'Less', 'Less Equal', 'Greater', 'Greater Equal' ] );\r\n this.addOutput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var a = this.getInput( 0 ), b = this.getInput( 1 ), TrueVal = this.getInput( 2 ), FalseVal = this.getInput( 3 );\r\n var cond = this.properties[0].value;\r\n if ( a == undefined || b == undefined || TrueVal == undefined || FalseVal == undefined )\r\n {\r\n return;\r\n }\r\n var output;\r\n switch ( cond )\r\n {\r\n case 'Equal':\r\n output = a == b ? TrueVal : FalseVal;\r\n break;\r\n case 'Not Equal':\r\n output = a != b ? TrueVal : FalseVal;\r\n break;\r\n case 'Less':\r\n output = a < b ? TrueVal : FalseVal;\r\n break;\r\n case 'Less Equal':\r\n output = a <= b ? TrueVal : FalseVal;\r\n break;\r\n case 'Greater':\r\n output = a > b ? TrueVal : FalseVal;\r\n break;\r\n case 'Greater Equal':\r\n output = a >= b ? TrueVal : FalseVal;\r\n break;\r\n }\r\n this.setOutput( 0, output );\r\n }\r\n}\r\nNodeCompare.description = 'Compare A to B given the selected operator. If true, return value of True else return value of False.';\r\nGraphEditor.registerCustomNode( 'logic/Compare', NodeCompare );\r\n\r\n/*\r\n Event nodes\r\n*/\r\n\r\nclass NodeKeyDown extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'bool' );\r\n this.addProperty( 'Key', 'string', ' ' );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, !!this.editor?.keys[this.properties[0].value] );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'events/KeyDown', NodeKeyDown );\r\n\r\n/*\r\n Input nodes\r\n*/\r\n\r\nclass NodeString extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'string' );\r\n this.addProperty( null, 'string', 'text' );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/String', NodeString );\r\n\r\nclass NodeFloat extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'float' );\r\n this.addProperty( null, 'float', 0.0 );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Float', NodeFloat );\r\n\r\nclass NodeVector2 extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( 'Value', 'vec2' );\r\n this.addProperty( 'Value', 'vec2', [ 0, 0 ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Vector2', NodeVector2 );\r\n\r\nclass NodeVector3 extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( 'Value', 'vec3' );\r\n this.addProperty( 'Value', 'vec3', [ 0, 0, 0 ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Vector3', NodeVector3 );\r\n\r\nclass NodeVector4 extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( 'Value', 'vec4' );\r\n this.addProperty( 'Value', 'vec4', [ 0, 0, 0, 0 ] );\r\n }\r\n\r\n onExecute()\r\n {\r\n this.setOutput( 0, this.properties[0].value );\r\n }\r\n}\r\n\r\nGraphEditor.registerCustomNode( 'inputs/Vector4', NodeVector4 );\r\n\r\n/*\r\n Variable nodes\r\n*/\r\n\r\nclass NodeSetVariable extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'Value', 'any' );\r\n this.addOutput( null, 'any' );\r\n this.addProperty( 'Name', 'string', '' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var varName = this.getInput( 0 );\r\n if ( varName == undefined )\r\n {\r\n return;\r\n }\r\n var varValue = this.getInput( 1 );\r\n if ( varValue == undefined )\r\n {\r\n return;\r\n }\r\n this.editor?.setVariable( varName, varValue );\r\n this.setOutput( 0, varValue );\r\n }\r\n}\r\n\r\nNodeSetVariable.title = 'Set Variable';\r\nGraphEditor.registerCustomNode( 'variables/SetVariable', NodeSetVariable );\r\n\r\nclass NodeGetVariable extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addOutput( null, 'any' );\r\n this.addProperty( 'Name', 'string', '' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var varName = this.getInput( 0 );\r\n if ( varName == undefined )\r\n {\r\n return;\r\n }\r\n var data = this.editor?.getVariable( varName );\r\n if ( data != undefined )\r\n {\r\n this.setOutput( 0, data );\r\n }\r\n }\r\n}\r\n\r\nNodeGetVariable.title = 'Get Variable';\r\nGraphEditor.registerCustomNode( 'variables/GetVariable', NodeGetVariable );\r\n\r\n/*\r\n System nodes\r\n*/\r\n\r\nclass NodeConsoleLog extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( null, 'any' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var data = this.getInput( 0 );\r\n if ( data == undefined )\r\n {\r\n return;\r\n }\r\n console.log( data );\r\n }\r\n}\r\n\r\nNodeConsoleLog.title = 'Console Log';\r\nGraphEditor.registerCustomNode( 'system/ConsoleLog', NodeConsoleLog );\r\n\r\nclass NodeMain extends GraphNode\r\n{\r\n onCreate()\r\n {\r\n this.addInput( 'a', 'float' );\r\n this.addInput( 'b', 'bool' );\r\n this.addInput( 'Color', 'vec4' );\r\n }\r\n\r\n onExecute()\r\n {\r\n var data = this.getInput( 2 );\r\n if ( data == undefined )\r\n {\r\n return;\r\n }\r\n console.log( data );\r\n }\r\n}\r\n\r\nNodeMain.blockDelete = true;\r\nGraphEditor.registerCustomNode( 'system/Main', NodeMain );\r\n"],"names":[],"mappings":"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"}
|