diff --git a/0mq/funbody_zmq.dir/concore2.py b/0mq/comm_node.dir/concore2.py similarity index 94% rename from 0mq/funbody_zmq.dir/concore2.py rename to 0mq/comm_node.dir/concore2.py index 7b0b3b4..a018ddf 100644 --- a/0mq/funbody_zmq.dir/concore2.py +++ b/0mq/comm_node.dir/concore2.py @@ -54,6 +54,13 @@ def init_zmq_port(port_name, port_type, address, socket_type_str): except Exception as e: print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") # --- ZeroMQ Integration End --- def safe_literal_eval(filename, defaultValue): @@ -207,16 +214,17 @@ def write(port_identifier, name, val, delta=0): print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") except Exception as e: print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") - return - + return try: - file_port_num = int(port_identifier) + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) except ValueError: print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") return - file_path = os.path.join(outpath+str(file_port_num), name) - if isinstance(val, str): time.sleep(2 * delay) elif not isinstance(val, list): diff --git a/0mq/comm_node.py b/0mq/comm_node.py new file mode 100644 index 0000000..edba31d --- /dev/null +++ b/0mq/comm_node.py @@ -0,0 +1,25 @@ +import concore +import concore2 + +concore.delay = 0.07 +concore2.delay = 0.07 +concore2.inpath = concore.inpath +concore2.outpath = concore.outpath +concore2.simtime = 0 +concore.default_maxtime(100) +init_simtime_u = "[0.0, 0.0, 0.0]" +init_simtime_ym = "[0.0, 0.0, 0.0]" + +u = concore.initval(init_simtime_u) +ym = concore2.initval(init_simtime_ym) +while(concore2.simtime + + + + + + + + + + + CZ:cpymax.py + + + + + + + + + + + F1:funcall_zmq2.py + + + + + + + + + + + IN: + + + + + + + + + + Y + + + + + + + + + + + + U + + + + + + + + + + + + 0x2405_U3 + + + + + + + + 1664644923582 + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + a53a7f7273a40c7970938b6de1829249 + + + 1664644939781 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d + + 3d4a875a8a6ea281598aa70364b0ea82 + + + 1664644951652 + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + 5ed7e3d12fd25656b2ad03e29c307d65 + + + 1664644958838 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= + + 35c613c8203b65e1f44e066b3d783143 + + + 1664644988539 + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + 33d0b0cc4d3dbe3c42323e33f06993e9 + + + 1664645002278 + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 8d0d4a735631afe6241c66143fb29db8 + + + 1664645010353 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d + + 8a01a9ca8b3706bc3b1ce4de33669b6d + + + 1664645015576 + + DEL_EDGE + WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= + + 14416fc2e3c48db65e2b5e1012027ee0 + + + 1664645043815 + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d + + 326a920ffd7e662bc64ca95c086fb9de + + + 1664645057658 + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d + + 4593337e9924ae4b23dc5c5576c31394 + + + 1664645068951 + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d + + 568d8b7a109ffacc4b912095793cb2ca + + + 1664645081283 + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d + + 0d0aa0179f22f9d73a11f8ccfbcc145e + + + 1664645089735 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d + + 1c19591402c0f2daca7d2b4a8af5e956 + + + 1664645092868 + + DEL_EDGE + WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= + + 3c913497d8aa8f1c79bbdc03c3feec16 + + + 1664645142026 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + ecbd46b28ecaf800c8da0d2ada69b4de + + + 1664645149601 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== + + ea35c112764d7964f8b7e35e9a18efbd + + + 1664645223291 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d + + d669d3d37a4693ad860a18c69999b31f + + + 1664645228453 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + f7eb6af4003cb4eff19f39421fc00174 + + + 1664645231883 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + 49dd0c2013be6e39c2f11ea967dbcab4 + + + 1664645237206 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== + + 009fc03903a9ae6003caea49a6575ddb + + + 1666487497309 + + ADD_EDGE + W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= + + + DEL_EDGE + WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== + + 4957bb66f70bda073e7edafdad81f6b4 + + + 1666487500685 + + ADD_EDGE + W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== + + + DEL_EDGE + WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== + + c8d5e89e2630a4a0aa607594e14861d1 + + + 1666810339519 + + ADD_EDGE + W3sibGFiZWwiOiJVMiIsInNvdXJjZSI6ImFjZWUyZTJjLTFhOTEtNDg1OC1hYzdjLWNhMmNiM2YxZjQ3MCIsInRhcmdldCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotOS40NzQ2NTYxODQ2MTU5NmUtOCwiYmVuZFdlaWdodCI6MC41MDAwMDAwMDAwMDA5Nzc3LCJiZW5kUG9pbnQiOnsieCI6NDkxLjU4ODIyNDQ2NjEyMTEsInkiOjEwMC42MzA4MzY3OTg1ODUxfX0sInNvdXJjZUlEIjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwidGFyZ2V0SUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImU2ZWZhMmIyLWI0NDItNDAwNi05NzQ5LTdlM2IyZDUxMzJmYiJ9XQ== + + + DEL_EDGE + WyJlNmVmYTJiMi1iNDQyLTQwMDYtOTc0OS03ZTNiMmQ1MTMyZmIiXQ== + + ead3ddf695580bca36da4698dfe89256 + + + 1666810339519 + + ADD_EDGE + W3sibGFiZWwiOiJZMiIsInNvdXJjZSI6IjA0YmZkMWI4LTkzYWYtNDQxZi1iNDZhLTMyMGZkMTA3NDBjOSIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjozMC41NjQzMTU2MDk0NTE4NjQsImJlbmRXZWlnaHQiOjAuNTE0MzI5NzI5MzYyMTU2MywiYmVuZFBvaW50Ijp7IngiOjQyMi43NzE0OTAyODczNTc2NiwieSI6NjQuMDU1NTI3OTI5NTQ0ODd9fSwic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInR5cGUiOiJvcmRpbiIsImlkIjoiOTE3MzNmNmItM2RlMy00MGFmLWJmMTQtMmJiNmNiYzQ5MGUyIn1d + + + DEL_EDGE + WyI5MTczM2Y2Yi0zZGUzLTQwYWYtYmYxNC0yYmI2Y2JjNDkwZTIiXQ== + + a86191957747741919dd1f5e71c2e56c + + + 1666810339519 + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsiaWQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJsYWJlbCI6IkYyOmZ1bmJvZHkucHkiLCJ0eXBlIjoib3JkaW4iLCJzdHlsZSI6eyJ3aWR0aCI6MTIwLCJoZWlnaHQiOjUwLCJvcGFjaXR5IjoxLCJzaGFwZSI6InJlY3RhbmdsZSIsImJhY2tncm91bmRDb2xvciI6IiNmZmNjMDAiLCJib3JkZXJDb2xvciI6IiMwMDAiLCJib3JkZXJXaWR0aCI6MX19LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + b3ce34b6dc8f697e5b8fdf374ec42075 + + + 1666810343268 + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJpZCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiUFo6cG1weW1heC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + ab4fb226f0c49b8ded66436938762af7 + + + 1666810375461 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjExMSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsLnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + f5e56f793b1dfd259251f6b15ecf0e6a + + + 1748979732766 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd + + 9e9aaedf5e2f34cef7d06d52891d6a76 + + + 1749058687416 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjotMzg4LCJ5IjoxMC43NzM2MjI4MjYyMzMxMDh9XQ== + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOjEwMCwieSI6OTQuNzczNjIyODI2MjMzMTF9XQ== + + 7cb1d108692b66ae85dd0ffdcf639baf + + + 1749058691778 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + 1ce2563fc9ee71151cb6a722255fd762 + + + 1749058702356 + + DEL_NODE + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiXQ== + + + ADD_NODE + WyJJTjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotNjMyLCJ5IjotMTQzfSx7fSwiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIl0= + + 26f5f23f693921ed1b1ee5d52e1e75b6 + + + 1749058707709 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6LTU5OCwieSI6OTl9XQ== + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 6ae6b59a08af5a7047a97a5ad388c270 + + + 1749058713842 + + DEL_EDGE + WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0= + + cc747ad0ecc75c44cc3b6f6f9e9ae92c + + + 1749058727442 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6LTYxMiwieSI6LTEwMn1d + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNTk4LCJ5Ijo5OX1d + + fa49a13771e334eebbf112917f89d058 + + + 1749058754860 + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwidHlwZSI6Im9yZGluIiwic291cmNlIjoiYzI1ZDZiNjItNWQ2Ni00MDliLTk0YjEtZTZmZmI1ZjBmMTViIiwidGFyZ2V0IjoiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIiwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLCJiZW5kV2VpZ2h0IjowLjUsImJlbmRQb2ludCI6eyJ4IjotNTI0Ljg0NzY3NTkxNDkzNTQsInkiOi01OC4xMTMxODg1ODY4ODM0NDZ9fSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0= + + + DEL_EDGE + WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ== + + 7f0f25f333a2a6cfc15a70a1634323f1 + + + 1749058756916 + + DEL_EDGE + WyJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIifV0= + + fc1f4b789ad989f3e60a17bbe3a5bd5a + + + 1749058765759 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNjMyLCJ5IjotMTQzfV0= + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYzMiwieSI6LTE0M30seyJ4IjotNjEyLCJ5IjotMTAyfV0= + + 4209fecec5c91f476c4539fa06418efd + + + 1749058768670 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOi00ODcsInkiOjUwLjc3MzYyMjgyNjIzMzExfV0= + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTQ4NywieSI6NTAuNzczNjIyODI2MjMzMTF9LHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fV0= + + 63797cc5d0c6dc2da5ef71e99504bd45 + + + 1749066909379 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9ZMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + 1ad516ce46689ac6f15b5532ff42ab86 + + + 1749070198710 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + f6a8e5aa88fff9e10e187a6f5d1b6b33 + + + 1749070471512 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + 9b54fffa96ec88de939b11febe6746d0 + + + 1749070605367 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + ae211e5c6a9ff5b2487f0e107ea136f1 + + + 1749325857360 + + UPDATE_EDGE + WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + d42101a2e57f7e1fc75f9b867262a6a8 + + + \ No newline at end of file diff --git a/0mq/distributed_server.graphml b/0mq/distributed_server.graphml new file mode 100644 index 0000000..852b689 --- /dev/null +++ b/0mq/distributed_server.graphml @@ -0,0 +1,520 @@ + + + + + + + + + + + + PZ:pmpymax.py + + + + + + + + + + + F2:funbody_distributed.py + + + + + + + + + + + OUT: + + + + + + + + + + Y2 + + + + + + + + + + + + U2 + + + + + + + + + + + + 0x2405_U3 + + + + + + + + 1664644923582 + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + a53a7f7273a40c7970938b6de1829249 + + + 1664644939781 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d + + 3d4a875a8a6ea281598aa70364b0ea82 + + + 1664644951652 + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + 5ed7e3d12fd25656b2ad03e29c307d65 + + + 1664644958838 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= + + 35c613c8203b65e1f44e066b3d783143 + + + 1664644988539 + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + 33d0b0cc4d3dbe3c42323e33f06993e9 + + + 1664645002278 + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 8d0d4a735631afe6241c66143fb29db8 + + + 1664645010353 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d + + 8a01a9ca8b3706bc3b1ce4de33669b6d + + + 1664645015576 + + DEL_EDGE + WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= + + 14416fc2e3c48db65e2b5e1012027ee0 + + + 1664645043815 + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d + + 326a920ffd7e662bc64ca95c086fb9de + + + 1664645057658 + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d + + 4593337e9924ae4b23dc5c5576c31394 + + + 1664645068951 + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d + + 568d8b7a109ffacc4b912095793cb2ca + + + 1664645081283 + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d + + 0d0aa0179f22f9d73a11f8ccfbcc145e + + + 1664645089735 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d + + 1c19591402c0f2daca7d2b4a8af5e956 + + + 1664645092868 + + DEL_EDGE + WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= + + 3c913497d8aa8f1c79bbdc03c3feec16 + + + 1664645142026 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + ecbd46b28ecaf800c8da0d2ada69b4de + + + 1664645149601 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== + + ea35c112764d7964f8b7e35e9a18efbd + + + 1664645223291 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d + + d669d3d37a4693ad860a18c69999b31f + + + 1664645228453 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + f7eb6af4003cb4eff19f39421fc00174 + + + 1664645231883 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + 49dd0c2013be6e39c2f11ea967dbcab4 + + + 1664645237206 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== + + 009fc03903a9ae6003caea49a6575ddb + + + 1666487497309 + + ADD_EDGE + W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= + + + DEL_EDGE + WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== + + 4957bb66f70bda073e7edafdad81f6b4 + + + 1666487500685 + + ADD_EDGE + W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== + + + DEL_EDGE + WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== + + c8d5e89e2630a4a0aa607594e14861d1 + + + 1666810445211 + + ADD_EDGE + W3sibGFiZWwiOiJZIiwic291cmNlIjoiNTIzNjQxYTQtOTc1NS00NWVkLTlhMjUtYTExNDc2ZGUzN2EwIiwidGFyZ2V0IjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjI5LjE1NTExMDY3Mjg3NDI5NCwiYmVuZFdlaWdodCI6MC41MTMxNjc2Njk2NTEzNTEyLCJiZW5kUG9pbnQiOnsieCI6LTUwLjM1NTE2Njc0NzA3LCJ5Ijo1OC4xODI0NTg4NjkxNTA4NH19LCJzb3VyY2VJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInRhcmdldElEIjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwidHlwZSI6Im9yZGluIiwiaWQiOiI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAifV0= + + + DEL_EDGE + WyI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAiXQ== + + cfc129abe20d32f8c156301489dcc705 + + + 1666810445211 + + ADD_EDGE + W3sibGFiZWwiOiJVIiwic291cmNlIjoiZDA0MDg0OGYtNmE5NC00YWMyLWE0ZTItYTg4NzliNWY3ZmZiIiwidGFyZ2V0IjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjAuMDAwMDE0ODc2MzcxMTExNjM4NDIsImJlbmRXZWlnaHQiOjAuNTAwMDAwMDAxMjIyMTMzNiwiYmVuZFBvaW50Ijp7IngiOjExLjYxMTg5ODIyNTI4ODk2OCwieSI6OTMuNDg5ODc5MjQ2Nzg1Mzl9fSwic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInR5cGUiOiJvcmRpbiIsImlkIjoiZTAxY2FiN2MtYzQ0Ni00OGRhLWI4OGUtN2Y5NjIwY2NkMjY5In1d + + + DEL_EDGE + WyJlMDFjYWI3Yy1jNDQ2LTQ4ZGEtYjg4ZS03Zjk2MjBjY2QyNjkiXQ== + + 9fbba2442b7019a76634710caf98a549 + + + 1666810445211 + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJpZCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiRjE6ZnVuY2FsbC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + de44f1ff4f2107a20e234361711eec91 + + + 1666810453165 + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0seyJpZCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiQ1o6Y3B5bWF4LnB5IiwidHlwZSI6Im9yZGluIiwic3R5bGUiOnsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9fSwiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIl0= + + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + f1cb4196a5082cef004f9ee186c7f04b + + + 1666810462415 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + 9e9b34686b3aec97cf26547fcd7ae633 + + + 1748979705408 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + 299aef4ea2931f8b9a6b7f10361b0022 + + + 1749058646821 + + DEL_NODE + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTQzLCJ5IjoyNzF9LHt9LCI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ== + + 51cf4c5701b1a8a637c1b373dcd09c59 + + + 1749058651133 + + SET_POS + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTQzLCJ5IjoyNzF9XQ== + + + SET_POS + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTQzLCJ5IjoyNzF9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 440d3083c9a571e9660685eaeefae6fb + + + 1749058659847 + + DEL_EDGE + WyJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6IjUyZTk3NDkyLWNjZWEtNDhhMi05ZGVkLWUyMzVlMjQ1MDM1OCIsImxhYmVsIjoiMHgyNDAwX1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAifV0= + + 615e0be29af2a4940efea41e374438bb + + + 1749070207801 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + a8472011e18e50a782b19383b3b1a41d + + + 1749070480095 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + 4a9c6467598df6924c76f002eccbb822 + + + 1749070617114 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + 2b2ace96e5b5dad90e06fbac4e20b915 + + + 1749322194657 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + dfbb291ab07456ce0005d5c6d1d6a18a + + + 1749325840799 + + UPDATE_EDGE + WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + 385fc34934650be854756424f6fac52e + + + 1749406730989 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjIxMywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X2Rpc3RyaWJ1dGVkLnB5Iix0cnVlXQ== + + 3eae38f7266c77d8368676cbdc9b3ba5 + + + \ No newline at end of file diff --git a/0mq/fileOnlyCommunication.graphml b/0mq/fileOnlyCommunication.graphml new file mode 100644 index 0000000..9f23fc2 --- /dev/null +++ b/0mq/fileOnlyCommunication.graphml @@ -0,0 +1,460 @@ + + + + + + + + + + + + PZ:pmpymax.py + + + + + + + + + + + CZ:cpymax.py + + + + + + + + + + + F1:comm_node.py + + + + + + + + + + U + + + + + + + + + + + + Y + + + + + + + + + + + + U1 + + + + + + + + + + + + Y1 + + + + + + + + 1664644923582 + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + a53a7f7273a40c7970938b6de1829249 + + + 1664644939781 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d + + 3d4a875a8a6ea281598aa70364b0ea82 + + + 1664644951652 + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + 5ed7e3d12fd25656b2ad03e29c307d65 + + + 1664644958838 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= + + 35c613c8203b65e1f44e066b3d783143 + + + 1664644988539 + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + 33d0b0cc4d3dbe3c42323e33f06993e9 + + + 1664645002278 + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 8d0d4a735631afe6241c66143fb29db8 + + + 1664645010353 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d + + 8a01a9ca8b3706bc3b1ce4de33669b6d + + + 1664645015576 + + DEL_EDGE + WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= + + 14416fc2e3c48db65e2b5e1012027ee0 + + + 1664645043815 + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d + + 326a920ffd7e662bc64ca95c086fb9de + + + 1664645057658 + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d + + 4593337e9924ae4b23dc5c5576c31394 + + + 1664645068951 + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d + + 568d8b7a109ffacc4b912095793cb2ca + + + 1664645081283 + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d + + 0d0aa0179f22f9d73a11f8ccfbcc145e + + + 1664645089735 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d + + 1c19591402c0f2daca7d2b4a8af5e956 + + + 1664645092868 + + DEL_EDGE + WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= + + 3c913497d8aa8f1c79bbdc03c3feec16 + + + 1664645142026 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + ecbd46b28ecaf800c8da0d2ada69b4de + + + 1664645149601 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== + + ea35c112764d7964f8b7e35e9a18efbd + + + 1664645223291 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d + + d669d3d37a4693ad860a18c69999b31f + + + 1664645228453 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + f7eb6af4003cb4eff19f39421fc00174 + + + 1664645231883 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + 49dd0c2013be6e39c2f11ea967dbcab4 + + + 1664645237206 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== + + 009fc03903a9ae6003caea49a6575ddb + + + 1664646509534 + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sInR5cGUiOiJvcmRpbiIsInNvdXJjZSI6IjYyOGMyOTI0LWI2YzEtNDBjNi05ZjM5LTZjMDUxNmI3MGI1YSIsInRhcmdldCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImJlbmREYXRhIjp7ImJlbmREaXN0YW5jZSI6MCwiYmVuZFdlaWdodCI6MC41LCJiZW5kUG9pbnQiOnsieCI6NDkxLjU4ODIyNDQ2NjEyMTEsInkiOjEwMC42MzA4MzY4MzIxNzMyMn19LCJpZCI6IjcxNGRiOTg5LTU2NzItNDAzYi1hZTc2LWZkOWEyMDg5MzQ3NSJ9XQ== + + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + 86704f8d36bc9bfa5f599c3a4b445d78 + + + 1664646579649 + + DEL_EDGE + WyIwM2RlN2FjYS1hZTA0LTQ5ZWEtYThjZC04YTg3YTA0MjA0ZjEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImlkIjoiMDNkZTdhY2EtYWUwNC00OWVhLWE4Y2QtOGE4N2EwNDIwNGYxIn1d + + 44b7833e0adb98fcda7606fe873176a4 + + + 1664646592082 + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sInR5cGUiOiJvcmRpbiIsInNvdXJjZSI6ImZlYjllMGU5LTA2NTktNDdmYy1iNGQzLTZiZGRkOGM2YjNkNiIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImJlbmREYXRhIjp7ImJlbmREaXN0YW5jZSI6MjAsImJlbmRXZWlnaHQiOjAuNSwiYmVuZFBvaW50Ijp7IngiOjE4Ny42MDY5NDA0NzI4NDkzLCJ5Ijo3My4wMDY2NjE0ODk4MDV9fSwiaWQiOiI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYifV0= + + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + 980dd3b8b785d6454a88fd4a0b28c931 + + + 1664646592082 + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sInR5cGUiOiJvcmRpbiIsInNvdXJjZSI6Ijg3ODFjMWFiLTI3MzUtNGE1NS1iMzQyLWExMzBhNTlmMzcwNyIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImJlbmREYXRhIjp7ImJlbmREaXN0YW5jZSI6MjAsImJlbmRXZWlnaHQiOjAuNSwiYmVuZFBvaW50Ijp7IngiOjQyNi42MTkzODI1NjIzMjg2LCJ5Ijo3Ni41MjAxMzYxMTU4NzI2NX19LCJpZCI6ImE4YWU3ODkwLWIyYmItNDI3My04NzUzLTAxODFjZWI0ODZjMSJ9XQ== + + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + 167c73cd93b1abdcd56b452ed8d8c24e + + + 1664646592082 + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sInR5cGUiOiJvcmRpbiIsInNvdXJjZSI6ImFhNjZiNDZiLTRkYTgtNDAxMC1iODk0LWQ0YmFhNWEzYWY4MiIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImJlbmREYXRhIjp7ImJlbmREaXN0YW5jZSI6MC4wMDAwMjc4NjgxNzM4NjU0NjQwMywiYmVuZFdlaWdodCI6MC41MDAwMDAwMDQwMzA1MDY2LCJiZW5kUG9pbnQiOnsieCI6MjQ1Ljc1OTMxODQ3MDQxOTI2LCJ5Ijo5OC4zNDU3NTk1MDM4MjE4N319LCJpZCI6IjNjZmI0MGNkLTU1N2EtNDg1MC05M2E2LWZkYzA5Y2QwMDVmMCJ9XQ== + + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + d2945a87d6e5d69e9ab87ba9fc45210a + + + 1664646592082 + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsiaWQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJsYWJlbCI6IkYyOmZ1bmJvZHkucHkiLCJ0eXBlIjoib3JkaW4iLCJzdHlsZSI6eyJ3aWR0aCI6MTIwLCJoZWlnaHQiOjUwLCJzaGFwZSI6InJlY3RhbmdsZSIsIm9wYWNpdHkiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZmNjMDAiLCJib3JkZXJDb2xvciI6IiMwMDAiLCJib3JkZXJXaWR0aCI6MX19LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 339f60a97384ac1435d5512fd70f37b7 + + + 1664646604837 + + DEL_EDGE + WyIzN2UyMzg0NC1hODgwLTQ1MjktOTA2Mi00YmIyNTIxZTI5YzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiMzdlMjM4NDQtYTg4MC00NTI5LTkwNjItNGJiMjUyMWUyOWM1In1d + + bfa293ad0bde125ea5db2d194297d66a + + + 1749408065766 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjExMSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsLnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1MywiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpjb21tX25vZGUucHkiLHRydWVd + + 6806b2037ce2ff878ea6f1ec962044b0 + + + 1749408086201 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4IjozODEuMTU3ODExODQ2NjU1NiwieSI6OTQuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MzgxLjE1NzgxMTg0NjY1NTYsInkiOjk0LjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + c851b427b6f20d6ba88759a36ec55409 + + + 1749408089116 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE5Ni43NzYyMDM1NDk0MjM4MywieSI6OTQuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE5Ni43NzYyMDM1NDk0MjM4MywieSI6OTQuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + 5754a9589aae86257d22e65d39587d65 + + + 1749408091800 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MzgxLjE1NzgxMTg0NjY1NTYsInkiOjk0LjQ0MjMyOTI2NTM3ODM2fSx7IngiOjQwMS4xNTc4MTE4NDY2NTU2LCJ5Ijo5My40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDAxLjE1NzgxMTg0NjY1NTYsInkiOjkzLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjM4MS4xNTc4MTE4NDY2NTU2LCJ5Ijo5NC40NDIzMjkyNjUzNzgzNn1d + + 888e627d6b97ef44aaaef82e629bb77c + + + \ No newline at end of file diff --git a/0mq/firstNode.py b/0mq/firstNode.py new file mode 100644 index 0000000..acc08a9 --- /dev/null +++ b/0mq/firstNode.py @@ -0,0 +1,45 @@ +# firstNode.py (Client/Orchestrator) +import concore +import time + +# --- ZMQ Initialization --- +# This REQ socket connects to Node B (F2) +concore.init_zmq_port( + port_name=f"0x{PORT_F1_F2}_{PORT_NAME_F1_F2}", + port_type="connect", + address="tcp://localhost:" + PORT_F1_F2, + socket_type_str="REQ" +) +# This REQ socket connects to Node C (F3) +concore.init_zmq_port( + port_name=f"0x{PORT_F1_F3}_{PORT_NAME_F1_F3}", + port_type="connect", + address="tcp://localhost:" + PORT_F1_F3, + socket_type_str="REQ" +) + +current_value = 0.0 + +while current_value <= 100: + # --- Step 1: Communicate with Node B --- + print(f"Node A: Sending value {current_value:.2f} to Node B.") + concore.write(f"0x{PORT_F1_F2}_{PORT_NAME_F1_F2}", "value", [current_value]) + + # Wait for the reply from Node B + value_from_b = concore.read(f"0x{PORT_F1_F2}_{PORT_NAME_F1_F2}", "value", [current_value]) + processed_by_b = value_from_b[0] + print(f"Node A: Received processed value {processed_by_b:.2f} from Node B.") + + # --- Step 2: Communicate with Node C --- + print(f"Node A: Sending value {processed_by_b:.2f} to Node C.") + concore.write(f"0x{PORT_F1_F3}_{PORT_NAME_F1_F3}", "value", [processed_by_b]) + + # Wait for the reply from Node C + value_from_c = concore.read(f"0x{PORT_F1_F3}_{PORT_NAME_F1_F3}", "value", [processed_by_b]) + current_value = value_from_c[0] + print(f"Node A: Received final value {current_value:.2f} from Node C.") + print("-" * 20) + time.sleep(1) # Slow down the loop for readability + +print("\nNode A: Value exceeded 100. Terminating.") +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/funbody.dir/concore2.py b/0mq/funbody.dir/concore2.py index e3ec817..a018ddf 100644 --- a/0mq/funbody.dir/concore2.py +++ b/0mq/funbody.dir/concore2.py @@ -3,6 +3,7 @@ from ast import literal_eval import sys import re +import zmq # Added for ZeroMQ #if windows, create script to kill this process # because batch files don't provide easy way to know pid of last command @@ -12,15 +13,67 @@ with open("concorekill.bat","w") as fpid: fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") -try: - iport = literal_eval(open("concore.iport").read()) -except: - iport = dict() -try: - oport = literal_eval(open("concore.oport").read()) -except: - oport = dict() +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) s = '' olds = '' @@ -28,86 +81,183 @@ retrycount = 0 inpath = "./in" #must be rel path for local outpath = "./out" +simtime = 0 #9/21/22 try: - sparams = open(inpath+"1/concore.params").read() - if sparams[0] == '"': #windows keeps "" need to remove - sparams = sparams[1:] - sparams = sparams[0:sparams.find('"')] - if sparams != '{': - print("converting sparams: "+sparams) - sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" - print("converted sparams: " + sparams) - try: - params = literal_eval(sparams) - except: - print("bad params: "+sparams) -except: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") params = dict() + #9/30/22 -def tryparam(n,i): - try: - return params[n] - except: - return i +def tryparam(n, i): + return params.get(n, i) #9/12/21 def default_maxtime(default): global maxtime - try: - maxtime = literal_eval(open(inpath+"1/concore.maxtime").read()) - except: - maxtime = default + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + default_maxtime(100) def unchanged(): - global olds,s - if olds==s: + global olds, s + if olds == s: s = '' return True - else: - olds = s - return False + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val -def read(port, name, initstr): - global s,simtime,retrycount - time.sleep(delay) try: - infile = open(inpath+str(port)+"/"+name); - ins = infile.read() - except: - ins = initstr - while len(ins)==0: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: time.sleep(delay) - ins = infile.read() + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 retrycount += 1 - s += ins - inval = literal_eval(ins) - simtime = max(simtime,inval[0]) - return inval[1:] - -def write(port, name, val, delta=0): - global outpath,simtime - if isinstance(val,str): - time.sleep(2*delay) - elif isinstance(val,list)==False: - print("mywrite must have list or str") - quit() + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins try: - with open(outpath+str(port)+"/"+name,"w") as outfile: - if isinstance(val,list): - outfile.write(str([simtime+delta]+val)) - simtime += delta - else: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: outfile.write(val) - except: - print("skipping"+outpath+str(port)+"/"+name); + except Exception as e: + print(f"Error writing to {file_path}: {e}") -def initval(simtime_val): +def initval(simtime_val_str): global simtime - val = literal_eval(simtime_val) - simtime = val[0] - return val[1:] + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funbody2.dir/concore2.py b/0mq/funbody2.dir/concore2.py index e3ec817..a018ddf 100644 --- a/0mq/funbody2.dir/concore2.py +++ b/0mq/funbody2.dir/concore2.py @@ -3,6 +3,7 @@ from ast import literal_eval import sys import re +import zmq # Added for ZeroMQ #if windows, create script to kill this process # because batch files don't provide easy way to know pid of last command @@ -12,15 +13,67 @@ with open("concorekill.bat","w") as fpid: fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") -try: - iport = literal_eval(open("concore.iport").read()) -except: - iport = dict() -try: - oport = literal_eval(open("concore.oport").read()) -except: - oport = dict() +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) s = '' olds = '' @@ -28,86 +81,183 @@ retrycount = 0 inpath = "./in" #must be rel path for local outpath = "./out" +simtime = 0 #9/21/22 try: - sparams = open(inpath+"1/concore.params").read() - if sparams[0] == '"': #windows keeps "" need to remove - sparams = sparams[1:] - sparams = sparams[0:sparams.find('"')] - if sparams != '{': - print("converting sparams: "+sparams) - sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" - print("converted sparams: " + sparams) - try: - params = literal_eval(sparams) - except: - print("bad params: "+sparams) -except: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") params = dict() + #9/30/22 -def tryparam(n,i): - try: - return params[n] - except: - return i +def tryparam(n, i): + return params.get(n, i) #9/12/21 def default_maxtime(default): global maxtime - try: - maxtime = literal_eval(open(inpath+"1/concore.maxtime").read()) - except: - maxtime = default + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + default_maxtime(100) def unchanged(): - global olds,s - if olds==s: + global olds, s + if olds == s: s = '' return True - else: - olds = s - return False + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val -def read(port, name, initstr): - global s,simtime,retrycount - time.sleep(delay) try: - infile = open(inpath+str(port)+"/"+name); - ins = infile.read() - except: - ins = initstr - while len(ins)==0: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: time.sleep(delay) - ins = infile.read() + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 retrycount += 1 - s += ins - inval = literal_eval(ins) - simtime = max(simtime,inval[0]) - return inval[1:] - -def write(port, name, val, delta=0): - global outpath,simtime - if isinstance(val,str): - time.sleep(2*delay) - elif isinstance(val,list)==False: - print("mywrite must have list or str") - quit() + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins try: - with open(outpath+str(port)+"/"+name,"w") as outfile: - if isinstance(val,list): - outfile.write(str([simtime+delta]+val)) - simtime += delta - else: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: outfile.write(val) - except: - print("skipping"+outpath+str(port)+"/"+name); + except Exception as e: + print(f"Error writing to {file_path}: {e}") -def initval(simtime_val): +def initval(simtime_val_str): global simtime - val = literal_eval(simtime_val) - simtime = val[0] - return val[1:] + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funbody_distributed.dir/concore2.py b/0mq/funbody_distributed.dir/concore2.py new file mode 100644 index 0000000..a018ddf --- /dev/null +++ b/0mq/funbody_distributed.dir/concore2.py @@ -0,0 +1,263 @@ +import time +import os +from ast import literal_eval +import sys +import re +import zmq # Added for ZeroMQ + +#if windows, create script to kill this process +# because batch files don't provide easy way to know pid of last command +# ignored for posix!=windows, because "concorepid" is handled by script +# ignored for docker (linux!=windows), because handled by docker stop +if hasattr(sys, 'getwindowsversion'): + with open("concorekill.bat","w") as fpid: + fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") + +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- + +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) + +s = '' +olds = '' +delay = 1 +retrycount = 0 +inpath = "./in" #must be rel path for local +outpath = "./out" +simtime = 0 + +#9/21/22 +try: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") + params = dict() + +#9/30/22 +def tryparam(n, i): + return params.get(n, i) + + +#9/12/21 +def default_maxtime(default): + global maxtime + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + +default_maxtime(100) + +def unchanged(): + global olds, s + if olds == s: + s = '' + return True + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + + try: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: + time.sleep(delay) + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 + retrycount += 1 + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins + try: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: + outfile.write(val) + except Exception as e: + print(f"Error writing to {file_path}: {e}") + +def initval(simtime_val_str): + global simtime + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funbody_distributed.py b/0mq/funbody_distributed.py new file mode 100644 index 0000000..eaae295 --- /dev/null +++ b/0mq/funbody_distributed.py @@ -0,0 +1,67 @@ +# funbody2_zmq.py +import time +import concore +import concore2 + +print("funbody using ZMQ via concore") + +# Initialize ZMQ REP port using concore +concore.init_zmq_port( + port_name=PORT_NAME_F2_OUT, + port_type="bind", + address= "tcp://0.0.0.0:" + PORT_F2_OUT, + socket_type_str="REP" +) + + +# Standard concore initializations +concore.delay = 0.07 +concore2.delay = 0.07 +concore2.inpath = concore.inpath +concore2.outpath = concore.outpath +concore2.simtime = 0 +concore.default_maxtime(100) +init_simtime_u_str = "[0.0, 0.0, 0.0]" +init_simtime_ym_str = "[0.0, 0.0, 0.0]" + +u_data_values = concore.initval(init_simtime_u_str) +ym_data_values = concore2.initval(init_simtime_ym_str) + +print(f"Initial u_data_values: {u_data_values}, ym_data_values: {ym_data_values}") +print(f"Max time: {concore.maxtime}") + +while concore2.simtime < concore.maxtime: + received_u_data = concore.read(PORT_NAME_F2_OUT, "u_signal", init_simtime_u_str) + + if not (isinstance(received_u_data, list) and len(received_u_data) > 0): + print(f"Error or invalid data received via ZMQ: {received_u_data}. Skipping iteration.") + time.sleep(concore.delay) + continue + + received_time = received_u_data[0] + if isinstance(received_time, (int, float)): + concore.simtime = received_time + u_data_values = received_u_data[1:] + else: + print(f"Warning: Received ZMQ data's first element is not time: {received_u_data}. Using data part as is.") + u_data_values = received_u_data[1:] if len(received_u_data) > 1 else [] + + # Assuming concore.oport['U2'] is a file port (e.g., to pmpymax.py) + if 'U2' in concore.oport: + concore.write(concore.oport['U2'], "u", u_data_values) + + old_concore2_simtime = concore2.simtime + while concore2.unchanged() or concore2.simtime <= old_concore2_simtime: + # Assuming concore.iport['Y2'] is a file port (e.g., from pmpymax.py) + ym_data_values = concore2.read(concore.iport['Y2'], "ym", init_simtime_ym_str) + # time.sleep(concore2.delay) # Optional delay + + ym_full_to_send = [concore2.simtime] + ym_data_values + + concore.write(PORT_NAME_F2_OUT, "ym_signal", ym_full_to_send) + + print(f"funbody u={u_data_values} ym={ym_data_values} time={concore2.simtime}") + +print("funbody retry=" + str(concore.retrycount)) + +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/funbody_zmq.dir copy/concore2.py b/0mq/funbody_zmq.dir copy/concore2.py new file mode 100644 index 0000000..a018ddf --- /dev/null +++ b/0mq/funbody_zmq.dir copy/concore2.py @@ -0,0 +1,263 @@ +import time +import os +from ast import literal_eval +import sys +import re +import zmq # Added for ZeroMQ + +#if windows, create script to kill this process +# because batch files don't provide easy way to know pid of last command +# ignored for posix!=windows, because "concorepid" is handled by script +# ignored for docker (linux!=windows), because handled by docker stop +if hasattr(sys, 'getwindowsversion'): + with open("concorekill.bat","w") as fpid: + fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") + +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- + +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) + +s = '' +olds = '' +delay = 1 +retrycount = 0 +inpath = "./in" #must be rel path for local +outpath = "./out" +simtime = 0 + +#9/21/22 +try: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") + params = dict() + +#9/30/22 +def tryparam(n, i): + return params.get(n, i) + + +#9/12/21 +def default_maxtime(default): + global maxtime + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + +default_maxtime(100) + +def unchanged(): + global olds, s + if olds == s: + s = '' + return True + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + + try: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: + time.sleep(delay) + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 + retrycount += 1 + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins + try: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: + outfile.write(val) + except Exception as e: + print(f"Error writing to {file_path}: {e}") + +def initval(simtime_val_str): + global simtime + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funbody_zmq.py b/0mq/funbody_zmq.py index 576f692..6a6b353 100644 --- a/0mq/funbody_zmq.py +++ b/0mq/funbody_zmq.py @@ -1,45 +1,66 @@ # funbody2_zmq.py -import zmq -import time +import time import concore import concore2 -print("funbody using 0mq") +print("funbody using ZMQ via concore") -context = zmq.Context() -socket = context.socket(zmq.REP) -socket.bind("tcp://*:2356") +# Initialize ZMQ REP port using concore +concore.init_zmq_port( + port_name=PORT_NAME_F2_F1, + port_type="bind", + address= "tcp://*:" + PORT_F2_F1, + socket_type_str="REP" +) -concore.delay = 0.07 -concore2.delay = 0.07 +# Standard concore initializations +concore.delay = 0.07 +concore2.delay = 0.07 concore2.inpath = concore.inpath concore2.outpath = concore.outpath -concore2.simtime = 0 -concore.default_maxtime(100) -init_simtime_u = "[0.0, 0.0, 0.0]" -init_simtime_ym = "[0.0, 0.0, 0.0]" +concore2.simtime = 0 +concore.default_maxtime(100) +init_simtime_u_str = "[0.0, 0.0, 0.0]" +init_simtime_ym_str = "[0.0, 0.0, 0.0]" -u = concore.initval(init_simtime_u) -ym = concore2.initval(init_simtime_ym) +u_data_values = concore.initval(init_simtime_u_str) +ym_data_values = concore2.initval(init_simtime_ym_str) + +print(f"Initial u_data_values: {u_data_values}, ym_data_values: {ym_data_values}") +print(f"Max time: {concore.maxtime}") while concore2.simtime < concore.maxtime: - msg = socket.recv_json() - if msg["action"] == "fun": - u = msg["params"]["u"] - concore.simtime = u[0] - u = u[1:] - concore.write(concore.oport['U2'], "u", u) - print(u) - old2 = concore2.simtime - while concore2.unchanged() or concore2.simtime <= old2: - ym = concore2.read(concore.iport['Y2'], "ym", init_simtime_ym) - ym_full = [concore2.simtime] + ym - print(f"Replying with {ym_full}") - socket.send_json({"ym": ym_full}) - print(f"funbody u={u} ym={ym} time={concore2.simtime}") + received_u_data = concore.read(PORT_NAME_F2_F1, "u_signal", init_simtime_u_str) + + if not (isinstance(received_u_data, list) and len(received_u_data) > 0): + print(f"Error or invalid data received via ZMQ: {received_u_data}. Skipping iteration.") + time.sleep(concore.delay) + continue + + received_time = received_u_data[0] + if isinstance(received_time, (int, float)): + concore.simtime = received_time + u_data_values = received_u_data[1:] else: - print("undefined action: " + str(msg.get("action", "None"))) - socket.send_json({"error": "undefined action"}) - break + print(f"Warning: Received ZMQ data's first element is not time: {received_u_data}. Using data part as is.") + u_data_values = received_u_data[1:] if len(received_u_data) > 1 else [] + + # Assuming concore.oport['U2'] is a file port (e.g., to pmpymax.py) + if 'U2' in concore.oport: + concore.write(concore.oport['U2'], "u", u_data_values) + + old_concore2_simtime = concore2.simtime + while concore2.unchanged() or concore2.simtime <= old_concore2_simtime: + # Assuming concore.iport['Y2'] is a file port (e.g., from pmpymax.py) + ym_data_values = concore2.read(concore.iport['Y2'], "ym", init_simtime_ym_str) + # time.sleep(concore2.delay) # Optional delay + + ym_full_to_send = [concore2.simtime] + ym_data_values + + concore.write(PORT_NAME_F2_F1, "ym_signal", ym_full_to_send) + + print(f"funbody u={u_data_values} ym={ym_data_values} time={concore2.simtime}") + +print("funbody retry=" + str(concore.retrycount)) -print("retry=" + str(concore.retrycount)) \ No newline at end of file +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/funbody_zmq2.dir/concore2.py b/0mq/funbody_zmq2.dir/concore2.py index 65bd955..a018ddf 100644 --- a/0mq/funbody_zmq2.dir/concore2.py +++ b/0mq/funbody_zmq2.dir/concore2.py @@ -54,6 +54,14 @@ def init_zmq_port(port_name, port_type, address, socket_type_str): except Exception as e: print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- def safe_literal_eval(filename, defaultValue): try: @@ -206,16 +214,17 @@ def write(port_identifier, name, val, delta=0): print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") except Exception as e: print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") - return - + return try: - file_port_num = int(port_identifier) + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) except ValueError: print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") return - file_path = os.path.join(outpath+str(file_port_num), name) - if isinstance(val, str): time.sleep(2 * delay) elif not isinstance(val, list): diff --git a/0mq/funbody_zmq2.py b/0mq/funbody_zmq2.py index fce7b13..04d9487 100644 --- a/0mq/funbody_zmq2.py +++ b/0mq/funbody_zmq2.py @@ -5,15 +5,11 @@ print("funbody using ZMQ via concore") -# ZMQ settings -ZMQ_PORT_NAME = "FUNBODY_REP_PORT" -ZMQ_BIND_ADDRESS = "tcp://*:2355" - # Initialize ZMQ REP port using concore concore.init_zmq_port( - port_name=ZMQ_PORT_NAME, + port_name=PORT_NAME_F2_OUT, port_type="bind", - address=ZMQ_BIND_ADDRESS, + address= "tcp://*:" + PORT_F2_OUT, socket_type_str="REP" ) @@ -34,7 +30,7 @@ print(f"Max time: {concore.maxtime}") while concore2.simtime < concore.maxtime: - received_u_data = concore.read(ZMQ_PORT_NAME, "u_signal", init_simtime_u_str) + received_u_data = concore.read(PORT_NAME_F2_OUT, "u_signal", init_simtime_u_str) if not (isinstance(received_u_data, list) and len(received_u_data) > 0): print(f"Error or invalid data received via ZMQ: {received_u_data}. Skipping iteration.") @@ -61,8 +57,10 @@ ym_full_to_send = [concore2.simtime] + ym_data_values - concore.write(ZMQ_PORT_NAME, "ym_signal", ym_full_to_send) + concore.write(PORT_NAME_F2_OUT, "ym_signal", ym_full_to_send) print(f"funbody u={u_data_values} ym={ym_data_values} time={concore2.simtime}") -print("funbody retry=" + str(concore.retrycount)) \ No newline at end of file +print("funbody retry=" + str(concore.retrycount)) + +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/funcall.dir/concore2.py b/0mq/funcall.dir/concore2.py index e3ec817..a018ddf 100644 --- a/0mq/funcall.dir/concore2.py +++ b/0mq/funcall.dir/concore2.py @@ -3,6 +3,7 @@ from ast import literal_eval import sys import re +import zmq # Added for ZeroMQ #if windows, create script to kill this process # because batch files don't provide easy way to know pid of last command @@ -12,15 +13,67 @@ with open("concorekill.bat","w") as fpid: fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") -try: - iport = literal_eval(open("concore.iport").read()) -except: - iport = dict() -try: - oport = literal_eval(open("concore.oport").read()) -except: - oport = dict() +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) s = '' olds = '' @@ -28,86 +81,183 @@ retrycount = 0 inpath = "./in" #must be rel path for local outpath = "./out" +simtime = 0 #9/21/22 try: - sparams = open(inpath+"1/concore.params").read() - if sparams[0] == '"': #windows keeps "" need to remove - sparams = sparams[1:] - sparams = sparams[0:sparams.find('"')] - if sparams != '{': - print("converting sparams: "+sparams) - sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" - print("converted sparams: " + sparams) - try: - params = literal_eval(sparams) - except: - print("bad params: "+sparams) -except: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") params = dict() + #9/30/22 -def tryparam(n,i): - try: - return params[n] - except: - return i +def tryparam(n, i): + return params.get(n, i) #9/12/21 def default_maxtime(default): global maxtime - try: - maxtime = literal_eval(open(inpath+"1/concore.maxtime").read()) - except: - maxtime = default + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + default_maxtime(100) def unchanged(): - global olds,s - if olds==s: + global olds, s + if olds == s: s = '' return True - else: - olds = s - return False + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val -def read(port, name, initstr): - global s,simtime,retrycount - time.sleep(delay) try: - infile = open(inpath+str(port)+"/"+name); - ins = infile.read() - except: - ins = initstr - while len(ins)==0: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: time.sleep(delay) - ins = infile.read() + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 retrycount += 1 - s += ins - inval = literal_eval(ins) - simtime = max(simtime,inval[0]) - return inval[1:] - -def write(port, name, val, delta=0): - global outpath,simtime - if isinstance(val,str): - time.sleep(2*delay) - elif isinstance(val,list)==False: - print("mywrite must have list or str") - quit() + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins try: - with open(outpath+str(port)+"/"+name,"w") as outfile: - if isinstance(val,list): - outfile.write(str([simtime+delta]+val)) - simtime += delta - else: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: outfile.write(val) - except: - print("skipping"+outpath+str(port)+"/"+name); + except Exception as e: + print(f"Error writing to {file_path}: {e}") -def initval(simtime_val): +def initval(simtime_val_str): global simtime - val = literal_eval(simtime_val) - simtime = val[0] - return val[1:] + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funcall2.dir/concore2.py b/0mq/funcall2.dir/concore2.py index e3ec817..a018ddf 100644 --- a/0mq/funcall2.dir/concore2.py +++ b/0mq/funcall2.dir/concore2.py @@ -3,6 +3,7 @@ from ast import literal_eval import sys import re +import zmq # Added for ZeroMQ #if windows, create script to kill this process # because batch files don't provide easy way to know pid of last command @@ -12,15 +13,67 @@ with open("concorekill.bat","w") as fpid: fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") -try: - iport = literal_eval(open("concore.iport").read()) -except: - iport = dict() -try: - oport = literal_eval(open("concore.oport").read()) -except: - oport = dict() +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) s = '' olds = '' @@ -28,86 +81,183 @@ retrycount = 0 inpath = "./in" #must be rel path for local outpath = "./out" +simtime = 0 #9/21/22 try: - sparams = open(inpath+"1/concore.params").read() - if sparams[0] == '"': #windows keeps "" need to remove - sparams = sparams[1:] - sparams = sparams[0:sparams.find('"')] - if sparams != '{': - print("converting sparams: "+sparams) - sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" - print("converted sparams: " + sparams) - try: - params = literal_eval(sparams) - except: - print("bad params: "+sparams) -except: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") params = dict() + #9/30/22 -def tryparam(n,i): - try: - return params[n] - except: - return i +def tryparam(n, i): + return params.get(n, i) #9/12/21 def default_maxtime(default): global maxtime - try: - maxtime = literal_eval(open(inpath+"1/concore.maxtime").read()) - except: - maxtime = default + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + default_maxtime(100) def unchanged(): - global olds,s - if olds==s: + global olds, s + if olds == s: s = '' return True - else: - olds = s - return False + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val -def read(port, name, initstr): - global s,simtime,retrycount - time.sleep(delay) try: - infile = open(inpath+str(port)+"/"+name); - ins = infile.read() - except: - ins = initstr - while len(ins)==0: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: time.sleep(delay) - ins = infile.read() + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 retrycount += 1 - s += ins - inval = literal_eval(ins) - simtime = max(simtime,inval[0]) - return inval[1:] - -def write(port, name, val, delta=0): - global outpath,simtime - if isinstance(val,str): - time.sleep(2*delay) - elif isinstance(val,list)==False: - print("mywrite must have list or str") - quit() + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins try: - with open(outpath+str(port)+"/"+name,"w") as outfile: - if isinstance(val,list): - outfile.write(str([simtime+delta]+val)) - simtime += delta - else: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: outfile.write(val) - except: - print("skipping"+outpath+str(port)+"/"+name); + except Exception as e: + print(f"Error writing to {file_path}: {e}") -def initval(simtime_val): +def initval(simtime_val_str): global simtime - val = literal_eval(simtime_val) - simtime = val[0] - return val[1:] + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funcall_distributed.dir/concore2.py b/0mq/funcall_distributed.dir/concore2.py new file mode 100644 index 0000000..a018ddf --- /dev/null +++ b/0mq/funcall_distributed.dir/concore2.py @@ -0,0 +1,263 @@ +import time +import os +from ast import literal_eval +import sys +import re +import zmq # Added for ZeroMQ + +#if windows, create script to kill this process +# because batch files don't provide easy way to know pid of last command +# ignored for posix!=windows, because "concorepid" is handled by script +# ignored for docker (linux!=windows), because handled by docker stop +if hasattr(sys, 'getwindowsversion'): + with open("concorekill.bat","w") as fpid: + fpid.write("taskkill /F /PID "+str(os.getpid())+"\n") + +# --- ZeroMQ Integration Start --- +class ZeroMQPort: + def __init__(self, port_type, address, zmq_socket_type): + self.context = zmq.Context() + self.socket = self.context.socket(zmq_socket_type) + self.port_type = port_type # "bind" or "connect" + self.address = address + if self.port_type == "bind": + self.socket.bind(address) + print(f"ZMQ Port bound to {address}") + else: + self.socket.connect(address) + print(f"ZMQ Port connected to {address}") + +# Global ZeroMQ ports registry +zmq_ports = {} + +def init_zmq_port(port_name, port_type, address, socket_type_str): + """ + Initializes and registers a ZeroMQ port. + port_name (str): A unique name for this ZMQ port. + port_type (str): "bind" or "connect". + address (str): The ZMQ address (e.g., "tcp://*:5555", "tcp://localhost:5555"). + socket_type_str (str): String representation of ZMQ socket type (e.g., "REQ", "REP", "PUB", "SUB"). + """ + if port_name in zmq_ports: + print(f"ZMQ Port {port_name} already initialized.") + return # Avoid reinitialization + + try: + # Map socket type string to actual ZMQ constant (e.g., zmq.REQ, zmq.REP) + zmq_socket_type = getattr(zmq, socket_type_str.upper()) + zmq_ports[port_name] = ZeroMQPort(port_type, address, zmq_socket_type) + print(f"Initialized ZMQ port: {port_name} ({socket_type_str}) on {address}") + except AttributeError: + print(f"Error: Invalid ZMQ socket type string '{socket_type_str}'.") + except zmq.error.ZMQError as e: + print(f"Error initializing ZMQ port {port_name} on {address}: {e}") + except Exception as e: + print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") + +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") +# --- ZeroMQ Integration End --- + +def safe_literal_eval(filename, defaultValue): + try: + with open(filename, "r") as file: + return literal_eval(file.read()) + except (FileNotFoundError, SyntaxError, ValueError, Exception) as e: + # Keep print for debugging, but can be made quieter + # print(f"Info: Error reading {filename} or file not found, using default: {e}") + return defaultValue + +iport = safe_literal_eval("concore.iport", {}) +oport = safe_literal_eval("concore.oport", {}) + +s = '' +olds = '' +delay = 1 +retrycount = 0 +inpath = "./in" #must be rel path for local +outpath = "./out" +simtime = 0 + +#9/21/22 +try: + sparams_path = os.path.join(inpath + "1", "concore.params") + if os.path.exists(sparams_path): + with open(sparams_path, "r") as f: + sparams = f.read() + if sparams: # Ensure sparams is not empty + if sparams[0] == '"' and sparams[-1] == '"': #windows keeps "" need to remove + sparams = sparams[1:-1] + if sparams != '{' and not (sparams.startswith('{') and sparams.endswith('}')): # Check if it needs conversion + print("converting sparams: "+sparams) + sparams = "{'"+re.sub(';',",'",re.sub('=',"':",re.sub(' ','',sparams)))+"}" + print("converted sparams: " + sparams) + try: + params = literal_eval(sparams) + except Exception as e: + print(f"bad params content: {sparams}, error: {e}") + params = dict() + else: + params = dict() + else: + params = dict() +except Exception as e: + # print(f"Info: concore.params not found or error reading, using empty dict: {e}") + params = dict() + +#9/30/22 +def tryparam(n, i): + return params.get(n, i) + + +#9/12/21 +def default_maxtime(default): + global maxtime + maxtime_path = os.path.join(inpath + "1", "concore.maxtime") + maxtime = safe_literal_eval(maxtime_path, default) + +default_maxtime(100) + +def unchanged(): + global olds, s + if olds == s: + s = '' + return True + olds = s + return False + +def read(port_identifier, name, initstr_val): + global s, simtime, retrycount + + default_return_val = initstr_val + if isinstance(initstr_val, str): + try: + default_return_val = literal_eval(initstr_val) + except (SyntaxError, ValueError): + pass + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + message = zmq_p.socket.recv_json() + return message + except zmq.error.ZMQError as e: + print(f"ZMQ read error on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + except Exception as e: + print(f"Unexpected error during ZMQ read on port {port_identifier} (name: {name}): {e}. Returning default.") + return default_return_val + + try: + file_port_num = int(port_identifier) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return default_return_val + + time.sleep(delay) + file_path = os.path.join(inpath+str(file_port_num), name) + ins = "" + + try: + with open(file_path, "r") as infile: + ins = infile.read() + except FileNotFoundError: + ins = str(initstr_val) + except Exception as e: + print(f"Error reading {file_path}: {e}. Using default value.") + return default_return_val + + attempts = 0 + max_retries = 5 + while len(ins) == 0 and attempts < max_retries: + time.sleep(delay) + try: + with open(file_path, "r") as infile: + ins = infile.read() + except Exception as e: + print(f"Retry {attempts + 1}: Error reading {file_path} - {e}") + attempts += 1 + retrycount += 1 + + if len(ins) == 0: + print(f"Max retries reached for {file_path}, using default value.") + return default_return_val + + s += ins + try: + inval = literal_eval(ins) + if isinstance(inval, list) and len(inval) > 0: + current_simtime_from_file = inval[0] + if isinstance(current_simtime_from_file, (int, float)): + simtime = max(simtime, current_simtime_from_file) + return inval[1:] + else: + print(f"Warning: Unexpected data format in {file_path}: {ins}. Returning raw content or default.") + return inval + except Exception as e: + print(f"Error parsing content from {file_path} ('{ins}'): {e}. Returning default.") + return default_return_val + + +def write(port_identifier, name, val, delta=0): + global simtime + + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + zmq_p = zmq_ports[port_identifier] + try: + zmq_p.socket.send_json(val) + except zmq.error.ZMQError as e: + print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") + except Exception as e: + print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") + return + try: + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) + except ValueError: + print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") + return + + if isinstance(val, str): + time.sleep(2 * delay) + elif not isinstance(val, list): + print(f"File write to {file_path} must have list or str value, got {type(val)}") + return + + try: + with open(file_path, "w") as outfile: + if isinstance(val, list): + data_to_write = [simtime + delta] + val + outfile.write(str(data_to_write)) + simtime += delta + else: + outfile.write(val) + except Exception as e: + print(f"Error writing to {file_path}: {e}") + +def initval(simtime_val_str): + global simtime + try: + val = literal_eval(simtime_val_str) + if isinstance(val, list) and len(val) > 0: + first_element = val[0] + if isinstance(first_element, (int, float)): + simtime = first_element + return val[1:] + else: + print(f"Error: First element in initval string '{simtime_val_str}' is not a number. Using data part as is or empty.") + return val[1:] if len(val) > 1 else [] + else: + print(f"Error: initval string '{simtime_val_str}' is not a list or is empty. Returning empty list.") + return [] + + except Exception as e: + print(f"Error parsing simtime_val_str '{simtime_val_str}': {e}. Returning empty list.") + return [] \ No newline at end of file diff --git a/0mq/funcall_distributed.py b/0mq/funcall_distributed.py new file mode 100644 index 0000000..5f869c6 --- /dev/null +++ b/0mq/funcall_distributed.py @@ -0,0 +1,63 @@ +# funcall2_zmq.py +import time +import concore +import concore2 + +print("funcall using ZMQ via concore") + +# Initialize ZMQ REQ port using concore +concore.init_zmq_port( + port_name = PORT_NAME_IN_F1, + port_type="connect", + address="tcp://192.168.0.107:" + PORT_IN_F1, # Put the IP address which will Reply + socket_type_str="REQ" +) + +# Standard concore initializations +concore.delay = 0.07 +concore2.delay = 0.07 +concore2.inpath = concore.inpath +concore2.outpath = concore.outpath +concore2.simtime = 0 +concore.default_maxtime(100) +init_simtime_u_str = "[0.0, 0.0, 0.0]" +init_simtime_ym_str = "[0.0, 0.0, 0.0]" + +u = concore.initval(init_simtime_u_str) +ym = concore2.initval(init_simtime_ym_str) + +print(f"Initial u: {u}, ym: {ym}, concore.simtime: {concore.simtime}, concore2.simtime: {concore2.simtime}") +print(f"Max time: {concore.maxtime}") + +while concore2.simtime < concore.maxtime: + while concore.unchanged(): + # Assuming concore.iport['U'] is a file port (e.g., from cpymax.py) + u = concore.read(concore.iport['U'], "u", init_simtime_u_str) + # time.sleep(concore.delay) # Optional: if file reads are too fast in a loop + + data_to_send_u = [concore.simtime] + u + + concore.write(PORT_NAME_IN_F1, "u_signal", data_to_send_u) + + received_ym_data = concore.read(PORT_NAME_IN_F1, "ym_signal", init_simtime_ym_str) + + if isinstance(received_ym_data, list) and len(received_ym_data) > 0: + response_time = received_ym_data[0] + if isinstance(response_time, (int, float)): + concore2.simtime = response_time + ym = received_ym_data[1:] + else: + print(f"Warning: Received ZMQ data's first element is not time: {received_ym_data}. Using as is.") + ym = received_ym_data + else: + print(f"Warning: Received unexpected ZMQ data format: {received_ym_data}. Using default ym.") + ym = concore2.initval(init_simtime_ym_str) + + # Assuming concore.oport['Y'] is a file port (e.g., to cpymax.py) + concore2.write(concore.oport['Y'], "ym", ym) + + print(f"funcall ZMQ u={u} ym={ym} time={concore2.simtime}") + +print("funcall retry=" + str(concore.retrycount)) + +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/funcall_zmq.dir/concore2.py b/0mq/funcall_zmq.dir/concore2.py index 7b0b3b4..a018ddf 100644 --- a/0mq/funcall_zmq.dir/concore2.py +++ b/0mq/funcall_zmq.dir/concore2.py @@ -54,6 +54,13 @@ def init_zmq_port(port_name, port_type, address, socket_type_str): except Exception as e: print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") # --- ZeroMQ Integration End --- def safe_literal_eval(filename, defaultValue): @@ -207,16 +214,17 @@ def write(port_identifier, name, val, delta=0): print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") except Exception as e: print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") - return - + return try: - file_port_num = int(port_identifier) + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) except ValueError: print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") return - file_path = os.path.join(outpath+str(file_port_num), name) - if isinstance(val, str): time.sleep(2 * delay) elif not isinstance(val, list): diff --git a/0mq/funcall_zmq.py b/0mq/funcall_zmq.py index f0c2f33..b2f991d 100644 --- a/0mq/funcall_zmq.py +++ b/0mq/funcall_zmq.py @@ -1,39 +1,63 @@ # funcall2_zmq.py -import zmq -import time +import time import concore import concore2 -print("funcall using 0mq") +print("funcall using ZMQ via concore") -context = zmq.Context() -socket = context.socket(zmq.REQ) -socket.connect("tcp://localhost:2356") +# Initialize ZMQ REQ port using concore +concore.init_zmq_port( + port_name = PORT_NAME_F2_F1, + port_type="connect", + address="tcp://localhost:" + PORT_F2_F1, + socket_type_str="REQ" +) -concore.delay = 0.07 -concore2.delay = 0.07 +# Standard concore initializations +concore.delay = 0.07 +concore2.delay = 0.07 concore2.inpath = concore.inpath concore2.outpath = concore.outpath concore2.simtime = 0 -concore.default_maxtime(100) -init_simtime_u = "[0.0, 0.0, 0.0]" -init_simtime_ym = "[0.0, 0.0, 0.0]" +concore.default_maxtime(100) +init_simtime_u_str = "[0.0, 0.0, 0.0]" +init_simtime_ym_str = "[0.0, 0.0, 0.0]" -u = concore.initval(init_simtime_u) -ym = concore2.initval(init_simtime_ym) +u = concore.initval(init_simtime_u_str) +ym = concore2.initval(init_simtime_ym_str) + +print(f"Initial u: {u}, ym: {ym}, concore.simtime: {concore.simtime}, concore2.simtime: {concore2.simtime}") +print(f"Max time: {concore.maxtime}") while concore2.simtime < concore.maxtime: - while concore.unchanged(): - u = concore.read(concore.iport['U'], "u", init_simtime_u) - message = { - "action": "fun", - "params": {"u": [concore.simtime] + u} - } - socket.send_json(message) - response = socket.recv_json() - ym = response["ym"] - concore2.simtime = ym[0] - ym = ym[1:] + while concore.unchanged(): + # Assuming concore.iport['U'] is a file port (e.g., from cpymax.py) + u = concore.read(concore.iport['U'], "u", init_simtime_u_str) + # time.sleep(concore.delay) # Optional: if file reads are too fast in a loop + + data_to_send_u = [concore.simtime] + u + + concore.write(PORT_NAME_F2_F1, "u_signal", data_to_send_u) + + received_ym_data = concore.read(PORT_NAME_F2_F1, "ym_signal", init_simtime_ym_str) + + if isinstance(received_ym_data, list) and len(received_ym_data) > 0: + response_time = received_ym_data[0] + if isinstance(response_time, (int, float)): + concore2.simtime = response_time + ym = received_ym_data[1:] + else: + print(f"Warning: Received ZMQ data's first element is not time: {received_ym_data}. Using as is.") + ym = received_ym_data + else: + print(f"Warning: Received unexpected ZMQ data format: {received_ym_data}. Using default ym.") + ym = concore2.initval(init_simtime_ym_str) + + # Assuming concore.oport['Y'] is a file port (e.g., to cpymax.py) concore2.write(concore.oport['Y'], "ym", ym) - print(f"funcall 0mq u={u} ym={ym} time={concore2.simtime}") -print("retry=" + str(concore.retrycount)) \ No newline at end of file + + print(f"funcall ZMQ u={u} ym={ym} time={concore2.simtime}") + +print("funcall retry=" + str(concore.retrycount)) + +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/funcall_zmq2.dir/concore2.py b/0mq/funcall_zmq2.dir/concore2.py index 7b0b3b4..a018ddf 100644 --- a/0mq/funcall_zmq2.dir/concore2.py +++ b/0mq/funcall_zmq2.dir/concore2.py @@ -54,6 +54,13 @@ def init_zmq_port(port_name, port_type, address, socket_type_str): except Exception as e: print(f"An unexpected error occurred during ZMQ port initialization for {port_name}: {e}") +def terminate_zmq(): + for port in zmq_ports.values(): + try: + port.socket.close() + port.context.term() + except Exception as e: + print(f"Error while terminating ZMQ port {port.address}: {e}") # --- ZeroMQ Integration End --- def safe_literal_eval(filename, defaultValue): @@ -207,16 +214,17 @@ def write(port_identifier, name, val, delta=0): print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") except Exception as e: print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") - return - + return try: - file_port_num = int(port_identifier) + if isinstance(port_identifier, str) and port_identifier in zmq_ports: + file_path = os.path.join("../"+port_identifier, name) + else: + file_port_num = int(port_identifier) + file_path = os.path.join(outpath+str(file_port_num), name) except ValueError: print(f"Error: Invalid port identifier '{port_identifier}' for file operation. Must be integer or ZMQ name.") return - file_path = os.path.join(outpath+str(file_port_num), name) - if isinstance(val, str): time.sleep(2 * delay) elif not isinstance(val, list): diff --git a/0mq/funcall_zmq2.py b/0mq/funcall_zmq2.py index baff34b..13c6584 100644 --- a/0mq/funcall_zmq2.py +++ b/0mq/funcall_zmq2.py @@ -5,15 +5,11 @@ print("funcall using ZMQ via concore") -# ZMQ settings -ZMQ_PORT_NAME = "FUNCALL_REQ_PORT" -ZMQ_SERVER_ADDRESS = "tcp://localhost:2355" - # Initialize ZMQ REQ port using concore concore.init_zmq_port( - port_name=ZMQ_PORT_NAME, + port_name = PORT_NAME_IN_F1, port_type="connect", - address=ZMQ_SERVER_ADDRESS, + address="tcp://localhost:" + PORT_IN_F1, socket_type_str="REQ" ) @@ -41,9 +37,9 @@ data_to_send_u = [concore.simtime] + u - concore.write(ZMQ_PORT_NAME, "u_signal", data_to_send_u) + concore.write(PORT_NAME_IN_F1, "u_signal", data_to_send_u) - received_ym_data = concore.read(ZMQ_PORT_NAME, "ym_signal", init_simtime_ym_str) + received_ym_data = concore.read(PORT_NAME_IN_F1, "ym_signal", init_simtime_ym_str) if isinstance(received_ym_data, list) and len(received_ym_data) > 0: response_time = received_ym_data[0] @@ -62,4 +58,6 @@ print(f"funcall ZMQ u={u} ym={ym} time={concore2.simtime}") -print("funcall retry=" + str(concore.retrycount)) \ No newline at end of file +print("funcall retry=" + str(concore.retrycount)) + +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/secondNode.py b/0mq/secondNode.py new file mode 100644 index 0000000..dcb2b49 --- /dev/null +++ b/0mq/secondNode.py @@ -0,0 +1,33 @@ +# secondNode.py (Server B) +import concore + +# --- ZMQ Initialization --- +# This REP socket binds and waits for Node A to connect and send a request. +concore.init_zmq_port( + port_name=f"0x{PORT_F1_F2}_{PORT_NAME_F1_F2}", + port_type="bind", + address="tcp://*:" + PORT_F1_F2, + socket_type_str="REP" +) + +print("Node B server started. Waiting for requests...") + +while True: + # Wait to receive a request from Node A + received_data = concore.read(f"0x{PORT_F1_F2}_{PORT_NAME_F1_F2}", "value", [0.0]) + received_value = received_data[0] + + print(f"Node B: Received {received_value:.2f} from Node A.") + + # Process the value + new_value = received_value + 0.01 + print(f"Node B: Sending back processed value {new_value:.2f}.") + + # Send the reply back to Node A + concore.write(f"0x{PORT_F1_F2}_{PORT_NAME_F1_F2}", "value", [new_value]) + + if new_value > 100: + break + +print("\nNode B: Terminating.") +concore.terminate_zmq() \ No newline at end of file diff --git a/0mq/semicyclic.graphml b/0mq/semicyclic.graphml new file mode 100644 index 0000000..c6de060 --- /dev/null +++ b/0mq/semicyclic.graphml @@ -0,0 +1,760 @@ + + + + + + + + + + + + F1:firstNode.py + + + + + + + + + + + F2:secondNode.py + + + + + + + + + + + F3:thirdNode.py + + + + + + + + + + 0x1234_U1 + + + + + + + + + + + + 0x1235_U2 + + + + + + + + 1664644923582 + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + a53a7f7273a40c7970938b6de1829249 + + + 1664644939781 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d + + 3d4a875a8a6ea281598aa70364b0ea82 + + + 1664644951652 + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + 5ed7e3d12fd25656b2ad03e29c307d65 + + + 1664644958838 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= + + 35c613c8203b65e1f44e066b3d783143 + + + 1664644988539 + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + + ADD_NODE + WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd + + 33d0b0cc4d3dbe3c42323e33f06993e9 + + + 1664645002278 + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + + ADD_NODE + WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 8d0d4a735631afe6241c66143fb29db8 + + + 1664645010353 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d + + 8a01a9ca8b3706bc3b1ce4de33669b6d + + + 1664645015576 + + DEL_EDGE + WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= + + 14416fc2e3c48db65e2b5e1012027ee0 + + + 1664645043815 + + DEL_EDGE + WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d + + 326a920ffd7e662bc64ca95c086fb9de + + + 1664645057658 + + DEL_EDGE + WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d + + 4593337e9924ae4b23dc5c5576c31394 + + + 1664645068951 + + DEL_EDGE + WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d + + 568d8b7a109ffacc4b912095793cb2ca + + + 1664645081283 + + DEL_EDGE + WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d + + 0d0aa0179f22f9d73a11f8ccfbcc145e + + + 1664645089735 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d + + 1c19591402c0f2daca7d2b4a8af5e956 + + + 1664645092868 + + DEL_EDGE + WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= + + 3c913497d8aa8f1c79bbdc03c3feec16 + + + 1664645142026 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= + + ecbd46b28ecaf800c8da0d2ada69b4de + + + 1664645149601 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== + + ea35c112764d7964f8b7e35e9a18efbd + + + 1664645223291 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d + + d669d3d37a4693ad860a18c69999b31f + + + 1664645228453 + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + + SET_POS + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d + + f7eb6af4003cb4eff19f39421fc00174 + + + 1664645231883 + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + + SET_POS + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== + + 49dd0c2013be6e39c2f11ea967dbcab4 + + + 1664645237206 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== + + 009fc03903a9ae6003caea49a6575ddb + + + 1666487497309 + + ADD_EDGE + W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= + + + DEL_EDGE + WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== + + 4957bb66f70bda073e7edafdad81f6b4 + + + 1666487500685 + + ADD_EDGE + W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== + + + DEL_EDGE + WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== + + c8d5e89e2630a4a0aa607594e14861d1 + + + 1666487596231 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4Ijo2MDEsInkiOjIwNC43NzM2MjI4MjYyMzMxMn1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6NjAxLCJ5IjoyMDQuNzczNjIyODI2MjMzMTJ9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d + + c7aeac0c4601154d11c4c4068f631c62 + + + 1666487606788 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6MzQ2LjIyMzc5NjQ1MDU3NjIsInkiOjE5Mi4zMjAxMjcwNjgyNTY0fV0= + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MzQ2LjIyMzc5NjQ1MDU3NjIsInkiOjE5Mi4zMjAxMjcwNjgyNTY0fSx7IngiOi0xMzcuNzc2MjAzNTQ5NDIzODMsInkiOjkxLjMyMDEyNzA2ODI1NjQxfV0= + + 600af97eb5c4cc3a573f65c724b85ae9 + + + 1666488874534 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MzQ2LjIyMzc5NjQ1MDU3NjIsInkiOjI0Ni4zMjAxMjcwNjgyNTY0fSx7IngiOjM0Mi4yMjM3OTY0NTA1NzYyLCJ5IjoyMDkuMzIwMTI3MDY4MjU2NH1d + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MzQyLjIyMzc5NjQ1MDU3NjIsInkiOjIwOS4zMjAxMjcwNjgyNTY0fSx7IngiOjM0Ni4yMjM3OTY0NTA1NzYyLCJ5IjoyNDYuMzIwMTI3MDY4MjU2NH1d + + ea3cf1656cbb3323791a747bcb8f624c + + + 1666810512066 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5LnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + 33c0759e9ca1d4d92639a94477c9b052 + + + 1666810533063 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjExMSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsLnB5Iix0cnVlXQ== + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + 06d61b24bc2485f9464f3e2751d1409a + + + 1748868954808 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5My5weSIsdHJ1ZV0= + + 4afd9af5e90936e999770a941ab0ace6 + + + 1748868975001 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1MCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcS5weSIsdHJ1ZV0= + + 38c7cf57be2a0a3b4b1bafb14e9d29fb + + + 1748868991559 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5My5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2MSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcS5weSIsdHJ1ZV0= + + 16982a4aa4703d98fc301e30aed0d25a + + + 1748971661849 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2MSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcS5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + bc5037b25958965e670ba8b2200dbcf3 + + + 1748971670391 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1MCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcS5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd + + 7bcfd7cb9bf8eaae8a615d108c4264ac + + + 1749318672556 + + ADD_EDGE + W3sibGFiZWwiOiJZMiIsInNvdXJjZSI6ImFmYjAzNDY1LTlkYTUtNGM5Yy1iNTU3LTY3YmExNWEwOWM4YyIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjo1Ni4yNDgxODU0MzEzMjI1MiwiYmVuZFdlaWdodCI6MC41Nzk3MjkyNTM1NjY5MjUzLCJiZW5kUG9pbnQiOnsieCI6NDA2LjE4NTQ4NTgzMjY5OTA0LCJ5IjozNS43MjY5MDYwMTkwMjY1N319LCJzb3VyY2VJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsInRhcmdldElEIjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwidHlwZSI6Im9yZGluIiwiaWQiOiIwODkwMzhiYi01N2FlLTQxNzctOTIyYy1hODlhZTUzNmI0OTIifV0= + + + DEL_EDGE + WyIwODkwMzhiYi01N2FlLTQxNzctOTIyYy1hODlhZTUzNmI0OTIiXQ== + + 3990ececb72b73c95733b084e3cc7123 + + + 1749318672556 + + ADD_EDGE + W3sibGFiZWwiOiJVMiIsInNvdXJjZSI6Ijk2MzAwMjYyLTViZTItNGJkYS1iMzFlLTg0ZjFlNTQ3NTAyMCIsInRhcmdldCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotMi4wOTQwNjk0NzAzMjY0MjA3ZS03LCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwMDAwMjI5NDQsImJlbmRQb2ludCI6eyJ4Ijo1MDMuODM4MjI0NDY2MDkwNCwieSI6MTAwLjYwNjY3Mzk1NTc4MjMzfX0sInNvdXJjZUlEIjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwidGFyZ2V0SUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0eXBlIjoib3JkaW4iLCJpZCI6Ijg3NDdjODdmLWQyMTAtNDNlMy1iNDkyLTk1MWUyNWU0ZjczNSJ9XQ== + + + DEL_EDGE + WyI4NzQ3Yzg3Zi1kMjEwLTQzZTMtYjQ5Mi05NTFlMjVlNGY3MzUiXQ== + + bc22fd0050cd9fc5356061967027baea + + + 1749318672556 + + ADD_NODE + WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJpZCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiUFo6cG1weW1heC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd + + + DEL_NODE + WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== + + 7a0221fd2f4d6714160cb1dadda127a4 + + + 1749318672556 + + ADD_EDGE + W3sibGFiZWwiOiJVIiwic291cmNlIjoiMTc5YTFlNzItMmU2Zi00NDBhLWFjMzItNDkyNWIwNmM4NDgwIiwidGFyZ2V0IjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjAuMDAwMDI3OTU5OTI5MzQyNjgwMjEyLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwMDA2MDA2MTEsImJlbmRQb2ludCI6eyJ4Ijo1MDIuMTExODk4NzI4MzI3NDUsInkiOjIwNi41MTEwNDYwNjE2NDI4fX0sInNvdXJjZUlEIjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwidGFyZ2V0SUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0eXBlIjoib3JkaW4iLCJpZCI6Ijg4OGQ2YTQ5LTQxOTMtNDMxYi04ZGRkLTY2ZDkxOWQyMmUxYyJ9XQ== + + + DEL_EDGE + WyI4ODhkNmE0OS00MTkzLTQzMWItOGRkZC02NmQ5MTlkMjJlMWMiXQ== + + 49b2893c7c3877d7d726ef11cb1b488b + + + 1749318672556 + + ADD_EDGE + W3sibGFiZWwiOiJZIiwic291cmNlIjoiOTY4M2RjZDMtYjJjNC00ZmRiLTgxOTMtNDIzMzdkMGViM2VhIiwidGFyZ2V0IjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjU0LjgyNzk4OTUzNTk2MjUyLCJiZW5kV2VpZ2h0IjowLjU3MjM4MjA2MDg3MzY3MjUsImJlbmRQb2ludCI6eyJ4Ijo0MTAuNzMxNDI0MTY5MzA0OTQsInkiOjE0My41NzI0MTkzMDc0NDYzOH19LCJzb3VyY2VJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInRhcmdldElEIjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkZDgxOTE0NS01MTA3LTQ5ZmQtYmI3OC0wODI0MmNmODljNjEifV0= + + + DEL_EDGE + WyJkZDgxOTE0NS01MTA3LTQ5ZmQtYmI3OC0wODI0MmNmODljNjEiXQ== + + dd0af86450207de6e25e796f240fe912 + + + 1749318672556 + + ADD_NODE + WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjozNDIuMjIzNzk2NDUwNTc2MiwieSI6MjA5LjMyMDEyNzA2ODI1NjR9LHsiaWQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJsYWJlbCI6IkNaOmNweW1heC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMjIsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd + + + DEL_NODE + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== + + 2e04cc361b16f90c6fb64ee6325740f3 + + + 1749318672556 + + ADD_NODE + WyJGMTpmdW5jYWxsX3ptcTIucHkiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4Ijo2MDEsInkiOjIwNC43NzM2MjI4MjYyMzMxMn0seyJpZCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiRjE6ZnVuY2FsbF96bXEyLnB5IiwidHlwZSI6Im9yZGluIiwic3R5bGUiOnsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9fSwiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIl0= + + + DEL_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== + + 005221fcf3c3cd5137a54ed1e14a866e + + + 1749318672556 + + ADD_NODE + WyJGMjpmdW5ib2R5X3ptcTIucHkiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJpZCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiRjI6ZnVuYm9keV96bXEyLnB5IiwidHlwZSI6Im9yZGluIiwic3R5bGUiOnsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9fSwiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4Il0= + + + DEL_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== + + 44570216570ee4c15fd928f792f94d7f + + + 1749318681043 + + DEL_NODE + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiXQ== + + + ADD_NODE + WyJGMTpmaXJzdE5vZGUucHkiLHsid2lkdGgiOjEyOCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4Ijo5MSwieSI6MTAyfSx7fSwiY2Q0ZjA1NjUtMjI4ZS00NTRjLWFjZWQtYTA2OGM1MWRhNGU5Il0= + + e6cc6e04b9199acd990c213567fc7f5c + + + 1749318695675 + + DEL_NODE + WyI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiXQ== + + + ADD_NODE + WyJGMjpzZWNvbmROb2RlLnB5Iix7IndpZHRoIjoxNTQsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6Mzc4LCJ5IjoyNzR9LHt9LCI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiXQ== + + 82cdd148cca83ffa4cf77913aa7c34b5 + + + 1749318699837 + + SET_POS + WyI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzg0LCJ5IjoyNDJ9XQ== + + + SET_POS + WyI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiLHsieCI6Mzg0LCJ5IjoyNDJ9LHsieCI6MTEwLCJ5IjoxMTB9XQ== + + 188acf262a649e90a949e38a63235320 + + + 1749318708081 + + DEL_NODE + WyI1MWU0MjNmMi1hNTMwLTRkMjYtYTg4My00ZGVmZGYzYzVkMGYiXQ== + + + ADD_NODE + WyJGMzp0aGlyZE5vZGUucHkiLHsid2lkdGgiOjEzNCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjozNzYsInkiOi00OX0se30sIjUxZTQyM2YyLWE1MzAtNGQyNi1hODgzLTRkZWZkZjNjNWQwZiJd + + 114b3ba9ee328482f15477d7e9258154 + + + 1749318711764 + + SET_POS + WyI1MWU0MjNmMi1hNTMwLTRkMjYtYTg4My00ZGVmZGYzYzVkMGYiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzc2LCJ5IjotNDl9XQ== + + + SET_POS + WyI1MWU0MjNmMi1hNTMwLTRkMjYtYTg4My00ZGVmZGYzYzVkMGYiLHsieCI6Mzc2LCJ5IjotNDl9LHsieCI6MTEwLCJ5IjoxMTB9XQ== + + 96f3d5361de38f5b38a5d0fd6706f641 + + + 1749318713866 + + DEL_EDGE + WyI3ZjBlYWI5Zi0yMTUyLTQ1ZjgtODJlNi05NjEzODY4MzdhNjUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLCJ0YXJnZXRJRCI6IjQ2YmQ3ZjZlLTE5YzEtNGUyZS04Y2QwLTVhNmFmM2M0NzA5MSIsImxhYmVsIjoiMHgxMjM0X1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI3ZjBlYWI5Zi0yMTUyLTQ1ZjgtODJlNi05NjEzODY4MzdhNjUifV0= + + 854cb9b399afdd31e878682fd203bc4e + + + 1749318725650 + + DEL_EDGE + WyJiMTM0YjdlMC1jYjkyLTQyOWQtYTE3Ny1hNzQ2ZjIzZTNkYmIiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiLCJ0YXJnZXRJRCI6IjUxZTQyM2YyLWE1MzAtNGQyNi1hODgzLTRkZWZkZjNjNWQwZiIsImxhYmVsIjoiMHgxMjM1X1UyIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJiMTM0YjdlMC1jYjkyLTQyOWQtYTE3Ny1hNzQ2ZjIzZTNkYmIifV0= + + 7857de46290ae0ae191e06f17512ed9a + + + 1749318735430 + + DEL_EDGE + WyJkOTIzYjZmOC0xMzMxLTRiOTMtYjI3Zi02ZTk0Mjc5OTQyNGUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI1MWU0MjNmMi1hNTMwLTRkMjYtYTg4My00ZGVmZGYzYzVkMGYiLCJ0YXJnZXRJRCI6ImNkNGYwNTY1LTIyOGUtNDU0Yy1hY2VkLWEwNjhjNTFkYTRlOSIsImxhYmVsIjoiMHgxMjM2X1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJkOTIzYjZmOC0xMzMxLTRiOTMtYjI3Zi02ZTk0Mjc5OTQyNGUifV0= + + bc781021d33b4dc0502af8183fea5cdb + + + 1749318750730 + + SET_POS + WyI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiLHsieCI6Mzg0LCJ5IjoyNDJ9LHsieCI6Mzc4LCJ5IjoyNzR9XQ== + + + SET_POS + WyI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiLHsieCI6Mzc4LCJ5IjoyNzR9LHsieCI6Mzg0LCJ5IjoyNDJ9XQ== + + 8b9404801550cec3a09afef7cd50c913 + + + 1749318762309 + + SET_POS + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTEsInkiOjEwMn1d + + + SET_POS + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLHsieCI6OTEsInkiOjEwMn0seyJ4IjoxMDAsInkiOjEwMH1d + + 2db82a56f25b69a256e0c7d14227f08d + + + 1749324626651 + + ADD_EDGE + W3sibGFiZWwiOiIweDEyMzVfVTIiLCJzb3VyY2UiOiI2MTViZTQxMi1iNDMwLTQzNzItYTA0Yi1iNDNmNjk1NzM0OTUiLCJ0YXJnZXQiOiI1MWU0MjNmMi1hNTMwLTRkMjYtYTg4My00ZGVmZGYzYzVkMGYiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotMC4wMzU1MjAzNTg0OTk0MjUwMywiYmVuZFdlaWdodCI6MC41MDAwMDA3MzgwNDA1NTA4LCJiZW5kUG9pbnQiOnsieCI6Mzc2Ljg4NDUyNzc4MDk2ODcsInkiOjk5Ljk5OTk5OTM5MTcwNzMyfX0sInNvdXJjZUlEIjoiNDZiZDdmNmUtMTljMS00ZTJlLThjZDAtNWE2YWYzYzQ3MDkxIiwidGFyZ2V0SUQiOiI1MWU0MjNmMi1hNTMwLTRkMjYtYTg4My00ZGVmZGYzYzVkMGYiLCJ0eXBlIjoib3JkaW4iLCJpZCI6IjAxZmQ4ZGYzLWU4ZWMtNDVmOC1iOTlkLTY4ZGNiNjZhMDYyNSJ9XQ== + + + DEL_EDGE + WyIwMWZkOGRmMy1lOGVjLTQ1ZjgtYjk5ZC02OGRjYjY2YTA2MjUiXQ== + + 2f2e4b26b791be0394e33c8fc7569982 + + + 1749324631928 + + UPDATE_EDGE + WyJmMmFkYzU0OS0xNTIyLTRhM2EtYWJjZi1kMmM0MTFjYmMwYjUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MTIzNF9VMSIsdHJ1ZV0= + + + UPDATE_EDGE + WyJmMmFkYzU0OS0xNTIyLTRhM2EtYWJjZi1kMmM0MTFjYmMwYjUiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MTIzNF9VMSIsdHJ1ZV0= + + 156ec0a2daad8c0c3a38b89c57aa9c50 + + + 1749324646397 + + ADD_EDGE + W3sibGFiZWwiOiIweDEyMzRfVTEiLCJzb3VyY2UiOiIxYWYyOTZhZC04ZDdmLTQ0ZjEtOGRkYS0yYjRkMjZhYzY4OGIiLCJ0YXJnZXQiOiI0NmJkN2Y2ZS0xOWMxLTRlMmUtOGNkMC01YTZhZjNjNDcwOTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjA0Nzg1Mjk5Mzk0MzY0OTgzNSwiYmVuZFdlaWdodCI6MC40OTk3MjA3NzQwMjk2NDY0MywiYmVuZFBvaW50Ijp7IngiOjI1NS4yNTI2NTA5MTk0NDYsInkiOjIwMC41MDAwMDEwNDQ2NzEyNX19LCJzb3VyY2VJRCI6ImNkNGYwNTY1LTIyOGUtNDU0Yy1hY2VkLWEwNjhjNTFkYTRlOSIsInRhcmdldElEIjoiNDZiZDdmNmUtMTljMS00ZTJlLThjZDAtNWE2YWYzYzQ3MDkxIiwidHlwZSI6Im9yZGluIiwiaWQiOiJmMmFkYzU0OS0xNTIyLTRhM2EtYWJjZi1kMmM0MTFjYmMwYjUifV0= + + + DEL_EDGE + WyJmMmFkYzU0OS0xNTIyLTRhM2EtYWJjZi1kMmM0MTFjYmMwYjUiXQ== + + a03366277b8ab8b2241cd9b67857df54 + + + 1749324652309 + + DEL_EDGE + WyI5MGZmYThhOC00Yjg5LTQzZmItYWMxYy1iY2NkMjRmNWUxNWIiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLCJ0YXJnZXRJRCI6IjQ2YmQ3ZjZlLTE5YzEtNGUyZS04Y2QwLTVhNmFmM2M0NzA5MSIsImxhYmVsIjoiMHgxMjM0X1UxIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI5MGZmYThhOC00Yjg5LTQzZmItYWMxYy1iY2NkMjRmNWUxNWIifV0= + + f39b5ddb66988d2bc1aac805dc5ed4ff + + + 1749324661797 + + ADD_EDGE + W3sibGFiZWwiOiIweDEyMzZfVTMiLCJzb3VyY2UiOiJjMDhlYjQ0OC0yYjZmLTQ5ZWItOGZlYS02MWMwOTllYWRlYjEiLCJ0YXJnZXQiOiJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotMC4wMTA3NjE2ODYyMzk3Njc2OTgsImJlbmRXZWlnaHQiOjAuNDk5OTI0NTI4Mzc2NzE3MjUsImJlbmRQb2ludCI6eyJ4IjoyMDkuOTMzNTM2ODcwMjg1ODgsInkiOjM5LjAwMDAwMDA1NzIzMjg3NH19LCJzb3VyY2VJRCI6IjUxZTQyM2YyLWE1MzAtNGQyNi1hODgzLTRkZWZkZjNjNWQwZiIsInRhcmdldElEIjoiY2Q0ZjA1NjUtMjI4ZS00NTRjLWFjZWQtYTA2OGM1MWRhNGU5IiwidHlwZSI6Im9yZGluIiwiaWQiOiIwZTIwOGM0OC0xZTQxLTQ1NzAtOTUxOS0xZjJjZTdhY2VkYWUifV0= + + + DEL_EDGE + WyIwZTIwOGM0OC0xZTQxLTQ1NzAtOTUxOS0xZjJjZTdhY2VkYWUiXQ== + + 36fd9c94737647dc64c1cbd858f17a71 + + + 1749324663715 + + SET_POS + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLHsieCI6OTEsInkiOjEwMn0seyJ4IjoxMDcsInkiOjExM31d + + + SET_POS + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLHsieCI6MTA3LCJ5IjoxMTN9LHsieCI6OTEsInkiOjEwMn1d + + b9eb92a0be11f002aa9195078b2e4335 + + + 1749324664642 + + SET_POS + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLHsieCI6MTA3LCJ5IjoxMTN9LHsieCI6OTksInkiOjkyfV0= + + + SET_POS + WyJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLHsieCI6OTksInkiOjkyfSx7IngiOjEwNywieSI6MTEzfV0= + + fc44d62c1d80232d1c1338985ec1f417 + + + 1749324666770 + + DEL_EDGE + WyI3Y2ViYTQxZS00YWNhLTRmYWEtYmU0Yy0xOGYyMjQ3NDNhYzgiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJjZDRmMDU2NS0yMjhlLTQ1NGMtYWNlZC1hMDY4YzUxZGE0ZTkiLCJ0YXJnZXRJRCI6IjUxZTQyM2YyLWE1MzAtNGQyNi1hODgzLTRkZWZkZjNjNWQwZiIsImxhYmVsIjoiMHgxMjM1X1UyIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI3Y2ViYTQxZS00YWNhLTRmYWEtYmU0Yy0xOGYyMjQ3NDNhYzgifV0= + + 00bc1b6fd722b4e6618ffc9f83206e6d + + + \ No newline at end of file diff --git a/0mq/test0mq4.graphml b/0mq/test0mq4.graphml index 4206ece..ef6b503 100644 --- a/0mq/test0mq4.graphml +++ b/0mq/test0mq4.graphml @@ -2,7 +2,7 @@ - + @@ -17,7 +17,7 @@ - + CZ:cpymax.py @@ -28,10 +28,10 @@ - + - F1:funcall_zmq2.py + F1:funcall_zmq.py @@ -42,7 +42,7 @@ - F2:funbody_zmq2.py + F2:funbody_zmq.py @@ -54,7 +54,7 @@ U - + @@ -66,7 +66,7 @@ Y - + @@ -78,7 +78,7 @@ U2 - + @@ -90,7 +90,19 @@ Y2 - + + + + + + + + + + + 0x1234_U3 + + @@ -479,5 +491,113 @@ 7bcfd7cb9bf8eaae8a615d108c4264ac + + 1749405667763 + + DEL_EDGE + WyI0ZDNkNDNjMC0yYmMzLTQ0NDctODgzYS1mYjAyYjI2ZWJkNDIiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgxMjM0X1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI0ZDNkNDNjMC0yYmMzLTQ0NDctODgzYS1mYjAyYjI2ZWJkNDIifV0= + + 837a51f51a8a374cba2c9ef8b8092462 + + + 1749405684095 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6NjAxLCJ5IjoyMDQuNzczNjIyODI2MjMzMTJ9LHsieCI6NjAzLCJ5IjozMDYuNzczNjIyODI2MjMzMX1d + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6NjAzLCJ5IjozMDYuNzczNjIyODI2MjMzMX0seyJ4Ijo2MDEsInkiOjIwNC43NzM2MjI4MjYyMzMxMn1d + + 916e93c225b2ece30179d329085e51d3 + + + 1749405686595 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MzQyLjIyMzc5NjQ1MDU3NjIsInkiOjIwOS4zMjAxMjcwNjgyNTY0fSx7IngiOjI2MC4yMjM3OTY0NTA1NzYyLCJ5IjozMTEuMzIwMTI3MDY4MjU2NH1d + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MjYwLjIyMzc5NjQ1MDU3NjIsInkiOjMxMS4zMjAxMjcwNjgyNTY0fSx7IngiOjM0Mi4yMjM3OTY0NTA1NzYyLCJ5IjoyMDkuMzIwMTI3MDY4MjU2NH1d + + ec064d1ca492b3c62e01e9653d3742c2 + + + 1749405711784 + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgxMjM0X1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwidHlwZSI6Im9yZGluIiwic291cmNlIjoiZjQ4YjA1YWQtYWJmMi00YmVjLTk2ZjUtMjI5ZjY3YTBiNmI1IiwidGFyZ2V0IjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLCJiZW5kV2VpZ2h0IjowLjUsImJlbmRQb2ludCI6eyJ4Ijo0ODUuNzEzOTY5ODQ4MzQ3NCwieSI6MjE2LjM1NTY1NzYzNTc2ODN9fSwiaWQiOiI0ZDNkNDNjMC0yYmMzLTQ0NDctODgzYS1mYjAyYjI2ZWJkNDIifV0= + + + DEL_EDGE + WyI0ZDNkNDNjMC0yYmMzLTQ0NDctODgzYS1mYjAyYjI2ZWJkNDIiXQ== + + e154e83cc14ebdad21484178af33f2da + + + 1749405713782 + + DEL_EDGE + WyJhM2VkNTQzMC0wZTIwLTQxNmEtODE4OC01OTA2ZDAxNzYzNjUiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiMHgxMjM0X1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJhM2VkNTQzMC0wZTIwLTQxNmEtODE4OC01OTA2ZDAxNzYzNjUifV0= + + 49e8c4ceae4a8e0ad4307c028a1c3aa4 + + + 1749405909129 + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiMHgxMjM0X1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwidHlwZSI6Im9yZGluIiwic291cmNlIjoiZjlhOTJkZDMtZDAyNC00MWQ2LTk4NjktN2QwZWVkN2Q2NDBkIiwidGFyZ2V0IjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLCJiZW5kV2VpZ2h0IjowLjUsImJlbmRQb2ludCI6eyJ4Ijo0NTMuMjk2MDgwMDE3MDcwMTUsInkiOjE5MS4zNTU2NTc2MzU3NjgzfX0sImlkIjoiYTNlZDU0MzAtMGUyMC00MTZhLTgxODgtNTkwNmQwMTc2MzY1In1d + + + DEL_EDGE + WyJhM2VkNTQzMC0wZTIwLTQxNmEtODE4OC01OTA2ZDAxNzYzNjUiXQ== + + 0ee542e0a45c8fd2aeb96d80ad1213b1 + + + 1749405910993 + + DEL_EDGE + WyI1MzhjMTExYy1hZjNmLTQ0MjgtYTQyMy1hNThjYTg3MjJlMDkiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgxMjM0X1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiI1MzhjMTExYy1hZjNmLTQ0MjgtYTQyMy1hNThjYTg3MjJlMDkifV0= + + 72dc7bacfcd3ba72d7816cd544af76cd + + + 1749406018861 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcS5weSIsdHJ1ZV0= + + aa81002d2e8b9cbdeb150e2710cf3dbb + + + 1749406093511 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcS5weSIsdHJ1ZV0= + + 6455bbb0a3114ec3ba44920b64bd0266 + \ No newline at end of file diff --git a/0mq/test0mqbody2.graphml b/0mq/test0mqbody2.graphml index cd69805..458857a 100644 --- a/0mq/test0mqbody2.graphml +++ b/0mq/test0mqbody2.graphml @@ -2,7 +2,7 @@ - + @@ -17,10 +17,21 @@ - + - F2:funbody2.py + F2:funbody_zmq2.py + + + + + + + + + + + OUT: @@ -32,7 +43,7 @@ Y2 - + @@ -44,14 +55,25 @@ U2 - + + + + + + + + + + + 0x2405_U3 + + 1664644923582 - mark DEL_NODE WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== @@ -60,11 +82,10 @@ ADD_NODE WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd - ea1f3ba8fe573453400ffda5fad41219 + a53a7f7273a40c7970938b6de1829249 1664644939781 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d @@ -73,11 +94,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d - 4d28b3ac41cd2913a677da0a4b65b424 + 3d4a875a8a6ea281598aa70364b0ea82 1664644951652 - mark DEL_NODE WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== @@ -86,11 +106,10 @@ ADD_NODE WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd - 7d1c82d143a33ca11a4f968849bad104 + 5ed7e3d12fd25656b2ad03e29c307d65 1664644958838 - mark SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= @@ -99,11 +118,10 @@ SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= - 2e1ad74435543de42a296bb9a0620e63 + 35c613c8203b65e1f44e066b3d783143 1664644988539 - mark DEL_NODE WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== @@ -112,11 +130,10 @@ ADD_NODE WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd - ed42ad47c94f87d676c7c83ce9ded915 + 33d0b0cc4d3dbe3c42323e33f06993e9 1664645002278 - mark DEL_NODE WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== @@ -125,11 +142,10 @@ ADD_NODE WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== - 0f42a42f08b5d6633750c6cd0a52cd7f + 8d0d4a735631afe6241c66143fb29db8 1664645010353 - mark SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d @@ -138,11 +154,10 @@ SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d - 9ed03855520c803cecdd1d7497a92151 + 8a01a9ca8b3706bc3b1ce4de33669b6d 1664645015576 - mark DEL_EDGE WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== @@ -151,11 +166,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= - 725908dc36e7bc154d1d8dd0e98a412d + 14416fc2e3c48db65e2b5e1012027ee0 1664645043815 - mark DEL_EDGE WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== @@ -164,11 +178,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d - 9f18da8775e24b7f2f9902f2842eb63e + 326a920ffd7e662bc64ca95c086fb9de 1664645057658 - mark DEL_EDGE WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== @@ -177,11 +190,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d - 3e1c6e41350aaf47123ec7cf25e1b62c + 4593337e9924ae4b23dc5c5576c31394 1664645068951 - mark DEL_EDGE WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== @@ -190,11 +202,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d - 269c6a2baeea1b2785ce71ff56f4a76d + 568d8b7a109ffacc4b912095793cb2ca 1664645081283 - mark DEL_EDGE WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== @@ -203,11 +214,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d - 3c7cb858225e79ecf43defb7b70197a6 + 0d0aa0179f22f9d73a11f8ccfbcc145e 1664645089735 - mark SET_POS WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d @@ -216,11 +226,10 @@ SET_POS WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d - b6b4fcd96e508461f87e4513dbd0170e + 1c19591402c0f2daca7d2b4a8af5e956 1664645092868 - mark DEL_EDGE WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== @@ -229,11 +238,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= - f2a382cf010520ed6d8d1167488af14c + 3c913497d8aa8f1c79bbdc03c3feec16 1664645142026 - mark SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= @@ -242,11 +250,10 @@ SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= - 5fc1c53a84494c7b3b749c475cf09d33 + ecbd46b28ecaf800c8da0d2ada69b4de 1664645149601 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== @@ -255,11 +262,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== - 627a3a19a5e310402ab0c81e854bb1aa + ea35c112764d7964f8b7e35e9a18efbd 1664645223291 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d @@ -268,11 +274,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d - 65480a229a142f0b48daa6727b8aae7b + d669d3d37a4693ad860a18c69999b31f 1664645228453 - mark SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d @@ -281,11 +286,10 @@ SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d - 1359e922778d54bbfc88d8040c764247 + f7eb6af4003cb4eff19f39421fc00174 1664645231883 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== @@ -294,11 +298,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== - ef15c4c7e39dcf45dee8b9e5d071d32f + 49dd0c2013be6e39c2f11ea967dbcab4 1664645237206 - mark SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== @@ -307,11 +310,10 @@ SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== - a8ef099b87ae2a958e58d7b138deb5f5 + 009fc03903a9ae6003caea49a6575ddb 1666487497309 - mark ADD_EDGE W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= @@ -320,11 +322,10 @@ DEL_EDGE WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== - 6a68923268af161e7e8346570af341ba + 4957bb66f70bda073e7edafdad81f6b4 1666487500685 - mark ADD_EDGE W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== @@ -333,11 +334,10 @@ DEL_EDGE WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== - afaa886c1e4907765760ae91632e1871 + c8d5e89e2630a4a0aa607594e14861d1 1666810445211 - mark ADD_EDGE W3sibGFiZWwiOiJZIiwic291cmNlIjoiNTIzNjQxYTQtOTc1NS00NWVkLTlhMjUtYTExNDc2ZGUzN2EwIiwidGFyZ2V0IjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjI5LjE1NTExMDY3Mjg3NDI5NCwiYmVuZFdlaWdodCI6MC41MTMxNjc2Njk2NTEzNTEyLCJiZW5kUG9pbnQiOnsieCI6LTUwLjM1NTE2Njc0NzA3LCJ5Ijo1OC4xODI0NTg4NjkxNTA4NH19LCJzb3VyY2VJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInRhcmdldElEIjoiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIiwidHlwZSI6Im9yZGluIiwiaWQiOiI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAifV0= @@ -346,11 +346,10 @@ DEL_EDGE WyI4YTE1ZmMyOC02ZjA5LTQ3MmYtYTk3Ni1jZmYzOWY3MzFjNjAiXQ== - e6899a4a1e46f06e241808fedb6942ce + cfc129abe20d32f8c156301489dcc705 1666810445211 - mark ADD_EDGE W3sibGFiZWwiOiJVIiwic291cmNlIjoiZDA0MDg0OGYtNmE5NC00YWMyLWE0ZTItYTg4NzliNWY3ZmZiIiwidGFyZ2V0IjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwic3R5bGUiOnsiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInRoaWNrbmVzcyI6MSwic2hhcGUiOiJzb2xpZCJ9LCJiZW5kRGF0YSI6eyJiZW5kRGlzdGFuY2UiOjAuMDAwMDE0ODc2MzcxMTExNjM4NDIsImJlbmRXZWlnaHQiOjAuNTAwMDAwMDAxMjIyMTMzNiwiYmVuZFBvaW50Ijp7IngiOjExLjYxMTg5ODIyNTI4ODk2OCwieSI6OTMuNDg5ODc5MjQ2Nzg1Mzl9fSwic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInR5cGUiOiJvcmRpbiIsImlkIjoiZTAxY2FiN2MtYzQ0Ni00OGRhLWI4OGUtN2Y5NjIwY2NkMjY5In1d @@ -359,11 +358,10 @@ DEL_EDGE WyJlMDFjYWI3Yy1jNDQ2LTQ4ZGEtYjg4ZS03Zjk2MjBjY2QyNjkiXQ== - 7ac674c0802aeff613b1f0b989427ec9 + 9fbba2442b7019a76634710caf98a549 1666810445211 - mark ADD_NODE WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJpZCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiRjE6ZnVuY2FsbC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd @@ -372,11 +370,10 @@ DEL_NODE WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== - bd81ac85ca97ad8607020554364e59b0 + de44f1ff4f2107a20e234361711eec91 1666810453165 - mark ADD_NODE WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0seyJpZCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiQ1o6Y3B5bWF4LnB5IiwidHlwZSI6Im9yZGluIiwic3R5bGUiOnsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9fSwiZDk1Zjc4ODctNDJiZi00ZTEyLWEwMjItMDIxODY5NzAxYzZhIl0= @@ -385,11 +382,10 @@ DEL_NODE WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== - a1e7c2a7f9a5da8636e9eb957887686d + f1cb4196a5082cef004f9ee186c7f04b 1666810462415 - mark UPDATE_NODE WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5LnB5Iix0cnVlXQ== @@ -398,7 +394,115 @@ UPDATE_NODE WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= - 6d6f211aebd7b1a130a1360f884c258b + 9e9b34686b3aec97cf26547fcd7ae633 + + + 1748979705408 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjEzMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5Mi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + 299aef4ea2931f8b9a6b7f10361b0022 + + + 1749058646821 + + DEL_NODE + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ== + + + ADD_NODE + WyJPVVQ6Iix7IndpZHRoIjoxMDAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTQzLCJ5IjoyNzF9LHt9LCI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiXQ== + + 51cf4c5701b1a8a637c1b373dcd09c59 + + + 1749058651133 + + SET_POS + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTQzLCJ5IjoyNzF9XQ== + + + SET_POS + WyI1MmU5NzQ5Mi1jY2VhLTQ4YTItOWRlZC1lMjM1ZTI0NTAzNTgiLHsieCI6MTQzLCJ5IjoyNzF9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 440d3083c9a571e9660685eaeefae6fb + + + 1749058659847 + + DEL_EDGE + WyJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6IjUyZTk3NDkyLWNjZWEtNDhhMi05ZGVkLWUyMzVlMjQ1MDM1OCIsImxhYmVsIjoiMHgyNDAwX1UzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJmYzY1ZTg0OC04OTJmLTQyZWQtYWU0OS1iYjhlYmQzODVmYjAifV0= + + 615e0be29af2a4940efea41e374438bb + + + 1749070207801 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + a8472011e18e50a782b19383b3b1a41d + + + 1749070480095 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + 4a9c6467598df6924c76f002eccbb822 + + + 1749070617114 + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NjJjMmRkNS05YmNkLTQwZDItODJjZC1lNDViMDUxYWVlNmEiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + 2b2ace96e5b5dad90e06fbac4e20b915 + + + 1749322194657 + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + + UPDATE_NODE + WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsid2lkdGgiOjE2OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMjpmdW5ib2R5X3ptcTIucHkiLHRydWVd + + dfbb291ab07456ce0005d5c6d1d6a18a + + + 1749325840799 + + UPDATE_EDGE + WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyJlOTJlM2E5ZC1lOWEwLTQ5YzgtOWYyMC1iNWQ1MTM3M2EzZjYiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + 385fc34934650be854756424f6fac52e \ No newline at end of file diff --git a/0mq/test0mqcall.graphml b/0mq/test0mqcall.graphml index cf5b799..033f176 100644 --- a/0mq/test0mqcall.graphml +++ b/0mq/test0mqcall.graphml @@ -2,11 +2,11 @@ - + - + CZ:cpymax.py @@ -17,10 +17,21 @@ - + - F1:funcall2.py + F1:funcall_zmq2.py + + + + + + + + + + + IN: @@ -32,7 +43,7 @@ Y - + @@ -44,14 +55,25 @@ U - + + + + + + + + + + + 0x2405_U3 + + 1664644923582 - mark DEL_NODE WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== @@ -60,11 +82,10 @@ ADD_NODE WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0se30sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd - ea1f3ba8fe573453400ffda5fad41219 + a53a7f7273a40c7970938b6de1829249 1664644939781 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH1d @@ -73,11 +94,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4IjoxMDAsInkiOjEwMH1d - 4d28b3ac41cd2913a677da0a4b65b424 + 3d4a875a8a6ea281598aa70364b0ea82 1664644951652 - mark DEL_NODE WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiXQ== @@ -86,11 +106,10 @@ ADD_NODE WyJDWjpjcHltYXgucHkiLHsid2lkdGgiOjEyMiwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotMTM3Ljc3NjIwMzU0OTQyMzgzLCJ5Ijo5MS4zMjAxMjcwNjgyNTY0MX0se30sImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSJd - 7d1c82d143a33ca11a4f968849bad104 + 5ed7e3d12fd25656b2ad03e29c307d65 1664644958838 - mark SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= @@ -99,11 +118,10 @@ SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOjEwMCwieSI6MTAwfV0= - 2e1ad74435543de42a296bb9a0620e63 + 35c613c8203b65e1f44e066b3d783143 1664644988539 - mark DEL_NODE WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiXQ== @@ -112,11 +130,10 @@ ADD_NODE WyJGMTpmdW5jYWxsLnB5Iix7IndpZHRoIjoxMTEsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0se30sImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCJd - ed42ad47c94f87d676c7c83ce9ded915 + 33d0b0cc4d3dbe3c42323e33f06993e9 1664645002278 - mark DEL_NODE WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== @@ -125,11 +142,10 @@ ADD_NODE WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsInNoYXBlIjoicmVjdGFuZ2xlIiwib3BhY2l0eSI6MSwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHt9LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== - 0f42a42f08b5d6633750c6cd0a52cd7f + 8d0d4a735631afe6241c66143fb29db8 1664645010353 - mark SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MTEwLCJ5IjoxMTB9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d @@ -138,11 +154,10 @@ SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjoxMTAsInkiOjExMH1d - 9ed03855520c803cecdd1d7497a92151 + 8a01a9ca8b3706bc3b1ce4de33669b6d 1664645015576 - mark DEL_EDGE WyIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUiXQ== @@ -151,11 +166,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiVSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiIwZjk1MWZiYy0wZDNmLTQzYzAtYmJmMC04NjViYzQ3ZjEyMGUifV0= - 725908dc36e7bc154d1d8dd0e98a412d + 14416fc2e3c48db65e2b5e1012027ee0 1664645043815 - mark DEL_EDGE WyIzY2ZiNDBjZC01NTdhLTQ4NTAtOTNhNi1mZGMwOWNkMDA1ZjAiXQ== @@ -164,11 +178,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiVTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiM2NmYjQwY2QtNTU3YS00ODUwLTkzYTYtZmRjMDljZDAwNWYwIn1d - 9f18da8775e24b7f2f9902f2842eb63e + 326a920ffd7e662bc64ca95c086fb9de 1664645057658 - mark DEL_EDGE WyI3MTRkYjk4OS01NjcyLTQwM2ItYWU3Ni1mZDlhMjA4OTM0NzUiXQ== @@ -177,11 +190,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiVTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNzE0ZGI5ODktNTY3Mi00MDNiLWFlNzYtZmQ5YTIwODkzNDc1In1d - 3e1c6e41350aaf47123ec7cf25e1b62c + 4593337e9924ae4b23dc5c5576c31394 1664645068951 - mark DEL_EDGE WyJhOGFlNzg5MC1iMmJiLTQyNzMtODc1My0wMTgxY2ViNDg2YzEiXQ== @@ -190,11 +202,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsImxhYmVsIjoiWTIiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiYThhZTc4OTAtYjJiYi00MjczLTg3NTMtMDE4MWNlYjQ4NmMxIn1d - 269c6a2baeea1b2785ce71ff56f4a76d + 568d8b7a109ffacc4b912095793cb2ca 1664645081283 - mark DEL_EDGE WyI1NWI5OWFiNi1hN2Q2LTRjNjctYWI0ZS1hOGUyOTM5YzFiMGYiXQ== @@ -203,11 +214,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiWTEiLCJzdHlsZSI6eyJ0aGlja25lc3MiOjEsImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJzaGFwZSI6InNvbGlkIn0sImlkIjoiNTViOTlhYjYtYTdkNi00YzY3LWFiNGUtYThlMjkzOWMxYjBmIn1d - 3c7cb858225e79ecf43defb7b70197a6 + 0d0aa0179f22f9d73a11f8ccfbcc145e 1664645089735 - mark SET_POS WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX1d @@ -216,11 +226,10 @@ SET_POS WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjoxMDAsInkiOjEwMH1d - b6b4fcd96e508461f87e4513dbd0170e + 1c19591402c0f2daca7d2b4a8af5e956 1664645092868 - mark DEL_EDGE WyI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkiXQ== @@ -229,11 +238,10 @@ ADD_EDGE W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6ImQ5NWY3ODg3LTQyYmYtNGUxMi1hMDIyLTAyMTg2OTcwMWM2YSIsImxhYmVsIjoiWSIsInN0eWxlIjp7InRoaWNrbmVzcyI6MSwiYmFja2dyb3VuZENvbG9yIjoiIzgyNzcxNyIsInNoYXBlIjoic29saWQifSwiaWQiOiI3OWE1NDdmNS02NzBhLTQ1ZjYtYTc4My02ZGI4ZmYwZTY1NTkifV0= - f2a382cf010520ed6d8d1167488af14c + 3c913497d8aa8f1c79bbdc03c3feec16 1664645142026 - mark SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfSx7IngiOi0xNzAuNDQxMDYwODg1NDY2OTUsInkiOjkwLjAxMzUzMjc3NDgxNDY5fV0= @@ -242,11 +250,10 @@ SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6OTcuNDEwNzY5MjcwMDg2NjksInkiOi05MS42MDMwNzQwMTM1ODUxfV0= - 5fc1c53a84494c7b3b749c475cf09d33 + ecbd46b28ecaf800c8da0d2ada69b4de 1664645149601 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NDA0LjIzNDYxMDc2NDgxNDIsInkiOi04OS4wMTM4NDMyODM2NzE3OH0seyJ4Ijo3NTQuNDAxODgxNDA3MTk2NSwieSI6OTkuMTM1NzM0OTcxOTM2NjR9XQ== @@ -255,11 +262,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjQwNC4yMzQ2MTA3NjQ4MTQyLCJ5IjotODkuMDEzODQzMjgzNjcxNzh9XQ== - 627a3a19a5e310402ab0c81e854bb1aa + ea35c112764d7964f8b7e35e9a18efbd 1664645223291 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NzU0LjQwMTg4MTQwNzE5NjUsInkiOjk5LjEzNTczNDk3MTkzNjY0fSx7IngiOjY3Ni4wMDYyMjM4MDA2OTMsInkiOjEwMC40NDIzMjkyNjUzNzgzNn1d @@ -268,11 +274,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjc1NC40MDE4ODE0MDcxOTY1LCJ5Ijo5OS4xMzU3MzQ5NzE5MzY2NH1d - 65480a229a142f0b48daa6727b8aae7b + d669d3d37a4693ad860a18c69999b31f 1664645228453 - mark SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX0seyJ4IjozMzYuMDE4NjM3MDg1NTg2NjUsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d @@ -281,11 +286,10 @@ SET_POS WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsieCI6Mzk0LjgxNTM4MDI5MDQ2NDMsInkiOjEwMC45Mzc2OTI0NDUzMDM0MX1d - 1359e922778d54bbfc88d8040c764247 + f7eb6af4003cb4eff19f39421fc00174 1664645231883 - mark SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6Njc2LjAwNjIyMzgwMDY5MywieSI6MTAwLjQ0MjMyOTI2NTM3ODM2fSx7IngiOjU4Ny4xNTc4MTE4NDY2NTU2LCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== @@ -294,11 +298,10 @@ SET_POS WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJ4Ijo2NzYuMDA2MjIzODAwNjkzLCJ5IjoxMDAuNDQyMzI5MjY1Mzc4MzZ9XQ== - ef15c4c7e39dcf45dee8b9e5d071d32f + 49dd0c2013be6e39c2f11ea967dbcab4 1664645237206 - mark SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== @@ -307,11 +310,10 @@ SET_POS WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3MC40NDEwNjA4ODU0NjY5NSwieSI6OTAuMDEzNTMyNzc0ODE0Njl9XQ== - a8ef099b87ae2a958e58d7b138deb5f5 + 009fc03903a9ae6003caea49a6575ddb 1666487497309 - mark ADD_EDGE W3sibGFiZWwiOiJZMSIsInNvdXJjZSI6IjdiNjljNmU2LTY0ZDEtNGQxZC1hODVkLThmODIwZGVhZTkyZSIsInRhcmdldCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjoyNS4wMTU2MDQ0Mzg0NDI0NywiYmVuZFdlaWdodCI6MC41MDcyNjEyODIxMTY0NTQyLCJiZW5kUG9pbnQiOnsieCI6MTg1Ljk0OTI3NTk2OTkwNjY3LCJ5Ijo2Ny4wNTc5Mjg3NTI0OTY3Mn19LCJzb3VyY2VJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInRhcmdldElEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidHlwZSI6Im9yZGluIiwiaWQiOiJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkifV0= @@ -320,11 +322,10 @@ DEL_EDGE WyJkYWRmMjgyOS1lMDEwLTRlMGQtYTNhNy1iYTdkYjg3OWM2NDkiXQ== - 6a68923268af161e7e8346570af341ba + 4957bb66f70bda073e7edafdad81f6b4 1666487500685 - mark ADD_EDGE W3sibGFiZWwiOiJVMSIsInNvdXJjZSI6IjZhYzczNmNiLWUyZmUtNGI4Mi04NzQ1LTUyZjkzNGYyZGYxMCIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiM3YzRkZmYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLjAwMDAyNzg2ODE3Mzg2NTQ2NDAzLCJiZW5kV2VpZ2h0IjowLjUwMDAwMDAwNDAzMDUwNjYsImJlbmRQb2ludCI6eyJ4IjoyNDUuNzU5MzE4NTQyNzk0OTQsInkiOjk4LjU4MDQzNDE0NjM5NTE4fX0sInNvdXJjZUlEIjoiZjU2ZjhiMjQtNDFhNi00NWI0LTg4MmItNjU5NjA0MGI2YWYwIiwidGFyZ2V0SUQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImRlYzYzYTI5LWY1NWEtNGNmNy04OWIwLWQ3NjY2YzcyMmFkOSJ9XQ== @@ -333,11 +334,10 @@ DEL_EDGE WyJkZWM2M2EyOS1mNTVhLTRjZjctODliMC1kNzY2NmM3MjJhZDkiXQ== - afaa886c1e4907765760ae91632e1871 + c8d5e89e2630a4a0aa607594e14861d1 1666810339519 - mark ADD_EDGE W3sibGFiZWwiOiJVMiIsInNvdXJjZSI6ImFjZWUyZTJjLTFhOTEtNDg1OC1hYzdjLWNhMmNiM2YxZjQ3MCIsInRhcmdldCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmZjZkMDAiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjotOS40NzQ2NTYxODQ2MTU5NmUtOCwiYmVuZFdlaWdodCI6MC41MDAwMDAwMDAwMDA5Nzc3LCJiZW5kUG9pbnQiOnsieCI6NDkxLjU4ODIyNDQ2NjEyMTEsInkiOjEwMC42MzA4MzY3OTg1ODUxfX0sInNvdXJjZUlEIjoiZGIzMWJlM2YtM2U1OC00YzM2LTk3OWQtNDFmYjI4YWVmZTY4IiwidGFyZ2V0SUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0eXBlIjoib3JkaW4iLCJpZCI6ImU2ZWZhMmIyLWI0NDItNDAwNi05NzQ5LTdlM2IyZDUxMzJmYiJ9XQ== @@ -346,11 +346,10 @@ DEL_EDGE WyJlNmVmYTJiMi1iNDQyLTQwMDYtOTc0OS03ZTNiMmQ1MTMyZmIiXQ== - c513a6555bbc7f569db6b7618105b78f + ead3ddf695580bca36da4698dfe89256 1666810339519 - mark ADD_EDGE W3sibGFiZWwiOiJZMiIsInNvdXJjZSI6IjA0YmZkMWI4LTkzYWYtNDQxZi1iNDZhLTMyMGZkMTA3NDBjOSIsInRhcmdldCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInN0eWxlIjp7ImJhY2tncm91bmRDb2xvciI6IiNmNDQzMzYiLCJ0aGlja25lc3MiOjEsInNoYXBlIjoic29saWQifSwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjozMC41NjQzMTU2MDk0NTE4NjQsImJlbmRXZWlnaHQiOjAuNTE0MzI5NzI5MzYyMTU2MywiYmVuZFBvaW50Ijp7IngiOjQyMi43NzE0OTAyODczNTc2NiwieSI6NjQuMDU1NTI3OTI5NTQ0ODd9fSwic291cmNlSUQiOiJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciLCJ0YXJnZXRJRCI6ImRiMzFiZTNmLTNlNTgtNGMzNi05NzlkLTQxZmIyOGFlZmU2OCIsInR5cGUiOiJvcmRpbiIsImlkIjoiOTE3MzNmNmItM2RlMy00MGFmLWJmMTQtMmJiNmNiYzQ5MGUyIn1d @@ -359,11 +358,10 @@ DEL_EDGE WyI5MTczM2Y2Yi0zZGUzLTQwYWYtYmYxNC0yYmI2Y2JjNDkwZTIiXQ== - b33c2827ee23b0e9057528015febad17 + a86191957747741919dd1f5e71c2e56c 1666810339519 - mark ADD_NODE WyJGMjpmdW5ib2R5LnB5Iix7IndpZHRoIjoxMjAsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6MzM2LjAxODYzNzA4NTU4NjY1LCJ5IjoxMDAuOTM3NjkyNDQ1MzAzNDF9LHsiaWQiOiJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiLCJsYWJlbCI6IkYyOmZ1bmJvZHkucHkiLCJ0eXBlIjoib3JkaW4iLCJzdHlsZSI6eyJ3aWR0aCI6MTIwLCJoZWlnaHQiOjUwLCJvcGFjaXR5IjoxLCJzaGFwZSI6InJlY3RhbmdsZSIsImJhY2tncm91bmRDb2xvciI6IiNmZmNjMDAiLCJib3JkZXJDb2xvciI6IiMwMDAiLCJib3JkZXJXaWR0aCI6MX19LCJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== @@ -372,11 +370,10 @@ DEL_NODE WyJkYjMxYmUzZi0zZTU4LTRjMzYtOTc5ZC00MWZiMjhhZWZlNjgiXQ== - 1e39894291be950a14dd7ab1b7759234 + b3ce34b6dc8f697e5b8fdf374ec42075 1666810343268 - mark ADD_NODE WyJQWjpwbXB5bWF4LnB5Iix7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfSwib3JkaW4iLHsieCI6NTg3LjE1NzgxMTg0NjY1NTYsInkiOjEwMC40NDIzMjkyNjUzNzgzNn0seyJpZCI6ImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyIsImxhYmVsIjoiUFo6cG1weW1heC5weSIsInR5cGUiOiJvcmRpbiIsInN0eWxlIjp7IndpZHRoIjoxMzYsImhlaWdodCI6NTAsIm9wYWNpdHkiOjEsInNoYXBlIjoicmVjdGFuZ2xlIiwiYmFja2dyb3VuZENvbG9yIjoiI2ZmY2MwMCIsImJvcmRlckNvbG9yIjoiIzAwMCIsImJvcmRlcldpZHRoIjoxfX0sImJkOTJmOWQ4LTdkNjMtNDJiMi05NjhiLTM5MDllZjRjNzIzNyJd @@ -385,11 +382,10 @@ DEL_NODE WyJiZDkyZjlkOC03ZDYzLTQyYjItOTY4Yi0zOTA5ZWY0YzcyMzciXQ== - 0658fdad3d7279fd8e56299941d04582 + ab4fb226f0c49b8ded66436938762af7 1666810375461 - mark UPDATE_NODE WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjExMSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsLnB5Iix0cnVlXQ== @@ -398,7 +394,199 @@ UPDATE_NODE WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= - 2f5c9fab25c4a17d6b2906bbda9aab3c + f5e56f793b1dfd259251f6b15ecf0e6a + + + 1748979732766 + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjEyMCwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsMi5weSIsdHJ1ZV0= + + + UPDATE_NODE + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsid2lkdGgiOjE1OSwiaGVpZ2h0Ijo1MCwib3BhY2l0eSI6MSwic2hhcGUiOiJyZWN0YW5nbGUiLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJGMTpmdW5jYWxsX3ptcTIucHkiLHRydWVd + + 9e9aaedf5e2f34cef7d06d52891d6a76 + + + 1749058687416 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6MTAwLCJ5Ijo5NC43NzM2MjI4MjYyMzMxMX0seyJ4IjotMzg4LCJ5IjoxMC43NzM2MjI4MjYyMzMxMDh9XQ== + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOjEwMCwieSI6OTQuNzczNjIyODI2MjMzMTF9XQ== + + 7cb1d108692b66ae85dd0ffdcf639baf + + + 1749058691778 + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9LHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9XQ== + + + SET_POS + WyJkOTVmNzg4Ny00MmJmLTRlMTItYTAyMi0wMjE4Njk3MDFjNmEiLHsieCI6LTE3Ny43NzYyMDM1NDk0MjM4MywieSI6MTM2LjMyMDEyNzA2ODI1NjR9LHsieCI6LTEzNy43NzYyMDM1NDk0MjM4MywieSI6OTEuMzIwMTI3MDY4MjU2NDF9XQ== + + 1ce2563fc9ee71151cb6a722255fd762 + + + 1749058702356 + + DEL_NODE + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiXQ== + + + ADD_NODE + WyJJTjoiLHsid2lkdGgiOjEwMCwiaGVpZ2h0Ijo1MCwic2hhcGUiOiJyZWN0YW5nbGUiLCJvcGFjaXR5IjoxLCJiYWNrZ3JvdW5kQ29sb3IiOiIjZmZjYzAwIiwiYm9yZGVyQ29sb3IiOiIjMDAwIiwiYm9yZGVyV2lkdGgiOjF9LCJvcmRpbiIseyJ4IjotNjMyLCJ5IjotMTQzfSx7fSwiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIl0= + + 26f5f23f693921ed1b1ee5d52e1e75b6 + + + 1749058707709 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6MTAwLCJ5IjoxMDB9LHsieCI6LTU5OCwieSI6OTl9XQ== + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6MTAwLCJ5IjoxMDB9XQ== + + 6ae6b59a08af5a7047a97a5ad388c270 + + + 1749058713842 + + DEL_EDGE + WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0= + + cc747ad0ecc75c44cc3b6f6f9e9ae92c + + + 1749058727442 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTU5OCwieSI6OTl9LHsieCI6LTYxMiwieSI6LTEwMn1d + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNTk4LCJ5Ijo5OX1d + + fa49a13771e334eebbf112917f89d058 + + + 1749058754860 + + ADD_EDGE + W3sic291cmNlSUQiOiJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLCJ0YXJnZXRJRCI6IjQwOGE1ZDY1LWU3NjMtNDY3Mi05ZGE4LWRlYzkxMzYxZGNkZCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwidHlwZSI6Im9yZGluIiwic291cmNlIjoiYzI1ZDZiNjItNWQ2Ni00MDliLTk0YjEtZTZmZmI1ZjBmMTViIiwidGFyZ2V0IjoiNDA4YTVkNjUtZTc2My00NjcyLTlkYTgtZGVjOTEzNjFkY2RkIiwiYmVuZERhdGEiOnsiYmVuZERpc3RhbmNlIjowLCJiZW5kV2VpZ2h0IjowLjUsImJlbmRQb2ludCI6eyJ4IjotNTI0Ljg0NzY3NTkxNDkzNTQsInkiOi01OC4xMTMxODg1ODY4ODM0NDZ9fSwiaWQiOiIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYifV0= + + + DEL_EDGE + WyIxMDhhZjJhMy1jOWQ3LTQwNWYtODg5MC1kOTFmOWU5NjYzZTYiXQ== + + 7f0f25f333a2a6cfc15a70a1634323f1 + + + 1749058756916 + + DEL_EDGE + WyJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIiXQ== + + + ADD_EDGE + W3sic291cmNlSUQiOiI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLCJ0YXJnZXRJRCI6ImY1NmY4YjI0LTQxYTYtNDViNC04ODJiLTY1OTYwNDBiNmFmMCIsImxhYmVsIjoiMHgyNDAwX1kzIiwic3R5bGUiOnsidGhpY2tuZXNzIjoxLCJiYWNrZ3JvdW5kQ29sb3IiOm51bGwsInNoYXBlIjoic29saWQifSwiaWQiOiJjNTQzMjlmMy0xMmQ1LTQ2ZTAtOTE3Zi02MGQ3NmI3OTQ1ZmIifV0= + + fc1f4b789ad989f3e60a17bbe3a5bd5a + + + 1749058765759 + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYxMiwieSI6LTEwMn0seyJ4IjotNjMyLCJ5IjotMTQzfV0= + + + SET_POS + WyI0MDhhNWQ2NS1lNzYzLTQ2NzItOWRhOC1kZWM5MTM2MWRjZGQiLHsieCI6LTYzMiwieSI6LTE0M30seyJ4IjotNjEyLCJ5IjotMTAyfV0= + + 4209fecec5c91f476c4539fa06418efd + + + 1749058768670 + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fSx7IngiOi00ODcsInkiOjUwLjc3MzYyMjgyNjIzMzExfV0= + + + SET_POS + WyJmNTZmOGIyNC00MWE2LTQ1YjQtODgyYi02NTk2MDQwYjZhZjAiLHsieCI6LTQ4NywieSI6NTAuNzczNjIyODI2MjMzMTF9LHsieCI6LTM4OCwieSI6MTAuNzczNjIyODI2MjMzMTA4fV0= + + 63797cc5d0c6dc2da5ef71e99504bd45 + + + 1749066909379 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9ZMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + 1ad516ce46689ac6f15b5532ff42ab86 + + + 1749070198710 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMF9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + f6a8e5aa88fff9e10e187a6f5d1b6b33 + + + 1749070471512 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMV9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + 9b54fffa96ec88de939b11febe6746d0 + + + 1749070605367 + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwMl9VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyI2NTNjM2Y1Zi02NjY4LTRhYmEtYTUzNi0wYWVhMWM2NDNkYzgiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + ae211e5c6a9ff5b2487f0e107ea136f1 + + + 1749325857360 + + UPDATE_EDGE + WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwM19VMyIsdHJ1ZV0= + + + UPDATE_EDGE + WyIwMjg4Nzc2NS1lNTA5LTQ3MjgtYWE1ZC1hZTBiYmJhMjkxMzQiLHsidGhpY2tuZXNzIjoxLCJzaGFwZSI6InNvbGlkIn0sIjB4MjQwNV9VMyIsdHJ1ZV0= + + d42101a2e57f7e1fc75f9b867262a6a8 \ No newline at end of file diff --git a/0mq/thirdNode.py b/0mq/thirdNode.py new file mode 100644 index 0000000..3cb28cf --- /dev/null +++ b/0mq/thirdNode.py @@ -0,0 +1,34 @@ +# thirdNode.py (Server C) +import concore + +# --- ZMQ Initialization --- +# This REP socket binds and waits for Node A to connect and send a request. +concore.init_zmq_port( + port_name=f"0x{PORT_F1_F3}_{PORT_NAME_F1_F3}", + port_type="bind", + address="tcp://*:" + PORT_F1_F3, + socket_type_str="REP" +) + +print("Node C server started. Waiting for requests...") + +while True: + # Wait to receive a request from Node A + received_data = concore.read(f"0x{PORT_F1_F3}_{PORT_NAME_F1_F3}", "value", [0.0]) + received_value = received_data[0] + + print(f"Node C: Received {received_value:.2f} from Node A.") + + # Process the value + new_value = received_value + 0.01 + print(f"Node C: Sending back final value {new_value:.2f}.") + + # Send the reply back to Node A + concore.write(f"0x{PORT_F1_F3}_{PORT_NAME_F1_F3}", "value", [new_value]) + + # Check the value to know when to shut down gracefully. + if new_value > 100: + break + +print("\nNode C: Terminating.") +concore.terminate_zmq() \ No newline at end of file diff --git a/concore.py b/concore.py index 2f4d7c8..a018ddf 100644 --- a/concore.py +++ b/concore.py @@ -214,7 +214,7 @@ def write(port_identifier, name, val, delta=0): print(f"ZMQ write error on port {port_identifier} (name: {name}): {e}") except Exception as e: print(f"Unexpected error during ZMQ write on port {port_identifier} (name: {name}): {e}") - + return try: if isinstance(port_identifier, str) and port_identifier in zmq_ports: file_path = os.path.join("../"+port_identifier, name) diff --git a/mkconcore.py b/mkconcore.py index a608ffb..c05e8aa 100644 --- a/mkconcore.py +++ b/mkconcore.py @@ -5,6 +5,8 @@ import os import shutil import stat +import copy_with_port_portname +import numpy as np MKCONCORE_VER = "22-09-18" @@ -122,66 +124,165 @@ nodes_text = soup.find_all('node') # Store the edges and nodes in a dictionary +edge_label_regex = re.compile(r"0x([a-fA-F0-9]+)_(\S+)") edges_dict = dict() nodes_dict = dict() +node_id_to_label_map = dict() # Helper to get clean node labels from GraphML ID for node in nodes_text: - node_key = node.get_text() - length = len(node.find_all('data')) - for i in range(length): - try: - data = node.find_all('data')[i] - node_label = prefixedgenode + data.find('y:NodeLabel').text #3/23/21 - nodes_dict[node['id']] = re.sub(r'(\s+|\n)', ' ', node_label) - except IndexError: - logging.debug('IndexError: A node with no valid properties encountered and ignored') - except AttributeError: - logging.debug('AttributeError: A node with no valid properties encountered and ignored') + try: + data = node.find('data', recursive=False) + if data: + node_label_tag = data.find('y:NodeLabel') + if node_label_tag: + node_label = prefixedgenode + node_label_tag.text + nodes_dict[node['id']] = re.sub(r'(\s+|\n)', ' ', node_label) + node_id_to_label_map[node['id']] = node_label.split(':')[0] + except (IndexError, AttributeError): + logging.debug('A node with no valid properties encountered and ignored') for edge in edges_text: - length = len(edge.find_all('data')) - for i in range(length): - try: - data = edge.find_all('data')[i] - edge_label = prefixedgenode + data.find('y:EdgeLabel').text # 3/23/21 - if edges_dict.get(edge_label) != None: - targets = edges_dict[edge_label][1] - else: - targets = [] - targets.append(nodes_dict[edge['target']]) - edges_dict[edge_label] = [nodes_dict[edge['source']], targets] - except IndexError: - logging.debug('An edge with no valid properties encountered and ignored') - except AttributeError: - logging.debug('AttributeError: An edge with no valid properties encountered and ignored') + try: + data = edge.find('data', recursive=False) + if data: + edge_label_tag = data.find('y:EdgeLabel') + if edge_label_tag: + raw_label = edge_label_tag.text + edge_label = prefixedgenode + raw_label + # Filter out ZMQ edges from the file-based edge dictionary by checking the raw label + if not edge_label_regex.match(raw_label): + if edge_label not in edges_dict: + edges_dict[edge_label] = [nodes_dict[edge['source']], []] + edges_dict[edge_label][1].append(nodes_dict[edge['target']]) + except (IndexError, AttributeError, KeyError): + logging.debug('An edge with no valid properties or missing node encountered and ignored') -# Print the edges_dict -#logging.info(edges_dict) ############## Mark's Docker -import numpy as np - -i=0 -nodes_num=dict() -for node in nodes_dict: - nodes_num[nodes_dict[node]] = i - i=i+1 +logging.info("Building graph adjacency matrix...") +nodes_num = {label: i for i, label in enumerate(nodes_dict.values())} -m=np.zeros((len(nodes_dict),len(nodes_dict))) +m = np.zeros((len(nodes_dict), len(nodes_dict))) for edges in edges_dict: - for dest in (edges_dict[edges])[1]: - m[nodes_num[edges_dict[edges][0]]][nodes_num[dest]] = 1 + source_node_label = edges_dict[edges][0] + for dest_node_label in edges_dict[edges][1]: + try: + source_idx = nodes_num[source_node_label] + dest_idx = nodes_num[dest_node_label] + m[source_idx][dest_idx] = 1 + except KeyError as e: + logging.error(f"KeyError while building matrix. Label '{e}' not found in node map.") + continue mp = np.eye(len(nodes_dict)) ms = np.zeros((len(nodes_dict),len(nodes_dict))) - -for i in range(0,len(nodes_dict)): +for i in range(len(nodes_dict)): mp = mp@m ms += mp - if (ms == 0).any(): logging.warning("Unreachable nodes detected") +# --- START: New logic for script specialization (Aggregation) --- +python_executable = sys.executable +mkconcore_dir = os.path.dirname(os.path.abspath(__file__)) +copy_script_py_path = os.path.join(mkconcore_dir, "copy_with_port_portname.py") +if not os.path.exists(copy_script_py_path): + copy_script_py_path = os.path.join(CONCOREPATH, "copy_with_port_portname.py") + +if not os.path.exists(copy_script_py_path): + logging.warning(f"copy_with_port_portname.py not found. Script specialization will be skipped.") + copy_script_py_path = None + +# Dictionary to aggregate edge parameters for each node that needs specialization +# Key: node_id (from GraphML), Value: list of edge parameter dicts +node_edge_params = {} +edge_label_regex = re.compile(r"0x([^_]+)_(\S+)") + +logging.info("Aggregating ZMQ edge parameters for nodes...") +if copy_script_py_path: + for edge_element in soup.find_all('edge'): + try: + edge_label_tag = edge_element.find('y:EdgeLabel') + if not edge_label_tag or not edge_label_tag.text: + continue + + raw_edge_label = edge_label_tag.text + match = edge_label_regex.match(raw_edge_label) + + if match: + hex_port_val, port_name_val = match.groups() + # Convert hex port value to decimal string + try: + decimal_port_str = str(int(hex_port_val, 16)) + except ValueError: + logging.error(f"Invalid hex value '{hex_port_val}' in edge label. Using as is.") + decimal_port_str = hex_port_val + + source_node_id = edge_element['source'] + target_node_id = edge_element['target'] + + # Get clean labels for use in variable names + source_node_label = node_id_to_label_map.get(source_node_id, "UNKNOWN_SOURCE") + target_node_label = node_id_to_label_map.get(target_node_id, "UNKNOWN_TARGET") + + logging.info(f"Found ZMQ edge '{raw_edge_label}' from '{source_node_label}' to '{target_node_label}'") + + edge_param_data = { + "port": decimal_port_str, + "port_name": port_name_val, + "source_node_label": source_node_label, + "target_node_label": target_node_label + } + + # Add this edge's data to both the source and target nodes for specialization + if source_node_id in nodes_dict: + if source_node_id not in node_edge_params: + node_edge_params[source_node_id] = [] + node_edge_params[source_node_id].append(edge_param_data) + + if target_node_id in nodes_dict: + if target_node_id not in node_edge_params: + node_edge_params[target_node_id] = [] + node_edge_params[target_node_id].append(edge_param_data) + except Exception as e: + logging.warning(f"Error processing edge for parameter aggregation: {e}") + +# --- Now, run the specialization for each node that has aggregated parameters --- +if node_edge_params: + logging.info("Running script specialization process...") + specialized_scripts_output_dir = os.path.abspath(os.path.join(outdir, "src")) + os.makedirs(specialized_scripts_output_dir, exist_ok=True) + + for node_id, params_list in node_edge_params.items(): + current_node_full_label = nodes_dict[node_id] + try: + container_name, original_script = current_node_full_label.split(':', 1) + except ValueError: + continue # Skip if label format is wrong + + if not original_script or "." not in original_script: + continue # Skip if not a script file + + template_script_full_path = os.path.join(sourcedir, original_script) + if not os.path.exists(template_script_full_path): + logging.error(f"Cannot specialize: Original script '{template_script_full_path}' not found in '{sourcedir}'.") + continue + + new_script_basename = copy_with_port_portname.run_specialization_script( + template_script_full_path, + specialized_scripts_output_dir, + params_list, + python_executable, + copy_script_py_path + ) + + if new_script_basename: + # Update nodes_dict to point to the new comprehensive specialized script + nodes_dict[node_id] = f"{container_name}:{new_script_basename}" + logging.info(f"Node ID '{node_id}' ('{container_name}') updated to use specialized script '{new_script_basename}'.") + else: + logging.error(f"Failed to generate specialized script for node ID '{node_id}'. It will retain its original script.") + #not right for PM2_1_1 and PM2_1_2 volswr = len(nodes_dict)*[''] i = 0 @@ -202,31 +303,46 @@ volsro[nodes_num[dest]] += ' -v '+volIndirPair+':ro' i += 1 -#copy sourcedir into ./src -for node in nodes_dict: - containername,sourcecode = nodes_dict[node].split(':') - if len(sourcecode)!=0 and sourcecode.find(".")!=-1: #3/28/21 - dockername,langext = sourcecode.split(".") - try: - fsource = open(sourcedir+"/"+sourcecode) - except: - logging.error(f"{sourcecode} not found in {sourcedir}") - quit() - with open(outdir+"/src/"+sourcecode,"w") as fcopy: - fcopy.write(fsource.read()) - fsource.close() - if concoretype == "docker": # 3/30/21 - try: - fsource = open(sourcedir+"/Dockerfile."+dockername) - with open(outdir+"/src/Dockerfile."+dockername,"w") as fcopy: - fcopy.write(fsource.read()) - logging.info(f"Using custom Dockerfile for {dockername}") - except: - logging.info(f"Using default Dockerfile for {dockername}") - fsource.close() - if os.path.isdir(sourcedir+"/"+dockername+".dir"): - shutil.copytree(sourcedir+"/"+dockername+".dir",outdir+"/src/"+dockername+".dir") +# copy sourcedir into ./src +# --- Modified file copying loop --- +logging.info("Processing files for nodes...") +for node_id_key in list(nodes_dict.keys()): + node_label_from_dict = nodes_dict[node_id_key] + try: + containername, sourcecode = node_label_from_dict.split(':', 1) + except ValueError: + continue + + if not sourcecode: + continue + + if "." in sourcecode: + dockername, langext = os.path.splitext(sourcecode) + else: + dockername, langext = sourcecode, "" + + script_target_path = os.path.join(outdir, "src", sourcecode) + + # If the script was specialized, it's already in outdir/src. If not, copy from sourcedir. + if node_id_key not in node_edge_params: + script_source_path = os.path.join(sourcedir, sourcecode) + if os.path.exists(script_source_path): + shutil.copy2(script_source_path, script_target_path) + else: + logging.error(f"Script '{sourcecode}' not found in sourcedir '{sourcedir}'") + + # The rest of the file handling (Dockerfiles, .dir) uses 'dockername', + # which is now derived from the specialized script name, maintaining consistency. + if concoretype == "docker": + custom_dockerfile = f"Dockerfile.{dockername}" + if os.path.exists(os.path.join(sourcedir, custom_dockerfile)): + shutil.copy2(os.path.join(sourcedir, custom_dockerfile), os.path.join(outdir, "src", custom_dockerfile)) + dir_for_node = f"{dockername}.dir" + if os.path.isdir(os.path.join(sourcedir, dir_for_node)): + shutil.copytree(os.path.join(sourcedir, dir_for_node), os.path.join(outdir, "src", dir_for_node), dirs_exist_ok=True) + + #copy proper concore.py into /src try: if concoretype=="docker": @@ -346,48 +462,63 @@ fcopy.write(fsource.read()) fsource.close() +# --- Generate iport and oport mappings --- +logging.info("Generating iport/oport mappings...") +node_port_mappings = {label: {'iport': {}, 'oport': {}} for label in nodes_dict.values()} +# 1. Process file-based inputs +node_labels_by_index = {i: label for label, i in nodes_num.items()} +for i, in_dirs in enumerate(indir): + if i in node_labels_by_index: + node_label = node_labels_by_index[i] + for pair in in_dirs: + volname, portnum = pair.split(INDIRNAME) + node_port_mappings[node_label]['iport'][volname] = int(portnum) +# 2. Process file-based outputs +for edge_label, (source_label, target_labels) in edges_dict.items(): + if source_label in node_port_mappings: + out_count = len(node_port_mappings[source_label]['oport']) + 1 + node_port_mappings[source_label]['oport'][edge_label] = out_count +# 3. Augment with bidirectional ZMQ connections +logging.info("Augmenting port maps with ZMQ connections...") +for edge_element in soup.find_all('edge'): + try: + edge_label_tag = edge_element.find('y:EdgeLabel') + if not edge_label_tag or not edge_label_tag.text: continue + match = edge_label_regex.match(edge_label_tag.text) + if match: + hex_port_val, port_name_val = match.groups() + # Convert hex port value to decimal string + try: + decimal_port_str = str(int(hex_port_val, 16)) + except ValueError: + logging.error(f"Invalid hex value '{hex_port_val}' in edge label. Using as is.") + decimal_port_str = hex_port_val + + source_label = nodes_dict.get(edge_element['source']) + target_label = nodes_dict.get(edge_element['target']) + if source_label and target_label: + node_port_mappings[source_label]['iport'][port_name_val] = decimal_port_str + node_port_mappings[source_label]['oport'][port_name_val] = decimal_port_str + node_port_mappings[target_label]['iport'][port_name_val] = decimal_port_str + node_port_mappings[target_label]['oport'][port_name_val] = decimal_port_str + logging.info(f" - Added ZMQ port '{port_name_val}:{decimal_port_str}' to both iport/oport for nodes '{source_label}' and '{target_label}'") + except Exception as e: + logging.warning(f"Error processing ZMQ edge for port map: {e}") + +# 4. Write final iport/oport files +logging.info("Writing .iport and .oport files...") +for node_label, ports in node_port_mappings.items(): + try: + containername, sourcecode = node_label.split(':', 1) + if not sourcecode or "." not in sourcecode: continue + dockername = os.path.splitext(sourcecode)[0] + with open(os.path.join(outdir, "src", f"{dockername}.iport"), "w") as fport: + fport.write(str(ports['iport']).replace("'" + prefixedgenode, "'")) + with open(os.path.join(outdir, "src", f"{dockername}.oport"), "w") as fport: + fport.write(str(ports['oport']).replace("'" + prefixedgenode, "'")) + except ValueError: + continue -#generate input portmap file -i=0 -for node in nodes_dict: - containername,sourcecode = nodes_dict[node].split(':') - iportmap_dict = dict() - for pair in indir[i]: - volname,portnum = pair.split(INDIRNAME) - iportmap_dict[volname] = int(portnum) - if len(sourcecode)!=0 and sourcecode.find(".")!=-1: #3/28/21 - dockername,langext = sourcecode.split(".") - if os.path.exists(outdir+"/src/"+dockername+".iport"): - logging.warning(f"{dockername} has multiple instantiations ; iport/oport may be invalid") - with open(outdir+"/src/"+dockername+".iport", "w") as fport: - if prefixedgenode == "": # 5/18/21 - fport.write(str(iportmap_dict)) - else: - fport.write(str(iportmap_dict).replace("'"+prefixedgenode,"'")) - i=i+1 - -#generate output portmap file -outcount = len(nodes_dict)*[0] -#wrong, this aliases single dict for all elements: oportmap = len(nodes_dict)*[dict()] -#instead, need to use a loop to initialize: -oportmap_dict = [] -for node in nodes_dict: - oportmap_dict += [dict()] -for edges in edges_dict: - containername,sourcecode = edges_dict[edges][0].split(':') - outcount[nodes_num[edges_dict[edges][0]]] += 1 - oportmap_dict[nodes_num[edges_dict[edges][0]]][edges] = outcount[nodes_num[edges_dict[edges][0]]] -i=0 -for node in nodes_dict: - containername,sourcecode = nodes_dict[node].split(':') - if len(sourcecode)!=0 and sourcecode.find(".")!=-1: #3/28/21 - dockername,langext = sourcecode.split(".") - with open(outdir+"/src/"+dockername+".oport", "w") as fport: - if prefixedgenode == "": # 5/18/21 - fport.write(str(oportmap_dict[i])) - else: - fport.write(str(oportmap_dict[i]).replace("'"+prefixedgenode,"'")) - i=i+1 #if docker, make docker-dirs, generate build, run, stop, clear scripts and quit if (concoretype=="docker"):