dataflow-analysis/trace-analysis.ipynb

2753 lines
15 MiB
Text
Raw Normal View History

{
"cells": [
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 1,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import os\n",
"import sys\n",
2022-09-15 18:04:45 +02:00
"import re\n",
"from tqdm import tqdm\n",
"from typing import Iterable\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"from matplotlib import pyplot as plt\n",
"\n",
2022-09-15 16:17:24 +02:00
"from misc.utils import cached, parse_as\n",
"\n",
"# TODO: This has no effect for some reason (goal is to make graphs in notebook large and hi-res)\n",
"plt.rcParams['figure.dpi'] = 300\n",
"\n",
"%matplotlib inline"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
2023-02-15 17:02:20 +09:00
},
"source": [
"# User Settings"
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 2,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"User Settings:\n",
" TRACING_WS_BUILD_PATH................... := /home/niklas/dataflow-analysis/dependencies/build\n",
2025-06-06 08:24:47 +00:00
" EXPERIMENT_NAME......................... := full_topology_tracing-20250603152153\n",
2025-06-03 13:43:48 +00:00
" TR_PATH................................. := /home/niklas/dataflow-analysis/traces/full_topology_tracing-20250603152153/ust\n",
2025-06-06 08:24:47 +00:00
" OUT_PATH................................ := /home/niklas/dataflow-analysis/out/full_topology_tracing-20250603152153\n",
2025-06-03 13:43:48 +00:00
" CACHING_ENABLED......................... := False\n",
" BW_ENABLED.............................. := False\n",
" BW_PATH................................. := /home/niklas/dataflow-analysis/path/to/messages.h5\n",
" CL_ENABLED.............................. := False\n",
" CL_PATH................................. := /path/to/code_analysis/output\n",
" DFG_ENABLED............................. := True\n",
" DFG_PLOT................................ := True\n",
" DFG_MAX_HIER_LEVEL...................... := 100\n",
" DFG_INPUT_NODE_PATTERNS................. := ^/input_\n",
" DFG_OUTPUT_NODE_PATTERNS................ := ^/output_\n",
" DFG_EXCL_NODE_PATTERNS.................. := ^/rviz2\n",
" E2E_ENABLED............................. := True\n",
" E2E_PLOT................................ := True\n",
" E2E_PLOT_TIMESTAMP...................... := 100\n",
" E2E_TIME_LIMIT_S........................ := 500\n",
" E2E_OUTPUT_TOPIC_PATTERNS............... := ^/output/\n",
" E2E_INPUT_TOPIC_PATTERNS................ := ^/input/\n",
" E2E_EXCL_PATH_PATTERNS.................. := ^/parameter_events\n",
" E2E_INCL_PATH_PATTERNS.................. := \n",
" E2E_EXACT_PATH.......................... := \n",
" DEBUG................................... := False\n",
" MANUAL_CACHE............................ := False\n"
]
}
],
"source": [
"##################################################\n",
"# User Settings\n",
"##################################################\n",
"# Change these to influence the execution of the\n",
"# notebook.\n",
"# You can override these from the command line\n",
"# by defining environment variables with the\n",
"# name of the constants below, prefixed with\n",
"# \"ANA_NB_\".\n",
"# For example, the environment variable\n",
"# \"ANA_NB_TR_PATH\" will override the \"TR_PATH\"\n",
"# setting below.\n",
"##################################################\n",
"\n",
"# The path to the build folder of a ROS2 workspace that contains the\n",
"# tracetools_read and tracetools_analysis folders.\n",
2025-06-03 13:43:48 +00:00
"TRACING_WS_BUILD_PATH = \"/home/niklas/dataflow-analysis/dependencies/build\"\n",
"\n",
2025-06-06 08:24:47 +00:00
"# The name of the experiment that is being analyzed.\n",
"# This will be used to name output directory.\n",
"EXPERIMENT_NAME = \"full_topology_tracing-20250603152153\"\n",
"\n",
"# Path to trace directory (e.g. ~/.ros/my-trace/ust) or to a converted trace file.\n",
"# Using the path \"/ust\" at the end is optional but greatly reduces processing time\n",
"# if kernel traces are also present.\n",
2025-06-06 08:24:47 +00:00
"TR_PATH = f\"/home/niklas/dataflow-analysis/traces/{EXPERIMENT_NAME}/ust\"\n",
"\n",
"# Path to the folder all artifacts from this notebook are saved to.\n",
"# This entails plots as well as data tables.\n",
2025-06-06 08:24:47 +00:00
"OUT_PATH = f\"out/{EXPERIMENT_NAME}/\"\n",
"\n",
2022-09-15 16:17:24 +02:00
"# Whether to cache the results of long computations per set of inputs\n",
2022-09-15 18:04:45 +02:00
"CACHING_ENABLED = False\n",
2022-09-15 16:17:24 +02:00
"\n",
"# Whether to annotate topics/publications with bandwidth/message size\n",
"BW_ENABLED = False\n",
"# Path to a HDF5 file as output by ma-hw-perf-tools/messages/record.bash\n",
"# Used to annotate message sizes in E2E latency calculations\n",
2023-02-15 17:02:20 +09:00
"BW_PATH = \"path/to/messages.h5\"\n",
"\n",
"# Whether to use dependencies extracted by the Clang-tools to supplement\n",
"# automatic node-internal data flow annotations.\n",
"# If in doubt, set to False.\n",
"CL_ENABLED = False\n",
"# Path to the output directory of the ROS2 dependency checker.\n",
"# Will only be used if CL_ENABLED is True.\n",
2023-02-15 17:02:20 +09:00
"CL_PATH = \"/path/to/code_analysis/output\"\n",
"\n",
"# Whether to compute data flow graphs.\n",
"# If you are only interested in E2E latencies, set this to False\n",
2025-06-03 13:43:48 +00:00
"DFG_ENABLED = True\n",
"# Whether to plot data flow graphs (ignored if DFG_ENABLED is False)\n",
2025-06-03 13:43:48 +00:00
"DFG_PLOT = True\n",
"\n",
"# The maximum node namespace hierarchy level to be plotted.\n",
"# Top-level (1): e.g. /sensing, /control, etc.\n",
"# Level 3: e.g. /sensing/lidar/pointcloud_processor\n",
"DFG_MAX_HIER_LEVEL = 100\n",
"\n",
"# RegEx pattern for nodes that shall be marked as system inputs\n",
"# These will be plotted with a start arrow as known from automata diagrams\n",
2025-06-03 13:43:48 +00:00
"DFG_INPUT_NODE_PATTERNS = [r\"^/input_\"]\n",
"# RegEx pattern for nodes that shall be marked as system outputs\n",
"# These will be plotted with a double border\n",
2025-06-03 13:43:48 +00:00
"DFG_OUTPUT_NODE_PATTERNS = [r\"^/output_\"]\n",
"# RegEx for nodes which shall not be plotted in the DFG\n",
"DFG_EXCL_NODE_PATTERNS = [r\"^/rviz2\"]\n",
"\n",
"# Whether to compute E2E latencies.\n",
"E2E_ENABLED = True\n",
"# Whether to plot end-to-end latency information (ignored if E2E_ENABLED is False)\n",
"E2E_PLOT = True\n",
"# The index of the output message that shall be used in plots that visualize a specific\n",
"# message dependency tree. This index has to be 0 <= n < #output messages\n",
2025-06-03 13:43:48 +00:00
"E2E_PLOT_TIMESTAMP = 100\n",
"# E2E latency threshold. Every E2E latency higher than this is discarded.\n",
"# Set this as low as comfortably possible to speed up calculations.\n",
"# WARNING: If you set this too low (i.e. to E2E latencies that plausibly can happen)\n",
"# your results will be wrong)\n",
2025-06-03 13:43:48 +00:00
"E2E_TIME_LIMIT_S = 500\n",
"\n",
"# All topics containing any of these RegEx patterns are considered output topics in E2E latency calculations\n",
"# E.g. r\"^/control/\" will cover all control topics\n",
2025-06-03 13:43:48 +00:00
"E2E_OUTPUT_TOPIC_PATTERNS = [r\"^/output/\"]\n",
"# All topics containing any of these RegEx patterns are considered input topics in E2E latency calculations\n",
"# E.g. r\"^/sensing/\" will cover all sensing topics\n",
2025-06-03 13:43:48 +00:00
"E2E_INPUT_TOPIC_PATTERNS = [r\"^/input/\"]\n",
"\n",
2022-09-20 15:42:24 +02:00
"# E2E paths are uniquely identified by a string like \"/topic/1 -> void(Node1)(args1) -> /topic/2 -> void(Node2)(args2) -> void(Node2)(args3) -> ...\".\n",
"# Certain patterns only occur in initial setup or in scenario switching and can be excluded via RegEx patterns here.\n",
2025-06-03 13:43:48 +00:00
"E2E_EXCL_PATH_PATTERNS = [r\"^/parameter_events\"]\n",
2022-09-20 15:42:24 +02:00
"\n",
"# To specify paths of interest, topic/callback name patterns that HAVE TO OCCUR in each E2E path can be specified as RegEx here.\n",
"#E2E_INCL_PATH_PATTERNS = [\"BehaviorPathPlanner\", \"BehaviorVelocityPlanner\", \"pointcloud_preprocessor::Filter\", r\"^/sensing/.*?pointcloud\"]\n",
"E2E_INCL_PATH_PATTERNS = []\n",
"\n",
"# If an exact path through the system is known, this variabe can be set to a list (order matters!) of all elements on the path.\n",
"# The first item ist the one at the \"input end\" of the system, the last one the \"output end\".\n",
2025-06-03 13:43:48 +00:00
"E2E_EXACT_PATH = []\n",
2022-09-20 15:42:24 +02:00
"\n",
"# For development purposes only. Leave this at False.\n",
"DEBUG = False\n",
"\n",
"# For development purposes only. Leave this at False.\n",
"MANUAL_CACHE = False\n",
"\n",
"##################################################\n",
"# End of User Settings\n",
"##################################################\n",
"\n",
"# This code overrides the above constants with environment variables, with values from the environment.\n",
"# Values will be parsed through Python's literal_eval() function. Thus, strings have to be specified\n",
"# including \" or '.\n",
"for env_key, env_value in os.environ.items():\n",
" if env_key.startswith(\"ANA_NB_\"):\n",
" key = env_key.removeprefix(\"ANA_NB_\")\n",
" if key not in globals().keys():\n",
" continue\n",
" value = parse_as(type(globals()[key]), env_value)\n",
" globals()[key] = value\n",
"\n",
2022-09-15 18:04:45 +02:00
"\n",
"# Convert input paths to absolute paths\n",
"def _expand_path(path):\n",
" return os.path.realpath(os.path.expandvars(os.path.expanduser(path)))\n",
"\n",
2022-09-15 18:04:45 +02:00
"\n",
"TRACING_WS_BUILD_PATH = _expand_path(TRACING_WS_BUILD_PATH)\n",
"TR_PATH = _expand_path(TR_PATH)\n",
"OUT_PATH = _expand_path(OUT_PATH)\n",
"BW_PATH = _expand_path(BW_PATH)\n",
"CL_PATH = _expand_path(CL_PATH)\n",
"\n",
"os.makedirs(OUT_PATH, exist_ok=True)\n",
"\n",
"# Print parsed user settings\n",
"print(\"User Settings:\")\n",
"for k, v in globals().copy().items():\n",
" if not k.isupper():\n",
" continue\n",
" if isinstance(v, Iterable) and not isinstance(v, str):\n",
" v = (\"\\n \" + (\" \" * 44)).join(list(map(str, v)))\n",
" print(f\" {k:.<40s} := {v}\")"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 3,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# The last few imports can only be resolved using the user-specified paths above\n",
"sys.path.append(os.path.join(TRACING_WS_BUILD_PATH, \"tracetools_read/\"))\n",
"sys.path.append(os.path.join(TRACING_WS_BUILD_PATH, \"tracetools_analysis/\"))\n",
"# noinspection PyUnresolvedReferences\n",
"from tracetools_read.trace import *\n",
"# noinspection PyUnresolvedReferences\n",
"from tracetools_analysis.loading import load_file\n",
"# noinspection PyUnresolvedReferences\n",
"from tracetools_analysis.processor.ros2 import Ros2Handler\n",
"\n",
"from tracing_interop.tr_types import *"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "markdown",
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"source": [
"# Load Trace Data\n",
"\n",
"Load (and, if necessary, convert) tracing data obtained through ros2_tracing. Build indices for fast analysis."
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 4,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[CACHE] Cache disabled for tr_objects.\n",
"found converted file: /home/niklas/dataflow-analysis/traces/full_topology_tracing-20250603152153/ust/converted\n",
" [100%] [Ros2Handler]\n",
"[TrContext] Processing ROS 2 objects from traces...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
" ├─ Processing TrNodes: 100%|██████████| 16/16 [00:00<00:00, 192289.01it/s]\n",
" ├─ Processing TrPublishers: 100%|██████████| 48/48 [00:00<00:00, 379861.49it/s]\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[DEBUG] Duplicate Indices in id\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
" ├─ Processing TrSubscriptions: 100%|██████████| 31/31 [00:00<00:00, 366263.17it/s]\n",
" ├─ Processing TrTimers: 100%|██████████| 6/6 [00:00<00:00, 151601.35it/s]\n",
" ├─ Processing TrTimerNodeLinks: 100%|██████████| 6/6 [00:00<00:00, 167772.16it/s]\n",
" ├─ Processing TrSubscriptionObjects: 100%|██████████| 31/31 [00:00<00:00, 485162.03it/s]\n",
" ├─ Processing TrCallbackObjects: 100%|██████████| 133/133 [00:00<00:00, 681126.29it/s]\n",
" ├─ Processing TrCallbackSymbols: 100%|██████████| 133/133 [00:00<00:00, 294065.59it/s]\n",
" ├─ Processing TrPublishInstances: 100%|██████████| 20207/20207 [00:00<00:00, 256853.79it/s]\n",
" ├─ Processing TrCallbackInstances: 100%|██████████| 20311/20311 [00:00<00:00, 284248.82it/s]\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done.\n"
]
}
],
"source": [
"def _load_traces():\n",
" file = load_file(TR_PATH)\n",
" handler = Ros2Handler.process(file)\n",
" return TrContext(handler)\n",
"\n",
2022-08-09 18:36:53 +02:00
"\n",
2022-09-15 18:04:45 +02:00
"_tracing_context = cached(\"tr_objects\", _load_traces, [TR_PATH], not CACHING_ENABLED)\n",
"_tr_globals = [\"nodes\", \"publishers\", \"subscriptions\", \"timers\", \"timer_node_links\", \"subscription_objects\",\n",
" \"callback_objects\", \"callback_symbols\", \"publish_instances\", \"callback_instances\", \"topics\"]\n",
"\n",
"# Help the IDE recognize those identifiers by assigning a dummy value to their name.\n",
"nodes: Index = Index([])\n",
"publishers: Index = Index([])\n",
"subscriptions: Index = Index([])\n",
"timers: Index = Index([])\n",
"timer_node_links: Index = Index([])\n",
"subscription_objects: Index = Index([])\n",
"callback_objects: Index = Index([])\n",
"callback_symbols: Index = Index([])\n",
"publish_instances: Index = Index([])\n",
"callback_instances: Index = Index([])\n",
"topics: Index = Index([])\n",
"\n",
"for name in _tr_globals:\n",
" globals()[name] = getattr(_tracing_context, name)\n",
2022-05-30 16:51:06 +02:00
"\n",
"print(\"Done.\")"
2023-02-15 17:02:20 +09:00
]
},
2022-09-16 13:36:42 +02:00
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 5,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/camera/debayered................................................................................................................. | 499 msgs\n",
"/camera/geometric................................................................................................................. | 499 msgs\n",
"/camera/radiometric............................................................................................................... | 499 msgs\n",
"/flight/plan...................................................................................................................... | 3596 msgs\n",
"/input/baro/alt................................................................................................................... | 601 msgs\n",
"/input/camera/raw................................................................................................................. | 499 msgs\n",
"/input/gps/fix.................................................................................................................... | 703 msgs\n",
"/input/imu/data................................................................................................................... | 499 msgs\n",
"/input/lidar/scan................................................................................................................. | 998 msgs\n",
"/input/operator/commands.......................................................................................................... | 798 msgs\n",
"/output/camera/mapped............................................................................................................. | 499 msgs\n",
"/output/classifier/classification................................................................................................. | 499 msgs\n",
"/output/flight/cmd................................................................................................................ | 3595 msgs\n",
"/output/telemetry/radio........................................................................................................... | 2302 msgs\n",
"/parameter_events................................................................................................................. | 16 msgs\n",
"/rosout........................................................................................................................... | 0 msgs\n",
"/sensors/fused.................................................................................................................... | 1803 msgs\n",
"/telemetry/data................................................................................................................... | 2302 msgs\n",
"\n",
"[DEBUG] INPUT TOPICS\n",
"--[DEBUG] ^/input/ :/input/baro/alt.......................................................................... | 601 msgs\n",
"--[DEBUG] ^/input/ :/input/camera/raw........................................................................ | 499 msgs\n",
"--[DEBUG] ^/input/ :/input/gps/fix........................................................................... | 703 msgs\n",
"--[DEBUG] ^/input/ :/input/imu/data.......................................................................... | 499 msgs\n",
"--[DEBUG] ^/input/ :/input/lidar/scan........................................................................ | 998 msgs\n",
"--[DEBUG] ^/input/ :/input/operator/commands................................................................. | 798 msgs\n",
"\n",
"[DEBUG] OUTPUT TOPICS\n",
"--[DEBUG] ^/output/ :/output/camera/mapped.................................................................... | 499 msgs\n",
"--[DEBUG] ^/output/ :/output/classifier/classification........................................................ | 499 msgs\n",
"--[DEBUG] ^/output/ :/output/flight/cmd....................................................................... | 3595 msgs\n",
"--[DEBUG] ^/output/ :/output/telemetry/radio.................................................................. | 2302 msgs\n"
]
}
],
2022-09-16 13:36:42 +02:00
"source": [
"##################################################\n",
"# Print (All/Input/Output) Topic Message Counts\n",
"##################################################\n",
"\n",
2022-09-16 16:38:23 +02:00
"for topic in sorted(topics, key=lambda t: t.name):\n",
2022-09-16 13:36:42 +02:00
" topic: TrTopic\n",
" print(f\"{topic.name:.<130s} | {sum(map(lambda p: len(p.instances), topic.publishers)):>5d} msgs\")\n",
2022-09-20 12:44:04 +02:00
"\n",
"print(\"\\n[DEBUG] INPUT TOPICS\")\n",
2022-09-20 12:44:04 +02:00
"for t in sorted(topics, key=lambda t: t.name):\n",
" for f in E2E_INPUT_TOPIC_PATTERNS:\n",
" if re.search(f, t.name):\n",
" print(f\"--[DEBUG] {f:<30s}:{t.name:.<89s} | {sum(map(lambda p: len(p.instances), t.publishers)):>5d} msgs\")\n",
2022-09-20 12:44:04 +02:00
"\n",
"print(\"\\n[DEBUG] OUTPUT TOPICS\")\n",
2022-09-20 12:44:04 +02:00
"for t in sorted(topics, key=lambda t: t.name):\n",
" for f in E2E_OUTPUT_TOPIC_PATTERNS:\n",
" if re.search(f, t.name):\n",
" print(f\"--[DEBUG] {f:<30s}:{t.name:.<89s} | {sum(map(lambda p: len(p.instances), t.publishers)):>5d} msgs\")"
2023-02-15 17:02:20 +09:00
]
2022-09-16 13:36:42 +02:00
},
{
"cell_type": "markdown",
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"source": [
"# Analyze ROS Graph\n",
"Reconstruct namespace hierarchy, data flow graph between callbacks."
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 6,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[CACHE] Cache disabled for lat_graph.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Finding CB nodes: 100%|██████████| 133/133 [00:00<00:00, 317316.51it/s]\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[DEBUG] 96 callbacks have no owner, filtering them out.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Processing node publications: 100%|██████████| 16/16 [00:00<00:00, 329.99it/s]\n",
"Processing CB subscriptions: 100%|██████████| 37/37 [00:00<00:00, 734.78it/s]\n",
"Building graph edges: 100%|██████████| 18/18 [00:00<00:00, 199201.77it/s]\n",
"Building graph nodes: 100%|██████████| 37/37 [00:00<00:00, 2492.16it/s]\n"
2025-06-03 13:43:48 +00:00
]
}
],
"source": [
"import latency_graph.latency_graph_structure as lg\n",
"\n",
2022-09-15 18:04:45 +02:00
"\n",
"def _make_latency_graph():\n",
" return lg.LatencyGraph(_tracing_context)\n",
"\n",
2022-09-15 18:04:45 +02:00
"\n",
"lat_graph = cached(\"lat_graph\", _make_latency_graph, [TR_PATH], not CACHING_ENABLED)"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "markdown",
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"source": [
"## Plot ROS Graph (full)\n",
"Plot the DFG hierarchically by node namespace. Plot each internal and external dependency between callbacks as one arrow."
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 7,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Processing INPUT: 1\n",
" Processing OUTPUT: 1\n",
" Processing input_camera_node: 2\n",
" Processing debayer_node: 2\n",
" Processing radiometric_node: 2\n",
" Processing geometric_node: 2\n",
" Processing output_mapping_node: 2\n",
" Processing output_smoke_classifier_node: 2\n",
" Processing input_gps_node: 2\n",
" Processing input_imu_node: 2\n",
" Processing input_baro_node: 2\n",
" Processing sensor_fusion_node: 4\n",
" Processing input_lidar_node: 2\n",
" Processing input_operator_cmd_node: 2\n",
" Processing flight_mgmt_node: 4\n",
" Processing output_flight_control_node: 2\n",
" Processing telemetry_node: 3\n",
" Processing output_radio_tx_node: 2\n"
]
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.43.0 (0)\n",
" -->\n",
"<!-- Title: G Pages: 1 -->\n",
"<svg width=\"12451pt\" height=\"1009pt\"\n",
" viewBox=\"0.00 0.00 12451.00 1009.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 1005)\">\n",
"<title>G</title>\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-1005 12447,-1005 12447,4 -4,4\"/>\n",
"<g id=\"clust1\" class=\"cluster\">\n",
"<title>cluster___INPUT</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"6721,-940 6721,-1001 6803,-1001 6803,-940 6721,-940\"/>\n",
"<text text-anchor=\"middle\" x=\"6762\" y=\"-985.8\" font-family=\"Times,serif\" font-size=\"14.00\">INPUT</text>\n",
"</g>\n",
"<g id=\"clust2\" class=\"cluster\">\n",
"<title>cluster___OUTPUT</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"6330,-940 6330,-1001 6427,-1001 6427,-940 6330,-940\"/>\n",
"<text text-anchor=\"middle\" x=\"6378.5\" y=\"-985.8\" font-family=\"Times,serif\" font-size=\"14.00\">OUTPUT</text>\n",
"</g>\n",
"<g id=\"clust3\" class=\"cluster\">\n",
"<title>cluster___input_camera_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"0,-490 0,-590 1191,-590 1191,-490 0,-490\"/>\n",
"<text text-anchor=\"middle\" x=\"595.5\" y=\"-574.8\" font-family=\"Times,serif\" font-size=\"14.00\">input_camera_node</text>\n",
"</g>\n",
"<g id=\"clust4\" class=\"cluster\">\n",
"<title>cluster___debayer_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1211,-490 1211,-590 2985,-590 2985,-490 1211,-490\"/>\n",
"<text text-anchor=\"middle\" x=\"2098\" y=\"-574.8\" font-family=\"Times,serif\" font-size=\"14.00\">debayer_node</text>\n",
"</g>\n",
"<g id=\"clust5\" class=\"cluster\">\n",
"<title>cluster___radiometric_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"3005,-490 3005,-590 4833,-590 4833,-490 3005,-490\"/>\n",
"<text text-anchor=\"middle\" x=\"3919\" y=\"-574.8\" font-family=\"Times,serif\" font-size=\"14.00\">radiometric_node</text>\n",
"</g>\n",
"<g id=\"clust6\" class=\"cluster\">\n",
"<title>cluster___geometric_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"4893.5,-544 4893.5,-644 6695.5,-644 6695.5,-544 4893.5,-544\"/>\n",
"<text text-anchor=\"middle\" x=\"5794.5\" y=\"-628.8\" font-family=\"Times,serif\" font-size=\"14.00\">geometric_node</text>\n",
"</g>\n",
"<g id=\"clust7\" class=\"cluster\">\n",
"<title>cluster___output_mapping_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"6793.5,-456 6793.5,-556 8573.5,-556 8573.5,-456 6793.5,-456\"/>\n",
"<text text-anchor=\"middle\" x=\"7683.5\" y=\"-540.8\" font-family=\"Times,serif\" font-size=\"14.00\">output_mapping_node</text>\n",
"</g>\n",
"<g id=\"clust8\" class=\"cluster\">\n",
"<title>cluster___output_smoke_classifier_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"4853,-436 4853,-536 6736,-536 6736,-436 4853,-436\"/>\n",
"<text text-anchor=\"middle\" x=\"5794.5\" y=\"-520.8\" font-family=\"Times,serif\" font-size=\"14.00\">output_smoke_classifier_node</text>\n",
"</g>\n",
"<g id=\"clust9\" class=\"cluster\">\n",
"<title>cluster___input_gps_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"5223.5,-328 5223.5,-428 6365.5,-428 6365.5,-328 5223.5,-328\"/>\n",
"<text text-anchor=\"middle\" x=\"5794.5\" y=\"-412.8\" font-family=\"Times,serif\" font-size=\"14.00\">input_gps_node</text>\n",
"</g>\n",
"<g id=\"clust10\" class=\"cluster\">\n",
"<title>cluster___input_imu_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"5223,-220 5223,-320 6366,-320 6366,-220 5223,-220\"/>\n",
"<text text-anchor=\"middle\" x=\"5794.5\" y=\"-304.8\" font-family=\"Times,serif\" font-size=\"14.00\">input_imu_node</text>\n",
"</g>\n",
"<g id=\"clust11\" class=\"cluster\">\n",
"<title>cluster___input_baro_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"5220.5,-112 5220.5,-212 6368.5,-212 6368.5,-112 5220.5,-112\"/>\n",
"<text text-anchor=\"middle\" x=\"5794.5\" y=\"-196.8\" font-family=\"Times,serif\" font-size=\"14.00\">input_baro_node</text>\n",
"</g>\n",
"<g id=\"clust12\" class=\"cluster\">\n",
"<title>cluster___sensor_fusion_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"6756,-216 6756,-394 8611,-394 8611,-216 6756,-216\"/>\n",
"<text text-anchor=\"middle\" x=\"7683.5\" y=\"-378.8\" font-family=\"Times,serif\" font-size=\"14.00\">sensor_fusion_node</text>\n",
"</g>\n",
"<g id=\"clust13\" class=\"cluster\">\n",
"<title>cluster___input_lidar_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"7106,-108 7106,-208 8261,-208 8261,-108 7106,-108\"/>\n",
"<text text-anchor=\"middle\" x=\"7683.5\" y=\"-192.8\" font-family=\"Times,serif\" font-size=\"14.00\">input_lidar_node</text>\n",
"</g>\n",
"<g id=\"clust14\" class=\"cluster\">\n",
"<title>cluster___input_operator_cmd_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"7071.5,0 7071.5,-100 8295.5,-100 8295.5,0 7071.5,0\"/>\n",
"<text text-anchor=\"middle\" x=\"7683.5\" y=\"-84.8\" font-family=\"Times,serif\" font-size=\"14.00\">input_operator_cmd_node</text>\n",
"</g>\n",
"<g id=\"clust15\" class=\"cluster\">\n",
"<title>cluster___flight_mgmt_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"8631,-99 8631,-277 10663,-277 10663,-99 8631,-99\"/>\n",
"<text text-anchor=\"middle\" x=\"9647\" y=\"-261.8\" font-family=\"Times,serif\" font-size=\"14.00\">flight_mgmt_node</text>\n",
"</g>\n",
"<g id=\"clust16\" class=\"cluster\">\n",
"<title>cluster___output_flight_control_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"10683,-138 10683,-238 12443,-238 12443,-138 10683,-138\"/>\n",
"<text text-anchor=\"middle\" x=\"11563\" y=\"-222.8\" font-family=\"Times,serif\" font-size=\"14.00\">output_flight_control_node</text>\n",
"</g>\n",
"<g id=\"clust17\" class=\"cluster\">\n",
"<title>cluster___telemetry_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"8695.5,-289 8695.5,-428 10598.5,-428 10598.5,-289 8695.5,-289\"/>\n",
"<text text-anchor=\"middle\" x=\"9647\" y=\"-412.8\" font-family=\"Times,serif\" font-size=\"14.00\">telemetry_node</text>\n",
"</g>\n",
"<g id=\"clust18\" class=\"cluster\">\n",
"<title>cluster___output_radio_tx_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"10695.5,-347 10695.5,-447 12430.5,-447 12430.5,-347 10695.5,-347\"/>\n",
"<text text-anchor=\"middle\" x=\"11563\" y=\"-431.8\" font-family=\"Times,serif\" font-size=\"14.00\">output_radio_tx_node</text>\n",
"</g>\n",
"<!-- INPUT -->\n",
"<g id=\"node1\" class=\"node\">\n",
"<title>INPUT</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6729,-948 6729,-969 6735,-969 6735,-948 6729,-948\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6735,-948 6735,-969 6789,-969 6789,-948 6735,-948\"/>\n",
"<text text-anchor=\"start\" x=\"6738\" y=\"-954.8\" font-family=\"Times,serif\" font-size=\"14.00\">INPUT</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6789,-948 6789,-969 6795,-969 6795,-948 6789,-948\"/>\n",
"</g>\n",
"<!-- OUTPUT -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>OUTPUT</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6338.5,-948 6338.5,-969 6344.5,-969 6344.5,-948 6338.5,-948\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6344.5,-948 6344.5,-969 6413.5,-969 6413.5,-948 6344.5,-948\"/>\n",
"<text text-anchor=\"start\" x=\"6347.5\" y=\"-954.8\" font-family=\"Times,serif\" font-size=\"14.00\">OUTPUT</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6413.5,-948 6413.5,-969 6419.5,-969 6419.5,-948 6413.5,-948\"/>\n",
"</g>\n",
"<!-- 187650647101952 -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>187650647101952</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8.5,-537 8.5,-558 14.5,-558 14.5,-537 8.5,-537\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"14.5,-537 14.5,-558 1177.5,-558 1177.5,-537 14.5,-537\"/>\n",
"<text text-anchor=\"start\" x=\"17.5\" y=\"-543.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(CameraNode::CameraNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))()</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"1177.5,-537 1177.5,-558 1183.5,-558 1183.5,-537 1177.5,-537\"/>\n",
"</g>\n",
"<!-- 187650647327232 -->\n",
"<g id=\"node5\" class=\"node\">\n",
"<title>187650647327232</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"1219,-537 1219,-558 1225,-558 1225,-537 1219,-537\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"1225,-537 1225,-558 2971,-558 2971,-537 1225,-537\"/>\n",
"<text text-anchor=\"start\" x=\"1228\" y=\"-543.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(DebayerNode::DebayerNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"2971,-537 2971,-558 2977,-558 2977,-537 2971,-537\"/>\n",
"</g>\n",
"<!-- 187650647101952&#45;&gt;187650647327232 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge13\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650647101952:out&#45;&gt;187650647327232:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M1184.5,-547C1195.2,-547 1200.13,-547 1207.59,-547\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"1208,-550.5 1218,-547 1208,-543.5 1208,-550.5\"/>\n",
"</g>\n",
"<!-- 187650647093888 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>187650647093888</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"361.5,-498 361.5,-519 367.5,-519 367.5,-498 361.5,-498\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"367.5,-498 367.5,-519 824.5,-519 824.5,-498 367.5,-498\"/>\n",
"<text text-anchor=\"start\" x=\"370.5\" y=\"-504.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"824.5,-498 824.5,-519 830.5,-519 830.5,-498 824.5,-498\"/>\n",
"</g>\n",
"<!-- 187650647510848 -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>187650647510848</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"3013,-537 3013,-558 3019,-558 3019,-537 3013,-537\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"3019,-537 3019,-558 4819,-558 4819,-537 3019,-537\"/>\n",
"<text text-anchor=\"start\" x=\"3022\" y=\"-543.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(RadiometricNode::RadiometricNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"4819,-537 4819,-558 4825,-558 4825,-537 4819,-537\"/>\n",
"</g>\n",
"<!-- 187650647327232&#45;&gt;187650647510848 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge16\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650647327232:out&#45;&gt;187650647510848:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M2978,-547C2989.1,-547 2994.08,-547 3001.93,-547\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"3002,-550.5 3012,-547 3002,-543.5 3002,-550.5\"/>\n",
"</g>\n",
"<!-- 187650647317664 -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>187650647317664</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"1864,-498 1864,-519 1870,-519 1870,-498 1864,-498\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"1870,-498 1870,-519 2327,-519 2327,-498 1870,-498\"/>\n",
"<text text-anchor=\"start\" x=\"1873\" y=\"-504.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"2327,-498 2327,-519 2333,-519 2333,-498 2327,-498\"/>\n",
"</g>\n",
"<!-- 187650647733456 -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>187650647733456</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"4901.5,-591 4901.5,-612 4907.5,-612 4907.5,-591 4901.5,-591\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"4907.5,-591 4907.5,-612 6681.5,-612 6681.5,-591 4907.5,-591\"/>\n",
"<text text-anchor=\"start\" x=\"4910.5\" y=\"-597.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(GeometricNode::GeometricNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6681.5,-591 6681.5,-612 6687.5,-612 6687.5,-591 6681.5,-591\"/>\n",
"</g>\n",
"<!-- 187650647510848&#45;&gt;187650647733456 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge14\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650647510848:out&#45;&gt;187650647733456:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M4826,-547C4846,-547 4837.02,-570.98 4853,-583 4867.94,-594.24 4875.23,-599.21 4890.11,-600.58\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"4890.37,-604.1 4900.5,-601 4890.65,-597.1 4890.37,-604.1\"/>\n",
"</g>\n",
"<!-- 187650648131424 -->\n",
"<g id=\"node13\" class=\"node\">\n",
"<title>187650648131424</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"4861.5,-483 4861.5,-504 4867.5,-504 4867.5,-483 4861.5,-483\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"4867.5,-483 4867.5,-504 6722.5,-504 6722.5,-483 4867.5,-483\"/>\n",
"<text text-anchor=\"start\" x=\"4870.5\" y=\"-489.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(SmokeClassifierNode::SmokeClassifierNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6722.5,-483 6722.5,-504 6728.5,-504 6728.5,-483 6722.5,-483\"/>\n",
"</g>\n",
"<!-- 187650647510848&#45;&gt;187650648131424 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge15\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650647510848:out&#45;&gt;187650648131424:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M4826,-547C4850.25,-547 4837.57,-507.84 4850.85,-496.22\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"4852.12,-499.48 4860.5,-493 4849.91,-492.84 4852.12,-499.48\"/>\n",
"</g>\n",
"<!-- 187650647492400 -->\n",
"<g id=\"node8\" class=\"node\">\n",
"<title>187650647492400</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"3685,-498 3685,-519 3691,-519 3691,-498 3685,-498\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"3691,-498 3691,-519 4148,-519 4148,-498 3691,-498\"/>\n",
"<text text-anchor=\"start\" x=\"3694\" y=\"-504.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"4148,-498 4148,-519 4154,-519 4154,-498 4148,-498\"/>\n",
"</g>\n",
"<!-- 187650647372752 -->\n",
"<g id=\"node12\" class=\"node\">\n",
"<title>187650647372752</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6801.5,-464 6801.5,-485 6807.5,-485 6807.5,-464 6801.5,-464\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6807.5,-464 6807.5,-485 8559.5,-485 8559.5,-464 6807.5,-464\"/>\n",
"<text text-anchor=\"start\" x=\"6810.5\" y=\"-470.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(MappingNode::MappingNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8559.5,-464 8559.5,-485 8565.5,-485 8565.5,-464 8559.5,-464\"/>\n",
"</g>\n",
"<!-- 187650647733456&#45;&gt;187650647372752 -->\n",
"<g id=\"edge22\" class=\"edge\">\n",
"<title>187650647733456:out&#45;&gt;187650647372752:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M6688.5,-601C6711.08,-601 6721.18,-600.03 6736,-583 6762.33,-552.74 6730.88,-526.27 6756,-495 6767.34,-480.88 6775.42,-475.74 6790.28,-474.4\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"6790.64,-477.89 6800.5,-474 6790.37,-470.89 6790.64,-477.89\"/>\n",
"</g>\n",
"<!-- 187650647690704 -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>187650647690704</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5560.5,-552 5560.5,-573 5566.5,-573 5566.5,-552 5560.5,-552\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5566.5,-552 5566.5,-573 6023.5,-573 6023.5,-552 5566.5,-552\"/>\n",
"<text text-anchor=\"start\" x=\"5569.5\" y=\"-558.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6023.5,-552 6023.5,-573 6029.5,-573 6029.5,-552 6023.5,-552\"/>\n",
"</g>\n",
"<!-- 187650647886896 -->\n",
"<g id=\"node11\" class=\"node\">\n",
"<title>187650647886896</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7449.5,-503 7449.5,-524 7455.5,-524 7455.5,-503 7449.5,-503\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7455.5,-503 7455.5,-524 7912.5,-524 7912.5,-503 7455.5,-503\"/>\n",
"<text text-anchor=\"start\" x=\"7458.5\" y=\"-509.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7912.5,-503 7912.5,-524 7918.5,-524 7918.5,-503 7912.5,-503\"/>\n",
"</g>\n",
"<!-- 187650649967104 -->\n",
"<g id=\"node36\" class=\"node\">\n",
"<title>187650649967104</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8704,-375 8704,-396 8710,-396 8710,-375 8704,-375\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8710,-375 8710,-396 10585,-396 10585,-375 8710,-375\"/>\n",
"<text text-anchor=\"start\" x=\"8713\" y=\"-381.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(TelemetryNode::TelemetryNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10585,-375 10585,-396 10591,-396 10591,-375 10585,-375\"/>\n",
"</g>\n",
"<!-- 187650647372752&#45;&gt;187650649967104 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge10\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650647372752:out&#45;&gt;187650649967104:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8566.5,-474C8635.39,-474 8631.2,-393.48 8692.95,-385.62\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8693.23,-389.11 8703,-385 8692.8,-382.12 8693.23,-389.11\"/>\n",
"</g>\n",
"<!-- 187650648096592 -->\n",
"<g id=\"node14\" class=\"node\">\n",
"<title>187650648096592</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5560.5,-444 5560.5,-465 5566.5,-465 5566.5,-444 5560.5,-444\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5566.5,-444 5566.5,-465 6023.5,-465 6023.5,-444 5566.5,-444\"/>\n",
"<text text-anchor=\"start\" x=\"5569.5\" y=\"-450.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6023.5,-444 6023.5,-465 6029.5,-465 6029.5,-444 6023.5,-444\"/>\n",
"</g>\n",
"<!-- 187650648296336 -->\n",
"<g id=\"node15\" class=\"node\">\n",
"<title>187650648296336</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5231.5,-375 5231.5,-396 5237.5,-396 5237.5,-375 5231.5,-375\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5237.5,-375 5237.5,-396 6351.5,-396 6351.5,-375 5237.5,-375\"/>\n",
"<text text-anchor=\"start\" x=\"5240.5\" y=\"-381.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(GPSNode::GPSNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))()</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6351.5,-375 6351.5,-396 6357.5,-396 6357.5,-375 6351.5,-375\"/>\n",
"</g>\n",
"<!-- 187650648938336 -->\n",
"<g id=\"node24\" class=\"node\">\n",
"<title>187650648938336</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6764.5,-341 6764.5,-362 6770.5,-362 6770.5,-341 6764.5,-341\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6770.5,-341 6770.5,-362 8597.5,-362 8597.5,-341 6770.5,-341\"/>\n",
"<text text-anchor=\"start\" x=\"6773.5\" y=\"-347.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(FusionNode::FusionNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8597.5,-341 8597.5,-362 8603.5,-362 8603.5,-341 8597.5,-341\"/>\n",
"</g>\n",
"<!-- 187650648296336&#45;&gt;187650648938336 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge17\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648296336:out&#45;&gt;187650648938336:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M6358.5,-385C6526.47,-385 6574.92,-414.6 6736,-367 6745.32,-364.25 6748.14,-357.72 6753.59,-353.9\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"6754.89,-357.17 6763.5,-351 6752.92,-350.45 6754.89,-357.17\"/>\n",
"</g>\n",
"<!-- 187650648289664 -->\n",
"<g id=\"node16\" class=\"node\">\n",
"<title>187650648289664</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5560.5,-336 5560.5,-357 5566.5,-357 5566.5,-336 5560.5,-336\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5566.5,-336 5566.5,-357 6023.5,-357 6023.5,-336 5566.5,-336\"/>\n",
"<text text-anchor=\"start\" x=\"5569.5\" y=\"-342.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6023.5,-336 6023.5,-357 6029.5,-357 6029.5,-336 6023.5,-336\"/>\n",
"</g>\n",
"<!-- 187650647921232 -->\n",
"<g id=\"node17\" class=\"node\">\n",
"<title>187650647921232</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5231.5,-267 5231.5,-288 5237.5,-288 5237.5,-267 5231.5,-267\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5237.5,-267 5237.5,-288 6352.5,-288 6352.5,-267 5237.5,-267\"/>\n",
"<text text-anchor=\"start\" x=\"5240.5\" y=\"-273.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(IMUNode::IMUNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))()</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6352.5,-267 6352.5,-288 6358.5,-288 6358.5,-267 6352.5,-267\"/>\n",
"</g>\n",
"<!-- 187650648922448 -->\n",
"<g id=\"node22\" class=\"node\">\n",
"<title>187650648922448</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6764.5,-302 6764.5,-323 6770.5,-323 6770.5,-302 6764.5,-302\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6770.5,-302 6770.5,-323 8597.5,-323 8597.5,-302 6770.5,-302\"/>\n",
"<text text-anchor=\"start\" x=\"6773.5\" y=\"-308.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(FusionNode::FusionNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8597.5,-302 8597.5,-323 8603.5,-323 8603.5,-302 8597.5,-302\"/>\n",
"</g>\n",
"<!-- 187650647921232&#45;&gt;187650648922448 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge18\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650647921232:out&#45;&gt;187650648922448:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M6359.5,-277C6536.3,-277 6581.56,-310.68 6753.35,-311.96\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"6753.49,-315.46 6763.5,-312 6753.51,-308.46 6753.49,-315.46\"/>\n",
"</g>\n",
"<!-- 187650648494000 -->\n",
"<g id=\"node18\" class=\"node\">\n",
"<title>187650648494000</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5560.5,-228 5560.5,-249 5566.5,-249 5566.5,-228 5560.5,-228\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5566.5,-228 5566.5,-249 6023.5,-249 6023.5,-228 5566.5,-228\"/>\n",
"<text text-anchor=\"start\" x=\"5569.5\" y=\"-234.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6023.5,-228 6023.5,-249 6029.5,-249 6029.5,-228 6023.5,-228\"/>\n",
"</g>\n",
"<!-- 187650648702544 -->\n",
"<g id=\"node19\" class=\"node\">\n",
"<title>187650648702544</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5228.5,-159 5228.5,-180 5234.5,-180 5234.5,-159 5228.5,-159\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5234.5,-159 5234.5,-180 6354.5,-180 6354.5,-159 5234.5,-159\"/>\n",
"<text text-anchor=\"start\" x=\"5237.5\" y=\"-165.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(BaroNode::BaroNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))()</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6354.5,-159 6354.5,-180 6360.5,-180 6360.5,-159 6354.5,-159\"/>\n",
"</g>\n",
"<!-- 187650648913568 -->\n",
"<g id=\"node21\" class=\"node\">\n",
"<title>187650648913568</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6764.5,-224 6764.5,-245 6770.5,-245 6770.5,-224 6764.5,-224\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6770.5,-224 6770.5,-245 8597.5,-245 8597.5,-224 6770.5,-224\"/>\n",
"<text text-anchor=\"start\" x=\"6773.5\" y=\"-230.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(FusionNode::FusionNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8597.5,-224 8597.5,-245 8603.5,-245 8603.5,-224 8597.5,-224\"/>\n",
"</g>\n",
"<!-- 187650648702544&#45;&gt;187650648913568 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge1\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648702544:out&#45;&gt;187650648913568:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M6361.5,-169C6529.25,-169 6578.55,-158.13 6736,-216 6745.64,-219.54 6748.1,-227 6753.79,-231.12\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"6752.92,-234.51 6763.5,-234 6754.91,-227.8 6752.92,-234.51\"/>\n",
"</g>\n",
"<!-- 187650648695248 -->\n",
"<g id=\"node20\" class=\"node\">\n",
"<title>187650648695248</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5560.5,-120 5560.5,-141 5566.5,-141 5566.5,-120 5560.5,-120\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"5566.5,-120 5566.5,-141 6023.5,-141 6023.5,-120 5566.5,-120\"/>\n",
"<text text-anchor=\"start\" x=\"5569.5\" y=\"-126.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"6023.5,-120 6023.5,-141 6029.5,-141 6029.5,-120 6023.5,-120\"/>\n",
"</g>\n",
"<!-- 187650649500800 -->\n",
"<g id=\"node31\" class=\"node\">\n",
"<title>187650649500800</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8639,-224 8639,-245 8645,-245 8645,-224 8639,-224\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8645,-224 8645,-245 10649,-245 10649,-224 8645,-224\"/>\n",
"<text text-anchor=\"start\" x=\"8648\" y=\"-230.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(FlightManagementNode::FlightManagementNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10649,-224 10649,-245 10655,-245 10655,-224 10649,-224\"/>\n",
"</g>\n",
"<!-- 187650648913568&#45;&gt;187650649500800 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge5\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648913568:out&#45;&gt;187650649500800:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8604.5,-234C8615.2,-234 8620.13,-234 8627.59,-234\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8628,-237.5 8638,-234 8628,-230.5 8628,-237.5\"/>\n",
"</g>\n",
"<!-- 187650649956624 -->\n",
"<g id=\"node35\" class=\"node\">\n",
"<title>187650649956624</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8704,-336 8704,-357 8710,-357 8710,-336 8704,-336\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8710,-336 8710,-357 10585,-357 10585,-336 8710,-336\"/>\n",
"<text text-anchor=\"start\" x=\"8713\" y=\"-342.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(TelemetryNode::TelemetryNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10585,-336 10585,-357 10591,-357 10591,-336 10585,-336\"/>\n",
"</g>\n",
"<!-- 187650648913568&#45;&gt;187650649956624 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge2\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648913568:out&#45;&gt;187650649956624:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8604.5,-234C8647.91,-234 8599.96,-297.65 8631,-328 8652,-348.54 8666.54,-346.77 8692.77,-346.14\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8693.05,-349.63 8703,-346 8692.95,-342.64 8693.05,-349.63\"/>\n",
"</g>\n",
"<!-- 187650648922448&#45;&gt;187650649500800 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge6\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648922448:out&#45;&gt;187650649500800:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8604.5,-312C8638.1,-312 8608.5,-250.13 8628.27,-236.6\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8629.24,-239.96 8638,-234 8627.44,-233.2 8629.24,-239.96\"/>\n",
"</g>\n",
"<!-- 187650648922448&#45;&gt;187650649956624 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge3\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648922448:out&#45;&gt;187650649956624:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8604.5,-312C8618.26,-312 8618.3,-322.72 8631,-328 8658.13,-339.28 8667.88,-344.75 8692.99,-345.81\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8692.93,-349.31 8703,-346 8693.07,-342.31 8692.93,-349.31\"/>\n",
"</g>\n",
"<!-- 187650648925776 -->\n",
"<g id=\"node23\" class=\"node\">\n",
"<title>187650648925776</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7449.5,-263 7449.5,-284 7455.5,-284 7455.5,-263 7449.5,-263\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7455.5,-263 7455.5,-284 7912.5,-284 7912.5,-263 7455.5,-263\"/>\n",
"<text text-anchor=\"start\" x=\"7458.5\" y=\"-269.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7912.5,-263 7912.5,-284 7918.5,-284 7918.5,-263 7912.5,-263\"/>\n",
"</g>\n",
"<!-- 187650648938336&#45;&gt;187650649500800 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge7\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648938336:out&#45;&gt;187650649500800:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8604.5,-351C8654.58,-351 8594.29,-250.72 8627.98,-235.84\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8628.8,-239.25 8638,-234 8627.53,-232.36 8628.8,-239.25\"/>\n",
"</g>\n",
"<!-- 187650648938336&#45;&gt;187650649956624 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge4\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650648938336:out&#45;&gt;187650649956624:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8604.5,-351C8644.74,-351 8657.17,-346.79 8692.84,-346.1\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8693.03,-349.59 8703,-346 8692.97,-342.59 8693.03,-349.59\"/>\n",
"</g>\n",
"<!-- 187650649139808 -->\n",
"<g id=\"node25\" class=\"node\">\n",
"<title>187650649139808</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7449.5,-155 7449.5,-176 7455.5,-176 7455.5,-155 7449.5,-155\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7455.5,-155 7455.5,-176 7912.5,-176 7912.5,-155 7455.5,-155\"/>\n",
"<text text-anchor=\"start\" x=\"7458.5\" y=\"-161.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7912.5,-155 7912.5,-176 7918.5,-176 7918.5,-155 7912.5,-155\"/>\n",
"</g>\n",
"<!-- 187650649112976 -->\n",
"<g id=\"node26\" class=\"node\">\n",
"<title>187650649112976</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7114.5,-116 7114.5,-137 7120.5,-137 7120.5,-116 7114.5,-116\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7120.5,-116 7120.5,-137 8247.5,-137 8247.5,-116 7120.5,-116\"/>\n",
"<text text-anchor=\"start\" x=\"7123.5\" y=\"-122.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(LidarNode::LidarNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))()</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8247.5,-116 8247.5,-137 8253.5,-137 8253.5,-116 8247.5,-116\"/>\n",
"</g>\n",
"<!-- 187650649524848 -->\n",
"<g id=\"node32\" class=\"node\">\n",
"<title>187650649524848</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8639,-146 8639,-167 8645,-167 8645,-146 8639,-146\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8645,-146 8645,-167 10649,-167 10649,-146 8645,-146\"/>\n",
"<text text-anchor=\"start\" x=\"8648\" y=\"-152.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(FlightManagementNode::FlightManagementNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10649,-146 10649,-167 10655,-167 10655,-146 10649,-146\"/>\n",
"</g>\n",
"<!-- 187650649112976&#45;&gt;187650649524848 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge9\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649112976:out&#45;&gt;187650649524848:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8254.5,-126C8413.19,-126 8455.64,-113.64 8611,-146 8619.22,-147.71 8622.77,-151.48 8627.85,-153.87\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8627.49,-157.38 8638,-156 8628.93,-150.52 8627.49,-157.38\"/>\n",
"</g>\n",
"<!-- 187650649330112 -->\n",
"<g id=\"node27\" class=\"node\">\n",
"<title>187650649330112</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7079.5,-47 7079.5,-68 7085.5,-68 7085.5,-47 7079.5,-47\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7085.5,-47 7085.5,-68 8281.5,-68 8281.5,-47 7085.5,-47\"/>\n",
"<text text-anchor=\"start\" x=\"7088.5\" y=\"-53.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(CommandNode::CommandNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))()</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8281.5,-47 8281.5,-68 8287.5,-68 8287.5,-47 8281.5,-47\"/>\n",
"</g>\n",
"<!-- 187650649503456 -->\n",
"<g id=\"node29\" class=\"node\">\n",
"<title>187650649503456</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8639,-107 8639,-128 8645,-128 8645,-107 8639,-107\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"8645,-107 8645,-128 10649,-128 10649,-107 8645,-107\"/>\n",
"<text text-anchor=\"start\" x=\"8648\" y=\"-113.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(FlightManagementNode::FlightManagementNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::vector&lt;std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10649,-107 10649,-128 10655,-128 10655,-107 10649,-107\"/>\n",
"</g>\n",
"<!-- 187650649330112&#45;&gt;187650649503456 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge8\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649330112:out&#45;&gt;187650649503456:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M8288.5,-57C8433.35,-57 8472.48,-61.65 8611,-104 8619.56,-106.62 8622.79,-111.59 8628.03,-114.56\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"8627.46,-118.03 8638,-117 8629.12,-111.23 8627.46,-118.03\"/>\n",
"</g>\n",
"<!-- 187650649303984 -->\n",
"<g id=\"node28\" class=\"node\">\n",
"<title>187650649303984</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7449.5,-8 7449.5,-29 7455.5,-29 7455.5,-8 7449.5,-8\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7455.5,-8 7455.5,-29 7912.5,-29 7912.5,-8 7455.5,-8\"/>\n",
"<text text-anchor=\"start\" x=\"7458.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"7912.5,-8 7912.5,-29 7918.5,-29 7918.5,-8 7912.5,-8\"/>\n",
"</g>\n",
"<!-- 187650648522864 -->\n",
"<g id=\"node34\" class=\"node\">\n",
"<title>187650648522864</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10691,-146 10691,-167 10697,-167 10697,-146 10691,-146\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10697,-146 10697,-167 12429,-167 12429,-146 10697,-146\"/>\n",
"<text text-anchor=\"start\" x=\"10700\" y=\"-152.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(ControlNode::ControlNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"12429,-146 12429,-167 12435,-167 12435,-146 12429,-146\"/>\n",
"</g>\n",
"<!-- 187650649503456&#45;&gt;187650648522864 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge19\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649503456:out&#45;&gt;187650648522864:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M10656,-117C10674.68,-117 10670.27,-142.75 10680.29,-152.4\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"10679.41,-155.8 10690,-156 10681.84,-149.24 10679.41,-155.8\"/>\n",
"</g>\n",
"<!-- 187650649497136 -->\n",
"<g id=\"node30\" class=\"node\">\n",
"<title>187650649497136</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"9413,-185 9413,-206 9419,-206 9419,-185 9413,-185\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"9419,-185 9419,-206 9876,-206 9876,-185 9419,-185\"/>\n",
"<text text-anchor=\"start\" x=\"9422\" y=\"-191.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"9876,-185 9876,-206 9882,-206 9882,-185 9876,-185\"/>\n",
"</g>\n",
"<!-- 187650649500800&#45;&gt;187650648522864 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge21\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649500800:out&#45;&gt;187650648522864:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M10656,-234C10689.68,-234 10660.34,-172.13 10680.23,-158.6\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"10681.23,-161.95 10690,-156 10679.44,-155.19 10681.23,-161.95\"/>\n",
"</g>\n",
"<!-- 187650649524848&#45;&gt;187650648522864 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge20\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649524848:out&#45;&gt;187650648522864:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M10656,-156C10667.1,-156 10672.08,-156 10679.93,-156\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"10680,-159.5 10690,-156 10680,-152.5 10680,-159.5\"/>\n",
"</g>\n",
"<!-- 187650649726160 -->\n",
"<g id=\"node33\" class=\"node\">\n",
"<title>187650649726160</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"11329,-185 11329,-206 11335,-206 11335,-185 11329,-185\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"11335,-185 11335,-206 11792,-206 11792,-185 11335,-185\"/>\n",
"<text text-anchor=\"start\" x=\"11338\" y=\"-191.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"11792,-185 11792,-206 11798,-206 11798,-185 11792,-185\"/>\n",
"</g>\n",
"<!-- 187650650156944 -->\n",
"<g id=\"node39\" class=\"node\">\n",
"<title>187650650156944</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10704,-355 10704,-376 10710,-376 10710,-355 10704,-355\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"10710,-355 10710,-376 12417,-376 12417,-355 10710,-355\"/>\n",
"<text text-anchor=\"start\" x=\"10713\" y=\"-361.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(RadioNode::RadioNode(std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,std::__cxx11::basic_string&lt;char,std::char_traits&lt;char&gt;,&gt;,int,double))(std_msgs::msg::String)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"12417,-355 12417,-376 12423,-376 12423,-355 12417,-355\"/>\n",
"</g>\n",
"<!-- 187650649956624&#45;&gt;187650650156944 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge11\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649956624:out&#45;&gt;187650650156944:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M10592,-346C10638.53,-346 10651.22,-362.42 10693,-364.73\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"10692.91,-368.23 10703,-365 10693.1,-361.23 10692.91,-368.23\"/>\n",
"</g>\n",
"<!-- 187650649967104&#45;&gt;187650650156944 -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge12\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>187650649967104:out&#45;&gt;187650650156944:in</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M10592,-385C10638.6,-385 10651.17,-367.71 10692.98,-365.28\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"10693.1,-368.78 10703,-365 10692.91,-361.78 10693.1,-368.78\"/>\n",
"</g>\n",
"<!-- 187650649970080 -->\n",
"<g id=\"node37\" class=\"node\">\n",
"<title>187650649970080</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"9413,-297 9413,-318 9419,-318 9419,-297 9413,-297\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"9419,-297 9419,-318 9876,-318 9876,-297 9419,-297\"/>\n",
"<text text-anchor=\"start\" x=\"9422\" y=\"-303.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"9876,-297 9876,-318 9882,-318 9882,-297 9876,-297\"/>\n",
"</g>\n",
"<!-- 187650650138992 -->\n",
"<g id=\"node38\" class=\"node\">\n",
"<title>187650650138992</title>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"11329,-394 11329,-415 11335,-415 11335,-394 11329,-394\"/>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"11335,-394 11335,-415 11792,-415 11792,-394 11335,-394\"/>\n",
"<text text-anchor=\"start\" x=\"11338\" y=\"-400.8\" font-family=\"Times,serif\" font-size=\"14.00\">void(rclcpp::TimeSource)(rcl_interfaces::msg::ParameterEvent)</text>\n",
"<polygon fill=\"none\" stroke=\"black\" points=\"11792,-394 11792,-415 11798,-415 11798,-394 11792,-394\"/>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2025-06-06 08:24:47 +00:00
"<graphviz.graphs.Digraph at 0x7fa8910e3970>"
2025-06-03 13:43:48 +00:00
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%skip_if_false DFG_ENABLED\n",
"%%skip_if_false DFG_PLOT\n",
"\n",
"#################################################\n",
"# Plot full DFG, down to the callback level\n",
"#################################################\n",
"\n",
"from latency_graph.latency_graph_plots import plot_latency_graph_full\n",
"\n",
"plot_latency_graph_full(lat_graph, _tracing_context, os.path.join(OUT_PATH, \"latency_graph_full\"))"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "markdown",
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"source": [
"## Plot Latency Graph (overview)\n",
"Plot the DFG down to a certain hierarchy level in a flattened manner. Aggregate dependencies from multiple callbacks into corresponding node-node dependencies."
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 8,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%%%skip_if_false DFG_ENABLED\n"
}
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Plotting DFG overview with max hierarchy level 100...\n",
"Input Node Patterns: ['^/input_']\n",
"Output Node Patterns: ['^/output_']\n",
"Excluded Node Patterns: ['^/rviz2']\n",
"Input Nodes: /input_camera_node, /input_gps_node, /input_imu_node, /input_baro_node, /input_lidar_node, /input_operator_cmd_node\n",
"Output Nodes: /output_mapping_node, /output_smoke_classifier_node, /output_flight_control_node, /output_radio_tx_node\n",
"Intermediate Nodes: /INPUT, /OUTPUT, /input_camera_node, /debayer_node, /radiometric_node, /geometric_node, /output_mapping_node, /output_smoke_classifier_node, /input_gps_node, /input_imu_node, /input_baro_node, /sensor_fusion_node, /input_lidar_node, /input_operator_cmd_node, /flight_mgmt_node, /output_flight_control_node, /telemetry_node, /output_radio_tx_node\n",
"/input_baro_node /sensor_fusion_node 1\n",
"/sensor_fusion_node /telemetry_node 3\n",
"/sensor_fusion_node /flight_mgmt_node 3\n",
2025-06-06 08:24:47 +00:00
"/input_operator_cmd_node /flight_mgmt_node 1\n",
"/input_lidar_node /flight_mgmt_node 1\n",
"/output_mapping_node /telemetry_node 1\n",
"/telemetry_node /output_radio_tx_node 2\n",
"/input_camera_node /debayer_node 1\n",
"/radiometric_node /geometric_node 1\n",
"/radiometric_node /output_smoke_classifier_node 1\n",
"/debayer_node /radiometric_node 1\n",
"/input_gps_node /sensor_fusion_node 1\n",
2025-06-03 13:43:48 +00:00
"/input_imu_node /sensor_fusion_node 1\n",
2025-06-06 08:24:47 +00:00
"/flight_mgmt_node /output_flight_control_node 3\n",
2025-06-03 13:43:48 +00:00
"/geometric_node /output_mapping_node 1\n"
]
},
{
"data": {
"image/svg+xml": [
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
"<!-- Generated by graphviz version 2.43.0 (0)\n",
" -->\n",
"<!-- Title: G Pages: 1 -->\n",
"<svg width=\"1500pt\" height=\"431pt\"\n",
" viewBox=\"0.00 0.00 1500.00 431.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 427)\">\n",
"<title>G</title>\n",
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-427 1496,-427 1496,4 -4,4\"/>\n",
"<!-- /INPUT -->\n",
"<g id=\"node1\" class=\"node\">\n",
"<title>/INPUT</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"976,-423 908,-423 908,-387 976,-387 976,-423\"/>\n",
"<text text-anchor=\"middle\" x=\"942\" y=\"-401.3\" font-family=\"Times,serif\" font-size=\"14.00\">/INPUT</text>\n",
"</g>\n",
"<!-- /OUTPUT -->\n",
"<g id=\"node2\" class=\"node\">\n",
"<title>/OUTPUT</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"847,-423 764,-423 764,-387 847,-387 847,-423\"/>\n",
"<text text-anchor=\"middle\" x=\"805.5\" y=\"-401.3\" font-family=\"Times,serif\" font-size=\"14.00\">/OUTPUT</text>\n",
"</g>\n",
"<!-- /input_camera_node -->\n",
"<g id=\"node3\" class=\"node\">\n",
"<title>/input_camera_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"196,-69 37,-69 37,-33 196,-33 196,-69\"/>\n",
"<text text-anchor=\"middle\" x=\"116.5\" y=\"-47.3\" font-family=\"Times,serif\" font-size=\"14.00\">/input_camera_node</text>\n",
"</g>\n",
"<!-- /debayer_node -->\n",
"<g id=\"node5\" class=\"node\">\n",
"<title>/debayer_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"352,-69 232,-69 232,-33 352,-33 352,-69\"/>\n",
"<text text-anchor=\"middle\" x=\"292\" y=\"-47.3\" font-family=\"Times,serif\" font-size=\"14.00\">/debayer_node</text>\n",
"</g>\n",
"<!-- /input_camera_node&#45;&gt;/debayer_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge14\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/input_camera_node&#45;&gt;/debayer_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M196.13,-51C204.67,-51 213.32,-51 221.74,-51\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"221.87,-54.5 231.87,-51 221.87,-47.5 221.87,-54.5\"/>\n",
"</g>\n",
"<!-- /input_camera_node__before -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>/input_camera_node__before</title>\n",
"</g>\n",
"<!-- /input_camera_node__before&#45;&gt;/input_camera_node -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>/input_camera_node__before&#45;&gt;/input_camera_node</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M1.08,-51C2.11,-51 12.49,-51 26.63,-51\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"26.94,-54.5 36.94,-51 26.94,-47.5 26.94,-54.5\"/>\n",
"</g>\n",
"<!-- /radiometric_node -->\n",
"<g id=\"node6\" class=\"node\">\n",
"<title>/radiometric_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"534,-69 388,-69 388,-33 534,-33 534,-69\"/>\n",
"<text text-anchor=\"middle\" x=\"461\" y=\"-47.3\" font-family=\"Times,serif\" font-size=\"14.00\">/radiometric_node</text>\n",
"</g>\n",
"<!-- /debayer_node&#45;&gt;/radiometric_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge17\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/debayer_node&#45;&gt;/radiometric_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M352.35,-51C360.64,-51 369.27,-51 377.89,-51\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"377.97,-54.5 387.97,-51 377.97,-47.5 377.97,-54.5\"/>\n",
"</g>\n",
"<!-- /geometric_node -->\n",
"<g id=\"node7\" class=\"node\">\n",
"<title>/geometric_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"757.5,-98 623.5,-98 623.5,-62 757.5,-62 757.5,-98\"/>\n",
"<text text-anchor=\"middle\" x=\"690.5\" y=\"-76.3\" font-family=\"Times,serif\" font-size=\"14.00\">/geometric_node</text>\n",
"</g>\n",
"<!-- /radiometric_node&#45;&gt;/geometric_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge15\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/radiometric_node&#45;&gt;/geometric_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M534.3,-60.22C559.45,-63.42 587.74,-67.03 613.21,-70.27\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"612.82,-73.75 623.18,-71.55 613.71,-66.81 612.82,-73.75\"/>\n",
"</g>\n",
"<!-- /output_smoke_classifier_node -->\n",
"<g id=\"node9\" class=\"node\">\n",
"<title>/output_smoke_classifier_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"807,-40 574,-40 574,-4 807,-4 807,-40\"/>\n",
"<polygon fill=\"none\" stroke=\"#666666\" points=\"811,-44 570,-44 570,0 811,0 811,-44\"/>\n",
"<text text-anchor=\"middle\" x=\"690.5\" y=\"-18.3\" font-family=\"Times,serif\" font-size=\"14.00\">/output_smoke_classifier_node</text>\n",
"</g>\n",
"<!-- /radiometric_node&#45;&gt;/output_smoke_classifier_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge16\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/radiometric_node&#45;&gt;/output_smoke_classifier_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M534.3,-41.78C542.43,-40.75 550.89,-39.67 559.48,-38.57\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"560.14,-42.02 569.61,-37.28 559.25,-35.07 560.14,-42.02\"/>\n",
"</g>\n",
"<!-- /output_mapping_node -->\n",
"<g id=\"node8\" class=\"node\">\n",
"<title>/output_mapping_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1039,-123 860,-123 860,-87 1039,-87 1039,-123\"/>\n",
"<polygon fill=\"none\" stroke=\"#666666\" points=\"1043,-127 856,-127 856,-83 1043,-83 1043,-127\"/>\n",
"<text text-anchor=\"middle\" x=\"949.5\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">/output_mapping_node</text>\n",
"</g>\n",
"<!-- /geometric_node&#45;&gt;/output_mapping_node -->\n",
"<g id=\"edge21\" class=\"edge\">\n",
"<title>/geometric_node&#45;&gt;/output_mapping_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M757.68,-86.44C784.54,-89.05 816.19,-92.13 845.91,-95.02\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"845.62,-98.51 855.91,-95.99 846.29,-91.54 845.62,-98.51\"/>\n",
"</g>\n",
"<!-- /telemetry_node -->\n",
"<g id=\"node23\" class=\"node\">\n",
"<title>/telemetry_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1228.5,-163 1096.5,-163 1096.5,-127 1228.5,-127 1228.5,-163\"/>\n",
"<text text-anchor=\"middle\" x=\"1162.5\" y=\"-141.3\" font-family=\"Times,serif\" font-size=\"14.00\">/telemetry_node</text>\n",
"</g>\n",
"<!-- /output_mapping_node&#45;&gt;/telemetry_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge12\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/output_mapping_node&#45;&gt;/telemetry_node</title>\n",
"<path fill=\"none\" stroke=\"tomato\" stroke-width=\"0.2\" d=\"M1043.05,-122.54C1057.48,-125.28 1072.25,-128.08 1086.23,-130.73\"/>\n",
"<polygon fill=\"tomato\" stroke=\"tomato\" stroke-width=\"0.2\" points=\"1085.79,-134.21 1096.27,-132.63 1087.09,-127.33 1085.79,-134.21\"/>\n",
"</g>\n",
"<!-- /input_gps_node -->\n",
"<g id=\"node10\" class=\"node\">\n",
"<title>/input_gps_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"756.5,-260 624.5,-260 624.5,-224 756.5,-224 756.5,-260\"/>\n",
"<text text-anchor=\"middle\" x=\"690.5\" y=\"-238.3\" font-family=\"Times,serif\" font-size=\"14.00\">/input_gps_node</text>\n",
"</g>\n",
"<!-- /sensor_fusion_node -->\n",
"<g id=\"node16\" class=\"node\">\n",
"<title>/sensor_fusion_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1029.5,-206 869.5,-206 869.5,-170 1029.5,-170 1029.5,-206\"/>\n",
"<text text-anchor=\"middle\" x=\"949.5\" y=\"-184.3\" font-family=\"Times,serif\" font-size=\"14.00\">/sensor_fusion_node</text>\n",
"</g>\n",
"<!-- /input_gps_node&#45;&gt;/sensor_fusion_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge18\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/input_gps_node&#45;&gt;/sensor_fusion_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M756.68,-228.3C787.81,-221.76 825.55,-213.83 859.29,-206.74\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"860.09,-210.15 869.16,-204.67 858.65,-203.3 860.09,-210.15\"/>\n",
"</g>\n",
"<!-- /input_gps_node__before -->\n",
"<g id=\"node11\" class=\"node\">\n",
"<title>/input_gps_node__before</title>\n",
"</g>\n",
"<!-- /input_gps_node__before&#45;&gt;/input_gps_node -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>/input_gps_node__before&#45;&gt;/input_gps_node</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M462.16,-242C466.35,-242 549.51,-242 614.05,-242\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"614.23,-245.5 624.23,-242 614.23,-238.5 614.23,-245.5\"/>\n",
"</g>\n",
"<!-- /input_imu_node -->\n",
"<g id=\"node12\" class=\"node\">\n",
"<title>/input_imu_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"757.5,-206 623.5,-206 623.5,-170 757.5,-170 757.5,-206\"/>\n",
"<text text-anchor=\"middle\" x=\"690.5\" y=\"-184.3\" font-family=\"Times,serif\" font-size=\"14.00\">/input_imu_node</text>\n",
"</g>\n",
"<!-- /input_imu_node&#45;&gt;/sensor_fusion_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge19\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/input_imu_node&#45;&gt;/sensor_fusion_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M757.68,-188C788.55,-188 825.74,-188 859.06,-188\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"859.27,-191.5 869.27,-188 859.27,-184.5 859.27,-191.5\"/>\n",
"</g>\n",
"<!-- /input_imu_node__before -->\n",
"<g id=\"node13\" class=\"node\">\n",
"<title>/input_imu_node__before</title>\n",
"</g>\n",
"<!-- /input_imu_node__before&#45;&gt;/input_imu_node -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>/input_imu_node__before&#45;&gt;/input_imu_node</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M462.16,-188C466.33,-188 548.75,-188 613.16,-188\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"613.33,-191.5 623.33,-188 613.33,-184.5 613.33,-191.5\"/>\n",
"</g>\n",
"<!-- /input_baro_node -->\n",
"<g id=\"node14\" class=\"node\">\n",
"<title>/input_baro_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"760,-152 621,-152 621,-116 760,-116 760,-152\"/>\n",
"<text text-anchor=\"middle\" x=\"690.5\" y=\"-130.3\" font-family=\"Times,serif\" font-size=\"14.00\">/input_baro_node</text>\n",
"</g>\n",
"<!-- /input_baro_node&#45;&gt;/sensor_fusion_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge7\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/input_baro_node&#45;&gt;/sensor_fusion_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M760.03,-148.4C790.49,-154.8 826.74,-162.42 859.27,-169.25\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"858.73,-172.71 869.24,-171.35 860.17,-165.86 858.73,-172.71\"/>\n",
"</g>\n",
"<!-- /input_baro_node__before -->\n",
"<g id=\"node15\" class=\"node\">\n",
"<title>/input_baro_node__before</title>\n",
"</g>\n",
"<!-- /input_baro_node__before&#45;&gt;/input_baro_node -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>/input_baro_node__before&#45;&gt;/input_baro_node</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M462.16,-134C466.28,-134 546.75,-134 610.79,-134\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"610.91,-137.5 620.91,-134 610.91,-130.5 610.91,-137.5\"/>\n",
"</g>\n",
"<!-- /flight_mgmt_node -->\n",
"<g id=\"node21\" class=\"node\">\n",
"<title>/flight_mgmt_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1237,-265 1088,-265 1088,-229 1237,-229 1237,-265\"/>\n",
"<text text-anchor=\"middle\" x=\"1162.5\" y=\"-243.3\" font-family=\"Times,serif\" font-size=\"14.00\">/flight_mgmt_node</text>\n",
"</g>\n",
"<!-- /sensor_fusion_node&#45;&gt;/flight_mgmt_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge9\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/sensor_fusion_node&#45;&gt;/flight_mgmt_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"2.4\" d=\"M1014.95,-206.02C1037.75,-212.4 1063.58,-219.62 1087.14,-226.21\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"2.4\" points=\"1086.5,-229.66 1097.08,-228.99 1088.39,-222.92 1086.5,-229.66\"/>\n",
"</g>\n",
"<!-- /sensor_fusion_node&#45;&gt;/telemetry_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge8\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/sensor_fusion_node&#45;&gt;/telemetry_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"2.4\" d=\"M1029.67,-171.87C1048.22,-168.09 1067.93,-164.07 1086.3,-160.33\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"2.4\" points=\"1087.25,-163.7 1096.35,-158.28 1085.85,-156.84 1087.25,-163.7\"/>\n",
"</g>\n",
"<!-- /input_lidar_node -->\n",
"<g id=\"node17\" class=\"node\">\n",
"<title>/input_lidar_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1019.5,-319 879.5,-319 879.5,-283 1019.5,-283 1019.5,-319\"/>\n",
"<text text-anchor=\"middle\" x=\"949.5\" y=\"-297.3\" font-family=\"Times,serif\" font-size=\"14.00\">/input_lidar_node</text>\n",
"</g>\n",
"<!-- /input_lidar_node&#45;&gt;/flight_mgmt_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge11\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/input_lidar_node&#45;&gt;/flight_mgmt_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M1019.59,-283.32C1039.21,-278.3 1060.75,-272.78 1080.99,-267.6\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"1081.99,-270.96 1090.81,-265.09 1080.25,-264.18 1081.99,-270.96\"/>\n",
"</g>\n",
"<!-- /input_lidar_node__before -->\n",
"<g id=\"node18\" class=\"node\">\n",
"<title>/input_lidar_node__before</title>\n",
"</g>\n",
"<!-- /input_lidar_node__before&#45;&gt;/input_lidar_node -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>/input_lidar_node__before&#45;&gt;/input_lidar_node</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M691.55,-301C694.02,-301 794.34,-301 868.87,-301\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"869.21,-304.5 879.21,-301 869.21,-297.5 869.21,-304.5\"/>\n",
"</g>\n",
"<!-- /input_operator_cmd_node -->\n",
"<g id=\"node19\" class=\"node\">\n",
"<title>/input_operator_cmd_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1052,-265 847,-265 847,-229 1052,-229 1052,-265\"/>\n",
"<text text-anchor=\"middle\" x=\"949.5\" y=\"-243.3\" font-family=\"Times,serif\" font-size=\"14.00\">/input_operator_cmd_node</text>\n",
"</g>\n",
"<!-- /input_operator_cmd_node&#45;&gt;/flight_mgmt_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge10\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/input_operator_cmd_node&#45;&gt;/flight_mgmt_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"0.2\" d=\"M1052.29,-247C1060.83,-247 1069.41,-247 1077.79,-247\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"0.2\" points=\"1077.9,-250.5 1087.9,-247 1077.9,-243.5 1077.9,-250.5\"/>\n",
"</g>\n",
"<!-- /input_operator_cmd_node__before -->\n",
"<g id=\"node20\" class=\"node\">\n",
"<title>/input_operator_cmd_node__before</title>\n",
"</g>\n",
"<!-- /input_operator_cmd_node__before&#45;&gt;/input_operator_cmd_node -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>/input_operator_cmd_node__before&#45;&gt;/input_operator_cmd_node</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M691.55,-279C693.58,-278.89 758.92,-275.34 811,-269 819.46,-267.97 828.19,-266.81 836.96,-265.57\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"837.48,-269.03 846.88,-264.14 836.48,-262.1 837.48,-269.03\"/>\n",
"</g>\n",
"<!-- /output_flight_control_node -->\n",
"<g id=\"node22\" class=\"node\">\n",
"<title>/output_flight_control_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1488,-265 1277,-265 1277,-229 1488,-229 1488,-265\"/>\n",
"<polygon fill=\"none\" stroke=\"#666666\" points=\"1492,-269 1273,-269 1273,-225 1492,-225 1492,-269\"/>\n",
"<text text-anchor=\"middle\" x=\"1382.5\" y=\"-243.3\" font-family=\"Times,serif\" font-size=\"14.00\">/output_flight_control_node</text>\n",
"</g>\n",
"<!-- /flight_mgmt_node&#45;&gt;/output_flight_control_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge20\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/flight_mgmt_node&#45;&gt;/output_flight_control_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"2.4\" d=\"M1237,-247C1245.26,-247 1253.83,-247 1262.48,-247\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"2.4\" points=\"1262.67,-250.5 1272.67,-247 1262.67,-243.5 1262.67,-250.5\"/>\n",
"</g>\n",
"<!-- /output_radio_tx_node -->\n",
"<g id=\"node24\" class=\"node\">\n",
"<title>/output_radio_tx_node</title>\n",
"<polygon fill=\"#f5f5f5\" stroke=\"#666666\" points=\"1469.5,-163 1295.5,-163 1295.5,-127 1469.5,-127 1469.5,-163\"/>\n",
"<polygon fill=\"none\" stroke=\"#666666\" points=\"1473.5,-167 1291.5,-167 1291.5,-123 1473.5,-123 1473.5,-167\"/>\n",
"<text text-anchor=\"middle\" x=\"1382.5\" y=\"-141.3\" font-family=\"Times,serif\" font-size=\"14.00\">/output_radio_tx_node</text>\n",
"</g>\n",
"<!-- /telemetry_node&#45;&gt;/output_radio_tx_node -->\n",
2025-06-06 08:24:47 +00:00
"<g id=\"edge13\" class=\"edge\">\n",
2025-06-03 13:43:48 +00:00
"<title>/telemetry_node&#45;&gt;/output_radio_tx_node</title>\n",
"<path fill=\"none\" stroke=\"black\" stroke-width=\"1.59\" d=\"M1228.61,-145C1245.08,-145 1263.15,-145 1280.92,-145\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" stroke-width=\"1.59\" points=\"1281.33,-148.5 1291.33,-145 1281.33,-141.5 1281.33,-148.5\"/>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
2025-06-06 08:24:47 +00:00
"<graphviz.graphs.Digraph at 0x7fa8910a0850>"
2025-06-03 13:43:48 +00:00
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
2022-05-30 16:51:06 +02:00
"source": [
"%%skip_if_false DFG_ENABLED\n",
"%%skip_if_false DFG_PLOT\n",
"\n",
"#################################################\n",
"# Plot overview of DFG, down to a certain\n",
"# hierarchy level\n",
"#################################################\n",
"\n",
"from latency_graph.latency_graph_plots import plot_latency_graph_overview\n",
2022-06-28 10:06:42 +02:00
"\n",
2025-06-03 13:43:48 +00:00
"print(f\"Plotting DFG overview with max hierarchy level {DFG_MAX_HIER_LEVEL}...\")\n",
"print(f\"Input Node Patterns: {DFG_INPUT_NODE_PATTERNS}\")\n",
"print(f\"Output Node Patterns: {DFG_OUTPUT_NODE_PATTERNS}\")\n",
"print(f\"Excluded Node Patterns: {DFG_EXCL_NODE_PATTERNS}\")\n",
"\n",
"plot_latency_graph_overview(lat_graph, DFG_EXCL_NODE_PATTERNS, DFG_INPUT_NODE_PATTERNS, DFG_OUTPUT_NODE_PATTERNS, DFG_MAX_HIER_LEVEL, os.path.join(OUT_PATH, \"latency_graph_overview\"))"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "markdown",
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
"source": [
"# Analyze Message Flow\n",
"Build dependency trees ending in the specified output topics."
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 9,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Found 4 end topics for E2E latency calculations: /output/telemetry/radio, /output/flight/cmd, /output/camera/mapped, /output/classifier/classification\n",
2025-06-03 13:43:48 +00:00
"Using 133 callback objects, 20311 callback instances, and 20207 publish instances for E2E latency calculations.\n",
"[CACHE] Cache disabled for trees.\n",
"=====/output/telemetry/radio\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Processing output messages: 100%|██████████| 2302/2302 [00:11<00:00, 201.42it/s]\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 2302 trees for topic /output/telemetry/radio\n",
2025-06-06 08:24:47 +00:00
"=====/output/flight/cmd\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Processing output messages: 100%|██████████| 3595/3595 [00:10<00:00, 355.89it/s]\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Found 3595 trees for topic /output/flight/cmd\n",
"=====/output/camera/mapped\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Processing output messages: 100%|██████████| 499/499 [00:00<00:00, 7204.87it/s]\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Found 499 trees for topic /output/camera/mapped\n",
"=====/output/classifier/classification\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Processing output messages: 100%|██████████| 499/499 [00:00<00:00, 1017.38it/s]"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-06-06 08:24:47 +00:00
"Found 499 trees for topic /output/classifier/classification\n"
2025-06-03 13:43:48 +00:00
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"%%skip_if_false E2E_ENABLED\n",
"\n",
"from message_tree.message_tree_algorithms import build_dep_trees\n",
"\n",
"end_topics = [t for t in _tracing_context.topics if any(re.search(f, t.name) for f in E2E_OUTPUT_TOPIC_PATTERNS)]\n",
"\n",
2025-06-03 13:43:48 +00:00
"print(f\"Found {len(end_topics)} end topics for E2E latency calculations: {', '.join(t.name for t in end_topics)}\")\n",
"\n",
"print(f\"Using {len(_tracing_context.callback_objects)} callback objects, {len(_tracing_context.callback_instances)} callback instances, and {len(_tracing_context.publish_instances)} publish instances for E2E latency calculations.\")\n",
"\n",
"def _build_dep_trees():\n",
2025-06-03 13:43:48 +00:00
" return build_dep_trees(end_topics, lat_graph, _tracing_context, E2E_EXCL_PATH_PATTERNS, E2E_TIME_LIMIT_S)\n",
" #return build_dep_trees(end_topics, lat_graph, _tracing_context, E2E_EXCL_PATH_PATTERNS, E2E_TIME_LIMIT_S, exact_path=E2E_EXACT_PATH)\n",
"\n",
"try:\n",
" trees = cached(\"trees\", _build_dep_trees, [TR_PATH], not CACHING_ENABLED)\n",
"except Exception as e:\n",
" import traceback\n",
" print(e)\n",
" traceback.print_exc()"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 10,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
"data": {
"text/plain": [
"'Skipped (evaluated BW_ENABLED to False)'"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%skip_if_false E2E_ENABLED\n",
"%%skip_if_false BW_ENABLED\n",
"\n",
"##################################################\n",
"# Get message bandwidths from `ros2 multitopic bw`\n",
"# output.\n",
"##################################################\n",
"\n",
"from bw_interop.process_bw_output import get_topic_messages\n",
"msgs = get_topic_messages(BW_PATH)\n",
"\n",
"from bw_interop.bw_plots import dds_lat_msg_size_scatter\n",
"plot_topic = \"\""
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-03 13:43:48 +00:00
"execution_count": 11,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
2025-06-06 08:24:47 +00:00
{
"name": "stderr",
"output_type": "stream",
"text": [
"Extracting E2E paths: 100%|██████████| 6895/6895 [00:00<00:00, 48456.28it/s]"
]
},
2025-06-03 13:43:48 +00:00
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 6895 E2E paths in total.\n"
]
2025-06-06 08:24:47 +00:00
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
2025-06-03 13:43:48 +00:00
}
],
"source": [
"%%skip_if_false E2E_ENABLED\n",
"\n",
"from message_tree.message_tree_algorithms import e2e_paths_sorted_desc\n",
"from message_tree.message_tree_algorithms import owner\n",
2025-06-03 13:43:48 +00:00
"from message_tree.message_tree_structure import DepTree\n",
"\n",
"# set of seen publush topics to avoid duplicates\n",
"seen_publish_topics = set()\n",
"\n",
"def _print_elem(elem, indent=0):\n",
" if isinstance(elem, TrTopic):\n",
" print(f\"{' ' * indent}Topic: {elem.name}\")\n",
" elif isinstance(elem, TrCallbackObject):\n",
" print(f\"{' ' * indent}Callback: {elem.name} ({elem.elem.name})\")\n",
" elif isinstance(elem, TrPublishInstance):\n",
" #if elem.publisher.topic_name in seen_publish_topics:\n",
" # print(f\"{' ' * indent}Publish Instance: {elem.publisher.topic_name} (already seen)\")\n",
" # return False\n",
" #seen_publish_topics.add(elem.publisher.topic_name)\n",
" print(f\"{' ' * indent}Publish Instance: {elem.publisher.topic_name}\")\n",
" elif isinstance(elem, TrCallbackInstance):\n",
" print(f\"{' ' * indent}Callback Instance: {elem.callback_obj.callback_symbol.symbol}\")\n",
" else:\n",
" print(f\"{' ' * indent}Unknown element type: {type(elem)}\")\n",
" return True\n",
"\n",
"def _traverse_print_tree(tree, indent=0):\n",
" \"\"\"Recursively traverse a dependency tree and print its structure.\"\"\"\n",
" for i, node in enumerate(tree):\n",
" if isinstance(node, DepTree):\n",
" if not _print_elem(node.head, indent):\n",
" continue\n",
" _traverse_print_tree(node.deps, indent + 2)\n",
" elif isinstance(node, list):\n",
" for entry in node:\n",
" if entry is not None and isinstance(entry, DepTree):\n",
" if not _print_elem(entry.head, indent):\n",
" continue\n",
" _traverse_print_tree(entry.deps, indent + 2)\n",
" else:\n",
" print(f\"{' ' * indent}List of {len(node)} elements, but not a DepTree.\")\n",
" else:\n",
" if not _print_elem(node, indent):\n",
" continue\n",
"\n",
"def _print_trees():\n",
" print(\"Dependency Trees:\")\n",
" for i, tree in enumerate(trees):\n",
" print(f\"\\nTree {i + 1}/{len(trees)}:\")\n",
" _traverse_print_tree(tree)\n",
" print(\"\\nEnd of Dependency Trees\\n\")\n",
" print(f\"Published topics seen so far: {len(seen_publish_topics)}:, {', '.join(seen_publish_topics)}\")\n",
2025-06-06 08:24:47 +00:00
"#_print_trees()\n",
2025-06-03 13:43:48 +00:00
"\n",
"\n",
"##################################################\n",
"# Find and filter relevant E2E paths in trees\n",
"##################################################\n",
2025-06-03 13:43:48 +00:00
"trees_paths = [e2e_paths_sorted_desc(tree, E2E_INPUT_TOPIC_PATTERNS) for tree in tqdm(trees, mininterval=10.0, desc=\"Extracting E2E paths\")]\n",
"all_paths = [p for paths in trees_paths for p in paths]\n",
"\n",
2025-06-03 13:43:48 +00:00
"def _print_paths():\n",
" for i, path in enumerate(all_paths):\n",
" print(f\"Path {i+1}/{len(all_paths)}:\")\n",
" for j, elem in enumerate(path):\n",
" if isinstance(elem, TrTopic):\n",
" print(f\" {j+1:>3d}: Topic: {elem.name}\")\n",
" elif isinstance(elem, TrCallbackObject):\n",
" print(f\" {j+1:>3d}: Callback: {elem.name} ({elem.node.name})\")\n",
" elif isinstance(elem, TrPublishInstance):\n",
" print(f\" {j+1:>3d}: Publish Instance: {elem.publisher.topic_name}\")\n",
" elif isinstance(elem, TrCallbackInstance):\n",
" print(f\" {j+1:>3d}: Callback Instance: {elem.callback_obj.callback_symbol.symbol}\")\n",
" else:\n",
" print(f\" {j+1:>3d}: Unknown element type: {elem}\")\n",
" print()\n",
2025-06-06 08:24:47 +00:00
"#_print_paths()\n",
2025-06-03 13:43:48 +00:00
"\n",
"print(f\"Found {len(all_paths)} E2E paths in total.\")"
2023-02-15 17:02:20 +09:00
]
},
{
"cell_type": "code",
2025-06-06 08:24:47 +00:00
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Aggregating E2E path cohorts: 100%|██████████| 6895/6895 [00:00<00:00, 210988.17it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 11 cohorts of E2E paths.\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead tr th {\n",
" text-align: left;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr>\n",
" <th></th>\n",
" <th>path</th>\n",
" <th colspan=\"4\" halign=\"left\">e2e_latency</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>mean</th>\n",
" <th>min</th>\n",
" <th>max</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>void(LidarNode::LidarNode(std::__cxx11::basic_...</td>\n",
" <td>997</td>\n",
" <td>0.039474</td>\n",
" <td>0.025145</td>\n",
" <td>0.086360</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>void(CommandNode::CommandNode(std::__cxx11::ba...</td>\n",
" <td>797</td>\n",
" <td>0.043163</td>\n",
" <td>0.023764</td>\n",
" <td>0.114404</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>void(GPSNode::GPSNode(std::__cxx11::basic_stri...</td>\n",
" <td>705</td>\n",
" <td>0.050711</td>\n",
" <td>0.036403</td>\n",
" <td>0.085157</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>void(GPSNode::GPSNode(std::__cxx11::basic_stri...</td>\n",
" <td>699</td>\n",
" <td>0.025932</td>\n",
" <td>0.017209</td>\n",
" <td>0.053311</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>void(BaroNode::BaroNode(std::__cxx11::basic_st...</td>\n",
" <td>601</td>\n",
" <td>0.026503</td>\n",
" <td>0.018293</td>\n",
" <td>0.054396</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>void(BaroNode::BaroNode(std::__cxx11::basic_st...</td>\n",
" <td>596</td>\n",
" <td>0.051322</td>\n",
" <td>0.037265</td>\n",
" <td>0.091714</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>void(IMUNode::IMUNode(std::__cxx11::basic_stri...</td>\n",
" <td>504</td>\n",
" <td>0.026419</td>\n",
" <td>0.019279</td>\n",
" <td>0.056391</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>void(IMUNode::IMUNode(std::__cxx11::basic_stri...</td>\n",
" <td>500</td>\n",
" <td>0.048617</td>\n",
" <td>0.036305</td>\n",
" <td>0.081712</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>void(CameraNode::CameraNode(std::__cxx11::basi...</td>\n",
" <td>499</td>\n",
" <td>0.068942</td>\n",
" <td>0.057891</td>\n",
" <td>0.084229</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>void(CameraNode::CameraNode(std::__cxx11::basi...</td>\n",
" <td>499</td>\n",
" <td>0.076006</td>\n",
" <td>0.065236</td>\n",
" <td>0.089868</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>void(CameraNode::CameraNode(std::__cxx11::basi...</td>\n",
" <td>498</td>\n",
" <td>0.079707</td>\n",
" <td>0.066843</td>\n",
" <td>0.104887</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" path e2e_latency \\\n",
" count mean \n",
"10 void(LidarNode::LidarNode(std::__cxx11::basic_... 997 0.039474 \n",
"5 void(CommandNode::CommandNode(std::__cxx11::ba... 797 0.043163 \n",
"6 void(GPSNode::GPSNode(std::__cxx11::basic_stri... 705 0.050711 \n",
"7 void(GPSNode::GPSNode(std::__cxx11::basic_stri... 699 0.025932 \n",
"1 void(BaroNode::BaroNode(std::__cxx11::basic_st... 601 0.026503 \n",
"0 void(BaroNode::BaroNode(std::__cxx11::basic_st... 596 0.051322 \n",
"9 void(IMUNode::IMUNode(std::__cxx11::basic_stri... 504 0.026419 \n",
"8 void(IMUNode::IMUNode(std::__cxx11::basic_stri... 500 0.048617 \n",
"2 void(CameraNode::CameraNode(std::__cxx11::basi... 499 0.068942 \n",
"4 void(CameraNode::CameraNode(std::__cxx11::basi... 499 0.076006 \n",
"3 void(CameraNode::CameraNode(std::__cxx11::basi... 498 0.079707 \n",
"\n",
" \n",
" min max \n",
"10 0.025145 0.086360 \n",
"5 0.023764 0.114404 \n",
"6 0.036403 0.085157 \n",
"7 0.017209 0.053311 \n",
"1 0.018293 0.054396 \n",
"0 0.037265 0.091714 \n",
"9 0.019279 0.056391 \n",
"8 0.036305 0.081712 \n",
"2 0.057891 0.084229 \n",
"4 0.065236 0.089868 \n",
"3 0.066843 0.104887 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%skip_if_false E2E_ENABLED\n",
"\n",
"from message_tree.message_tree_algorithms import aggregate_e2e_paths\n",
"\n",
"##################################################\n",
"# Group dataflows by DFG path\n",
"##################################################\n",
"\n",
"cohorts = aggregate_e2e_paths(all_paths)\n",
"print(f\"Found {len(cohorts)} cohorts of E2E paths.\")\n",
"cohort_pairs = [(k, v) for k, v in cohorts.items()]\n",
"cohort_pairs.sort(key=lambda kv: len(kv[1]), reverse=True)\n",
"\n",
"path_records = [{\"path\": path_key,\n",
" \"timestamp\": path[-1].timestamp,\n",
" \"e2e_latency\": path[-1].timestamp - path[0].timestamp} \\\n",
" for path_key, paths in cohort_pairs for path in paths if path]\n",
"\n",
"out_df = pd.DataFrame.from_records(path_records)\n",
"out_df.to_csv(os.path.join(OUT_PATH, \"e2e.csv\"), sep=\"\\t\", index=False)\n",
"\n",
"df_print = out_df[['path', 'e2e_latency']].groupby(\"path\").agg(['count', 'mean', 'min', 'max']).reset_index()\n",
"#df_print['path'] = df_print['path'].apply(lambda path: \" -> \".join(filter(lambda part: part.startswith(\"/\"), path.split(\" -> \"))))\n",
"df_print = df_print.sort_values((\"e2e_latency\", \"count\"), ascending=False)\n",
"df_print.to_csv(os.path.join(OUT_PATH, \"e2e_overview.csv\"), sep=\"\\t\", index=False)\n",
"df_print"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import pickle\n",
"# with open(\"state.pkl\", \"wb\") as f:\n",
"# pickle.dump((trees_paths, all_paths, cohorts), f)\n",
"with open(os.path.join(OUT_PATH, \"state.pkl\"), \"wb\") as f:\n",
" pickle.dump((trees_paths, all_paths, cohorts), f)"
]
},
{
"cell_type": "code",
"execution_count": 14,
2023-02-15 17:02:20 +09:00
"metadata": {
"collapsed": false
},
2025-06-03 13:43:48 +00:00
"outputs": [
{
2025-06-06 08:24:47 +00:00
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 699/699 [00:00<00:00, 168408.21it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['GPSNode', '/input/gps/fix', 'FusionNode', '/sensors/fused', 'TelemetryNode', '/telemetry/data', 'RadioNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 601/601 [00:00<00:00, 133437.97it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['BaroNode', '/input/baro/alt', 'FusionNode', '/sensors/fused', 'TelemetryNode', '/telemetry/data', 'RadioNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 498/498 [00:00<00:00, 4531.41it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['CameraNode', '/input/camera/raw', 'DebayerNode', '/camera/debayered', 'RadiometricNode', '/camera/radiometric', 'GeometricNode', '/camera/geometric', 'MappingNode', '/output/camera/mapped', 'TelemetryNode', '/telemetry/data', 'RadioNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 504/504 [00:00<00:00, 122674.63it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['IMUNode', '/input/imu/data', 'FusionNode', '/sensors/fused', 'TelemetryNode', '/telemetry/data', 'RadioNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 997/997 [00:00<00:00, 177251.66it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['LidarNode', '/input/lidar/scan', 'FlightManagementNode', '/flight/plan', 'ControlNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_63990/1783643704.py:47: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`). Consider using `matplotlib.pyplot.close()`.\n",
" fig, axes = plt.subplots(1, 3, num=f\"E2E type breakdown histograms {name}\", dpi=300, figsize=(16, 9))\n",
"Calculating breakdowns: 100%|██████████| 705/705 [00:00<00:00, 126323.66it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['GPSNode', '/input/gps/fix', 'FusionNode', '/sensors/fused', 'FlightManagementNode', '/flight/plan', 'ControlNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 797/797 [00:00<00:00, 175940.02it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['CommandNode', '/input/operator/commands', 'FlightManagementNode', '/flight/plan', 'ControlNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 596/596 [00:00<00:00, 143749.58it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['BaroNode', '/input/baro/alt', 'FusionNode', '/sensors/fused', 'FlightManagementNode', '/flight/plan', 'ControlNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 500/500 [00:00<00:00, 131532.36it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['IMUNode', '/input/imu/data', 'FusionNode', '/sensors/fused', 'FlightManagementNode', '/flight/plan', 'ControlNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 499/499 [00:00<00:00, 97319.71it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['CameraNode', '/input/camera/raw', 'DebayerNode', '/camera/debayered', 'RadiometricNode', '/camera/radiometric', 'GeometricNode', '/camera/geometric', 'MappingNode']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Calculating breakdowns: 100%|██████████| 499/499 [00:00<00:00, 125161.92it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Labels: ['CameraNode', '/input/camera/raw', 'DebayerNode', '/camera/debayered', 'RadiometricNode', '/camera/radiometric', 'SmokeClassifierNode']\n",
"Done.\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD3oAAAnqCAYAAABrX+CyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe0VNX5OO730nuTpoiASBULCoiVolgQGxaMXWwYNdFoosbEmo89RqOxI/bEGkXFLiBWFBAUkKIURYp0pHOZ3x/5yddhbpmZe5kL8jxrzVrMvmfv/c7MOfsUznt2XiKRSAQAAAAAAAAAAAAAAAAAAAA5U66sAwAAAAAAAAAAAAAAAAAAANjaSPQGAAAAAAAAAAAAAAAAAADIMYneAAAAAAAAAAAAAAAAAAAAOSbRGwAAAAAAAAAAAAAAAAAAIMckegMAAAAAAAAAAAAAAAAAAOSYRG8AAAAAAAAAAAAAAAAAAIAck+gNAAAAAAAAAAAAAAAAAACQYxK9AQAAAAAAAAAAAAAAAAAAckyiNwAAAAAAAAAAAAAAAAAAQI5J9AYAAAAAAAAAAAAAAAAAAMgxid4AAAAAAAAAAAAAAAAAAAA5JtEbAAAAAAAAAAAAAAAAAAAgxyR6AwAAAAAAAAAAAAAAAAAA5JhEbwAAAAAAAAAAAAAAAAAAgByT6A0AAAAAAAAAAAAAAAAAAJBjEr0BAAAAAAAAAAAAAAAAAAByTKI3AAAAAAAAAAAAAAAAAABAjkn0BgAAAAAAAAAAAAAAAAAAyDGJ3gAAAAAAAAAAAAAAAAAAADkm0RsAAAAAAAAAAAAAAAAAACDHJHoDAAAAAAAAAAAAAAAAAADkmERvAAAAAAAAAAAAAAAAAACAHJPoDQAAAAAAAAAAAAAAAAAAkGMSvQEAAAAAAAAAAAAAAAAAAHJMojcAAAAAAAAAAAAAAAAAAECOSfQGAAAAAAAAAAAAAAAAAADIMYneAAAAAAAAAAAAAAAAAAAAOSbRGwAAAAAAAAAAAAAAAAAAIMckegMAAAAAAAAAAAAAAAAAAOSYRG8AAAAAAGCLNmzYsMjLy0t6DRs2rKzDAoowffr0lO320UcfLeuwgC3EunXr4vnnn4+zzjordt1112jYsGFUqlQpZVxZvHjxhjrGHWBL1bx586Sx64wzzijrkICtxKOPPppy/DR9+vRi651xxhlJdZo3b77JYwUAAACALVmFsg4AAAAAAMjcmjVrYtKkSTFx4sSYP39+LFmyJCpWrBh169aNBg0axJ577hlNmjQp6zABAABK1YcffhinnHJKWklGAAAAAAAAAJs7id4AAAAAUIzp06dHixYtNknbtWvXTpplrjBr166NYcOGxbvvvhtDhw6N0aNHx7p164qss/3228fxxx8f559/frRq1SrrGLt37x7Dhw/Pun5R/vvf/8bRRx+9SdqO+N8svz169EgqO/30083cByVwxhlnxGOPPZZUNnTo0OjevXuJ2y5ovJk2bZqZnwCAiPjfMcfBBx9c7LkQAAAAAAAAwJaiXFkHAAAAAAAUbty4cXHWWWdFo0aN4uCDD45bbrklRo4cmVZiw/fffx//+Mc/ok2bNnH22WfH0qVLcxAxZSUvLy/pde2115Z1SMD/b9iwYSnb6LBhw8o6LICMGMsoaytXroyTTjqpwHOhRo0aRYcOHWK33XZLepUvX74MImVz8eijj6aMW2aCz86WuA+49tprU2KGLUH37t2T1tvSeKgaAAAAAACbNzN6AwAAAMBm7MUXX4xHHnmkRG0kEokYOHBgvP322/H2229H69atSyk6AACA3HjyySdjzpw5SWV9+vSJO+64I1q1alVGUQEAAAAAAACUjERvAAAAAMhC9erVY6eddipxOzVr1syqXuXKlaNz586xzz77xHbbbRcNGzaM/Pz8mD17dnz00Ufx+uuvx+rVq5PqzJw5M3r27BkjRoyIFi1alCjudu3aRaVKlUrURkRE7dq1S9wGAADw6/fSSy8lvW/atGk899xzUaVKlbIJCAAAAAAAAKAUSPQGAAAAgCx06tQphg0bltM+K1SoEL17944zzzwzDj300CITGmbPnh1//OMf46mnnkoqnzVrVvTv3z+GDh1aoliGDBkSzZs3L1EbAKWle/fukUgkyjoMIAPNmze33QIZGTlyZNL7o446KqMkb+MOAEBuPProo/Hoo4+WdRgAAAAAsMUoV9YBAAAAAABFq1q1alxyySXx3XffxcsvvxxHH310sQkN2267bTz55JNx/fXXp/xt2LBh8cILL2yqcAEAAErVypUrY/78+Ullbdq0KaNoAAAAAAAAAEqPRG8AAAAA2Iwdeuih8e2338Ydd9wRjRs3zrj+X//61+jTp09K+eOPP14a4QEAAGxyS5YsSSmrXr16GUQCAAAAAAAAULokegMAAADAZqxr165ZJXj/0nXXXZdS9tZbb8WaNWtK1C4AAEAurFq1KqUsLy+vDCIBAAAAAAAAKF0VyjoAAAAAAGDT2mOPPaJx48YxZ86cDWWrVq2K2bNnR7Nmzcowsq3DmjVrYurUqfH111/HnDlzYunSpRERUa9evahXr17ssssu0aZNmzKOMjMrVqyITz/9NObMmRM//vhjLF++PLbZZpto0KBB7L777tGiRYtNHsOSJUvik08+iSlTpsSSJUuiRo0a0aBBg9hjjz2ibdu2m6zfKVOmxMSJE2P+/Pkxf/78WL9+fdSsWTO22267aNu2bbRu3TrKly+/yfpn05s7d26MHTs2ZsyYEUuXLo2VK1dGlSpVolq1atG4ceNo3rx5tG7dOmrUqFHWoRbo5+3zhx9+iB9//DFWrVoVDRo0iIYNG0bHjh1j++233yT9zps3b0O/8+fPj2rVqsUOO+wQe+65ZzRv3nyT9FmY/Pz8+OKLL2LChAkxd+7cWLVqVVSvXj123XXXOPDAA9Oq/+2338bXX38ds2bNiqVLl0Z+fn7UrVs36tatG23bto1ddtklypXLzfOUv/zyyxg7dmzMmTMnVq9eHXXr1o0OHTrEXnvtFZUrV06rjXXr1sWoUaPiq6++ivnz50e5cuWiUaNGsfvuu8euu+66iT9B2Vi7dm2MHDkyJkyYEPPnz4+KFStGgwYNonXr1tGlS5dNPlZ/++23MWrUqPjuu+9i5cqV0aBBg2jSpEnsvffeUa9evU3aN8Vbu3ZtfPzxxzFjxoyYPXt2RETUr18/dt555+jUqVPO9+UTJkyIL774ImbPnh1r1qyJhg0bxvbbbx/77rtvqe5vVq5cGePHj4+JEyfGokWLYtmyZVG+fPmoVq1a1K1bN5o1axYtW7aMJk2alFqfbP4WL14cI0eO3HBsn5+fHw0bNoyGDRtG586do0GDBmUd4hbHPmDrNGnSpJg0aVLMmzcv5s+fH5UrV44GDRpE06ZNY6+99ooqVaqUdYhJ8vPzY/To0TFjxoz48ccfY9GiRVGrVq1o0KBBtGrVKjp27LjJH6jx87nLpEmTYtGiRVGhQoVo3LhxdOnSJaPrJAsWLIiRI0fG1KlTY9myZVGrVq3Ydttto1u3blG/fv1NEvvcuXNj9OjR8eOPP8a8efNi/fr10aBBg2jUqFF07dp1i9vWE4lEjB8/Pr766qv44YcfYsWKFVGlSpXYaaed4uijjy7r8DY7M2fOjDFjxsSMGTM2HE81atQo+vXrF9WqVSu2/rx58+Lrr7+Ob775JhYvXhzLly+PmjVrRr169aJJkybRpUuXTXbNIT8/Pz755JOYNm1a/PDDDxERsc0222w4Dq5QYfO9nXTevHnx+eefx7x582LevHlRvnz5aNiw4YbtrlatWmUdIgAAAABkLwEAAAAAFGnatGmJiEh6devWrazDykjnzp1TPsMnn3ySVt1u3bql1J02bdqmDbiUDB06NCX2008/fZP3O2bMmMQ111yTOOCAAxKVK1dOiWHjV4MGDRJnnnlmYsKECWn3UdBny/TVrFmztPtbu3Zt4qGHHkr07NkzUalSpSLbbdmyZeLKK69MLFiwIOPv7vTTTy8yxjFjxiSOPfbYRMWKFYv8XHfffXd
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x1500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD2sAAAnqCAYAAACjMwpkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe4VNXZOOznwKF3pCkiGERAEUUBG0pRrKhYosYuasSoiaZYYiJq8lrzRn01togYa6yx9whYERQERaQoxUKX3jnM94ef/Jwzp8zs00Du+7rOdTmLvdZ6ZmbvtfZs97NXXiqVSgUAAAAAAAAAAAAAAAAAAAA5qVbVAQAAAAAAAAAAAAAAAAAAAGyOJGsDAAAAAAAAAAAAAAAAAAAkIFkbAAAAAAAAAAAAAAAAAAAgAcnaAAAAAAAAAAAAAAAAAAAACUjWBgAAAAAAAAAAAAAAAAAASECyNgAAAAAAAAAAAAAAAAAAQAKStQEAAAAAAAAAAAAAAAAAABKQrA0AAAAAAAAAAAAAAAAAAJCAZG0AAAAAAAAAAAAAAAAAAIAEJGsDAAAAAAAAAAAAAAAAAAAkIFkbAAAAAAAAAAAAAAAAAAAgAcnaAAAAAAAAAAAAAAAAAAAACUjWBgAAAAAAAAAAAAAAAAAASECyNgAAAAAAAAAAAAAAAAAAQAKStQEAAAAAAAAAAAAAAAAAABKQrA0AAAAAAAAAAAAAAAAAAJCAZG0AAAAAAAAAAAAAAAAAAIAEJGsDAAAAAAAAAAAAAAAAAAAkIFkbAAAAAAAAAAAAAAAAAAAgAcnaAAAAAAAAAAAAAAAAAAAACUjWBgAAAAAAAAAAAAAAAAAASECyNgAAAAAAAAAAAAAAAAAAQAKStQEAAAAAAAAAAAAAAAAAABKQrA0AAAAAAAAAAAAAAAAAAJCAZG0AAAAAAAAAAAAAAAAAAIAEJGsDAAAAAAAAAAAAAAAAAAAkIFkbAAAAAAAAAAAAAAAAAAAgAcnaAAAAAAAAAAAAAAAAAAAACUjWBgAAAAAAAAAAAAAAAAAASECyNgAAAAAAsMkYMWJE5OXlpf2NGDGiqsMCSjBjxoyM4/b++++v6rD4iTnjjDPS9rF27dpVdUiwkfMXYFPTrl27tDHpjDPOqOqQgC3E/fffn3FeNGPGjFLrOd8HAAAAYHOXX9UBAAAAAMCWbu3atTF58uSYNGlSLFiwIJYsWRI1atSIJk2aRPPmzWOPPfaI1q1bV3WYAAAAAAAAAAAAABQiWRsAAACALcqMGTNi++23r5C2GzVqFIsXLy51u3Xr1sWIESPiv//9bwwfPjzGjh0b69evL7HOtttuGz//+c/jvPPOiw4dOiSOsU+fPjFy5MjE9Uvyn//8JwYOHFghbUd8v1pd375908pOP/10K3dCGZxxxhnxr3/9K61s+PDh0adPnzK3XdR4M336dCsjAQAAAAAAAAAAPynVqjoAAAAAANhSTJgwIc4666xo2bJlHHTQQXHDDTfE6NGjS03Ujoj4+uuv4+abb46OHTvG2WefHUuXLq2EiKkqeXl5aX9XXXVVVYcE/P9GjBiRcYyOGDGiqsMCyImxDDYN999/f8axOGPGjKoOa4vmOyk/m+Ncc9VVV2XEDJuDPn36pO235fEANgAAAAAAciNZGwAAAAAqydNPPx333XdfLFq0KHEbqVQqhg4dGrvssktMmTKlHKMDAAAAAAAAAAAAIFf5VR0AAAAAAFS1evXqxQ477FDmdho0aJCoXq1ataJHjx6xzz77xDbbbBMtWrSIgoKCmD17drz33nvx8ssvx5o1a9LqzJo1K/r16xdvv/12bL/99mWKu3PnzlGzZs0ytRER0ahRozK3AQAAAAAAAAAAALA5kawNAAAAwBave/fuMWLEiErtMz8/Pw477LA488wz45BDDonatWsXu+3s2bPjD3/4Qzz88MNp5d98800MGjQohg8fXqZYXnrppWjXrl2Z2gAoL3369IlUKlXVYQA5aNeuneMWAACAxO6///64//77qzoMAAAAAEisWlUHAAAAAABbkjp16sTFF18cX331VTz77LMxcODAEhO1IyK23nrreOihh+Kaa67J+LcRI0bEU089VVHhAgAAAAAAAAAAAFACydoAAAAAUEkOOeSQ+PLLL+Pvf/97tGrVKuf6f/7zn2PAgAEZ5Q888EB5hAcAAAAAAAAAAABAjiRrAwAAAEAl2WuvvRIlaf/Y1VdfnVH22muvxdq1a8vULgAAAAAAAAAAAAC5y6/qAAAAAACA7O2+++7RqlWrmDNnzsay1atXx+zZs6Nt27ZVGNmWYe3atTFt2rT4/PPPY86cObF06dKIiGjatGk0bdo0dtlll+jYsWMVR5mblStXxgcffBBz5syJ+fPnx4oVK2KrrbaK5s2bx2677Rbbb799hcewZMmSGDVqVEydOjWWLFkS9evXj+bNm8fuu+8enTp1qrB+p06dGpMmTYoFCxbEggULYsOGDdGgQYPYZpttolOnTrHjjjtG9erVK6x/Kt7cuXNj/PjxMXPmzFi6dGmsWrUqateuHXXr1o1WrVpFu3btYscdd4z69etXdahF+uH4/Pbbb2P+/PmxevXqaN68ebRo0SK6desW2267bYX0O2/evI39LliwIOrWrRvbbbdd7LHHHtGuXbsK6bM4BQUF8fHHH8dnn30Wc+fOjdWrV0e9evWia9euccABB2RV/8svv4zPP/88vvnmm1i6dGkUFBREkyZNokmTJtGpU6fYZZddolq1ynm+8SeffBLjx4+POXPmxJo1a6JJkybRpUuX2HPPPaNWrVpZtbF+/fr46KOP4tNPP40FCxZEtWrVomXLlrHbbrtF165dK/gdVI1169bF6NGj47PPPosFCxZEjRo1onnz5rHjjjtGz549K3ys/vLLL+Ojjz6Kr776KlatWhXNmzeP1q1bx9577x1Nmzat0L7J3bfffhtjxoyJ6dOnx4oVK6Jp06axzTbbRI8ePWKbbbYp175WrVoVU6ZMic8//zwWLFgQS5cujfz8/GjSpEk0a9Ysdtttt0obN8s6XkZELF68OEaPHr3xvLCgoCBatGgRLVq0iB49ekTz5s0r+F1UjEWLFsXnn38eU6dOjUWLFsXy5cujbt260bRp02jZsmX07NnTsZyjn+q+UpXMNVumyZMnx+TJk2PevHmxYMGCqFWrVjRv3jzatGkTe+65Z9SuXbuqQ0xTUFAQY8eOjZkzZ8b8+fNj0aJF0bBhw2jevHl06NAhunXrFnl5eRUaww+/kSZPnhyLFi2K/Pz8aNWqVfTs2TOn6zELFy6M0aNHx7Rp02LZsmXRsGHD2HrrraN3797RrFmzCol97ty5MXbs2Jg/f37MmzcvNmzYEM2bN4+WLVvGXnvttdkd66lUKiZOnBiffvppfPvtt7Fy5cqoXbt27LDDDjFw4MCqDm+TM2vWrBg3blzMnDkzli1bFtWrV4+WLVvGCSecEHXr1i21/rx58+Lzzz+PL774IhYvXhwrVqyIBg0aRNOmTaN169bRs2fPCru2UVBQEKNGjYrp06fHt99+GxERW221Vey8887RvXv3yM/fdG9BnTdvXnz44Ycxb968mDdvXlSvXj1atGix8bhr2LBhVYcIAAAAwE9JCgAAAAC2INOnT09FRNpf7969qzqsnPTo0SPjPYwaNSqrur17986oO3369IoNuJwMHz48I/bTTz+9wvsdN25casiQIan9998/VatWrYwYCv81b948deaZZ6Y+++yzrPso6r3l+te2bdus+1u3bl3qn//8Z6pfv36pmjVrlthu+/btU5dffnlq4cKFOX92p59+eokxjhs3LnXsscematSoUeL7uu2221Jr167Nuf+ifPzxx6lBgwal2rRpU+pn2rhx49QxxxyT+ve//51as2ZNRlv//e9/M+oMGTKkzDHuuuuuaW22aNGiyP7LQ+HvKCJSw4cPL5e2k443RR0PucS0aNGi1P/8z/+kdtppp6yOnerVq6d23XXX1EUXXZR65513Uhs2bMhoc8iQIWU+RnMZrx5//PFU//79Sx1zdt5559S
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAa3CAYAAAB1eBhrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xd8FNX+//H3pkBIJZGE3nuXDtJBuiJgvRaQYscuVi7YELj2K+ql4xURuyDlCmhUlI70HiT0EkJCegjJ/P7wR75MZpPsbjbZsLyej0ceD+cw55zP7pQzO85njs0wDEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AV8PB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgLCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8BgnUAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwGCdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAYJ1AAAAAAAAAAAXAF69Oghm82W+9ejRw9Ph4SrUGxsrGk/tNlsmjdvnqfDclje2F9++WVPhwQP+uWXXyz7xC+//OLpsOBlGL9Rms2bN89yHoyNjfV0WACuYlyvA/CUl19+2XIOcgTX+wAAAAAAAKWbn6cDAAAAAAAAgGdcuHBB+/bt0549e3T27FmdP39e/v7+Cg8PV2RkpNq0aaOqVat6OkwAAAAAAAAAAAAAAAAAAADAKSRQAwAAAAAAlIDY2FjVrl27WNoOCwtTYmJioetlZWXpl19+0U8//aTo6Gj9+eefunjxYoF1qlWrpltvvVUPPfSQ6tev73KMPXr00K+//upy/YJ89913GjJkSLG0Lf09M2HPnj1NZSNGjLiiZtsESpt7771Xn3zyiUPr+vj4KCQkRGFhYYqKilKrVq3Utm1bDR48WJUqVSrmSOFOtWrV0uHDh52qExQUpNDQUFWoUEHNmzdXq1atNGTIENWrV6+YogQAAAAAAAAAAAAAAADgDXw8HQAAAAAAAACK1/bt2zV69GhVrFhRffv21dSpU7Vhw4ZCk6cl6dixY3r33XfVsGFDjRkzRklJSSUQMTzFZrOZ/l5++WVPhwQoJydH58+f15EjR7Rp0ybNnDlTDzzwgKpXr66hQ4dqx44dng4xX/PmzbMcV7GxsZ4O64qSmpqqkydPaseOHVqwYIHGjRun+vXrq3Pnzlq9erWnwwMAlDDGVqB0ePnlly3HIjyLbeI+V+JYc++995rirVWrlqdDAhxSq1Yt07577733ejokAAAAAAAAAF6GBGoAAAAAAAAv9+2332rOnDlKSEhwuQ3DMDR79mw1b95c+/fvd2N0AOCaixcv6vvvv1fbtm01depUT4eDErZmzRp169ZNjz76qHJycjwdDgAAAAAAAAAAAAAAAIBSxs/TAQAAAAAAAFytgoKCVK9evSK3ExIS4lK9smXLql27drruuutUpUoVRUVFKTs7WydPntSaNWu0fPlyZWZmmuocOXJEvXr10urVq1W7du0ixd24cWOVKVOmSG1IUlhYWJHbAOB5devWVXBwsKU8JydHiYmJOnnypC5evGj59wsXLuj5559XZmamJkyYUBKhwo1atmyZ779lZ2crOTlZp06dsoxHl0ybNk0pKSmaO3ducYUIAAAAAAAAAAAAAAAA4ApEAjUAAAAAAICHtG3bVr/88kuJ9unn56eBAwdq5MiR6t+/vwICAvJd9+TJkxo3bpw+++wzU/nx48c1atQoRUdHFymWZcuWqVatWkVqA4D3mDVrlnr06JHvv6elpem3337Tv//9by1fvtzy7xMnTlT79u3Vv3//YowS7rZ169ZC17l48aJ27dqlhQsX6oMPPlBqaqrp3+fNm6dBgwbplltuKaYoAXirHj16yDAMT4cBAAAAALhClfT/4wEAAAAAAIBzfDwdAAAAAAAAAIpfuXLl9OSTT+ro0aNatGiRhgwZUmDytCRVrlxZ8+fP16uvvmr5t19++UXffPNNcYULABaBgYHq37+/li1bppkzZ8rHx3p7+9lnn1VOTo4HokNx8vPzU8uWLTV58mTt2LFDtWvXtqzzz3/+0wORAQAAAAAAAAAAAAAAACitSKAGAAAAAADwcv3799dff/2ld955R5UqVXK6/j//+U/dcMMNlvL//ve/7ggPAJw2ZswYvfzyy5byHTt2aM2aNSUfEEpM7dq1tXDhQtlsNlP53r17tWvXLg9FBQAAAAAAAAAAAAAAAKC0IYEaAAAAAADAy3Xs2NGlxOnLvfLKK5ayFStW6MKFC0VqFwBcNW7cOFWsWNFS/uOPP3ogGpSk9u3bq127dpbyLVu2eCAaAAAAAAAAAAAAAAAAAKWRn6cDAAAAAAAAQOnXunVrVapUSadOncoty8jI0MmTJ1WzZk0PRnZ1uHDhgmJiYrR3716dOnVKSUlJkqSIiAhFRESoefPmatiwoYejdE5aWprWr1+vU6dOKS4uTqmpqbrmmmsUGRmpa6+9VrVr1y72GM6fP69169bpwIEDOn/+vIKDgxUZGanWrVurUaNGxdbvgQMHtGfPHp09e1Znz55VTk6OQkJCVKVKFTVq1EgNGjSQr69vsfXvLQICAjRw4EDNnTvXVP7nn386VD8hIUF79+7VgQMHlJCQoJSUFAUGBioiIkIVK1ZU+/btFRERURyhF7u4uDitW7dOf/31l1JSUhQWFqaoqCh16NDBa87Z7dq104YNG0xll49R7nDgwAFt27ZNx44dU0pKisqUKaNKlSpp+PDhDreRmJiojRs36vTp04qLi1NmZqYqVKigqKgotWvXTpUrV3ZrzN44XhTm4MGD2rZtm44fP66kpCSFhoaqbt266tChg6655ppi7//ChQvasGGDjh07pjNnzuSOZ1FRUWratKnq169f7DFcKQ4cOKDNmzfr+PHjyszM1DXXXKMqVaqoS5cuCg8P93R4xSI9PV3r1q3T3r17lZCQoHLlyikyMlLNmjVTy5YtZbPZirX/3bt3a+vWrTp58qQuXLigqKgoVatWTZ07d1ZwcHCx9g3n/fXXX9q8ebOOHj2q9PR0RUZGqmrVqurUqZPbr0lSUlK0d+9e7d+/X/Hx8UpOTlbZsmUVHh6uqKgotW3btsgv4XLUhQsXtGnTJu3bt09nz55VZmamQkJC1LFjR3Xo0MGhNs6cOaNNmzbpzJkzOnPmjHx9fRUVFaWKFSuqY8e
"text/plain": [
"<Figure size 4800x1500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAnqCAYAAAAzIHOrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe4VNXZOOzn0KVzpCiIgChiwwYIWEBsWKNYY2JvGEmiMYlJNKLGWF59Y/JqxI4lJrH3joIdRVRQmqgggvTe6/7+8IMfc+ZwzsycBsN9X9dcF7POXms9M7P32muG/exVkCRJEgAAAAAAAAAAAAAAAAAAAHmgWlUHAAAAAAAAAAAAAAAAAAAAUF4kUAMAAAAAAAAAAAAAAAAAAHlDAjUAAAAAAAAAAAAAAAAAAJA3JFADAAAAAAAAAAAAAAAAAAB5QwI1AAAAAAAAAAAAAAAAAACQNyRQAwAAAAAAAAAAAAAAAAAAeUMCNQAAAAAAAAAAAAAAAAAAkDckUAMAAAAAAAAAAAAAAAAAAHlDAjUAAAAAAAAAAAAAAAAAAJA3JFADAAAAAAAAAAAAAAAAAAB5QwI1AAAAAAAAAAAAAAAAAACQNyRQAwAAAAAAAAAAAAAAAAAAeUMCNQAAAAAAAAAAAAAAAAAAkDckUAMAAAAAAAAAAAAAAAAAAHlDAjUAAAAAAAAAAAAAAAAAAJA3JFADAAAAAAAAAAAAAAAAAAB5QwI1AAAAAAAAAAAAAAAAAACQNyRQAwAAAAAAAAAAAAAAAAAAeUMCNQAAAAAAAAAAAAAAAAAAkDckUAMAAAAAAAAAAAAAAAAAAHlDAjUAAAAAAAAAAAAAAAAAAJA3JFADAAAAAAAAAAAAAAAAAAB5QwI1AAAAAAAAAAAAAAAAAACQNyRQAwAAAAAAAAAAAAAAAAAAeUMCNQAAAAAAAAAAAAAAAAAAkDckUAMAAAAAAAAAAAAAAAAAAHlDAjUAAAAAAAAAAAAAAAAAAJA3JFADAAAAAAAAAAAAAAAAAAB5QwI1AAAAAAAAAAAAAAAAAACQNyRQAwAAAABABRg6dGgUFBSkPIYOHVrVYQElmDRpUtpx++CDD1Z1WAAAsEnq1atXyty5V69eVR0SsIXI9Xe3a665Jq0eAAAAAPmrRlUHAAAAAED+WLlyZYwfPz7Gjh0bs2fPjgULFkTNmjWjSZMm0axZs9h3332jVatWVR0mAAAAAAAAAAAAAHlMAjUAAADAZmrSpEnRrl27Cmm7UaNGMX/+/FK3W7VqVQwdOjTefPPNGDJkSHz66aexevXqEutst912cfLJJ8fFF18cO+20U84x9urVK95+++2c65fkmWeeieOPP75C2o74cXWMgw8+OKXsrLPOssIllMHZZ58dDz30UErZkCFDymX1q+LGm4kTJ0bbtm3L3DYAAAAAAAAAAADlr1pVBwAAAADA5mfUqFFx3nnnRYsWLeLwww+Pm2++OT7++ONSk6cjIqZMmRK33XZb7LzzznH++efHwoULKyFiqkpBQUHK45prrqnqkID/39ChQ9OO0aFDh1Z1WABZMZYBsDly/io/kyZNSnsvN/Ub1D344INpMU+aNKmqw4JSnX322Sn7rRvLAQAAAACbOgnUAAAAAGTt6aefjgceeCDmzZuXcxtJksT9998fe+yxR3z11VflGB0AAAAAAAAAAAAAW7IaVR0AAAAAAOWnXr16seOOO5a5nQYNGuRUr3bt2tGlS5fo0aNHtGzZMpo3bx5r1qyJadOmxQcffBCvvPJKrFixIqXO5MmTo3fv3vHuu+9Gu3btyhT3LrvsErVq1SpTGxERjRo1KnMbAAAAAAAAAAAAAFQNCdQAAAAAeaRz584xdOjQSu2zRo0acdRRR8U555wTffr0iTp16mx022nTpsXvfve7ePTRR1PKp06dGueee24MGTKkTLG8/PLL0bZt2zK1AVBeevXqFUmSVHUYQBbatm3ruAUAAIA8dc0118Q111xT1WEAAAAAUEmqVXUAAAAAAGyettpqq7jsssvi+++/j+eeey6OP/74EpOnIyK23Xbb+Ne//hXXXXdd2t+GDh0aTz31VEWFCwAAAAAAAAAAAMAWQgI1AAAAAFnr06dPfPvtt/G3v/0tttlmm6zr//nPf45jjjkmrfzhhx8uj/AAAAAAAAAAAAAA2IJJoAYAAAAga926dcspcXpD1157bVrZ66+/HitXrixTuwAAAAAAAAAAAABs2WpUdQAAAAAAbJn22Wef2GabbWL69Onry5YvXx7Tpk2LNm3aVGFkW4aVK1fG119/HePGjYvp06fHwoULIyKisLAwCgsLY4899oidd965iqPMztKlS+Ojjz6K6dOnx6xZs2LJkiWx9dZbR7NmzWKvvfaKdu3aVXgMCxYsiGHDhsWECRNiwYIFUb9+/WjWrFnss88+0bFjxwrrd8KECTF27NiYPXt2zJ49O9auXRsNGjSIli1bRseOHaNDhw5RvXr1CuufijdjxowYOXJkfPfdd7Fw4cJYtmxZ1KlTJ+rWrRvbbLNNtG3bNjp06BD169ev6lCLte74/OGHH2LWrFmxfPnyaNasWTRv3jz23nvv2G677Sqk35kzZ67vd/bs2VG3bt3YfvvtY9999422bdtWSJ8bs2bNmvj8889jzJgxMWPGjFi+fHnUq1cvOnXqFIccckhG9b/99tsYN25cTJ06NRYuXBhr1qyJJk2aRJMmTaJjx46xxx57RLVqlXPv3C+++CJGjhwZ06dPjxUrVkSTJk1i9913j/322y9q166dURurV6+OESNGxJdffhmzZ8+OatWqRYsWLWKvvfaKTp06VfArqBqrVq2Kjz/+OMaMGROzZ8+OmjVrRrNmzaJDhw7RtWvXCh+rv/322xgxYkR8//33sWzZsmjWrFm0atUqunfvHoWFhRXaN5lbsGBBDB8+PGbMmBFz5syJRYsWRb169aKwsDA6dOgQu+66azRs2LBMfcybNy/GjRsXEyZMiHnz5sXixYujbt26UVhYGC1atIiuXbtW2j5RdP5Up06d9ftlNt8Lfvjhhxg+fHhMmjQpFi9eHIWFhbHddttFz549y/x+bczkyZNj1KhRMWvWrJg1a1ZUr149mjZtGi1btozu3btXynl5woQJMXLkyJgyZUosXrw4atWqFdtss02ceeaZGdWfOnVqjBs3LiZNmhQLFiyIZcuWRcOGDaOwsDC233776NKlS9SpU6eCX0XlmTlzZnzyyScxceLEWLBgQRQUFETTpk3jhBNOiKZNm5Zaf1M6drYEVTWHzGfrxsqJEyfGkiVLorCwMFq2bBldunSJli1bVnV4VJBN4XyVjSRJ4osvvohvvvkmZs2aFXPmzIl69epFs2bNom3bttGlS5eoUaNiL3nbcN4+Z86ciIho0aJF7LPPPrHnnntm3M7ChQtj+PDhMX78+Jg/f37Uq1cvttlmm9h///0rbAybP3/++rnkrFmzYsWKFdG0adNo3rx5dOnSJbbddtsK6bcilXW+syXZnOc6SZLEiBEjYsKECfHDDz/EqlWrorCwMDp27Bhdu3bdpOek8+fPj48//nj979Jr1qyJ5s2brz/umjVrVtUhAgAAAGy5EgAAAAA2SxMnTkwiIuXRs2fPqg4rK126dEl7DcOGDcuobs+ePdPqTpw4sWIDLidDhgxJi/2ss86q8H4/++yzZMCAAclBBx2U1K5dOy2Goo9mzZol55xzTjJmzJiM+yjutWX7aNOmTcb9rVq1Krn33nuT3r17J7Vq1Sqx3fbt2yd//OMfkzlz5mT93p111lklxvjZZ58lJ554YlKzZs0SX9ftt9+erFy5Muv+i/P5558n5557btK6detS39PGjRsnffv2Tf773/8mK1asSGvrzTffTKszYMCAMse45557prTZvHnzYvsvD0U/o4hIhgwZUi5t5zreFHc8ZBPTvHnzkr/+9a/JrrvumtGxU7169WTPPfdMLr300uS9995L1q5dm9bmgAEDynyMZjNePf7448lhhx1W6piz2267JQMGDEgWLFiQcdslee6555KePXsm1apV22ife+2
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x1500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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Xx7bbLNNNGrUKPbee+9o2bJlqcewePHi+Oijj+Kbb76JxYsXR61ataJRo0bRoUOH2HXXXUut32+++SbGjRsX8+bNi3nz5sX69eujdu3asd1228Wuu+4au+yyS1SsWLHU+qf0zZ49O8aMGRPfffddLFmyJFauXBnVqlWLGjVqRNOmTaNFixaxyy67RK1atco71EL9dHzOmDEj5s6dG6tWrYpGjRpF48aNo3379rHDDjuUSr9z5szZ0O+8efOiRo0aseOOO8Y+++wTLVq0KJU+i5Kfnx+ff/55jB07NmbPnh2rVq2KmjVrxp577hmHHHJIVvW//fbbGD9+fEyfPj2WLFkS+fn5Ub9+/ahfv37suuuusccee0SFCmXzjOIvv/wyxowZE7NmzYrVq1dH/fr1Y/fdd4999903qlatmlUb69ati9GjR8dXX30V8+bNiwoVKkSTJk1i7733jj333LOU96B8rF27Nj755JMYO3ZszJs3LypXrhyNGjWKXXbZJTp37lzqY/W3334bo0ePju+//z5WrlwZjRo1iu233z7222+/aNCgQan2Tdn5aeybMmVKLF26NGrUqBHNmzeP/fffP6cHLk2ZMiVGjRoVP/zwQ6xcuTIaNmwYzZs3j65du0a1atVKcQ+2TpMnT44xY8ZsGMPr1KkTrVq1in333Te22WabUus3lUrFd999F+PHj49p06bFkiVLYs2aNVGvXr2oX79+tGrVKjp06BCVKm3+t00sXLgwxo8fH998800sXLgwli1bFjVq1IgGDRpEkyZNonPnzlvMWLZmzZr45JNP4ocffog5c+Zs+O3SuHHj2G233aJ169blHeIWZ/78+fHxxx/H5MmTY8mSJVG3bt3YbrvtYq+99opWrVqVd3iUktmzZ8enn34ac+fOjTlz5sT69eujUaNG0aRJk+jSpctmOSZMmDAhJkyYEHPmzIl58+ZF1apVo1GjRtGsWbPYd999S/0cu379+vj000/jyy+/jLlz50Z+fn5ss802sddee0XHjh2zno+uWrUqRo4cGWPHjo0FCxZE1apVN4zFpTWGbQ7XfUratGnT4rPPPovvvvsuli5dGhUrVowmTZrEySefHDVq1Cjv8DYrixYtipEjR8bkyZNj0aJFsX79+mjQoEEceeSRWV1LXrZsWYwfPz4mTpwY8+fPj6VLl0bVqlWjfv360bhx4+jYsWOxH066MV999VWMHTs2ZsyYEStWrIh69erFLrvsEl26dNlsr+VElN/1HAAAAAC2YCkAAAAA2MJMmTIlFRFpf127di3vsHLSqVOnjH346KOPsqrbtWvXjLpTpkwp3YBLyLBhwzJiP+uss0q9388++yx1/fXXpw4++OBU1apVM2Io+NeoUaPUOeeckxo7dmzWfRS2b7n+NW/ePOv+1q5dm3r44YdTPXr0SFWpUmWj7bZq1Sp1zTXXpObPn5/ze3fWWWdtNMbPPvssdcIJJ6QqV6680f267777UmvWrMm5/8J8/vnnqb59+6aaNWu2yfe0Xr16qT59+qT+/e9/p1avXp3R1v/+97+MOtdff32xY9xrr73S2mzcuHGh/ZeEgp9RRKSGDRtWIm0nHW8KOx5yiWnhwoWpW265JdWuXbusjp2KFSum9tprr9Tll1+eeu+991Lr16/PaPP6668v9jGay3j
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
2025-06-03 13:43:48 +00:00
},
{
2025-06-06 08:24:47 +00:00
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAa3CAYAAAB1eBhrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3XeYVNX9OP73LlVgaVIURUBQsTdAxIZiAzu2xERAY0vUTz4pGttH1MQW0zVWFI0lttjRKBqwI4gCKqCiINIUkN7Zvb8/8oUfs7PszsyWgfX1ep55HubsPee878zce8+93Pc9BUmSJAEAAAAAAAAAAAAAAAAAAFALFOY7AAAAAAAAAAAAAAAAAAAAgKoigRoAAAAAAAAAAAAAAAAAAKg1JFADAAAAAAAAAAAAAAAAAAC1hgRqAAAAAAAAAAAAAAAAAACg1pBADQAAAAAAAAAAAAAAAAAA1BoSqAEAAAAAAAAAAAAAAAAAgFpDAjUAAAAAAAAAAAAAAAAAAFBrSKAGAAAAAAAAAAAAAAAAAABqDQnUAAAAAAAAAAAAAAAAAABArSGBGgAAAAAAAAAAAAAAAAAAqDUkUAMAAAAAAAAAAAAAAAAAALWGBGoAAAAAAAAAAAAAAAAAAKDWkEANAAAAAAAAAAAAAAAAAADUGhKoAQAAAAAAAAAAAAAAAACAWkMCNQAAAAAAAAAAAAAAAAAAUGtIoAYAAAAAAAAAAAAAAAAAAGoNCdQAAAAAAAAAAAAAAAAAAECtIYEaAAAAAAAAAAAAAAAAAACoNSRQAwAAAAAAAAAAAAAAAAAAtYYEagAAAAAAAAAAAAAAAAAAoNaQQA0AAAAAAAAAAAAAAAAAANQaEqgBAAAAAAAAAAAAAAAAAIBaQwI1AAAAAAAAAAAAAAAAAABQa0igBgAAAAAAAAAAAAAAAAAAag0J1AAAAAAAAAAAAAAAAAAAQK0hgRoAAAAAAAAAAAAAAAAAAKg1JFADAAAAAAAAAAAAAAAAAAC1hgRqAAAAAAAAAAAAAAAAAACg1pBADQAAAAAAAAAAAAAAAAAA1BoSqAEAAAAAoIb07t07CgoK1r969+6d75D4Hpo2bVrK77CgoCDuv//+fIeVsdKxX3PNNfkOiTwaOXJk2m9i5MiR+Q6LWuaaa65J+53Bhjb3YytAbeB8G8iXXM9LnWcAAAAAVL+6+Q4AAAAAgNytXr06Pv3005g0aVLMmzcvFi1aFPXq1YsWLVpE69atY999941tttkm32ECAAAAAAAAAAAAQI2RQA0AAACQoWnTpkWnTp2qpe1mzZrFwoULK1xuzZo1MXLkyHjttddixIgR8cEHH8TatWvLrbPtttvGqaeeGj/96U9jhx12yDnG3r17x+uvv55z/fI8/fTTceKJJ1ZL2xH/nQHi0EMPTSkbOHCgGcGgEgYNGhQPPPBARssWFhZGUVFRNGvWLNq0aRN77713dOvWLY4//vjYaqutqjlSqlLHjh3jq6++yqpO48aNo2nTptGqVavYfffdY++9944TTzwxunTpUk1RAgAAAAAAAAAA33eF+Q4AAAAAgIpNmDAhfvKTn0Tbtm3jyCOPjJtvvjlGjx5dYfJ0RMSMGTPiz3/+c+y0005xzjnnxOLFi2sgYvKloKAg5XXNNdfkOySIkpKSWLRoUUyfPj3ef//9uOeee+L888+P9u3bx0knnRQfffRRvkPcqPvvvz9tu5o2bVq+w9qsLFu2LGbPnh0fffRRPPLII3HJJZfEDjvsEAcccEC8+eab+Q4PgBrm2Aqbho4dO6Zsh4MGDcp3SOTJyJEj0/bLI0eOzHdYm6Vp06alfZab+sP7HJfZXA0aNCjld9uxY8d8hwQAAAAAbIIkUAMAAABsBp566qm47777YsGCBTm3kSRJ3HvvvbH77rvHZ599VoXRAeRm7dq18cwzz0S3bt3i5ptvznc41LB33nknDj744Lj44oujpKQk3+EAAAAAAAAAAAC1SN18BwAAAACwOWvcuHF06dKl0u0UFRXlVK9BgwbRvXv36NWrV7Rr1y7atGkTxcXFMXv27HjnnXfipZdeilWrVqXUmT59ehx22GHx5ptvRqdOnSoV98477xz169evVBsREc2aNat0G0D+de7cOZo0aZJWXlJSEgsXLozZs2fH2rVr0/6+evXquOyyy2LVqlVx9dVX10SoVKE999xzo38rLi6OJUuWxJw5c9KOR+vcdtttsXTp0hg6dGh1hQgAAAAAAAAAAHzPSKAGAAAAqIRu3brFyJEja7TPunXrRr9+/eKss86Ko48+Oho2bLjRZWfPnh2XXHJJPPzwwynlM2fOjLPPPjtGjBhRqVhefPHF6NixY6XaAGqPIUOGRO/evTf69+XLl8cbb7wRf/vb3+Kll15K+/vgwYOjR48ecfTRR1djlFS1cePGVbjM2rVr45NPPolHH300br311li2bFnK3++///445phj4pRTTqmmKIHaqnfv3pEkSb7DoJa75ppr4pprrsl3GAAAQC3iPAMAAACg+hXmOwAAAAAAMrPFFlvEL37xi/j666/j2WefjRNPPLHc5OmIiK233joeeuihuO6669L+NnLkyPjXv/5VXeECpGnUqFEcffTR8eKLL8Y999wThYXpl6gvvfTSKCkpyUN0VKe6devGnnvuGTfeeGN89NFH0alTp7Rl/u///i8PkQEAAAAAAAAAALWRBGoAAACAzcDRRx8dX375ZfzpT3+KrbbaKuv6//d//xfHHntsWvk//vGPqggPIGvnnHNOmTOsfPTRR/HOO+/UfEDUmE6dOsWjjz4aBQUFKeWTJ0+OTz75JE9RAQAAAAAAAAAAtYkEagAAAIDNQM+ePXNKnN7Qtddem1b2yiuvxOrVqyvVLkCuLrnkkmjbtm1a+csvv5yHaKhJPXr0iO7du6eVf/jhh3mIBgAAAAAAAAAAqG3q5jsAAAAAAGrGPvvsE1tttVXMmTNnfdnKlStj9uzZ0aFDhzxG9v2wevXqmDJlSkyePDnmzJkTixcvjoiIli1bRsuWLWP33XePnXbaKc9RZmf58uXx3nvvxZw5c2Lu3LmxbNmy2HLLLaN169ax1157RadOnao9hkWLFsWoUaPi888/j0WLFkWTJk2idevWsc8++0TXrl2rrd/PP/88Jk2aFPPmzYt58+ZFSUlJFBUVRbt27aJr166x4447Rp06daqt/9qiYcOG0a9fvxg6dGhK+QcffJBR/QULFsTkyZPj888/jwULFsTSpUujUaNG0bJly2jbtm306NEjWrZsWR2hV7u5c+fGqFGj4ssvv4ylS5dGs2bNok2bNrHffvvVmn129+7dY/To0SllGx6jqsLnn38e48ePjxkzZsTSpUujfv36sdVWW8WAAQMybmPhwoUxZsyY+Oabb2Lu3LmxatWqaNWqVbRp0ya6d+8eW2+9dZXGXBuPFxX54osvYvz48TFz5sxYvHhxNG3aNDp37hz77bdfbLnlltXe/+rVq2P06NExY8aM+Pbbb9cfz9q0aRO77rpr7LDDDtUew+bi888/j7Fjx8bMmTNj1apVseWWW0a7du3iwAMPjBYtWuQ7vGqxYsWKGDVqVEyePDkWLFgQW2yxRbRu3Tp222232HPPPaOgoKBa+584cWKMGzcuZs+eHatXr442bdrEtttuGwcccEA0adKkWvum5kyfPj3ef//9+Oqrr2LZsmVRVFQUXbp0iV69emW1bU2aNCk+/PDDlN9L586d48ADD4y6dd0akK2PP/44Jk6cGLNmzYrly5dH8+bNY8cdd4yePXtW6/ZXXFwcX375ZUyePHn9sbG4uDhatGgRLVq0iK5du8buu+8ehYWb/vPyv/3225g8eXJ88cUXsXDhwvW/75YtW8Y222wTPXr02Gz2ZevOf2fNmhVz586NlStXRuvWraNNmzax9957x7bbbpvvEDc7s2bNijFjxsTUqVNj2bJl0bJly2jXrl1079492rVrl+/wqCbTp0+PCRMmxNy5c2Pu3LlRp06daNWqVbRr1y7233//TW6fkCRJfPTRR/HFF1/E3LlzY/78+dG4ceNo3bp
"text/plain": [
"<Figure size 4800x1500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
2025-06-03 13:43:48 +00:00
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
2025-06-06 08:24:47 +00:00
"<Figure size 4800x2700 with 1 Axes>"
2025-06-03 13:43:48 +00:00
]
},
"metadata": {},
2025-06-06 08:24:47 +00:00
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD4UAAAnqCAYAAACKGDemAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xd4FFX/9/FPQkJNQhJCQjH03qtU6UWqgAhIF0HBfltv1JumYsEuCigKqFgARYooRQHpvfeOhppAEkp65vnDh/zYnU2yu9nsLvB+XddeOmfnlM3MnDkzzHeOj2EYhgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXsnX0w0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGSOoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8GIEhQMAAAAAAAAAAAAAAAAAAAAAAAAAAACAFyMoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8GEHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODFCAoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9GUDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeDGCwgEAAAAAAAAAAAAAAAAAAAAAAAAAAADAixEUDgAAAAAAAAAAAAAAAAAAAAAAAAAAAABejKBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPBiBIUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBcjKBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvBhB4QAAAAAAAAAAAAAAAAAAAAAAAAAAAADgxQgKBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvRlA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgxgsIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAwIsRFA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAXoygcAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwYgSFAwAAAAAAAAAAAAAAAAAAAAAAAAAAAIAXIygcAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwYQeEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4MUICgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0ZQOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4MYLCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAMCLERQOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF6MoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8GIEhQMAAAAAAAAAAAAAAAAAAAAAAAAAAACAFyMoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8GEHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODFCAoHAAAAAAAAAMBOZcqUkY+PT8Zn6NChnm6S3Vq1amXR9latWnm6SfCgVatWWewPPj4+WrVqlaebBQCARzBOgjtYj73GjRuXq/lcxdP1AwAQFxenyZMn64EHHlDFihUVGhqqPHnyWJyf6tSpY5Fn5syZpnPYyZMns63L2Xyedivfs8SdhbElAAAAAAA55+fpBgAAAAAAALhLcnKyDh06pAMHDig6OlpxcXHy9/dXSEiIihYtqvr166tkyZKebiYAAAAAAAAAAMAdb+rUqXrxxRd15coVTzcFAAAAAAAA8AoEhQMAAAAAgFxx8uRJlS1bNlfKLly4sGJjY7NdLyUlRatWrdIff/yhlStXavv27UpNTc0yz1133aUHHnhAo0aNUsWKFZ1uY6tWrbR69Wqn82dl/vz56tGjR66ULf07c2jr1q0t0oYMGaKZM2fmWp3A7W7o0KGaNWuWQ3ny5cunoKAghYSEqEqVKqpTp446duyopk2b5lIrAQDZcaQ/9/X1VUBAgAoXLqywsDDVqlVL9erVU5cuXVS+fPlcbikAa+PGjdP48eM9UveMGTOYqQ8AAABw0GuvvaYxY8Z4uhkAAAAAAACAV/H1dAMAAAAAAABcbffu3Xr44YcVERGhDh066O2339bmzZuzDQiXpH/++UcffPCBKleurOHDhys+Pt4NLYan+Pj4WHzGjRvn6SYBGZKSknTx4kUdPnxYCxcu1IQJE9SsWTOVL19eX331lQzD8HQTAQBZSE9PV3x8vP7++2/t2LFDs2bN0tNPP62KFSuqVatWWrlypaebCADALatMmTIW1/O8eAEAbi/ct3WdW/WcuW3bNpvb3cfHR6VKlVKtWrVUu3btjE/lypXd30hI+vcl0dbHLC8ZBgAAAAAAyD0EhQMAAAAAgNvOzz//rK+++kqXL192ugzDMPTll1+qZs2aOnz4sAtbBwA5c/z4cT388MNq2bJljvo5AIBnGIah1atXq23btho1apRdLy4CAAAAAOBO8v777ys9Pd0ibfTo0YqOjtapU6e0a9cu7dy5M+Pz448/eqilAAAAAAAAgHv5eboBAAAAAADgzlGoUCFVqFAhx+UEBgY6lS9fvnxq2LChmjZtqhIlSig8PFxpaWk6e/as1q9fr99++01JSUkWeU6fPq02bdpozZo1Klu2bI7aXbVqVeXNmzdHZUhS4cKFc1wGAM8rX768AgICbH5nGIauXr2q6OhoxcfH21xnzZo1atWqldasWaOgoKDcbCoAIAuZ9efp6emKjY3V+fPnlZycbPreMAxNnTpVCQkJmjFjhnx8fNzRXOCOVaxYMdWuXduhPKdPnza9hCcyMlKhoaEOlePo+gAAAMCdLD09XYsWLbJIe+CBBzRx4kQPtQgAAAAAAADwHgSFAwAAAAAAt2nQoIFWrVrl1jr9/PzUuXNnPfTQQ7r33nuVP3/+TNc9e/asXnjhBc2ePdsiPSoqSsOGDdPKlStz1JYlS5aoTJkyOSoDwO1j+vTpatWqVbbrnTp1SgsWLND777+vU6dOWXy3e/duvfzyy5o8eXIutRIAkJ3s+vOkpCRt2bJF06dP1zfffGOa6WzWrFlq0aKFhg0blsstBe5sI0eO1MiRIx3KM3ToUM2aNcsibcKECRo6dKgLWwZv4O57FYAjDMPwdBMAAHCrAwcO6MqVKxZpffv2dUvdQ4cOZbwPAAAAAAAAr+br6QYAAAAAAADkhgIFCug///mP/v77by1YsEA9evTIMiBckooXL65vv/1WEyZMMH23atUq/fTTT7nVXADIVOnSpfXUU09p//796tSpk+n7KVOm6MyZMx5oGQDAHvny5VPz5s01c+ZMLVu2TAULFjStM3bsWCUmJnqgdQAAAAAAeJfTp0+b0ipXruyBlgAAAAAAAADeh6BwAAAAAABw27n33nt1/Phxvf/++ypWrJjD+f/3v/+pa9eupvSvv/7aFc0DAKcULFhQP/74o6lfS09P1/z58z3UKgCAI9q2baspU6aY0v/55x+tXLnSAy0CAAAAAMC7xMXFmdIKFSrkgZYAAAAAAAAA3oegcAAAAAAAcNtp3LixU8HgNxs/frwpbdmyZUpOTs5RuQCQE4GBgRo8eLApfceOHR5oDQDAGQMHDlSFChVM6cuWLfNAawAAAAAA8C6JiYmmNB8fHw+0BAAAAAAAAPA+fp5uAAAAAAAAgDeqV6+eihUrpnPnzmWkJSYm6uzZsypdurQHW3ZnSE5O1tGjR3Xw4EGdO3dO8fHxkqTQ0FCFhoaqZs2aqly5sodb6Zjr169r06ZNOnfunC5evKhr166pSJEiKlq0qOrUqaOyZcvmehvi4uK0ceNGHTlyRHFxcQoICFDRokVVr149ValSJdfqPXLkiA4cOKDo6GhFR0crPT1dgYGBKlGihKpUqaJKlSopT548uVb/7aZhw4amtJv7Kle4cOGCtm7dqhMnTiguLk4+Pj4KCwtTz549FRYWZlcZycnJ2rJli6KionThwgXFx8crJCRERYsWVbVq1VStWjWXttkwDJ06dUoHDx7U6dOnFR8fr+TkZAUHByskJETly5dXvXr15Od3+9wWj4mJ0caNGxUVFaWLFy+qQIECKlWqlOrXr++WPsUwDO3Zs0dHjhzRxYsXdenSJRUuXFjh4eEqW7as6tWrJ19f3k0rSRcvXtTGjRt1/PhxXb16NePv1KhRI68fVyQ
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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AFBNnn766UgkEkllTz75ZOy88845iggAAAAAgOIkUAMAAABQrt69e8frr79erX3Wq1cvBg8eHKeffnocfvjh0ahRo1L3nTt3blx66aXxyCOPJJXPmTMnzjjjjBgzZkyFYnnhhReiS5cuFWoDqD1GjhwZAwYMKPXxVatWxZtvvhl/+ctf4sUXX0x5fMSIEbHXXnvF4YcfXoVRUtmmTJlS7j4bNmyI6dOnx2OPPRZ33HFHrFy5MunxBx54II444oj40Y9+VEVRArXVgAEDUhJ0oKa45ppr4pprrsl1GABQrSZOnJi03bNnz2pLnp41a1a19AMAAAAAsLmrk+sAAAAAAGBTW2yxRfzyl7+Mr7/+Op5++uk45phjykyejojo0KFDPPzww/G73/0u5bHXX389/vOf/1RVuAApGjduHIcffni88MILce+990adOqk/xf/617+OoqKiHERHVapXr1706tUrbrrppvjggw+ia9euKfv89re/zUFkAAAAVKbZs2cnbe+www45igQAAAAAgNJIoAYAAACgxjj88MPjyy+/jD/96U/Rvn37jOv/9re/jSOPPDKl/KGHHqqM8AAydtZZZ5W4IuMHH3wQ48aNq/6AqDZdu3aNxx57LPLy8pLKP/nkk5g+fXqOogIAAKAyLF26NGm7SZMmOYoEAAAAAIDSSKAGAAAAoMbo27dvVonTm7r22mtTyl5++eVYt25dhdoFyNall14a7dq1Syl/6aWXchAN1WmvvfaKPn36pJS///77OYgGAACAyrJmzZqk7eI3zwIAAAAAIPfq5ToAAAAAAKhMe+yxR7Rv3z7mzZu3sWzNmjUxd+7c6Ny5cw4j+2FYt25dzJgxIz755JOYN29eLFu2LCIiWrVqFa1atYpddtkldthhhxxHmZlVq1bFO++8E/PmzYuFCxfGypUrY8stt4w2bdrEbrvtFl27dq3yGJYuXRoTJkyIzz//PJYuXRr5+fnRpk2b2GOPPWLHHXessn4///zz+Pjjj2PRokWxaNGiKCoqiqZNm0bHjh1jxx13jO233z7q1q1bZf3XFo0aNYrBgwfHqFGjksrfe++9tOovWbIkPvnkk/j8889jyZIlsWLFimjcuHG0atUq2rVrF3vttVe0atWqKkKvcgsXLowJEybEl19+GStWrIjmzZtH27ZtY++996415+w+ffrExIkTk8o2HaMqw+effx5Tp06Nb775JlasWBENGjSI9u3bx7Bhw9Juo6CgICZNmhTz58+PhQsXxtq1a6N169bRtm3b6NOnT3To0KFSY66N40V5vvjii5g6dWrMmTMnli1bFs2aNYtu3brF3nvvHVtuuWWV979u3bqYOHFifPPNN7FgwYKN41nbtm1j5513ju22267KY9hcfP755zF58uSYM2dOrF27Nrbccsvo2LFj7L///tGyZctch1clVq9eHRMmTIhPPvkklixZEltssUW0adMmevbsGb169aryhKCPPvoopkyZEnPnzo1169ZF27ZtY+utt4799tsv8vPzq7Rvap61a9fG22+/HbNnz4558+ZF3bp1o127drHLLrvEbrvtVqXvxxUrVsQnn3wSn332WSxevDiWL18eDRs2jJYtW0bbtm2jd+/eFb7pV7rWrVsX7777bnz66aexaNGiWLt2bTRt2jT69u0be++
"text/plain": [
"<Figure size 4800x1500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
2025-06-03 13:43:48 +00:00
{
2025-06-06 08:24:47 +00:00
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAnqCAYAAAAzIHOrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe0VNX9OOzPpUsH6RZAsGAvgCgoKDawY2+gxpaoiSb6TSyxRI0aE0s0MVYssUSjsRtFRUVRKUpREUVBlCYgvZfz/pEXfsydW2bmVsbnWWvW4ux7djlzZvbeczifswuSJEkCAAAAAAAAAAAAAAAAAAAgD9So6gYAAAAAAAAAAAAAAAAAAACUFwHUAAAAAAAAAAAAAAAAAABA3hBADQAAAAAAAAAAAAAAAAAA5A0B1AAAAAAAAAAAAAAAAAAAQN4QQA0AAAAAAAAAAAAAAAAAAOQNAdQAAAAAAAAAAAAAAAAAAEDeEEANAAAAAAAAAAAAAAAAAADkDQHUAAAAAAAAAAAAAAAAAABA3hBADQAAAAAAAAAAAAAAAAAA5A0B1AAAAAAAAAAAAAAAAAAAQN4QQA0AAAAAAAAAAAAAAAAAAOQNAdQAAAAAAAAAAAAAAAAAAEDeEEANAAAAAAAAAAAAAAAAAADkDQHUAAAAAAAAAAAAAAAAAABA3hBADQAAAAAAAAAAAAAAAAAA5A0B1AAAAAAAAAAAAAAAAAAAQN4QQA0AAAAAAAAAAAAAAAAAAOQNAdQAAAAAAAAAAAAAAAAAAEDeEEANAAAAAAAAAAAAAAAAAADkDQHUAAAAAAAAAAAAAAAAAABA3hBADQAAAAAAAAAAAAAAAAAA5A0B1AAAAAAAAAAAAAAAAAAAQN4QQA0AAAAAAAAAAAAAAAAAAOQNAdQAAAAAAAAAAAAAAAAAAEDeEEANAAAAAAAAAAAAAAAAAADkDQHUAAAAAAAAAAAAAAAAAABA3hBADQAAAAAAAAAAAAAAAAAA5A0B1AAAAAAAAAAAAAAAAAAAQN4QQA0AAAAAAAAAAAAAAAAAAOQNAdQAAAAAZOz000+PgoKC9a8OHTpUaL580KFDh5RjP/3006u6SQBQqj59+qSMX3369KnqJvETNGXKlJTPYUFBQTz00ENV3ayMFW77NddcU9VNogq9/fbbaZ+Jt99+u6qbRZ655ppr0j5nFZmvvFR1/QAQETF8+PC4+OKLY++994527drFJptskjY+Pffccyl5cr32uzFeM37ooYfS3o8pU6ZUdbMgjbklAAAAsKFaVd0AAAAAACD/rVy5MiZOnBgTJkyIOXPmxIIFC6J27drRrFmzaNmyZeyxxx6x2WabVXUzAQAAAICfkGnTpsWpp57q4TYAAAAAkIcEUAMAAADlasqUKdGxY8eM9q1Zs2bUq1cv6tWrF5tuumm0atUqOnToENttt13ssssusffee0fz5s0ruMWQf7L5HmarSZMmMX/+/FL3W7VqVbz99tvx5ptvxtChQ+Pjjz+O1atXl5hn8803j+OOOy5+/vOfx9Zbb51zG/v06RPvvPNOzvlL8p///CeOOuqoCik74n8rE+63334paYMGDdqoVtuE6ub000+Phx9+OKN9a9SoEY0aNYomTZpEq1atYrfddouuXbvGEUccEW3atKngllKeOnToEN9++21WeRo0aBCNGzeOFi1axE477RS77bZbHHXUUdG5c+cKaiUAAABVadasWdG9e/eYPn16VTcFAAAAAKgANaq6AQAAAMBP15o1a2LJkiUxd+7c+PLLL+O9996Lf/7zn3HllVfG4YcfHi1atIg99tgjbrrpppg2bVpVNzdnU6ZMiYKCgpSXYEjy1bhx4+JnP/tZtG7dOg466KC4+eabY8SIEaUGT0dEfP/993HbbbfFtttuG2eddVYsXLiwElpMVSncL15zzTVV3SSItWvXxoIFC2Lq1KkxatSouO++++Lcc8+NLbbYIo4++ugYP358VTexWA899FDa92rKlClV3ayNypIlS2LGjBkxfvz4ePzxx+PSSy+NrbfeOnr27BnDhg2r6uYBUMmMrQD57Zprrknr58nNxjxmnnPOOUUGTzdu3Hj9g143fDVp0qQKWknE/x6Qt+FnrEOHDlXdJAAAAAA2AgKoAQAAgGorSZL4+OOP47LLLouOHTvGwIEDY+rUqVXdLKAEzz77bDz44IMxb968nMtIkiQeeOCB2GmnneLLL78sx9YB5Gb16tXx3HPPRdeuXePmm2+u6uZQyYYPHx777rtvXHjhhbF27dqqbg4AAADl4Msvv4wXX3wxJW2bbbaJd999N+bPnx8TJkyIMWPGpLz222+/KmotAAAAAJCLWlXdAAAAACD/NWjQIDp37lzk3xYtWhQLFiyIBQsWlLhC7apVq+LRRx+Nf//73/HHP/4xLrroogpqLeSnkr6H2WjUqFFO+erWrRvdunWLvffeO9q1axetWrWKNWvWxIwZM2L48OHx6quvxooVK1LyTJ06Nfbff/8YNmxYdOzYsUzt7tKlS9SpU6dMZUSEVWYgT3Tq1CkaNmyYlr527dqYP39+zJgxo8h5ycqVK+N3v/tdrFixIq666qrKaCrlaJdddin2b2vWrIlFixbFzJkz08ajde66665YvHhxDB48uKKaCAAAQCV5/vnnI0mSlLRnn302dthhhypqEQAAAABQ3gRQAwAAABWua9eu8fbbb5e636xZs2LEiBExYsSIGDJkSHz00Udp+yxbtiwuvvjiGDFiRDzyyCNRq5bLG5XpoYceioceeqiqm0EOMv0elqdatWpF//7944wzzohDDjkk6tWrV+y+M2bMiEsvvTQee+yxlPRp06bFmWeeGUOHDi1TW1555ZXo0KFDmcoA8sf9998fffr0KfbvS5cujXfffTf++te/xquvvpr296uvvjq6d+8ehxxySAW2kvI2ZsyYUvdZvXp1fPbZZ/Hkk0/GnXfeGUuWLEn5+0MPPRSHHnpoHHvssRXUSiBf9enTJy1AB6qLa665Jq655pqqbgYAVKoRI0akbO+4446VFjw9ZcqUSqkHAAAAAH7qalR1AwAAAADWad26dRx++OFx3XXXxYcffhijRo2KU089NQoKCtL2feKJJ2LgwIFV0EqgNJtssklcfPHF8d1338Xzzz8fRx11VInB0xERbdu2jX/+85/xhz/8Ie1vb7/9djzzzDMV1VyANPXr149DDjkkXnnllbjvvvuiRo30/075v//7v1i7dm0VtI6KVKtWrdhll13ixhtvjPHjx0fHjh3T9vn9739fBS0DAACgPE2dOjVle9ttt62ilgAAAAAAFUUANQAAAFBt7bHHHvHoo4/GCy+8EJtuumna35944om49dZbq6BlQHEOOeSQ+Oabb+LWW2+NNm3aZJ3/97//fRx22GFp6Y888kh5NA8ga2eddVaRKzKOHz8+hg8fXvkNotJ07NgxnnzyybSH+XzxxRfx2WefVVGrAAAAKA8LFixI2W7QoEEVtQQAAAAAqCgCqAEAAIBq77DDDotRo0ZFy5Yt0/52xRVXxLffflsFrQKK0qNHj5wCpzd07bXXpqW9/vrrsXLlyjKVC5CrSy+9NFq3bp2W/tprr1VBa6hM3bt3j27duqWlf/LJJ1XQGgAAAMrL8uXLU7YLPzwLAAAAANj41arqBgAAAABkokOHDvHkk0/GQQcdFGvWrFmfvnz58vj9739f5tVpkySJ8ePHx9dffx2zZ8+OuXPnRoMGDaJly5bRoUOH6NatW9SqVX0vpSRJEt9++2188cUXMXXq1Fi4cGGsXLkymjZtGs2aNYtOnTrF7rvvXq2PIRcTJ06MiRMnxg8//BBz5syJunXrRsuWLWOLLbaIPffcM+rVq1fudU6bNi1GjRoV06dPjx9//DEaNGgQHTt2jG7dukW7du3Kvb6fot133z3atGkTM2fOXJ+2fPnymDFjRrRv374KW/bTsHLlypg0aVJ88cUXMXPmzFi4cGFERDRv3jyaN28eO+20U2y77bZV3MrsLF26ND766KOYOXNmzJ49O5YsWRKbbrpptGzZMnbdddfo2LFjhbd
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
2025-06-03 13:43:48 +00:00
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAnqCAYAAAAzIHOrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3XeYVNX9OP730qWDNEEUpAiKiArYaYoFERVUjFHBDsEak48lJpbEbozGXhCsMWJDERVUQGygqKAICApSBHGRJp1lfn/kJ1+H2V22Lwyv1/Ps8zDvueec97Rz7wz3fU9GIpFIBAAAAAAAAAAAAAAAAAAAQBooU9oJAAAAAAAAAAAAAAAAAAAAFBUF1AAAAAAAAAAAAAAAAAAAQNpQQA0AAAAAAAAAAAAAAAAAAKQNBdQAAAAAAAAAAAAAAAAAAEDaUEANAAAAAAAAAAAAAAAAAACkDQXUAAAAAAAAAAAAAAAAAABA2lBADQAAAAAAAAAAAAAAAAAApA0F1AAAAAAAAAAAAAAAAAAAQNpQQA0AAAAAAAAAAAAAAAAAAKQNBdQAAAAAAAAAAAAAAAAAAEDaUEANAAAAAAAAAAAAAAAAAACkDQXUAAAAAAAAAAAAAAAAAABA2lBADQAAAAAAAAAAAAAAAAAApA0F1AAAAAAAAAAAAAAAAAAAQNpQQA0AAAAAAAAAAAAAAAAAAKQNBdQAAAAAAAAAAAAAAAAAAEDaUEANAAAAAAAAAAAAAAAAAACkDQXUAAAAAAAAAAAAAAAAAABA2lBADQAAAAAAAAAAAAAAAAAApA0F1AAAAAAAAAAAAAAAAAAAQNpQQA0AAAAAAAAAAAAAAAAAAKQNBdQAAAAAAAAAAAAAAAAAAEDaUEANAAAAAAAAAAAAAAAAAACkDQXUAAAAAAAAAAAAAAAAAABA2lBADQAAAAAAAAAAAAAAAAAApA0F1AAAAAAAAAAAAAAAAAAAQNpQQA0AAAAAAAAAAAAAAAAAAKQNBdQAAAAAAAAAAAAAAAAAAEDaUEANAAAAAAAAAAAAAAAAAACkDQXUAAAAAAAAJWDs2LGRkZGR9Dd27NjSTgvIxZw5c1I+t0OHDi3ttIDtxMaNG+OFF16Ic889N9q2bRv16tWLChUqpMwry5Yt29zGvAN89dVXcdVVV0WXLl1i1113jSpVqqTMC3fffXdSmy5duiTd36VLlzyNVdB2pcn3KrYXQ4cOTXmvzpkzp7TTAgAAAIAdSrnSTgAAAAAASF/r16+PGTNmxLRp0yIzMzOWL18e5cuXj1q1akXdunXjgAMOiEaNGpV2mgAAAEXqgw8+iDPOOEOhFJBny5Yti/PPPz9eeOGF0k4FAAAAAADSggJqAAAAAEgTc+bMiaZNmxZL3zVq1EhaFS0nGzZsiLFjx8Y777wTY8aMic8++yw2btyYa5tdd901TjnllBg4cGC0aNGiwDl26dIlxo0bV+D2uXn55ZfjxBNPLJa+I/63elLXrl2TYv369bPSHBRC//7944knnkiKjRkzpkhWVMtuvpk9e3Y0adKk0H0DANu/MWPGxFFHHbXV70IAv1q9enV06tQpvvzyy9JOBQAAAAAA0kaZ0k4AAAAAANj+TZkyJc4999yoX79+HHXUUXHbbbfFxIkT81QwMH/+/PjXv/4Ve+65Z5x33nmxYsWKEsiY0pKRkZH0d/3115d2SsD/b+zYsSmf0bFjx5Z2WgD5Yi6jtK1ZsyZOP/30bL8L1a9fP9q0aRP77rtv0l/ZsmVLIVO2FUOHDk2Zt6xcXjDb8z7g6quvzrZ4unLlytGyZcuUeaNu3bqlkCUREddff33K+wwAAAAAgG2TFagBAAAAgEJ76aWX4vHHHy9UH4lEIgYPHhyjR4+O0aNHR8uWLYsoOwAAgJLx9NNPx6JFi5JiPXv2jLvuuitatGhRSlkB27Jly5bF4MGDk2INGjSIRx55JHr06OEiCwAAAAAAUEAKqAEAAAAgjVWpUiWaN29e6H6qVatWoHYVK1aMDh06xCGHHBINGzaMevXqRVZWVixcuDA+/PDDeOONN2LdunVJbebOnRvdunWL8ePHR9OmTQuVd+vWraNChQqF6iMiokaNGoXuAwAASH+vvPJK0u3GjRvHsGHDolKlSqWTELDNGz16dKxatSopNnjw4OjRo0cpZQQAAAAAAOlBATUAAAAApLH27dvH2LFjS3TMcuXKRY8ePeLss8+OY445JtdCgYULF8af//zneOaZZ5LiCxYsiHPOOSfGjBlTqFxGjhwZTZo0KVQfAEWlS5cukUgkSjsNIB+aNGnicwvky8SJE5Nun3DCCfkqnjbvwI5ny3mjRo0accwxx5TI2CX9mxEAAAAAAJSkMqWdAAAAAACQHnbaaae4/PLLY968eTF8+PA48cQTt1oosMsuu8TTTz8dN954Y8p9Y8eOjRdffLG40gUAAChSa9asiczMzKTYnnvuWUrZANuLuXPnJt1u3rx5lCnjlC4AAAAAACgsv7YDAAAAAIV2zDHHxHfffRd33XVXNGjQIN/t//rXv0bPnj1T4k8++WRRpAcAAFDsli9fnhKrUqVKKWQCbE+2nDvMGwAAAAAAUDQUUAMAAAAAhXbQQQcVqHD6t2644YaU2KhRo2L9+vWF6hcAAKAkrF27NiWWkZFRCpkA25Mt5w7zBgAAAAAAFI1ypZ0AAAAAAEBExP777x8NGjSIRYsWbY6tXbs2Fi5cGLvvvnspZrZjWL9+fcyaNSumT58eixYtihUrVkRERO3ataN27dqxzz77xJ577lnKWebP6tWrY8KECbFo0aL46aefYtWqVbHzzjtH3bp1o127dtG0adNiz2H58uXx8ccfx8yZM2P58uVRtWrVqFu3buy///7RqlWrYht35syZMW3atMjMzIzMzMzYtGlTVKtWLRo2bBitWrWKli1bRtmyZYttfIrfjz/+GJMnT47vv/8+VqxYEWvWrIlKlSpF5cqVo0GDBtGkSZNo2bJlVK1atbRTzdavn88ffvghfvrpp1i7dm3UrVs36tWrF/vtt1/suuuuxTLu4sWLN4+bmZkZlStXjt122y0OOOCAaNKkSbGMmZOsrKz44osv4uuvv44ff/wx1q5dG1WqVIm2bdvGEUcckaf23333XUyfPj0WLFgQK1asiKysrKhVq1bUqlUrWrVqFfvss0+UKVMy11P+8ssvY/LkybFo0aJYt25d1KpVK9q0aRMHHnhgVKxYMU99bNy4MSZNmhRfffVVZGZmRpkyZaJ+/frRrl27aNu2bTE/gtKxYcOGmDhxYnz99deRmZkZ5cuXj7p160bLli2jY8eOxT5Xf/fddzFp0qSYN29erFmzJurWrRuNGjWKgw8+OGrXrl2sY7N1GzZsiI8++ii+//77WLhwYURE1KlTJ/bee+9o3759ie/Lv/766/jiiy9i4cKFsX79+qhXr17suuuuceihhxbp/mbNmjUxderUmDZtWixdujRWrlwZZcuWjcqVK0etWrVi9913j2bNmkWjRo2KbEy2fcuWLYuJEyduPrbPysqKevXqRb169aJDhw5Rt27d0k5xu2MfQHHYlo63N23aFJ999ll8+eWXsXjx4sjIyIg6derEHnvsEYccckhUqFChRPPZls2bNy8mT54cmZmZsWTJkli3bl1Uq1Yt6tevH61atYpWrVoV+fP163fCGTNmxNKlS6NcuXLRoEGD6NixY75+f1qyZElMnDgxZs2aFStXrozq1avHLrvsEp07d446deoUac5ZWVnx8ccfx+zZs+OHH36IiIidd95587FZuXJOxQQAAACAbU4CAAAAAEgLs2fPTkRE0l/nzp1LO6186dChQ8pj+Pjjj/PUtnPnziltZ8+eXbwJF5ExY8ak5N6vX79iH/fzzz9PXHfddYlOnTolKlasmJLDln9169ZNnH322Ymvv/46z2Nk99jy+7f77rvnebwNGzYkHn300US3bt0SFSpUyLXfZs2aJa6++urEkiVL8v3c9evXL9ccP//880SfPn0S5cuXz/Vx3XvvvYn169fne/zsfPHFF4lzzjkn0bhx460+pzVr1kz
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAdlCAYAAACM+a77AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3XeUFFX6OO53yJJBkgGJBhQFERQUiSYwo6IfEwYMu+qucd1VV8xx1XXVdVVcMWfFHFBRUTChoGJAEERJAjLkPP37Y3/wpacndDcTYHyec+Yc6nbde9/urqpbXdRbNyeRSCQCAAAAAAAAAAAAAAAAAACgAqhU3gEAAAAAAAAAAAAAAAAAAACUFAnUAAAAAAAAAAAAAAAAAABAhSGBGgAAAAAAAAAAAAAAAAAAqDAkUAMAAAAAAAAAAAAAAAAAABWGBGoAAAAAAAAAAAAAAAAAAKDCkEANAAAAAAAAAAAAAAAAAABUGBKoAQAAAAAAAAAAAAAAAACACkMCNQAAAAAAAAAAAAAAAAAAUGFIoAYAAAAAAAAAAAAAAAAAACoMCdQAAAAAAAAAAAAAAAAAAECFIYEaAAAAAAAAAAAAAAAAAACoMCRQAwAAAAAAAAAAAAAAAAAAFYYEagAAAAAAAAAAAAAAAAAAoMKQQA0AAAAAAAAAAAAAAAAAAFQYEqgBAAAAAAAAAAAAAAAAAIAKQwI1AAAAAAAAAAAAAAAAAABQYUigBgAAAAAAAAAAAAAAAAAAKgwJ1AAAAAAAAAAAAAAAAAAAQIUhgRoAAAAAAAAAAAAAAAAAAKgwJFADAAAAAAAAAAAAAAAAAAAVhgRqAAAAAAAAAAAAAAAAAACgwpBADQAAAAAAAAAAAAAAAAAAVBgSqAEAAAAAAAAAAAAAAAAAgApDAjUAAAAAAAAAAAAAAAAAAFBhSKAGAAAAAAAAAAAAAAAAAAAqDAnUAAAAAAAAAAAAAAAAAABAhSGBGgAAAAAAAAAAAAAAAAAAqDAkUAMAAAAAAAAAAAAAAAAAABWGBGoAAAAAAAAAAAAAAAAAAKDCkEANAAAAAAD8LvTq1StycnLW/fXq1au8Q+J3aOrUqUnbYU5OTgwbNqy8w0pb/tivuOKK8g6JcvTuu++mbBPvvvtueYcFbCKWL18ew4YNi+OPPz7atWsXjRo1iipVqiQdU+rXr59Ux3EHGD16dJx33nmx5557xpZbbhmbbbZZynFh+PDhSXVatmyZ9PpJJ52UVl/Z1itPw4YNS/k8pk6dWt5hQYorrrgiZVsFAAAAgJJWpbwDAAAAAIBN1cqVK+P777+Pb7/9NubOnRsLFiyIqlWrRoMGDaJx48ax2267xVZbbVXeYQIAAMBGZfjw4XH66afHnDlzyjsUYBMxffr0OP744z00AQAAAACAtEmgBgAAAGCTMHXq1GjVqlWptF2vXr3Izc0tdr1Vq1bFu+++G2+//XaMHDkyPv/881i9enWRdbbeeus46qij4g9/+ENsu+22WcfYq1eveO+997KuX5Tnn38+DjvssFJpO+J/M4T17t07qWzQoEGb1GybsLE56aST4sEHH0xr3UqVKkWdOnWiXr160aRJk9h1112jc+fOccghh0SzZs1KOVJKUsuWLeOnn37KqE6tWrWibt260ahRo9h5551j1113jcMOOyzatm1bSlECABTt4YcfjhNPPLG8wwA2IbNnz47dd989ZsyYUd6hAAAAAACwCalU3gEAAAAAwMbuyy+/jFNPPTWaNm0a++23X9x4443xySefFJs8HRHxyy+/xG233Rbbb799DB48OBYuXFgGEVNecnJykv6uuOKK8g4JIi8vLxYsWBDTpk2Lzz77LO67774444wzonnz5nH44YfHV199Vd4hFmrYsGEp+9XUqVPLO6xNypIlS2LmzJnx1VdfxWOPPRYXXXRRbLvttrHXXnvFqFGjyjs8AMqYsZXyNn369DjzzDMLfG2rrbaKnXfeOTp06LDub+eddy7jCNnYXHHFFSnHLbKzKY8Bp59+eoHJ03Xr1o0ddtgh6bjRoUOHqFevXjlEScT/Hvi2/jbWsmXL8g4JAAAAAPgdMwM1AAAAABTjueeei//+978b1EYikYj7778/RowYESNGjIjtttuuhKIDyM7q1atj+PDh8eqrr8ZVV10VF198cXmHRBkaPXp09OjRI84+++y4/fbbo1Ilz9wFAErfv//971i6dGlS2SmnnBJXXXVVbLXVVuUUFbAxmzhxYrz00ktJZdttt10MHTo0unfvLqkeAAAAAIBCSaAGAAAAYJNVq1ataNu27Qa3U6dOnazqVa9ePbp06RJ77rlnbLnlltGkSZNYs2ZNzJw5M0aPHh2vvfZarFixIqnOtGnTok+fPjFq1Kho1arVBsXdrl27qFat2ga1ERFm5YEKok2bNlG7du2U8ry8vMjNzY2ZM2fG6tWrU15fuXJl/PWvf40VK1bE5ZdfXhahUoI6dOhQ6Gtr1qyJRYsWxaxZs1LGo7XuvPPOWLx4cTzwwAOlFSIAwDrDhw9PWt59991j6NChEiCBQr3wwguRSCSSyp577rnYaaedyikiAAAAAAA2FRKoAQAAANhkde7cOd59990y7bNKlSrRv3//OPnkk+OAAw6IGjVqFLruzJkz46KLLopHH300qXz69OlxyimnxMiRIzcolldffTVatmy5QW0AFcfQoUOjV69ehb6+dOnSeP/99+Nf//pXvPbaaymvDxkyJHbfffc44IADSjFKStq4ceOKXWf16tUxYcKEeOKJJ+KOO+6IJUuWJL0+bNiwOPDAA+PII48spSiBiqpXr14pCU0AhVm0aFF89913SWUDBw7MKHnacQd+fz755JOk5fbt25dZ8vTUqVPLpB8AAAAAAEpHpfIOAAAAAAA2BZtttlmcd9558fPPP8cLL7wQhx12WJHJ0xERW2yxRTzyyCNx1VVXpbz27rvvxrPPPlta4QKkqFmzZhxwwAHx6quvxn333ReVKqX+F8Ff/vKXyMvLK4foKE1VqlSJDh06xPXXXx9fffVVtGrVKmWdv//97+UQGQDwe/LLL7+knGtuv/325RQNsKmYNm1a0rLjBgAAAAAA6ZJADQAAAADFOOCAA+LHH3+MW2+9NZo1a5Zx/b///e9x0EEHpZQ/9NBDJREeQMYGDx4cV1xxRUr5V199FaNHjy77gCgzrVq1iieeeCJlpsfvvvsuJkyYUE5RAQC/BwsWLEgpq1WrVjlEAmxK8h87HDcAAAAAAEiXBGoAAAAAKEbXrl2zSpxe35VXXplS9uabb8bKlSs3qF2AbF100UXRtGnTlPI33nijHKKhLO2+++7RpUuXlPIvvviiHKIBAH4vli9fnlKW/6EuAPnlP3Y4bgAAAAAAkK4q5R0AAAAAAPwedOrUKZo1axazZs1aV7Z8+fKYOXNmtGjRohwj+31YuXJlTJo0Kb777ruYNWtWLFy4MCIiGjZsGA0bNoydd945tt9++3KOMjNLly6Njz/+OGbNmhVz5syJJUuWxOabbx6NGzeOjh07RqtWrUo9hgULFsRHH30UP/zwQyxYsCBq164djRs3jk6dOsUOO+xQav3+8MMP8e2338bcuXNj7ty5kZeXF3Xq1Iktt9wydthhh9huu+2icuXKpdZ/RVGjRo3o379/PPDAA0nln3/+eVr158+fH99991388MMPMX/+/Fi8eHHUrFkzGjZsGE2bNo3dd989GjZsWBqhl7o5c+bERx99FD/++GMsXrw46tWrF02aNIk99tijwhyzu3TpEp988klS2fpjVEn44YcfYvz48fHLL7/E4sWLo1q1atGsWbM48cQT024jNzc3Pv3005g9e3bMmTMnVqxYEY0aNYomTZpEly5dYosttijRmCvieFGcyZMnx/jx42P69OmxcOHCqFu3brRp0yb22GOP2HzzzUu9/5UrV8Ynn3wSv/zyS/z666/rxrMmTZrETjvtFNtuu22px7Cp+OGHH2Ls2LExffr0WLFiRWy++eax5ZZbRvfu3aNBgwblHV6pWLZsWXz00Ufx3Xffxfz582OzzTaLxo0bR/v
2025-06-03 13:43:48 +00:00
"text/plain": [
2025-06-06 08:24:47 +00:00
"<Figure size 4800x1500 with 1 Axes>"
2025-06-03 13:43:48 +00:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD2sAAAnqCAYAAACjMwpkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe4FNX9OP73pffeRGki2BEQULGAqNgQe4mxl6hRo6ZrjFhiieYTTTSKLcTYa+w9gh3BBooURRFBkN47d35/5Cdflr33sju3UV6v59nncQ97znnP3pkzZ9Z5zylIkiQJAAAAAAAAAAAAAAAAAAAA8lKlsgMAAAAAAAAAAAAAAAAAAADYGEnWBgAAAAAAAAAAAAAAAAAASEGyNgAAAAAAAAAAAAAAAAAAQAqStQEAAAAAAAAAAAAAAAAAAFKQrA0AAAAAAAAAAAAAAAAAAJCCZG0AAAAAAAAAAAAAAAAAAIAUJGsDAAAAAAAAAAAAAAAAAACkIFkbAAAAAAAAAAAAAAAAAAAgBcnaAAAAAAAAAAAAAAAAAAAAKUjWBgAAAAAAAAAAAAAAAAAASEGyNgAAAAAAAAAAAAAAAAAAQAqStQEAAAAAAAAAAAAAAAAAAFKQrA0AAAAAAAAAAAAAAAAAAJCCZG0AAAAAAAAAAAAAAAAAAIAUJGsDAAAAAAAAAAAAAAAAAACkIFkbAAAAAAAAAAAAAAAAAAAgBcnaAAAAAAAAAAAAAAAAAAAAKUjWBgAAAAAAAAAAAAAAAAAASEGyNgAAAAAAAAAAAAAAAAAAQAqStQEAAAAAAAAAAAAAAAAAAFKQrA0AAAAAAAAAAAAAAAAAAJCCZG0AAAAAAAAAAAAAAAAAAIAUJGsDAAAAAAAAAAAAAAAAAACkIFkbAAAAAAAAAAAAAAAAAAAgBcnaAAAAAAAAAAAAAAAAAAAAKUjWBgAAAAAAAAAAAAAAAAAASEGyNgAAAAAAAAAAAAAAAAAAQAqStQEAAAAAAAAAAAAAAAAAAFKQrA0AAAAAAAAAAAAAAAAAAJCCZG0AAAAAAMjRsGHDoqCgIOM1bNiwyg4LKMGkSZOyjtt//etflR0WAAB5Mq+Dzc8PP/wQN954YwwcODA6dOgQDRs2jCpVqmSMA0cccURGnSuvvDJrrMhF2nqVbd2Yr7zyysoOCbI4hwMAAACbg2qVHQAAAAAAG7YVK1bE+PHjY+zYsTFr1qyYP39+VK9ePRo3bhzNmzePXXfdNbbccsvKDhMAAAAAgE1AYWFhXHPNNXH99dfH8uXLKzscAAAAAID1kqwNAAAAsAGZNGlSdOjQoVzabtiwYcybN2+9n1u5cmUMGzYs/vvf/8bQoUPj448/jlWrVpVYZ6uttopjjz02zjvvvOjUqVPqGPv27Rtvvvlm6vol+c9//pO1ykpZGjZsWOy7774ZZaeeeqrVIaAUTjvttLjvvvsyyoYOHRp9+/YtddtFjTfffPNNtG/fvtRtAwAAAJDe2WefHf/85z8rOwwAAAAAgJxVqewAAAAAANgwjB49Os4888xo2bJl9O/fP/785z/HiBEj1puoHRExZcqUuPnmm2PbbbeNs846KxYsWFABEVNZCgoKMl5XXnllZYcE/P+GDRuWdYwOGzasssMCyIuxjM3NpEmTsvZ5D30CYHPknFi2Ntbf8P7zn/8UmahdtWrV2HrrraNLly6xyy67rHmV18NPWT/XbgAAAADw/1hZGwAAAICIiHjqqadKvVpJkiRx7733xmuvvRavvfZadO7cuYyiAwAAAABgU/eXv/wl4321atXixhtvjJ/97GdRt27dSooKAAAAAKBkkrUBAAAANnB169aNbbbZptTt1K9fP1W9mjVrRs+ePaN3797RunXraNGiRaxevTqmTZsW7733Xrz00kuxfPnyjDqTJ0+Ofv36xdtvv13qlU223377qFGjRqnaiIho2LBhqdsAAAAAAKB8zJw5M957772MsksuuSQuueSSSooIAAAAACA3krUBAAAANnA9evSIYcOGVWif1apVi0MOOSROP/30OOigg6JWrVrFfnbatGnxm9/8Jh588MGM8qlTp8YZZ5wRQ4cOLVUsL774YrRv375UbQCUlb59+0aSJJUdBpCH9u3bO24BAAA2AiNGjMgqO/744yuk7yuvvDKuvPLKCukLAAAAANj0VKnsAAAAAADYcNSuXTsuueSS+O677+KZZ56JI444osRE7YiILbbYIh544IG4+uqrs/5t2LBh8eSTT5ZXuAAAAAAAbCImT56cVbbttttWQiQAAAAAAPmRrA0AAABAREQcdNBB8fXXX8df//rXaNWqVd71//jHP8aAAQOyyv/973+XRXgAAAAAAGzC5s+fn1VWt27dSogEAAAAACA/krUBAAAAiIiI3XffPVWS9tquuuqqrLJXX301VqxYUap2AQAAAADYtC1btiyrrKCgoBIiAQAAAADIT7XKDgAAAACATUf37t2jVatWMX369DVly5Yti2nTpkW7du0qMbLNw4oVK+Krr76KcePGxfTp02PBggUREdGkSZNo0qRJ7LzzzrHttttWcpT5WbJkSXzwwQcxffr0mDlzZixevDiaNm0azZs3j65du0aHDh3KPYb58+fH8OHD48svv4z58+dHvXr1onnz5tG9e/fYbrvtyq3fL7/8MsaOHRuzZs2KWbNmRWFhYdSvXz9at24d2223XXTu3DmqVq1abv1T/n744YcYNWpUfPvtt7FgwYJYunRp1KpVK+rUqROtWrWK9u3bR+fOnaNevXqVHWqRfjw+v//++5g5c2YsW7YsmjdvHi1atIhu3brFVlttVS79zpgxY02/s2bNijp16kTbtm1j1113jfbt25dLn8VZvXp1fPrpp/HFF1/EDz/8EMuWLYu6detGly5dYr/99sup/tdffx3jxo2LqVOnxoIFC2L16tXRuHHjaNy4cWy33Xax8847R5UqFfPs3c8++yxGjRoV06dPj+XLl0fjxo1jp512it122y1q1qyZUxurVq2Kjz76KD7//POYNWtWVKlSJVq2bBldu3aNLl26lPMWVI6VK1fGiBEj4osvvohZs2ZF9erVo3nz5tG5c+fo1atXuY/VX3/9dXz00Ufx3XffxdKlS6N58+ax5ZZbxh577BFNmjQp177JTWWNl2tLkiQ+/fTTGD16dMyYMSNWr14dW2yxRbRt2zZ69+6d8zGerxUrVsTIkSNj6tSpMWPGjFiwYEE0btw4mjdvHjvssEPssMMO5dLv2pYsWRIjRoyIL7/8MubMmROrVq2Khg0bxr777hs77rjjeusvXbo0JkyYEOPGjYtZs2bFggULolq1atG4ceNo1qxZdO3atcLPP6WxYsWKGDFiREyZMiVmzJixZn7dokWL2HHHHaNTp04VEsfkyZPjk08+iW+//TYWLlwYVatWjZYtW8bxxx8fderUqZAYcvXj+X7SpEkxa9asmDNnTlSrVi0aNGgQ7du3j+233z7atm1bJn3NmzcvRowYseb6Z/Xq1dGiRYto0aJF9OzZM5o3b14m/ZSksLAwPv744/jss8/WxNC0adPYZZddokePHjmf15YtWxYjR46ML774IubMmRM1a9aMli1bRq9evcp9P/tx3B0/fnzMnTs3qlWrFq1atYpevXrldU08e/bsGDFiRHz11VexcOHCaNCgQWyxxRbRp0+faNasWZnFu6HNCb/88sv46KOPYurUqbF8+fJo2rRptG7dOvbaa69o3Lhxmff3+eefxxdffBHff/99LFmyJBo1ahSdO3eO3XffvVyvhb777rsYNWrUmu98+fLlUbt27ahbt260bt16zfVYrVq1yi2GtDaUsXxTMnv27Pjggw9i4sSJsWDBgmjYsGG0bt06dtlll+jYsWNlh8dGaunSpfHuu+/GlClTYvr06VG1atVo1apV7LzzzrHLLrtUeBJ6RY/vG6v58+fHyJEj44cffojZs2fHwoULo27dutGkSZPo3Llz7LDDDtGgQYMy7XNjnX9V1jkcAAAAYIOVAAAAALDB+Oabb5KIyHj16dOnssPKS8+ePbO2Yfjw4Tn
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
2025-06-06 08:24:47 +00:00
"<Figure size 4800x1500 with 1 Axes>"
2025-06-03 13:43:48 +00:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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AIBbkmEY2rp1q0aOHKmKFSuqf//+OnHihLubBSATc+bM0bfffquLFy9aLsMwDE2dOlV169bVwYMHXdg6ALAmOTlZc+fOVePGjTV+/Hh3Nwe5bN26dWrTpo2GDx+u1NRUdzcHAAAAAAAAOSglJUWffvqpTZq/v79mzJih2NhYHTp0SNu3b7d5jBgxwj2NBQAAAAAAgFO83N0AAAAAAACyo0iRIqpSpYrd/8XGxurSpUu6dOlSpivvJiUl6fvvv9evv/6qd999V88++2wOtRa4OWX2OXSGv7+/pXyFChVSWFiYWrRooTJlyig4OFgpKSmKiIjQunXrtGTJEl27ds0mz4kTJ9ShQwetWbNGFStWzFa7a9asqYIFC2arDEkqVqxYtssA4H6VK1eWn5+fKT01NVUxMTGKiIiwOy9JTEzUK6+8omvXrmn06NG50VS4UP369TP8X0pKimJjY3X27FnTeHTdl19+qbi4OE2bNi2nmggAAAAAAAA327p1q+nm0ePGjVP//v3d1CIAAAAAAAC4CsHaAAAAAIB8rXHjxlq5cmWW2507d07h4eEKDw/XsmXLtHHjRtM2CQkJeu655xQeHq7vvvtOXl6cNuem6dOna/r06e5uBixw9HPoSl5eXurevbseffRRde3aVT4+PhluGxERoREjRmjmzJk26adPn9agQYO0YsWKbLVl8eLFCg0NzVYZAG4eU6ZMUbt27TL8/5UrV7R69Wp9/vnnWrJkien/Y8aMUZMmTdS1a9ccbCVcbfv27Vluk5ycrD179mj27Nn64osvFB8fb/P/6dOn684779S9996bQ60EcLNq166dDMNwdzMAAAAAAFkIDw83pfXt2zdX6uZ3OAAAAAAAgJzl6e4GAAAAAACQG0JCQtSzZ0+9/fbb2rBhgzZv3qyHH35YHh4epm1nzZrFHeyBPKpw4cJ67rnndPLkSc2bN0933313poHaklS6dGn98MMPeuutt0z/W7lypX777becai4AmPj6+qpr165avHixJk+eLE9P89f0L730klJTU93QOuQkLy8v1a9fX++995527dqlihUrmrZ5/fXX3dAyAAAAAAAA5Ib0q2qXLFlSJUuWdFNrAAAAAAAA4EoEawMAAAAAbkmNGjXS999/r/nz59u9CGLWrFn6+OOP3dAyABnp2rWrjhw5oo8//lilSpVyOv/rr7+uHj16mNK/++47VzQPAJw2ePBgvfHGG6b0Xbt2ad26dbnfIOSaihUravbs2aYbB+3fv1979uxxU6sAAAAAAACQky5dumTzvEiRIm5qCQAAAAAAAFyNYG0AAAAAwC2tR48e2rx5s4KCgkz/GzVqlI4fP+6GVgGwp1mzZpaCtG/05ptvmtL+/PNPJSYmZqtcALBqxIgRCgkJMaUvXbrUDa1BbmrSpInCwsJM6du2bXNDawAAAAAAAJDTrl69avM8/Y38AAAAAAAAkH95ubsBAAAAAAC4W2hoqGbPnq077rhDKSkpaelXr17V66+/nu1Vdw3D0K5du/Tvv/8qMjJS0dHRKlKkiIKCghQaGqqwsDB5eeXdU3TDMHT8+HHt379fJ06c0OXLl5WYmKjixYurRIkSqly5sho2bJin98GKAwcO6MCBAzp//ryioqJUqFAhBQUFqXz58mratKl8fHxcXufp06e1efN
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD4UAAAnqCAYAAACKGDemAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe4FNX9OP73pYP0qiggYgULIigqIoKoWIgSxd41tsQ0Yz7GxK6JGkuisaJYE7tRLFFRVBQbKCCKBaUoAlKkd+78/vAHX/buLbt724Kv1/PsA3N2Ttmd2TNn5s57TkGSJEkAAAAAAAAAAAAAAAAAAACQl2pUdwMAAAAAAAAAAAAAAAAAAAAomaBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAAAAAAAAAAAAAACAPCYoHAAAAAAAAAAAAAAAAAAAII8JCgcAAAAAAAAAAAAAAAAAAMhjgsIBAAAAAAAAAAAAAAAAAADymKBwAAAAAADII1tuuWUUFBSse51yyinV3aSM9enTJ6Xtffr0qe4mUY1ef/31lP2hoKAgXn/99epuFgBUC+MkKpuxF/luQz7XBUq2YMGCuPXWW+Ooo46KbbbZJpo3bx41a9ZM+b137do1Jc99992XdsyaMmVKmXXlmq+66f/YUBT9fV122WXV3SQAAACgGLWquwEAAAAAG5OVK1fG559/HhMnTow5c+bEggULonbt2tGsWbNo1apV7LbbbrH55ptXdzMBAAAAAABydscdd8SFF14YixYtqu6mAAAAAMBPhqBwAAAAYIM1ZcqU6NixY6WU3aRJk5g/f36Z661atSpef/31ePXVV2PEiBHx4YcfxurVq0vNs8UWW8RRRx0V55xzTmyzzTY5t7FPnz7xxhtv5Jy/NE8//XQcfvjhlVJ2xI+zV+23334paSeffHLcd999lVYnbOxOOeWUuP/++7PKU7du3WjcuHE0a9Ystt9+++jatWsceOCBsddee1VSKwEoSzb9eY0aNaJhw4bRpEmTaNmyZey8887RrVu3OOSQQ6JTp06V3FKgqMsuuywuv/zyaql76NChZhwEAKDKXHnllXHJJZdUdzMAAAAA4CenRnU3AAAAAGBDNH78+Dj99NOjTZs2ccABB8S1114b77//fpkB4RER3377bdx0002x3XbbxRlnnBELFy6sghZTXQoKClJel112WXU3CdZZsWJFzJ49O7744ot49tln44orroi99947OnXqFPfee28kSVLdTQSgFIWFhbFw4cL45ptv4qOPPor7778/fv3rX8c222wTffr0iREjRlR3EwFgg7XlllumnM978AJUD9fW8o9tUnE21GPNmDFjit3uBQUF0b59+9h5551jl112Wffabrvtqr6RRMSPD1cu+pv1cF4AAACADZugcAAAAIAcPPXUU3HvvffGDz/8kHMZSZLEPffcEzvttFN88cUXFdg6gPL5+uuv4/TTT4999923XP0cANUjSZJ44403ol+/fnHOOedk9OAiAAAAyMSNN94YhYWFKWkXXXRRzJkzJ6ZOnRrjxo2LsWPHrns9+uij1dRSAAAAANj41KruBgAAAABUpE022SS23nrrcpfTqFGjnPLVrVs3evToEXvttVe0bds2WrduHWvWrIkZM2bEqFGj4sUXX4wVK1ak5Jk2bVr07ds3Ro4cGR07dixXu3fYYYeoU6dOucqIiGjSpEm5ywCqX6dOnaJhw4bFvpckSSxevDjmzJkTCxcuLHadkSNHRp8+fWLkyJHRuHHjymwqAKUoqT8vLCyM+fPnx6xZs2LlypVp7ydJEnfccUcsW7Yshg4dGgUFBVXRXPjJ2nTTTWOXXXbJKs+0adPSHsLTrl27aN68eVblZLs+AADkorCwMIYNG5aSdtRRR8U111xTTS0CAAAAgJ8WQeEAAADARqV79+7x+uuvV2mdtWrVioMPPjhOPfXUOOigg6JevXolrjtjxoz4wx/+EA8//HBK+vTp0+O0006LESNGlKstL7zwQmy55ZblKgPYeAwZMiT69OlT5npTp06NZ555Jm688caYOnVqynvjx4+PP/3pT3HrrbdWUisBKEtZ/fmKFSvigw8+iCFDhsSDDz6YNmPb/fffH717947TTjutklsKP21nn312nH322VnlOeWUU+L+++9PSbviiivilFNOqcCWkQ+q+loFAEBlmDhxYixatCgl7eijj66Suk855RTjZAAAAAB+8mpUdwMAAAAANlT169eP3/72t/HNN9/EM888E4cffnipAeEREZtttlk89NBDccUVV6S99/rrr8eTTz5ZWc0FKFGHDh3i/PPPj08//TQGDBiQ9v7tt98e3333XTW0DIBM1K1bN3r16hX33XdfvPzyy9GgQYO0dS699NJYvnx5NbQOAACAjcW0adPS0rbbbrtqaAkAAAAA/DQJCgcAAADIwUEHHRRff/113HjjjbHppptmnf8vf/lLHHrooWnpDzzwQEU0DyAnDRo0iEcffTStXyssLIynn366mloFQDb69esXt99+e1r6t99+GyNGjKiGFgEAALCxWLBgQVraJptsUg0tAQAAAICfJkHhAAAAADno2bNnTsHg67v88svT0l5++eVYuXJlucoFKI9GjRrFSSedlJb+0UcfVUNrAMjFCSecEFtvvXVa+ssvv1wNrQEAAGBjsXz58rS0goKCamgJAAAAAPw01aruBgAAAAD8VHXr1i023XTTmDlz5rq05cuXx4wZM6JDhw7V2LKfhpUrV8akSZPis88+i5kzZ8bChQsjIqJ58+bRvHnz2GmnnWK77bar5lZmZ+nSpfHee+/FzJkzY/bs2bFkyZJo0aJFtGrVKrp27RodO3as9DYsWLAg3n333fjyyy9jwYIF0bBhw2jVqlV069Yttt9++0qr98svv4yJEyfGnDlzYs6cOVFYWBiNGjWKtm3bxvbbbx/bbrtt1KxZs9Lq39j06NEjLW39vqoifP/99zF69OiYPHlyLFiwIAoKCqJly5ZxxBFHRMuWLTMqY+XKlfHBBx/E9OnT4/vvv4+FCxdGs2bNolWrVtG5c+fo3LlzhbY5SZKYOnVqfPbZZzFt2rRYuHBhrFy5Mpo2bRrNmjWLTp06Rbdu3aJWrY3n0vvcuXPj3XffjenTp8fs2bOjfv360b59+9htt92qpE9JkiQ+/vjj+PLLL2P27Nkxb968aNKkSbRu3To6duwY3bp1ixo1PP82ImL27Nnx7rvvxtdffx2LFy9e9z3tscceeT+uWL58ebz33nvx2WefxQ8//BC1a9eOtm3bxrbbbhvdunVzc3kOatSoEQceeGBMmjQpJf3TTz8td9mzZs2KDz/8MGbPnh3ff/99FBYWRqtWraJNmzbRs2fPaN68ebnrWGvNmjXx5ZdfxscffxyzZ8+OhQsXxpo1a6JBgwbRuHHjaNeuXXTs2DE6depUYX3B/Pnz4/333183nlqzZk20bt06WrduHT169IhWrVpVSD35bOn
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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gCpv1KhRkUgkksqeeeaZ6Nq1a44iAgAAAAAgFyRQAwAAAFAl9OrVK954441K7bNWrVpxxBFHxBlnnBEDBw6MevXqlbju3Llz49JLL41HH300qXz27NkxbNiwGDNmzGbF8tJLL8X222+/WW0A1ceIESOif//+Jf5+1apV8dZbb8Vf//rXePnll1N+P3z48OjTp08MHDiwAqOkvE2cOLHMddavXx+TJ0+OJ554Iu64445YuXJl0u8feOCBOPLII+OnP/1pBUUJVFf9+/dPSTQCANgSffDBB0nL3bp1q7Tk6RkzZlRKPwAAAAAAlK1GrgMAAAAAgMq21VZbxUUXXRSzZs2KUaNGxTHHHFNq8nRERNu2beORRx6J3//+9ym/e+ONN+Jf//pXRYULkKJ+/foxcODAeOmll+Lee++NGjVSv+7/zW9+E4WFhTmIjopUq1at6NGjR9x0003x6aefRseOHVPW+d3vfpeDyAAAAKqGmTNnJi137tw5R5EAAAAAAJBLEqgBAAAA+FEZOHBgfPPNN/GXv/wl2rRpk3H93/3ud3HUUUellD/00EPlER5Axs4666y45pprUso//fTTGDduXOUHRKXp2LFjPPHEE5GXl5dUPmXKlJg8eXKOogIAAMitpUuXJi03aNAgR5EAAAAAAJBLEqgBAAAA+FHZe++9s0qc3tS1116bUvbqq6/GunXrNqtdgGxdeuml0bp165TyV155JQfRUJn69OkTvXv3Tin/+OOPcxANAABA7q1ZsyZpuehLpwAAAAAA+HGolesAAAAAAGBL07Nnz2jTpk3MmzdvY9maNWti7ty50aFDhxxG9uOwbt26mDZtWkyZMiXmzZsXy5Yti4iI5s2bR/PmzaN79+7RuXPnHEeZmVWrVsX7778f8+bNi4ULF8bKlStj6623jpYtW8buu+8eHTt2rPAYli5dGu+991589dVXsXTp0mjYsGG0bNkyevbsGbvsskuF9fvVV1/FF198EYsWLYpFixZFYWFhNGrUKLbZZpvYZZddYuedd46aNWtWWP/VRb169eKII46IkSNHJpV/9NFHadVfsmRJTJkyJb766qtYsmRJrFixIurXrx/NmzeP1q1bR58+faJ58+YVEXqFW7hwYbz33nvxzTffxIoVK6JJkybRqlWr2GuvvarNNbt3797xwQcfJJVtOkaVh6+++iomTZoU3333XaxYsSLq1KkTbdq0iSFDhqTdRn5+fowfPz7mz58fCxcujLVr10aLFi2iVatW0bt372jbtm25xlwdx4uyfP311zFp0qSYPXt2LFu2LBo3bhydOnWKvfbaK7beeusK73/dunXxwQcfxHfffRcLFizYOJ61atUqunbtGjvttFOFx7Cl+Oqrr2LChAkxe/bsWLt2bWy99daxzTbbxP777x/NmjXLdXgVYvXq1fHee+/FlClTYsmSJbHVVltFy5Yto1u3btGjR48KT2z6/PPPY+LEiTF37txYt25dtGrVKrbddtvYb7/9omHDhhXaN5n75ptvYsKECTFr1qxYvXp1tGzZMtq1axf77LNPud+TrFixIqZMmRJTp06NxYsXx/Lly6Nu3brRrFmzaNWqVfTq1WuzX8KVrnXr1sWHH34YX375ZSxatCjWrl0bjRo1ir333jv22muvtNpYsGBBfPjhh7FgwYJ
2025-06-03 13:43:48 +00:00
"text/plain": [
2025-06-06 08:24:47 +00:00
"<Figure size 4800x1500 with 1 Axes>"
2025-06-03 13:43:48 +00:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAnqCAYAAAAzIHOrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xe4FNX9OP73pUsHKaIiICiC2AFREFBUxEIUjRoLWLAk6idqNLHFEnuKJZbEir1rxEYUFRVFpSiIDUVFlCYgl97Z3x/5wZe9u/fe3b2V6+v1PPs8zLlzyuzMnDM7zHtOXiKRSAQAAAAAAAAAAAAAAAAAAEAVUK2iGwAAAAAAAAAAAAAAAAAAAFBaBFADAAAAAAAAAAAAAAAAAABVhgBqAAAAAAAAAAAAAAAAAACgyhBADQAAAAAAAAAAAAAAAAAAVBkCqAEAAAAAAAAAAAAAAAAAgCpDADUAAAAAAAAAAAAAAAAAAFBlCKAGAAAAAAAAAAAAAAAAAACqDAHUAAAAAAAAAAAAAAAAAABAlSGAGgAAAAAAAAAAAAAAAAAAqDIEUAMAAAAAAAAAAAAAAAAAAFWGAGoAAAAAAAAAAAAAAAAAAKDKEEANAAAAAAAAAAAAAAAAAABUGQKoAQAAAAAAAAAAAAAAAACAKkMANQAAAAAAAAAAAAAAAAAAUGUIoAYAAAAAAAAAAAAAAAAAAKoMAdQAAAAAAAAAAAAAAAAAAECVIYAaAAAAAAAAAAAAAAAAAACoMgRQAwAAAAAAAAAAAAAAAAAAVYYAagAAAAAAAAAAAAAAAAAAoMoQQA0AAAAAAAAAAAAAAAAAAFQZAqgBAAAAAAAAAAAAAAAAAIAqQwA1AAAAAAAAAAAAAAAAAABQZQigBgAAAAAAAAAAAAAAAAAAqgwB1AAAAAAAAAAAAAAAAAAAQJUhgBoAAAAAAAAAAAAAAAAAAKgyBFADAAAAAAAAAAAAAAAAAABVhgBqAAAAAAAAAAAAAAAAAACgyhBADQAAAAAAAAAAAAAAAAAAVBkCqAEAAAAAAAAAAAAAAAAAgCpDADUAAAAAlcpJJ50UeXl5Gz5t27Yt03xVQdu2bZO2/aSTTqroJgFAsfr27Zs0fvXt27eim8Qv0LRp05KOw7y8vHjggQcqulkZK9j2K6+8sqKbRAV66623Uo6Jt956q6KbRRVj/KYye+CBB1L6wWnTplV0s4BSMGbMmDjvvPNi7733ji233DI222yzlPP9+eefT8qT6z3TTfFeq/6PTcWVV16ZcqwCAAAAlKUaFd0AAAAAAIDSsGrVqpgyZUp88cUXMW/evFi4cGHUrFkzmjRpEs2bN4899tgjttpqq4puJgAAAACQgRkzZsQJJ5zgpTAAAAAAQE4EUAMAAACbnGnTpkW7du0yWrd69epRp06dqFOnTmy++ebRokWLaNu2beywww6xyy67xN577x1NmzYt4xZD1ZPNeZitRo0aRX5+frHrrV69Ot5666144403YtSoUfHRRx/FmjVrisyz9dZbx69//ev47W9/G9ttt13Obezbt2+8/fbbOecvyn/+8584/PDDy6TsiP/NTLjvvvsmpQ0ZMmSTmm0TKpuTTjopHnzwwYzWrVatWjRo0CAaNWoULVq0iN122y26du0aAwcOjC222KKMW0ppatu2bXz//fdZ5alXr140bNgwmjVrFjvttFPstttucfjhh0eHDh3KqJUAAACbpjlz5kT37t1j5syZFd0UAAAAAGATVa2iGwAAAABQltauXRtLly6N+fPnx1dffRXvvvtuPPLII3HZZZfFYYcdFs2aNYs99tgjbrjhhpgxY0ZFNzdn06ZNi7y8vKSPYEiqqk8++SROPfXUaNmyZRx44IFx4403xtixY4sNno6I+PHHH+Pmm2+Ojh07xtChQ2PRokXl0GIqSsF+8corr6zoJkGsW7cuFi5cGNOnT4/x48fHPffcE2eccUa0bt06jjjiiJg8eXJFN7FQDzzwQMp5NW3atIpu1iZl6dKlMWvWrJg8eXI89thjceGFF8Z2220XPXv2jNGjR1d08wAoZ8ZWqByuvPLKlHORimWflJ5Neaw5/fTT0wZPN2zYcMMLUjf+NGrUqAJaScT/Xiy38THWtm3bim4SAAAAAESEAGoAAADgFy6RSMRHH30UF198cbRr1y4GDx4c06dPr+hmAUV47rnn4v77748FCxbkXEYikYj77rsvdtppp/jqq69KsXUAuVmzZk08//zz0bVr17jxxhsrujmUszFjxkTv3r3jnHPOiXXr1lV0cwAAACrUV199FS+++GJS2vbbbx/vvPNO5OfnxxdffBETJ05M+uy7774V1FoAAAAAoLKqUdENAAAAACgN9erViw4dOqT92+LFi2PhwoWxcOHCImeoXb16dTz88MPxzDPPxHXXXRfnnntuGbUWqqaizsNsNGjQIKd8tWvXjm7dusXee+8dW265ZbRo0SLWrl0bs2bNijFjxsSIESNi5cqVSXmmT58e++23X4wePTratWtXonZ36tQpatWqVaIyIsJsOVBFtG/fPurXr5+Svm7dusjPz49Zs2alvS5ZtWpVXHTRRbFy5cq4/PLLy6OplKJddtml0L+tXbs2Fi9eHLNnz04Zj9a7/fbbY8mSJTFs2LCyaiIAAEClN3z48EgkEklpzz33XOy4444V1CIAAAAAYFMkgBoAAACoErp27RpvvfVWsevNmTMnxo4dG2PHjo2RI0fGhx9+mLLO8uXL47zzzouxY8fGQw89FDVquIVSnh544IF44IEHKroZ5CDT87A01ahRIw4++OA4+eST46CDDoo6deoUuu6sWbPiwgsvjEcffTQpfcaMGXHKKafEqFGjStSWV155Jdq2bVuiMoCq4957742+ffsW+vdly5bFO++8E//85z9jxIgRKX+/4ooronv37nHQQQeVYSspbRMnTix2nTVr1sRnn30WTzzxRNx2222xdOnSpL8/8MADccghh8RRRx1VRq0Eqqq+ffumBBoBAGyKxo4dm7TcpUuXcguenjZtWrnUAwAAAACUvWoV3QAAAACA8tSyZcs47LDD4uqrr44PPvggxo8fHyeccELk5eWlrPv444/H4MGDK6CVQHE222yzOO+88+KHH36I4cOHx+GHH15k8HRERKtWreKRRx6Jv/zlLyl/e+utt+LZZ58tq+YCpKhbt24cdNBB8corr8Q999wT1aql/pfNH//4x1i3bl0FtI6yVKNGjdhll13i+uuvj8mTJ0e7du1S1vnzn/9cAS0DAACoHKZPn5603LFjxwpqCQAAAACwKRNADQAAAPyi7bHHHvHwww/HCy+8EJtvvnnK3x9//PG46aabKqBlQGEOOuig+Pbbb+Omm26KLbbYIuv8f/7zn+PQQw9NSX/ooYdKo3kAWRs6dGhceeWVKemTJ0+OMWPGlH+DKDft2rWLJ554IuVlPl9++WV89tlnFdQqAACAirVw4cKk5Xr16lVQSwAAAACATZkAagAAAICIOPTQQ2P8+PHRvHnzlL9deuml8f3331dAq4B0evTokVPg9MauuuqqlLTXXnstVq1aVaJyAXJ14YUXRsuWLVPSX3311QpoDeWpe/fu0a1bt5T0jz/+uAJaAwAAUPFWrFiRtFzwpVMAAAAAAJmoUdENAAAAAKgs2rZtG0888UQceOCBsXbt2g3pK1asiD//+c8lnp02kUjE5MmT45tvvom5c+fG/Pnzo169etG8efNo27ZtdOvWLWrUqLy3axKJRHz//ffx5ZdfxvTp02PRokWxatWqaNy4cTRp0iTat28fu+++e6XehlxMmTIlpkyZEj/99FPMmzcvateuHc2bN4/WrVvHnnvuGXXq1Cn1OmfMmBHjx4+PmTNnxs8//xz16tWLdu3aRbdu3WLLLbcs9fp+iXbffffYYostYvbs2RvSVqxYEbNmzYo2bdpUYMt+GVatWhVTp06NL7/8MmbPnh2LFi2KiIimTZtG06ZNY6eddoqOHTtWcCuzs2zZsvjwww9j9uzZMXfu3Fi6dGlsvvnm0bx589h1112jXbt2Zd6GhQsXxgc
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAdlCAYAAACM+a77AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3XeYVNX9OP73Lr0sTZooAgIKiqIIiIqCXREbtsQooGLURJNoYmyJqIlRYz5J7A0FY40aOxpFxQoIooCKqCgIUhSQ3tmd3x/5ydfZ2TIzu+yy6+v1PPM83LP3nPO+M7ecGe77npxEIpEIAAAAAAAAAAAAAAAAAACAaiC3sgMAAAAAAAAAAAAAAAAAAAAoLxKoAQAAAAAAAAAAAAAAAACAakMCNQAAAAAAAAAAAAAAAAAAUG1IoAYAAAAAAAAAAAAAAAAAAKoNCdQAAAAAAAAAAAAAAAAAAEC1IYEaAAAAAAAAAAAAAAAAAACoNiRQAwAAAAAAAAAAAAAAAAAA1YYEagAAAAAAAAAAAAAAAAAAoNqQQA0AAAAAAAAAAAAAAAAAAFQbEqgBAAAAAAAAAAAAAAAAAIBqQwI1AAAAAAAAAAAAAAAAAABQbUigBgAAAAAAAAAAAAAAAAAAqg0J1AAAAAAAAAAAAAAAAAAAQLUhgRoAAAAAAAAAAAAAAAAAAKg2JFADAAAAAAAAAAAAAAAAAADVhgRqAAAAAAAAAAAAAAAAAACg2pBADQAAAAAAAAAAAAAAAAAAVBsSqAEAAAAAAAAAAAAAAAAAgGpDAjUAAAAAAAAAAAAAAAAAAFBtSKAGAAAAAAAAAAAAAAAAAACqDQnUAAAAAAAAAAAAAAAAAABAtSGBGgAAAAAAAAAAAAAAAAAAqDYkUAMAAAAAAAAAAAAAAAAAANWGBGoAAAAAAAAAAAAAAAAAAKDakEANAAAAAAAAAAAAAAAAAABUGxKoAQAAAAAAAAAAAAAAAACAakMCNQAAAAAAAAAAAAAAAAAAUG1IoAYAAAAAAAAAAAAAAAAAAKoNCdQAAAAAAAAAAAAAAAAAAEC1IYEaAAAAAACoFP3794+cnJzNr/79+1d2SPwIzZ49O2k/zMnJiVGjRlV2WGkrHPtVV11V2SFRiV5//fWUfeL111+v7LCoZq666qqU/Qx+qKpfWwF+aNasWXH11VfH4YcfHjvssEPk5eWlnON+85vfJNUZOnRo0t/bt2+fVl/Z1qtMzvlUFb4rAQAAAPw41azsAAAAAACgvGzYsCE+/fTT+OSTT2Lx4sWxfPnyqFWrVjRt2jRatGgRe+21V2y33XaVHSYAAAAAsBVbv359XHjhhXHXXXdFQUFBZYcDAAAAAEAWJFADAAAAkJXZs2dHhw4dtkjbjRs3jmXLlpW63saNG+P111+PV199NcaOHRvvv/9+bNq0qcQ622+/fZx00klx3nnnRefOnbOOsX///vHGG29kXb8kTz31VBx33HFbpO2I/822ceCBByaVDRkyxOwwUAZDhw6N+++/P611c3NzIy8vLxo3bhwtW7aMPffcM3r27BnHHHNMtG7degtHSnlq3759fPXVVxnVadCgQTRq1CiaN28eu+22W+y5555x3HHHRadOnbZQlAAAAGSioKAgjj766BgzZkxlhwIAAAAAQBnkVnYAAAAAAJCpadOmxVlnnRWtWrWKww47LG644YaYOHFiqcnTERFff/11/OMf/4idd945hg0bFitWrKiAiKksOTk5Sa+rrrqqskOCKCgoiOXLl8ecOXPivffei3vuuSfOOeecaNu2bRx//PHx4YcfVnaIxRo1alTKcTV79uzKDqtKWb16dSxYsCA+/PDDePjhh+Piiy+Ozp07x3777RdvvfVWZYcHQAVzbYWtQ/v27ZOOw6FDh1Z2SFSS119/PeW8/Prrr1d2WFXS7NmzU97LqvLwvptuuqnI5OnatWtHp06donv37kmv7bbbrhKiJMJYCgAAAAAomQRqAAAAAKqcJ598Mu67775YunRp1m0kEom49957Y7fddovPPvusHKMDyM6mTZvi6aefjp49e8YNN9xQ2eFQwcaNGxcHHHBAXHDBBVFQUFDZ4QAAAPwo5efnxz//+c+ksry8vLj//vtj5cqV8fnnn8eUKVOSXhdffHHlBAsAAAAAQIlqVnYAAAAAAFQfDRo0iE6dOpW5nby8vKzq1alTJ3r16hX77rtvtGnTJlq2bBn5+fmxYMGCGDduXLz44ouxfv36pDpz5syJgw46KN56663o0KFDmeLu2rVr1K5du0xtREQ0bty4zG0Ala9jx47RsGHDlPKCgoJYtmxZLFiwIDZt2pTy9w0bNsSll14a69evjyuvvLIiQqUcde/evdi/5efnx8qVK2PhwoUp16Pv3XrrrbFq1aoYOXLklgoRAACAYrz//vsxZ86cpLLrr78+Bg8eXEkRAQAAAACQLQnUAAAAAJSbnj17xuuvv16hfdasWTMGDBgQZ5xxRhxxxBFRt27dYtddsGBBXHzxxfHQQw8llc+bNy/OPPPMGDt2bJlieeGFF6J9+/ZlagOoPkaMGBH9+/cv9u9r1qyJN998M26++eZ48cUXU/4+fPjw6N27dxxxxBFbMErK25QpU0pdZ9OmTfHxxx/Ho48+GrfcckusXr066e+jRo2Ko446Kk488cQtFCVQXfXv3z8SiURlh0E1d9VVV8VVV11V2WEAwBYxceLElLJTTjmlQvoeNWpUjBo1qkL6AgAAAAD4Mcit7AAAAAAAIBv16tWLCy+8MObOnRvPPPNMHHfccSUmT0dEbLvttvHggw/GNddck/K3119/Pf7zn/9sqXABUtSvXz+OOOKIeOGFF+Kee+6J3NzUn+x///vfR0FBQSVEx5ZUs2bN6N69e1x33XXx4YcfRocOHVLW+eMf/1gJkQEAAPy4FZ59eptttoltttmmkqIBAAAAAKAsJFADAAAAUOUcccQR8eWXX8bf//73aN26dcb1//jHP8bAgQNTyv/1r3+VR3gAGRs2bFiRMzl++OGHMW7cuIoPiArToUOHePTRRyMnJyepfMaMGfHxxx9XUlQAAAA/TsuXL09abtCgQSVFAgAAAABAWUmgBgAAAKDK6dOnT1aJ0z909dVXp5S9/PLLsWHDhjK1C5Ctiy++OFq1apVS/tJLL1VCNFSk3r17R69evVLKP/jgg0qIBgAA4Mdr3bp1ScuFH3YFAAAAAEDVUbOyAwAAAACAytCjR49o3bp1LFy4cHPZunXrYsGCBdGuXbtKjOzHYcOGDTFz5syYMWNGLFy4MFasWBEREc2aNYtmzZrFbrvtFjvvvHMlR5mZNWvWxLvvvhsLFy6MRYsWxerVq2ObbbaJFi1axB577BEdOnTY4jEsX748JkyYEJ9//nksX748GjZsGC1atIgePXpEly5dtli/n3/+eXzyySexePHiWLx4cRQUFEReXl60adMmunTpEjvttFPUqFFji/VfXdStWzcGDBgQI0eOTCp///3306q/dOnSmDFjRnz++eexdOnSWLVqVdSvXz+aNWsWrVq1it69e0ezZs22ROhb3KJFi2LChAnx5ZdfxqpVq6Jx48bRsmXL2HvvvavNObtXr14xceLEpLIfXqPKw+effx5Tp06Nr7/+OlatWhW1a9eO1q1bx+DBg9NuY9myZTFp0qT45ptvYtGiRbF+/fpo3rx5tGzZMnr16hXbbrttucZcHa8Xpfniiy9i6tSpMW/evFixYkU0atQoOnbsGHvvvXdss802W7z/DRs2xMSJE+Prr7+Ob7/9dvP1rGXLlrHrrrtG586dt3gMVcXnn38ekydPjnnz5sX69etjm222iTZt2kTfvn2jadOmlR3eFrF27dqYMGFCzJgxI5YuXRr16tWLFi1aRLdu3aJ79+5bPMFo+vTpMWXKlFiwYEFs2LAhWrZsGdtvv33st99+0bBhwy3aNxVnzpw58d5778VXX30Vq1evjry8vOjUqVPsu+++GR1bn3zySXzwwQdJ+0vHjh2jb9++UbOmWyUy9dFHH8X06dNj/vz5sWbNmmjSpEnstNNO0adPny1
2025-06-03 13:43:48 +00:00
"text/plain": [
2025-06-06 08:24:47 +00:00
"<Figure size 4800x1500 with 1 Axes>"
2025-06-03 13:43:48 +00:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAnqCAYAAAAzIHOrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3XeYVNX9OP73Lh2kV1EERBQsKAoEK4hdERVrjBU1atREkxg1Gnss0U+M0dgVe2JX7IoBxIIiFhTpgghK773d3x/5wZfZ2TIzu+zi8no9zzwPc/aecmfuPffM5b7PyUuSJAkAAAAAAAAAAAAAAAAAAIBKIL+iGwAAAAAAAAAAAAAAAAAAAFBWBFADAAAAAAAAAAAAAAAAAACVhgBqAAAAAAAAAAAAAAAAAACg0hBADQAAAAAAAAAAAAAAAAAAVBoCqAEAAAAAAAAAAAAAAAAAgEpDADUAAAAAAAAAAAAAAAAAAFBpCKAGAAAAAAAAAAAAAAAAAAAqDQHUAAAAAAAAAAAAAAAAAABApSGAGgAAAAAAAAAAAAAAAAAAqDQEUAMAAAAAAAAAAAAAAAAAAJWGAGoAAAAAAAAAAAAAAAAAAKDSEEANAAAAAAAAAAAAAAAAAABUGgKoAQAAAAAAAAAAAAAAAACASkMANQAAAAAAAAAAAAAAAAAAUGkIoAYAAAAAAAAAAAAAAAAAACoNAdQAAAAAAAAAAAAAAAAAAEClIYAaAAAAAAAAAAAAAAAAAACoNARQAwAAAAAAAAAAAAAAAAAAlYYAagAAAAAAAAAAAAAAAAAAoNIQQA0AAAAAAAAAAAAAAAAAAFQaAqgBAAAAAAAAAAAAAAAAAIBKQwA1AAAAAAAAAAAAAAAAAABQaQigBgAAAAAAAAAAAAAAAAAAKg0B1AAAAAAAAAAAAAAAAAAAQKUhgBoAAAAAAAAAAAAAAAAAAKg0BFADAAAAAAAAAAAAAAAAAACVhgBqAAAAAAAAAAAAAAAAAACg0hBADQAAAAAAAAAAAAAAAAAAVBoCqAEAAAAAAAAAAAAAAAAAgEpDADUAAAAAAGRo8ODBkZeXl/IaPHhwRTcLKMbkyZPTzttHH320opsFAAAAUKiePXum3Mfo2bNnRTcJAAAA4GepakU3AAAAAIBN28qVK2Ps2LExevTomD17dixYsCCqVasWDRs2jKZNm8Yee+wRW221VUU3EwAAAAAAAAAAAAAiQgA1AAAAwCZl8uTJ0bZt241Sdv369WP+/Pklbrdq1aoYPHhwvPfeezFo0KD4/PPPY/Xq1cXm2XrrreP444+P888/P9q3b59zG3v27BlDhgzJOX9xXnrppTj66KM3StkR/1uVdv/9909JO/30061wCaVwxhlnxGOPPZaSNmjQoDJZcaWw/mbSpEnRpk2bUpcNAAAAAAAAAABAxcqv6AYAAAAAsGkYOXJknHXWWdG8efM4+OCD49Zbb41PP/20xODpiIipU6fGHXfcETvssEOcffbZsXDhwnJoMRUlLy8v5XXttddWdJOA/9/gwYPTztHBgwdXdLMAsqIvA+DnyPWr7EyePDntszRBHQAAAAAAkC0B1AAAAABERMSLL74YjzzySMybNy/nMpIkiYcffjh22WWXGDduXBm2DgAAAAAAAAAAAAAyU7WiGwAAAABA8erUqRPbbbddqcupW7duTvlq1KgRXbt2jb322itatmwZzZo1izVr1sRPP/0UH330Ubz55puxYsWKlDxTpkyJXr16xdChQ6Nt27alanfHjh2jevXqpSojIqJ+/fqlLgMAAAAAAAAAAACATZ8AagAAAIBNXJcuXWLw4MHlWmfVqlXj8MMPjzPPPDMOPfTQqFmzZpHb/vTTT3HppZfGU089lZI+bdq06NevXwwaNKhUbXnjjTeiTZs2pSoDoKz07NkzkiSp6GYAWWjTpo3zFgAAAAAAAABgM5Nf0Q0AAAAAYNNRq1atuOSSS+KHH36IV155JY4++uhig6cjIrbccst48skn4/rrr0/72+DBg+OFF17YWM0FAAAAAAAAAAAAgDQCqAEAAACIiIhDDz00vvvuu/j73/8eLVq0yDr/X/7yl+jdu3da+uOPP14WzQMAAAAAAAAAAACAjAigBgAAACAiIrp3755T4PSGrrvuurS0d955J1auXFmqcgEAAAAAAAAAAAAgU1UrugEAAAAAVB677757tGjRIqZPn74+bfny5fHTTz9F69atK7Blm4eVK1fGhAkTYsyYMTF9+vRYuHBhREQ0atQoGjVqFLvsskvssMMOFdzK7CxdujQ++eSTmD59esyaNSuWLFkSjRs3jqZNm8Zuu+0Wbdu23ehtWLBgQQwbNizGjx8fCxYsiC222CKaNm0au+++e3To0GGj1Tt+/PgYPXp0zJ49O2bPnh1r166NunXrRsuWLaNDhw6x/fbbR5UqVTZa/Wx8M2bMiK+++iq+//77WLhwYSxbtixq1qwZtWvXjhYtWkSbNm1i++23jy222KKim1qodefnjz/+GLNmzYrly5dH06ZNo1mzZtG5c+fYeuutN0q9M2fOXF/v7Nmzo3bt2rHNNtvEHnvsEW3atNkodRZlzZo18eWXX8a3334bM2bMiOXLl0edOnWiU6dOccABB2SU/7vvvosxY8bEtGnTYuHChbFmzZpo2LBhNGzYMDp06BC77LJL5OeXz3y4X3/9dXz11Vcxffr0WLFiRTRs2DB23nnn+MUvfhE1atTIqIzVq1fHiBEj4ptvvonZs2dHfn5+NG/ePHbbbbfo1KnTRt6DirFq1ar49NNP49tvv43Zs2dHtWrVomnTprH99ttHt27dNnpf/d1338WIESPihx9+iGXLlkXTpk1jq622ij333DMaNWq0UesmcwsWLIjhw4fHjBkzYs6cObFo0aKoU6dONGrUKLbffvvYcccdo169eqWqY968eTFmzJgYP358zJs3LxYvXhy1a9eORo0aRfPmzaNbt27ldkwUHD/VrFlz/XGZze+CH3/8MYYPHx6TJ0+OxYsXR6NGjWLrrbeOHj16lPrzKsqUKVNi5MiRMWvWrJg1a1ZUqVIlmjRpEi1btow999yzXK7L48ePj6+++iqmTp0aixcvjurVq0eLFi3itNNOyyj/tGnTYsyYMTF58uRYsGBBLFu2LOrVqxeNGjWKbbbZJrp27Ro1a9bcyHtRfmbOnBmfffZZTJo0KRYsWBB5eXnRpEmTOOaYY6JJkyYl5t+Uzp3NQUWNISuzdX3lpEmTYsmSJdGoUaNo2bJldO3aNVq2bFnRzeP/t3Tp0hg+fHj89NNPMXv27FiwYEHUqlUrGjRoEO3bt48dd9wxGjduXKo6Fi9eHGPGjIlx48atH2/UqFEjGjZsGM2aNYsuXbqUevLETK0718eOHRvz5s2LqlWrRosWLaJbt25Z3ZuaM2dOfPrppzFhwoRYtGhR1KtXL7bccsvo0aNHRn18LmbMmBGff/55zJo1K2bOnBlr166Npk2bRvPmzaN79+7lck2YMmVKfPHFF/H999/HokWLokqVKtG8efM48cQTo3bt2iXmnzlzZowZMyYmTpwY8+fPjyVLlkTdunWjUaNGsdVWW0W3bt022XsNuVh3n2DSpEmxaNGiqF27drRu3Tr22muvrI75SZMmxWeffRZTp06NZcuWRZMmTaJ169bRo0ePMh07LVu2LMaNGxdjxoyJ2bNnx8KFC6Nq1arRsGHDaNKkSey2227ldn9j+fLl8cknn8SYMWNi3rx5Ua1atWjZsmVsv/32sfvuu0deXt5GrX/OnDnxySefxMSJE2PhwoVRv379aNmyZey6667Rrl27jVZvRYz558yZE8OGDYtp06bFrFmzolatWuvvZ5XHPW4AAACAzVYCAAAAwCZj0qRJSUSkvHr06FHRzcpK165d0/Zh2LBhGeXt0aNHWt5JkyZt3AaXkUGDBqW1/fTTT9/o9X7xxRfJNddck+y3335JjRo10tpQ8NW0adPkzDPPTL799tuM6yhs37J9tW7dOuP6Vq1alTz44INJr169kurVqxdbbrt27ZIrrrgimTNnTtaf3emnn15
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAD1AAAAcbCAYAAAC90cJKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAuIwAALiMBeKU/dgABAABJREFUeJzs3Xd8FNX+//F3GoSQQkLovYMUld470gQBC1ZARLFerwUVURAVBcu1oVwBQa69A1JEEJDeQu+d0EkCqYTU+f3hj3yzO7ub3U3ZsLyej8c+dE7mlNmdmXNmmM8cH8MwDAEAAAAAAAAAAAAAAAAAAAAAAAAAAACAF/D1dAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoKAQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAAAAAAAAAAAAAAAAAAAAMBrEEANAAAAAAAAAAAAAAAAAAAAAAAAAAAAwGsQQA0AAAAAAAAAAAAAAAAAAAAAAAAAAADAaxBADQAAAAAAAAC4ZnTt2lU+Pj45n65du3q6SbgOHT9+3GI/9PHx0ZdffunpZjnNuu2vvfaap5sED1q5cqVpn1i5cqWnmwUAAAAAAGBTzZo1Le5jjBgxwtNNAgAAAAAAxZS/pxsAAAAAAADgSenp6Tpw4ID27dun2NhYJSQkKCAgQOHh4SpXrpxatGihKlWqeLqZAAAAAAAAAAAAAAAAAAAAAJxEADUAAAAAACgyx48fV61atQql7LCwMMXHx+e5XkZGhlauXKm//vpLK1as0NatW5WZmekwT9WqVXXnnXfqscceU7169dxuY9euXfX333+7nd+R3377TYMGDSqUsqV/Zibs1q2bRdrw4cOvqdk2geJmxIgRmjNnjlPr+vr6KiQkRGFhYSpfvrxuvvlmtWzZUgMHDlTFihULuaUoSDVr1tSJEydcylO6dGmFhoYqMjJSTZs21c0336xBgwapbt26hdRKAAAAAAAAAAAAAAAAALi2+Xq6AQAAAAAAAEVh586deuihh1ShQgXdcsstmjJlijZt2pRn8LQknTp1Sh988IEaNGigUaNGKTExsQhaDE/x8fGx+Lz22muebhKg7OxsJSQkKDo6Wlu2bNGMGTM0evRoVatWTYMHD9auXbs83US7vvzyS9Nxdfz4cU8365qSkpKis2fPateuXfr22281ZswY1atXTx06dNDq1as93TwAQBGjbwUAXIvovwrOypUrTd/lypUrPd0sAAAAAAAAAACKHQKoAQAAAADAdeHXX3/VrFmzdOnSJbfLMAxDX3zxhZo2baqDBw8WYOsAwD2ZmZmaO3euWrZsqSlTpni6OShi69atU+fOnfXUU08pOzvb080BAAAAAAAAAAAAAAAAgGLD39MNAAAAAAAA17fSpUurbt26+S4nJCTErXwlS5ZUq1at1L59e1WuXFnly5dXVlaWzp49q3Xr1mnx4sVKS0uzyBMdHa3u3btr9erVqlWrVr7a3ahRI5UoUSJfZUhSWFhYvssA4Hl16tRRcHCwKT07O1vx8fE6e/asMjMzTX9PT0/XSy+9pLS0NI0fP74omooCdOONN9r9W1ZWlpKSknTu3DlTf3TV1KlTlZycrNmzZxdWEwEAAAAAAAAAAAAAAADgmkIANQAAAAAA8KiWLVtq5cqVRVqnv7+/+vXrpwcffFB9+vRRYGCg3XXPnj2rMWPG6JtvvrFIP336tEaOHKkVK1bkqy2LFi1SzZo181UGAO8xc+ZMde3a1e7fL1++rFWrVunjjz/W4sWLTX+fMGGCWrdurT59+hRiK1HQtm/fnuc6mZmZ2rNnj77//nt98sknSklJsfj7l19+qf79++uOO+4opFYC8FZdu3aVYRiebgYAAAAAAAAAAAAAAECB8vV0AwAAAAAAAIpKqVKl9Mwzz+jkyZOaN2+eBg0a5DB4WpIqVaqkr7/+Wq+//rrpbytXrtQvv/xSWM0FAJOgoCD16dNHixYt0owZM+Tra77F+8ILLyg7O9sDrUNh8vf314033qi3335bu3btUq1atUzrvPrqqx5oGQAAAAAAAAAAAAAAAAAUPwRQAwAAAACA60KfPn109OhR/ec//1HFihVdzv/qq6/q1ltvNaX/73//K4jmAYDLRo0apddee82UvmvXLq1bt67oG4QiU6tWLX3//ffy8fGxSN+/f7/27NnjoVYBAAAAAAAAAAAAAAAAQPFBADUAAAAAALgutG3b1q3A6dwmTpxoSvvzzz+Vnp6er3IBwF1jxoxRhQoVTOlLlizxQGtQlFq3bq1WrVqZ0rdt2+aB1gAAAAAAAAAAAAAAAABA8eLv6QYAAAAAAABcK5o3b66KFSvq3LlzOWlXrlzR2bNnVaNGDQ+27PqQnp6uw4cPa//+/Tp37pwSExMlSREREYqIiFDTpk3VoEEDD7fSNZcvX9bGjRt17tw5xcTEKCUlRWXLllW5cuV00003qVatWoXehoSEBG3YsEGHDh1SQkKCgoODVa5cOTVv3lwNGzYstHoPHTqkffv2KTY2VrGxscrOzlZISIgqV66shg0bqn79+vLz8yu0+r1FYGCg+vXrp9mzZ1ukb9261an8ly5d0v79+3Xo0CFdunRJycnJCgoKUkREhCpUqKDWrVsrIiKiMJpe6GJiYrRhwwYdPXpUycnJCgsLU/ny5dWmTRuvOWe3atVKmzZtskjL3UcVhEOHDmnHjh06deqUkpOTVaJECVWsWFHDhg1zuoz4+Hht3rxZ58+fV0xMjNLS0hQZGany5curVatWqlSpUoG22Rv7i7wcOXJEO3bs0OnTp5WYmKjQ0FDVqVNHbdq0UdmyZQu9/vT0dG3atEmnTp3ShQsXcvqz8uXLq3HjxqpXr16ht+FacejQIUVFRen06dNKS0tT2bJlVblyZXXs2FHh4eGebl6hSE1N1YYNG7R//35dunRJpUqVUrly5dSkSRPdeOON8vHxKdT69+7dq+3bt+vs2bNKT09X+fLlVbVqVXXo0EHBwcGFWjecFxMTo6ioKMXExCg2NlaXL19WSEiIIiMj1aBBAzVq1EhBQUH5quPChQvav3+/jhw5ovj4eKWkpCgkJEQRERGqUqWKWrduXWT7xIULF7Rx40YdO3ZMSUlJCgoKUo0aNdS+fXuXXvx17NgxbdmyRadOnVJqaqoiIyNVo0YNdenSRYGBgYXS9gMHDujAgQO6cOGCYmNjVbJkSZUrV07VqlVTmzZtCq3
2025-06-03 13:43:48 +00:00
"text/plain": [
2025-06-06 08:24:47 +00:00
"<Figure size 4800x1500 with 1 Axes>"
2025-06-03 13:43:48 +00:00
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2025-06-06 08:24:47 +00:00
"image/png": "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
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 4800x1500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
2025-06-03 13:43:48 +00:00
"text/plain": [
"<Figure size 4800x2700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2025-06-06 08:24:47 +00:00
"import matplotlib.patches as mpatches\n",
"\n",
"from message_tree.message_tree_algorithms import e2e_latency_breakdown, label_latency_item\n",
"from message_tree.message_tree_plots import e2e_breakdown_stack\n",
2025-06-03 13:43:48 +00:00
"\n",
"##################################################\n",
2025-06-06 08:24:47 +00:00
"# 1. Filter DFG paths through must-be-included and cannot-be-included patterns\n",
"##################################################\n",
"\n",
2025-06-06 08:24:47 +00:00
"cohorts_filt = {\n",
" k: v for k, v in cohorts.items()\n",
" if all(re.search(f.removeprefix(\"^\").removesuffix(\"$\"), k) for f in E2E_INCL_PATH_PATTERNS)\n",
"}\n",
"\n",
2025-06-06 08:24:47 +00:00
"##################################################\n",
"# 2. Iterate through filtered DFG paths\n",
"##################################################\n",
"\n",
2025-06-06 08:24:47 +00:00
"for relevant_path, relevant_dataflows in cohorts_filt.items():\n",
" # Construct a filesystem-safe name for output files\n",
2025-06-03 13:43:48 +00:00
" topics = [topic for topic in relevant_path.split(\" -> \") if topic.startswith(\"/\") and not topic.startswith(\"/void\")]\n",
2025-06-06 08:24:47 +00:00
" name = f\"{topics[0][1:]}-{topics[-1][1:]}\"\n",
2025-06-03 13:43:48 +00:00
" name = name.replace(\"/\", \"_\").replace(\" \", \"_\").replace(\":\", \"_\")\n",
"\n",
2025-06-06 08:24:47 +00:00
" # Break down E2E latency for all dataflows on this path\n",
2025-06-03 13:43:48 +00:00
" e2e_breakdowns = list(map(e2e_latency_breakdown, relevant_dataflows))\n",
2025-06-06 08:24:47 +00:00
" flattened_breakdowns = [item for breakdown in e2e_breakdowns for item in breakdown]\n",
2025-06-03 13:43:48 +00:00
"\n",
2025-06-06 08:24:47 +00:00
" # Save information about the chosen path\n",
2025-06-03 13:43:48 +00:00
" with open(os.path.join(OUT_PATH, f\"plot_e2es_path_{name}.txt\"), \"w\") as f:\n",
" f.write(f\"Number of path instances: {len(relevant_dataflows)}\\n\")\n",
2025-06-06 08:24:47 +00:00
" f.write(\" \" + \"\\n -> \".join(relevant_path.split(\" -> \")))\n",
2025-06-03 13:43:48 +00:00
" f.write(\"\\n\")\n",
"\n",
2025-06-06 08:24:47 +00:00
" # Unique items for deduplicated analysis\n",
" conv_items_unique = set(flattened_breakdowns)\n",
2025-06-03 13:43:48 +00:00
"\n",
2025-06-06 08:24:47 +00:00
" ##################################################\n",
" # 3. Plot histograms of DDS/idle/cpu time breakdowns\n",
" ##################################################\n",
" def e2e_breakdown_type_hist(items):\n",
2025-06-03 13:43:48 +00:00
" \"\"\"\n",
2025-06-06 08:24:47 +00:00
" For all e2e breakdown items (unique) of the form `(\"<type>\", <duration>)`, plots a histogram for each encountered type (dds, idle, cpu).\n",
2025-06-03 13:43:48 +00:00
" \"\"\"\n",
" plot_types = (\"dds\", \"idle\", \"cpu\")\n",
" plt.close(f\"E2E type breakdown histograms {name}\")\n",
" fig, axes = plt.subplots(1, 3, num=f\"E2E type breakdown histograms {name}\", dpi=300, figsize=(16, 9))\n",
" fig.suptitle(f\"E2E Latency Breakdown by Resource Type {name}\")\n",
"\n",
2025-06-06 08:24:47 +00:00
" for plot_type, ax in zip(plot_types, axes):\n",
" durations = [item.duration * 1000 for item in items if item.type == plot_type]\n",
2025-06-03 13:43:48 +00:00
" df = pd.Series(durations)\n",
2025-06-06 08:24:47 +00:00
" df.to_csv(\n",
" os.path.join(OUT_PATH, f\"plot_e2es_{plot_type}_portion_{name}.csv\"),\n",
" header=[f\"e2e_latency_{plot_type}_portion_ms\"],\n",
" index=False\n",
" )\n",
" ax.set_title(plot_type)\n",
2025-06-03 13:43:48 +00:00
" ax.hist(durations, bins=50)\n",
2025-06-06 08:24:47 +00:00
" ax.set_xlabel(\"Duration [ms]\")\n",
2025-06-03 13:43:48 +00:00
" ax.set_ylabel(\"Occurrences\")\n",
" return fig\n",
"\n",
2025-06-06 08:24:47 +00:00
" fig = e2e_breakdown_type_hist(conv_items_unique)\n",
2025-06-03 13:43:48 +00:00
" plt.savefig(os.path.join(OUT_PATH, f\"plot_e2e_portions_{name}.png\"))\n",
"\n",
2025-06-03 13:43:48 +00:00
" ##################################################\n",
2025-06-06 08:24:47 +00:00
" # 4. Plot histogram of all E2E latencies observed\n",
2025-06-03 13:43:48 +00:00
" ##################################################\n",
2025-06-06 08:24:47 +00:00
" e2e_latencies = [(path[-1].timestamp - path[0].timestamp) * 1000 for path in relevant_dataflows]\n",
" pd.Series(e2e_latencies).to_csv(\n",
" os.path.join(OUT_PATH, f\"plot_e2es_{name}.csv\"),\n",
" index=False, header=[\"e2e_latency_ms\"]\n",
" )\n",
"\n",
" plt.close(f\"E2E histogram {name}\")\n",
" fig, ax = plt.subplots(num=f\"E2E histogram {name}\", dpi=300, figsize=(16, 9))\n",
" fig.suptitle(f\"E2E Latency Histogram {name}\")\n",
" ax.hist(e2e_latencies, bins=30)\n",
" ax.set_xlabel(\"E2E Latency [ms]\")\n",
2025-06-03 13:43:48 +00:00
" ax.set_ylabel(\"Occurrences\")\n",
2025-06-06 08:24:47 +00:00
" mean_latency = np.mean(e2e_latencies)\n",
" std_latency = np.std(e2e_latencies)\n",
" min_latency = np.min(e2e_latencies)\n",
" max_latency = np.max(e2e_latencies)\n",
" ax.axvline(mean_latency, c=\"red\", linewidth=2)\n",
2025-06-03 13:43:48 +00:00
" _, max_ylim = ax.get_ylim()\n",
2025-06-06 08:24:47 +00:00
" # Create a multi-line string with all stats\n",
" stats_text = (\n",
" f\"Mean: {mean_latency:.2f} ms\\n\"\n",
" f\"Std: {std_latency:.2f} ms\\n\"\n",
" f\"Min: {min_latency:.2f} ms\\n\"\n",
" f\"Max: {max_latency:.2f} ms\"\n",
" )\n",
" # Place text near top right of plot\n",
" ax.text(\n",
" mean_latency * 1.02, # or just use ax.get_xlim()[1]*0.98 for far right\n",
" max_ylim * 0.98, # near the top\n",
" stats_text,\n",
" verticalalignment='top',\n",
" horizontalalignment='left',\n",
" fontsize=10,\n",
" bbox=dict(facecolor='white', alpha=0.7, boxstyle='round,pad=0.3')\n",
" )\n",
" plt.savefig(os.path.join(OUT_PATH, f\"plot_e2es_{name}.png\"))\n",
"\n",
2025-06-06 08:24:47 +00:00
" ##################################################\n",
" # 5. Violin plot of per-component/stage latencies on the DFG path (across all dataflows)\n",
" ##################################################\n",
" plt.close(\"E2E path breakdown\")\n",
" fig, ax = plt.subplots(num=f\"E2E path breakdown {name}\", dpi=300, figsize=(16, 5))\n",
" fig.suptitle(f\"E2E Latency Path Breakdown {name}\")\n",
"\n",
" component_breakdowns = [e2e_latency_breakdown(p) for p in tqdm(relevant_dataflows, desc=\"Calculating breakdowns\")]\n",
" # Transpose: Each element in component_durations is all values for one component\n",
" component_durations = list(zip(*component_breakdowns))\n",
" component_latency_items = component_durations\n",
"\n",
" def extract_class_name(symbol: str) -> str:\n",
" # Try to extract class name in pattern: void(ClassName::ClassName...\n",
" m = re.search(r'void\\((\\w+)::', symbol)\n",
" if m:\n",
" return m.group(1)\n",
" # If pattern not found, fallback: find last word before first '('\n",
" m = re.search(r'(\\w+)\\s*\\(', symbol)\n",
" if m:\n",
" return m.group(1)\n",
" return symbol # fallback to original if all fails\n",
"\n",
" # For labeling, types etc (assume first dataflow is representative)\n",
" labels = [extract_class_name(label_latency_item(item)) for item in e2e_latency_breakdown(relevant_dataflows[0])]\n",
" print(f\"Labels: {labels}\")\n",
" types = [item.type for item in e2e_latency_breakdown(relevant_dataflows[0])]\n",
" # Convert durations from seconds to ms\n",
" component_durations_ms = [list(map(lambda item: item.duration * 1000, d)) for d in component_durations]\n",
"\n",
" legend_entries = []\n",
"\n",
" def add_label(violin, label):\n",
" color = violin[\"bodies\"][0].get_facecolor().flatten()\n",
" legend_entries.append((mpatches.Patch(color=color), label))\n",
"\n",
" for comp_type in (\"idle\", \"dds\", \"cpu\"):\n",
" indices = [i for i, t in enumerate(types) if t == comp_type]\n",
" xs = [component_durations_ms[i] for i in indices]\n",
" if not xs:\n",
" continue\n",
" vln = ax.violinplot(xs, indices)\n",
" add_label(vln, comp_type)\n",
" # Export CSVs per component\n",
" for i, x in zip(indices, xs):\n",
" pd.Series(x).to_csv(\n",
" os.path.join(OUT_PATH, f\"plot_e2es_violin_{i:02d}.csv\"),\n",
" index=False, header=[\"duration_ms\"]\n",
" )\n",
" ax.set_ylabel(\"Latency contribution [ms]\")\n",
" ax.set_xticks(range(len(labels)), labels, rotation=90)\n",
" ax.legend(*zip(*legend_entries))\n",
" plt.savefig(os.path.join(OUT_PATH, f\"plot_e2es_violin_{name}.png\"))\n",
"\n",
" # Save labels and types\n",
" pd.Series(labels).to_csv(os.path.join(OUT_PATH, f\"plot_e2es_violin_labels_{name}.csv\"), index=False, header=[\"label\"])\n",
" pd.Series(types).to_csv(os.path.join(OUT_PATH, f\"plot_e2es_violin_types_{name}.csv\"), index=False, header=[\"type\"])\n",
"\n",
2025-06-06 08:24:47 +00:00
" ##################################################\n",
" # 6. Per-callback timestamp/duration records for relevant components (e.g., \"cpu\" stages)\n",
" ##################################################\n",
" for concat_pc_items in component_latency_items:\n",
" # Defensive check\n",
" if not isinstance(concat_pc_items[0].location[0], TrPublishInstance):\n",
" continue\n",
" records = [(item.location[0].timestamp, item.duration) for item in concat_pc_items]\n",
" pd.DataFrame(records, columns=(\"timestamp\", \"duration\")).to_csv(\n",
" os.path.join(OUT_PATH, f\"dur_ts_{concat_pc_items[0].location[0].publisher.topic_name.replace('/', '__')}_{name}.csv\"),\n",
" index=False\n",
" )\n",
"\n",
2025-06-06 08:24:47 +00:00
" ##################################################\n",
" # 7. Per-callback timing stats (mean, std, min, max) for \"cpu\" stages\n",
" ##################################################\n",
" cpu_indices = [i for i, t in enumerate(types) if t == \"cpu\"]\n",
" cpu_durations = [np.array([item.location[0].duration for item in component_latency_items[i]]) for i in cpu_indices]\n",
" cpu_labels = [labels[i] for i in cpu_indices]\n",
" stats = [(lbl, x.mean(), x.std(), x.min(), x.max()) for x, lbl in zip(cpu_durations, cpu_labels)]\n",
" pd.DataFrame(stats, columns=[\"callback\", \"mean\", \"std\", \"min\", \"max\"]).to_csv(\n",
" os.path.join(OUT_PATH, f\"calc_times_{name}.csv\"), index=False\n",
" )\n",
"\n",
2025-06-06 08:24:47 +00:00
" ##################################################\n",
" # 8. Stacked breakdown plot (from message_tree plots)\n",
" ##################################################\n",
" fig = e2e_breakdown_stack(*e2e_breakdowns, name=name)\n",
" fig.set_size_inches(16, 9)\n",
" fig.set_dpi(300)\n",
"\n",
2023-02-15 17:02:20 +09:00
"print(\"Done.\")"
]
}
],
"metadata": {
"kernelspec": {
2025-06-03 13:43:48 +00:00
"display_name": "venv310",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2025-06-03 13:43:48 +00:00
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
2022-09-20 12:44:04 +02:00
}