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"><?xml version="1.0" encoding="utf-8"?> +<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"> +<g> + + <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)"> + <stop offset="0.2711" style="stop-color:#FFAB4F"/> + <stop offset="1" style="stop-color:#FFD28F"/> + </linearGradient> + <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"/> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FCB57A"/> + <stop offset="1" style="stop-color:#FF8C36"/> + </radialGradient> + <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"/> + + <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"> + <stop offset="0" style="stop-color:#FFD28F"/> + <stop offset="1" style="stop-color:#FFAB4F"/> + </radialGradient> + <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"/> + + <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)"> + <stop offset="0" style="stop-color:#FFFFFF;stop-opacity:0.24"/> + <stop offset="1" style="stop-color:#FFFFFF;stop-opacity:0.16"/> + </linearGradient> + <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"/> + <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"/> +</g> +</svg> +</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 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 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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 z°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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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ν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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 zcmd^mbyQT*+wM?O(xs$Gw@Sm%-7V4rN(v)gLpKOW$I#tKcPOQF51kT2cgH>czVBP> z{(0B^^Iq11nK^5p;q1NNc;4rEceuK$91a#a76=5wQIMC`1c8u?f%gX($iUzGG5iPM z1<6TMP7+i(LWuxApjt|(NPs}qG1&K}XuxO8ukw0MAP{c%zh9(&Nbx5Sh`&-nT0-01 z_+Sa!kXSd9>v$J^j9E00fKGPEuK}~X<)@wlZyvu80lMW^LcXoOmoDaAL-bjg(nnT= z5VJQl@#9^~YH=|H?Rk|W)6WkTUnA8z$kmd+9oKUhBk-3d9F~7ADnb3w_N3*~(z;`x z?O$2ga(6`)G9`FHjJxeSQld3Y-nzsIJe;`u*y$566Y&?~tLPvQ1|7ydaMcvmp9Tba z_3hO$3J4TLfa(JR`Mn9~!UKWuW$~|(K%ie3$YTF)lK8*8iPy&7zQf~;QSDVYeH^a* z>pw)^rs(QfBy8{5jam|zzDpA-pwq|x4Hq37d-5OxiSrhl+E#xE!KI3zkCT5Lo)7<2 zMSC0=p<X>QJiOH8V7{Wn2LibVd;NR(pZ=b5YGM!0G)L!jz?hz%o-a!+Bum~P(B{YD z|4b{p|G#G<A#?9|2kdN%-+$&t`KB395{K~$3B-&Oe+PWkFAUHBSq^Q~e^(Mh{+}9{ z<Fmt$gM(vdX9uRWv9|U&sD~RvPkMg_qMxyc1_hyZpqh5;N$!(9L1tJ@%}>N)Cav;y z?4ium^}&<<x>fZM1@`m~=~)jjfA}^ED$y?0=GK<|VpBDjQx5($?HDT?+lueggZJI# z^z`%zJ55i2KbL;p&bS;+2A>`IXaN3nB;mT$iTG-$`f74lOpXr*e(5m0TrWN$f#>r; z!cwc7<)=@SqR{JHNHn!bi~GrXTwGjTUEN#rzH<Hg-Ki3-`zCzW7G_$L2gD{ijbYu6 zghQ*0uwklM$SZbvuTzB*cVPFeqy;yjRA|to%#M;Y%cg|wFxUX!mQ@x)Q1FXbL!UXf zkNms#9}V4GncFU3x+eq$@8vV7!kj%-K;L|+y>qF>{BkRe+gr?fu~@%Mad<u6Y_qYl z4q0%Uz@?bfG7Z~3UChj0Q$?jA>sA`BvAs%}o|)k^YSFHOyXi~XU`+(o1(55r4wBXk zx+f)U49s8MuVBX4<ge3y^G(5JJ7li>guNbTE(U+BL=pHAb)(1yYv$WlsvMq+YZ__p zYH&y&P26aBC9GZqM_uK|xX&&hhVl3J^)WIrB_}7lQ5?b2(vrALd^Y-UG7l*)(6qF) zN=^(ue3;#{Ks^^``AhNq*{!jT&NQNGf`s66wZ^vsLd)4i(nrk}o1U<eSPc#AqUe;< zb*A;c!=H(9??%icJ~5rtq@LA9|7Kq>ban36Z#)}F0^?3i^CDg2gxpH7FsY`?D=8V& z+e|}z?-nMD)J9?aF)hweqpaaH-bl|U3VwUTM*F1%7OiM1;XYmQ@5N<h1`S{I6cw>J zw0^I2cnjC#dTB}yIPvUfiXdKarY4-^5fWux7nepPjou$JIlr!&M58=Oa&{SA@vhBZ z+^Cb+XtnZL3HjSj^}F9T;A=4dmA_|&NvF@&P%0)S=JsfoNwZ@?42h>2#H8XwbwJCv z$wHMpr}o?3GBBBTOoW^!VWf@b@9n@dk)(`N)s;b|i2VH4Y6XR-$57sQc5JS>1Lu}{ zDt;xNLXu5k`*Anw4iWy1Cz3qAdco4txq*mvO$XS-dIT}u!{Dqv!}?pq>BKkVCvR%> z(vy=k&}~>F2hx3hNeK%#cf92F<HMat(kU*bfcS9mw{Oo)?1{w1c0ZpSzf(Qj-?6lu z44BopY#=cp=I7SjI9sN9{CoQco>7)Ag;rzVAm1Q-vN)8wL3yV(IFh8gvDoKeEEm0( zQj^z8C7-$BqXO~??7!*CDlID`<201V)~=w4l4aq3b9*win)moX#p33=o4J80f${pq zE_x>m2S<jWlZBbt`goq4*N1A&;Xj#{yWIz6^QXR<DVMioV%HLj`RLT{o`Xo4IHlvE z>uWU56Y)%H6KKjALW!Iq+sHvQs6NMdr3z&1AASH1u&dhJ*LS+u6%j_Qt*_7Hb-rWA z=A*Bv`O8THZAu+1udF=ekAiOOzJ}KFLM-V!uy;F$QXfA$(iF?MxLk1goJ1y@_y~%L zb;7l-%J@}ic&x@6?B=mVn`4F{amRY93FC8Y>Yu7CJ?KS6ANZ@rFVeYgnH;o6!{J~2 zkd7=dUvv`ViFsa3>mn3);&y(ylZp#StcG^vlJ5Kp#<m<vIT>K9Ixb%>E`E1dSKF)t zedlbq7Prps&=JoaNsO6#%0AD`6|534Z(Uycz2W25qvt{Q)A!@mGdWe`&XESvEw3Ow zAE8TRIFv5yeJ?-T3O!Z4qvk1}g7E3EEmmp1T{@G+0{fcA(!n|yPZ|g5Dn1x2MuI1n z_x^XfpwrH;<8XC+L(kitcwLP9G2JPr+@n_4gIxnlP7by}oFqo_$^7lSILDYH;-nuP zC-<)(e-p3a$(~f$C`ASbB<{yn<}cQd+>GZMb*9bFd%El%ui2x2T`eNoEoEap?W>&> z;5Q%DuHG)?75qhdN9yXly`}I{Z(?)Yexml1q^E_eO#S&c_x{K;$5&iT*d9Kt)Q@t> z(kqBlcGAcM6nsYf>m0S2DihzGv7CpytE-Ep@z=Xl9oLV^GcyKti_>>{&^OFNlE3FA zb!EJTg+j=eM>T=HRwJFiHvqTjW^S|<O>iJ$f0_43R~R%#TV7zaBK4^CK@i{CR<`4X zIkjE!{rrI4SS|zHz15ZDBAqxbe`)wmuLrlO3w=YRA@|VrB)Wh3S~o(3>%n__4R$fm z>LI3tQ_*v$=c$TVUn^-yYcCyjb2fGM(3XTgy$~n6Z9gr92^?#iH~L=bn!p@KuwAH7 zyO?}Z7emRe#g8~hPNcKky_&=G@>VYH^sE#XSviI;5X{s^k}scrq`1b}Nu|RCy*5TD z+p-GqZVkbPVs5vlg1*bqS^52Vi`Bsi3paT49`qfXze?z2ztM1QHuGK9blS=#Z3}cd zbz2kNTr}D3#JbW?VsQ%KzFz1{BvlgKXhFsB>hR50AOjXO*~Zou=NZZ!h{q+q^6VTj z30}gkoPP=3j9LF_mc!1jxE8Zsp0IseA&?9v>p2kaQ_+29a{ITJCE)$jPv57;J@(~G zx6BXo`*d)=F9;6Z=WYu>hU#<9K8&#U2h=gF^l{7SgN})wUr2GaKi=*|l5*@G7|fuA zR(`K^I+(8q;~=dSt<%B+5rU~TPDaDI=P8bYd^2y>f1(*YT|FJXahvphn%`yZ@BIPe zH`t0qKl|m~?R<OqIn72+RD~4nm<ZKpC#t2TrQPeQ<9tF1e8BYB?7it<dA9m9FflO^ zyrk7cupos+5;LMc^;hX#jjCh633X(jS*Sjr8@JD4RdG<dsJHQ=<P_pjWTxM`6yy`y zh1X8NzT}N*w7uRNx#GFUk@+n6rqkU$OPR$bs$CheXGU7kpP<w*jp)|F&V-&;=$gb2 zFF7xW{Ym*{=^l{-^^|CD+WF(%{R>h;GQPy4bMzz%!b@31f7k%lSKG0)wA5YbMY`Ci zkdt@IBwk0e`$=w=&(w(U8u%wGyN7PNTlO5PI9$cKe_z1zX#VW6schq*38osF!ftVY zpYi0n^1HtCjIaj`pRQ(@6Y;si$q02+(Q+{?Zv5kY52czBz<s`&{Kxy+S#+nG*LG%q zxgECaR^J|1V9Ub7a<(<R(Bwd;7Wht4NvXD`rq~lJX<Z`26H$AiF8N9s0GOU%fD{L8 z6jo)i8Zf;-z|yYs+9{S*R;ns1KW|x=_&4s=vD9d~kV|Q0<spEEHmy4~tsJw0$k_le z=KKK084z&VQtpKA+E)o~+vf&}rvMNs^QO`FuJQW%dTL5L6PFrDe9oKy8JkW0l&=u) z{<=6j$nW;1z%8f?Pb6<gpwmRuy%ak&HTA`y4msN6>h8&4PLQ|&@J-akL@YcbG$1w6 zo4=cb$tNuP13BvwB5{BJe#*q<6T6!mEe^uZe5U>q%FczV?=9lxF8HGVhQWEWy1LqO zG;`DXn7<?lbr72x%s@|n%-}Z`4E)DeQR}SyrUv7Gya`L^3RY1S)mwr<;w!YrQg}dY zv^f2QP+|HRA@q>t`zWa9*BLC1iKNc0d>AMWgbUakQ)D$}al{|*Py4ggO@U>U1xgs8 zb1G!9^R5!DqJVZWIk<_DQIz!p7N$QTa<&Cv4M@{tV`Gbplw@T6lRsJb_>vw;cFx&o zc@#0ke@m^Rn`r#zdGS0dDhgcT2U0%F3*5W#L}g+?&Hk^43anx_W~8T|nyyxp#4&b$ zI5{~X&T=QeX9Di`OEYz(LDdJ+W-vCHyCf1)%Ay>crcEuiENg-R6?BX1PvhxVdV#-l zLU+u@g!(@>%m-l-NxnMX@ZjDI0w#yy0ptLbsjOD$jiZ49h1wkn)g_Rm0K>Q)G<jU_ z*ZQ5cn74U*>v?{inCFa{6F3R^&a5p7`h^6{8l<zQt@Qr=`%`Bc^<MAwo^V|gZ<n6| zXbK7nfzNOvqNDl9qmDYC9)W$gN_FguqTqKsTm)>DQqVEKxjFS{PRi@*&_y*!&}El6 zgUsJVP!sb+sc6L(^Ch>%^F*w5c3K1ip)F}OXv~l1x<C6fnKFwPl&ufM)uQT!11Lck zx;C1ng#`fRV~f1PY_=yRCSpWytpLL&rj3gS5JIMMtSIoq$H&LXsp>iG6<AzdeX`i> zM0`<FB5~uiHRN%B(of^HU!9Wj0%6th0RW3#{wORyWA9|b09bF*=B^=x&FsH^a(S?T zfcH#_Ozja$7MRVH>nSC%|M~rUXIzV7DrL6Ta`f9vZmX9JsM^uUzV`N<(_P*z!)pFC zU2bK%RfVjxU--`IMuEqa2u@_RFHIohGFH~H)6ya`0U(ub)x;&R+_~N*J^(&s*gSSw z%E8Kbl-${`OaJ~|{7&&E`}@??)crj)b0@qb;X9jdrMhjPr0BHulxX%wT|>jEi%~9> zHQBs|BH)7m94AxI<CI<}frNwve1KxZAWtI1!p@#wnpCwT7;#0coj)s1Qpc4j9E{Ym zs%z{av)gyEGmt~ZY@y|r#RT2xC)6}BxZAHC)zpf?t+$19W-c@XE*KPno<pVaUojzu zfsyfcnGFbWX<(0c)4yQ+kjrYK84e-bVBg(aim1NRQ^(9boarsidezv~DE{T0r4MN5 z7{SN?T=&?Ykl`<23xmmAMa&&m<FB!{!EhK31)n?v5Lu?S#4-K9;_q~=OiVZ)E;frj zp2R>pZnh#w*#1SS@^bdu_`D-E@JSE%DEO>(rM($qa)OvFvR3NAEB<zr_n=*->0UUX zOKyEtrIgI6u^m_XWp~ZR^{v<Cer&1BJDVxyZ|l#1O-6tIEHGwGYn;&Wd`H73f8qoY z=bnUKf}!9!m5a7RrlO)UReZ3qq9o3AHD0eNEe6=%&Dl0f$+(rXP)1$ESmFnE(o!yF zZdzK?zHh$iLKmUhdS}zw<Ul&oDpUq`;FFCF>*(p&%#3VQvsRJn!Ahs^e4RB|7ipov zZg6<GfGy{RTDxrK-VfJ<`HMaHS<owXy_!#b-(F4;<a4kHXyDd=EdF82m`pPbhsRLx zSMIG#AZtmc!C=W82JbaBCEGo0UY#1Ih7&Qp*VP5?zQ2WcCUL^Bo+V<j($|US*Jn!- z^CCZ`8kqNei$$*zKOOwr(S_z?Qv?M{!_Cc2Achm4Vw$Y|w5Zj%rg`%bG(8>zKE-$l zyTMY&DOE<?0XAQdPr;goP0F6#*|)yF4uZ<>&DC1|gY>>np?EZf%p*=RfQO>vQUArn z1EMaZ^MTKW--G-<|KGzJN)|s{^-)0DfQ&uSO{MDm5&$nd>w@Afe7Cx&t5`Yk{18Sp zRIChVAew>+f{=-?S-xipI)%(HnfN~Nj_%?f5Wal*)^_Gg>0~GlMW2%d)$Z=Drluxf zci^n>A{*z+{kb~vs5ViNuM<S)Zu0(rw}xTFcbm!56@4R~C@){WG-$NHprrTf*vobQ z?!!V0<FnHTTs#Da;(e9za4qUuPdJgawKaI0z~u@E_&0!$S%1RNR>HdPkEX&N>KZCg zO12nD5AQl6DurGhtvvOTnH<+alo=-h-0?4L&^%rD8-2qU?>wF_%d_W4TkY$U#p-%1 z;xXTGL{3h=gBMq7EmY4FpY=;kQ!}paee{g|a$7STFD;NuXz%>W98<5>0_WncU|X^v z-EN^l<l%gBqK4At#O+`{F+F`~GTTgZ74HK*?lFRxFpU3d?n}czU#RkZC`-sM42h|T z3JVJZ=IDJnXX)P=jI!j3C`i6MT-v*g<|{QosO2^_33Ry#<#gOJWkDs^Ot1u{eU4_V zm)kt1h-9X8)8Ok8x79)FZdpD@#0Ug(e!AGx&FDnH;_h@Az#ZUUNMxi1Zkl@_2>155 z8tNM+-ql|%=o^%8@kJHh&8oFSGgRFW69uDUVn1ttsd|i@OFl~L(@c}9CgW}vNii}q zYK|f<;3nJFC(}ho?N`e{$+=`-hyFYxxh18bpkPAjgV@u(6N`x?mG|xemB80m`5{-+ z`r_b7bi@^*WN)C)9pK{M62M-U<#n%eq8|Y_FY(5I-+i}RVJ808ALD)sv#he?WBr`f zoK5xfm<E*>Bn9=U1@%UgdlwvThw9kv?d=(s!HEE}?3l7tXzq{MX1uxhK2?@iYMAzB zdUiGi27_f~L3qdu>K|Uy(V1@!Bx=`cnVbQP4Okcd9XEGLo>~rb594uJv)}JXbPXxY z@bK`QzLgxQP}ien6$KAWkDJZpk~|upv+F6NUO#l!?w=>sZ9weMt@7c*Iofmig<>9R zp{mw&bjbX3-oCMRMx39ge4x0h^LKoN>A`e*I)Xfku_&Ea-`d|4vm<R=zCsVaW!&Jv z<IY0I6iQQ4i$V|+uV90n{8vZ&Z&a4?hYcZ$g&r3SYjhLU?&z-Q4S{?b{l8OXUYm)! zGZhAMiFawdw#AZHw>{c^8ZjJ#f~jWTrn2&=si!Y`dwabPciir&&P)B8_|`i?igyKm zQv<5WT8zS|D?bN47S+0O)j#a@BfsXNPS94sR8UbVu>F@3o1M1vZ|)PMXvOf)u0M6s z-BJ}dp(YOE{&YKbq`sQ`fkJ%U7=iSenfjV#*<grK%M14BQ;XB~h@bqyZ&MUT#&6e% za|hq#H_VE*)eAtCH)mlT;|wOT=7Sj+80@cOAdTC&MCn$&7cRtLF3lZiim!B6GFv-` zn&ZGCKXMUmMfSEqwTu;06XN3<6<DvKXK4Yf4ixX#3+$}o8KTWh=s!j1&B-vV8&jj_ zijiH#J18^@V^2(A*+g$g7bR@0Pawd(dh56&fwy1DWBXj>xoVd^{db*99G@PJe4j2C zAZ0mXDsXXK$K%zXKvvR{d;0q){&8>Ts>08mi`Iwb)jDL-!9`&iE9}mrjST-v>N2+0 zUA??uxl>UQ!-z2We&ylN&H3%rxR~d8ac))G&MN^$b+am^?|nx)&zZ$fy3{n<H&ts3 z+IwwmY&*Q2cElfwXH$xce<$R}>eVuV!3>-}?$Ta+RQfMV-XeHOZCI@K>o|A`(|D07 z=*JMwb{uY%KBJ;aQr6abFU?FV$}CjgS91t=$`_Xwc2-H7>yJZ|V(Gr*tg@|uS?Jg* zN?Sq>5;IsT6-I|Di?=4zCcdo`snm74Q;wo|2&U>rN1D^w2nRFRFSvP;_o{EIitL|k z^t(O$N)pfYgx;PboOPzgulA%wy;)w>MZpQz8<E%BgsRYb9>D&ruQd0c&L`El-@Vh; zlmv+Ge{3h7*!}TFj2P}YiWjrQ82`_=%`wPgE-Sq6wGu{hNy?wKA7l~)>Twwtsl5=n zFT#7tZON$W`|<Bs%5U27UkP{5`la<>U!?hm$Vb)dSVG`d``SOs-?LE#(YzI}DQIA) z<1<32`IFjW<=13t_3`fsHll>%e7=fzsQ}AycX)CvG_k`hJx*Q8KlAYM%}h_*Ew`l> zP5XPMTFQVA+?I&HFF$p)C)Q<izS_?i(3bQ$gRLCbVU6{wqj}z4+GQT%`LjwOm6~~) zFi3Wxty6a{S@6SDs!@1}4qxIIz!ycpvSU_g6{=%9X3u1wqy|z<9zUI$*D{H|J3tqM zIjqq6((pT+`~5^YSGej?e(`y1PMP@5&J{Mj+x-R9X=*nI?YCn);R=1yW#2n*>=L>T zP}eYIwb#-&j5VX=I_&MASB!Aqn+@#uw-HgB5h<BgD~gTFY%{KU*I>6`!9#92oYp(J zD-P%OIQ<(JN0@n8wM>j(YUj;Dn~9F4jAYuc8-}GMZ)RpDE8B-o1MQkb+LppJW79DR z*f&<~*7eT~uyD+pwy@<+?eCL)91WEnRSc&BzY0L}A-$VRmMzOG?4p|_v=kGt-~UZ} zHhJiEp5q{vDa?%m0BV&A^BsOYd_f!z}sLRtJKxggBkeB(@WV3wJ5kl;gi(ohxa zY-;~uOHqM#?b;hSpD=c5kKGpb=M3JmCA<XKUypam^yZ3aFviI>2&)LU!54E|#h@=g zJ(P0jVkUp=kqF`<8Y3R@e6PC!3mPG^Ii1o{J6LR<G^;+Yqj512@1bcjKsqT2YNBC= zv~i*3cSCA*(Rw`I`f$Bs<)GCD10V(7d*?~A3Cy{Zz&9b=kU{Z#-v*CaBJ-&)CbF2; z{jhgMMFkC1UGwy*;c@ajRxC?YKP-$iHv~%~5Y;Gu76Hd_M&c{`*oegkGnX)IFc@Z> zys4^sDmh(ny5MJ2_ORN7z>fn<k$K&dF@(Ke@L^lKxVR88se*kU!7e%ONj78k3=9l9 z+S;i0yGfK-Ve<71`8heJLn&|3aVb;yA=IOqFB4vwOl=H%ixj!Xm{h^{oNsBz=X;uv z%2TasF_MG>3KG%W`P@ctWYV#NIOKNf{+Ne~KE~wv3Vq&LiON}OmGJ%ZkLEx^a`^k3 zAaA_*SFzeo>CXJ$Q5!dZPoHzh8s;(0bkg^xrY4|Lc)A~b`inTs_C(^vi2mbEe4Uqv z({28`uSfQ*$(|c~OL%|KhP2%5X<7Bb>$c{Ms|4*8rxmZ{;#jd9V~i*B4fTopvc_i3 z*EPxAWwc|FY=wI}lC^`ORBmpIp;gR_RBp==%Pj9cqKs@#gwv=9KLDx4I$x5bN#}17 zO8T!PBeEVe+TSosWaIaubjs#6L%!UXTgRizAUp($xNKWL+K?)%1QZODT%+CQ)>9dP zT+5bh2%by11hzrnh}C;8dmXj2XcZ1+inQkEf9j1O+1>XHd9#b6lExFxG_~!IPMzH} zLPVv<PRhy+K+_ZfhjrnjHYtYwn>mhEIU7#EDB66o15u~3i`B=J4_jBP(jUg8_;wd- zzmC{1*B-qm!oDvwFuR6WHiBloz5A1=5Jk#Pkrf9GDr9*SGixDO56z+g5ZmaB^4dzZ z%s=73g+YPznqQCq=Da&u6iY1wz`|hL%f7xopx#Zy!gJXGNR|?`k8fTyKvpV4+y;ZF zd6V&3skL9YOFo;%4r&lb^^t&#;kGSQMm6XStuKl=5Yl*S=q@k5PO(2bhIG(<(4T$b zSD-TlA)SZq7h1sP*rjo%pOY)d<qCNoEw@jB)D#rv8th>AqH?CDrhe$_*?>(qH#d(~ z{nEiVqA;S3jRO#?*LpZpv7||(eFpU7)0|~iZ&5Xi#3n;eg?qNA{~Lnr(Tzr4-VdD6 z{F}#5J$_bvsaeC@WLY~KSv3$#5h$h+9>skl)|BE8z4Ai7+C$Eaw`amj?ZQCeQ}a0z zPEif06$|ZNjjG%3dsWvGcIO$7&YQmNsvp?kd-Xsu0RZXx`ub8T<ix_&OkuafNUjd| zt0lK~)pH8IFSGqLzF@N+jLc_G8XlOj5&gZ9WEY;^F{Nbcc(;ke>4Mx)iwiAbUVeTz zVBNjR4=lMXu|Q?L_ru{0F}nIs8@iX>qYGl*KOarX_T_wS#kQ`6ZaeqobmyM-(C%Ul z@77jkpU#1euKGe_+30&c74_tKSMpiOQ|LKcMnmnmV0q%+puXfqVO<o~c>OpD?u)Sp zI@)Z?=_LFTcktu&M$;hCJ~QE&N$IcrcSJuXJ#1`j^gEz80A=CcqKiDW!PFoemDCb= zIVeY$cTV2EK_wax^2p?R)eF1bf7W@uWRcepP|!Y1=o0hzD97s%51{Z?00K#c;ws2F zodHye<5G(Ym{!yDDJ5uj{v+b#Xs$N&_I%3v?Dk#O9YB(F<B3W8s$xovZ&U$PQ*rT* z#s%^&fxU=NCx+oF(@Ys};egS+0dK6-A)&cgFVwo&WF70?wQPERV#?<rO@@Es&1Tl? zs9GKk6zfPJIE}3^O|OnDI1<|YC_AHimjl=fhmg?i&Ujv_w{axab2Mrjy8fP?u@%<D zbhj1n<Xi%igCBqb3RFC&sMj$AN?~p8@(S8q5=>pO0zAmR;*3|}v$k$9`?QWqNb7yn z&83Th7dC9MpYcqoYS)QlVVH3+W5F(J1;%Mq^LX)Lp~zskKCAkfzk976Kt=+Z<6MhN z+5ORXPsdS_t91AyC3FABH|kLc7vnlb^>0ON38fc7K|z4-ax+n&1eB-tM^PrV7Ex(W zBtMll8KjND7^P$wME=<KGkv!+=1=oJTi@$TrlCcDCZL0h&XY6CHjOn3Q1-tD9DGi# z1qFW=p@S0>U+nD1^?73ng!VRT3%Nfxz$#-l3&f@XHW5BE<8%6l2_RnL9_{g{!SX6D z)+iV$06{T|Tj#0%`z?7Cm^OELq0QqAmqyf3N9W@HY*dM81d;W_W}4L+<(TU~E}j`f zo(sfTTigi#E5TWgi=u_m$58v#k19bD6xL%q=fqpXZuVM7E7B&7m8teCKX_Ie(&o{k z-c!7kS#cqVjU6A?hyA&1tUZ_xEl}-T1Sm+Lrj_Eo1}d<UXGK1+g%?!J9HOF+K=cLY zhys=O&OWUpmV9t<uy*I9oBndOd1wsRRWP-N6K2l(crQp4SR@@Jtow$-vZO)Fx`xZ* z)(_}Pc`@H!@US}`f3-oHMZ2tSeJw#mKtjOH<7idR7opZYBO@y-Eu%-lrN1W{?{>RM zNJt2H?AMd^UO>am5^xCEmJ|n{{-#s(KCcklUuZm93#Hk@gcOU(J@}L^0+k~1{qf_Q z!Yx8aK(qNr`|h9ueoazZ69A;V^46yVL9Gjd3e#-HiH|iO*j+2KBgdp=<(`vM^MW~9 zUA49MMb1gy(kC_K=<r1?_hkO%*Vr~GgJbeVUd|^MmO8dJPmYcOEGfVdPswjvV}w~x z7V`4&Ou^x2b!qZsTjsIZz8G6qED}K81xSdRnz(re@DhVI7rr7g!F2_HRZ8c*q0@F6 zr;XpVMXO!R4a{3Ro@2gp5_=+<Px3w&E$ItUZbxm*mo{6Qg|P4gj*0-;Jnk3gg$6UF zG38`$UzBnF`SWLrAvc;=tqjwJXJdVxQ7v<5a*RgXK(e?MNaw8wCn!PGK(<3zbXP=} zX<cOHn#tL|MxUKmxothPeQDM9sr5>8?*}XiiBu(@_|Z=PfvR;)@$NfhD6a}nVVeHQ zkejc*{-$BtChFVE@|cLJ<=Z~zW%%e=kRQMa{rLy$0BH1hca%p|^=y}&)>&aHFnQ|` z2^G6u?XXsFsA5H%*ZbD%Y|hbckXNE;vj2HCY~fiwfAkv@`17~Mksil2$AMM)ay}kR zNgY;ewrA}tG6gAzid57TG+wQ$y1tThR&^mS?4&>49l*90;6w1v`UX><s226FA`a_8 z^A>$N@844kItEGNs!2U*m||Lg`NGb^;&DDM=Ry7|o%sTp#@0(|p;xTY=R|I4`V1xH zdF=vw5-ch$Oun_(ti^jt$i42(&GyzcI&5EqgJbx8S#bM+T(`w3&P+-!#CQtoC3`kZ zb}PIhhf7{MxyR91wJ>zxDl~9>=lpa%<@dMwR>JLs+aD{xs0fcr$ayqV1YChUn8Z<5 zRV4<!exoMUscC?z*Xi>BgLHTRoP?-qT!4?9@0Pp2ni>n?^#Q4t(h^xk)<Kv}3$ch< z0v~JIh~&=&=!0<U^cP!mnkGvcXpGDGr{N}Fd|9;#X`H&1Hg>296OT8O;gh~wfg;?~ z2oe?@_L6<pu8?BI_F$$sg_b<3y`sK?!7=DDRP8zR*zz`I?H)R|f=eaD1JK+6`&{}r z8UgTSMaro)zE6*U$exMzps2%;Ur`aYdk7>z2*6ugN{mUa9-*NjcP=eoUZif(8PGwz z1&<HM(=aZjJI-B=Z5OD{>e+~|4+`Jgo~gh93wimu^XjPnt(&#|lM4L0py46uebF?< zvt4xD!Z#4>4r}X{9D@CjpHlVu99|_^!xPK%u1q%hK7C?%st?VKuj8_aZx?`ga^cyo z=s8Pl4ls&<3%iqRi;FM>wcJ&8J_@;9348UUpc0@y8XrH2JYF7k+C1idaI3Ho-)AOG zDZtwp-`y8#cU}En{8qNR{c6v=UwY9cX8Db{l>nq_Hb=05VRs?^Sw%Q<+gfGpd>Dq( z*~R7Fie4JT`hq}1DrC~l)e5JcrcNWIc&FjnWQi~2@igCEQa$+BuU~X>(Zy>A7Jx2L z@W>$KWRn+1=y-Fw*|_Yv2Ot`msnC!4eSf@X8VZHCV?J~WQFEK+pI?g1z~MFr<R>WC z^+JI4zj!7aO-bQ$B)v4&>Jk_t6Z4YhZP3yW{*~rwpAF%&ioK*H13oRb12Vx+O{TLL zcG3wMgwbl}<5oN&Kv51OGhh{a$G?KFhW)_B%bUnLxt-}Xvd5H${_Xs93CNG7mrjAd zk`xtx&)3_Uo0*-SodG^@e=T_2Xj1YP?n6q%Elx(lVev!n#+CZfWj`|5H)%>*8u1J_ z>RY?zYE#1RCI>!Yv`32y(^nTebm(~eJ<H}VMB{KUe|+bnR*)^5l-*;W?|dj|CN*zn ztugHm0bqT3dHLh50FlrU(42rB_)|PXDHF|R;)vlBKqmh~Xl)+cB!ro0_}Wv~TcVQ% zPA#@3FGH3$_p_ZelQZf;JKrW)XNbpkUKgX`3x1)m2Nkc-kO&Jo?qFol%1WuAI`H4T z{rmd$xrW=LMTv;LU2Au3cBe-8Vu!ca=g*&gy;pHuwty}fS-4-x{O(jI!{7b6S^$0m zWJ!O58itck=Hk^u=cC2y@a|6QM(;@bY%hFwAF3B|>x!s#LkvPMYBn$Hk*-v;Kik^Y z-gu()dUYQYjErt?nz&vXZ79y?JJmNf@Z!N<fv>NPCXe4#M(i)OCbujB;t1}s)$Z-Z z9?S6&u-rgO0%L2Jm?+A7dp`g=&c?>Z;Nal+5+1|Em)1PFm<g_AOBTfG<{(g`Jiq+o z?Sp%-%Xc3$+j=yC^MXDYYI#j2ch`&Li*@fT`!)#H@f3pm)KyJXFlOK4+B@NFzACbj z|0$HKHMt8?p8_#>4UvtaY}AaZio&*pw4L+;+?uh^&8FY<zUI`*4^xz2qD(Ya(pAEV zv9VR?7@g|<D+`R5nycI4;)wn(wO)b$Mzb&B=T55-=s{?ApUT+I#mHfYyOs&o{RD;> z_Wl0Z_0Yk=ib)MjKUa=PkzmRB0Ftx-NAG(Qk2nVpMVf$jYn5T#$CD0e`ty)QoA#>; z@=TOc30`5Db)X7M3aHMdVvp>VWXheS-9=CKOT;g!0y0ubRo3_KT~4&xA1Y?L)X1V@ zV&I7UyK(=*zAoR3dKz4sJCw_P(W5;jD(}l)i>*k16S_X1-9;FA=QLheI3?f2+(skc z(u+5ql#z!c#axwfE?0<1lOId=w)Qs74re3nPjXQ-IOu?z8Z~^G1L(4={kc5#U?q`e zrc8H02qXen>0S)qF-&nxpuML+OP%Wp&|Jc9L4>|58(jLN4rjTlRg>~Y(AyElop6&% z4^Q@E0|R>l7z9ugCN<goD}UP8E;oO+g@nH#9K1c>kNiB5EUQ@4(UBt68rlD29&Iw) zi``9)vi{ue<VUuUTr_2l&DB5pKLz0B-)8PH5%U#qvJE?A@Y<4&2509QVpe}(x1A}! zN%p--_Bh+JTj`)uJ3tY*@hX1WXoQJ*=t8U~f5@x#9F2sHCiigb50jUvjLFUMPN1pN zlWm_PdXrC@D<cBhuQR-zEC^dwC~`8ckGn#XaNC~%B4&4TaZ&l=2q<0Urf&g#;eKLI z2vD3#b;@w5!A;JHiC@1Yht}|H6cfG!C4tD*qSM921t6RCG4UWb<#pj@*L8>DsloVE zs^DD4ZP&npf*ZG0vqakgSr%}2IbqLp=F#BQ?J7da{v1xx=`R3qEv=~7YzF1zmXw6= zb^+aN$IeyPH-bK(DvRMX9Ssc)Lqp|^AAl}B0-#EucB>oGbt?jR2_RwsdS&Lj&x%Gy zOPL~GJ67)eCd>$P%x37#>Ay-^cqBtOc|O>gnUx-(yP>?G-`5_+G}#6~L*4aGUJMXz zBobX59pCjHDa11ZjaGfVy@FXic3-~a*PlNC+A%<e5bs-aT%cun?y}^KGuxr$l)5p{ z147xKI0itI>!la<s{{o1ryn2K6LVw49#d?NfhXeQ=Rb4F1%%j$6YV8{QS1if*;GJY zG(lSX*-t20;ZO6hBL|ccd5p*=NFXE0RrGo*Tid(cvMOV*gL*O(=t;-jVV+G!6$oDg z)7r}Fds2x^7$NeQa8o~?jp>^ghkybh5%_G}Z3?j(t|%XXqKFYxWI^J?&LwW5Znu1e zmx=6$uaTMOFu<~%3N(%yg^QaqB^sf0@-z;9H#t22rJq?Q`LFFbTa;LK8~gJ<f?HEd zowu{o+*&_P{h%q}G>%nq;75}Gp5wu17LN^*X5-HD=znd<;x0C2WkLHx&Y6k>Mld4{ zLw%`X{}T@q$#JM9WMOW2>m{*&(e~e_+igt~qrc0hOkcDt{anQoU<t%IP1^Hy4QU0R z2KYBI(Rd9gliBhiB`o--d>$gIPiIc6S3(nOlqn9J*X4U6o<3l8{?5e?U>@HSViVuf z?`;-As%b{4xMZhzXj_Lk(dJImZ*<Uj&1ek1+8b)nmlserpw$ya)b?DgXCvXgsBE9X zk|8lmV%KUgl}k-!nRfY-(@-~`!s1)m)Rxc8!A2KeBn{{&H@u}WG$>-&-9|Ca*B9s# zcF$*k4s1XC9^?>jy9@WL%6v++#r^tbvo4j<gb>shaC!e(!|%wBapU81$w&2ZX#}rz z_bu|UWf+!U`{q_hY{HXBv1P9sr3zjM_jnf+e{syhqoX>dZs||Ksz^8fFiQ(JSMK*e zP`0am*AICvi3;>S`%$9VD*!zBwu+Oha2Lz?tb+JgY1oa7X4<9VS=fTI3^nBQSdz}j z!p%FN{cNAl*T^NJ_A_mclh=|&!9D4<7vIF1w{pSjs#)f!xld%9laN_E<$f7<?0%;c zQB{!NnDm<d@+J}FR0-vPvr-jYQg-<cbtu3`ff1XH*v`G%@A6b2E-WA_-aI`!k3LV` zQ2&GG=Cb|AQ0K*`ZQ>S^ik3g#9Wl<%e1+>TymMyauU4>u9`(TUq5ao46|SUw;9JBO zx)~*U%?~fREQDRsX_=3G+Mrb`(ZYSFL+PqneM+Ose+J7O_x{G6C!$F%yTdnYPHb{M z7F=aQI?oJNj}Y>5jpnTQ3AZx?2R8?0%Nc5IRexEXseQNX_kKc%chOu1Xg0gwst*a& zXh<Tz^2Ub!==VJ(SLvvh-3?Z%eY`&61+J;~&5V)_fV~j^G?UWnw@KPX0-gz#?TX(< zg!^iwbV&Bk=hv9_LjoFAIVskXj5sMKFGa1gpZQ?li%=nUe3a1wV$&>ZTnpQzf2%sM zwPk<%$VO96h~3jYx0-Q=E9TIP=`fR3ODWj6_R{{d@_dS5$LC1fDD$dBNrzzWXkom~ z3bdbB7lvO?e3~B%YW{eOyhI$^DWf3|P1nXgkuTMJ(3SI)=R5F$Lq_J1;u<g0?^+tp z1k$mEd$76g-GN}%S%D8RX@;<g@t7Q5#u}d#pIUlmr2FpG2jA%QC8i$6iivAE2Zo=8 zvfb&qo}lPvL!GZxJcV8QH)}+bV=4>T^MX*h-h%}$e`Fb4<D$2@tTTO{yZ=G2;;F2e zrb+91oPpibTwu<9qX@6zp^_2>zoJ_~yN&RnyAMU&Hfv^{-#Oexg+<oU-))}AY==~e z7|NYE3Xml+4LaNJ8O9y`J>Xd~v}dwHaiE!REF12+KyiF<ZoT&x_Nk#F&7f$x{7Th3 zxMuhvlYO$e;;Nl;kScm=bJKG}2veN-#A!8jb+aHY-g3O=gV=zLroQt`Ui1NF*=Lxb zhj6-5zsTRc-Um+S*{){x(Q{WQ1WqfrcO#mqi|Tlq#R(tATfC`tdHA03zmKQ7`_p*r zN)741a;4(T)J4L_x)&^?3DCbKz05A>x!)xBI<O&R^eRlm`Ci+o=RV>{(k8;PFr2RH zWE<~%H_+JcBy!<A!ffP;wi0@I{5XP(Uy=hAKr4oxI}f}Q{|cPXVA^I+sYz&KXtPOn za|c_L$@6+OUwIlGUrJjfhsGlwPYjQsBBK40ad~*ZZ{5P~jW9b;37SG{k)S~_n`mOJ zSMLUE78Fv-Ek<Ek+Xco&yw=fgc8l3svnF2>h=g^*Bs(~K!O1$8ZBM;IyZfC~7w#j> zRE)u$LII|Cbf<2TB%9s6dC)P;7PeO+oHTVx>LTelt8B}+Xv|K-L(VSW(o+xltp$^u zmjxK?ue5~^_jm_?ZrGPO0UfXl(h2X?SDWrwH(fjxWAX;Zgc^0~TDOD!dv0oV>~8QI z37WCO5~dL>BGJ3SPE6|_MxdW^Qcv45<iIfuNh+Z4T;{mC4FpmIdb@yQD!4!gSk5z= zL2OVq&*H{^4zBE+{P$TEbpqu>6p%Xke@>`;?fNT<!3&HA2L8JYoN)R7Y#^$SI+e}D zz(Vc6Q#SIiUtTIaok#D3SZmFCBmP550tadke)MtRaenu7Jnc~O2GYphxqKNy1^QU& z3643k|2`3P^?!Np=au{vsVcllnX5eUG#^cEQxHlK-sGm*3@5hRotQgm(aD_LGfL%r zWC1+_or|EKbQRgM&^ZCYOjr+hdnv~d8CFdMzo40LeA0WJ*9Eppkt__Hj&q;yo0h1W zwCbmIpqS#*02p|Mng|(C`ZF~A+fmw6;eArI{=ODmr|8q?a6QqS5qDKw8j@p5MtrCL zP4cHZYORgBrcQueu17-0epP4MrNwu@s}&>R?qP>3fbQ{tLr?+eGBeTswM3f?GIOa2 zNkW-N=uMJrPD?`ECWDSF-ROG6mJ<5m{%;vcMhaZ!K~6##A#ui8)WnWd>YJ=}XU)Tr zfV#SXw2kJCIqP6ES8CVXx;obCY7MW|m<l>PdwBvm(gDrWB!Lkvjn9h;dNN{!TAPAO zK^d1E2s31HOknNt!Rb;DM$!Fn(k)$*@=w*=EN*s+nO~a3Vqg1as2gy6`b>YyJ|Z}^ z@+Wrk+d6KzEK4+8r}nUYRx`zfUOs23m*9rw(DJ|#_KS3GIJiWkNY5!K-_k;NEI4eU z<{hPFzSIcW%;o8O6u+2%%h;0uAw*y5Egt&i7+XG>mC2GotofYpQlzQH0+7;3^M9Kd z8zq`4D~<y1RJVt2P2IAJ)84DUA9Dyp?t1$74Rt?EeRP!@7HqMun_9ze?|XY$G&@`I zinm7>h?XILB4fo&ga{}sm`wwpi{)nI3!*zmK{0-+yr#(gx{L-=M+W>BmEUqZ^HXy5 z-2G=N`&c*1L$!f7SOLi?du{z(unu@IaIoMr%X)bKc7go1(!0X30)aw|AHPj#Gr~yA zB1&sWzgeDvN_)<R$OeR3^<q0@M3F#UPdro9TaiFC!QUPGuZZz~c+@TA)xGbToU~tv 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. + + + +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: + + + +the delay associated with the processing of the service request is isolated to within the storage MC: + + + +whilst for the response E2E delay, we see this: + + + +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