From c11b06578e58c0f244ef4ad055f065873c3c4368 Mon Sep 17 00:00:00 2001
From: Simon Crowle <sgc@it-innovation.soton.ac.uk>
Date: Wed, 18 Apr 2018 12:20:01 +0100
Subject: [PATCH] Adds first draft of E2E performance analysis documentation

---
 docs/figures/e2eFigures.graphml               | 880 ++++++++++++++++++
 docs/image/e2e-simple-chain-mc-processing.png | Bin 0 -> 2999 bytes
 docs/image/e2e-simple-chain-network.png       | Bin 0 -> 21525 bytes
 docs/image/e2e-simple-chain-request-steps.png | Bin 0 -> 14629 bytes
 .../image/e2e-simple-chain-response-steps.png | Bin 0 -> 14361 bytes
 docs/understanding-E2E-performance.md         |  78 ++
 6 files changed, 958 insertions(+)
 create mode 100644 docs/figures/e2eFigures.graphml
 create mode 100644 docs/image/e2e-simple-chain-mc-processing.png
 create mode 100644 docs/image/e2e-simple-chain-network.png
 create mode 100644 docs/image/e2e-simple-chain-request-steps.png
 create mode 100644 docs/image/e2e-simple-chain-response-steps.png
 create mode 100644 docs/understanding-E2E-performance.md

diff --git a/docs/figures/e2eFigures.graphml b/docs/figures/e2eFigures.graphml
new file mode 100644
index 0000000..7e150e6
--- /dev/null
+++ b/docs/figures/e2eFigures.graphml
@@ -0,0 +1,880 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+  <!--Created by yEd 3.17.2-->
+  <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+  <key for="port" id="d1" yfiles.type="portgraphics"/>
+  <key for="port" id="d2" yfiles.type="portgeometry"/>
+  <key for="port" id="d3" yfiles.type="portuserdata"/>
+  <key attr.name="url" attr.type="string" for="node" id="d4"/>
+  <key attr.name="description" attr.type="string" for="node" id="d5"/>
+  <key for="node" id="d6" yfiles.type="nodegraphics"/>
+  <key for="graphml" id="d7" yfiles.type="resources"/>
+  <key attr.name="url" attr.type="string" for="edge" id="d8"/>
+  <key attr.name="description" attr.type="string" for="edge" id="d9"/>
+  <key for="edge" id="d10" yfiles.type="edgegraphics"/>
+  <graph edgedefault="directed" id="G">
+    <data key="d0"/>
+    <node id="n0">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="152.4000000000001" width="350.79999999999984" x="222.89999999999998" y="986.8"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="dotted" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.01953125" x="141.39023437499998" y="156.4000000000001">FLAME network</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="152.4000000000001" width="350.79999999999984" x="222.89999999999998" y="663.4"/>
+          <y:Fill hasColor="false" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="dotted" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.01953125" x="141.39023437499992" y="156.4000000000001">FLAME network</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n2" yfiles.foldertype="group">
+      <data key="d4"/>
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="511.0354454457677" width="480.9759773254389" x="1009.4572265625002" y="101.66553111673232"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="480.9759773254389" x="0.0" y="0.0">E2E complex chain</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="26" bottomF="25.725000000000023" left="0" leftF="5.6843418860808015E-14" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 1</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n2:">
+        <node id="n2::n0">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="1229.7199211120605" y="139.04199596048232"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605014" y="39.325933116665965">Client 1<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n2::n1">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="1223.9499999999998" y="241.2500000000001"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'A'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n2">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="1106.3000000000002" y="445.225"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'B'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n3">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="1343.1999999999998" y="445.225"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="e" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="46.5" y="13.12451171875">service router 'C'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n4">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1217.475" y="375.2500000000001"/>
+              <y:Fill hasColor="false" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="72.677734375" x="-6.3388671875" y="12.849414062499932">FLAME SDN<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.4170861618798992" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n5">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="1392.5" y="348.48399192096474"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605014" y="39.325933116665965">Client 2<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n2::n6">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="1440.9999999999995" y="348.48399192096474"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605014" y="39.325933116665965">Client 3<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n2::n7">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1112.5500000000002" y="521.725"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="80.611328125" x="-25.3056640625" y="34.0">Processor 'A' MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n8">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1313.1999999999998" y="521.725"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="80.611328125" x="-25.3056640625" y="34.0">Processor 'B' MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n2::n9">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="1392.9800788879395" y="521.725"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n3" yfiles.foldertype="group">
+      <data key="d4"/>
+      <data key="d6">
+        <y:ProxyAutoBoundsNode>
+          <y:Realizers active="0">
+            <y:GroupNode>
+              <y:Geometry height="511.0354454457677" width="499.31093826293886" x="36.58222656250018" y="92.70182647705082"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="499.31093826293886" x="0.0" y="0.0">E2E simple chain</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="false" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="15" bottomF="15.0" left="15" leftF="15.0" right="15" rightF="15.0" top="15" topF="15.0"/>
+              <y:BorderInsets bottom="26" bottomF="25.725000000000023" left="0" leftF="0.0" right="26" rightF="25.673633575439226" top="0" topF="0.0"/>
+            </y:GroupNode>
+            <y:GroupNode>
+              <y:Geometry height="50.0" width="50.0" x="0.0" y="60.0"/>
+              <y:Fill color="#F5F5F5" transparent="false"/>
+              <y:BorderStyle color="#000000" type="dashed" width="1.0"/>
+              <y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#EBEBEB" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="22.37646484375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="59.02685546875" x="-4.513427734375" y="0.0">Folder 1</y:NodeLabel>
+              <y:Shape type="roundrectangle"/>
+              <y:State closed="true" closedHeight="50.0" closedWidth="50.0" innerGraphDisplayEnabled="false"/>
+              <y:Insets bottom="5" bottomF="5.0" left="5" leftF="5.0" right="5" rightF="5.0" top="5" topF="5.0"/>
+              <y:BorderInsets bottom="0" bottomF="0.0" left="0" leftF="0.0" right="0" rightF="0.0" top="0" topF="0.0"/>
+            </y:GroupNode>
+          </y:Realizers>
+        </y:ProxyAutoBoundsNode>
+      </data>
+      <graph edgedefault="directed" id="n3:">
+        <node id="n3::n0">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="256.84492111206055" y="130.07829132080082"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 1<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n3::n1">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="251.07499999999982" y="232.2862953603186"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'A'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n2">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="133.42500000000018" y="436.2612953603185"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="w" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-81.8427734375" y="13.12451171875">service router 'B'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n3">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="42.5" width="42.5" x="370.3249999999998" y="436.2612953603185"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="e" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="46.5" y="13.12451171875">service router 'C'</y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n4">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="244.5999999999999" y="366.2862953603186"/>
+              <y:Fill hasColor="false" transparent="false"/>
+              <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="72.677734375" x="-6.3388671875" y="12.849414062499932">FLAME SDN<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.4170861618798992" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:Shape type="ellipse"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+        <node id="n3::n5">
+          <data key="d6">
+            <y:SVGNode>
+              <y:Geometry height="35.32593311666594" width="30.960157775878884" x="419.625" y="339.52028728128323"/>
+              <y:Fill color="#CCCCFF" transparent="false"/>
+              <y:BorderStyle color="#000000" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 2<y:LabelModel>
+                  <y:SmartNodeLabelModel distance="4.0"/>
+                </y:LabelModel>
+                <y:ModelParameter>
+                  <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+                </y:ModelParameter>
+              </y:NodeLabel>
+              <y:SVGNodeProperties usingVisualBounds="true"/>
+              <y:SVGModel svgBoundsPolicy="0">
+                <y:SVGContent refid="1"/>
+              </y:SVGModel>
+            </y:SVGNode>
+          </data>
+        </node>
+        <node id="n3::n6">
+          <data key="d6">
+            <y:ShapeNode>
+              <y:Geometry height="30.0" width="30.0" x="420.1050788879395" y="512.7612953603185"/>
+              <y:Fill color="#FFFFFF" transparent="false"/>
+              <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+              <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+              <y:Shape type="rectangle"/>
+            </y:ShapeNode>
+          </data>
+        </node>
+      </graph>
+    </node>
+    <node id="n4">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="35.32593311666594" width="30.960157775878884" x="67.64492111206054" y="726.3883582041351"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 1<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="201.47499999999985" y="722.8013247624681"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-17.67138671875" y="46.5">service router 'A'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="346.84492111206026" y="722.8013247624681"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="-17.947265625" y="46.5">service router 'C'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="30.0" x="509.81484222412064" y="729.0513247624681"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d6">
+        <y:SVGNode>
+          <y:Geometry height="35.32593311666594" width="30.960157775878884" x="67.64492111206062" y="1052.188358204135"/>
+          <y:Fill color="#CCCCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="37.90625" x="-3.4730461120605582" y="39.325933116665965">Client 1<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:SVGNodeProperties usingVisualBounds="true"/>
+          <y:SVGModel svgBoundsPolicy="0">
+            <y:SVGContent refid="1"/>
+          </y:SVGModel>
+        </y:SVGNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="201.4749999999999" y="1048.6013247624683"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.8427734375" x="-17.67138671875" y="46.5">service router 'A'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="42.5" width="42.5" x="346.8449211120603" y="1048.6013247624683"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="78.39453125" x="-17.947265625" y="46.5">service router 'C'</y:NodeLabel>
+          <y:Shape type="ellipse"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="30.0" x="509.81484222412064" y="1054.8513247624683"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="30.0" x="373.42968444824123" y="892.3026495249364"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="16.2509765625" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="s" textColor="#000000" verticalTextPosition="bottom" visible="true" width="57.3544921875" x="-13.67724609375" y="34.0">Storage MC</y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <edge id="n2::e0" source="n2::n1" target="n2::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e1" source="n2::n3" target="n2::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e2" source="n2::n1" target="n2::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e3" source="n2::n0" target="n2::n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e4" source="n2::n5" target="n2::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e5" source="n2::n6" target="n2::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e6" source="n2::n2" target="n2::n7">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e7" source="n2::n3" target="n2::n8">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n2::e8" source="n2::n3" target="n2::n9">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e0" source="n3::n1" target="n3::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e1" source="n3::n3" target="n3::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e2" source="n3::n1" target="n3::n2">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e3" source="n3::n0" target="n3::n1">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e4" source="n3::n5" target="n3::n3">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="short"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="n3::e5" source="n3::n3" target="n3::n6">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e0" source="n4" target="n5">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.02783203125" x="28.528175735473553" y="-17.025884710188166">request transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n5" target="n5">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="222.72499999999985" y="691.5513247624681"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="26.0517578125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.54052734375" x="-27.658209228515773" y="-49.023382268781916">handle request
+route specification<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n5" target="n6">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.02783203125" x="20.921038436889432" y="-17.025884710188166">request transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n6" target="n7">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="61.02783203125" x="29.72105598449673" y="-17.025884710188166">request transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n6" target="n6">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="368.09492111206026" y="691.5513247624681"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="63.5458984375" x="-21.160877227783487" y="-41.954351507063166">handle request<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n8" target="n9">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="dashed" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="25.02573432922361" y="-17.02587250315696">response transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n9" target="n9">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="222.7249999999999" y="1017.3513247624682"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="70.55078125" x="-24.663336181640716" y="-41.954339300031734">handle response<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n9" target="n10">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="17.41859703063949" y="-17.025872503156734">response transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n10" target="n11">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="two_pos" modelPosition="head" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="26.21861457824673" y="-17.025872503156734">response transit<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n10" target="n10">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="368.0949211120603" y="1017.3513247624682"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="26.0517578125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="76.54052734375" x="-27.65819168090843" y="-49.023309026594234">handle response
+route specification<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n12" target="n12">
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="388.42968444824123" y="867.3026495249364"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="standard" target="none"/>
+          <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.02587890625" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="68.03271484375" x="-19.017062377930642" y="-34.36452576803231">process request<y:LabelModel>
+              <y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/>
+            </y:ModelParameter>
+            <y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
+          </y:EdgeLabel>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d7">
+    <y:Resources>
+      <y:Resource id="1">&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="57px" height="65px" viewBox="0 0 57 65" enable-background="new 0 0 57 65" xml:space="preserve"&gt;
+&lt;g&gt;
+	
+		&lt;linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.3398" y1="3115.7266" x2="27.5807" y2="3145.5239" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)"&gt;
+		&lt;stop  offset="0.2711" style="stop-color:#FFAB4F"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FFD28F"/&gt;
+	&lt;/linearGradient&gt;
+	&lt;path fill="url(#SVGID_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M49.529,51.225c-4.396-4.396-10.951-5.884-12.063-6.109
+		V37.8H19.278c0,0,0.038,6.903,0,6.868c0,0-6.874,0.997-12.308,6.432C1.378,56.691,0.5,62.77,0.5,62.77
+		c0,1.938,1.575,3.492,3.523,3.492h48.51c1.947,0,3.521-1.558,3.521-3.492C56.055,62.768,54.211,55.906,49.529,51.225z"/&gt;
+	&lt;path id="body_18_" fill="#ECECEC" stroke="#9B9B9B" stroke-miterlimit="10" d="M0.5,62.768c0,1.938,1.575,3.494,3.523,3.494h48.51
+		c1.947,0,3.521-1.559,3.521-3.494c0,0-1.844-6.861-6.525-11.543c-4.815-4.813-11.244-6.146-11.244-6.146
+		c-1.771,1.655-5.61,3.802-10.063,3.802c-4.453,0-8.292-2.146-10.063-3.802c0,0-5.755,0.586-11.189,6.021
+		C1.378,56.689,0.5,62.768,0.5,62.768z"/&gt;
+	
+		&lt;radialGradient id="SVGID_2_" cx="22.6621" cy="21.707" r="17.7954" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_2_)" stroke="#E55E03" d="M28.106,33.486c-8.112,0-12.688,4.313-12.688,10.438
+		c0,7.422,12.688,10.438,12.688,10.438s14.688-3.016,14.688-10.438C42.793,38.75,36.215,33.486,28.106,33.486z M26.288,53.051
+		c0,0-7.135-2.093-8.805-7.201c-0.222-0.682,0.147-1.156,0.795-1.521V37.8h20.188v6.663c0.235,0.352,1.109,0.737,1.229,1.387
+		C40.445,49.917,26.288,53.051,26.288,53.051z"/&gt;
+	
+		&lt;radialGradient id="SVGID_3_" cx="15.2056" cy="831.1875" r="32.3071" gradientTransform="matrix(1 0 0 1 0.0801 -773.6914)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_3_)" stroke="#E55E03" d="M49.529,51.225c-2.239-2.24-5.041-3.724-7.396-4.67
+		c-2.854,5.51-14.021,7.807-14.021,7.807s-10.472-2.483-12.387-8.514c-2.439,0.771-5.787,2.287-8.749,5.25
+		c-5.592,5.592-6.47,11.67-6.47,11.67c0,1.938,1.575,3.492,3.523,3.492h48.51c1.946,0,3.521-1.558,3.521-3.492
+		C56.055,62.768,54.211,55.906,49.529,51.225z"/&gt;
+	
+		&lt;radialGradient id="SVGID_4_" cx="17.0723" cy="18.4907" r="11.8931" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_4_)" stroke="#E55E03" d="M13.404,44.173c1.15-1.81,2.039-3.832,3.332-5.397
+		c-0.514,1.027-1.669,4.084-1.669,5.148c0,5.186,10.366,9.079,14.688,10.438c-3.472,1.627-9.134-1.498-11.334-2.359
+		c-3.601-1.419-4.071-3.063-5.89-4.854C12.523,47.135,12.878,45,13.404,44.173z"/&gt;
+	
+		&lt;radialGradient id="SVGID_5_" cx="31.8184" cy="19.3525" r="14.63" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_5_)" stroke="#E55E03" d="M45.777,43.924c-1.317-1.568-5.11-9.424-6.604-6.617
+		c0.516,1.025,3.617,3.693,3.617,6.617c0,5.186-10.271,8.576-16.699,9.145c1.429,4.938,11.373,1.293,13.805-0.313
+		c3.563-2.354,4.563-5.133,7.854-3.705C47.754,49.045,48.006,46.574,45.777,43.924z"/&gt;
+	
+		&lt;radialGradient id="SVGID_6_" cx="30.4893" cy="4.8721" r="5.2028" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_6_)" stroke="#E55E03" d="M30.777,54.167c0.357,0.836-0.153,1.983-0.352,2.813
+		c-0.256,1.084-0.072,2.104,0.102,3.186c0.164,1.02,0.156,2.107,0.25,3.167c0.082,0.916,0.482,1.849,0.357,2.75"/&gt;
+	
+		&lt;radialGradient id="SVGID_7_" cx="23.2871" cy="5.3008" r="5.5143" gradientTransform="matrix(1 0 0 -1 0.04 64.1543)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FCB57A"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FF8C36"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path fill="url(#SVGID_7_)" stroke="#E55E03" d="M23.695,53.417c-0.508,0.584-0.476,2.209-0.398,3
+		c0.116,1.183,0.456,2.099,0.333,3.333c-0.192,1.943,0.154,4.479-0.436,6.333"/&gt;
+	
+		&lt;radialGradient id="face_x5F_white_1_" cx="27.5835" cy="3117.4922" r="23.425" fx="23.0139" fy="3115.0024" gradientTransform="matrix(1 0 0 1 0.3203 -3091.7656)" gradientUnits="userSpaceOnUse"&gt;
+		&lt;stop  offset="0" style="stop-color:#FFD28F"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FFAB4F"/&gt;
+	&lt;/radialGradient&gt;
+	&lt;path id="face_x5F_white_3_" fill="url(#face_x5F_white_1_)" stroke="#ED9135" stroke-miterlimit="10" d="M43.676,23.357
+		c0.086,10.2-6.738,18.52-15.25,18.586c-8.5,0.068-15.464-8.146-15.55-18.344C12.794,13.4,19.618,5.079,28.123,5.012
+		C36.627,4.945,43.59,13.158,43.676,23.357z"/&gt;
+	
+		&lt;linearGradient id="face_highlight_1_" gradientUnits="userSpaceOnUse" x1="6468.501" y1="-12291.5195" x2="6492.1304" y2="-12384.9688" gradientTransform="matrix(0.275 0 0 -0.2733 -1752.8849 -3351.7349)"&gt;
+		&lt;stop  offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/&gt;
+		&lt;stop  offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/&gt;
+	&lt;/linearGradient&gt;
+	&lt;path id="face_highlight_3_" fill="url(#face_highlight_1_)" d="M28.415,5.625c-6.035,0.047-10.747,4.493-12.787,10.386
+		c-0.664,1.919-0.294,4.043,0.98,5.629c2.73,3.398,5.729,6.283,9.461,8.088c3.137,1.518,7.535,2.385,11.893,1.247
+		c2.274-0.592,3.988-2.459,4.375-4.766c0.187-1.094,0.293-2.289,0.283-3.553C42.54,13.244,36.729,5.56,28.415,5.625z"/&gt;
+	&lt;path id="Hair_Young_Black_1_" fill="#5C5C5C" stroke="#353535" stroke-linecap="round" stroke-linejoin="round" d="M20.278,13.25
+		c3.417,4.333,9.333,6.917,9.333,6.917l-1.417-3.5c0,0,7.094,4.691,8.083,4.333c0.968-0.2-1.082-3.807-1.082-3.807
+		s3.138,1.795,4.854,3.969c1.803,2.28,4.285,3.504,4.285,3.504S47.027,2.719,27.289,2.744C8.278,2.709,12.058,27.678,12.058,27.678
+		L14.695,17c0,0,0.914,5.757,1.399,4.875C17.861,15.211,18.861,11.5,20.278,13.25z"/&gt;
+&lt;/g&gt;
+&lt;/svg&gt;
+</y:Resource>
+    </y:Resources>
+  </data>
+</graphml>
diff --git a/docs/image/e2e-simple-chain-mc-processing.png b/docs/image/e2e-simple-chain-mc-processing.png
new file mode 100644
index 0000000000000000000000000000000000000000..16c80c3f6b942e6ae554206b5f41d4c6b8b24729
GIT binary patch
literal 2999
zcmcImdpy(o8y|8yE~Tb&nvly%xs}3UNtn!Bn@d^EI$@klWX=7WR69a!CTvW`NSi2@
zDH9^4lqhR1b&$+4<bK(lZ@)i(uk-uw{QmfSKF{;KKKJK&zn_QX;pVtS5uykJfwnjy
z;3yDCh6~79Kg$CBVwLO*V2~l89PL1yH+v=kWmAx?t1Sprlclu&n>?T^gd=<jAkfy<
zA5EqstReseQgU&E+j>R&O$}m$y@DVevt%<hJ7V^qS1BiS3bP4cPB82=xPH;vcb?gu
zaA-VptItjGX$5H_H{+E5Onb(z9Zo)l0h4LB{WiHAF~V#!_qEp!l~oNlKl1j$bt^U0
zlW=XdY{58fiJpHXzY|8nNq^xNE6p`c=Py}rh9o8o5peswI|F)TL53qLtNTHFwNPM?
z3&II>NE<5Ce2uaRr220gm<RJ+MEf3;gGp^IEmy^(6&wzyvhtk<<7#%!8UOBL8-Co<
zrLeH+`T0kh=#%#LtwF^Jk?YH|8R`}yZN~T8IcJWL$z*V5Yilc*azjPyc<lVQH+0xS
z&7QfrxzyCuCGp_dbLWml&wLg<42qf_VrR+ZUZb=@Zgz|e4i2L1KGi3PdMo`qGDC&+
zu3ATOj8>YPlMfy%EG+D%!%kzd)xi7|mPIr)Cu_fZ(fpdErznDMNx-FTKM+tYnP3&a
zypPb+!T37*kj?r|F~GNTqMd3z#oxZoti<<FZ%s~5=She}Vx1KaZF<_r!}mZ);_P#^
z>-%kT4-V9hqg}W)iNKQGB>065sl?*az~iKiCZ-S_N)FWUHQKZF)z^gKrUU|ku-Y7=
zy^Cn7Iq42Q19dtq@SGlcy7m#9)Mt--Xq|FGe@A%I7rRpD>j5XM#D@*u9+}j1l`abT
z8|#i{)Plp1m*OB?S^1bUGk|UwRnm)Ku=X>5qAN_8d8Y3+`D`;WltUO<a5N(Itw`6V
z)z#Irv}~lGpQZA6R@UgZ@HS1#Fjr87cmSoD^`1?df)@^NDLR!TRHzH2H_hbP(39rJ
z^03G?>@&I2nvggiUc-lq){gh?jwr|EX47P<yE-G(E-IWH2vC1?eYLlWu#=a}PfK8@
zUb=f6PZZmpx4yh#AZPG>w3A#=P_VcdIf&JEx20aheGIM?8TNJU$z=@G2EIz#m_037
z6Cv4*Sj#fZ#l1#r0h(@GzF8&|&9TtV<3<FT%J=83OQ>x~BV*&l`FD;vIT#Ekwqn@|
z28$98#4y*2KTK?wzzSV>V+GX<B}bw8t5?0fy-|Z>%7(3~cU8_teS0?6R;tR&wKf@+
zKTp?z)}Yi({Ae`V`q#oRzptgHs`k2Xe5}k(kAC4k<T4i`8Dage@63c_n<I<lR`C2H
z4~)crYPrSb&!p*rtqp~j1*<#~Gl_Q!n&zjsI?|K!#J!MCCI%Yy_V4J?eX~N>;*cul
zBAN4Y`2#VQYKN-)NDGb<{`N!Z&uQ0wgo3#GkB2*7&&}_93d_xm>pIIR>!3Xg@As@M
z!%_tDlVuS<J-Sa0^viwdp-&k~nA9Gx_4Ldu&a)~Ob{{wUAagt}b*E*_cjmfqc(|HZ
zr5pHBA!MdcGvrB+{C%&-WfvbG5C|(8lT$S;6w^CK0IUH2L=)$w(lDHqtTD!X1@zPz
zC(+}UgQKQ1<=W6w%>x4ii&H{Yc{v0EnfJ(tm!9Ge+nAfTb2pbz`Y)FzcXoEV7MkyF
zl4A$ph16G%W9G`ma!_03-Q?mVsqeiPc~VGv9T7lW7+<nD@t(y~*`alSB+H~4uKB^(
z4Gl3P?HK?{`w|$-2&Wx~tgR(OanloS4V^<9GhbQ(C;FZ{*K2<wJ3HqPsbi$}DVv5y
z?Xix%g2Ukw6aAJ_babJ=>7+3!VfCStiSnP_k2Bg3PItU|OVt^M|0Eb1WFw9xtX|oP
zMfkZ?f6-EEwX#KC@D<jF3VFnkv~?0EGjr>pEHa&P%?ThMcN+;47D!xMoSL1zJSc;_
zNx9a^!8De$SVUHQQN!_-QPm-r%pTwp-^Gp7NF>#|u$N;4$=Ir_T(O-Iu>AGtor-GL
zbhwTPmZE3;>U&8ZHgRR_ZHawPKX6=9(#B@3_?hL|k%9sUafkjv6j&aCjEsylx3F+N
zn^q1nDVrPb#`3N>)h$g4mjJXlW@%O$d*GRRipw*tDqOrEV)BF0?^TpNT3RN)8vD&g
zhMvaRNS8;d`BHR-m$!H5(36!Z?l5(+rNvGs`}WDWxV2n^)62KE{gFa}%jB70rC)An
zwYRr3*(j8h&1QQ$rn}M)|Dv3knJFs47n+9xZnp~moGg|L$zWONGdP?}I9&M?m2hg~
zZeGYofVmIofE^qFcP|YmZ2*i5rtq*^V?4jlPrO&rJoee(>VGbK8(rJbuu@gs)FX*l
zmMjeuUwLCNlBhg9cVU~yQQ$RI75p@IqyU8w9rp+TbTVeD#=nEt*hu8Z_Zl~Xr3~Gn
zJxo0x_{+|el$6Pj)su;xonLu;elf-znMG;)17Rr;2z)t>WPp49{ryGssS_k1p;RiV
z8OKXk#(AFT;e;g(Y<^~hHnc`D=nd^1yC-&%&Ap<eZ~1Shxc{9u@8xtdFUh8Ly?z}E
zusj}rzr6gU%1*)h`a0mZu_twPb+JF|8==5e3=}E~2sZd`;0<X2BOxxcU{JlX$?IFx
zuWbG?1LP7ND+k)g)C1kQodY^=hm=iLIH2&~2GXr?XK%Fg8I^X<ROc1sbIZzc$b6Ym
zgYxv4xMA1((q@P*w8ZJ_CiXj~sZdpc3X7JNF(}|&oe78YG~I6Dj4dohVM1GvyT2lw
z^lO6K6wS;;Mb&k>M-Lwblm8lcXa3uQyeIJ-FVVS=2tFN$Mw{jq-;>4U_n4TyiV3vp
zilCxfrnxkO@V2{d-MaC0uSNM&t{6^VKTPOfhk4E4HiHB<Zc25OO(<Hesj*mj&^O-h
z-mI9hZxF7?-K1;%@X{<U&=2-5i1_06oT5TsiLO{_Ai`@5i}ShBXYs{tRvG8V_3|X!
zK%yWu*%gBUjsD2!$0p&U4ELpTO&@NEASq@ik#>X&`vltuOO&3(uboz4dE9`rg7K)j
zas$s)5uUh=$4Fv=>YPV;rk3Lrc0y~6f9+7_ubVIE+EX#r9jNt4AB3!fJ+j3a<(6-4
zN+FbX3n;8Uq3@D{H3~LyzF3&+n?k!qaCtNVr>dRoiQ4;=*+jhL+FmNXqHGZHef>ys
zog>mN8$TzG8&oG><QGyoTQz2bFHZk8rZ*Z+e(8%be|f)5=|F9UyYo(l^D;gpc=S_v
z!0#`uLdp$%%M7#roISZ0TJmBSuRAX3tpIGYW&gMt=3a9bA;=@ZMz+?A^o>rea}BDB
zdJwp>G<(#1MfgdlVSf(0v9Dg2(D257UlohKmZL9=0vF)x9odXea_Po#K0BjDHJSI`
zL*nS%fnRT=eh4mF?fz)hulg>8c5_wk-p#HqNWJG0^r^E$>`!xfIW2<z@kaTH0f&Wi
zoH@PV{Ma4Q4)Lcgk%;=|u)7+^(%VDQ(BS7^V>Xw~nQQBSt9M@n%E%Jx|DlBZCwwK3
c`F_}tfiwoBhDf*lD84~X4sLLc-TAA315PHA?f?J)

literal 0
HcmV?d00001

diff --git a/docs/image/e2e-simple-chain-network.png b/docs/image/e2e-simple-chain-network.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c054d0719314f2a5bcde4b17813f3d8043aeb70
GIT binary patch
literal 21525
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
Wh!ww%=+ST%@!2+qt%bI3(SHYU1}|m+

literal 0
HcmV?d00001

diff --git a/docs/image/e2e-simple-chain-request-steps.png b/docs/image/e2e-simple-chain-request-steps.png
new file mode 100644
index 0000000000000000000000000000000000000000..9c82d58aa0e5faeb3f3ff9be38d12d75d0fe6d0a
GIT binary patch
literal 14629
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

literal 0
HcmV?d00001

diff --git a/docs/image/e2e-simple-chain-response-steps.png b/docs/image/e2e-simple-chain-response-steps.png
new file mode 100644
index 0000000000000000000000000000000000000000..7401e2692bf4916979846f390039b7827c6aaecf
GIT binary patch
literal 14361
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
TGvg(2J4iuBRk~90W5E9cHCST>

literal 0
HcmV?d00001

diff --git a/docs/understanding-E2E-performance.md b/docs/understanding-E2E-performance.md
new file mode 100644
index 0000000..21e7de0
--- /dev/null
+++ b/docs/understanding-E2E-performance.md
@@ -0,0 +1,78 @@
+# Understanding end-to-end media service performance in the FLAME platform
+
+© University of Southampton IT Innovation Centre, 2018
+
+This document describe the FLAME model of end-to-end (E2E) media service performance as it is observed and measured using the CLMC on the FLAME platform.
+
+#### **Authors**
+
+|Authors|Organisation|                    
+|-|-|
+|[Simon Crowle](mailto:sgc@it-innovation.soton.ac.uk)|[University of Southampton, IT Innovation Centre](http://www.it-innovation.soton.ac.uk)|
+
+## Introduction
+
+Readers of this document are assumed to have at least read the [CLMC information model](clmc-information-model.md). Here we explore the requirements which inform the definition of metrics that determine *'end-to-end'* media service performance. Before continuing, some terms are defined:
+
+| term | definition |
+| --- | --- |
+| *client* | an end-user of a FLAME media service - typically somebody accessing the service via an mobile computing device connected to an _EP router_ |
+| *endpoint* | an endpoint (EP) is a virtual machine (VM) connected to the FLAME network |
+| *service router* | an EP that allows other EPs to communicate with one another using fully qualified domain names (FQDN), rather than IP addresses |
+| *network node* | an _EP_, _service router_ or other hardware that receives and sends network traffic along network connections attached to it |
+| *media component* | a media component (MC) is a process that in part or wholly realizes the functionality of a media service |
+| *E2E path* | the directed, acyclic traversal of FLAME network nodes, beginning with a source _EP_ and moving to a target _EP_ via network nodes in the FLAME network |
+| *round trip time* | the total time taken for a service request to i) traverse an _E2E path_, ii) be processed at the _MC_, iii) be returned as a response via an _E2E path_
+
+In the sections that follow we set out some basic properties of a potential media service and then explore these in more detail with a concrete example. Following on from this analysis we provide a test-based approach to the specification of E2E media service performance measures.
+
+## E2E SFC chains
+
+Let us begin by identifying some simple, generic interactions within a media service function chain (SFC):
+
+```
+// simple chain
+Client --> data storage MC
+
+// sequential chain
+Client --> data processor MC --> data storage MC
+
+// complex chain
+Client --> data processor MC_A --> data processor MC_B
+                               |-> data storage MC <-|
+```
+
+The first example above imagines a client simply requesting some data be stored in (or retrieved from) a database managed by the MC responsible for persistence. In the second case, the client requests some processing of some data held in the data store, the results of which are also stored. Finally, the third case outlines a more complex scenario in which the client requests some processing of data which in turn generates further requests for additional data processing in other MCs which also may depend on storage I/O functionality. Here additional data processing by related MCs could include job scheduling or task decomposition and distribution to worker nodes. An advanced media service, such as a modern computer game, is a useful example of such a service in which graphics rendering; game state modelling; artificial intelligence and network communications are handled in parallel using varying problem decomposition methods.
+
+## E2E simple chain
+
+Next we will define a very simple network into which we will place a data processing EP and a data storage EP - we assert the clients could connect to any of _service routers_ that link these MC together.
+
+![Simple E2E network](image/e2e-simple-chain-network.png)
+
+Our simple network consists of three _service routers_ that connect clients with MC data and storage functionality; each demand from client 1 for the storage function could be routed in one network hop from router 'A' to router 'C' or in two from routers 'A' -> 'B' -> 'C'. A demand for storage function from _client 2_ would include zero network hops.
+
+### E2E simple chain metrics
+
+A principal metric we use to understand E2E performance is mean end-to-end _delay_: the average time taken between a request or response being transmitted and received _within the FLAME network_. Scoping the E2E delay to within the FLAME network is an important qualification since it is only within this network that all necessary measurements can reliably be taken.
+
+An out-going simple E2E request chain looks like this:
+
+![Simple E2E request steps](image/e2e-simple-chain-request-steps.png)
+
+the delay associated with the processing of the service request is isolated to within the storage MC:
+
+![Simple E2E MC processing](image/e2e-simple-chain-mc-processing.png)
+
+whilst for the response E2E delay, we see this:
+
+![Simple E2E response steps](image/e2e-simple-chain-response-steps.png)
+
+Above we denote the time required for an service router to handle (or pass on) an in-coming message as _handle request_ or _handle response_. When a message is first encountered by a service router, an optimized path through the FLAME network must also be determined; this is labelled above as _route specification_. The _round trip time_ is the sum of the request, service processing and response delays.
+
+> __Side note:__
+> To understand _delay_ more robustly, we may also consider the rate at which requests or responses arrive (_arrival rate_) at each node in the network since message management (queuing, for example) will have an effect at scale. Similarly, the _payload size_ of the messages being handled could also be observed since the quantity of data traversing the SFC will also impact delay in similar, large scale scenarios.
+>
+
+
+### E2E simple chain performance query
-- 
GitLab