Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge selected changes from branch 'simgrid-Jesse-McDonald-master-patch-09242'
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 30 May 2022 09:55:13 +0000 (11:55 +0200)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Mon, 30 May 2022 09:59:51 +0000 (11:59 +0200)
(ignore the first change which is not valid)

30 files changed:
.mailmap
MANIFEST.in
docs/source/Platform.rst
examples/platforms/CMakeLists.txt
examples/platforms/supernode.cpp [new file with mode: 0644]
examples/platforms/supernode.py [new file with mode: 0755]
examples/platforms/supernode.svg [new file with mode: 0644]
examples/smpi/CMakeLists.txt
include/xbt/config.hpp
include/xbt/utility.hpp
src/kernel/EngineImpl.cpp
src/kernel/activity/ActivityImpl.hpp
src/kernel/activity/CommImpl.cpp
src/kernel/activity/ExecImpl.cpp
src/kernel/activity/ExecImpl.hpp
src/kernel/activity/MailboxImpl.cpp
src/kernel/activity/MailboxImpl.hpp
src/kernel/resource/profile/ProfileBuilder.cpp
src/kernel/routing/RoutedZone.cpp
src/mc/transition/Transition.cpp
src/s4u/s4u_Mailbox.cpp
src/surf/HostImpl.cpp
src/xbt/xbt_replay.cpp
teshsuite/s4u/CMakeLists.txt
teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.cpp [new file with mode: 0644]
teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.tesh [new file with mode: 0644]
tools/cmake/DefinePackages.cmake
tools/graphicator/CMakeLists.txt
tools/graphicator/graphicator.cpp
tools/graphicator/graphicator.tesh

index b1e29da..c279754 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -30,7 +30,9 @@ Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pini@48e7efb5-ca39-0410-
 Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pini@ethernium.org>
 Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pini@tuxfamily.org>
 Pierre-Nicolas Clauss <pierre-nicolas.clauss@loria.fr> <pnclauss@griffon-82.nancy.grid5000.fr>
-Tom Cornebize <tom.cornebize@ensimag.grenoble-inp.fr> <Ezibenroc@users.noreply.github.com>
+Tom Cornebize <tom.cornebize@intel.com> <tom.cornebize@ensimag.grenoble-inp.fr>
+Tom Cornebize <tom.cornebize@intel.com> <tom.cornebize@gmail.com>
+Tom Cornebize <tom.cornebize@intel.com> <Ezibenroc@users.noreply.github.com>
 Gabriel Corona <gabriel.corona@loria.fr> <coron00b@barbecue.loria.fr>
 Gabriel Corona <gabriel.corona@loria.fr> <gabriel.corona@enst-bretagne.fr>
 ClĂ©ment Courageux-Sudan <clement.courageux-sudan@inria.fr> <clement.courageux-sudan@ens-rennes.fr>
index aa2f7fa..c3f49ce 100644 (file)
@@ -607,6 +607,7 @@ include examples/smpi/mc/non_termination2.c
 include examples/smpi/mc/non_termination3.c
 include examples/smpi/mc/non_termination4.c
 include examples/smpi/mc/only_send_deterministic.c
+include examples/smpi/mc/only_send_deterministic.tesh
 include examples/smpi/mc/promela_bugged1_liveness
 include examples/smpi/mc/sendsend.c
 include examples/smpi/mc/sendsend.tesh
@@ -815,6 +816,8 @@ include teshsuite/s4u/cloud-interrupt-migration/cloud-interrupt-migration.tesh
 include teshsuite/s4u/cloud-two-execs/cloud-two-execs-bmf.tesh
 include teshsuite/s4u/cloud-two-execs/cloud-two-execs.cpp
 include teshsuite/s4u/cloud-two-execs/cloud-two-execs.tesh
+include teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.cpp
+include teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.tesh
 include teshsuite/s4u/comm-get-sender/comm-get-sender.cpp
 include teshsuite/s4u/comm-get-sender/comm-get-sender.tesh
 include teshsuite/s4u/comm-pt2pt/comm-pt2pt.cpp
@@ -1942,6 +1945,9 @@ include examples/platforms/small_platform_routing_none.xml
 include examples/platforms/small_platform_with_routers.xml
 include examples/platforms/storage/content/small_content.txt
 include examples/platforms/storage/content/storage_content.txt
+include examples/platforms/supernode.cpp
+include examples/platforms/supernode.py
+include examples/platforms/supernode.svg
 include examples/platforms/syscoord/generate_peer_platform.pl
 include examples/platforms/syscoord/median_harvard.syscoord
 include examples/platforms/syscoord/median_meridian.syscoord
@@ -1964,7 +1970,6 @@ include examples/python/platform-failures/platform-failures_d.xml
 include examples/smpi/CMakeLists.txt
 include examples/smpi/NAS/CMakeLists.txt
 include examples/smpi/comm_dynamic_costs/CMakeLists.txt
-include examples/smpi/mc/only_send_deterministic.tesh
 include examples/smpi/replay_multiple/CMakeLists.txt
 include examples/smpi/replay_multiple_manual_deploy/CMakeLists.txt
 include examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
index 2975428..55c46f0 100644 (file)
@@ -15,7 +15,7 @@
 Describing your Simulated Platform
 ##################################
 
-In SimGrid, platforms are usually described in XML. This formalis has
+In SimGrid, platforms are usually described in XML. This formalism has
 some drawbacks, but using a specific format ensures that the platform
 is not mixed with the tested application. This separation of concern
 :ref:`is a must <howto_science>` for your Modeling and Simulation (M&S)
index 42a5073..1873773 100644 (file)
@@ -1,6 +1,6 @@
 add_custom_target(platf_cpp COMMENT "C++ platform description")
 add_dependencies(tests platf_cpp)
-foreach (platf routing_cluster griffon)
+foreach (platf griffon routing_cluster supernode)
   add_library       (${platf} SHARED ${platf}.cpp)
   target_link_libraries(${platf} simgrid)
   add_dependencies(platf_cpp ${platf})
diff --git a/examples/platforms/supernode.cpp b/examples/platforms/supernode.cpp
new file mode 100644 (file)
index 0000000..2b4afb8
--- /dev/null
@@ -0,0 +1,100 @@
+/* Copyright (c) 2006-2022. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include <simgrid/s4u.hpp>
+namespace sg4 = simgrid::s4u;
+
+constexpr double BW_CPU  = 1e12;
+constexpr double LAT_CPU = 0;
+
+constexpr double BW_NODE  = 1e11;
+constexpr double LAT_NODE = 1e-8;
+
+constexpr double BW_NETWORK  = 1.25e10;
+constexpr double LAT_NETWORK = 1e-7;
+
+static std::string int_string(int n)
+{
+  return simgrid::xbt::string_printf("%02d", n);
+}
+
+/**
+ *
+ * This function creates one node made of nb_cpu CPUs.
+ */
+static sg4::NetZone* create_node(const sg4::NetZone* root, const std::string& node_name, const int nb_cpu)
+{
+  auto* node = sg4::create_star_zone(node_name);
+  node->set_parent(root);
+
+  /* create all hosts and connect them to outside world */
+  for (int i = 0; i < nb_cpu; i++) {
+    const auto& cpuname  = node_name + "_cpu-" + int_string(i);
+    const auto& linkname = "link_" + cpuname;
+
+    const sg4::Host* host = node->create_host(cpuname, 1e9);
+    const sg4::Link* l    = node->create_split_duplex_link(linkname, BW_CPU)->set_latency(LAT_CPU)->seal();
+
+    node->add_route(host->get_netpoint(), nullptr, nullptr, nullptr, {{l, sg4::LinkInRoute::Direction::UP}}, true);
+  }
+
+  return node;
+}
+
+/**
+ *
+ * This function creates one super-node made of nb_nodes nodes with nb_cpu CPUs.
+ */
+static sg4::NetZone* create_supernode(const sg4::NetZone* root, const std::string& supernode_name, const int nb_nodes,
+                                      const int nb_cpu)
+{
+  auto* supernode = sg4::create_star_zone(supernode_name);
+  supernode->set_parent(root);
+
+  /* create all nodes and connect them to outside world */
+  for (int i = 0; i < nb_nodes; i++) {
+    const auto& node_name = supernode_name + "_node-" + int_string(i);
+    const auto& linkname  = "link_" + node_name;
+
+    sg4::NetZone* node = create_node(supernode, node_name, nb_cpu);
+    const auto router  = node->create_router("router_" + node_name);
+    node->seal();
+
+    const sg4::Link* l = supernode->create_split_duplex_link(linkname, BW_NODE)->set_latency(LAT_NODE)->seal();
+    supernode->add_route(node->get_netpoint(), nullptr, router, nullptr, {{l, sg4::LinkInRoute::Direction::UP}}, true);
+  }
+  return supernode;
+}
+
+/**
+ *
+ * This function creates one cluster of nb_supernodes super-nodes made of nb_nodes nodes with nb_cpu CPUs.
+ */
+static sg4::NetZone* create_cluster(const std::string& cluster_name, const int nb_supernodes, const int nb_nodes,
+                                    const int nb_cpu)
+{
+  auto* cluster = sg4::create_star_zone(cluster_name);
+
+  /* create all supernodes and connect them to outside world */
+  for (int i = 0; i < nb_supernodes; i++) {
+    const auto& supernode_name = cluster_name + "_supernode-" + int_string(i);
+    const auto& linkname       = "link_" + supernode_name;
+
+    sg4::NetZone* supernode = create_supernode(cluster, supernode_name, nb_nodes, nb_cpu);
+    const auto router       = supernode->create_router("router_" + supernode_name);
+    supernode->seal();
+
+    const sg4::Link* l = cluster->create_split_duplex_link(linkname, BW_NETWORK)->set_latency(LAT_NETWORK)->seal();
+    cluster->add_route(supernode->get_netpoint(), nullptr, router, nullptr, {{l, sg4::LinkInRoute::Direction::UP}},
+                       true);
+  }
+  return cluster;
+}
+
+extern "C" void load_platform(const sg4::Engine& e);
+void load_platform(const sg4::Engine&)
+{
+  create_cluster("cluster", 4, 6, 2)->seal();
+}
diff --git a/examples/platforms/supernode.py b/examples/platforms/supernode.py
new file mode 100755 (executable)
index 0000000..7270da8
--- /dev/null
@@ -0,0 +1,152 @@
+#! /usr/bin/env python3
+
+# Copyright (c) 2006-2022. The SimGrid Team. All rights reserved.
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the license (GNU LGPL) which comes with this package.
+
+
+# This script takes as input a C++ platform file, compiles it, then dumps the
+# routing graph as a CSV and generates an image.
+# The layout should be alright for any platform file, but the colors are very
+# ad-hoc for file supernode.cpp : do not hesitate to adapt this script to your needs.
+# An option is provided to "simplify" the graph by removing the link vertices. It assumes that these vertices have
+# "link" in their name.
+
+import sys
+import subprocess
+import pandas
+import matplotlib.pyplot as plt
+import networkx as nx
+import argparse
+import tempfile
+import os
+
+try:
+    from palettable.colorbrewer.qualitative import Set1_9
+    colors = Set1_9.hex_colors
+except ImportError:
+    print('Warning: could not import palettable, will use a default palette.')
+    colors = [None]*10
+
+
+def run_command(cmd):
+    print(cmd)
+    proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    _stdout, stderr = proc.communicate()
+    if proc.returncode != 0:
+        sys.exit(f'Command failed:\n{stderr.decode()}')
+
+
+def compile_platform(platform_cpp, platform_so):
+    cmd = f'g++ -g -fPIC -shared -o {platform_so} {platform_cpp} -lsimgrid'
+    run_command(cmd)
+
+
+def dump_csv(platform_so, platform_csv):
+    cmd = f'graphicator {platform_so} {platform_csv}'
+    run_command(cmd)
+
+
+def merge_updown(graph):
+    '''
+    Merge all the UP and DOWN links.
+    '''
+    graph2 = graph.copy()
+    downlinks = [v for v in graph if 'DOWN' in v]
+    mapping = {}
+    for down in downlinks:
+        up = down.replace('DOWN', 'UP')
+        graph2 = nx.contracted_nodes(graph2, down, up)
+        mapping[down] = down.replace('_DOWN', '')
+    return nx.relabel_nodes(graph2, mapping)
+
+
+def contract_links(graph):
+    '''
+    Remove all the 'link' vertices from the graph to directly connect the nodes.
+    Note: it assumes that link vertices have the "link" string in their name.
+    '''
+    links = [v for v in graph if 'link' in v]
+    new_edges = []
+    for v in links:
+        neigh = [u for u in graph.neighbors(v) if 'link' not in u]  # with Floyd zones, we have links connected to links
+        assert len(neigh) == 2
+        new_edges.append(neigh)
+    # Adding edges from graph that have no links
+    for u, v in graph.edges:
+        if 'link' not in u and 'link' not in v:
+            new_edges.append((u, v))
+    return nx.from_edgelist(new_edges)
+
+
+def load_graph(platform_csv, simplify_graph):
+    edges = pandas.read_csv(platform_csv)
+    graph = nx.Graph()
+    graph.add_edges_from([e for _, e in edges.drop_duplicates().iterrows()])
+    print(f'Loaded a graph with {len(graph)} vertices with {len(graph.edges)} edges')
+    if simplify_graph:
+        graph = contract_links(merge_updown(graph))
+        print(f'Simplified the graph, it now has {len(graph)} vertices with {len(graph.edges)} edges')
+    return graph
+
+
+def plot_graph(graph, label=False, groups=None):
+    if groups is None:
+        groups = []
+    # First, we compute the graph layout, i.e. the position of the nodes.
+    # The neato algorithm from graphviz is nicer, but this is an extra-dependency.
+    # The spring_layout is also not too bad.
+    try:
+        pos = nx.nx_agraph.graphviz_layout(graph, 'neato')
+    except ImportError:
+        print('Warning: could not import pygraphviz, will use another layout algorithm.')
+        pos = nx.spring_layout(graph, k=0.5, iterations=1000, seed=42)
+    plt.figure(figsize=(20, 15))
+    plt.axis('off')
+    all_nodes = set(graph)
+    # We then iterate on all the specified groups, to plot each of them in the right color.
+    # Note that the order of the groups is important here, as we are looking at substrings in the node names.
+    for i, grp in enumerate(groups):
+        nodes = {u for u in all_nodes if grp in u}
+        all_nodes -= nodes
+        nx.draw_networkx_nodes(graph, pos, nodelist=nodes, node_size=50, node_color=colors[i], label=grp.replace('_', ''))
+    nx.draw_networkx_nodes(graph, pos, nodelist=all_nodes, node_size=50, node_color=colors[-1], label='unknown')
+    # Finally we draw the edges, the (optional) labels, and the legend.
+    nx.draw_networkx_edges(graph, pos, alpha=0.3)
+    if label:
+        nx.draw_networkx_labels(graph, pos)
+    plt.legend(scatterpoints=1)
+
+
+def generate_svg(platform_csv, output_file, simplify_graph):
+    graph = load_graph(platform_csv, simplify_graph)
+    plot_graph(graph, label=False, groups=['router', 'link', 'cpu', '_node', 'supernode', 'cluster'])
+    plt.savefig(output_file)
+    print(f'Generated file {output_file}')
+
+
+def main():
+    parser = argparse.ArgumentParser(description='Visualization of topologies for SimGrid C++ platforms')
+    parser.add_argument('input', type=str, help='SimGrid C++ platform file name (input)')
+    parser.add_argument('output', type=str, help='File name of the output image')
+    parser.add_argument('--simplify', action='store_true', help='Simplify the topology (removing link vertices)')
+    args = parser.parse_args()
+    if not args.input.endswith('.cpp'):
+        parser.error(f'SimGrid platform must be a C++ file (with .cpp extension), got {args.input}')
+    if not os.path.isfile(args.input):
+        parser.error(f'File {args.input} not found')
+    output_dir = os.path.dirname(args.output)
+    if output_dir != '' and not os.path.isdir(output_dir):
+        parser.error(f'Not a directory: {output_dir}')
+    with tempfile.TemporaryDirectory() as tmpdirname:
+        platform_cpp = args.input
+        platform_csv = os.path.join(tmpdirname, 'platform.csv')
+        platform_so = os.path.join(tmpdirname, 'platform.so')
+        compile_platform(platform_cpp, platform_so)
+        dump_csv(platform_so, platform_csv)
+        generate_svg(platform_csv, args.output, args.simplify)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/examples/platforms/supernode.svg b/examples/platforms/supernode.svg
new file mode 100644 (file)
index 0000000..c6c6b52
--- /dev/null
@@ -0,0 +1,1777 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="1440pt" height="1080pt" viewBox="0 0 1440 1080" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2022-05-18T17:06:35.525617</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.5.1, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 1080 
+L 1440 1080 
+L 1440 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="LineCollection_1">
+    <path d="M 1069.405072 401.473335 
+L 1121.704069 374.683614 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1069.405072 401.473335 
+L 1014.185826 423.2666 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1121.704069 374.683614 
+L 1054.67109 386.617667 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1073.387229 425.717786 
+L 1133.119586 420.384601 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1073.387229 425.717786 
+L 1014.185826 423.2666 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1133.119586 420.384601 
+L 1069.53781 440.107976 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1054.67109 386.617667 
+L 1014.185826 423.2666 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1014.185826 423.2666 
+L 1069.53781 440.107976 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1014.185826 423.2666 
+L 946.223678 436.507952 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 946.223678 436.507952 
+L 875.009434 443.440598 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 946.223678 436.507952 
+L 887.022275 443.207859 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1048.631485 345.219872 
+L 1091.373305 311.051835 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1048.631485 345.219872 
+L 1006.022404 378.546087 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1091.373305 311.051835 
+L 1032.968334 334.523791 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1065.82113 368.048082 
+L 1125.420749 356.856812 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1065.82113 368.048082 
+L 1006.022404 378.546087 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1125.420749 356.856812 
+L 1071.197042 385.280657 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1032.968334 334.523791 
+L 1006.022404 378.546087 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1006.022404 378.546087 
+L 1071.197042 385.280657 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1006.022404 378.546087 
+L 944.962661 404.974321 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 944.962661 404.974321 
+L 881.181778 424.088614 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 944.962661 404.974321 
+L 893.791942 424.430294 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 881.579994 252.17387 
+L 908.924139 208.102055 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 881.579994 252.17387 
+L 896.77856 298.820668 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 908.924139 208.102055 
+L 903.28275 253.51088 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 936.334654 263.414659 
+L 976.554441 229.395179 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 936.334654 263.414659 
+L 896.77856 298.820668 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 976.554441 229.395179 
+L 951.59959 274.903043 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 903.28275 253.51088 
+L 896.77856 298.820668 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 896.77856 298.820668 
+L 951.59959 274.903043 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 896.77856 298.820668 
+L 869.301676 346.606401 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 869.301676 346.606401 
+L 843.88224 385.627289 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 869.301676 346.606401 
+L 850.585537 392.857048 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 808.374672 246.974386 
+L 797.091893 201.763636 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 808.374672 246.974386 
+L 820.984836 291.194759 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 797.091893 201.763636 
+L 786.041407 250.193115 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 843.484024 247.321019 
+L 867.310597 205.130921 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 843.484024 247.321019 
+L 820.984836 291.194759 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 867.310597 205.130921 
+L 862.39927 255.244042 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 786.041407 250.193115 
+L 820.984836 291.194759 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 820.984836 291.194759 
+L 862.39927 255.244042 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 820.984836 291.194759 
+L 814.739486 343.585748 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 814.739486 343.585748 
+L 816.00714 385.924402 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 814.739486 343.585748 
+L 816.737202 395.679625 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 969.917513 282.479433 
+L 1015.048627 247.023905 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 969.917513 282.479433 
+L 963.745169 329.968052 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1015.048627 247.023905 
+L 989.961037 288.570257 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1016.309643 306.34754 
+L 1069.205964 283.816443 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1016.309643 306.34754 
+L 963.745169 329.968052 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1069.205964 283.816443 
+L 1026.265036 320.6585 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 989.961037 288.570257 
+L 963.745169 329.968052 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 963.745169 329.968052 
+L 1026.265036 320.6585 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 963.745169 329.968052 
+L 917.883993 369.087979 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 917.883993 369.087979 
+L 872.487402 398.502201 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 917.883993 369.087979 
+L 879.987131 405.147637 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 716.433301 271.981428 
+L 717.17 219.788514 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 716.433301 271.981428 
+L 759.546789 305.406681 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 717.17 219.788514 
+L 740.027582 258.413251 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 785.278161 262.02813 
+L 767.856223 214.787105 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 785.278161 262.02813 
+L 759.546789 305.406681 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 767.856223 214.787105 
+L 756.002669 267.524727 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 740.027582 258.413251 
+L 759.546789 305.406681 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 759.546789 305.406681 
+L 756.002669 267.524727 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 759.546789 305.406681 
+L 774.340502 356.114028 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 774.340502 356.114028 
+L 793.401761 397.808937 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 774.340502 356.114028 
+L 795.870698 406.707482 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 875.009434 443.440598 
+L 837.577157 423.885586 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 881.181778 424.088614 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 843.88224 385.627289 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 816.00714 385.924402 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 872.487402 398.502201 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 793.401761 397.808937 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 802.268698 466.422316 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 887.022275 443.207859 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 893.791942 424.430294 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 850.585537 392.857048 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 816.737202 395.679625 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 879.987131 405.147637 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 837.577157 423.885586 
+L 795.870698 406.707482 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 802.268698 466.422316 
+L 765.07535 504.7747 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 802.268698 466.422316 
+L 772.913563 508.429194 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 667.605417 844.424792 
+L 681.171299 889.036364 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 667.605417 844.424792 
+L 652.805067 799.630001 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 681.171299 889.036364 
+L 688.445373 840.101793 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 631.905379 843.855325 
+L 605.297932 885.224399 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 631.905379 843.855325 
+L 652.805067 799.630001 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 605.297932 885.224399 
+L 609.021249 834.070392 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 688.445373 840.101793 
+L 652.805067 799.630001 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 652.805067 799.630001 
+L 609.021249 834.070392 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 652.805067 799.630001 
+L 658.824761 747.125118 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 658.824761 747.125118 
+L 662.833466 698.814485 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 658.824761 747.125118 
+L 653.170098 702.790852 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 509.062468 811.202566 
+L 466.659132 848.53288 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 509.062468 811.202566 
+L 512.361022 763.778322 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 466.659132 848.53288 
+L 488.634002 806.191254 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 461.794263 788.899257 
+L 410.69655 813.757741 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 461.794263 788.899257 
+L 512.361022 763.778322 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 410.69655 813.757741 
+L 450.099995 775.222138 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 488.634002 806.191254 
+L 512.361022 763.778322 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 512.361022 763.778322 
+L 450.099995 775.222138 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 512.361022 763.778322 
+L 556.57624 723.583836 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 556.57624 723.583836 
+L 600.539254 693.689279 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 556.57624 723.583836 
+L 594.512923 686.291157 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 402.134912 653.524505 
+L 339.402664 673.723261 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 402.134912 653.524505 
+L 457.453712 669.84098 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 339.402664 673.723261 
+L 398.922639 668.092963 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 416.862257 705.801601 
+L 350.778359 718.924108 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 416.862257 705.801601 
+L 457.453712 669.84098 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 350.778359 718.924108 
+L 402.280925 692.322558 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 398.922639 668.092963 
+L 457.453712 669.84098 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 457.453712 669.84098 
+L 402.280925 692.322558 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 457.453712 669.84098 
+L 524.878269 655.757807 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 524.878269 655.757807 
+L 595.315992 647.047433 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 524.878269 655.757807 
+L 583.688093 649.047997 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 530.360372 821.284613 
+L 510.595599 867.764532 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 530.360372 821.284613 
+L 583.933659 794.579074 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 510.595599 867.764532 
+L 547.098706 831.28743 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 581.531091 841.087219 
+L 585.347325 886.858523 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 581.531091 841.087219 
+L 583.933659 794.579074 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 585.347325 886.858523 
+L 606.353204 840.517751 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 547.098706 831.28743 
+L 583.933659 794.579074 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 583.933659 794.579074 
+L 606.353204 840.517751 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 583.933659 794.579074 
+L 607.992525 745.21864 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 607.992525 745.21864 
+L 625.241902 696.917911 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 607.992525 745.21864 
+L 629.044862 705.687707 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 716.93107 831.658821 
+L 713.108199 878.320475 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 716.93107 831.658821 
+L 712.849359 783.655206 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 713.108199 878.320475 
+L 694.119947 829.435423 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 757.920741 808.894986 
+L 769.648194 860.482284 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 757.920741 808.894986 
+L 712.849359 783.655206 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 769.648194 860.482284 
+L 745.861442 820.076352 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 694.119947 829.435423 
+L 712.849359 783.655206 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 712.849359 783.655206 
+L 745.861442 820.076352 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 712.849359 783.655206 
+L 698.991452 731.863395 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 698.991452 731.863395 
+L 680.242129 688.509603 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 698.991452 731.863395 
+L 672.622935 681.616573 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 403.482209 712.521315 
+L 351.077021 741.707751 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 403.482209 712.521315 
+L 468.298453 716.819555 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 351.077021 741.707751 
+L 410.019583 728.610003 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 444.31923 760.901274 
+L 387.288103 786.873934 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 444.31923 760.901274 
+L 468.298453 716.819555 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 387.288103 786.873934 
+L 426.638453 751.621433 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 410.019583 728.610003 
+L 468.298453 716.819555 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 468.298453 716.819555 
+L 426.638453 751.621433 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 468.298453 716.819555 
+L 527.566225 688.742342 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 527.566225 688.742342 
+L 580.674927 672.099042 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 527.566225 688.742342 
+L 586.661437 664.6514 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 662.833466 698.814485 
+L 634.015922 666.746049 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 600.539254 693.689279 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 595.315992 647.047433 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 625.241902 696.917911 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 680.242129 688.509603 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 580.674927 672.099042 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 670.160635 624.283598 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 653.170098 702.790852 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 594.512923 686.291157 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 583.688093 649.047997 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 629.044862 705.687707 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 672.622935 681.616573 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 634.015922 666.746049 
+L 586.661437 664.6514 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 670.160635 624.283598 
+L 700.252469 582.544122 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 670.160635 624.283598 
+L 708.084045 586.193665 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1139.092821 604.926662 
+L 1199.157025 597.340368 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1139.092821 604.926662 
+L 1079.094987 614.142128 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1199.157025 597.340368 
+L 1134.247864 589.229173 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1121.770438 650.68212 
+L 1188.006985 661.383153 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1121.770438 650.68212 
+L 1079.094987 614.142128 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1188.006985 661.383153 
+L 1138.097282 633.900167 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1134.247864 589.229173 
+L 1079.094987 614.142128 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1079.094987 614.142128 
+L 1138.097282 633.900167 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1079.094987 614.142128 
+L 1009.407238 606.640016 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1009.407238 606.640016 
+L 945.294508 601.598993 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1009.407238 606.640016 
+L 951.533221 609.546775 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 930.494157 793.489658 
+L 966.001725 832.743285 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 930.494157 793.489658 
+L 901.291672 752.156237 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 966.001725 832.743285 
+L 950.471312 782.531127 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 878.726114 793.286631 
+L 904.875613 841.0377 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 878.726114 793.286631 
+L 901.291672 752.156237 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 904.875613 841.0377 
+L 897.973207 796.386513 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 950.471312 782.531127 
+L 901.291672 752.156237 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 901.291672 752.156237 
+L 897.973207 796.386513 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 901.291672 752.156237 
+L 883.106487 701.434034 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 883.106487 701.434034 
+L 873.682049 648.315117 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 883.106487 701.434034 
+L 873.814787 657.411738 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1089.846812 720.751355 
+L 1136.172573 754.894632 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1089.846812 720.751355 
+L 1025.667713 715.373603 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1136.172573 754.894632 
+L 1080.953327 735.235631 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1037.879661 761.847085 
+L 1086.992932 794.38595 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1037.879661 761.847085 
+L 1025.667713 715.373603 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1086.992932 794.38595 
+L 1057.259492 754.721316 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1080.953327 735.235631 
+L 1025.667713 715.373603 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1025.667713 715.373603 
+L 1057.259492 754.721316 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1025.667713 715.373603 
+L 973.103238 680.814367 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 973.103238 680.814367 
+L 935.670961 648.736028 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 973.103238 680.814367 
+L 923.459013 649.052949 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 975.094317 791.013713 
+L 989.496452 835.803553 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 975.094317 791.013713 
+L 961.488613 746.511083 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 989.496452 835.803553 
+L 952.130544 795.039599 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1006.486989 779.035093 
+L 1051.750842 810.593484 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1006.486989 779.035093 
+L 961.488613 746.511083 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1051.750842 810.593484 
+L 1020.092693 766.635562 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 952.130544 795.039599 
+L 961.488613 746.511083 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 961.488613 746.511083 
+L 1020.092693 766.635562 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 961.488613 746.511083 
+L 925.715569 701.072546 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 925.715569 701.072546 
+L 896.181237 655.218051 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 925.715569 701.072546 
+L 904.079182 661.917957 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1127.478196 642.45208 
+L 1192.254619 657.505824 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1127.478196 642.45208 
+L 1068.011317 660.442294 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1192.254619 657.505824 
+L 1131.327615 662.94795 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1116.527264 690.232861 
+L 1162.786656 719.61242 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1116.527264 690.232861 
+L 1068.011317 660.442294 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1162.786656 719.61242 
+L 1101.262329 701.508313 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1131.327615 662.94795 
+L 1068.011317 660.442294 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1068.011317 660.442294 
+L 1101.262329 701.508313 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1068.011317 660.442294 
+L 1002.504832 641.050695 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1002.504832 641.050695 
+L 947.949279 629.809906 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1002.504832 641.050695 
+L 936.467393 622.902021 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1118.186497 580.325676 
+L 1185.352213 571.011172 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1118.186497 580.325676 
+L 1060.113372 562.677142 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1185.352213 571.011172 
+L 1123.562409 564.568764 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1111.615937 542.235743 
+L 1169.025369 528.018868 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1111.615937 542.235743 
+L 1060.113372 562.677142 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1169.025369 528.018868 
+L 1100.797744 529.999624 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1123.562409 564.568764 
+L 1060.113372 562.677142 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1060.113372 562.677142 
+L 1100.797744 529.999624 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 1060.113372 562.677142 
+L 991.222053 573.378175 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 991.222053 573.378175 
+L 925.250984 591.601128 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 991.222053 573.378175 
+L 931.887912 585.589534 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 945.294508 601.598993 
+L 899.632439 620.450835 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 873.682049 648.315117 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 935.670961 648.736028 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 896.181237 655.218051 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 947.949279 629.809906 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 925.250984 591.601128 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 842.820331 594.210774 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 951.533221 609.546775 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 873.814787 657.411738 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 923.459013 649.052949 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 904.079182 661.917957 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 936.467393 622.902021 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 899.632439 620.450835 
+L 931.887912 585.589534 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 842.820331 594.210774 
+L 786.386528 572.481883 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 842.820331 594.210774 
+L 791.284581 566.62875 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 342.820682 513.905984 
+L 276.842975 507.062472 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 342.820682 513.905984 
+L 396.208135 485.605936 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 276.842975 507.062472 
+L 336.595243 496.584274 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 345.959949 455.488544 
+L 279.192448 453.923747 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 345.959949 455.488544 
+L 396.208135 485.605936 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 279.192448 453.923747 
+L 337.166019 470.106522 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 336.595243 496.584274 
+L 396.208135 485.605936 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 396.208135 485.605936 
+L 337.166019 470.106522 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 396.208135 485.605936 
+L 466.665769 488.908846 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 466.665769 488.908846 
+L 523.431418 487.779815 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 466.665769 488.908846 
+L 535.80929 485.69507 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 431.470137 330.95843 
+L 380.44543 300.949981 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 431.470137 330.95843 
+L 445.945278 377.753785 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 380.44543 300.949981 
+L 413.046023 339.574718 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 382.695349 374.782651 
+L 332.845378 342.644889 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 382.695349 374.782651 
+L 445.945278 377.753785 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 332.845378 342.644889 
+L 389.285819 359.382275 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 413.046023 339.574718 
+L 445.945278 377.753785 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 445.945278 377.753785 
+L 389.285819 359.382275 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 445.945278 377.753785 
+L 499.133623 411.203798 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 499.133623 411.203798 
+L 548.638473 439.845526 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 499.133623 411.203798 
+L 538.284865 444.089295 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 343.968871 440.702203 
+L 283.161331 422.132618 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 343.968871 440.702203 
+L 405.38037 428.183826 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 283.161331 422.132618 
+L 343.809584 424.519428 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 370.536496 387.459488 
+L 309.131633 371.811518 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 370.536496 387.459488 
+L 405.38037 428.183826 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 309.131633 371.811518 
+L 357.846688 400.284882 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 343.809584 424.519428 
+L 405.38037 428.183826 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 405.38037 428.183826 
+L 357.846688 400.284882 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 405.38037 428.183826 
+L 470.070513 447.813116 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 470.070513 447.813116 
+L 521.719091 464.406897 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 470.070513 447.813116 
+L 534.110237 462.911427 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 494.885989 301.791802 
+L 477.895452 257.472392 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 494.885989 301.791802 
+L 510.044734 345.467466 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 477.895452 257.472392 
+L 516.927229 296.839912 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 451.288005 327.194994 
+L 416.868894 284.113557 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 451.288005 327.194994 
+L 510.044734 345.467466 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 416.868894 284.113557 
+L 463.619418 313.874412 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 516.927229 296.839912 
+L 510.044734 345.467466 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 510.044734 345.467466 
+L 463.619418 313.874412 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 510.044734 345.467466 
+L 546.640758 390.331584 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 546.640758 390.331584 
+L 575.949434 437.4191 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 546.640758 390.331584 
+L 570.294771 428.679015 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 364.330967 549.975546 
+L 307.532133 565.276884 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 364.330967 549.975546 
+L 415.415406 527.999061 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 307.532133 565.276884 
+L 376.104879 561.721427 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 356.997161 508.330156 
+L 290.183202 520.417718 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 356.997161 508.330156 
+L 415.415406 527.999061 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 290.183202 520.417718 
+L 353.054826 527.117624 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 376.104879 561.721427 
+L 415.415406 527.999061 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 415.415406 527.999061 
+L 353.054826 527.117624 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 415.415406 527.999061 
+L 484.147438 517.431729 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 484.147438 517.431729 
+L 552.01667 500.47646 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 484.147438 517.431729 
+L 540.548057 503.576342 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 541.38431 296.691356 
+L 505.053763 258.46277 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 541.38431 296.691356 
+L 571.648704 337.792038 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 505.053763 258.46277 
+L 522.966833 308.080701 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 593.391282 296.097129 
+L 565.86794 249.450331 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 593.391282 296.097129 
+L 571.648704 337.792038 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 565.86794 249.450331 
+L 573.878712 294.066854 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 522.966833 308.080701 
+L 571.648704 337.792038 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 571.648704 337.792038 
+L 573.878712 294.066854 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 571.648704 337.792038 
+L 589.687876 388.25179 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 589.687876 388.25179 
+L 600.917559 440.717058 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 589.687876 388.25179 
+L 597.950852 431.897743 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 523.431418 487.779815 
+L 574.124279 469.967869 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 548.638473 439.845526 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 521.719091 464.406897 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 575.949434 437.4191 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 552.01667 500.47646 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 600.917559 440.717058 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 630.92975 496.41591 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 535.80929 485.69507 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 538.284865 444.089295 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 534.110237 462.911427 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 570.294771 428.679015 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 540.548057 503.576342 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 574.124279 469.967869 
+L 597.950852 431.897743 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 630.92975 496.41591 
+L 687.044981 518.451818 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 630.92975 496.41591 
+L 682.166839 524.319807 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 765.07535 504.7747 
+L 736.675933 545.518845 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 700.252469 582.544122 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 786.386528 572.481883 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 687.044981 518.451818 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 772.913563 508.429194 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 708.084045 586.193665 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 791.284581 566.62875 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+    <path d="M 736.675933 545.518845 
+L 682.166839 524.319807 
+" clip-path="url(#pa8cf324c9b)" style="fill: none; stroke: #000000; stroke-opacity: 0.3"/>
+   </g>
+   <g id="PathCollection_1">
+    <defs>
+     <path id="mb9aa5dab14" d="M 0 3.535534 
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0 
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534 
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5 
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0 
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 
+z
+" style="stroke: #e41a1c"/>
+    </defs>
+    <g clip-path="url(#pa8cf324c9b)">
+     <use xlink:href="#mb9aa5dab14" x="869.301676" y="346.606401" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="499.133623" y="411.203798" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="973.103238" y="680.814367" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="658.824761" y="747.125118" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="883.106487" y="701.434034" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="698.991452" y="731.863395" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="925.715569" y="701.072546" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="917.883993" y="369.087979" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="1002.504832" y="641.050695" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="607.992525" y="745.21864" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="944.962661" y="404.974321" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="774.340502" y="356.114028" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="842.820331" y="594.210774" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="466.665769" y="488.908846" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="991.222053" y="573.378175" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="470.070513" y="447.813116" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="814.739486" y="343.585748" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="527.566225" y="688.742342" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="556.57624" y="723.583836" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="1009.407238" y="606.640016" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="670.160635" y="624.283598" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="630.92975" y="496.41591" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="484.147438" y="517.431729" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="546.640758" y="390.331584" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="589.687876" y="388.25179" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="946.223678" y="436.507952" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="524.878269" y="655.757807" style="fill: #e41a1c; stroke: #e41a1c"/>
+     <use xlink:href="#mb9aa5dab14" x="802.268698" y="466.422316" style="fill: #e41a1c; stroke: #e41a1c"/>
+    </g>
+   </g>
+   <g id="PathCollection_2">
+    <defs>
+     <path id="m0fa2a78f8a" d="M 0 3.535534 
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0 
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534 
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5 
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0 
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 
+z
+" style="stroke: #377eb8"/>
+    </defs>
+    <g clip-path="url(#pa8cf324c9b)">
+     <use xlink:href="#m0fa2a78f8a" x="600.917559" y="440.717058" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="975.094317" y="791.013713" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="950.471312" y="782.531127" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="893.791942" y="424.430294" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1020.092693" y="766.635562" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="595.315992" y="647.047433" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="523.431418" y="487.779815" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="904.079182" y="661.917957" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1037.879661" y="761.847085" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="364.330967" y="549.975546" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="843.88224" y="385.627289" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="947.949279" y="629.809906" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1139.092821" y="604.926662" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1048.631485" y="345.219872" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1089.846812" y="720.751355" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="548.638473" y="439.845526" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="816.00714" y="385.924402" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="416.862257" y="705.801601" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1127.478196" y="642.45208" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1116.527264" y="690.232861" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="521.719091" y="464.406897" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1080.953327" y="735.235631" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="931.887912" y="585.589534" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="716.433301" y="271.981428" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="843.484024" y="247.321019" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="357.846688" y="400.284882" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="785.278161" y="262.02813" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="936.467393" y="622.902021" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="426.638453" y="751.621433" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="337.166019" y="470.106522" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="989.961037" y="288.570257" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="516.927229" y="296.839912" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="586.661437" y="664.6514" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="793.401761" y="397.808937" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="786.386528" y="572.481883" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="356.997161" y="508.330156" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="816.737202" y="395.679625" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="463.619418" y="313.874412" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="925.250984" y="591.601128" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="850.585537" y="392.857048" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1054.67109" y="386.617667" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="593.391282" y="296.097129" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="875.009434" y="443.440598" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="336.595243" y="496.584274" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="376.104879" y="561.721427" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="522.966833" y="308.080701" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1069.53781" y="440.107976" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="389.285819" y="359.382275" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="451.288005" y="327.194994" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="573.878712" y="294.066854" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="878.726114" y="793.286631" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="682.166839" y="524.319807" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="952.130544" y="795.039599" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="745.861442" y="820.076352" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="403.482209" y="712.521315" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="896.181237" y="655.218051" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1134.247864" y="589.229173" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="879.987131" y="405.147637" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="791.284581" y="566.62875" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="808.374672" y="246.974386" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="581.531091" y="841.087219" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="410.019583" y="728.610003" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="786.041407" y="250.193115" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="382.695349" y="374.782651" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="631.905379" y="843.855325" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1138.097282" y="633.900167" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="951.533221" y="609.546775" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="969.917513" y="282.479433" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="667.605417" y="844.424792" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="402.280925" y="692.322558" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="625.241902" y="696.917911" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="694.119947" y="829.435423" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="494.885989" y="301.791802" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="594.512923" y="686.291157" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1121.770438" y="650.68212" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="552.01667" y="500.47646" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="535.80929" y="485.69507" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="862.39927" y="255.244042" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="873.814787" y="657.411738" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="345.959949" y="455.488544" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="583.688093" y="649.047997" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="772.913563" y="508.429194" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="872.487402" y="398.502201" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="370.536496" y="387.459488" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="708.084045" y="586.193665" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="716.93107" y="831.658821" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="756.002669" y="267.524727" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="353.054826" y="527.117624" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="795.870698" y="406.707482" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="580.674927" y="672.099042" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1071.197042" y="385.280657" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="431.470137" y="330.95843" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1131.327615" y="662.94795" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1016.309643" y="306.34754" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="680.242129" y="688.509603" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="606.353204" y="840.517751" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="672.622935" y="681.616573" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="629.044862" y="705.687707" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1123.562409" y="564.568764" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="653.170098" y="702.790852" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1032.968334" y="334.523791" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="930.494157" y="793.489658" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="687.044981" y="518.451818" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="575.949434" y="437.4191" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="765.07535" y="504.7747" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="444.31923" y="760.901274" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="897.973207" y="796.386513" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1026.265036" y="320.6585" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="402.134912" y="653.524505" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="740.027582" y="258.413251" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="757.920741" y="808.894986" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="540.548057" y="503.576342" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1101.262329" y="701.508313" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1006.486989" y="779.035093" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="570.294771" y="428.679015" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="887.022275" y="443.207859" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="461.794263" y="788.899257" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="923.459013" y="649.052949" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="534.110237" y="462.911427" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="413.046023" y="339.574718" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1073.387229" y="425.717786" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="547.098706" y="831.28743" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="688.445373" y="840.101793" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="398.922639" y="668.092963" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="935.670961" y="648.736028" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="951.59959" y="274.903043" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="597.950852" y="431.897743" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="936.334654" y="263.414659" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="343.809584" y="424.519428" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="530.360372" y="821.284613" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="450.099995" y="775.222138" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="662.833466" y="698.814485" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="700.252469" y="582.544122" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="600.539254" y="693.689279" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1057.259492" y="754.721316" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1100.797744" y="529.999624" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="488.634002" y="806.191254" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="945.294508" y="601.598993" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1065.82113" y="368.048082" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="609.021249" y="834.070392" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="538.284865" y="444.089295" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="541.38431" y="296.691356" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1118.186497" y="580.325676" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="903.28275" y="253.51088" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="509.062468" y="811.202566" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="343.968871" y="440.702203" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="881.181778" y="424.088614" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="881.579994" y="252.17387" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1069.405072" y="401.473335" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="1111.615937" y="542.235743" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="873.682049" y="648.315117" style="fill: #377eb8; stroke: #377eb8"/>
+     <use xlink:href="#m0fa2a78f8a" x="342.820682" y="513.905984" style="fill: #377eb8; stroke: #377eb8"/>
+    </g>
+   </g>
+   <g id="PathCollection_3">
+    <defs>
+     <path id="medb409181c" d="M 0 3.535534 
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0 
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534 
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5 
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0 
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 
+z
+" style="stroke: #4daf4a"/>
+    </defs>
+    <g clip-path="url(#pa8cf324c9b)">
+     <use xlink:href="#medb409181c" x="387.288103" y="786.873934" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1091.373305" y="311.051835" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="307.532133" y="565.276884" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="966.001725" y="832.743285" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="585.347325" y="886.858523" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1185.352213" y="571.011172" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="989.496452" y="835.803553" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="279.192448" y="453.923747" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="867.310597" y="205.130921" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="717.17" y="219.788514" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="477.895452" y="257.472392" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1051.750842" y="810.593484" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="565.86794" y="249.450331" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="339.402664" y="673.723261" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="351.077021" y="741.707751" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="769.648194" y="860.482284" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="416.868894" y="284.113557" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="713.108199" y="878.320475" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="350.778359" y="718.924108" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="466.659132" y="848.53288" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="904.875613" y="841.0377" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1086.992932" y="794.38595" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="908.924139" y="208.102055" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1162.786656" y="719.61242" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="681.171299" y="889.036364" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1069.205964" y="283.816443" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="510.595599" y="867.764532" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="797.091893" y="201.763636" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1121.704069" y="374.683614" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1199.157025" y="597.340368" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="276.842975" y="507.062472" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1136.172573" y="754.894632" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1169.025369" y="528.018868" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="309.131633" y="371.811518" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="767.856223" y="214.787105" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="332.845378" y="342.644889" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="505.053763" y="258.46277" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1188.006985" y="661.383153" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="283.161331" y="422.132618" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1015.048627" y="247.023905" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1133.119586" y="420.384601" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="410.69655" y="813.757741" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1125.420749" y="356.856812" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="380.44543" y="300.949981" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="290.183202" y="520.417718" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="605.297932" y="885.224399" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="1192.254619" y="657.505824" style="fill: #4daf4a; stroke: #4daf4a"/>
+     <use xlink:href="#medb409181c" x="976.554441" y="229.395179" style="fill: #4daf4a; stroke: #4daf4a"/>
+    </g>
+   </g>
+   <g id="PathCollection_4">
+    <defs>
+     <path id="m799437cb3c" d="M 0 3.535534 
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0 
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534 
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5 
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0 
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 
+z
+" style="stroke: #984ea3"/>
+    </defs>
+    <g clip-path="url(#pa8cf324c9b)">
+     <use xlink:href="#m799437cb3c" x="583.933659" y="794.579074" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="457.453712" y="669.84098" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="1060.113372" y="562.677142" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="961.488613" y="746.511083" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="1025.667713" y="715.373603" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="415.415406" y="527.999061" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="820.984836" y="291.194759" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="963.745169" y="329.968052" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="445.945278" y="377.753785" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="901.291672" y="752.156237" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="1079.094987" y="614.142128" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="1014.185826" y="423.2666" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="712.849359" y="783.655206" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="1006.022404" y="378.546087" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="652.805067" y="799.630001" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="405.38037" y="428.183826" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="468.298453" y="716.819555" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="512.361022" y="763.778322" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="510.044734" y="345.467466" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="396.208135" y="485.605936" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="1068.011317" y="660.442294" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="759.546789" y="305.406681" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="571.648704" y="337.792038" style="fill: #984ea3; stroke: #984ea3"/>
+     <use xlink:href="#m799437cb3c" x="896.77856" y="298.820668" style="fill: #984ea3; stroke: #984ea3"/>
+    </g>
+   </g>
+   <g id="PathCollection_5">
+    <defs>
+     <path id="mb1229112c8" d="M 0 3.535534 
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0 
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534 
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5 
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0 
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 
+z
+" style="stroke: #ff7f00"/>
+    </defs>
+    <g clip-path="url(#pa8cf324c9b)">
+     <use xlink:href="#mb1229112c8" x="837.577157" y="423.885586" style="fill: #ff7f00; stroke: #ff7f00"/>
+     <use xlink:href="#mb1229112c8" x="574.124279" y="469.967869" style="fill: #ff7f00; stroke: #ff7f00"/>
+     <use xlink:href="#mb1229112c8" x="899.632439" y="620.450835" style="fill: #ff7f00; stroke: #ff7f00"/>
+     <use xlink:href="#mb1229112c8" x="634.015922" y="666.746049" style="fill: #ff7f00; stroke: #ff7f00"/>
+    </g>
+   </g>
+   <g id="PathCollection_6">
+    <defs>
+     <path id="m2956082287" d="M 0 3.535534 
+C 0.937635 3.535534 1.836992 3.163008 2.5 2.5 
+C 3.163008 1.836992 3.535534 0.937635 3.535534 0 
+C 3.535534 -0.937635 3.163008 -1.836992 2.5 -2.5 
+C 1.836992 -3.163008 0.937635 -3.535534 0 -3.535534 
+C -0.937635 -3.535534 -1.836992 -3.163008 -2.5 -2.5 
+C -3.163008 -1.836992 -3.535534 -0.937635 -3.535534 0 
+C -3.535534 0.937635 -3.163008 1.836992 -2.5 2.5 
+C -1.836992 3.163008 -0.937635 3.535534 0 3.535534 
+z
+" style="stroke: #ffff33"/>
+    </defs>
+    <g clip-path="url(#pa8cf324c9b)">
+     <use xlink:href="#m2956082287" x="736.675933" y="545.518845" style="fill: #ffff33; stroke: #ffff33"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_2">
+     <path d="M 1204.057812 225.66875 
+L 1289 225.66875 
+Q 1291 225.66875 1291 223.66875 
+L 1291 136.6 
+Q 1291 134.6 1289 134.6 
+L 1204.057812 134.6 
+Q 1202.057812 134.6 1202.057812 136.6 
+L 1202.057812 223.66875 
+Q 1202.057812 225.66875 1204.057812 225.66875 
+z
+" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
+    </g>
+    <g id="PathCollection_7">
+     <g>
+      <use xlink:href="#mb9aa5dab14" x="1216.057812" y="143.573438" style="fill: #e41a1c; stroke: #e41a1c"/>
+     </g>
+    </g>
+    <g id="text_1">
+     <!-- router -->
+     <g transform="translate(1234.057812 146.198438)scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-72"/>
+      <use xlink:href="#DejaVuSans-6f" x="38.863281"/>
+      <use xlink:href="#DejaVuSans-75" x="100.044922"/>
+      <use xlink:href="#DejaVuSans-74" x="163.423828"/>
+      <use xlink:href="#DejaVuSans-65" x="202.632812"/>
+      <use xlink:href="#DejaVuSans-72" x="264.15625"/>
+     </g>
+    </g>
+    <g id="PathCollection_8">
+     <g>
+      <use xlink:href="#m0fa2a78f8a" x="1216.057812" y="158.251563" style="fill: #377eb8; stroke: #377eb8"/>
+     </g>
+    </g>
+    <g id="text_2">
+     <!-- link -->
+     <g transform="translate(1234.057812 160.876563)scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6b" d="M 581 4863 
+L 1159 4863 
+L 1159 1991 
+L 2875 3500 
+L 3609 3500 
+L 1753 1863 
+L 3688 0 
+L 2938 0 
+L 1159 1709 
+L 1159 0 
+L 581 0 
+L 581 4863 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6c"/>
+      <use xlink:href="#DejaVuSans-69" x="27.783203"/>
+      <use xlink:href="#DejaVuSans-6e" x="55.566406"/>
+      <use xlink:href="#DejaVuSans-6b" x="118.945312"/>
+     </g>
+    </g>
+    <g id="PathCollection_9">
+     <g>
+      <use xlink:href="#medb409181c" x="1216.057812" y="172.929688" style="fill: #4daf4a; stroke: #4daf4a"/>
+     </g>
+    </g>
+    <g id="text_3">
+     <!-- cpu -->
+     <g transform="translate(1234.057812 175.554688)scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-70" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-75" x="118.457031"/>
+     </g>
+    </g>
+    <g id="PathCollection_10">
+     <g>
+      <use xlink:href="#m799437cb3c" x="1216.057812" y="187.607813" style="fill: #984ea3; stroke: #984ea3"/>
+     </g>
+    </g>
+    <g id="text_4">
+     <!-- node -->
+     <g transform="translate(1234.057812 190.232813)scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-64" d="M 2906 2969 
+L 2906 4863 
+L 3481 4863 
+L 3481 0 
+L 2906 0 
+L 2906 525 
+Q 2725 213 2448 61 
+Q 2172 -91 1784 -91 
+Q 1150 -91 751 415 
+Q 353 922 353 1747 
+Q 353 2572 751 3078 
+Q 1150 3584 1784 3584 
+Q 2172 3584 2448 3432 
+Q 2725 3281 2906 2969 
+z
+M 947 1747 
+Q 947 1113 1208 752 
+Q 1469 391 1925 391 
+Q 2381 391 2643 752 
+Q 2906 1113 2906 1747 
+Q 2906 2381 2643 2742 
+Q 2381 3103 1925 3103 
+Q 1469 3103 1208 2742 
+Q 947 2381 947 1747 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-6e"/>
+      <use xlink:href="#DejaVuSans-6f" x="63.378906"/>
+      <use xlink:href="#DejaVuSans-64" x="124.560547"/>
+      <use xlink:href="#DejaVuSans-65" x="188.037109"/>
+     </g>
+    </g>
+    <g id="PathCollection_11">
+     <g>
+      <use xlink:href="#mb1229112c8" x="1216.057812" y="202.285938" style="fill: #ff7f00; stroke: #ff7f00"/>
+     </g>
+    </g>
+    <g id="text_5">
+     <!-- supernode -->
+     <g transform="translate(1234.057812 204.910938)scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-73"/>
+      <use xlink:href="#DejaVuSans-75" x="52.099609"/>
+      <use xlink:href="#DejaVuSans-70" x="115.478516"/>
+      <use xlink:href="#DejaVuSans-65" x="178.955078"/>
+      <use xlink:href="#DejaVuSans-72" x="240.478516"/>
+      <use xlink:href="#DejaVuSans-6e" x="279.841797"/>
+      <use xlink:href="#DejaVuSans-6f" x="343.220703"/>
+      <use xlink:href="#DejaVuSans-64" x="404.402344"/>
+      <use xlink:href="#DejaVuSans-65" x="467.878906"/>
+     </g>
+    </g>
+    <g id="PathCollection_12">
+     <g>
+      <use xlink:href="#m2956082287" x="1216.057812" y="216.964063" style="fill: #ffff33; stroke: #ffff33"/>
+     </g>
+    </g>
+    <g id="text_6">
+     <!-- cluster -->
+     <g transform="translate(1234.057812 219.589063)scale(0.1 -0.1)">
+      <use xlink:href="#DejaVuSans-63"/>
+      <use xlink:href="#DejaVuSans-6c" x="54.980469"/>
+      <use xlink:href="#DejaVuSans-75" x="82.763672"/>
+      <use xlink:href="#DejaVuSans-73" x="146.142578"/>
+      <use xlink:href="#DejaVuSans-74" x="198.242188"/>
+      <use xlink:href="#DejaVuSans-65" x="237.451172"/>
+      <use xlink:href="#DejaVuSans-72" x="298.974609"/>
+     </g>
+    </g>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="pa8cf324c9b">
+   <rect x="180" y="129.6" width="1116" height="831.6"/>
+  </clipPath>
+ </defs>
+</svg>
index 11a0a10..4065548 100644 (file)
@@ -59,6 +59,7 @@ set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/energy/energy.tes
                                    ${CMAKE_CURRENT_SOURCE_DIR}/trace_simple/trace_simple.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/trace_call_location/trace_call_location.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/ampi_test/ampi_test.tesh
+                                   ${CMAKE_CURRENT_SOURCE_DIR}/mc/only_send_deterministic.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/mc/sendsend.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/replay/replay-override-replayer.tesh
                                    ${CMAKE_CURRENT_SOURCE_DIR}/replay/replay.tesh                          PARENT_SCOPE)
index 47cbe7c..59dfd0a 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <xbt/base.h>
 #include <xbt/sysdep.h>
+#include <xbt/utility.hpp>
 
 namespace simgrid {
 namespace config {
@@ -221,13 +222,13 @@ public:
    *  @param desc  Flag description
    *  @param value Flag initial/default value
    */
-  Flag(const char* name, const char* desc, T value) : value_(value), name_(name)
+  Flag(const char* name, const char* desc, xbt::type_identity_t<T> value) : value_(value), name_(name)
   {
     simgrid::config::bind_flag(value_, name, desc);
   }
 
   /** Constructor taking also an array of aliases for name */
-  Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value)
+  Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, xbt::type_identity_t<T> value)
       : value_(value), name_(name)
   {
     simgrid::config::bind_flag(value_, name, aliases, desc);
@@ -236,13 +237,15 @@ public:
   /* A constructor accepting a callback that will be passed the parameter.
    * It can either return a boolean (informing whether the parameter is valid), or returning void.
    */
-  template <class F> Flag(const char* name, const char* desc, T value, F callback) : value_(value), name_(name)
+  template <class F>
+  Flag(const char* name, const char* desc, xbt::type_identity_t<T> value, F callback) : value_(value), name_(name)
   {
     simgrid::config::bind_flag(value_, name, desc, std::move(callback));
   }
 
   template <class F>
-  Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value, F callback)
+  Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, xbt::type_identity_t<T> value,
+       F callback)
       : value_(value), name_(name)
   {
     simgrid::config::bind_flag(value_, name, aliases, desc, std::move(callback));
@@ -252,8 +255,8 @@ public:
    * and producing an informative error message when an invalid value is passed, or when help is passed as a value.
    */
   template <class F>
-  Flag(const char* name, const char* desc, T value, const std::map<std::string, std::string, std::less<>>& valid_values,
-       F callback)
+  Flag(const char* name, const char* desc, xbt::type_identity_t<T> value,
+       const std::map<std::string, std::string, std::less<>>& valid_values, F callback)
       : value_(value), name_(name)
   {
     simgrid::config::bind_flag(value_, name, desc, valid_values, std::move(callback));
@@ -261,7 +264,7 @@ public:
 
   /* A constructor with everything */
   template <class F>
-  Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, T value,
+  Flag(const char* name, std::initializer_list<const char*> aliases, const char* desc, xbt::type_identity_t<T> value,
        const std::map<std::string, std::string, std::less<>>& valid_values, F callback)
       : value_(value), name_(name)
   {
index d0d7302..0345806 100644 (file)
@@ -10,6 +10,7 @@
 #include <array>
 #include <functional>
 #include <tuple>
+#include <type_traits>
 #include <xbt/base.h>
 
 /** @brief Helper macro to declare enum class
 namespace simgrid {
 namespace xbt {
 
+/** @brief Replacement for C++20's std::type_identity_t
+ */
+#if __cplusplus >= 201806L // __cpp_lib_type_identity
+template <class T> using type_identity_t = typename std::type_identity_t<T>;
+#else
+template <class T> struct type_identity {
+  using type = T;
+};
+
+template <class T> using type_identity_t = typename type_identity<T>::type;
+#endif
+
 /** @brief A hash which works with more stuff
  *
  *  It can hash pairs: the standard hash currently doesn't include this.
index 4217481..58dccdb 100644 (file)
@@ -585,6 +585,8 @@ double EngineImpl::solve(double max_date) const
     XBT_DEBUG("Updating models (min = %g, NOW = %g, next_event_date = %g)", time_delta, now_, next_event_date);
 
     while (auto* event = profile::future_evt_set.pop_leq(next_event_date, &value, &resource)) {
+      if(value<0)
+             continue;
       if (resource->is_used() || (watched_hosts().find(resource->get_cname()) != watched_hosts().end())) {
         time_delta = next_event_date - now_;
         XBT_DEBUG("This event invalidates the next_occurring_event() computation of models. Next event set to %f",
index 68defdb..f3dca0b 100644 (file)
@@ -24,11 +24,12 @@ XBT_DECLARE_ENUM_CLASS(State, WAITING, READY, RUNNING, DONE, CANCELED, FAILED, S
 
 class XBT_PUBLIC ActivityImpl {
   std::atomic_int_fast32_t refcount_{0};
-  std::string name_ = "";
+  std::string name_        = "";
   actor::ActorImpl* actor_ = nullptr;
   State state_             = State::WAITING; /* State of the activity */
   double start_time_       = -1.0;
   double finish_time_      = -1.0;
+  std::vector<s4u::Host*> hosts_;
 
 public:
   virtual ~ActivityImpl();
@@ -45,6 +46,9 @@ protected:
     name_ = name;
   }
   void set_start_time(double start_time) { start_time_ = start_time; }
+  void clear_hosts() { hosts_.clear(); }
+  void add_host(s4u::Host* host) { hosts_.push_back(host); }
+  void set_hosts(const std::vector<s4u::Host*>& hosts) { hosts_ = hosts; }
 
 public:
   const std::string& get_name() const { return name_; }
@@ -81,6 +85,9 @@ public:
   virtual void finish() = 0; // Unlock all simcalls blocked on that activity, either because it was marked as done by
                              // the model or because it terminated without waiting for the model
 
+  s4u::Host* get_host() const { return hosts_.front(); }
+  const std::vector<s4u::Host*>& get_hosts() const { return hosts_; };
+
   void register_simcall(actor::Simcall* simcall);
   void unregister_simcall(actor::Simcall* simcall);
   void handle_activity_waitany(actor::Simcall* simcall);
index 0dc962a..e027255 100644 (file)
@@ -11,6 +11,7 @@
 #define SIMIX_H_NO_DEPRECATED_WARNING // avoid deprecation warning on include (remove with XBT_ATTRIB_DEPRECATED_v333)
 #include <simgrid/simix.h>
 
+#include "src/kernel/EngineImpl.hpp"
 #include "src/kernel/activity/CommImpl.hpp"
 #include "src/kernel/activity/MailboxImpl.hpp"
 #include "src/kernel/actor/SimcallObserver.hpp"
@@ -61,13 +62,17 @@ CommImpl& CommImpl::set_type(CommImplType type)
 
 CommImpl& CommImpl::set_source(s4u::Host* from)
 {
+  xbt_assert( from_ == nullptr );
   from_ = from;
+  add_host(from);
   return *this;
 }
 
 CommImpl& CommImpl::set_destination(s4u::Host* to)
 {
+  xbt_assert( to_ == nullptr );
   to_ = to;
+  add_host(to_);
   return *this;
 }
 
@@ -107,6 +112,7 @@ CommImpl& CommImpl::set_dst_buff(unsigned char* buff, size_t* size)
 CommImpl& CommImpl::detach()
 {
   detached_ = true;
+  EngineImpl::get_instance()->get_maestro()->activities_.emplace_back(this);
   return *this;
 }
 
index 4b2ad5c..32bbd8a 100644 (file)
@@ -31,20 +31,20 @@ ExecImpl::ExecImpl()
 
 ExecImpl& ExecImpl::set_host(s4u::Host* host)
 {
-  hosts_.assign(1, host);
+  ActivityImpl::set_hosts({host});
   return *this;
 }
 
 ExecImpl& ExecImpl::set_hosts(const std::vector<s4u::Host*>& hosts)
 {
-  hosts_ = hosts;
+  ActivityImpl::set_hosts(hosts);
   return *this;
 }
 
 ExecImpl& ExecImpl::set_timeout(double timeout)
 {
   if (timeout >= 0 && not MC_is_active() && not MC_record_replay_is_active()) {
-    timeout_detector_.reset(hosts_.front()->get_cpu()->sleep(timeout));
+    timeout_detector_.reset(get_host()->get_cpu()->sleep(timeout));
     timeout_detector_->set_activity(this);
   }
   return *this;
@@ -79,19 +79,19 @@ ExecImpl* ExecImpl::start()
 {
   set_state(State::RUNNING);
   if (not MC_is_active() && not MC_record_replay_is_active()) {
-    if (hosts_.size() == 1) {
+    if (get_hosts().size() == 1) {
       if (thread_count_ == 1) {
-        surf_action_ = hosts_.front()->get_cpu()->execution_start(flops_amounts_.front(), bound_);
+        surf_action_ = get_host()->get_cpu()->execution_start(flops_amounts_.front(), bound_);
         surf_action_->set_sharing_penalty(sharing_penalty_);
       } else {
-        auto host_model = hosts_.front()->get_netpoint()->get_englobing_zone()->get_host_model();
-        surf_action_    = host_model->execute_thread(hosts_.front(), flops_amounts_.front(), thread_count_);
+        auto host_model = get_host()->get_netpoint()->get_englobing_zone()->get_host_model();
+        surf_action_    = host_model->execute_thread(get_host(), flops_amounts_.front(), thread_count_);
       }
       surf_action_->set_category(get_tracing_category());
     } else {
       // get the model from first host since we have only 1 by now
-      auto host_model = hosts_.front()->get_netpoint()->get_englobing_zone()->get_host_model();
-      surf_action_    = host_model->execute_parallel(hosts_, flops_amounts_.data(), bytes_amounts_.data(), -1);
+      auto host_model = get_host()->get_netpoint()->get_englobing_zone()->get_host_model();
+      surf_action_    = host_model->execute_parallel(get_hosts(), flops_amounts_.data(), bytes_amounts_.data(), -1);
     }
     surf_action_->set_activity(this);
     set_start_time(surf_action_->get_start_time());
@@ -145,7 +145,8 @@ ExecImpl& ExecImpl::update_sharing_penalty(double sharing_penalty)
 void ExecImpl::post()
 {
   xbt_assert(surf_action_ != nullptr);
-  if (std::any_of(hosts_.begin(), hosts_.end(), [](const s4u::Host* host) { return not host->is_on(); })) {
+  if (auto const& hosts = get_hosts();
+      std::any_of(hosts.begin(), hosts.end(), [](const s4u::Host* host) { return not host->is_on(); })) {
     /* If one of the hosts running the synchro failed, notice it. This way, the asking
      * process can be killed if it runs on that host itself */
     set_state(State::FAILED);
@@ -223,7 +224,7 @@ void ExecImpl::finish()
 
 void ExecImpl::reset()
 {
-  hosts_.clear();
+  clear_hosts();
   bytes_amounts_.clear();
   flops_amounts_.clear();
   set_start_time(-1.0);
index 079402b..22dfb5c 100644 (file)
@@ -18,7 +18,6 @@ class XBT_PUBLIC ExecImpl : public ActivityImpl_T<ExecImpl> {
       nullptr, [](resource::Action* a) { a->unref(); }};
   double sharing_penalty_             = 1.0;
   double bound_                       = 0.0;
-  std::vector<s4u::Host*> hosts_;
   std::vector<double> flops_amounts_;
   std::vector<double> bytes_amounts_;
   int thread_count_ = 1;
@@ -36,15 +35,13 @@ public:
 
   ExecImpl& set_flops_amount(double flop_amount);
   ExecImpl& set_host(s4u::Host* host);
-  s4u::Host* get_host() const { return hosts_.front(); }
-  const std::vector<s4u::Host*>& get_hosts() const { return hosts_; }
 
   ExecImpl& set_flops_amounts(const std::vector<double>& flops_amounts);
   ExecImpl& set_bytes_amounts(const std::vector<double>& bytes_amounts);
   ExecImpl& set_thread_count(int thread_count);
   ExecImpl& set_hosts(const std::vector<s4u::Host*>& hosts);
 
-  unsigned int get_host_number() const { return static_cast<unsigned>(hosts_.size()); }
+  unsigned int get_host_number() const { return static_cast<unsigned>(get_hosts().size()); }
   double get_seq_remaining_ratio();
   double get_par_remaining_ratio();
   double get_remaining() const override;
index c9d8c45..7ee160c 100644 (file)
@@ -4,6 +4,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "src/kernel/activity/MailboxImpl.hpp"
+#include "simgrid/msg.h"
 #include "src/kernel/activity/CommImpl.hpp"
 
 #include <unordered_map>
@@ -20,7 +21,7 @@ unsigned MailboxImpl::next_id_ = 0;
 
 MailboxImpl::~MailboxImpl()
 {
-  clear();
+  clear(false);
   set_receiver(nullptr);
 }
 
@@ -67,23 +68,28 @@ void MailboxImpl::remove(const CommImplPtr& comm)
 
 /** @brief Removes all communication activities from a mailbox
  */
-void MailboxImpl::clear()
+void MailboxImpl::clear( bool do_post )
 {
+  // CommImpl::cancel() will remove the comm from the mailbox..
   for (auto comm : done_comm_queue_) {
     comm->cancel();
-    comm->set_state(State::DST_HOST_FAILURE);
+    comm->set_state(State::FAILED);
+    if(do_post)
+      comm->post();
   }
   done_comm_queue_.clear();
 
-  // CommImpl::cancel() will remove the comm from the mailbox..
   while (not comm_queue_.empty()) {
     auto comm = comm_queue_.back();
     if (comm->get_state() == State::WAITING && not comm->is_detached()) {
       comm->cancel();
-      comm->set_state(State::DST_HOST_FAILURE);
+      comm->set_state(State::FAILED);
+      if(do_post)
+        comm->post();
     } else
       comm_queue_.pop_back();
   }
+  xbt_assert(comm_queue_.empty() && done_comm_queue_.empty());
 }
 
 CommImplPtr MailboxImpl::iprobe(int type, const std::function<bool(void*, void*, CommImpl*)>& match_fun, void* data)
index 1c7b311..353b963 100644 (file)
@@ -54,7 +54,7 @@ public:
   void push(CommImplPtr comm);
   void push_done(CommImplPtr done_comm) { done_comm_queue_.push_back(done_comm); }
   void remove(const CommImplPtr& comm);
-  void clear();
+  void clear(bool do_post );
   CommImplPtr iprobe(int type, const std::function<bool(void*, void*, CommImpl*)>& match_fun, void* data);
   CommImplPtr find_matching_comm(CommImplType type, const std::function<bool(void*, void*, CommImpl*)>& match_fun,
                                  void* this_user_data, const CommImplPtr& my_synchro, bool done, bool remove_matching);
index bbfb98d..038a0ea 100644 (file)
@@ -213,7 +213,7 @@ public:
     }
   }
 
-  std::vector<StochasticDatedValue> get_pattern() { return pattern; } 
+  std::vector<StochasticDatedValue> get_pattern() const { return pattern; }
 };
 
 Profile* ProfileBuilder::from_string(const std::string& name, const std::string& input, double periodicity)
index 2f02a1a..4534368 100644 (file)
@@ -46,8 +46,8 @@ Route* RoutedZone::new_extended_route(RoutingMode hierarchy, NetPoint* gw_src, N
 
 void RoutedZone::get_route_check_params(const NetPoint* src, const NetPoint* dst) const
 {
-  xbt_assert(src, "Cannot find a route from nullptr to %s", dst->get_cname());
-  xbt_assert(dst, "Cannot find a route from %s to nullptr", src->get_cname());
+  xbt_assert(src, "Cannot have a route with (nullptr) source");
+  xbt_assert(dst, "Cannot have a route with (nullptr) destination");
 
   const NetZoneImpl* src_as = src->get_englobing_zone();
   const NetZoneImpl* dst_as = dst->get_englobing_zone();
@@ -61,16 +61,16 @@ void RoutedZone::get_route_check_params(const NetPoint* src, const NetPoint* dst
              "%s@%s). Please report that bug.",
              src->get_cname(), dst->get_cname(), src_as->get_cname(), dst_as->get_cname(), get_cname());
 }
+
 void RoutedZone::add_route_check_params(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst,
                                         const std::vector<s4u::LinkInRoute>& link_list, bool symmetrical) const
 {
+  get_route_check_params(src, dst);
   const char* srcName = src->get_cname();
   const char* dstName = dst->get_cname();
 
   if (not gw_dst || not gw_src) {
     XBT_DEBUG("Load Route from \"%s\" to \"%s\"", srcName, dstName);
-    xbt_assert(src, "Cannot add a route from %s to %s: %s does not exist.", srcName, dstName, srcName);
-    xbt_assert(dst, "Cannot add a route from %s to %s: %s does not exist.", srcName, dstName, dstName);
     xbt_assert(not link_list.empty(), "Empty route (between %s and %s) forbidden.", srcName, dstName);
     xbt_assert(not src->is_netzone(),
                "When defining a route, src cannot be a netzone such as '%s'. Did you meant to have a NetzoneRoute?",
index 9b41ff6..3fb8ced 100644 (file)
@@ -56,8 +56,6 @@ Transition* deserialize_transition(aid_t issuer, int times_considered, std::stri
 #if SIMGRID_HAVE_MC
   short type;
   xbt_assert(stream >> type);
-  xbt_assert(type >= 0 && type <= static_cast<short>(Transition::Type::UNKNOWN), "Invalid transition type %d received",
-             type);
 
   switch (auto simcall = static_cast<Transition::Type>(type)) {
     case Transition::Type::BARRIER_LOCK:
@@ -95,8 +93,11 @@ Transition* deserialize_transition(aid_t issuer, int times_considered, std::stri
 
     case Transition::Type::UNKNOWN:
       return new Transition(Transition::Type::UNKNOWN, issuer, times_considered);
+
+    default:
+      break;
   }
-  THROW_IMPOSSIBLE; // Some compilers don't detect that each branch of the above switch has a return
+  xbt_die("Invalid transition type %d received", type);
 #else
   xbt_die("Deserializing transitions is only interesting in MC mode.");
 #endif
index 7a26692..4621305 100644 (file)
@@ -136,7 +136,7 @@ Mailbox::iprobe(int type, const std::function<bool(void*, void*, kernel::activit
 
 void Mailbox::clear()
 {
-  kernel::actor::simcall_answered([this]() { this->pimpl_->clear(); });
+  kernel::actor::simcall_answered([this]() { this->pimpl_->clear(true); });
 }
 
 } // namespace simgrid::s4u
index 5e7d0da..ef5b9f6 100644 (file)
@@ -95,13 +95,10 @@ void HostImpl::turn_off(const actor::ActorImpl* issuer)
     issuer->kill(&actor);
   }
   for (const auto& activity : EngineImpl::get_instance()->get_maestro()->activities_) {
-    auto* exec = dynamic_cast<activity::ExecImpl*>(activity.get());
-    if (exec != nullptr) {
-      auto hosts = exec->get_hosts();
-      if (std::find(hosts.begin(), hosts.end(), &piface_) != hosts.end()) {
-        exec->cancel();
-        exec->set_state(activity::State::FAILED);
-      }
+    auto const& hosts = activity->get_hosts();
+    if (std::find(hosts.begin(), hosts.end(), &piface_) != hosts.end()) {
+      activity->cancel();
+      activity->set_state(activity::State::FAILED);
     }
   }
   // When a host is turned off, we want to keep only the actors that should restart for when it will boot again.
index d135bb5..f478b5a 100644 (file)
@@ -16,7 +16,7 @@ namespace simgrid::xbt {
 static std::ifstream action_fs;
 
 std::unordered_map<std::string, action_fun> action_funs;
-static std::unordered_map<std::string, std::queue<ReplayAction*>> action_queues;
+static std::unordered_map<std::string, std::queue<std::unique_ptr<ReplayAction>>> action_queues;
 
 static void read_and_trim_line(std::ifstream& fs, std::string* line)
 {
@@ -50,12 +50,12 @@ bool ReplayReader::get(ReplayAction* action)
   return not fs.eof();
 }
 
-static ReplayAction* get_action(const char* name)
+static std::unique_ptr<ReplayAction> get_action(const char* name)
 {
   if (auto queue_elt = action_queues.find(std::string(name)); queue_elt != action_queues.end()) {
     if (auto& my_queue = queue_elt->second; not my_queue.empty()) {
       // Get something from my queue and return it
-      ReplayAction* action = my_queue.front();
+      auto action = std::move(my_queue.front());
       my_queue.pop();
       return action;
     }
@@ -69,7 +69,7 @@ static ReplayAction* get_action(const char* name)
     if (action_fs.eof())
       break;
     /* we cannot split in place here because we parse&store several lines for the colleagues... */
-    auto* action = new ReplayAction();
+    auto action = std::make_unique<ReplayAction>();
     boost::split(*action, action_line, boost::is_any_of(" \t"), boost::token_compress_on);
 
     // if it's for me, I'm done
@@ -78,7 +78,7 @@ static ReplayAction* get_action(const char* name)
       return action;
 
     // else, I have to store it for the relevant colleague
-    action_queues[evtname].push(action);
+    action_queues[evtname].emplace(std::move(action));
   }
   // end of file reached while searching in vain for more work
 
@@ -114,11 +114,10 @@ int replay_runner(const char* actor_name, const char* trace_filename)
                "Passing nullptr to replay_runner() means that you want to use a shared trace, but you did not provide "
                "any. Please use xbt_replay_set_tracefile().");
     while (true) {
-      simgrid::xbt::ReplayAction* evt = simgrid::xbt::get_action(actor_name);
+      auto evt = simgrid::xbt::get_action(actor_name);
       if (not evt)
         break;
       simgrid::xbt::handle_action(*evt);
-      delete evt;
     }
     action_queues.erase(actor_name_string);
   } else { // Should have got my trace file in argument
index ac3d01a..bc7a813 100644 (file)
@@ -6,7 +6,7 @@ endforeach()
 
 foreach(x actor actor-autorestart actor-suspend
         activity-lifecycle
-        comm-get-sender comm-pt2pt wait-all-for wait-any-for
+        comm-get-sender comm-pt2pt comm-fault-scenarios wait-all-for wait-any-for
         cloud-interrupt-migration cloud-two-execs
        monkey-masterworkers monkey-semaphore
         concurrent_rw
@@ -45,7 +45,7 @@ foreach(x actor actor-autorestart actor-suspend activity-lifecycle comm-get-send
   ADD_TESH_FACTORIES(tesh-s4u-${x} "*" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x} --setenv platfdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/teshsuite/s4u/${x} ${CMAKE_HOME_DIRECTORY}/teshsuite/s4u/${x}/${x}.tesh)
 endforeach()
 
-foreach(x basic-link-test basic-parsing-test host-on-off host-on-off-actors host-on-off-recv host-multicore-speed-file is-router listen_async
+foreach(x basic-link-test basic-parsing-test host-on-off host-on-off-actors host-on-off-recv comm-fault-scenarios host-multicore-speed-file is-router listen_async
         monkey-masterworkers monkey-semaphore
         pid storage_client_server trace-integration seal-platform issue71)
   set(tesh_files    ${tesh_files}    ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh)
diff --git a/teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.cpp b/teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.cpp
new file mode 100644 (file)
index 0000000..6f674fa
--- /dev/null
@@ -0,0 +1,710 @@
+/* Copyright (c) 2010-2022. The SimGrid Team. All rights reserved.          */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+/* This example validates the behaviour in presence of node and link fault.
+ * Each test scenario consists in one host/actor (named sender) sending one message to another host/actor.
+ * The space to cover is quite large, since we consider:
+ * * communication types (eager, rendez-vous, one-sided=detached)
+ * * use type (synchronous, asynchronous, init)
+ * * fault type (sender node, link, receiver node)
+ * * any legal permutation of the scenario steps
+ *
+ * This program also presents a way to simulate applications that are resilient to links and node faults.
+ * Essentially, it catches exceptions related to communications and it clears the mailboxes when one of the nodes gets
+ * turned off. However, this model would suppose that there would be 2 mailboxes for each pair of nodes, which is
+ * probably unacceptable.
+ *
+ */
+
+#include <algorithm>
+#include <random>
+#include <simgrid/kernel/ProfileBuilder.hpp>
+#include <simgrid/s4u.hpp>
+#include <sstream>
+#include <time.h>
+#include <vector>
+
+namespace sg4 = simgrid::s4u;
+namespace pr  = simgrid::kernel::profile;
+
+XBT_LOG_NEW_DEFAULT_CATEGORY(comm_fault_scenarios, "Messages specific for this s4u example");
+
+/*************************************************************************************************/
+
+// Constants for platform configuration
+constexpr double HostComputePower = 1e9;  // FLOPs
+constexpr double LinkBandwidth    = 1e9;  // Bytes/second
+constexpr double LinkLatency      = 1e-6; // Seconds
+
+// Constants for application behaviour
+constexpr auto MsgSize = static_cast<uint64_t>(LinkBandwidth / 2);
+
+/*************************************************************************************************/
+
+XBT_DECLARE_ENUM_CLASS(CommType, EAGER_SYNC, EAGER_ASYNC, EAGER_INIT, RDV_SYNC, RDV_ASYNC, RDV_INIT, ONESIDE_SYNC,
+                       ONESIDE_ASYNC
+                       // ONESIDE_INIT is equivalent to ONESIDE_ASYNC
+);
+
+XBT_DECLARE_ENUM_CLASS(Action, SLEEP, PUT, GET, START, WAIT, DIE, END);
+
+struct Step {
+  XBT_DECLARE_ENUM_CLASS(Type, STATE, ACTION);
+  XBT_DECLARE_ENUM_CLASS(Entity, LNK, SND, RCV);
+
+  double rel_time; // Time relative to Scenario startTime
+  Type type;
+  Entity entity;
+  Action action_type;
+  bool new_state;
+};
+
+struct Scenario {
+  CommType type;
+  double start_time;
+  double duration;
+  Action snd_expected;
+  Action rcv_expected;
+  std::vector<Step> steps;
+  int index;
+};
+
+static std::string to_string(const Scenario& s)
+{
+  std::stringstream ss;
+  ss << "#" << s.index << "[" << s.start_time << "s," << s.start_time + s.duration << "s[: (" << to_c_str(s.type);
+  ss << ") Expected: S:" << to_c_str(s.snd_expected) << " R:" << to_c_str(s.rcv_expected) << " Steps: ";
+  for (const Step& step : s.steps) {
+    ss << "+" << step.rel_time << "s:" << Step::to_c_str(step.entity);
+
+    if (step.type == Step::Type::STATE) {
+      ss << "->";
+      if (step.new_state)
+        ss << "ON";
+      else
+        ss << "OFF";
+    } else {
+      ss << "." << to_c_str(step.action_type);
+    }
+    ss << " ";
+  }
+  return ss.str();
+}
+
+struct MBoxes {
+  sg4::Mailbox* eager;
+  sg4::Mailbox* rdv;
+};
+
+struct ScenarioContext {
+  int index;
+  int active;
+  double start_time;
+  std::stringstream sender_profile;
+  std::stringstream receiver_profile;
+  std::stringstream link_profile;
+  std::vector<int> active_indices;
+  std::vector<Scenario> scenarios;
+};
+
+class SendAgent {
+  static int run_;
+  static size_t scenario_;
+  int id_;
+  sg4::Host* other_host_;
+  const MBoxes& mbox_;
+  const ScenarioContext& ctx_;
+
+  sg4::CommPtr do_put(CommType type, double& send_value) const
+  {
+    switch (type) {
+      case CommType::EAGER_SYNC:
+        mbox_.eager->put(&send_value, MsgSize);
+        return nullptr;
+      case CommType::EAGER_ASYNC:
+        return mbox_.eager->put_async(&send_value, MsgSize);
+      case CommType::EAGER_INIT:
+        return mbox_.eager->put_init(&send_value, MsgSize);
+      case CommType::RDV_SYNC:
+        mbox_.rdv->put(&send_value, MsgSize);
+        return nullptr;
+      case CommType::RDV_ASYNC:
+        return mbox_.rdv->put_async(&send_value, MsgSize);
+      case CommType::RDV_INIT:
+        return mbox_.rdv->put_init(&send_value, MsgSize);
+      case CommType::ONESIDE_SYNC:
+        sg4::Comm::sendto(sg4::this_actor::get_host(), other_host_, MsgSize);
+        return nullptr;
+      case CommType::ONESIDE_ASYNC:
+        return sg4::Comm::sendto_async(sg4::this_actor::get_host(), other_host_, MsgSize);
+      default:
+        break;
+    }
+    DIE_IMPOSSIBLE;
+  }
+
+  void send_message(const Scenario& s) const
+  {
+    std::string scenario_string = to_string(s);
+    XBT_DEBUG("Will try: %s", scenario_string.c_str());
+    double send_value;
+    sg4::CommPtr comm = nullptr;
+    Action expected   = s.snd_expected;
+    double end_time   = s.start_time + s.duration;
+    send_value        = end_time;
+    size_t step_index = 0;
+    sg4::this_actor::sleep_until(s.start_time);
+    // Make sure we have a clean slate
+    xbt_assert(not mbox_.eager->listen(), "Eager mailbox should be empty when starting a test");
+    xbt_assert(not mbox_.rdv->listen(), "RDV mailbox should be empty when starting a test");
+    for (; step_index < s.steps.size(); step_index++) {
+      const Step& step = s.steps[step_index];
+      if (step.entity != Step::Entity::SND || step.type != Step::Type::ACTION)
+        continue;
+      try {
+        sg4::this_actor::sleep_until(s.start_time + step.rel_time);
+      } catch (const simgrid::Exception& e) {
+        XBT_DEBUG("During Sleep, failed to send message because of a %s exception (%s)", typeid(e).name(), e.what());
+        break;
+      }
+      // Check if the other host is still OK.
+      if (not other_host_->is_on())
+        break;
+      // Perform the action
+      try {
+        switch (step.action_type) {
+          case Action::PUT:
+            comm = do_put(s.type, send_value);
+            break;
+          case Action::START:
+            comm->start();
+            break;
+          case Action::WAIT:
+            comm->wait();
+            break;
+          default:
+            xbt_die("Not a valid action for SND");
+        }
+      } catch (const simgrid::Exception& e) {
+        XBT_DEBUG("During %s, failed to send message because of a %s exception (%s)", to_c_str(step.action_type),
+                  typeid(e).name(), e.what());
+        break;
+      }
+    }
+    try {
+      sg4::this_actor::sleep_until(end_time);
+    } catch (const simgrid::Exception& e) {
+      XBT_DEBUG("During Sleep, failed to send message because of a %s exception (%s)", typeid(e).name(), e.what());
+    }
+    Action outcome = Action::END;
+    if (step_index < s.steps.size()) {
+      const Step& step = s.steps[step_index];
+      assert(step.entity == Step::Entity::SND && step.type == Step::Type::ACTION);
+      outcome = step.action_type;
+    }
+    if (outcome != expected) {
+      XBT_ERROR("Expected %s but got %s in %s", to_c_str(expected), to_c_str(outcome), scenario_string.c_str());
+    } else {
+      XBT_DEBUG("OK: %s", scenario_string.c_str());
+    }
+    sg4::this_actor::sleep_until(end_time);
+    xbt_assert(not mbox_.eager->listen(), "Mailbox should not have ongoing communication!");
+    xbt_assert(not mbox_.rdv->listen(), "Mailbox should not have ongoing communication!");
+  }
+
+public:
+  explicit SendAgent(int id, sg4::Host* other_host, const MBoxes& mbox, const ScenarioContext& ctx)
+      : id_(id), other_host_(other_host), mbox_(mbox), ctx_(ctx)
+  {
+  }
+
+  void operator()() const
+  {
+    run_++;
+    XBT_DEBUG("Host %i starts run %i and scenario %zu.", id_, run_, scenario_);
+    while (scenario_ < ctx_.scenarios.size()) {
+      const Scenario& s = ctx_.scenarios[scenario_];
+      scenario_++;
+      send_message(s);
+    }
+  }
+};
+
+int SendAgent::run_         = 0;
+size_t SendAgent::scenario_ = 0;
+
+/*************************************************************************************************/
+
+class ReceiveAgent {
+  static int run_;
+  static size_t scenario_;
+  int id_;
+  sg4::Host* other_host_;
+  const MBoxes& mbox_;
+  const ScenarioContext& ctx_;
+
+  sg4::CommPtr do_get(CommType type, double*& receive_ptr) const
+  {
+    switch (type) {
+      case CommType::EAGER_SYNC:
+        receive_ptr = mbox_.eager->get<double>();
+        return nullptr;
+      case CommType::EAGER_ASYNC:
+        return mbox_.eager->get_async(&receive_ptr);
+      case CommType::EAGER_INIT:
+        return mbox_.eager->get_init()->set_dst_data((void**)(&receive_ptr));
+      case CommType::RDV_SYNC:
+        receive_ptr = mbox_.rdv->get<double>();
+        return nullptr;
+      case CommType::RDV_ASYNC:
+        return mbox_.rdv->get_async(&receive_ptr);
+      case CommType::RDV_INIT:
+        return mbox_.rdv->get_init()->set_dst_data((void**)(&receive_ptr));
+      case CommType::ONESIDE_SYNC:
+      case CommType::ONESIDE_ASYNC:
+        xbt_die("No get in One Sided comunications!");
+      default:
+        break;
+    }
+    DIE_IMPOSSIBLE;
+  }
+
+  void receive_message(const Scenario& s) const
+  {
+    sg4::CommPtr comm   = nullptr;
+    CommType type       = s.type;
+    Action expected     = s.rcv_expected;
+    double end_time     = s.start_time + s.duration;
+    double* receive_ptr = nullptr;
+    size_t step_index   = 0;
+    sg4::this_actor::sleep_until(s.start_time);
+    // Make sure we have a clean slate
+    xbt_assert(not mbox_.eager->listen(), "Eager mailbox should be empty when starting a test");
+    xbt_assert(not mbox_.rdv->listen(), "RDV mailbox should be empty when starting a test");
+    for (; step_index < s.steps.size(); step_index++) {
+      const Step& step = s.steps[step_index];
+      if (step.entity != Step::Entity::RCV || step.type != Step::Type::ACTION)
+        continue;
+      try {
+        sg4::this_actor::sleep_until(s.start_time + step.rel_time);
+      } catch (const simgrid::Exception& e) {
+        XBT_DEBUG("During Sleep, failed to receive message because of a %s exception (%s)", typeid(e).name(), e.what());
+        break;
+      }
+      // Check if the other host is still OK.
+      if (not other_host_->is_on())
+        break;
+      // Perform the action
+      try {
+        switch (step.action_type) {
+          case Action::GET:
+            comm = do_get(type, receive_ptr);
+            break;
+          case Action::START:
+            comm->start();
+            break;
+          case Action::WAIT:
+            comm->wait();
+            break;
+          default:
+            xbt_die("Not a valid action for RCV");
+        }
+      } catch (const simgrid::Exception& e) {
+        XBT_DEBUG("During %s, failed to receive message because of a %s exception (%s)", to_c_str(step.action_type),
+                  typeid(e).name(), e.what());
+        break;
+      }
+    }
+    try {
+      sg4::this_actor::sleep_until(end_time - .1);
+    } catch (const simgrid::Exception& e) {
+      XBT_DEBUG("During Sleep, failed to send message because of a %s exception (%s)", typeid(e).name(), e.what());
+    }
+    Action outcome              = Action::END;
+    std::string scenario_string = to_string(s);
+    if (step_index < s.steps.size()) {
+      const Step& step = s.steps[step_index];
+      assert(step.entity == Step::Entity::RCV && step.type == Step::Type::ACTION);
+      outcome = step.action_type;
+    } else if (s.type != CommType::ONESIDE_SYNC && s.type != CommType::ONESIDE_ASYNC) {
+      // One sided / detached operations do not actually transfer anything
+      if (receive_ptr == nullptr) {
+        XBT_ERROR("Received address is NULL in %s", scenario_string.c_str());
+      } else if (*receive_ptr != end_time) {
+        XBT_ERROR("Received value invalid: expected %f but got %f in %s", end_time, *receive_ptr,
+                  scenario_string.c_str());
+      }
+    }
+    if (outcome != expected) {
+      XBT_ERROR("Expected %s but got %s in %s", to_c_str(expected), to_c_str(outcome), scenario_string.c_str());
+    } else {
+      XBT_DEBUG("OK: %s", scenario_string.c_str());
+    }
+    sg4::this_actor::sleep_until(end_time);
+    xbt_assert(not mbox_.eager->listen(), "Mailbox should not have ongoing communication!");
+    xbt_assert(not mbox_.rdv->listen(), "Mailbox should not have ongoing communication!");
+  }
+
+public:
+  explicit ReceiveAgent(int id, sg4::Host* other_host, const MBoxes& mbox, const ScenarioContext& ctx)
+      : id_(id), other_host_(other_host), mbox_(mbox), ctx_(ctx)
+  {
+  }
+  void operator()() const
+  {
+    run_++;
+    XBT_DEBUG("Host %i starts run %i and scenario %zu.", id_, run_, scenario_);
+    mbox_.eager->set_receiver(sg4::Actor::self());
+    while (scenario_ < ctx_.scenarios.size()) {
+      const Scenario& s = ctx_.scenarios[scenario_];
+      scenario_++;
+      receive_message(s);
+    }
+  }
+};
+
+int ReceiveAgent::run_         = 0;
+size_t ReceiveAgent::scenario_ = 0;
+
+static double build_scenarios(ScenarioContext& ctx);
+
+int main(int argc, char* argv[])
+{
+  sg4::Engine e(&argc, argv);
+  ScenarioContext ctx;
+  int previous_index = -1;
+  bool is_range_last = false;
+  for (int i = 1; i < argc; i++) {
+    if (not strcmp(argv[i], "-")) {
+      is_range_last = true;
+      continue;
+    }
+    int index = atoi(argv[i]);
+    xbt_assert(index > previous_index);
+    if (is_range_last)
+      for (int j = previous_index + 1; j <= index; j++)
+        ctx.active_indices.push_back(j);
+    else
+      ctx.active_indices.push_back(index);
+    is_range_last  = false;
+    previous_index = index;
+  }
+  double end_time = build_scenarios(ctx);
+  XBT_INFO("Will run for %f seconds", end_time);
+  MBoxes mbox;
+  mbox.eager                  = e.mailbox_by_name_or_create("eager");
+  mbox.rdv                    = e.mailbox_by_name_or_create("rdv");
+  sg4::NetZone* zone          = sg4::create_full_zone("Top");
+  pr::Profile* profile_sender = pr::ProfileBuilder::from_string("sender_profile", ctx.sender_profile.str(), 0);
+  sg4::Host* sender_host = zone->create_host("senderHost", HostComputePower)->set_state_profile(profile_sender)->seal();
+  pr::Profile* profile_receiver = pr::ProfileBuilder::from_string("receiver_profile", ctx.receiver_profile.str(), 0);
+  sg4::Host* receiver_host =
+      zone->create_host("receiverHost", HostComputePower)->set_state_profile(profile_receiver)->seal();
+  sg4::ActorPtr sender = sg4::Actor::create("sender", sender_host, SendAgent(0, receiver_host, mbox, ctx));
+  sender->set_auto_restart(true);
+  sg4::ActorPtr receiver = sg4::Actor::create("receiver", receiver_host, ReceiveAgent(1, sender_host, mbox, ctx));
+  receiver->set_auto_restart(true);
+  pr::Profile* profile_link = pr::ProfileBuilder::from_string("link_profile", ctx.link_profile.str(), 0);
+  sg4::Link const* link =
+      zone->create_link("link", LinkBandwidth)->set_latency(LinkLatency)->set_state_profile(profile_link)->seal();
+  zone->add_route(sender_host->get_netpoint(), receiver_host->get_netpoint(), nullptr, nullptr,
+                  {sg4::LinkInRoute{link}}, false);
+  zone->seal();
+
+  sg4::Host::on_state_change_cb([mbox](sg4::Host const& host) {
+    XBT_DEBUG("Host %s is now %s", host.get_cname(), host.is_on() ? "ON " : "OFF");
+    if (not host.is_on()) {
+      mbox.eager->clear();
+      mbox.rdv->clear();
+    }
+  });
+
+  sg4::Link::on_state_change_cb(
+      [](sg4::Link const& lnk) { XBT_DEBUG("Link %s is now %s", lnk.get_cname(), lnk.is_on() ? "ON " : "OFF"); });
+
+  e.run_until(end_time);
+
+  // Make sure we have a clean slate
+  xbt_assert(not mbox.eager->listen(), "Eager mailbox should be empty in the end");
+  xbt_assert(not mbox.rdv->listen(), "RDV mailbox should be empty in the end");
+  XBT_INFO("Done.");
+  return 0;
+}
+
+static void prepareScenario(ScenarioContext& ctx, CommType type, double duration, Action sender_expected,
+                            Action receiver_expected, const std::vector<Step>& steps)
+{
+  if (std::find(ctx.active_indices.begin(), ctx.active_indices.end(), ctx.index) != ctx.active_indices.end()) {
+    // Update fault profiles
+    for (const Step& step : steps) {
+      assert(step.rel_time < duration);
+      if (step.type != Step::Type::STATE)
+        continue;
+      int val = step.new_state ? 1 : 0;
+      switch (step.entity) {
+        case Step::Entity::SND:
+          ctx.sender_profile << ctx.start_time + step.rel_time << " " << val << std::endl;
+          break;
+        case Step::Entity::RCV:
+          ctx.receiver_profile << ctx.start_time + step.rel_time << " " << val << std::endl;
+          break;
+        case Step::Entity::LNK:
+          ctx.link_profile << ctx.start_time + step.rel_time << " " << val << std::endl;
+          break;
+        default:
+          DIE_IMPOSSIBLE;
+      }
+    }
+    ctx.scenarios.push_back({type, ctx.start_time, duration, sender_expected, receiver_expected, steps, ctx.index});
+    ctx.active++;
+  }
+  ctx.index++;
+  ctx.start_time += duration;
+}
+
+/*************************************************************************************************/
+
+// A bunch of dirty macros to help readability (supposedly)
+#define MAKE_SCENARIO(type, duration, snd_expected, rcv_expected, steps...)                                            \
+  prepareScenario(ctx, CommType::type, duration, Action::snd_expected, Action::rcv_expected, {steps})
+
+// Link
+static Step loff(double rel_time)
+{
+  return {rel_time, Step::Type::STATE, Step::Entity::LNK, Action::END, false};
+}
+static Step lon(double rel_time)
+{
+  return {rel_time, Step::Type::STATE, Step::Entity::LNK, Action::END, true};
+}
+// Sender
+static Step soff(double rel_time)
+{
+  return {rel_time, Step::Type::STATE, Step::Entity::SND, Action::END, false};
+}
+static Step son(double rel_time)
+{
+  return {rel_time, Step::Type::STATE, Step::Entity::SND, Action::END, true};
+}
+static Step sput(double rel_time)
+{
+  return {rel_time, Step::Type::ACTION, Step::Entity::SND, Action::PUT, false};
+}
+static Step swait(double rel_time)
+{
+  return {rel_time, Step::Type::ACTION, Step::Entity::SND, Action::WAIT, false};
+}
+// Receiver
+static Step roff(double rel_time)
+{
+  return {rel_time, Step::Type::STATE, Step::Entity::RCV, Action::END, false};
+}
+static Step ron(double rel_time)
+{
+  return {rel_time, Step::Type::STATE, Step::Entity::RCV, Action::END, true};
+}
+static Step rget(double rel_time)
+{
+  return {rel_time, Step::Type::ACTION, Step::Entity::RCV, Action::GET, false};
+}
+static Step rwait(double rel_time)
+{
+  return {rel_time, Step::Type::ACTION, Step::Entity::RCV, Action::WAIT, false};
+}
+
+static double build_scenarios(ScenarioContext& ctx)
+{
+  ctx.start_time = 0;
+  ctx.index      = 0;
+  ctx.active     = 0;
+
+  // EAGER SYNC use cases
+  // All good
+  MAKE_SCENARIO(EAGER_SYNC, 1, END, END, sput(.2), rget(.4));
+  MAKE_SCENARIO(EAGER_SYNC, 1, END, END, rget(.2), sput(.4));
+  // Receiver off
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, roff(.1), sput(.2), ron(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, sput(.2), roff(.3), ron(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, sput(.2), rget(.4), roff(.5), ron(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, DIE, rget(.2), sput(.4), roff(.5), ron(1));
+  // Sender off
+  MAKE_SCENARIO(EAGER_SYNC, 2, DIE, GET, sput(.2), soff(.3), rget(.4), son(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, DIE, GET, sput(.2), rget(.4), soff(.5), son(1));
+  // Link off
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, loff(.1), sput(.2), rget(.4), lon(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, sput(.2), loff(.3), rget(.4), lon(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, sput(.2), rget(.4), loff(.5), lon(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, loff(.1), rget(.2), sput(.4), lon(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, rget(.2), loff(.3), sput(.4), lon(1));
+  MAKE_SCENARIO(EAGER_SYNC, 2, PUT, GET, rget(.2), sput(.4), loff(.5), lon(1));
+
+  // EAGER ASYNC use cases
+  // All good
+  MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, sput(.2), swait(.4), rget(.6), rwait(.8));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, sput(.2), rget(.4), swait(.6), rwait(.8));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, sput(.2), rget(.4), rwait(.6), swait(.8));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, rget(.2), sput(.4), swait(.6), rwait(.8));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, rget(.2), sput(.4), rwait(.6), swait(.8));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, END, END, rget(.2), rwait(.4), sput(.6), swait(.8));
+  // Receiver off
+  MAKE_SCENARIO(EAGER_ASYNC, 2, PUT, DIE, roff(.1), sput(.2), swait(.4), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), roff(.3), swait(.4), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, PUT, DIE, rget(.2), roff(.3), sput(.4), swait(.6), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), roff(.5), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), roff(.5), swait(.6), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), roff(.5), swait(.6), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, PUT, DIE, rget(.2), rwait(.4), roff(.5), sput(.6), swait(.8), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), rget(.6), roff(.7), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), swait(.6), roff(.7), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), swait(.6), roff(.7), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, DIE, rget(.2), rwait(.4), sput(.6), roff(.7), swait(.8), ron(1));
+  // Sender off (only cases where sender did put, because otherwise receiver cannot find out there was a fault)
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, GET, sput(.2), soff(.3), rget(.4), rwait(.6), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), soff(.5), rwait(.6), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), soff(.5), rwait(.6), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, GET, sput(.2), swait(.4), soff(.5), rget(.6), rwait(.8), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), rwait(.4), sput(.6), soff(.7), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), rwait(.6), soff(.7), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), swait(.6), soff(.7), rwait(.8), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), rwait(.6), soff(.7), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), swait(.6), soff(.7), rwait(.8), son(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, DIE, WAIT, sput(.2), swait(.4), rget(.6), soff(.7), rwait(.8), son(1));
+  // Link off
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), swait(.4), rget(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), rwait(.4), sput(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), swait(.4), rget(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), rwait(.4), sput(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), loff(.5), rget(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), loff(.5), sput(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), rget(.6), loff(.7), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+  MAKE_SCENARIO(EAGER_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), sput(.6), loff(.7), swait(.8), lon(1));
+
+  // RDV SYNC use cases
+  // All good
+  MAKE_SCENARIO(RDV_SYNC, 1, END, END, sput(.2), rget(.4));
+  MAKE_SCENARIO(RDV_SYNC, 1, END, END, rget(.2), sput(.4));
+  // Receiver off
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, roff(.1), sput(.2), ron(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, sput(.2), roff(.3),
+                ron(1)); // Fails because put comm cancellation does not trigger sender exception
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, sput(.2), rget(.4), roff(.5), ron(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, DIE, rget(.2), sput(.4), roff(.5), ron(1));
+  // Sender off
+  MAKE_SCENARIO(RDV_SYNC, 2, DIE, GET, sput(.2), rget(.4), soff(.5), son(1));
+  // Link off
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, loff(.1), sput(.2), rget(.4), lon(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, sput(.2), loff(.3), rget(.4), lon(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, sput(.2), rget(.4), loff(.5), lon(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, loff(.1), rget(.2), sput(.4), lon(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, rget(.2), loff(.3), sput(.4), lon(1));
+  MAKE_SCENARIO(RDV_SYNC, 2, PUT, GET, rget(.2), sput(.4), loff(.5), lon(1));
+
+  // RDV ASYNC use cases
+  // All good
+  MAKE_SCENARIO(RDV_ASYNC, 2, END, END, sput(.2), swait(.4), rget(.6), rwait(.8));
+  MAKE_SCENARIO(RDV_ASYNC, 2, END, END, sput(.2), rget(.4), swait(.6), rwait(.8));
+  MAKE_SCENARIO(RDV_ASYNC, 2, END, END, sput(.2), rget(.4), rwait(.6), swait(.8));
+  MAKE_SCENARIO(RDV_ASYNC, 2, END, END, rget(.2), sput(.4), swait(.6), rwait(.8));
+  MAKE_SCENARIO(RDV_ASYNC, 2, END, END, rget(.2), sput(.4), rwait(.6), swait(.8));
+  MAKE_SCENARIO(RDV_ASYNC, 2, END, END, rget(.2), rwait(.4), sput(.6), swait(.8));
+  // Receiver off
+  MAKE_SCENARIO(RDV_ASYNC, 2, PUT, DIE, roff(.1), sput(.2), swait(.4), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), roff(.3), swait(.4), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, PUT, DIE, rget(.2), roff(.3), sput(.4), swait(.6), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), roff(.5),
+                ron(1)); // Fails because put comm cancellation does not trigger sender exception
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), roff(.5), swait(.6), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), roff(.5), swait(.6), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, PUT, DIE, rget(.2), rwait(.4), roff(.5), sput(.6), swait(.8), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), rget(.6), roff(.7), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), swait(.6), roff(.7), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, sput(.2), rget(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), swait(.6), roff(.7), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), sput(.4), rwait(.6), roff(.7), swait(.8), ron(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, DIE, rget(.2), rwait(.4), sput(.6), roff(.7), swait(.8), ron(1));
+  // Sender off (only cases where sender did put, because otherwise receiver cannot find out there was a fault)
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, GET, sput(.2), soff(.3), rget(.4), rwait(.6), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), soff(.5), rwait(.6), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), soff(.5), rwait(.6), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, GET, sput(.2), swait(.4), soff(.5), rget(.6), rwait(.8), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), rwait(.4), sput(.6), soff(.7), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), rwait(.6), soff(.7), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, rget(.2), sput(.4), swait(.6), soff(.7), rwait(.8), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), rwait(.6), soff(.7), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), rget(.4), swait(.6), soff(.7), rwait(.8), son(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, DIE, WAIT, sput(.2), swait(.4), rget(.6), soff(.7), rwait(.8), son(1));
+  // Link off
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), swait(.4), rget(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), sput(.2), rget(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), sput(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, loff(.1), rget(.2), rwait(.4), sput(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), swait(.4), rget(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), loff(.3), rget(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), sput(.4), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), loff(.3), rwait(.4), sput(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), loff(.5), rget(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), swait(.6), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), loff(.5), rwait(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), loff(.5), sput(.6), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), swait(.4), rget(.6), loff(.7), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, sput(.2), rget(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), swait(.6), loff(.7), rwait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), sput(.4), rwait(.6), loff(.7), swait(.8), lon(1));
+  MAKE_SCENARIO(RDV_ASYNC, 2, WAIT, WAIT, rget(.2), rwait(.4), sput(.6), loff(.7), swait(.8), lon(1));
+
+  // ONESIDE SYNC use cases
+  // All good
+  MAKE_SCENARIO(ONESIDE_SYNC, 1, END, END, sput(.2));
+  // Receiver off
+  MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, DIE, roff(.1), sput(.2), ron(1));
+  MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, DIE, sput(.2), roff(.3), ron(1));
+  // Sender off
+  MAKE_SCENARIO(ONESIDE_SYNC, 2, DIE, END, sput(.2), soff(.3), son(1));
+  // Link off
+  MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, END, loff(.1), sput(.2), lon(1));
+  MAKE_SCENARIO(ONESIDE_SYNC, 2, PUT, END, sput(.2), loff(.3), lon(1));
+
+  // ONESIDE ASYNC use cases
+  // All good
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, END, END, sput(.2), swait(.4));
+  // Receiver off
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, PUT, DIE, roff(.1), sput(.2), swait(.4), ron(1));
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, DIE, sput(.2), roff(.3), swait(.4), ron(1));
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, DIE, sput(.2), swait(.4), roff(.5), ron(1));
+  // Sender off
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, DIE, END, sput(.2), soff(.3), son(1));
+  // Link off
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, END, loff(.1), sput(.2), swait(.4), lon(1));
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, END, sput(.2), loff(.3), swait(.4), lon(1));
+  MAKE_SCENARIO(ONESIDE_ASYNC, 2, WAIT, END, sput(.2), swait(.4), loff(.5), lon(1));
+
+  XBT_INFO("Will execute %i active scenarios out of %i.", ctx.active, ctx.index);
+  return ctx.start_time + 1;
+}
diff --git a/teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.tesh b/teshsuite/s4u/comm-fault-scenarios/comm-fault-scenarios.tesh
new file mode 100644 (file)
index 0000000..c3d435e
--- /dev/null
@@ -0,0 +1,4 @@
+$ ./comm-fault-scenarios 0 - 146
+> [0.000000] [comm_fault_scenarios/INFO] Will execute 147 active scenarios out of 147.
+> [0.000000] [comm_fault_scenarios/INFO] Will run for 290.000000 seconds
+> [290.000000] [comm_fault_scenarios/INFO] Done.
index b1f7bf7..97661ce 100644 (file)
@@ -3,14 +3,17 @@
 set(EXTRA_DIST
   src/bindings/java/MANIFEST.in
   src/bindings/python/simgrid_python.cpp
+  src/dag/dax.dtd
+  src/dag/dax_dtd.c
+  src/dag/dax_dtd.h
+  src/include/catch.hpp
   src/include/mc/datatypes.h
   src/include/mc/mc.h
   src/include/simgrid/sg_config.hpp
   src/include/xbt/coverage.h
-  src/include/xbt/parmap.hpp
   src/include/xbt/mmalloc.h
+  src/include/xbt/parmap.hpp
   src/include/xbt/xbt_modinter.h
-  src/include/catch.hpp
   src/include/xxhash.hpp
   src/kernel/actor/Simcall.hpp
   src/kernel/resource/LinkImpl.hpp
@@ -21,9 +24,6 @@ set(EXTRA_DIST
   src/mc/mc_mmu.hpp
   src/mc/mc_record.hpp
   src/msg/msg_private.hpp
-  src/dag/dax.dtd
-  src/dag/dax_dtd.c
-  src/dag/dax_dtd.h
   src/smpi/colls/coll_tuned_topo.hpp
   src/smpi/colls/colls_private.hpp
   src/smpi/colls/smpi_mvapich2_selector_stampede.hpp
@@ -31,24 +31,24 @@ set(EXTRA_DIST
   src/smpi/include/smpi_utils.hpp
   src/smpi/smpi_main.c
   src/smpi/smpi_replay_main.cpp
+  src/surf/HostImpl.hpp
   src/surf/cpu_cas01.hpp
   src/surf/cpu_ti.hpp
+  src/surf/disk_s19.hpp
+  src/surf/host_clm03.hpp
   src/surf/network_cm02.hpp
   src/surf/network_constant.hpp
+  src/surf/network_ib.hpp
   src/surf/network_ns3.hpp
   src/surf/network_smpi.hpp
-  src/surf/network_ib.hpp
   src/surf/ns3/ns3_simulator.hpp
+  src/surf/ptask_L07.hpp
+  src/surf/surf_interface.hpp
   src/surf/xml/simgrid.dtd
-  src/surf/xml/simgrid_dtd.h
   src/surf/xml/simgrid_dtd.c
+  src/surf/xml/simgrid_dtd.h
   src/surf/xml/surfxml_sax_cb.cpp
 
-  src/surf/disk_s19.hpp
-  src/surf/surf_interface.hpp
-  src/surf/host_clm03.hpp
-  src/surf/HostImpl.hpp
-  src/surf/ptask_L07.hpp
   src/xbt/automaton/automaton_lexer.yy.c
   src/xbt/automaton/parserPromela.lex
   src/xbt/automaton/parserPromela.tab.cacc
@@ -69,60 +69,15 @@ set(EXTRA_DIST
   src/xbt/mmalloc/mrealloc.c
   src/xbt/mmalloc/swag.c
   src/xbt/mmalloc/swag.h
-  examples/smpi/mc/only_send_deterministic.tesh
   )
 
 set(SMPI_SRC
-  src/smpi/internals/instr_smpi.cpp
-  src/smpi/internals/smpi_bench.cpp
-  src/smpi/internals/smpi_memory.cpp
-  src/smpi/internals/smpi_shared.cpp
-  src/smpi/internals/smpi_deployment.cpp
-  src/smpi/internals/smpi_global.cpp
-  src/smpi/internals/smpi_host.cpp
-  src/smpi/internals/smpi_replay.cpp
-  src/smpi/internals/smpi_actor.cpp
-  src/smpi/internals/smpi_utils.cpp
-  src/smpi/internals/smpi_config.cpp
-  src/smpi/mpi/smpi_comm.cpp
-  src/smpi/mpi/smpi_datatype.cpp
-  src/smpi/mpi/smpi_datatype_derived.cpp
-  src/smpi/mpi/smpi_errhandler.cpp
-  src/smpi/mpi/smpi_f2c.cpp
-  src/smpi/mpi/smpi_file.cpp
-  src/smpi/mpi/smpi_group.cpp
-  src/smpi/mpi/smpi_info.cpp
-  src/smpi/mpi/smpi_keyvals.cpp
-  src/smpi/mpi/smpi_op.cpp
-  src/smpi/mpi/smpi_request.cpp
-  src/smpi/mpi/smpi_status.cpp
-  src/smpi/mpi/smpi_topo.cpp
-  src/smpi/mpi/smpi_win.cpp
-  src/smpi/include/smpi_actor.hpp
-  src/smpi/include/smpi_coll.hpp
-  src/smpi/include/smpi_comm.hpp
-  src/smpi/include/smpi_config.hpp
-  src/smpi/include/smpi_datatype_derived.hpp
-  src/smpi/include/smpi_datatype.hpp
-  src/smpi/include/smpi_errhandler.hpp
-  src/smpi/include/smpi_f2c.hpp
-  src/smpi/include/smpi_file.hpp
-  src/smpi/include/smpi_group.hpp
-  src/smpi/include/smpi_host.hpp
-  src/smpi/include/smpi_info.hpp
-  src/smpi/include/smpi_keyvals.hpp
-  src/smpi/include/smpi_op.hpp
-  src/smpi/include/smpi_replay.hpp
-  src/smpi/include/smpi_request.hpp
-  src/smpi/include/smpi_status.hpp
-  src/smpi/include/smpi_topo.hpp
-  src/smpi/include/smpi_win.hpp
-  src/smpi/plugins/ampi/ampi.cpp
-  src/smpi/plugins/ampi/ampi.hpp
-  src/smpi/plugins/ampi/instr_ampi.cpp
-  src/smpi/plugins/ampi/instr_ampi.hpp
-  src/surf/network_smpi.cpp
-  src/surf/network_ib.cpp
+  src/smpi/bindings/smpi_f77.cpp
+  src/smpi/bindings/smpi_f77_coll.cpp
+  src/smpi/bindings/smpi_f77_comm.cpp
+  src/smpi/bindings/smpi_f77_file.cpp
+  src/smpi/bindings/smpi_f77_request.cpp
+  src/smpi/bindings/smpi_f77_type.cpp
   src/smpi/bindings/smpi_mpi.cpp
   src/smpi/bindings/smpi_pmpi.cpp
   src/smpi/bindings/smpi_pmpi_coll.cpp
@@ -135,20 +90,6 @@ set(SMPI_SRC
   src/smpi/bindings/smpi_pmpi_topo.cpp
   src/smpi/bindings/smpi_pmpi_type.cpp
   src/smpi/bindings/smpi_pmpi_win.cpp
-  src/smpi/bindings/smpi_f77.cpp
-  src/smpi/bindings/smpi_f77_coll.cpp
-  src/smpi/bindings/smpi_f77_comm.cpp
-  src/smpi/bindings/smpi_f77_file.cpp
-  src/smpi/bindings/smpi_f77_request.cpp
-  src/smpi/bindings/smpi_f77_type.cpp
-  src/smpi/colls/smpi_coll.cpp
-  src/smpi/colls/smpi_nbc_impl.cpp
-  src/smpi/colls/smpi_automatic_selector.cpp
-  src/smpi/colls/smpi_default_selector.cpp
-  src/smpi/colls/smpi_mpich_selector.cpp
-  src/smpi/colls/smpi_intel_mpi_selector.cpp
-  src/smpi/colls/smpi_openmpi_selector.cpp
-  src/smpi/colls/smpi_mvapich2_selector.cpp
   src/smpi/colls/allgather/allgather-2dmesh.cpp
   src/smpi/colls/allgather/allgather-3dmesh.cpp
   src/smpi/colls/allgather/allgather-GB.cpp
@@ -157,9 +98,9 @@ set(SMPI_SRC
   src/smpi/colls/allgather/allgather-SMP-NTS.cpp
   src/smpi/colls/allgather/allgather-bruck.cpp
   src/smpi/colls/allgather/allgather-loosely-lr.cpp
+  src/smpi/colls/allgather/allgather-mvapich-smp.cpp
   src/smpi/colls/allgather/allgather-ompi-neighborexchange.cpp
   src/smpi/colls/allgather/allgather-pair.cpp
-  src/smpi/colls/allgather/allgather-mvapich-smp.cpp
   src/smpi/colls/allgather/allgather-rdb.cpp
   src/smpi/colls/allgather/allgather-rhv.cpp
   src/smpi/colls/allgather/allgather-ring.cpp
@@ -173,6 +114,8 @@ set(SMPI_SRC
   src/smpi/colls/allgatherv/allgatherv-pair.cpp
   src/smpi/colls/allgatherv/allgatherv-ring.cpp
   src/smpi/colls/allreduce/allreduce-lr.cpp
+  src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp
+  src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp
   src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp
   src/smpi/colls/allreduce/allreduce-rab-rdb.cpp
   src/smpi/colls/allreduce/allreduce-rab1.cpp
@@ -185,12 +128,11 @@ set(SMPI_SRC
   src/smpi/colls/allreduce/allreduce-smp-rsag-lr.cpp
   src/smpi/colls/allreduce/allreduce-smp-rsag-rab.cpp
   src/smpi/colls/allreduce/allreduce-smp-rsag.cpp
-  src/smpi/colls/allreduce/allreduce-mvapich-rs.cpp
-  src/smpi/colls/allreduce/allreduce-mvapich-two-level.cpp
-  src/smpi/colls/alltoall/alltoall-basic-linear.cpp
   src/smpi/colls/alltoall/alltoall-2dmesh.cpp
   src/smpi/colls/alltoall/alltoall-3dmesh.cpp
+  src/smpi/colls/alltoall/alltoall-basic-linear.cpp
   src/smpi/colls/alltoall/alltoall-bruck.cpp
+  src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp
   src/smpi/colls/alltoall/alltoall-pair-light-barrier.cpp
   src/smpi/colls/alltoall/alltoall-pair-mpi-barrier.cpp
   src/smpi/colls/alltoall/alltoall-pair-one-barrier.cpp
@@ -200,7 +142,6 @@ set(SMPI_SRC
   src/smpi/colls/alltoall/alltoall-ring-mpi-barrier.cpp
   src/smpi/colls/alltoall/alltoall-ring-one-barrier.cpp
   src/smpi/colls/alltoall/alltoall-ring.cpp
-  src/smpi/colls/alltoall/alltoall-mvapich-scatter-dest.cpp
   src/smpi/colls/alltoallv/alltoallv-bruck.cpp
   src/smpi/colls/alltoallv/alltoallv-ompi-basic-linear.cpp
   src/smpi/colls/alltoallv/alltoallv-pair-light-barrier.cpp
@@ -211,9 +152,9 @@ set(SMPI_SRC
   src/smpi/colls/alltoallv/alltoallv-ring-mpi-barrier.cpp
   src/smpi/colls/alltoallv/alltoallv-ring-one-barrier.cpp
   src/smpi/colls/alltoallv/alltoallv-ring.cpp
-  src/smpi/colls/barrier/barrier-ompi.cpp
-  src/smpi/colls/barrier/barrier-mvapich2-pair.cpp
   src/smpi/colls/barrier/barrier-mpich-smp.cpp
+  src/smpi/colls/barrier/barrier-mvapich2-pair.cpp
+  src/smpi/colls/barrier/barrier-ompi.cpp
   src/smpi/colls/bcast/bcast-NTSB.cpp
   src/smpi/colls/bcast/bcast-NTSL-Isend.cpp
   src/smpi/colls/bcast/bcast-NTSL.cpp
@@ -226,31 +167,91 @@ set(SMPI_SRC
   src/smpi/colls/bcast/bcast-binomial-tree.cpp
   src/smpi/colls/bcast/bcast-flattree-pipeline.cpp
   src/smpi/colls/bcast/bcast-flattree.cpp
+  src/smpi/colls/bcast/bcast-mvapich-smp.cpp
   src/smpi/colls/bcast/bcast-ompi-pipeline.cpp
   src/smpi/colls/bcast/bcast-ompi-split-bintree.cpp
-  src/smpi/colls/bcast/bcast-mvapich-smp.cpp
   src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp
   src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp
   src/smpi/colls/coll_tuned_topo.cpp
   src/smpi/colls/colls_global.cpp
-  src/smpi/colls/gather/gather-ompi.cpp
   src/smpi/colls/gather/gather-mvapich.cpp
+  src/smpi/colls/gather/gather-ompi.cpp
   src/smpi/colls/reduce/reduce-NTSL.cpp
   src/smpi/colls/reduce/reduce-arrival-pattern-aware.cpp
   src/smpi/colls/reduce/reduce-binomial.cpp
   src/smpi/colls/reduce/reduce-flat-tree.cpp
+  src/smpi/colls/reduce/reduce-mvapich-knomial.cpp
+  src/smpi/colls/reduce/reduce-mvapich-two-level.cpp
   src/smpi/colls/reduce/reduce-ompi.cpp
+  src/smpi/colls/reduce/reduce-rab.cpp
   src/smpi/colls/reduce/reduce-scatter-gather.cpp
   src/smpi/colls/reduce_scatter/reduce_scatter-mpich.cpp
   src/smpi/colls/reduce_scatter/reduce_scatter-ompi.cpp
-  src/smpi/colls/reduce/reduce-mvapich-knomial.cpp
-  src/smpi/colls/reduce/reduce-mvapich-two-level.cpp
-  src/smpi/colls/reduce/reduce-rab.cpp
-  src/smpi/colls/scatter/scatter-ompi.cpp
   src/smpi/colls/scatter/scatter-mvapich-two-level.cpp
+  src/smpi/colls/scatter/scatter-ompi.cpp
+  src/smpi/colls/smpi_automatic_selector.cpp
+  src/smpi/colls/smpi_coll.cpp
+  src/smpi/colls/smpi_default_selector.cpp
+  src/smpi/colls/smpi_intel_mpi_selector.cpp
+  src/smpi/colls/smpi_mpich_selector.cpp
+  src/smpi/colls/smpi_mvapich2_selector.cpp
+  src/smpi/colls/smpi_nbc_impl.cpp
+  src/smpi/colls/smpi_openmpi_selector.cpp
+  src/smpi/include/smpi_actor.hpp
+  src/smpi/include/smpi_coll.hpp
+  src/smpi/include/smpi_comm.hpp
+  src/smpi/include/smpi_config.hpp
+  src/smpi/include/smpi_datatype.hpp
+  src/smpi/include/smpi_datatype_derived.hpp
+  src/smpi/include/smpi_errhandler.hpp
+  src/smpi/include/smpi_f2c.hpp
+  src/smpi/include/smpi_file.hpp
+  src/smpi/include/smpi_group.hpp
+  src/smpi/include/smpi_host.hpp
+  src/smpi/include/smpi_info.hpp
+  src/smpi/include/smpi_keyvals.hpp
+  src/smpi/include/smpi_op.hpp
+  src/smpi/include/smpi_replay.hpp
+  src/smpi/include/smpi_request.hpp
+  src/smpi/include/smpi_status.hpp
+  src/smpi/include/smpi_topo.hpp
+  src/smpi/include/smpi_win.hpp
+  src/smpi/internals/instr_smpi.cpp
+  src/smpi/internals/smpi_actor.cpp
+  src/smpi/internals/smpi_bench.cpp
+  src/smpi/internals/smpi_config.cpp
+  src/smpi/internals/smpi_deployment.cpp
+  src/smpi/internals/smpi_global.cpp
+  src/smpi/internals/smpi_host.cpp
+  src/smpi/internals/smpi_memory.cpp
+  src/smpi/internals/smpi_replay.cpp
+  src/smpi/internals/smpi_shared.cpp
+  src/smpi/internals/smpi_utils.cpp
+  src/smpi/mpi/smpi_comm.cpp
+  src/smpi/mpi/smpi_datatype.cpp
+  src/smpi/mpi/smpi_datatype_derived.cpp
+  src/smpi/mpi/smpi_errhandler.cpp
+  src/smpi/mpi/smpi_f2c.cpp
+  src/smpi/mpi/smpi_file.cpp
+  src/smpi/mpi/smpi_group.cpp
+  src/smpi/mpi/smpi_info.cpp
+  src/smpi/mpi/smpi_keyvals.cpp
+  src/smpi/mpi/smpi_op.cpp
+  src/smpi/mpi/smpi_request.cpp
+  src/smpi/mpi/smpi_status.cpp
+  src/smpi/mpi/smpi_topo.cpp
+  src/smpi/mpi/smpi_win.cpp
+  src/smpi/plugins/ampi/ampi.cpp
+  src/smpi/plugins/ampi/ampi.hpp
+  src/smpi/plugins/ampi/instr_ampi.cpp
+  src/smpi/plugins/ampi/instr_ampi.hpp
+  src/surf/network_ib.cpp
+  src/surf/network_smpi.cpp
   )
 
 set(XBT_SRC
+  src/xbt/OsSemaphore.hpp
+  src/xbt/PropertyHolder.cpp
   src/xbt/automaton/automaton.c
   src/xbt/automaton/automatonparse_promela.c
   src/xbt/backtrace.cpp
@@ -265,8 +266,6 @@ set(XBT_SRC
   src/xbt/mallocator.c
   src/xbt/memory_map.cpp
   src/xbt/memory_map.hpp
-  src/xbt/OsSemaphore.hpp
-  src/xbt/PropertyHolder.cpp
   src/xbt/parmap.cpp
   src/xbt/random.cpp
   src/xbt/snprintf.c
@@ -289,16 +288,21 @@ else()
   set(EXTRA_DIST ${EXTRA_DIST} src/xbt/mmalloc/mm.c)
 endif()
 
-set(NS3_SRC  src/surf/network_ns3.cpp
-             src/surf/ns3/ns3_simulator.cpp )
+set(NS3_SRC
+  src/surf/network_ns3.cpp
+  src/surf/ns3/ns3_simulator.cpp
+  )
 
 set(SURF_SRC
-  src/kernel/lmm/fair_bottleneck.hpp
+  src/kernel/EngineImpl.cpp
+  src/kernel/EngineImpl.hpp
+
+  src/kernel/lmm/System.cpp
+  src/kernel/lmm/System.hpp
   src/kernel/lmm/fair_bottleneck.cpp
-  src/kernel/lmm/maxmin.hpp
+  src/kernel/lmm/fair_bottleneck.hpp
   src/kernel/lmm/maxmin.cpp
-  src/kernel/lmm/System.hpp
-  src/kernel/lmm/System.cpp
+  src/kernel/lmm/maxmin.hpp
 
   src/kernel/resource/Action.cpp
   src/kernel/resource/CpuImpl.cpp
@@ -310,16 +314,16 @@ set(SURF_SRC
   src/kernel/resource/Resource.hpp
   src/kernel/resource/SplitDuplexLinkImpl.cpp
   src/kernel/resource/StandardLinkImpl.cpp
-  src/kernel/resource/VirtualMachineImpl.hpp
   src/kernel/resource/VirtualMachineImpl.cpp
+  src/kernel/resource/VirtualMachineImpl.hpp
   src/kernel/resource/WifiLinkImpl.cpp
 
   src/kernel/resource/profile/Event.hpp
   src/kernel/resource/profile/FutureEvtSet.cpp
   src/kernel/resource/profile/FutureEvtSet.hpp
-  src/kernel/resource/profile/ProfileBuilder.cpp
   src/kernel/resource/profile/Profile.cpp
   src/kernel/resource/profile/Profile.hpp
+  src/kernel/resource/profile/ProfileBuilder.cpp
   src/kernel/resource/profile/StochasticDatedValue.cpp
   src/kernel/resource/profile/StochasticDatedValue.hpp
 
@@ -340,68 +344,57 @@ set(SURF_SRC
 
   src/kernel/timer/Timer.cpp
 
-  src/kernel/EngineImpl.cpp
-  src/kernel/EngineImpl.hpp
-
+  src/surf/HostImpl.cpp
   src/surf/cpu_cas01.cpp
   src/surf/cpu_ti.cpp
   src/surf/disk_s19.cpp
+  src/surf/host_clm03.cpp
   src/surf/network_cm02.cpp
   src/surf/network_constant.cpp
+  src/surf/ptask_L07.cpp
   src/surf/sg_platf.cpp
   src/surf/surf_interface.cpp
   src/surf/xml/platf.hpp
   src/surf/xml/platf_private.hpp
-  src/surf/xml/surfxml_sax_cb.cpp
   src/surf/xml/surfxml_parseplatf.cpp
-  src/surf/host_clm03.cpp
-  src/surf/HostImpl.cpp
-  src/surf/ptask_L07.cpp
+  src/surf/xml/surfxml_sax_cb.cpp
   )
 if (Eigen3_FOUND)
   set(SURF_SRC
     ${SURF_SRC}
-    src/kernel/lmm/bmf.hpp
-    src/kernel/lmm/bmf.cpp)
+    src/kernel/lmm/bmf.cpp
+    src/kernel/lmm/bmf.hpp)
 else()
   set(EXTRA_DIST
     ${EXTRA_DIST}
-    src/kernel/lmm/bmf.hpp
-    src/kernel/lmm/bmf.cpp)
+    src/kernel/lmm/bmf.cpp
+    src/kernel/lmm/bmf.hpp)
 endif()
 
 set(PLUGINS_SRC
   src/plugins/ProducerConsumer.cpp
   src/plugins/chaos_monkey.cpp
+  src/plugins/file_system/s4u_FileSystem.cpp
   src/plugins/host_dvfs.cpp
   src/plugins/host_energy.cpp
+  src/plugins/host_load.cpp
   src/plugins/link_energy.cpp
   src/plugins/link_energy_wifi.cpp
-  src/plugins/host_load.cpp
   src/plugins/link_load.cpp
-  src/plugins/file_system/s4u_FileSystem.cpp
-  src/plugins/vm/dirty_page_tracking.cpp
   src/plugins/vm/VmLiveMigration.cpp
   src/plugins/vm/VmLiveMigration.hpp
+  src/plugins/vm/dirty_page_tracking.cpp
   )
 
 set(SIMIX_SRC
-  src/kernel/context/Context.cpp
-  src/kernel/context/Context.hpp
-  src/kernel/context/ContextRaw.cpp
-  src/kernel/context/ContextRaw.hpp
-  src/kernel/context/ContextSwapped.cpp
-  src/kernel/context/ContextSwapped.hpp
-  src/kernel/context/ContextThread.cpp
-  src/kernel/context/ContextThread.hpp
   src/kernel/activity/ActivityImpl.cpp
   src/kernel/activity/ActivityImpl.hpp
   src/kernel/activity/BarrierImpl.cpp
   src/kernel/activity/BarrierImpl.hpp
-  src/kernel/activity/ConditionVariableImpl.cpp
-  src/kernel/activity/ConditionVariableImpl.hpp
   src/kernel/activity/CommImpl.cpp
   src/kernel/activity/CommImpl.hpp
+  src/kernel/activity/ConditionVariableImpl.cpp
+  src/kernel/activity/ConditionVariableImpl.hpp
   src/kernel/activity/ExecImpl.cpp
   src/kernel/activity/ExecImpl.hpp
   src/kernel/activity/IoImpl.cpp
@@ -425,6 +418,14 @@ set(SIMIX_SRC
   src/kernel/actor/SimcallObserver.hpp
   src/kernel/actor/SynchroObserver.cpp
   src/kernel/actor/SynchroObserver.hpp
+  src/kernel/context/Context.cpp
+  src/kernel/context/Context.hpp
+  src/kernel/context/ContextRaw.cpp
+  src/kernel/context/ContextRaw.hpp
+  src/kernel/context/ContextSwapped.cpp
+  src/kernel/context/ContextSwapped.hpp
+  src/kernel/context/ContextThread.cpp
+  src/kernel/context/ContextThread.hpp
   src/simix/libsmx.cpp
   src/simix/smx_context.cpp
   )
@@ -433,21 +434,21 @@ set(SIMIX_SRC
 if (HAVE_BOOST_CONTEXTS)
   set(SIMIX_SRC
       ${SIMIX_SRC}
-      src/kernel/context/ContextBoost.hpp
-      src/kernel/context/ContextBoost.cpp)
+      src/kernel/context/ContextBoost.cpp
+      src/kernel/context/ContextBoost.hpp)
 else()
   set(EXTRA_DIST
       ${EXTRA_DIST}
-      src/kernel/context/ContextBoost.hpp
-      src/kernel/context/ContextBoost.cpp)
+      src/kernel/context/ContextBoost.cpp
+      src/kernel/context/ContextBoost.hpp)
 endif()
 
 set(S4U_SRC
-  src/s4u/s4u_Actor.cpp
   src/s4u/s4u_Activity.cpp
+  src/s4u/s4u_Actor.cpp
   src/s4u/s4u_Barrier.cpp
-  src/s4u/s4u_ConditionVariable.cpp
   src/s4u/s4u_Comm.cpp
+  src/s4u/s4u_ConditionVariable.cpp
   src/s4u/s4u_Disk.cpp
   src/s4u/s4u_Engine.cpp
   src/s4u/s4u_Exec.cpp
@@ -469,8 +470,8 @@ set(SIMGRID_SRC
   )
 
 set(MSG_SRC
-  src/msg/msg_global.cpp
   src/msg/msg_comm.cpp
+  src/msg/msg_global.cpp
   src/msg/msg_legacy.cpp
   src/msg/msg_process.cpp
   src/msg/msg_task.cpp
@@ -481,6 +482,8 @@ set(DAG_SRC
   )
 
 set(JMSG_C_SRC
+  src/bindings/java/JavaContext.cpp
+  src/bindings/java/JavaContext.hpp
   src/bindings/java/jmsg.cpp
   src/bindings/java/jmsg.hpp
   src/bindings/java/jmsg_as.cpp
@@ -499,9 +502,7 @@ set(JMSG_C_SRC
   src/bindings/java/jmsg_vm.h
   src/bindings/java/jxbt_utilities.cpp
   src/bindings/java/jxbt_utilities.hpp
-  src/bindings/java/JavaContext.cpp
-  src/bindings/java/JavaContext.hpp
-)
+  )
 
 set(JMSG_JAVA_SRC
   src/bindings/java/org/simgrid/NativeLib.java
@@ -523,12 +524,12 @@ set(JMSG_JAVA_SRC
   src/bindings/java/org/simgrid/msg/TimeoutException.java
   src/bindings/java/org/simgrid/msg/TransferFailureException.java
   src/bindings/java/org/simgrid/msg/VM.java
-)
+  )
 
 set(JTRACE_C_SRC
   src/bindings/java/jtrace.cpp
   src/bindings/java/jtrace.h
-)
+  )
 
 set(JTRACE_JAVA_SRC src/bindings/java/org/simgrid/trace/Trace.java)
 
@@ -549,49 +550,49 @@ set(TRACING_SRC
   src/instr/instr_paje_values.hpp
   src/instr/instr_platform.cpp
   src/instr/instr_private.hpp
-  src/instr/instr_smpi.hpp
   src/instr/instr_resource_utilization.cpp
+  src/instr/instr_smpi.hpp
   )
 
 set(MC_SRC_BASE
   src/mc/mc_base.cpp
   src/mc/mc_base.hpp
-  src/mc/mc_record.hpp
-  src/mc/mc_replay.hpp
-  src/mc/mc_record.cpp
   src/mc/mc_config.cpp
   src/mc/mc_config.hpp
   src/mc/mc_global.cpp
+  src/mc/mc_record.cpp
+  src/mc/mc_record.hpp
+  src/mc/mc_replay.hpp
   src/mc/transition/Transition.cpp
   )
 
 set(MC_SRC
-  src/mc/explo/Exploration.hpp
   src/mc/explo/CommunicationDeterminismChecker.cpp
   src/mc/explo/DFSExplorer.cpp
   src/mc/explo/DFSExplorer.hpp
+  src/mc/explo/Exploration.hpp
   src/mc/explo/LivenessChecker.cpp
   src/mc/explo/LivenessChecker.hpp
   src/mc/explo/UdporChecker.cpp
   src/mc/explo/UdporChecker.hpp
 
-  src/mc/inspect/DwarfExpression.hpp
   src/mc/inspect/DwarfExpression.cpp
-  src/mc/inspect/Frame.hpp
+  src/mc/inspect/DwarfExpression.hpp
   src/mc/inspect/Frame.cpp
-  src/mc/inspect/LocationList.hpp
+  src/mc/inspect/Frame.hpp
   src/mc/inspect/LocationList.cpp
-  src/mc/inspect/ObjectInformation.hpp
+  src/mc/inspect/LocationList.hpp
   src/mc/inspect/ObjectInformation.cpp
+  src/mc/inspect/ObjectInformation.hpp
   src/mc/inspect/Type.hpp
   src/mc/inspect/Variable.hpp
-  src/mc/inspect/mc_dwarf.hpp
   src/mc/inspect/mc_dwarf.cpp
+  src/mc/inspect/mc_dwarf.hpp
   src/mc/inspect/mc_dwarf_attrnames.cpp
   src/mc/inspect/mc_dwarf_tagnames.cpp
   src/mc/inspect/mc_member.cpp
-  src/mc/inspect/mc_unw.hpp
   src/mc/inspect/mc_unw.cpp
+  src/mc/inspect/mc_unw.hpp
   src/mc/inspect/mc_unw_vmread.cpp
 
   src/mc/remote/AppSide.cpp
@@ -600,52 +601,53 @@ set(MC_SRC
   src/mc/remote/Channel.hpp
   src/mc/remote/CheckerSide.cpp
   src/mc/remote/CheckerSide.hpp
-  src/mc/remote/RemoteProcess.hpp
   src/mc/remote/RemoteProcess.cpp
+  src/mc/remote/RemoteProcess.hpp
   src/mc/remote/RemotePtr.hpp
   src/mc/remote/mc_protocol.h
 
-  src/mc/sosp/PageStore.hpp
-  src/mc/sosp/PageStore.cpp
-  src/mc/sosp/ChunkedData.hpp
   src/mc/sosp/ChunkedData.cpp
+  src/mc/sosp/ChunkedData.hpp
+  src/mc/sosp/PageStore.cpp
+  src/mc/sosp/PageStore.hpp
   src/mc/sosp/Region.cpp
   src/mc/sosp/Region.hpp
-  src/mc/sosp/Snapshot.hpp
   src/mc/sosp/Snapshot.cpp
+  src/mc/sosp/Snapshot.hpp
+
+  src/mc/transition/Transition.hpp
+  src/mc/transition/TransitionAny.cpp
+  src/mc/transition/TransitionAny.hpp
+  src/mc/transition/TransitionComm.cpp
+  src/mc/transition/TransitionComm.hpp
+  src/mc/transition/TransitionRandom.cpp
+  src/mc/transition/TransitionRandom.hpp
+  src/mc/transition/TransitionSynchro.cpp
+  src/mc/transition/TransitionSynchro.hpp
 
   src/mc/AddressSpace.hpp
-  src/mc/ModelChecker.hpp
   src/mc/ModelChecker.cpp
-  src/mc/mc_forward.hpp
+  src/mc/ModelChecker.hpp
   src/mc/Session.cpp
   src/mc/Session.hpp
-  src/mc/mc_pattern.hpp
-  src/mc/compare.cpp
+  src/mc/VisitedState.cpp
+  src/mc/VisitedState.hpp
   src/mc/api.cpp
   src/mc/api.hpp
-  src/mc/mc_hash.hpp
+  src/mc/api/State.cpp
+  src/mc/api/State.hpp
+  src/mc/compare.cpp
+  src/mc/mc_client_api.cpp
+  src/mc/mc_exit.hpp
+  src/mc/mc_forward.hpp
   src/mc/mc_hash.cpp
+  src/mc/mc_hash.hpp
   src/mc/mc_ignore.hpp
-  src/mc/mc_record.cpp
+  src/mc/mc_pattern.hpp
   src/mc/mc_private.hpp
+  src/mc/mc_record.cpp
   src/mc/mc_safety.hpp
-  src/mc/VisitedState.cpp
-  src/mc/VisitedState.hpp
-  src/mc/mc_client_api.cpp
   src/mc/mc_smx.cpp
-  src/mc/mc_exit.hpp
-  src/mc/api/State.hpp
-  src/mc/api/State.cpp
-  src/mc/transition/Transition.hpp
-  src/mc/transition/TransitionAny.cpp
-  src/mc/transition/TransitionAny.hpp
-  src/mc/transition/TransitionComm.cpp
-  src/mc/transition/TransitionComm.hpp
-  src/mc/transition/TransitionRandom.cpp
-  src/mc/transition/TransitionRandom.hpp
-  src/mc/transition/TransitionSynchro.cpp
-  src/mc/transition/TransitionSynchro.hpp
   src/mc/udpor_global.cpp
   src/mc/udpor_global.hpp
   )
@@ -988,9 +990,9 @@ set(DOC_TOOLS
 
 # these files get copied automatically to the html documentation
 set(DOC_IMG
-  ${CMAKE_HOME_DIRECTORY}/doc/webcruft/eclipseScreenShot.png
   ${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot.jpg
   ${CMAKE_HOME_DIRECTORY}/doc/webcruft/Paje_MSG_screenshot_thn.jpg
+  ${CMAKE_HOME_DIRECTORY}/doc/webcruft/eclipseScreenShot.png
   ${CMAKE_HOME_DIRECTORY}/doc/webcruft/output.goal.pdf
   )
 
@@ -998,8 +1000,8 @@ set(bin_files
   ${bin_files}
   src/smpi/smpicc.in
   src/smpi/smpicxx.in
-  src/smpi/smpiff.in
   src/smpi/smpif90.in
+  src/smpi/smpiff.in
   src/smpi/smpirun.in
   src/smpi/smpitools.sh
   )
@@ -1008,26 +1010,26 @@ set(txt_files
   ${txt_files}
   AUTHORS
   COPYING
-  README.md
   ChangeLog
   LICENSE-LGPL-2.1
   NEWS
+  README.md
   )
 
 # The list of cmake build directories is constructed from the following list.
 # Add your CMakeLists file here to see your subdir built.
 set(CMAKEFILES_TXT
-  examples/platforms/CMakeLists.txt
   examples/c/CMakeLists.txt
   examples/cpp/CMakeLists.txt
+  examples/deprecated/java/CMakeLists.txt
+  examples/platforms/CMakeLists.txt
+  examples/python/CMakeLists.txt
   examples/smpi/CMakeLists.txt
-  examples/smpi/comm_dynamic_costs/CMakeLists.txt
   examples/smpi/NAS/CMakeLists.txt
-  examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
+  examples/smpi/comm_dynamic_costs/CMakeLists.txt
   examples/smpi/replay_multiple/CMakeLists.txt
   examples/smpi/replay_multiple_manual_deploy/CMakeLists.txt
-  examples/python/CMakeLists.txt
-  examples/deprecated/java/CMakeLists.txt
+  examples/smpi/smpi_s4u_masterworker/CMakeLists.txt
 
   teshsuite/java/CMakeLists.txt
   teshsuite/kernel/CMakeLists.txt
@@ -1038,8 +1040,6 @@ set(CMAKEFILES_TXT
   teshsuite/python/CMakeLists.txt
   teshsuite/s4u/CMakeLists.txt
   teshsuite/smpi/CMakeLists.txt
-  teshsuite/surf/CMakeLists.txt
-  teshsuite/xbt/CMakeLists.txt
 
   teshsuite/smpi/MBI/CMakeLists.txt
   teshsuite/smpi/mpich3-test/CMakeLists.txt
@@ -1050,31 +1050,33 @@ set(CMAKEFILES_TXT
   teshsuite/smpi/mpich3-test/errhan/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/attr/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/coll/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/f77/info/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/comm/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/datatype/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/ext/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/f77/info/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/init/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/pt2pt/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/f77/topo/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f77/rma/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/f77/topo/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/coll/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/datatype/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/info/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/init/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/pt2pt/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt
   teshsuite/smpi/mpich3-test/f90/rma/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/f90/util/CMakeLists.txt
   teshsuite/smpi/mpich3-test/group/CMakeLists.txt
   teshsuite/smpi/mpich3-test/info/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/io/CMakeLists.txt
   teshsuite/smpi/mpich3-test/init/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/io/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/perf/CMakeLists.txt
   teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/topo/CMakeLists.txt
   teshsuite/smpi/mpich3-test/rma/CMakeLists.txt
-  teshsuite/smpi/mpich3-test/perf/CMakeLists.txt
+  teshsuite/smpi/mpich3-test/topo/CMakeLists.txt
 
+  teshsuite/surf/CMakeLists.txt
+  teshsuite/xbt/CMakeLists.txt
   tools/CMakeLists.txt
   tools/graphicator/CMakeLists.txt
   tools/tesh/CMakeLists.txt
@@ -1083,27 +1085,31 @@ set(CMAKEFILES_TXT
 set(CMAKE_SOURCE_FILES
   CMakeLists.txt
   FindSimGrid.cmake
-  tools/cmake/Tests.cmake
+  MANIFEST.in
+  MANIFEST.in.in
+  setup.py
   tools/cmake/CTestConfig.cmake
   tools/cmake/CTestCustom.cmake
   tools/cmake/DefinePackages.cmake
   tools/cmake/Distrib.cmake
-  tools/cmake/Flags.cmake
   tools/cmake/Documentation.cmake
-  tools/cmake/MaintainerMode.cmake
+  tools/cmake/Flags.cmake
   tools/cmake/Java.cmake
+  tools/cmake/MaintainerMode.cmake
   tools/cmake/MakeLib.cmake
   tools/cmake/MakeLibWin.cmake
   tools/cmake/Modules/FindGraphviz.cmake
   tools/cmake/Modules/FindLibdw.cmake
   tools/cmake/Modules/FindLibelf.cmake
-  tools/cmake/Modules/FindLibunwind.cmake
   tools/cmake/Modules/FindLibevent.cmake
+  tools/cmake/Modules/FindLibunwind.cmake
   tools/cmake/Modules/FindNS3.cmake
   tools/cmake/Modules/FindPAPI.cmake
-  tools/cmake/Modules/pybind11Config.cmake
   tools/cmake/Modules/FindValgrind.cmake
+  tools/cmake/Modules/pybind11Config.cmake
   tools/cmake/Option.cmake
+  tools/cmake/Tests.cmake
+  tools/cmake/cross-mingw.cmake
   tools/cmake/scripts/fixup_simgrid_dtd_l.pl
   tools/cmake/scripts/my_valgrind.pl
   tools/cmake/scripts/update_tesh.pl
@@ -1112,85 +1118,83 @@ set(CMAKE_SOURCE_FILES
   tools/cmake/test_prog/prog_stackgrowth.c
   tools/cmake/test_prog/prog_stacksetup.c
   tools/cmake/test_prog/prog_tsan.cpp
-  tools/cmake/cross-mingw.cmake
   tools/simgrid-monkey
   tools/smpi/generate_smpi_defines.pl
+  tools/stack-cleaner/README
   tools/stack-cleaner/as
-  tools/stack-cleaner/cc
   tools/stack-cleaner/c++
-  tools/stack-cleaner/fortran
+  tools/stack-cleaner/cc
   tools/stack-cleaner/clean-stack-filter
   tools/stack-cleaner/compiler-wrapper
-  tools/stack-cleaner/README
-
-  setup.py
-  MANIFEST.in
-  MANIFEST.in.in
+  tools/stack-cleaner/fortran
   )
 
 set(PLATFORMS_EXAMPLES
-  examples/platforms/bypassZoneRoute.xml
   examples/platforms/bypassRoute.xml
+  examples/platforms/bypassZoneRoute.xml
   examples/platforms/cloud.xml
-  examples/platforms/cluster_backbone.xml
-  examples/platforms/cluster_backbone.svg
-  examples/platforms/cluster_multi.xml
   examples/platforms/cluster_and_one_host.xml
-  examples/platforms/cluster_crossbar.xml
+  examples/platforms/cluster_backbone.svg
+  examples/platforms/cluster_backbone.xml
   examples/platforms/cluster_crossbar.svg
-  examples/platforms/cluster_fat_tree.xml
+  examples/platforms/cluster_crossbar.xml
+  examples/platforms/cluster_dragonfly.svg
+  examples/platforms/cluster_dragonfly.xml
   examples/platforms/cluster_fat_tree.svg
-  examples/platforms/cluster_torus.xml
+  examples/platforms/cluster_fat_tree.xml
+  examples/platforms/cluster_multi.xml
   examples/platforms/cluster_torus.svg
-  examples/platforms/cluster_dragonfly.xml
-  examples/platforms/cluster_dragonfly.svg
-  examples/platforms/crosstraffic.xml
-  examples/platforms/optorsim/gridpp_grid_2004.conf
-  examples/platforms/optorsim/lcg_sept2004_grid.conf
-  examples/platforms/optorsim/transform_optorsim_platform.pl
+  examples/platforms/cluster_torus.xml
   examples/platforms/config.xml
   examples/platforms/config_tracing.xml
-  examples/platforms/model_checker_platform.xml
-  examples/platforms/profiles/fafard_state.profile
-  examples/platforms/profiles/faulty_host.profile
-  examples/platforms/profiles/ginette_state.profile
-  examples/platforms/profiles/jupiter_speed.profile
-  examples/platforms/profiles/jupiter_state.profile
-  examples/platforms/profiles/link1_bandwidth.profile
-  examples/platforms/profiles/link1_latency.profile
-  examples/platforms/profiles/link3_state.profile
-  examples/platforms/profiles/link4_state.profile
-  examples/platforms/profiles/trace_A_failure.txt
-  examples/platforms/profiles/trace_A.txt
-  examples/platforms/profiles/trace_B.txt
+  examples/platforms/crosstraffic.xml
   examples/platforms/data_center.xml
   examples/platforms/dogbone.xml
   examples/platforms/energy_boot.xml
-  examples/platforms/energy_platform.xml
   examples/platforms/energy_cluster.xml
+  examples/platforms/energy_platform.xml
   examples/platforms/faulty_host.xml
   examples/platforms/g5k.xml
   examples/platforms/griffon.cpp
   examples/platforms/griffon.xml
   examples/platforms/hosts_with_disks.xml
   examples/platforms/meta_cluster.xml
+  examples/platforms/model_checker_platform.xml
   examples/platforms/multicore_machine.xml
   examples/platforms/ns3-big-cluster.xml
   examples/platforms/onelink.xml
-  examples/platforms/ptask_L07.xml
+  examples/platforms/optorsim/gridpp_grid_2004.conf
+  examples/platforms/optorsim/lcg_sept2004_grid.conf
+  examples/platforms/optorsim/transform_optorsim_platform.pl
+  examples/platforms/profiles/fafard_state.profile
+  examples/platforms/profiles/faulty_host.profile
+  examples/platforms/profiles/ginette_state.profile
+  examples/platforms/profiles/jupiter_speed.profile
+  examples/platforms/profiles/jupiter_state.profile
+  examples/platforms/profiles/link1_bandwidth.profile
+  examples/platforms/profiles/link1_latency.profile
+  examples/platforms/profiles/link3_state.profile
+  examples/platforms/profiles/link4_state.profile
+  examples/platforms/profiles/trace_A.txt
+  examples/platforms/profiles/trace_A_failure.txt
+  examples/platforms/profiles/trace_B.txt
   examples/platforms/prop.xml
-  examples/platforms/routing_cluster.xml
+  examples/platforms/ptask_L07.xml
   examples/platforms/routing_cluster.cpp
+  examples/platforms/routing_cluster.xml
   examples/platforms/simulacrum_7_hosts.xml
-  examples/platforms/storage/content/small_content.txt
-  examples/platforms/storage/content/storage_content.txt
   examples/platforms/small_platform.xml
-  examples/platforms/small_platform_routing_none.xml
   examples/platforms/small_platform_failures.xml
   examples/platforms/small_platform_fatpipe.xml
   examples/platforms/small_platform_one_link_routes.xml
   examples/platforms/small_platform_profile.xml
+  examples/platforms/small_platform_routing_none.xml
   examples/platforms/small_platform_with_routers.xml
+  examples/platforms/storage/content/small_content.txt
+  examples/platforms/storage/content/storage_content.txt
+  examples/platforms/supernode.cpp
+  examples/platforms/supernode.py
+  examples/platforms/supernode.svg
   examples/platforms/syscoord/generate_peer_platform.pl
   examples/platforms/syscoord/median_harvard.syscoord
   examples/platforms/syscoord/median_meridian.syscoord
@@ -1198,13 +1202,13 @@ set(PLATFORMS_EXAMPLES
   examples/platforms/three_multicore_hosts.xml
   examples/platforms/two_hosts.xml
   examples/platforms/two_hosts_platform_shared.xml
-  examples/platforms/two_hosts_profiles.xml
   examples/platforms/two_hosts_platform_with_availability_included.xml
+  examples/platforms/two_hosts_profiles.xml
   examples/platforms/two_peers.xml
   examples/platforms/vivaldi.xml
+  examples/platforms/wifi.xml
   examples/platforms/wifi_energy.xml
   examples/platforms/wifi_ns3.xml
-  examples/platforms/wifi.xml
   )
 
 set(generated_src_files
index 100ed73..fe87aab 100644 (file)
@@ -3,6 +3,7 @@ add_dependencies     (tests       graphicator)
 target_link_libraries(graphicator simgrid)
 set_target_properties(graphicator PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
 ADD_TESH(graphicator --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin
+                     --setenv libdir=${CMAKE_BINARY_DIR}/lib
                      --cd ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/graphicator.tesh)
 
 install(TARGETS graphicator DESTINATION ${CMAKE_INSTALL_BINDIR}/)
index 284ec19..bc9a50a 100644 (file)
@@ -13,6 +13,7 @@ int main(int argc, char** argv)
   xbt_assert(argc == 3, "Usage: %s <platform_file.xml> <graphviz_file.dot|graphviz_file.csv>", argv[0]);
 
   e.load_platform(argv[1]);
+  e.seal_platform();
 
   const std::string outputfile(argv[2]);
   const std::string extension = outputfile.substr(outputfile.find_last_of(".") + 1);
index 928b6ab..91911e5 100644 (file)
@@ -53,32 +53,342 @@ $ cat test.dot
 
 $ rm -f test.dot
 
-$ ${bindir:=.}/graphicator ${srcdir:=.}/teshsuite/platforms/one_cluster.xml test.csv
+$ ${bindir:=.}/graphicator ${libdir:=.}/libsupernode.so test.csv
 > Dumping to CSV file
 
 $ cat test.csv
 > src,dst
-> bob_cluster_link_0_DOWN,bob0.hamburger.edu
-> bob_cluster_link_2_DOWN,bob2.hamburger.edu
-> bob_cluster_link_3_DOWN,bob3.hamburger.edu
-> bob_cluster_link_4_DOWN,bob4.hamburger.edu
-> bob_cluster_link_6_DOWN,bob6.hamburger.edu
-> bob_cluster_link_0_UP,bob_cluster_backbone
-> bob_cluster_link_2_UP,bob_cluster_backbone
-> bob_cluster_link_3_UP,bob_cluster_backbone
-> bob_cluster_link_4_UP,bob_cluster_backbone
-> bob_cluster_link_6_UP,bob_cluster_backbone
-> bob_cluster_backbone,bob_cluster_link_0_DOWN
-> bob0.hamburger.edu,bob_cluster_link_0_UP
-> bob_cluster_backbone,bob_cluster_link_2_DOWN
-> bob2.hamburger.edu,bob_cluster_link_2_UP
-> bob_cluster_backbone,bob_cluster_link_3_DOWN
-> bob3.hamburger.edu,bob_cluster_link_3_UP
-> bob_cluster_backbone,bob_cluster_link_4_DOWN
-> bob4.hamburger.edu,bob_cluster_link_4_UP
-> bob_cluster_backbone,bob_cluster_link_6_DOWN
-> bob6.hamburger.edu,bob_cluster_link_6_UP
-> bob_cluster_backbone,bob_cluster
-> bobbob_cluster_router.hamburger.edu,bob_cluster
+> link_cluster_supernode-00_node-00_cpu-00_DOWN,cluster_supernode-00_node-00_cpu-00
+> link_cluster_supernode-00_node-00_cpu-01_DOWN,cluster_supernode-00_node-00_cpu-01
+> link_cluster_supernode-00_node-00_cpu-00_UP,cluster_supernode-00_node-00
+> link_cluster_supernode-00_node-00_cpu-01_UP,cluster_supernode-00_node-00
+> router_cluster_supernode-00_node-00,cluster_supernode-00_node-00
+> link_cluster_supernode-00_node-01_cpu-00_DOWN,cluster_supernode-00_node-01_cpu-00
+> link_cluster_supernode-00_node-01_cpu-01_DOWN,cluster_supernode-00_node-01_cpu-01
+> link_cluster_supernode-00_node-01_cpu-00_UP,cluster_supernode-00_node-01
+> link_cluster_supernode-00_node-01_cpu-01_UP,cluster_supernode-00_node-01
+> router_cluster_supernode-00_node-01,cluster_supernode-00_node-01
+> link_cluster_supernode-00_node-02_cpu-00_DOWN,cluster_supernode-00_node-02_cpu-00
+> link_cluster_supernode-00_node-02_cpu-01_DOWN,cluster_supernode-00_node-02_cpu-01
+> link_cluster_supernode-00_node-02_cpu-00_UP,cluster_supernode-00_node-02
+> link_cluster_supernode-00_node-02_cpu-01_UP,cluster_supernode-00_node-02
+> router_cluster_supernode-00_node-02,cluster_supernode-00_node-02
+> link_cluster_supernode-00_node-03_cpu-00_DOWN,cluster_supernode-00_node-03_cpu-00
+> link_cluster_supernode-00_node-03_cpu-01_DOWN,cluster_supernode-00_node-03_cpu-01
+> link_cluster_supernode-00_node-03_cpu-00_UP,cluster_supernode-00_node-03
+> link_cluster_supernode-00_node-03_cpu-01_UP,cluster_supernode-00_node-03
+> router_cluster_supernode-00_node-03,cluster_supernode-00_node-03
+> link_cluster_supernode-00_node-04_cpu-00_DOWN,cluster_supernode-00_node-04_cpu-00
+> link_cluster_supernode-00_node-04_cpu-01_DOWN,cluster_supernode-00_node-04_cpu-01
+> link_cluster_supernode-00_node-04_cpu-00_UP,cluster_supernode-00_node-04
+> link_cluster_supernode-00_node-04_cpu-01_UP,cluster_supernode-00_node-04
+> router_cluster_supernode-00_node-04,cluster_supernode-00_node-04
+> link_cluster_supernode-00_node-05_cpu-00_DOWN,cluster_supernode-00_node-05_cpu-00
+> link_cluster_supernode-00_node-05_cpu-01_DOWN,cluster_supernode-00_node-05_cpu-01
+> link_cluster_supernode-00_node-05_cpu-00_UP,cluster_supernode-00_node-05
+> link_cluster_supernode-00_node-05_cpu-01_UP,cluster_supernode-00_node-05
+> router_cluster_supernode-00_node-05,cluster_supernode-00_node-05
+> link_cluster_supernode-00_node-00_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-01_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-02_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-03_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-04_UP,cluster_supernode-00
+> link_cluster_supernode-00_node-05_UP,cluster_supernode-00
+> router_cluster_supernode-00,cluster_supernode-00
+> link_cluster_supernode-01_node-00_cpu-00_DOWN,cluster_supernode-01_node-00_cpu-00
+> link_cluster_supernode-01_node-00_cpu-01_DOWN,cluster_supernode-01_node-00_cpu-01
+> link_cluster_supernode-01_node-00_cpu-00_UP,cluster_supernode-01_node-00
+> link_cluster_supernode-01_node-00_cpu-01_UP,cluster_supernode-01_node-00
+> router_cluster_supernode-01_node-00,cluster_supernode-01_node-00
+> link_cluster_supernode-01_node-01_cpu-00_DOWN,cluster_supernode-01_node-01_cpu-00
+> link_cluster_supernode-01_node-01_cpu-01_DOWN,cluster_supernode-01_node-01_cpu-01
+> link_cluster_supernode-01_node-01_cpu-00_UP,cluster_supernode-01_node-01
+> link_cluster_supernode-01_node-01_cpu-01_UP,cluster_supernode-01_node-01
+> router_cluster_supernode-01_node-01,cluster_supernode-01_node-01
+> link_cluster_supernode-01_node-02_cpu-00_DOWN,cluster_supernode-01_node-02_cpu-00
+> link_cluster_supernode-01_node-02_cpu-01_DOWN,cluster_supernode-01_node-02_cpu-01
+> link_cluster_supernode-01_node-02_cpu-00_UP,cluster_supernode-01_node-02
+> link_cluster_supernode-01_node-02_cpu-01_UP,cluster_supernode-01_node-02
+> router_cluster_supernode-01_node-02,cluster_supernode-01_node-02
+> link_cluster_supernode-01_node-03_cpu-00_DOWN,cluster_supernode-01_node-03_cpu-00
+> link_cluster_supernode-01_node-03_cpu-01_DOWN,cluster_supernode-01_node-03_cpu-01
+> link_cluster_supernode-01_node-03_cpu-00_UP,cluster_supernode-01_node-03
+> link_cluster_supernode-01_node-03_cpu-01_UP,cluster_supernode-01_node-03
+> router_cluster_supernode-01_node-03,cluster_supernode-01_node-03
+> link_cluster_supernode-01_node-04_cpu-00_DOWN,cluster_supernode-01_node-04_cpu-00
+> link_cluster_supernode-01_node-04_cpu-01_DOWN,cluster_supernode-01_node-04_cpu-01
+> link_cluster_supernode-01_node-04_cpu-00_UP,cluster_supernode-01_node-04
+> link_cluster_supernode-01_node-04_cpu-01_UP,cluster_supernode-01_node-04
+> router_cluster_supernode-01_node-04,cluster_supernode-01_node-04
+> link_cluster_supernode-01_node-05_cpu-00_DOWN,cluster_supernode-01_node-05_cpu-00
+> link_cluster_supernode-01_node-05_cpu-01_DOWN,cluster_supernode-01_node-05_cpu-01
+> link_cluster_supernode-01_node-05_cpu-00_UP,cluster_supernode-01_node-05
+> link_cluster_supernode-01_node-05_cpu-01_UP,cluster_supernode-01_node-05
+> router_cluster_supernode-01_node-05,cluster_supernode-01_node-05
+> link_cluster_supernode-01_node-00_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-01_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-02_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-03_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-04_UP,cluster_supernode-01
+> link_cluster_supernode-01_node-05_UP,cluster_supernode-01
+> router_cluster_supernode-01,cluster_supernode-01
+> link_cluster_supernode-02_node-00_cpu-00_DOWN,cluster_supernode-02_node-00_cpu-00
+> link_cluster_supernode-02_node-00_cpu-01_DOWN,cluster_supernode-02_node-00_cpu-01
+> link_cluster_supernode-02_node-00_cpu-00_UP,cluster_supernode-02_node-00
+> link_cluster_supernode-02_node-00_cpu-01_UP,cluster_supernode-02_node-00
+> router_cluster_supernode-02_node-00,cluster_supernode-02_node-00
+> link_cluster_supernode-02_node-01_cpu-00_DOWN,cluster_supernode-02_node-01_cpu-00
+> link_cluster_supernode-02_node-01_cpu-01_DOWN,cluster_supernode-02_node-01_cpu-01
+> link_cluster_supernode-02_node-01_cpu-00_UP,cluster_supernode-02_node-01
+> link_cluster_supernode-02_node-01_cpu-01_UP,cluster_supernode-02_node-01
+> router_cluster_supernode-02_node-01,cluster_supernode-02_node-01
+> link_cluster_supernode-02_node-02_cpu-00_DOWN,cluster_supernode-02_node-02_cpu-00
+> link_cluster_supernode-02_node-02_cpu-01_DOWN,cluster_supernode-02_node-02_cpu-01
+> link_cluster_supernode-02_node-02_cpu-00_UP,cluster_supernode-02_node-02
+> link_cluster_supernode-02_node-02_cpu-01_UP,cluster_supernode-02_node-02
+> router_cluster_supernode-02_node-02,cluster_supernode-02_node-02
+> link_cluster_supernode-02_node-03_cpu-00_DOWN,cluster_supernode-02_node-03_cpu-00
+> link_cluster_supernode-02_node-03_cpu-01_DOWN,cluster_supernode-02_node-03_cpu-01
+> link_cluster_supernode-02_node-03_cpu-00_UP,cluster_supernode-02_node-03
+> link_cluster_supernode-02_node-03_cpu-01_UP,cluster_supernode-02_node-03
+> router_cluster_supernode-02_node-03,cluster_supernode-02_node-03
+> link_cluster_supernode-02_node-04_cpu-00_DOWN,cluster_supernode-02_node-04_cpu-00
+> link_cluster_supernode-02_node-04_cpu-01_DOWN,cluster_supernode-02_node-04_cpu-01
+> link_cluster_supernode-02_node-04_cpu-00_UP,cluster_supernode-02_node-04
+> link_cluster_supernode-02_node-04_cpu-01_UP,cluster_supernode-02_node-04
+> router_cluster_supernode-02_node-04,cluster_supernode-02_node-04
+> link_cluster_supernode-02_node-05_cpu-00_DOWN,cluster_supernode-02_node-05_cpu-00
+> link_cluster_supernode-02_node-05_cpu-01_DOWN,cluster_supernode-02_node-05_cpu-01
+> link_cluster_supernode-02_node-05_cpu-00_UP,cluster_supernode-02_node-05
+> link_cluster_supernode-02_node-05_cpu-01_UP,cluster_supernode-02_node-05
+> router_cluster_supernode-02_node-05,cluster_supernode-02_node-05
+> link_cluster_supernode-02_node-00_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-01_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-02_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-03_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-04_UP,cluster_supernode-02
+> link_cluster_supernode-02_node-05_UP,cluster_supernode-02
+> router_cluster_supernode-02,cluster_supernode-02
+> link_cluster_supernode-03_node-00_cpu-00_DOWN,cluster_supernode-03_node-00_cpu-00
+> link_cluster_supernode-03_node-00_cpu-01_DOWN,cluster_supernode-03_node-00_cpu-01
+> link_cluster_supernode-03_node-00_cpu-00_UP,cluster_supernode-03_node-00
+> link_cluster_supernode-03_node-00_cpu-01_UP,cluster_supernode-03_node-00
+> router_cluster_supernode-03_node-00,cluster_supernode-03_node-00
+> link_cluster_supernode-03_node-01_cpu-00_DOWN,cluster_supernode-03_node-01_cpu-00
+> link_cluster_supernode-03_node-01_cpu-01_DOWN,cluster_supernode-03_node-01_cpu-01
+> link_cluster_supernode-03_node-01_cpu-00_UP,cluster_supernode-03_node-01
+> link_cluster_supernode-03_node-01_cpu-01_UP,cluster_supernode-03_node-01
+> router_cluster_supernode-03_node-01,cluster_supernode-03_node-01
+> link_cluster_supernode-03_node-02_cpu-00_DOWN,cluster_supernode-03_node-02_cpu-00
+> link_cluster_supernode-03_node-02_cpu-01_DOWN,cluster_supernode-03_node-02_cpu-01
+> link_cluster_supernode-03_node-02_cpu-00_UP,cluster_supernode-03_node-02
+> link_cluster_supernode-03_node-02_cpu-01_UP,cluster_supernode-03_node-02
+> router_cluster_supernode-03_node-02,cluster_supernode-03_node-02
+> link_cluster_supernode-03_node-03_cpu-00_DOWN,cluster_supernode-03_node-03_cpu-00
+> link_cluster_supernode-03_node-03_cpu-01_DOWN,cluster_supernode-03_node-03_cpu-01
+> link_cluster_supernode-03_node-03_cpu-00_UP,cluster_supernode-03_node-03
+> link_cluster_supernode-03_node-03_cpu-01_UP,cluster_supernode-03_node-03
+> router_cluster_supernode-03_node-03,cluster_supernode-03_node-03
+> link_cluster_supernode-03_node-04_cpu-00_DOWN,cluster_supernode-03_node-04_cpu-00
+> link_cluster_supernode-03_node-04_cpu-01_DOWN,cluster_supernode-03_node-04_cpu-01
+> link_cluster_supernode-03_node-04_cpu-00_UP,cluster_supernode-03_node-04
+> link_cluster_supernode-03_node-04_cpu-01_UP,cluster_supernode-03_node-04
+> router_cluster_supernode-03_node-04,cluster_supernode-03_node-04
+> link_cluster_supernode-03_node-05_cpu-00_DOWN,cluster_supernode-03_node-05_cpu-00
+> link_cluster_supernode-03_node-05_cpu-01_DOWN,cluster_supernode-03_node-05_cpu-01
+> link_cluster_supernode-03_node-05_cpu-00_UP,cluster_supernode-03_node-05
+> link_cluster_supernode-03_node-05_cpu-01_UP,cluster_supernode-03_node-05
+> router_cluster_supernode-03_node-05,cluster_supernode-03_node-05
+> link_cluster_supernode-03_node-00_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-01_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-02_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-03_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-04_UP,cluster_supernode-03
+> link_cluster_supernode-03_node-05_UP,cluster_supernode-03
+> router_cluster_supernode-03,cluster_supernode-03
+> link_cluster_supernode-00_UP,cluster
+> link_cluster_supernode-01_UP,cluster
+> link_cluster_supernode-02_UP,cluster
+> link_cluster_supernode-03_UP,cluster
+> cluster,link_cluster_supernode-00_DOWN
+> router_cluster_supernode-00,link_cluster_supernode-00_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-00_DOWN
+> router_cluster_supernode-00_node-00,link_cluster_supernode-00_node-00_UP
+> cluster_supernode-00_node-00,link_cluster_supernode-00_node-00_cpu-00_DOWN
+> cluster_supernode-00_node-00_cpu-00,link_cluster_supernode-00_node-00_cpu-00_UP
+> cluster_supernode-00_node-00,link_cluster_supernode-00_node-00_cpu-01_DOWN
+> cluster_supernode-00_node-00_cpu-01,link_cluster_supernode-00_node-00_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-01_DOWN
+> router_cluster_supernode-00_node-01,link_cluster_supernode-00_node-01_UP
+> cluster_supernode-00_node-01,link_cluster_supernode-00_node-01_cpu-00_DOWN
+> cluster_supernode-00_node-01_cpu-00,link_cluster_supernode-00_node-01_cpu-00_UP
+> cluster_supernode-00_node-01,link_cluster_supernode-00_node-01_cpu-01_DOWN
+> cluster_supernode-00_node-01_cpu-01,link_cluster_supernode-00_node-01_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-02_DOWN
+> router_cluster_supernode-00_node-02,link_cluster_supernode-00_node-02_UP
+> cluster_supernode-00_node-02,link_cluster_supernode-00_node-02_cpu-00_DOWN
+> cluster_supernode-00_node-02_cpu-00,link_cluster_supernode-00_node-02_cpu-00_UP
+> cluster_supernode-00_node-02,link_cluster_supernode-00_node-02_cpu-01_DOWN
+> cluster_supernode-00_node-02_cpu-01,link_cluster_supernode-00_node-02_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-03_DOWN
+> router_cluster_supernode-00_node-03,link_cluster_supernode-00_node-03_UP
+> cluster_supernode-00_node-03,link_cluster_supernode-00_node-03_cpu-00_DOWN
+> cluster_supernode-00_node-03_cpu-00,link_cluster_supernode-00_node-03_cpu-00_UP
+> cluster_supernode-00_node-03,link_cluster_supernode-00_node-03_cpu-01_DOWN
+> cluster_supernode-00_node-03_cpu-01,link_cluster_supernode-00_node-03_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-04_DOWN
+> router_cluster_supernode-00_node-04,link_cluster_supernode-00_node-04_UP
+> cluster_supernode-00_node-04,link_cluster_supernode-00_node-04_cpu-00_DOWN
+> cluster_supernode-00_node-04_cpu-00,link_cluster_supernode-00_node-04_cpu-00_UP
+> cluster_supernode-00_node-04,link_cluster_supernode-00_node-04_cpu-01_DOWN
+> cluster_supernode-00_node-04_cpu-01,link_cluster_supernode-00_node-04_cpu-01_UP
+> cluster_supernode-00,link_cluster_supernode-00_node-05_DOWN
+> router_cluster_supernode-00_node-05,link_cluster_supernode-00_node-05_UP
+> cluster_supernode-00_node-05,link_cluster_supernode-00_node-05_cpu-00_DOWN
+> cluster_supernode-00_node-05_cpu-00,link_cluster_supernode-00_node-05_cpu-00_UP
+> cluster_supernode-00_node-05,link_cluster_supernode-00_node-05_cpu-01_DOWN
+> cluster_supernode-00_node-05_cpu-01,link_cluster_supernode-00_node-05_cpu-01_UP
+> cluster,link_cluster_supernode-01_DOWN
+> router_cluster_supernode-01,link_cluster_supernode-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-00_DOWN
+> router_cluster_supernode-01_node-00,link_cluster_supernode-01_node-00_UP
+> cluster_supernode-01_node-00,link_cluster_supernode-01_node-00_cpu-00_DOWN
+> cluster_supernode-01_node-00_cpu-00,link_cluster_supernode-01_node-00_cpu-00_UP
+> cluster_supernode-01_node-00,link_cluster_supernode-01_node-00_cpu-01_DOWN
+> cluster_supernode-01_node-00_cpu-01,link_cluster_supernode-01_node-00_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-01_DOWN
+> router_cluster_supernode-01_node-01,link_cluster_supernode-01_node-01_UP
+> cluster_supernode-01_node-01,link_cluster_supernode-01_node-01_cpu-00_DOWN
+> cluster_supernode-01_node-01_cpu-00,link_cluster_supernode-01_node-01_cpu-00_UP
+> cluster_supernode-01_node-01,link_cluster_supernode-01_node-01_cpu-01_DOWN
+> cluster_supernode-01_node-01_cpu-01,link_cluster_supernode-01_node-01_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-02_DOWN
+> router_cluster_supernode-01_node-02,link_cluster_supernode-01_node-02_UP
+> cluster_supernode-01_node-02,link_cluster_supernode-01_node-02_cpu-00_DOWN
+> cluster_supernode-01_node-02_cpu-00,link_cluster_supernode-01_node-02_cpu-00_UP
+> cluster_supernode-01_node-02,link_cluster_supernode-01_node-02_cpu-01_DOWN
+> cluster_supernode-01_node-02_cpu-01,link_cluster_supernode-01_node-02_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-03_DOWN
+> router_cluster_supernode-01_node-03,link_cluster_supernode-01_node-03_UP
+> cluster_supernode-01_node-03,link_cluster_supernode-01_node-03_cpu-00_DOWN
+> cluster_supernode-01_node-03_cpu-00,link_cluster_supernode-01_node-03_cpu-00_UP
+> cluster_supernode-01_node-03,link_cluster_supernode-01_node-03_cpu-01_DOWN
+> cluster_supernode-01_node-03_cpu-01,link_cluster_supernode-01_node-03_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-04_DOWN
+> router_cluster_supernode-01_node-04,link_cluster_supernode-01_node-04_UP
+> cluster_supernode-01_node-04,link_cluster_supernode-01_node-04_cpu-00_DOWN
+> cluster_supernode-01_node-04_cpu-00,link_cluster_supernode-01_node-04_cpu-00_UP
+> cluster_supernode-01_node-04,link_cluster_supernode-01_node-04_cpu-01_DOWN
+> cluster_supernode-01_node-04_cpu-01,link_cluster_supernode-01_node-04_cpu-01_UP
+> cluster_supernode-01,link_cluster_supernode-01_node-05_DOWN
+> router_cluster_supernode-01_node-05,link_cluster_supernode-01_node-05_UP
+> cluster_supernode-01_node-05,link_cluster_supernode-01_node-05_cpu-00_DOWN
+> cluster_supernode-01_node-05_cpu-00,link_cluster_supernode-01_node-05_cpu-00_UP
+> cluster_supernode-01_node-05,link_cluster_supernode-01_node-05_cpu-01_DOWN
+> cluster_supernode-01_node-05_cpu-01,link_cluster_supernode-01_node-05_cpu-01_UP
+> cluster,link_cluster_supernode-02_DOWN
+> router_cluster_supernode-02,link_cluster_supernode-02_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-00_DOWN
+> router_cluster_supernode-02_node-00,link_cluster_supernode-02_node-00_UP
+> cluster_supernode-02_node-00,link_cluster_supernode-02_node-00_cpu-00_DOWN
+> cluster_supernode-02_node-00_cpu-00,link_cluster_supernode-02_node-00_cpu-00_UP
+> cluster_supernode-02_node-00,link_cluster_supernode-02_node-00_cpu-01_DOWN
+> cluster_supernode-02_node-00_cpu-01,link_cluster_supernode-02_node-00_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-01_DOWN
+> router_cluster_supernode-02_node-01,link_cluster_supernode-02_node-01_UP
+> cluster_supernode-02_node-01,link_cluster_supernode-02_node-01_cpu-00_DOWN
+> cluster_supernode-02_node-01_cpu-00,link_cluster_supernode-02_node-01_cpu-00_UP
+> cluster_supernode-02_node-01,link_cluster_supernode-02_node-01_cpu-01_DOWN
+> cluster_supernode-02_node-01_cpu-01,link_cluster_supernode-02_node-01_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-02_DOWN
+> router_cluster_supernode-02_node-02,link_cluster_supernode-02_node-02_UP
+> cluster_supernode-02_node-02,link_cluster_supernode-02_node-02_cpu-00_DOWN
+> cluster_supernode-02_node-02_cpu-00,link_cluster_supernode-02_node-02_cpu-00_UP
+> cluster_supernode-02_node-02,link_cluster_supernode-02_node-02_cpu-01_DOWN
+> cluster_supernode-02_node-02_cpu-01,link_cluster_supernode-02_node-02_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-03_DOWN
+> router_cluster_supernode-02_node-03,link_cluster_supernode-02_node-03_UP
+> cluster_supernode-02_node-03,link_cluster_supernode-02_node-03_cpu-00_DOWN
+> cluster_supernode-02_node-03_cpu-00,link_cluster_supernode-02_node-03_cpu-00_UP
+> cluster_supernode-02_node-03,link_cluster_supernode-02_node-03_cpu-01_DOWN
+> cluster_supernode-02_node-03_cpu-01,link_cluster_supernode-02_node-03_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-04_DOWN
+> router_cluster_supernode-02_node-04,link_cluster_supernode-02_node-04_UP
+> cluster_supernode-02_node-04,link_cluster_supernode-02_node-04_cpu-00_DOWN
+> cluster_supernode-02_node-04_cpu-00,link_cluster_supernode-02_node-04_cpu-00_UP
+> cluster_supernode-02_node-04,link_cluster_supernode-02_node-04_cpu-01_DOWN
+> cluster_supernode-02_node-04_cpu-01,link_cluster_supernode-02_node-04_cpu-01_UP
+> cluster_supernode-02,link_cluster_supernode-02_node-05_DOWN
+> router_cluster_supernode-02_node-05,link_cluster_supernode-02_node-05_UP
+> cluster_supernode-02_node-05,link_cluster_supernode-02_node-05_cpu-00_DOWN
+> cluster_supernode-02_node-05_cpu-00,link_cluster_supernode-02_node-05_cpu-00_UP
+> cluster_supernode-02_node-05,link_cluster_supernode-02_node-05_cpu-01_DOWN
+> cluster_supernode-02_node-05_cpu-01,link_cluster_supernode-02_node-05_cpu-01_UP
+> cluster,link_cluster_supernode-03_DOWN
+> router_cluster_supernode-03,link_cluster_supernode-03_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-00_DOWN
+> router_cluster_supernode-03_node-00,link_cluster_supernode-03_node-00_UP
+> cluster_supernode-03_node-00,link_cluster_supernode-03_node-00_cpu-00_DOWN
+> cluster_supernode-03_node-00_cpu-00,link_cluster_supernode-03_node-00_cpu-00_UP
+> cluster_supernode-03_node-00,link_cluster_supernode-03_node-00_cpu-01_DOWN
+> cluster_supernode-03_node-00_cpu-01,link_cluster_supernode-03_node-00_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-01_DOWN
+> router_cluster_supernode-03_node-01,link_cluster_supernode-03_node-01_UP
+> cluster_supernode-03_node-01,link_cluster_supernode-03_node-01_cpu-00_DOWN
+> cluster_supernode-03_node-01_cpu-00,link_cluster_supernode-03_node-01_cpu-00_UP
+> cluster_supernode-03_node-01,link_cluster_supernode-03_node-01_cpu-01_DOWN
+> cluster_supernode-03_node-01_cpu-01,link_cluster_supernode-03_node-01_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-02_DOWN
+> router_cluster_supernode-03_node-02,link_cluster_supernode-03_node-02_UP
+> cluster_supernode-03_node-02,link_cluster_supernode-03_node-02_cpu-00_DOWN
+> cluster_supernode-03_node-02_cpu-00,link_cluster_supernode-03_node-02_cpu-00_UP
+> cluster_supernode-03_node-02,link_cluster_supernode-03_node-02_cpu-01_DOWN
+> cluster_supernode-03_node-02_cpu-01,link_cluster_supernode-03_node-02_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-03_DOWN
+> router_cluster_supernode-03_node-03,link_cluster_supernode-03_node-03_UP
+> cluster_supernode-03_node-03,link_cluster_supernode-03_node-03_cpu-00_DOWN
+> cluster_supernode-03_node-03_cpu-00,link_cluster_supernode-03_node-03_cpu-00_UP
+> cluster_supernode-03_node-03,link_cluster_supernode-03_node-03_cpu-01_DOWN
+> cluster_supernode-03_node-03_cpu-01,link_cluster_supernode-03_node-03_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-04_DOWN
+> router_cluster_supernode-03_node-04,link_cluster_supernode-03_node-04_UP
+> cluster_supernode-03_node-04,link_cluster_supernode-03_node-04_cpu-00_DOWN
+> cluster_supernode-03_node-04_cpu-00,link_cluster_supernode-03_node-04_cpu-00_UP
+> cluster_supernode-03_node-04,link_cluster_supernode-03_node-04_cpu-01_DOWN
+> cluster_supernode-03_node-04_cpu-01,link_cluster_supernode-03_node-04_cpu-01_UP
+> cluster_supernode-03,link_cluster_supernode-03_node-05_DOWN
+> router_cluster_supernode-03_node-05,link_cluster_supernode-03_node-05_UP
+> cluster_supernode-03_node-05,link_cluster_supernode-03_node-05_cpu-00_DOWN
+> cluster_supernode-03_node-05_cpu-00,link_cluster_supernode-03_node-05_cpu-00_UP
+> cluster_supernode-03_node-05,link_cluster_supernode-03_node-05_cpu-01_DOWN
+> cluster_supernode-03_node-05_cpu-01,link_cluster_supernode-03_node-05_cpu-01_UP
+> link_cluster_supernode-00_node-00_DOWN,router_cluster_supernode-00_node-00
+> link_cluster_supernode-00_node-01_DOWN,router_cluster_supernode-00_node-01
+> link_cluster_supernode-00_node-02_DOWN,router_cluster_supernode-00_node-02
+> link_cluster_supernode-00_node-03_DOWN,router_cluster_supernode-00_node-03
+> link_cluster_supernode-00_node-04_DOWN,router_cluster_supernode-00_node-04
+> link_cluster_supernode-00_node-05_DOWN,router_cluster_supernode-00_node-05
+> link_cluster_supernode-00_DOWN,router_cluster_supernode-00
+> link_cluster_supernode-01_node-00_DOWN,router_cluster_supernode-01_node-00
+> link_cluster_supernode-01_node-01_DOWN,router_cluster_supernode-01_node-01
+> link_cluster_supernode-01_node-02_DOWN,router_cluster_supernode-01_node-02
+> link_cluster_supernode-01_node-03_DOWN,router_cluster_supernode-01_node-03
+> link_cluster_supernode-01_node-04_DOWN,router_cluster_supernode-01_node-04
+> link_cluster_supernode-01_node-05_DOWN,router_cluster_supernode-01_node-05
+> link_cluster_supernode-01_DOWN,router_cluster_supernode-01
+> link_cluster_supernode-02_node-00_DOWN,router_cluster_supernode-02_node-00
+> link_cluster_supernode-02_node-01_DOWN,router_cluster_supernode-02_node-01
+> link_cluster_supernode-02_node-02_DOWN,router_cluster_supernode-02_node-02
+> link_cluster_supernode-02_node-03_DOWN,router_cluster_supernode-02_node-03
+> link_cluster_supernode-02_node-04_DOWN,router_cluster_supernode-02_node-04
+> link_cluster_supernode-02_node-05_DOWN,router_cluster_supernode-02_node-05
+> link_cluster_supernode-02_DOWN,router_cluster_supernode-02
+> link_cluster_supernode-03_node-00_DOWN,router_cluster_supernode-03_node-00
+> link_cluster_supernode-03_node-01_DOWN,router_cluster_supernode-03_node-01
+> link_cluster_supernode-03_node-02_DOWN,router_cluster_supernode-03_node-02
+> link_cluster_supernode-03_node-03_DOWN,router_cluster_supernode-03_node-03
+> link_cluster_supernode-03_node-04_DOWN,router_cluster_supernode-03_node-04
+> link_cluster_supernode-03_node-05_DOWN,router_cluster_supernode-03_node-05
+> link_cluster_supernode-03_DOWN,router_cluster_supernode-03
 
 $ rm -f test.csv