More work on API dependencies
authorHenning Rogge <hrogge@googlemail.com>
Sat, 4 May 2013 13:20:43 +0000 (15:20 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 4 May 2013 13:20:43 +0000 (15:20 +0200)
files/Planned Dependencies.graphml [new file with mode: 0644]
files/Planned Dependencies.pdf [new file with mode: 0644]
src-api/core/olsr_socket.c
src-api/tools/olsr_telnet.c
src-api/tools/olsr_telnet.h
src-plugins/CMakeLists.txt
src-plugins/httptelnet/httptelnet.c
src-plugins/plugin_controller/CMakeLists.txt [new file with mode: 0644]
src-plugins/plugin_controller/plugin_controller.c [new file with mode: 0644]
src-plugins/plugin_controller/plugin_controller.h [new file with mode: 0644]

diff --git a/files/Planned Dependencies.graphml b/files/Planned Dependencies.graphml
new file mode 100644 (file)
index 0000000..4347077
--- /dev/null
@@ -0,0 +1,865 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" 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 yFiles for Java 2.10-->
+  <key for="graphml" id="d0" yfiles.type="resources"/>
+  <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 attr.name="Description" attr.type="string" for="graph" id="d7"/>
+  <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="d7"/>
+    <node id="n0">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="418.57142857142856" y="270.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="33.7890625" x="33.10546875" y="6.015625">class<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n1">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="339.2857142857143" y="120.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="34.8203125" x="32.58984375" y="6.015625">clock<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n2">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="157.5" y="585.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="87.6484375" x="6.17578125" y="6.015625">packet socket<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n3">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="130.0" y="270.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="43.228515625" x="28.3857421875" y="6.015625">socket<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n4">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="340.0" y="360.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="89.359375" x="5.3203125" y="6.015625">stream socket<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n5">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="339.2857142857143" y="180.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="36.044921875" x="31.9775390625" y="6.015625">timer<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n6">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="339.2857142857143" y="0.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="54.4140625" x="22.79296875" y="6.015625">os_clock<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n7">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="170.0" y="450.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="66.736328125" x="16.6318359375" y="6.015625">os_routing<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n8">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="15.0" y="0.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="61.4921875" x="19.25390625" y="6.015625">os_syslog<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n9">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="72.5" y="180.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="22.439453125" x="38.7802734375" y="6.015625">cfg<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n10">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="40.0" y="60.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="48.466796875" x="25.7666015625" y="6.015625">logging<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n11">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="40.0" y="120.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="47.365234375" x="26.3173828125" y="6.015625">plugins<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n12">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="485.0" y="360.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="81.701171875" x="9.1494140625" y="6.015625">duplicate set<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n13">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="510.0" y="450.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="28.6328125" x="35.68359375" y="6.015625">http<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n14">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="0.0" y="270.0"/>
+          <y:Fill color="#FFCC00" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="70.720703125" x="14.6396484375" y="6.015625">logging cfg<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n15">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="432.5" y="645.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="50.294921875" x="24.8525390625" y="6.015625">rfc5444<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="315.0" y="450.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="39.115234375" x="30.4423828125" y="6.015625">telnet<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="182.5" y="525.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="57.51953125" x="21.240234375" y="6.015625">interface<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="274.2857142857143" y="270.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="43.287109375" x="28.3564453125" y="6.015625">os_net<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <node id="n19">
+      <data key="d5"/>
+      <data key="d6">
+        <y:ShapeNode>
+          <y:Geometry height="30.0" width="100.0" x="130.0" y="360.0"/>
+          <y:Fill color="#00CCFF" transparent="false"/>
+          <y:BorderStyle color="#000000" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="66.9765625" x="16.51171875" y="6.015625">os_system<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+          <y:Shape type="rectangle"/>
+        </y:ShapeNode>
+      </data>
+    </node>
+    <edge id="e0" source="n9" target="n10">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="33.333333333333314" ty="15.0">
+            <y:Point x="147.5" y="165.0"/>
+            <y:Point x="155.0" y="165.0"/>
+            <y:Point x="155.0" y="105.0"/>
+            <y:Point x="123.33333333333331" y="105.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e1" source="n9" target="n11">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="0.0" ty="15.0">
+            <y:Point x="97.5" y="165.0"/>
+            <y:Point x="90.0" y="165.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e2" source="n11" target="n10">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e3" source="n17" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="37.5" sy="-15.0" tx="-14.285714285714278" ty="15.0">
+            <y:Point x="270.0" y="510.0"/>
+            <y:Point x="300.0" y="510.0"/>
+            <y:Point x="300.0" y="360.0"/>
+            <y:Point x="259.2857142857143" y="360.0"/>
+            <y:Point x="259.2857142857143" y="255.0"/>
+            <y:Point x="375.0" y="255.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e4" source="n17" target="n18">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="12.5" sy="-15.0" tx="-25.0" ty="15.0">
+            <y:Point x="245.0" y="495.0"/>
+            <y:Point x="285.0" y="495.0"/>
+            <y:Point x="285.0" y="330.0"/>
+            <y:Point x="299.2857142857143" y="330.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e5" source="n17" target="n19">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-37.5" sy="-15.0" tx="-25.0" ty="15.0">
+            <y:Point x="195.0" y="510.0"/>
+            <y:Point x="155.0" y="510.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e6" source="n17" target="n7">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-12.5" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e7" source="n10" target="n6">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="-33.33333333333333" ty="15.0">
+            <y:Point x="115.0" y="45.0"/>
+            <y:Point x="355.95238095238096" y="45.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n10" target="n8">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n2" target="n17">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n2" target="n3">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="-33.333333333333314" ty="15.0">
+            <y:Point x="182.5" y="570.0"/>
+            <y:Point x="115.0" y="570.0"/>
+            <y:Point x="115.0" y="345.0"/>
+            <y:Point x="146.66666666666669" y="345.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n3" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="-42.857142857142854" ty="15.0">
+            <y:Point x="205.0" y="225.0"/>
+            <y:Point x="346.42857142857144" y="225.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n4" target="n0">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="37.5" sy="-15.0" tx="-37.5" ty="15.0">
+            <y:Point x="427.5" y="345.0"/>
+            <y:Point x="431.07142857142856" y="345.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n4" target="n3">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-37.5" sy="-15.0" tx="33.33333333333333" ty="15.0">
+            <y:Point x="352.5" y="345.0"/>
+            <y:Point x="213.33333333333331" y="345.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n4" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="12.5" sy="-15.0" tx="14.285714285714278" ty="15.0">
+            <y:Point x="402.5" y="345.0"/>
+            <y:Point x="403.57142857142856" y="345.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n4" target="n18">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-12.5" sy="-15.0" tx="25.0" ty="15.0">
+            <y:Point x="377.5" y="330.0"/>
+            <y:Point x="349.2857142857143" y="330.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n5" target="n1">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n1" target="n6">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e18" source="n7" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="-28.571428571428555" ty="15.0">
+            <y:Point x="245.0" y="240.0"/>
+            <y:Point x="360.7142857142857" y="240.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e19" source="n7" target="n19">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="25.0" ty="15.0">
+            <y:Point x="195.0" y="435.0"/>
+            <y:Point x="205.0" y="435.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e20" source="n19" target="n3">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-15.0" tx="0.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e21" source="n12" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="28.571428571428555" ty="15.0">
+            <y:Point x="560.0" y="255.0"/>
+            <y:Point x="417.85714285714283" y="255.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e22" source="n12" target="n0">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="37.5" ty="15.0">
+            <y:Point x="510.0" y="345.0"/>
+            <y:Point x="506.07142857142856" y="345.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e23" source="n13" target="n4">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="25.0" ty="15.0">
+            <y:Point x="535.0" y="420.0"/>
+            <y:Point x="415.0" y="420.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e24" source="n13" target="n6">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="33.333333333333314" ty="15.0">
+            <y:Point x="585.0" y="435.0"/>
+            <y:Point x="600.0" y="435.0"/>
+            <y:Point x="600.0" y="60.0"/>
+            <y:Point x="422.6190476190476" y="60.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e25" source="n14" target="n10">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="-33.33333333333333" ty="15.0">
+            <y:Point x="25.0" y="105.0"/>
+            <y:Point x="56.66666666666667" y="105.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e26" source="n14" target="n9">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="25.0" sy="-15.0" tx="-25.0" ty="15.0">
+            <y:Point x="75.0" y="255.0"/>
+            <y:Point x="97.5" y="255.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e27" source="n15" target="n0">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-12.5" sy="-15.0" tx="12.5" ty="15.0">
+            <y:Point x="470.0" y="345.0"/>
+            <y:Point x="481.07142857142856" y="345.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e28" source="n15" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="37.5" sy="-15.0" tx="42.85714285714283" ty="15.0">
+            <y:Point x="520.0" y="630.0"/>
+            <y:Point x="625.0" y="630.0"/>
+            <y:Point x="625.0" y="240.0"/>
+            <y:Point x="432.1428571428571" y="240.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e29" source="n16" target="n0">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="33.333333333333314" sy="-15.0" tx="-12.5" ty="15.0">
+            <y:Point x="398.3333333333333" y="435.0"/>
+            <y:Point x="455.0" y="435.0"/>
+            <y:Point x="455.0" y="330.0"/>
+            <y:Point x="456.07142857142856" y="330.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e30" source="n16" target="n4">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="-15.0" tx="-25.0" ty="15.0"/>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e31" source="n16" target="n5">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-33.333333333333314" sy="-15.0" tx="0.0" ty="15.0">
+            <y:Point x="331.6666666666667" y="435.0"/>
+            <y:Point x="325.0" y="435.0"/>
+            <y:Point x="325.0" y="315.0"/>
+            <y:Point x="389.2857142857143" y="315.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e32" source="n15" target="n12">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="12.5" sy="-15.0" tx="0.0" ty="15.0">
+            <y:Point x="495.0" y="405.0"/>
+            <y:Point x="535.0" y="405.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e33" source="n15" target="n2">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-37.5" sy="-15.0" tx="0.0" ty="15.0">
+            <y:Point x="445.0" y="630.0"/>
+            <y:Point x="207.5" y="630.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e34" source="n3" target="n9">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="-25.0" sy="-15.0" tx="25.0" ty="15.0">
+            <y:Point x="155.0" y="255.0"/>
+            <y:Point x="147.5" y="255.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="standard"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+  </graph>
+  <data key="d0">
+    <y:Resources/>
+  </data>
+</graphml>
diff --git a/files/Planned Dependencies.pdf b/files/Planned Dependencies.pdf
new file mode 100644 (file)
index 0000000..ccd7756
--- /dev/null
@@ -0,0 +1,629 @@
+%PDF-1.4
+%âãÏÓ
+1 0 obj
+   << 
+      /Title ()
+      /Author ()
+      /Subject ()
+      /Keywords ()
+      /Creator (yExport 1.4.0.1)
+      /Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.4.0.1)
+      /CreationDate (D:20130504151910+02'00')
+      /ModDate (D:20130504151910+02'00')
+      /Trapped /False
+   >>
+endobj
+2 0 obj
+   << 
+      /Type /Catalog
+      /Pages 3 0 R
+      /ViewerPreferences 4 0 R
+      /OpenAction [5 0 R /Fit]
+   >>
+endobj
+4 0 obj
+   << 
+      /FitWindow true
+      /CenterWindow false
+   >>
+endobj
+5 0 obj
+   << 
+      /Parent 3 0 R
+      /Type /Page
+      /Contents 6 0 R
+   >>
+endobj
+6 0 obj
+   << 
+      /Length 7 0 R
+      /Filter [/ASCII85Decode /FlateDecode]
+   >>
+stream
+Gb!"Vc-Bn2c8:@%cW0$8FEpGN^I+%j)!HP<J]C4]mVe1u[-d_q]HVqnXhD&9_i6>,mSf=NGdOo..#OfK
+MCO*]c[S0^O+7.anc@q(TE"`WoC%2-^]4!&iSXYRSRmA%)95O%rTgeI?iTt@s8'M1li6Y-o7-O"rq`8e
+g]+&Hpn.Q#?WG*1s.B>UTE"n?rBL7]r6sR'nW-J,s"FBk[e3@an$.Akk*pOgc(Ca"s/N7%07@)%EW5QW
+r1[j"r%dO4O+2ZCq*.8!rq@::6YlLQ?iIsqQcA'Khu7SDo&'H>s8:bjP5j1Tho#6XR"b>+YOsa\s7l>$
+^oa]QqYX2<.JieRq?R"2Hs_HZ5ND\@^Q\ZKO8nf-o[Y,V5Q7_VrE!o%lDf?9p@Ks,rRVs$qn]ZQO7f:@
+p"'uESS/_32LkZ&([s#(le<pdHdM\+Ca4<hrn?\&Nk_#dm=XWf%r/$ChtFh),]7;'UUdt-WL7\3Apd66
+eDL&_r9M'l^%8Gl5-WT1='7bn8*d@%Sc079C`H06`^l_O`hC<HX025`<-g74%14`\2s<@'g8[+$!Y0P6
+&)MeAmEg4[<J8@\oMhc4l4Vt?n^]A^Rg;,$Up9W99)Dt:X-H:VbBp>XY>I_9d&#\KT]g7u-+sDi^K+e-
+\2fUSEtc4X:e>`70(R`GS<I\&P<aG<,CDRM7@#P7O_>e^=-2i=mgAV2"eSi<O&,cSq5g,F$AM^8ZQa:+
+r-0\s`kN"4B\nU+qemJ3UW/'c<AYSpEW!5U0i/V=5gMZKe9l"XqYoD*I_@g9Rn=db9/QYu1VO=R<E$Yh
+QI$>\?KAr#eOt;_0IkEi]Np@p1&B#k[sCZgRcIfQo(cpS(H0$6k)F_nPVYAicO4%XQFM]$q4Np"\%tQ/
+9=ma*^e*jji>\tQHRFP16=2V4B<KWce9//9AM74=2bU?:lf"O.ca=uiEsADHs)jr631<qC,Zd3t^Km(M
+,Lur9J"bTVgK7+^YdA3<>B>9#ojuDc`/l116.,6QloeF!%gdM0rSSK_>"Fp2S*"Euc!p?1Lc+(>boUs6
+akRY9l8@\qTFa(\*-<.gdLn<Agq0$@$1:g,IBg.M;G9qs8QVu6FBVl,&,sQ*<oL%Rk`Q.FC.4,K1]XB?
+PSI\!N_>C?f&'@0@ssV+;_%SGh=9uDRI!kR^AZ[1GfKN@S/N)io.d)cHrdrAf-<Z_55<.5Se94"q0#-l
+!=dHH)$A5;g,*j&Uoe@E3h*kfbo_%of8Rq/T_"E)=Ji1!&s^WrJ8ZP#hO]"cWR?PIM-@!:K/%^<S*4Pp
+BFF2?I42q&SZN*_Qd,LF8]+ci2Q]SL:36ffL5^K+P.$eRmEfc'?QL2ur`8:1g4CY,R\i_e8E%[_:u[>g
+>OkTGm_Q#/lC`q(8;_%:Tojs[[oPb[(?s@!)Qo/]2/(VfA]eEF'q-2B8?PjUiS0MVQn&/DX,dcAYbmM7
+j3.]roo&g-1>4lrk(2>qZ@C<$b0hV_09,+^ZJnnQ(K,+-6b4NFXf3+oH4q+FeA?sMLoQO^%er,]U,Z[S
+M_oGC<a"6sH4SA%FBMg1+\lk5VBq6T`OmIb0&\i[ENS0lJaR7Kca,O$?V5KA[;sIIfZe2!&d\3O]VTBi
+;o%jYK&8dbGK;"Kq]0j>BfJGb/TIb=3Q/a(^/3hIZhl%gN%K#jCeOaFd44.$8Xp%Yoo_9FVTg<Ao9_T9
+=Rlt`1*>C[R_=eBgD1q-Bu@#t8Xp7],cS@3qN*[f;W8takdToHO>pI54seJiItbgdUiB+coCT4l08];Y
+3F3='A%tt%4B/mm8t6X^bRt0!XXS6jnfB':OX8;h>P4#B''DPl]Hkc0DNi"acrEu@4T-jM9-0iiV&4JB
+&nfCB8;X[KrBfLs'cdo7m%]e)JQ(PZEEGc%-!h":ZYa!&`!Q9q`7Zg@')f#c9B(L$f-r9oXX28FmVF35
+dSf'eBWdRZ#=Z=_MeX.\--h.sH:]+GpI^;6oP!o^32$"l9:Qhn8fX:N.<0ql+`WhET+YeiVPDq6dN'KN
+&r"8lhHS%S..'PFGlWlCg#A*T33hVGqqi$ChWn0F1`MT;i;N2/30jo7304u$8t6FfnrmC9$<I9l$U=X2
+ruM]mLJ-XA_mT$t4Y?]C5;pOYjq97'qURk"YJ`TnrGQZR0CT&!%gP7PFh,BtPW6<@^s=2,IMNYp&UJV+
+pVWKHq>d6+#e19"Mkps!&[_j<aM^@=G%.Rbl+h%H]n>Or60/S0copW6!,cJ8St0nCe+>tB`j`lRrJb14
+$^C==(FWLa(FXVu?V'lL4<lkT.#j@0d3fsO$^=WM:Qg<&r=/UX(FX9JJSrTYE`:1o9b]^+k9?XZ#B!Ib
+ZaAq_O$#l2k;:Uhk;oF[@[4&pU/p,\D:##Q'Bm;=/h"<c5tUO\gpZ%E+u,.*SpJ9^KK`dPh"1XKO_U+U
+Uj"WCfZH=Q:Y3&%4S4Y^?W)_90e#XHcmO<1G2:LUkXB`IDJf4Os#N,%&,H/_:+ss'7?kHD)@'fPGoOo&
+Mmk'2.H53i+j>r(D3T4oh4Y`o8@18rONRAl3WrRRV)dR`9;S&cV$tV^m]YdmMS>_2jDFm:6+sO0olk2:
+9P>fH];nI#T^6UVErF'd2G@]5gH\4#+_1hW'Kld1^?POd9lY3ohu%VtaXo9Fb\%G)+aIGrh"u\@,EG#f
+Hk8<=@;.%Y#`JusdekEYUoZMS(p.OI\OThAm]T\:b`?p>]@Soi8X&+5DmRAiWt"@K4YfWe#M*Sd99%Ho
+RLX3mW"_B%$GPatMXLj[I.W)sou%oUmAqZnc"--s9dBMuM;9J9UaL>8bq;g100QRM6rA8WAO0*SW7RB-
+G]7Ar-[#ZMX="L8R11]1iEo2Q\6eJ-\#L2%*bi$l^Rd$<-;3Mo4^gBR:RFc&';hGpK^!88@;J)XY=n-e
+f-EMaBqQM1JR7uu':[_uoA5,&j@%DmlDO9/R;^C++W5@&2.[9];C%O(-]F5FJYaal9Bcc4]3fjcXfg_Y
+oOoUbK&4&dKAQ!$3_/HAcsaW[`.Qg0HGUA\T(q5^EVtthZC]\f<r12W`cN(]<nnEP<3`b0DN\[i$\!p#
+8!!3qO']ZkK@\I,VuHXGZTS*YNDhM/k?7&!h@fg/<dMTmg%D,DY.iEsr6'>L^u_2.IfCdtoR[a9raT4*
+8H4,-&20;'?jhABr\-3T0>@H,04Q%E!Q2u!'Nb'U$U"k#L_`5n)\RaF4m`*>VJi^J+7q,`5gQpcG%r?V
+ZTq-fVG=KVgUn?;XX`E:(MGWL0X]8PG&*<hM$n[/?]L'8,3f?6DLG_gg/K_P"E`PhD]k&,)9o5Sl9nJG
+U''`?fL.$mK-#o%5`]ORS1dDHo]"7I0nR0t(a<]1;4Pl54\Ia_&QHD">E^;1R_)c<+59=2GiWA#0$"n0
+Eq#-fhSGCm\*?/X7gFn1`W`e`r"9^aE`B_<J(6WX7_aF@O+:ULWP=!@[bA&e,P<]YLJtCTjAnu@p#q%B
+UA0DKk?eEB:(&Fg_%'"L$]U'enSAuN%Up9ZPNFi/g':X&m0e-g<%ChQdR8q-`OGFSDh8e)VfV3Wo&NVZ
+6:YYPKOY4b(8;f`hu&cfH,)?uAAJI9Ipq7UFST/#9:"<[SUQ]A)ahGKGW)&$8^h2ZhtTCFC6ZE4Y;OqR
+S?>Mc#c$1c`[9M`?@UV2Qe1N@ahh2m3ZDQ^:iA^3!*\@7/8u?<(JBBfi=7iGp@sr`:grCN)EeKsS,m=E
+FO+>0L8<<_RVPCa\VJQ;V0Os<)!d/>g^?'cdp9@B2;_X(HM4#\(rS*]+&oFKjmZd0QOJtJ,>1*n0SmZ\
+]t,8EVl8H)3\?Ul;51+V[=_5m;eNH73omj6UIs^.WYHi%hqb2'=p-I9af'mB$Nh-V[)RciRAJ)1"3)_^
+rp"F'^+H?:8HEjH;Y85SPR0C"k6S;M8\ALa/=p@X[\k_DOG(Ei3h@_\f^e$IAa$=L",WF&?d5pR)-K(K
+bL.>Y&_9%"Y54=(.lAF(#'/R`LZTOI.N92s2md%J0Sk%9oMhkrV<^YDLskC*IfnY6N[@CZ;Qcj)3`$Hk
+TL7pIX9_[b&o[aTqP"L)o`i-?"i.Np=W1gF>1&8u0pE*soF>`N7IMa<!KN&oH<aln=isZ([Sht)HB5JL
+#U5g)QQf")+CGj/]npHg'UB62O0,r!hVg)AX_L!mc$;N9]p`!'3?FqUG1*,YnQI[)GpSk/-_3Pt+Bp9Z
+55AD&+$./P(K2*_Ob&!"F,aQD;m7(M?^B\h?FPJ=R!na9QKD+Pk"?NWUp]]kIt-B-&)6%VBE.tc^FF[^
+Sppn@hZjsb'kjk1<tc*I%>D*:%ri$p$IB>fjHIhj+DXu=Zm=7Ab2^Ae&;ok>Ei[GBd>>Fk*`'b4p1diJ
+is0mXX'PpM?m,@1m_h'\oS`L1hVX5K#G2g?g1#d&B]kO*`eJboh'K5]97"ftiYgS"VF;O.YDM)CJ"VVm
+8X^Dt>-K-@3=af)4_hD6Gp3ujCLXNFOu=ZQXY1V8Xd7`CJGM@<Iadh,f#1mXR8LOMF0Q)RNJaNKIF4-s
+]`/6I5p(&*p;&su':U^<eDWA?-e8R#BKWX4JOT/-F/pTYJ5(e,ATnm.O0uZB(F?&qVt>>#:/!m%=i?0A
+RR`UAZ3;@>jh]m]QB9ZoorOebCQ7*\?<B)Vjr+OGX0u>%D1?&e8cLj/Iq$X:p:^dl+:tX.D,"$7OSG(^
+m4.WHHQSn-KWp'/V69%[G5/PST73UnaR<L29'LqVKH83XFc0mN9HWPs.jt%A5dBTnUjEY^]`/`A21BEo
+J&b-qq#24rrkH20K/6K<FT,6u7cL6]%H&Fh@+`mM*69XiW.jUD?3)[f=&gi]^V(R`CPN.1WUO2*BskX,
+0W,0+B%mjR(>CMVI4,Xte8G/Vn.WMi_FO)g+bZLOobL[eN6qX&r4<et=/tt=(B^PW/_f8_N!=7foGOF?
+Z0SkYY's2LfEcgR@@+pX#'e4L^K!=k(GOl=eT=BA&AljI^C_5fkS*&a@L'TmrWbRpSj]O6K<DR<1tM1H
+XnX8[(/h+RMZu-l*,(06KdK65C:U_?\.td$\10t#?h`&!W2ZW-5s+aQUSPY*JpVa##B'Dj=q1?&oe$\8
+OJ?OJQY7]/+q'SS&iM$&bnl7`',T3K[D,2HnUk^&mWHV._He-:V9bY+qbih-^IM3:UB,ba.tI*sdm[[d
+&$!me,b"/Rb=tl^Kl-R8kXA+6CZCT5YA,A2@(U]$UkP+MDS#jl,11bO8m?$uEI3U,P\E*El7?siOUX=h
+_+24)b>gMn;`@#%E'obN@!R6YY_TN[?$FBZZII(B0[$aId4Y^j*40=*>@J*uI`*nM[pH'nr"O@&]9i77
+lqpqcdGM=?JGVO,7I*X^X<g#Ym-fS)4@PWu)BQ[\=_d$s*aD\5PiR-!X/MA,\Du>E-^E1+;t,FR*u(>.
+Pm#t.)b"&+1U'%m,Ad-jnpHGQ_P0/m\#bP5i,,1>#Qdqp`%OJ57(k6'(<`JNCXFA"-W<-=='CemmHg9k
+=XM)NWOM?sfWCGg]r`=n-&708UXA:l*i\EfFAT$8P'W?,I+).2hq7,RIQhc<kCH"<+XF-ABdm=.W(T4C
+fZsZWBr_<+fr]C3Q!16>[,kCN]X"3**d!CJT<GZGS"Xf7#IX%<br:NJ%BL+!rA+*<;/bmcUX`T]e!:\L
+bET1k\R<,%<fAm/o0J/ecNf_E59CSurHusNp[a5O5L6NcBA/EJM$>-X.51'iBtRY/f(nmT"82?HbW7!W
+U6I%Waj]3gc*=^A3M9"Y(NVg5.-]R+D$opa04R5mHLJ24B<1^,hr0!('7Ys\30U+_na2LkJGXW?Tq;3F
+WROgMLk;n(s5\*=r*AADMuA%:X)q/(QNQE"^>@\[1g-jQbgRNi>;f%=k><;46s8;hdQ2?u^HZ\'Z[^m-
+]q95PIAY`E)oqrklEL'tLE6+c%gUSSFG$mnQ7X!Oq:[Iub].?m?/"\(lW`n)NVK:am:i:O]g<!/IScXi
+$`[4K:"`V8()P*dHI.'8iY-Z'hem^!\=[D.iU9UD4]]XaG"UDFM`mX\T@s8:G\O6lIh,/Y44hEa;Hd!'
+.E!A&o9eRbO6D^'m,nJkI_I;q+f#uPBIWB43?-fOGuF[DM5S,MD<\Fm4X`t(cEssNDk+&<T5V3GZM*nL
+&F\dHpkNXZEK?=\H/d$EH+%gA57ch'f6"4)p[dV?n_8'epIjd9j6K2_i;.QeINF^jlg3e+RHj`5;!`u\
+fC(:_IX/<hrbIK%aVsX2NP0(2GTjf+pT+;m';,7$_:[)C+WlpAo5/gJ,?qBHHZY0<j/`L_q)2/Q:j]5b
+B0U<NC#JGe\>4445J$W\lY?1t8,N,5?g#!c@IZX(+/JkJn8%sHrqB3Yo]n\lpr)%8J'>r_Ao,GYO'h[7
+Yn]2"2DR>*Ic+SQ)3%r$)?6&YK.j`!H_&nIM<":<E4^LE"t8oE+C&gRF>.XZ!4V7J1I,$uF>&8%/T8r8
+fB\Yn1p8kbcPnu-FaS-K^**JUWc-3/ar#lO37/[bpP64jJ9X^:DU/<DbI;,7Gako&gcfZFh'Mp0mrNi1
+A&!EO!Ha11c>sZ<h.E3<j/1u#gG=X\\V>%K,atT'iiRN.p$EWiq`_K%d"f-5MpTWZ2m0T`2b;T64i>[\
+8ulj_.A1?Rh(";<\M=MWT5MsT[Gfjr5]Hm<qqJ0BgGAc=q=Y54\p^c9m?D[=-L&k21YG-LNfLWc)7O7/
+f0#m(*3h>h]STn;LTC4D%+*;d#;6ea-8);IDT"7&Vs/)Jgn#[=GMeu8IokO!@=S0b4d2XtgG?Whna2a?
+$ZF>kSXW`U.Ha&AX!;Khnb107.DEh^ejf23f_FRpkOo>9`q&Mb>]\Ho+,Mi*lW)[0DVrgP^X);8PR:E+
+/oKuV`QGjTM]u*&f?N-d)7)-jDDb6"$)<lYXo!"&>)GubN#)`imC3$`&[SfkpG-3$pe/VbZX2IFSW8)T
+4'srf*a@Z/3_-rTo0Og5%pnRd(9KCkElRJs7uPVA*oWt<-uN-QQ5]E0eJ5SBWp>i/CAZL"n`&6em?jhp
+,jbhb5:@TCiqRZ@gYb>:^N(gTbkKs/H#ZIuh22oX1[E#&:laJZN#DRarfWEflV/iEb9P#R7#rUagu"?%
+>I#A^f@&J7rUN89HIY*SDK`!Zj9sVn,GT^^]'@Sgpm2nulST^<Wi4u""U3fUr>@=Xl]ka&na39MD%4Oa
+Nm'AuLnW$MUI^<2fk,+jJ=P9r\l+G9G,4P)3kVa8Rl)IbRcAJK-9d,%A$b1_qL#(".'FMY]7/fo))%TS
+:<0>&X0EkC8'=anf6aqgROfJI>peeIn`!+d7;83B9Do=r7_F!*j]J;!L-gMTCYFZ:>11^IIWIMZ%--]?
+o?r^V1UfilA.>ZRm>.kpZcb&RkX06pPW=UY)S/YRgHeF"^f4k?9--S;h_:+9EO8ol=hhj7@@H3#G-5qH
+XhORR3M/]<gmmgu2UhOuD)!i=$tH'hr2iMJ\B0(Xd\9A.>`Q/s*:`$Ej+ofVMQDm?oYS(ROGF]CH%0Bn
+.4]*Q3:#HD36U2<NIQBLQZ7Me3<K@H1PnUi<a_*6(CiM:E@P2"N#7j4>B2dQic<lZ7Ts'FC?#(A7t'sM
+Y.?\6V,b&IQ6Io\W+$-LCEjbke\6I`qGQ+cF^#J.;W6&]TkB*e$T"sE2P1en\mgB[kYl#H@&-5>h:"jn
+qgPXR`5ip$rqnQfXpJ+SYpnCb2qpkN7.Vtq8+am$L\5-3(hp7@kb>S!)5eW&Ir]EXXZPe'cC3CJa2i%*
+f?CML34?ne1+T?P-!tH9:hpSbRlQ/DT0E'@OVY4Bl&N-,//_0E(:Q.`,:tYY8OQ`]=^8OsZ\pUDgbFE)
+9d>P!UD(FYZ$R*p,2\8%/O13@JJbT!]d$th?">PN*ppT>=sHtOk)s@(Yue%;aFD7>4:h8d2kI;'4W)T>
+H\u-.YtWWY+5)7'0-TebFD@B)Ot0dOe`c2\a-('^Z)*#d:HZ$k[BnT)R0P?5Vf_Iu&=(6clUXFEYg;Ej
+Xt.3qre^/h=o.#8kni6,j%Gu2ch[>Hp!!>Rn&HN_S$"#up[F04&,[r_F$ea`#*8-*+2"*")2iacnB<-f
+cOB:pN8(8Dl7t.Y1O&#m-P/Es^q?\L4,:NE>ML^p(GF95h`:&qA%T*f0>s;/;:E#HbQ&Heo>k(-WtRW?
+1f8L0?MO=JIjt"@>G,3PX6H#Q`\8`&1I,.\[F*XU^Ku`[R/pW6h3rE5R6(Kf[j6=NolbXnJG@mgbQ+i9
+pf8h)Y,g64VWj7gX59g$!4[=+H1VS'GL1\+_LPC-QV)o;l^,?ALG&Ig[]STl\ujVPMsHtKbLkGIl[AWV
+(`Ns,!V+\,T&H)/*1e$sXZh>J)q2=eUA6dT&U">)E>.7$d%A#go`)XaK)X@N/`MS_Yng\L0BU0Olg>m,
+B6GHlYe<o`S%,CD;O!ajTWX]WB86=9gr1F@M%lER];gfnNM@'rcnbc/]6IeB0&ibYM:sd>M>frRl<CD9
+H=gK>SsdO%2OL6M."98@%H3]ur@9VjB!s9@<VO6U'#"$f9'Pjh)HulfW7Tt\9D)c=or;"]cci;7iLS<O
+7H;b_M*q0q?.8Kd%dfP=J)eoD0+@".,-eRU5[/W2bQ*&NklV3oN2>U]::->7cdRs%mYQ?NeDJ%1e^*OA
+SRnsuMl:;p%'ATF/WNn!Djn-a$'C%t4`QLSJH<OGUgGnoI,`N8TC]m($\Kg\PeS.no\`@u!/cdd^1Uh%
+d&M!^l.r;k]>Du;3a`WWbm<4H3fVQ3M8`Mhm'b%pFhlp4,l)noZq7F\L;"7jJGQ_IpIoDFUi1(,q"nuW
+UIjD]'?Gcs`N#s)F`=s52df<FIF5(e>Xb=1I''YNh^d'<9XJ<KOo#=n_S$!UEt&a6U)IlTna2`/c03`K
+`ND":lnWMSVtV-SV+0FH'8SG#e[)DU`3/\Q&nuED3^`4=GOrihFaT[,bg^8R?![\Y-gGX;+Kqkha,$N@
+dOXgX(2KJ5s%49C:4=d#JuKY][,eZWm0).j:/OUsjS0Qj2N=.Eo2CPkg['>\]+WZXk5K&BR^)/]/jZCn
+F%#n6W(4>!#t\`=mQ10e6$*jl)ll@WTo0O=%0lbdaYd!I2*#J&8PG@$oA?XF@9?MeBdbtCJS>VQY4Ij,
+.)h>?<#-!gS\uG_'TK"k/''T6Oqks='DMq3Y);5Z&faiV@68IJ+-`THmEZtO<'>#a17)1X=@uafgmOqL
+8,M^=f1:"37\4$hgPe]NTe4g(Q0a<N=h413So-.SYS5#?..Re]E).cP/eOO\4XnS%%<'B@#Ni.9UUGa#
+^UJnRS'r^l0Gdcmb1Y<lY8?$6V:@"Q%'+#HDfkg0\P.cc?ZZqBL,pE%L(deJ\qY.9%LtS)98lrSh:6O;
+bfDTa;/1N"+ZAZ=fVJ/HECK-B:2(Ge7%U;#R1OXuJ\*U=2=)>d%0suf0HU'^d6uD1LfQ,;6@0NmD[bq%
+@cNInQH(iYTJZ,C->q+5Q+1N0L*etP9@_fBM,#]UXZWgo7EVo^f%>p\@p*!B>&SDaot/7cp1?Q9XA;]&
+K`p'pV^9$p]<(p6<DLe/<&(3BJpcC&\jIFZ-jUchM'oI59k19.ddC[*`5Y7ENR]u;gb$ncS/N)io<E<Y
+2:FlI@5V6n=>t3(W>)[q,;kI2Q7d-;@<RsN,Vb=#f4tL]6Ct%F4bAsI;R0p)`/u:S=W1NFQ8Im#gPdql
+es)I"N>[KH_FtTc$q4?17JW4cW`[QMZr\lk27+G8b)GDTbc4Z=Bm2!Ac>'Z3)>^$(8mSRUb-,oBAh42[
+Y_nB\4L)W7EK2\kN%[.R`g:jcN3Cq__=:Ok0TMge$I\^0k6%QcGDborP-m;6L7mZ'0!1c`?_ACrjZS#_
+b*0.!"5@khpYXVhm"94.VlJ=b*l)0J(\Ln9X&tcu3fsA_*"K(`^WF6Q#VJ_fgE[d=D<kB:BAL+5DU.Hg
+VmQ8%DpAn.mE.Y)D#]_PCtV%\Qe%i-;[DUsfqk3/;n=2o@SM?!/"b;G0:@X.K&`)m&HLXu]DMa(:[Kc;
+V*4VA[]B*caSr/k]CKtG00npn/n&Dme.,,Uri&%+#?8M\p-6Y`V43Od5:'+5rDU:?C]DmjqQ2WfXpN`F
+[DPW[s-/ZE;[76k)cd/!6Y57Hbqq'='QYd$4h=gBU5lD5j/pFIG:LhXVA5O]Ec!]2Z67kFZdumEMY-];
+[j?5*^PKMu8/EfF5'i:Kg$fJ^LOH.-\U,b%C8\7#f%1u"Xfunns2!)V8HAXc^mEd&Dp?9:4`#$Nod2;k
+.D/8,58Dgtr):2FAH1/>]mr/$ri/ZcmiL?EaZfqILXe=TQQ7tj-Q8=s8Mn,7X1f#blhWl0N5i+\>07q8
+]-Jc4o8H[@MP7\#lf^b+qg7djdCi/[2%ASV.udp4V^rQnE:!)&aZoGA?^U*T\l7&KboR%1#6qb,_G$[X
+jQKB+rir.3N7SY\\P@6m-K9aO[YljbL[pdj*,5hd,u63Foi8^&/LpEgoD4UJp%pMr/P@QcF'$.a2L@ok
+qTG6U[Yk'-q^@TEgaN&h\6M8hQScahhM</o<eF#lUS-P7^)n&Ma<CKX:2Rk66@T8plt++/]7r0_npk'[
+@?[rSM/ia:q_Geiia7jOZJMBd[lhMX*q#/rK"JeC)1I:u)5Z9mMI..r3258&]A7/nP2-[4$C(Ju*2C'W
+:Yt-]Rrh39dhJ-p4hN27O[H6MqZujIQ*K5C.b.M<>90P40'Z`B;Jc*l?)gfh*CDa^#K7%j>iQ=WldVht
+bH$DgYdOK'0%IACERh*?f9U!@GH%b,h)OtW*u'qHXEUZA9>+![HMoI]>LeUMO0i*G?dG$.PGLVs%I[2_
+%Xsbe<78BXVP)eB14B*RQ*K5C.[a<Rmo#F><ifuE?`,^H7C-lB%o\Nu1cm]pA)4+aJ]]sB\[;B/cC@(D
+_RibXRZ^EjQc^`@*E_c.>uIOumo$]&^Ir]dmqnrar9Vs)mp,*Cn+JAnEs>06e%m]bQqGNLD@5Z7WXo(E
+a+o>*aIuYG\0)u:&j+QQg"p3gZXgc5cq[i#:CEG%Z<m)'37DD0=pN@LpBT"7khe>EaIuYPQPr'C`8S%>
+[>J$m\EVKTq=#I_F:JApem$QSI(6sDI'4(RWZ7)9oadMa`@&(Zj>KWBG)Z(P!c=4ejaoO0#N8s@3p`]V
+nB8%3r:ZCqpi-%OXHCKZH;1?g'kg+0icG@XZZ`5I#M7S)OaBgP>:0_S>4%frR]'6!)EuqW_m_uT/l:b%
+p8D(8lI>lE3ir,"Anf82X(C?fc;!Yln/;>+T3bao\%O=5N99Q+FJLgr6p9n9Ug`V^qN'\KqJ\[pLMNX(
+*[c?F`,St0W?pe,]]`@Bm^o>FY5NgQU3QO$3.dKOa8"4HV0CVt7@`#3Gsn&D])km;<pthef5$WsmiLl.
+s'-fCV>Xno/LL1k]rTld`c60fhgaZG>C>CB:CL4oC_8'H/_PaMjcr\B](0[Bh8SX>ol?Jt&SI#Y/IhW+
+iqEa\X4o"_>ZY,l)eY('[u4`4"*EYXiX9$nI!`QIY?SELj-5GkrATbC`6\8Sc\rk?o?fRJr`+mLQ-4B"
+k45Y91O&:HcL:f"Wtt>.+:qB4pr<"j9mSODa$-EppYXWdp]l#VVU1Ud.1XX*Qd>1L?SX,n![e2Ug$E9i
+h3ZO8dgr)2)lHI`^42bU1h1EQ-IEP4O9,H*NZTo3lt**VXV&L`%<mh.hqfI8kAfnX39_7:Iq,,2J'<\n
+AN$`nkSJ`l)u-SPq!Cf2s+"mV,Ps-\hfX_n0#-]`\:b[@hga[nC;T"i;29oi65mb*WqSDpGh=7C=*iN`
+I:E69AV@'[B"^a>DPNhOAY>[Dc($"IajtB!\h\5*I[%]b*=?'V69tJ"(=:,DG2pdXIdp=fDqH+EA%>Pm
+=\AEXmga2*dc-9NhkCS83YFDDR;KNh#?hEH&)Fh\7Ls;<KVo&Yn#h<_8(WPh3+Ioq"!'?alFL$g)bpoj
+i:*r]oclTcbY36#Vs&GfDoFc\1P.[Fj(f-iNg#g@cM2LLk)>?5l8cR_lQX=b.*!,`a&=eei!7ObF+6eB
+j7KS5mUt'q`?h[^LRgGmaM688&jLTR:f5Boh_$@B*d2jZZZK_2#16<j_o"Z`j^a.%II^"V%M/G`]ue1+
+7<ce,(crLDlWWTn0-rP^nl]<l1YCb9DaMY(mZ<L&#(2MdW6'BhW_n!oms""s]"_HurKD+r*keQ1dVl`d
+\a\i=bu!(WlS`p&aH"FKM@G^30)FV1j9S0I?n^brWY:$CQ14'Fh'bCcjco=pX6b)]JT&qVCjng**37_R
+X_Z6e#AQ_g%5HF"3.<=5L.%9pRrdnZLu=sdM-0Yr4C',`0+[@7VfZY8'H=>VRae.,G_l@Wi"3k^I.33C
+CkgA;<hJ'`#c;:j,^jWb[.@0e]O@KmMCe@r3$usbehW+=RWV6qf#h$08A&)64suspdampb9-t(\2R4V"
+Wm=%-s1,>C\g8.M.<#U8Fk]8Tbq1%'f!jAJ?*Shq&]Y\:MH=:dk/K[Wh6-X>hR4!,d%tXu&P"KnOd)&*
+\;SB!,R0-^\A\1Q7er-lM=VaIq#24fP\ZE&=&Q1i,%=-SV?DAtjZ'-\;@XqSc!6UBWJ=O?UNG+?]%0qN
+`,Q:HlI,Hi1K$(84>C<7p?%tBq[_M<r,Gs@hsWqTa&l*orpfHTDt/VL>N"l&XerBWh`/CNU\bVA'I)_t
+A&S=?bVub^&MXJa!CL9-5o2j<.n5St@)rAi=?:&68$WUoFrDsGp(\Fb22]$+--o(LoW/kL2)XZ1Wp$?.
+MLpL]%)o(L2tU0BO_Ct'?+Q7Eqt\3/N*^)/g:N;g]]-2U$;5@b$l2o;FS]cX/k,ZrQgi4hH9hd+_sn24
+7n]*hmZAsnVQXJ/oG@9=8&YBmLC1Aa)ec\'Ob<G:@T2HD-&J.YFH9d6s#ArH''0B#_Z`2Ppm4hCVqsd0
+[>GYjqhKNO*Pof/#\eIla,!X,@,t[0T6]^5Wg7I$YC/j#!Zd.+a(XJ!1"*!Zkn'tc9'VNfpnmN+Lp3AC
+l.ckZa&g<Q?^99Mni]0VJm?*Y9h4s:D5V$_31d<f7`$<Sc<TZmm[WT^rai(9'7q>^]S3mi*O/VtcAW;`
+^=;l.N_gRcjr$_F_l6apjt([6+U`.dnL^hfkh(^dX5rOOgk%G<F>)&!9b,&,S\7)pY2_8A?96M>iii]f
+;7P<p)7DQ7pXTp*dlif07Pj:<]HccaBgjtgEc\Y7h<g[SJ!CeC82Y\=HhaC0lkcBQ/AJ+7U-<chcgMlq
+9'bo=A@RPSXr^GrPTm_Gna.XuUj&t`Uf(SSl]?ac>ou`+b1V<Em<OC*_4fIQqBO3MrXV2!5SWk*:2-%a
+H48fC.Q,aKqJ7QGGD$lNos!7*jEceYNDNSHidGCN?U6l+Ac=%EEBqEp1,1^^a`3o$3D/id&(F*7bNFHb
+cj55bH[\O-oa%RdjsAE^'%[E?P=/[ggF./>8"sa`bm=3Y.1?'s8P-.)Y75FVcEh!)[?M*2Z(I21UO/9k
+/Pm9PU'oO-Jfm\TG@A15Alo=B)=in1q4bsN>DY`imaCE^`d?8*Rc48=mhjs^qYIlf4hU/^E$Rq:*>huf
+dU&mb+N*uWimN1(:TZs9W"")8mNNOG(e@5%8h!2)*Z5_0]j5AEfnV[&(F@CMOe.IC5KjG8[m:sGR,!cO
+UjZXhV's'!82F`d(\LNqGP.ZcZ3Sl/YF\DI7t4It`+WDUO^e">8I+<XE.$i7S\`o*7DT`;'n%H2aj6dW
++qAolA&aG&['^u)V,li-jLS/L+a^X[7f,q0[ALT;Q=4QBY8a=d51$J&4sn>Dm+oM\11]99H$+"=f6\c(
+oG2>-aRMnC3QHK<ieQrH;sZNEUredqO&Z7-^Xl:-_/^uco=9VJK'H`,rHR")D9Cm@[;)l7j-.6c&#S(p
+#'cuq<gJHT^CkIgRJ?b#qg6!f>*G<Q4thMF[s,Ku/6`o#K^uEk\)_J[](&*ufXcokeq(`iNF.FB]=T,;
+Z`Uib-cWU_*\VDSJ!7A9[&1LsF5S9(Z?6nIG\gYGBPd#&83\F/-d_+]0l>bAA_=RkDq_eMC=p,F,?+)+
+hk)QZVl_INQFTHQB@r(L:QoWX7-n1/(1:&jb-2A849B"qQMtGtSPejLU08"a20ou&/c(s;&[-bm;l\H/
+rCa!G3VBhB(i#>hcYVnO3YWA?>;q!K[VjTa[ViHe.]Gq8i1%H<#.#m44^i.i!A#^]M")tLH34!A[>phd
+<7eFI?j,6Vm*`N8Z?>E"kbn((bGE]%oYf7S-fG$Wc$H,'UPR>3#H`s@@koFs$3*nL_Y%).\5hc"pIOo9
+rd)"8)OG37dM&L1on9:i4^e]#kca2c4^i.i!Sf?o$.gFc_04tg'C8/oSmW'^o3V9:Jhu-rktRoEQ@GBM
+K(3XBkR%$^f!_/XXQ3qU@<C]b/3VD?q+BlXf5!NXc^",*H^)0V5Fsm!UM6W*.2es09Q05';b;;P'U53a
+jDT%N,a@s)@\hqgYhV2*["];I[]*tKi@7ml/oQ-bT@kYD<W:Q*XdI[jZi8e($_MJ4mi*@^o^BJ-s(abl
+J(U7a#<c+;0N5$8N3r"X,p2n`@XI[g^VTpKO(N._]Hu0ao-S@hh%1D/!EMfs)B#F+E8JOXRkDKr&<0,T
+CR?ahR>1hoDk__!b)?",J<Vu)XZd,*.+d3c`bqG/Qt(VQH*,XYV9B[A^Ut.gc$IoI"_[(_0+TLuHINJJ
+r['8LO8PjF-G!OH9m!F%V<CcQn4d9ODi2:hDrTnRe%jr1Dn7EYFqHPgS1d^:DnoQ^(3a=SeoafL+L&-c
+qNo?4k^&GMdAlbO\OVd=/,Ga'\/6H[V2S<t?X=.hc[$C;PME1$hml6Hm]Wlbj'TesUY_e6Zl2o$*bDLV
+6XSt2f>BNER^pY%j%^1n1Xh9l]l_9IjddU0*7p#=:6Ze@AP[F'(Z4'V)'QsTK,-,[A1@,MYbjD&<'AAn
+XE-)RGf=O"FROigYKd=6Og0KQ7i\WZfQ&qj1"m5)0-/:1i9E;q*(7q=N/+=L6$anN2C`[tMgOe62gA?m
+ka5#V'87)GXeo=!\5FG.B;2n7oYPjTjPm=t4<o/jXnI.aYDL#O%^bAVpQjl0E[IECH'RBnC?V$Q8(9qp
+k=[pDF>1ngTkqYoLqB1:f\"l5n[6LWTY[ZjD(O;G1n)L^(\EbN?I?Z%*n\A$oP`cSnc_2U;D7I'CaJ9h
+$&ZZA(Ln!/_tHQG-gKWaRQ,?E.H2<Tl('6l[r<.=N'c%4_-:K5aXp!BCrDh%mS+!3OtI=Z0\(Yc,KAE>
+oKuW_!<PGToD=]%P`=<Tf#CN:i?"PQ^!9*KHZ2\NTQAA3AD!?/bgFJtMQ]q'#1"*rmOM-n%>X4;)Gb=O
+IQ>?_8%qOR-p2hH6*\2^Gcr38gC@Z:s+'-(^A%*hf%mJ$(+7OXZV0k`lV4`<H%G%!L$s^.q7X?_\V.>;
+7H*q"er+FrZLHH"?cBCdot">/DO'[5l.`>Lm4QLoV/\-(O\1%='IV=c[mq:@nf,UUFFO7Lj$Xf18EV2m
+G6t7b'5@/$k/2,S;;P:$Whb)7g=-q@p:GFl2d4$@4hf`83Q<jQ2$Z86@%/)7Hi>jsYl\gX,rT<,gj2Vp
+99(E/I-He&c#8Fn-9j&bGel$aY8<(_U&kk?BuY9Top/_048kIIQc;p$bX2>-B_1TZ3j2Pkl]b/l-@Vpe
+0t+`F6NU9$I5WBOpb$'Llu->Yp%0nOH"FZtH"F$BV.gto"lJtNq5/C=?FA"<fj1n?C;,k-obDCYD/%:"
+05Q>YDK:%.aq4at=pa`BWE6d-hP=Vf])<i*d;R^qHloY0rC(E:8&[-Npc.U$3sjU*N?)L%-rBUrE/Z,m
+)'a!a*C5Ho25h3P$4=N3X1-$)/;aHonb9k+e[8Q^Iq"-E^@9Wf=1SMhpnTUj(@UNGa/\'^U"%6X[\e`u
+X%iG=Kp8X_)P3e]<\%P?lEWAnV@@cb(P,Rm]63'25e#Vsg[..qa_N6<@7rb5s,HjPh_2`c"q4_Co$/l7
+'"YsNDB>"OKB$m5J`;r@Ir\G`+!aL)QH5Neg0N+;*r-;=kZ[WL?e6:)q;ZOFop-B"QF@H'ie^B\>@Bh4
+iJ<*2n%Wj1M8(`T3KUb@moWkq/#'t5LNoJjF:08&nQft=l'3:`,GN*iHY32(i_,e5b\X&ZMY5iY&3oEE
+S[u3nTaf)pa@*jEhWXOrDkV/.rjp%-h`*VG^Al1b(&g38e3!F'imGO:)VOd<6eu7/Oku]mqXOHD)DAjt
+(,]?G5:phBL$/3fpc@l3l11M@.=WH+53P_?hf2%1-YBjg;!="8(T>"De!j^`HYU:LFD:/\]ngc%VF4B=
+?_j])HLKAJHIXP<%AT);S+a15C%,H>="aeI<-$uonam=h'B^@;:M\))f$V14Xf>Q/ngV@8\g\b^F``Cf
+P'(kbq]D9`j(dhJ&?Urrc*u2u$]t"n<EVFC9G>+Te\a`05B6tg't3l7lFjGSbt\B%ml*^6n.o2k%i<j+
+U^(^k[Um.5H"^.3,V.e=G?S!2q<HJ_P68elT"c8.c<5'%01;jH&g;RcB_j$W0)l^\#Q?#:e$@i0LtQTe
+0m1'S[/BdP4^N0NUP[E1Ru>$d07B3@Kk7;N_<B:9^8-"gjP091[`7*U!^XFl\cA`ck5rVk@Fe`N:LNuW
+StQ2pNM(G>NHW!-q&UE9`a2WqB2B1("srFV:%^*0>\Q<+BM-:@Di+:#TACCEf9a6Yl@7#o;?)E^!11nA
+E)ngu;b6fgqaX15JGF2a<Z:8RaG54IEsAEtTV5)$4[*AoWu=5&oto-nD-9(,9s$d[=qqjl$[^jo;1eX&
+[=Y65g6=J$Fh<?G^)]oOcA\3FMX7(;4uI\!n;pQnj4fK%PT1d48[7iQ]G$n0`guU8<E>lA'N-4QRkeSZ
+*jIOk)R&E0*A"fr,tU!n0OCafqGR=*k\Z`%IfIE(i]f52ps5QXr4/2'^3Opn':>LanFAsnE1XSXpYYb\
+->"*oVT1cYin;SH36,Y`m$Vi-a@`sLE>1t'Iq9V=_iDE@*(;'lX9_<9`SrVOj![`BH,WWG.CTs\_6.=E
+K_g&@INMKtT<mEf(Y9Ws6$)0PE>1*TFN.RR)<%!^i]%:?4?H8r3"#[`E>5S-E>3:jE>7i'j!`dV<?-_l
+i])hYq_de(9uW637L8L7elVc7K0>@E"ao+5A/n%2*'rM=UPN8,U;?LL'r+bt6b#XHPYcj*<7>=ZA6]:M
+OuEsf7fiA]4/.(B+u3d*Y?e:E1G!WWL4pWKX^=+M>4lJI7C3tQ'[\/G;7u/:;e6s,Y7i^.m$M4;b%itK
+(b.W,mBAI!-iQ:a_[S%u]46Shd!*Z(#opjtipEC2YOsBY'FTM[@6XM_MA^;N2g*.L2^GiF*&DElR,NZ0
+1Q5ZjrWFsn:a]hHQshE?;B7P%ol=>u)2<0=pPBd-o;M%?0uFiT\K0i>"&%#FjIi@,3bB38eJ2AIQshD-
+YoGQ9jI"nY&Mjj5TOuDe_g]=iQshC'`R#c?(ae0t[tDNHp>J]41Af!ei$l_2Qsigj]jc^8JmkQeL7t>3
+`XFd/S(&*-D![NtI'&bE`!iE<HT>]*ZdDOl0R@_U`sfS8M@)iQf.1I#k#GkQI63a)L1+i)G%-2om/D%L
+0[f%VN#=f-l:m5)@8_2/B"5ZO=AI'opff[+&4$?r^5HKUdGN>HbV2c@I:@qFB&8Oc#$jP:_>%j3^LN",
+,.3@I#)2epbj[oU))bO>E5M_DEm-50f'Ohs(i)JN+lh">;ku'X/(jA,mtfAV.na;UFiOp^l/6u!L+*k+
+@tl-]b&kksVgO'66#qCdB]tiBK,#Vi#7'NY@`=U[rZ2u-'XCf_0Or;1n]5OcG<prm*,FAr@08E45;K;b
+8]J+Gle'"KL?^`(.S#59>QE!Xaptto/]3\D?SQ/U@3&6l>))!ehc28GN%DjVL(&FUR*.7d_e2u0%-pI]
+ReIjaY%Qn1LQ64?5;EWRm<:cMlkt-fh0]H7O/*q0(nU;W(jF+V,d?HaRZq6*,d^mD@7HPk#=F5#@K3\C
+6S&$t12PkLO)5ccnPiO]WFn&p1G$Et\i*olQXY[m_a('3NspC)?1Qi>7iJ76):fC5eW(%o[LC(*MQMUA
+l]Yal+i?8Yj2`q&^K?6$LQYR!s':Zo"8rbui9SQAXQ,GOEF]p]E`U@;4>fqfbHQUun%k)oTP,d?@@1Og
+-6"]Km3k::19BNQmVNhrrpjdYOC;EnQ8/k24S.D3l#L!_JS'6K):jT*6S]&am_psJ+NZ<IafpeBojo"q
+<YTm.)$]rHDAh"_%3_R`n)J!8@!&0X9%Q3X_a#$Wm7E%0.LaKS8;sf)_`m/iA/H@b<oj,tOC:[7O/!t"
+npLHg\A;AYi&5h/n6Ti9W\WQ8a%h]nGtN),"@nT;9fJD]T]b(!b<#-r`"sjk%,(-i)i$/bn=$&ZM]WCj
+)h"M`Oq/9PE.u]'kS;mC(J-S3?>p*;:Equ>7Bsc?.thQ'qns-<_;=L3Z#SqiLIoe-H.)Bb*e&dgmpG^?
+9P5jGG%A1hAbsp/6DcQ*pomGag6/:+B2\`P17]5UdLp,_\C\D_>_+A=[DLg#nh(k'\ueK"5PU\d14<J>
+d?*T^QK\WAVW4#s1I7nu_-,T1P>$bpW_CTXVFU*@l*qG7p6"U`Qa_uKB>1J7FbkrK@p#W"<KqoB3j/"(
+L6Ce"M_enTO_+C*OQjt(<\2^^)7tkQe!W),>,EN_lcqX*XuQ)UHnS!VdD,>,h3R;u;SS8dLECEjQKdn1
+0oSc+CbtQBA\,-X3kj1Y(<CTDoU9>Pg<g?da`PtG>Gf#fP1o-7DS\p<1AcB,A?2<H14<n1Q80J&WP^J3
+\SgFS_^!V@ML#q'VN[b114:Wk4_=JSW!o((roOmVRN&'&]8fRWK`ju8N`ZlW6;:K-?%uoOSeCJCOm-fe
+p"M5B=)2q/)N8ZtA@f$VqEu1KD4+/fC,n$iCL]$@FKW10Z/Q+"]oGe,kXs!B>S,_:Q]:gRqiU--$JR<V
+&gM;<4f&"?09GEhkQEujn^U2*K\1.^0,m!eg#%;>'CWS#9%nd%n;(1MP7,$Pfme[^lFS,;&RJ?$\,Ah_
+U<!Z@d6[=5(s@EI?P`O":p9:_b($cb[`ErO*mO<o\\Ii7XBSRP8oHb8_LI5sHfAW4O-#Nq%uJbb`(O4W
+rZe3)DdrL&r(HjH>d+)rDH6Z\pF%Hb6/S:fMVEW6=%LZ>/[TW_STA$FMd''NS++kZYZHP1p:<C>7QH(9
+o%*T&o&R=;Ugg\\09CN+H0>01)QlEXFXba&jUE7n#gcneUun!8<iZaG/ao2K\\H-&NIMfjNI$cud:uK,
+H5%(kTJ%^R#Bs89)A'5u0[qLLB$o%ZJVnPQ\mpSfh9UQoXd*o2oLFKXNE&,_Ml.V'GHC<1kt!tNQ?Q:&
+,q_FMId6#VgsrOdigtO3kg;]E<Q9Z;ftX%\*DnK\Z;9"4[<Ac3EfV!XkPbg.Cq":b!dga>V<Qoa9dR2^
+$E?UgoHhJWG+C.ZMX`LAO*JNQ6&'/=X+0-\]?i`H4NCu*ZmT8g+WO[/.T\&/WV<Y\&Qk%^OXQL()lSop
+SY:Ir?).nAh8#*=^r0ZojkCj0YdBlgS$Z:V05B6Ks74bX`?ASfQR/c%`D.$]/0f,"G#Y\a.s[pIrXu4D
+cNhVtT@Dk)]A(+<lW1][]Ot]__EKX`R9(fIdal*qk*u+>N6mjbQ?Z;Ar;s]E=lAujC*&V<0NBgq](NRX
+WX5haH`io%ZU`lF62tfX1lZW3F,rrPdpau]ZbZbRFfVQ8W["m<eeqHM)Hst0L8.UdI,N"or(GjnEkT3_
+jApEpaZTu6&H0!fn7[J<;B3L&UdGT.@4EH"P[#-i.M/APmnIT[d+`mNoD:JtHMGh!BCt@_\c1@j*8^k2
+:.CqO#6N(/r?KSr6Lk"5r\)A7>.B@7jVZj#0oc\7V(?8r_M4+ePR)0QZBR^$1=2@CFa%,80Xt/46rl"7
+qtcF8_b(flZH:PRS6@THMsg*'a?U7U(P?+CQH12GbH2$6[YjTOIsVBp?`2c%5bG1D<g%g*)b]V&Dp3G_
+=h8`Q!*`4I+YqClPo-ut'O9pAco3`,-]SW-r)uDTkZWi@OnqUG[`j>)UJK0m\(RZ#QX+L'Ou`(if#WKa
+da%b0b)08F8+SmpGbgoKkY$b+GK`=E.-[:Jn5+gga_1e-)uMC!DH^Sie"#%6.YdrRb^uatp%^4_#/)HH
+7)$ZQHL!oI#^T"tZh!.?^Nn/+2IDPT<87k"^<0c#c$\NN4EAA/q:fns$'*K7Q2Dc]]*45\Gr1/=R:I,1
+4U>#>Wt3csmtuht*W*6hJ,bN,ML@(%H0>@npQm]6IH#(H3-3h50("XVP+*0Id(FJZQEOTpBh"].EFiEd
+fNND@MA.FdX3o7sq=qoHg<*q<0kW.5RW%_6;a7]C[7"i`ZdmW<'M/r!agRG5;jmJ5K50Q3AEe&>AH$U/
+k?l`>9Hn@3EX>0q&ojh==:'rb9;P!s]b)3LXY/"5=rLd'\A&VsQD9;b(hrngqf5K^)cV\qK7_LG2gr4`
+DVj*?4JNZG<jFL!Wp2>Qj:&>a$`uKo_F9*80k]\b!m#JK$mQUUOXOOCV9FTaF;&e^obiuC]!Bn>`qkum
+c/S"m`1/-6R'Z_edas_3]PaR6D<h.7d1.hI1$4EN:k]*N]8\WLV4CKfJR+VAHKgbRB0[)rM1^EB>A4iS
+7EjEmb9Em1<UPm9`>*>a@G\s,P/*?,OsnN(j.0>Yg&K8T);Op8*P*Z>Qo!/E\EaWnnna+:B3;!/*5kMA
+JWf$q2l0?.?V1^9?>BSN.P9R"8^=r_ecHmePf?7p'"e>f,3CGU<0\@K.!R7:aEC&9^>JRkX>@V@j8V>Q
+cMmRDGlPEVq<'<cVE0J2H2=Dnr$/=\iGBRlJ)gJ+:KkCj);0,FapSM?lGH-@?:A@N*W>pq5$gdo)Hc6_
+VS@Y"AmE@F1UlKk'6ofr3_(iM:_=!hjb;d;ab/Z.4=GSNJ`VUH0;!RPL#fk*o>e3S'!4?lEQSZGo7KPF
+:O0D(ht1tQ`ZU:CU9sMcGfgDNA7^gDTCtSq>oEVm0-n-We0CIq"j6fkL)8:QPS_d@g'd.Gjb7f;Jq>*:
+rV<1t]oYdi<\@mZ<1?+Lr+g[+k4VZg:O&;>%MI]hj"!dh(&`<,EWgs2k81lAIpgcq</al>96?6Se0Xs\
+B/7!Wd'NAA\&uHR0(J]&<(8:He]6&%1OBfaq\qLa'>KKg7_MBKBJl_&4UMOFd$K2gSc;E2+V1Hr&)9Xo
+U-B4`=ZMi-/UU`*A:8co.V%+CHC1o8RTk$_EKlP+r9H!2b=Cl)lW#Sj)>.h=dCZetNtR.B-?+2Qj-S_Y
+N-`q\)6JW013sX@aQTh@O<.,\`^o-V6&2O#W"c?<"f"R0oHhJ=6F3Ag384]i0-o$9F!0s=+q=S$j(0kh
+>FOb:]T@A7p\EnX5@\t@V]*Z%53AoQ_SI'qaJZnsDo2s>UMYHJ0-mWG*j!-b3B'I4m"I8k04]GN?HA%2
+mr`nff;#HLH6E[B4'-YM+hRPCH6EZWFI0\&n<hOmV0J\#ePD_>$o,X7B-"<tV83ORR`c(QA1sa`]o[K_
+@'CVW8CS'a.PE&C9ir_q,e-0%K3h)be:ogdqS*Z*VL,^%I5j#tOt^$uS1$$9"GR',cnMW9InY,2NQa].
+nj<2>nj9qEoKl$JiJ!43KblN@RpO/Q9qGDpW@E-99a?"g9dP'.9gO%J9j`5jNU:jF^OP;(KnS?hgd`\3
+*%)tT0:!+#YLf--JA:aAQ7U[d*[q4VrR`ck"A4\*?&ZOgk@>iKCn?Sj2.b2MSb$A;:nEUWT9BlbnskY0
+lK?7p>Kr@o9=u/j,OFmbA>C7ajcQ-uOnt5`VU@IB!<pfkaJ!OBN:^D99JXnWO^%/c-R5\Z,EpbXZV5tK
+@$d*=0ZUA`9R7J,N`LQ`;HM#:7km39b^,h=P[767iMl'ZR07I*1P59`)(G;Q-H4S^1/dP*1's(lf1RIL
+J_E1s'"6OXV%0q[lc:?K`>QZT)6)(?$%A[MN_H1NBNQULk3$9Ngd`\/^J78`C6hGi))bloN/W3-R=t/5
+=X7uBZM'he#@%!#-'Jn(?Et7g.CWk$*i&2ia<W$.*OfSmc9BCT9JUpdN0Ib=jBq&k#jY3Q'WmsjOfP;-
+M>k4a7Q?iX1*UKf:.@_&;hGRU;P&i/K'-[?gd`\/^J7,:n)*mdP@/]:J+9TO\:Um80*6JZiU=Od^HXT%
+^Z$0Es"H&;TB,IUn_(+1$c-A\bPB_QZ27?MDQnW.SMP_6UC70d-"#RJ6cP?6F-8V0jSb8G#A5?Q3O8U&
+Y]V,%b6["bo#`DX6]c?^O^bi3/ZYF+G5/=(jXfs]_On)NftBN\0(B^*9:Rhff(mjFa#QZ[rAVGN?K.i4
++p?!Wfp-,t6Ee@Ti\lgrRhpWV>1l@4X5ma:mM_u;VWA=PO,\I(GaAu%,ELHqUbUr[p;8]=-oF3OQi9-a
+lK?QZ#;[&)Do&<J"R7X7$*6i.Ugh.J^W!bqW8:$CQ4"iuV\Gi$kEii"qPon($*mRF6_?LsP2%aW?LfbG
+ZWs[kRTl&kF-!+)h-XqiO2e"7WIH?XS9dW#BJh1T4o1hT.*`MmW@<h'.ImANX=8_SbBf586;mrNe:m++
+H!0SQhm)R"maRId=$N,dPa\R#JaTo%JZa8TV6MnS^Qt`")V^^Dm?F@pfo'T>aVhUj$\<I_RM+WurKLcj
+=]9>F?Ih1l]GT(]VR\O[OYru?2'maARZ]OPCJ)m!3LZ+90s)mU>.:kHs'O>=E#GQq^f_\HOu.Phn)`P'
+kg5P_H"03?)BFhSQDX:-V(#]R25ONBVK@kM7F^3>@ogYqQ"m+\:85Xg?)!K.Rj][ZC&2"3)I$gBhnS]2
+EX]dVpKIQ9O"(Y,hL,d%I4N#tm-h]o^]0K=<SZr]l0QZB/q56d7;m2kErcEh2nm2aT"k<FGN-_+=#U:E
+8C[ICr*afuDeDI]@m=.]-3g`cN035t!LT#<VSq^#?\.WJg:2?<9o<7'](Md:'GE32')9n[ctWg)R<W0f
+`62Lc:hRI7R7jj9m3U!unaIb")e\q+)O5WE9H0.:Lo`s8,p%dg"W%p:a*`S*[I@H,No9@b%Yl"l@CO#4
+6Ju_"4/+O0m#,Ikb%D`:,K4T@5/i@/r0+e>V:%[lh7qIRkgV,ph6"97lHqnl\1r'(jY(V'k0t>I+5&+W
+5\?(EgG/RER3-K,.eQ@*9@L`MRS%>F'NC,WkY$dt.[06h'Z/AV1[qT#j"s!8s2K>!:1L$'7HX57*30FH
+IFNb^Ojbg8O.]nsO:uo2$m/<r=Ef"(iJR^_*o:+d4';(G#$RiBaTo1sQ6NJ&oWF/6/W<bjS6i8dH3nPS
+O7S6OoRUZV-h_d+ebLq+j.KM's,A8$f>=(T@7=-?Z$NJn5,*(geHO9:+'s<`HM(ON$gl9HC(UIf/,Z7p
+U661Wdu43*;.G8L]?OHGrC>-UF*`8[Dg5c0`Y(b2`!\d[#]UeN1?r:OH=O;p):,PI#3!g?#=](rY=k[E
+?E[@e\AOK1(45Liqj36Q]hZ91eWf<!Z"k^ufV97OiDC2!<'pSI&IV`[`%tr)N-<8`0bP]-)fZKN)O5WE
+r+4;"l:ib5eYF=7oLWCf>c2f,A]..cAt0"]/]KqO`^qk!ng5Q!Z_^)Bpag7%_b):3QEqHci]B"Gr-R'k
+0b4D89p`S:"R-u-WJech>@X0+]nfU((4@\QE>&*?'jkmtXgKZk[^+bGPCS^3lF4+BJ#$FHH<f`8NT=Ru
+VtB4HMg@DS$(9Kk:',P%>$DMa-d<MVOXT37?C4b%@]?g.RV9i["#o6cd-=H\$;Y<6OpBU#=*.UaT`6=7
+XgkL/XJ"`PXY(gS)ndIk!Y7(_afqK6?J[\NS4"QB]J8Flns><!aEf(+,$SWK7.uGF9(k1pR2h2Y4]:!!
+8VaO3P"L[s8.%+I,3^%d&rAuQ-GP&jN0E2cZRM03'nVG)9.D;!.@f:Fj31u!IgJi;22(*b**MUuqeplA
+bOF5$jfC.o?"-=L>m^l7%7_2G`-V(DdQ:krZe3*0ZUI/K8)`!\OHqgumuXmHL4u2!I*1p`?)Np4]gL'H
+ooQNRQ%b`VIY&9U@A1NHDA67?&t?mcXD7b;p)No*D]DpHMScHHB1dhWM4]<A3S]?DeR;be)Tftj("U:A
+^h]N>]g$`tMd;/UH1/g`LH2EcS=274kK#mMfD_tQ\sR1qEFbN9#=]OSmm/8^9Kn:Zb-qtpiYHS`T2A0c
+M>d'?4f[=]D5VK%7`.==A$%>0:"7IQ:Sk!(MSR<$jq">E@Z&1J1k-s/l?9%MH,-A2jhF0mTP-^]M^T<H
+7D7>q8#CQjDX+^i[5u_E..#!t*g\JUK\i-6#9"im'2:uH-f1kIKpCKDMWFJYH$t9Kl(c<_&c*GIEmQ+%
+(St'cVYK@*hNW'QoJQ7bNAAc!gG%%coWZCHg]$mR>CVDeX=``]H6B%+auH`d9_4V-3Ra!AH`13?Qi?N(
+KCl@FFGo"%FC"meBI2jdb@Sju[W=Cu6Hq^L^dU-"DJ@;O4#Kqm]fs;=oj4q[ReXLo9O>/Cl")GZR_P49
+OZYAcRH:SA*lbq<9;6,8Y55S?\$nQJD%B^LZDj:["mP_6VkhqQ8$6TnO,_-omtt->IjEHEY?0u>CbTce
+kn6n@*j25`0oU-ePqgbcVgS=9TBtD1K-$gQpCbfYeO68.Lq`Nmr%%;\?iCKUfsa3/h<K=,MU1Y+>"BY,
+7)q=4q?J"o28B12oY(V&H!pJ\J?DW=W/?%dYOGca41egc!(Ia-c()"'[h'Xi%9_=Aj(#D0BiJ%FEanR@
+8@5+8ZLDnSi:FNNs/I2K5/_dg'Y]LDoR5gSgIJs929T%b;p-6H*I7B<emaYo3(HTQ+mBP=78et+^n`+O
+K:hbS$uDF%AB"oS5+'&%p2P0?8:J)uH@lhr`MV>BluUS@+K$-<re?PIkIur/kN-'F=7Lh2Cb^OmghQPN
+4\?D&J)P2AaC!@KQM$!a/6erH/UKn_,PrG28WG,iA#)`DDE:2!8L:hAU*rpFIaFE!W33"(KJ+fp=Hjip
+[#KRNiJU<%?PF&3K7!<@nXW=G/ZL&"P]TAqW/J4Sak<=;Oq\em>@+qa;I88?0/"MiBDA4t`LO3KUbf?A
+E_UqS]>V2OHB"gVBBekEAO(YCNPcQd^2.dpDsZ.j7jd^@a@dj&:r4sgW->FkT^*m;5TTD_P]lR!I8N6Q
+LPG$H7!8@#EX(cdqOCp<GbMA^;XNqk.t%>%YFGHE%u'$;htTB[Si)Pp"XDWKBpKKs%_-f=;g.A9"O!(Y
+7E^cRSQS'Ml*O]@.KJc28@)WC%6SF#o008;?m;dWj.RNkN1'(_)q$ZLh5WD[UcEIF4bFeMPf?6OpSNR'
+_c.9+R"EaB+7l<HS1rr#9"m!T:>o?]V%,8U]VGZ,I&5?O$\jrt?$?`Vl?(i?bgN@G(r'm:?0toNhr2d[
+UX.>_6p^@YP+hlOjK%USoQ@3tc0g_T[ejj>ma4F:N&5u$FNAc\9$qBM0REAg0.Do#G\B#u)dPDhN[8+M
+.H0a1EI'NhKk&i;#W;09fX%T:Z\J8S)lNEVs,qeh)R>ET_qU@3J)f"uRr;6p;0QV"1l`Nq^fA%#HuJa*
+M9R![?*?<in]!;&bn\q_G<+feauA5ghc7DUQ)123kZn4`X>f$:m[;1@:TM'l7)#./,ec(sNT9p_2tL1U
+q89?*`c:^.S#Ygngqq=`W73&gb"=_5NT6gt1mof6)okP-\8e#uDB/96@]>JIn_,PKOl#)hRD"^S!In1j
+WE9qdrR*eHCHmu^:.ZO6Oom324]]9*:-*qY6X#s<NY<_P"*;lP0Bkhm]tleQ:KOI]Ni>&-BlT<mpIc0-
+1d+Jd;X#Rm44?9/*%.#]a%Qj2`pkF+F.L2p1,K&96T8r%"n$?Z#]67f98K0Qi/f++BB^/D[L\gii@itd
+;j#([<grBLCW3b-p^)B:i`!t/S$,U.$&J!H32ON]UDBRUX,5]%ISXt)KPgm,P0*$9UW_Q'AifkdU6B-,
+&hW@/qYO[D/(a9Mf>5:9PTBpU&*q,[\1VL=#DZoF/qoMTn2B'5\^M2aqK5DKXlEM><+T`sB-G&Z(c(BR
+J!dPthafabN>^)q?\ZSQSS/@QcX>;7i0nTD?CnNt^UDJ3-`+$;VGjf08DH$tZr["&)/!(*I.j5^OQ8e^
+8Ph"8/3/'jA1jB68(T7rJk4\OQKuqC8kA$>dAh;G&l#ZYm@\0W9t.(QDSBQ('mR(I.[t<TU/Bc_\)fep
+ZH)^Es6d$i@@;(qQaI+1ghMP3$,PZg;lm]E>m,"_:(<)pq3Wo<.Ggo5q&WIDC[0KX,/8-QhTtZ*EP0?a
+_Q\TB<cVKH?L<-$$+PYbY>Xhe3mk*"5>ON'4f6/(Jc>Y&YI%`L%OnsN/tuI=I#k899>.-,gi^ub5*n4>
+Y5!1kfD(JQ^&8%.qSi3d38S$=S.Ec6?6o2_I`*e[JHsgA^DImB$Q$osdWfFa`J)k8P0)B][V:UdL,M6e
+B2.9LAXIRL>M9HTl'?_Y<G8$KgJmuqiN*F_p[DS*;W_=S_%Dj[`_92!M`>O:B6g_YQq+PF_Xc2Mjo4ob
+'^4N">pdqsQBc=$pRH(G#<Ze.F\Cdb3JFqPJksd/ZSY(2N4Sr"M&Z+,I[PY`Y4l\Vc4.nb[@4>'A*WGd
+eSU-N^#g7shH@EIF50uO.^@"Z#7W,2P!f##h'`59c%ea.62iI;&PUS3r+aSC/\GS;=?ULo4!B\l'Q5F%
+gIeNE"i\N)8nZ;s,#/P<3_Yr7X^3P1g>PB8l#e'@f<]r&cS[I1ahTl;9-!,0^gYt.A;.b!%H,cE,&jYd
+nS[!?ZK:t4CQ?+Sh`\j%f7(#I9'5VJ%;9kL&UZ[ZO47N%<Me#<'#hE8$UY0lkoKc@!^L%<"J2Xpcd8qf
+4Y5%$fGF8N-,mDuBB!IFs'N];^P/LB0(k=hC-Y_3-!<f1'HS#48rFr"SZmt1>j[6Sl4#BZ3#P;h,roH5
+#PUeF,B`^bGEA1QD0OC>]Lo*8dT&-:_eu2,l,-hAb+R]6`$H,+d.Xq[=sj1l%_jhHf'ptS28sC-XIGC2
+dMD8ECt&^_b:)S(S^K*909$1fkM/\V7D=AUfsmc3m>Y*6_*p4a?<otX,Eps5[j](625&;3:&NgH(30R[
+;M;#RqQZQgkRr&Z-Q9n8,asH&?1i&oh9lOkkK,^77S(YU^KcqLP.*T%WS6t9nG-,ZJ%kYTSYtIM\htEh
+=!R0hO23X]BoFo./pf.(3;CQ2b0[Dh5HL-0XbB8kJJ*`N*TJ6NlB>6iZ+%#>*_hs&[.<G3dEoMcBI[T#
++7d9<l-O<6=r@ja>q\slURXFAGYD=%i,LnNI^HDc[BcCNZrYcLT%;%oqFjC_=V(71/*$Hoj$t(p'#uMK
+KEjG.EsDfLX@N&G<ZY8I/$4c[jH<%";'9Xc@qk%%mD"9S*r!i^o947%@X$Zh)rp^-a-WEA%.C3!)SS%B
+jY<kHCXQ$7*p^]`,-CdZ5N8UjY.%H_oBb&NA(n)9<lXa:=s;>:,J=W3cp,H'dRm29s3b&FCNghr9tNf-
+jjC^NV3OR;B;Cg/_pUp!b'H&7B]Y<S;_'*2=["e3/W=QDcIeh>A)#<.rYp3&EA7)%ZhVHI.ni_CT"W)o
+?5_C"9I<!qhEh;&ln)i;S@,g[p0PVn-SAT+dU5a\rkj'j%K>]G-LY&>>;04U&+;([db_jniu_L+mMdPP
+iqmZ\]uA$>r+E`OpZG?1s'0Y2=3@7b?#P,K?\t>qW;dfa?J#(,d/grFFi&q\9Pbd;\)3YP`">Y0Qqdu2
+^@BHM_VV>#Y*FJ$n`i#B$%_C/2fGtUR/O[R$QO*CZBR7Y]Vc)NDm/T`]>j+PEOcStIM"M9`"FEBrB6b3
+q?QBY!It-/,F/mXQg2%'@h0LH7^CY;]IM#X<PLO#'Q9;d`[J%bECHpRT2OfnN#-Jbi[s,`n`S*\[*2t`
+q9S7%l?/r&pOb&'NP50spQ^6DQ6-&))dBlpggt8F]lLio#DkCS-!gB^2'lQ*b#^s<,8o*YYr;Jfl"Z`Y
+);cge2t)[u9dSX?QY!o'-E!Z?m.PZqRs*lc,@8fI+\>bq*.R_;c(?u[(Z0^P9@o7#d&s`j9mMJP?,L@<
+Z;7"]^&!H2:[Ar[(c+"9LXS%)qrc07)EBVGTTu\de'9GH)0.r(6cP]0J"N+"3mZ0ZpY/cp&>"](cd6&>
+Y%MD^]d5ma(\sXGiuJ*\=0+W+dP&?7`h&lbq9TPt*"T(ISTm1V5`aUtL//3Iqeth7!En?F.^J%$G`>a;
+^>@Ot7<m(A.V!`]e'@"\h2s0s>9]b_VR1sRMMl*:#5JVLVb*o*p;Kk*UhW!4B3N=/3Vo)rF1P[J$b02*
+$b/]8a%(X.b)aq\l(r<4b6Au7ra@;@FMnkm[(s_0;$tTAYD>8Di*`)":O4km6MDV^9C=uL7A!!t^)XR-
+@Da^(QBkr:1F+;?V^49O)/jP.]ea"?J+Zr-3[cTS-&N6#al8"lGVi[/:MnpfcMZKCq%DIiHQ##8.#jAS
+Q_oE$23l[k.B";9d.`#MU@`pgS+4hZAUj-^FSoK.]_j_W/0+T2pq?gMpYRsFs._U+TD?O>#qKI7R'?EF
+rcPI6TD8;%S1tcOk,Ugkh=5)>?:h_fOg=gd[Qo)O!U=D_W(BA8)+`iW`Vi:j5Cr09($>FC,JA#59HM/+
+Dq)tj6Io@sR*>f:5&7/N`]Bb_Ge/:M?]t?sDb=lZcfA!:mrEl61Ws"qZG2qJX4Z]*.ItQb8,XS)pY\Q/
+jY%Pd!5%*b4Oi&aW8o"VJfjX`q5-,/_;G#FmV2tr96aHHl!8H,l/L<Bq0hat:uFiG,Cj4$=*Rima<NC9
+.l;`IDc,)$._8V+,'K"qqm4&2)4oMIc9mrX5&\PMipL3(eU.8&p<$Euk2XT*)7dN%)NB6GOh+lJ_6&Se
+mZApm6!q?2rKKNE(bP9dlO1V,:mn27F%_1uZ>:>gpjQBj'tO?1JB!jqMboGfceK_tFg!gsH=\UUM%H"R
+:;%Aq\1G+H"N5Nc76Pr?HM/!#+eHI06"&7_[o0P4Kb(^aEbi5#@5[1\<9fV2Q_m."RoIi+UF@T-r<IaB
+nXF5d:`#s#@bu:ic)^%)XWt*?\I!er=%,baEgsODn"O0,g2m#-)rcE>n^ajE.GiMt\j72rr<L9qY"UaV
+R_!/@\o$;I77([H@)m-9`,XNh^ZMdL';V\LRT\DM#9(D^8B+iBNen?;X^C)W9Q/YhiXBdTU(g,b\*>8>
+.qI_$gTJ"@L4P(=TJXo-1aIt5XtNHh`&i(X[q\CHFM8X1H,!=uFU5,UST1o1GUP7&#l<ElOf!BF0/,B7
+20I?SL_G'g[DFl:`DOsC-POpYK0WN`F1a55c1t"%C1Y'jWKjSX(:Zk>rRp(i"Z[KdHDIq*P7D$W-^>C3
+?jb?:OS"O%!f:DgOo53<o<rFe!B6$4H=>T`:sN4e,cp6sm'nu]Za3>OBRcfhEtG,Ui_/u,H:l5*BJoa/
+15E`G(PZeQ<_(M>;XtsU:guurs"]0>U0c"Q[i-ELd3D4'pX_1BUJ\!\WaD2);/]?hXX45)UJLaW/k=kf
+KIN)t;^O@)iXO),V?BjIPM";WRC)Y1O?/<g@NLrER/G(&G[7^Z-6Wd'b\rpAi2\cZ,_QTnAXS452N5F,
+.<3G)r&R/%SlmP/8SG$Y0:@J]=sISk&o"J43fA80N_EWFT.&O<r>m^#X/d8/e?2o#PY"GfD.JSl-GAm`
+\&(b0.?c[]=]d"6Xk*$*8]mf@R0;b:;C3u-Ptd[bS/3bM#N%'@R04GbjiA_&0*GQ+P8Jn[/X$g8j,J3Z
+j^1n4A\B7NZIPu8V<F&;Nr*U[jO'pU,F(qX*A!CJ--E$Z+D"I!2e5hGO?q"WhtY8<]NEtf`SYpTIYJ!T
+08sC"Ol(ZKMuh8>`-s"JM#Bj'M##?b^[WgLS[mZmQRbfoYWZ3E3FdNYp6lrDCTdEXl]Tk)0E6WUEKB:N
+l.Gsmc3r+WEK5%^M.tHAiKhqKo66KE6Fp@G2L%R*C?J2kHo)YA_R0et0o-mR9,(_(`2<'7428h*fQ6-B
+^N"MC&Rna0ndKF&PiSa]pC!/=0W)/#M[3sI9O)S\mbuW8\@CQ.jhu,B?UF7N(VY6H2WZfOD->,_3J6mk
+J'9SE7>k<h;cCF"`HT_m.b7`.L?L:M#.JdB)rQX#<r#ADfI+"1Vl#+l]&lbi,@2R:Ck(1,rDi;B4*SqM
+HgG+iUOsao-LaiB;#HJ;/*dY(QE='BAWPip1]!SRShV.KHDLD6l/6k^-+.IpW^e0'jU:>iT9r/DR@'EU
+cMr/o;^0k/Y+mH!;R<7e9>?]DA9cEaRM+R,V7fK:T@T5;ATl`s;g(^hbF0&#mG45:2iYVA13%!Mr0j&e
+22u<Efp)Xu2'p+sG."3c$s_W"&4[OJ*_hInQ9);c.rAHg@Ko.@=3j-6eaS]ik)-W%$;L?5EJ"&>>.6@8
+C9H$S'!8>6BM+#FD/798G/+GL5BGqaV?FBa,tn,6HaT_uBXlVSRe";g+!<=BYDS+49Os/BVP_RElCN^q
+ofW\lWd>NL;>AM5^QpSq:&*(FV"26h%ee/:8idJ>"a*jZqM(k@*&9>Gr>VZ3`-M9DUuY7G`,QFsNqT/D
+%_])0<9i)^<Q:M!"2Tm=G8<ed9;r&lr&p+"_YHr$rr\e7/$4*nJjjhYZuI9d_E7M!3gdsK12=N8\L'%L
+,3:J''.N5VhfH4u+'\Gp*hVe;pj[<@.eQ>X'.N/W2j'7q$qX/#o&(\U)`Nlla%[h,*EquJU3GhF`cf3H
+as]XL,(*[]0;Y#'hCY7*P\S.AY*p31r]>;C'i\q]^;c&B-edHA?$T8=o%EAQOQgUUSPN%0nHqRq_(An8
+4CH8//UGpqf>SP[Y-UG[muf1(,PCo$U3CR!1VHf;&A>uAcs-)pras`t*]rqsjBe3l*?qqW^>OWjn&C/Q
+U*[df&!>>&[WB*0aMcB0qJIU%kFR9D+"""U1X]AC5!-)ts,Q-X0u*b.cA%-?M=M20h\YGDq]3:3J,_Um
+II+luP&Bl-?sSoAqPFCR[gs):9Wm=.LS,M:2,YFdm>6:@bm1R7i_%/4U[Z-%d<dj`[n"m-+pkd>Fd@Ak
+99T,'[WbnAM"BqX,4H9A,q\G#V+&,IdUctK55!plr>KR=Y99Z3iJ"3f&e?A9?GdOOef4<V[Rt<_HULLT
+q\s]VNeTM`Wbd3_K6%3b9$/Dm$7a6W#CYW$q`8(*KuC?^^p/%9:."74qrL[_9Bf<hN6eka&;AeD*X/F-
+:6,HoUm:R#0KSVcFqQ#te"Zo3?JBW9@ZC-*UQ@J%V#:(HY?+GZ!jdcm@j`ud4?X%=JY#%-`6lhr7fdP^
+LQ*$%.+qP8OlK$=[$)m]d\Dm\Vk'&#m%bGpSHN(Od\D>]6Vi]@f5Xce]W\i,O<0+dR>a;)!;aIYX3%Wt
+Q2B>S^(f6lbVKi3q!7%IY`foLT,r\Sk4k'c;8&<n?W%8B]qGV8<GI*OOn'$p^WoU@dC<.#V4Eim#WjK7
+6ouhH8389b)g5+gk=IPGJ)gRe[h&N:l0]Y;AT[P"`R0!";L[P2M.bc?Dm7"VP:+ZbC4"1$^;;g^5f5$u
+/!/a;C'r$aqH!E;"tp8o(Pg]Eh%@k3NUUeM8[KI^"%-.l!aYYgg8,6(Z@;:D0Ee0IJ9F_a.l$md\Cke@
+aXmG.I>6Xt[=.'MI[!\lVQ,`k9>B<q=K(-"O#!_/_C8[YDXPlj%+;!jM,rr;oW`#bBFE3H"KG7+"gaFY
+&VMR^YP@h8++83?WT>28\V"V41"`:Lik$*bj9m3pK)uX61it/OXUS-_8RiU)ZA:t1BL[HDK7hUb61d6F
+ZG?&.077B;_k?r;TC3X^s#\O"iqqVQBl?,PboKY\K73r`Xb^T&`RpVmatP_[HjGUn^=DH1f6hOlFP-jM
+F-i;>BpT-RM)#SBg<<Rj(u@M0ef8<*Q]6^(<g7'DW"J^W#i?Ef@$DFH''$OV]X5+kbhclR;;g#.qNr$c
+Q^_;Pq7hlHqQ!t4M-jESW0'4n>",7SqV`J]=BsNd+ag?<\5X[ne=<B<(>T<YbeX!S'HFUY/,CaLmq:'Q
+M_O?Xa]SoF6;9gp-IcoWmP<IR,.uUhWF'*t9YPif87QMuPk"ud[Shsbp)<7iEB,:B(r/.';6J#+VK^tD
+l_4;(Uo3A;$@WgH2a_V!C<f0b2Xs:A0,Xq>+/spUL;]OTKBghk#V't'/2[SU)#8g!Gt'a'W3?Jn[@s^s
+?H2BQ`$=cAlIe+.p+,)V;D7:G<il4R9gu<f6;Q^i#gK+P=[\IP(F+=N416c<q6"kmLq'ng+O*^U\OeG_
+b_trG@uen@UCo*'\<:W.n-'nQ@_GqIU+BIW5!]_R#7kh=^,TrO[1K/KD989[dnHQUR0RS"SMXV.A1NT%
+d`UTS1Pp,N9mZE5+0M9^Y@F\?C8\$1o^&n#QWGNsAo#pds,3$%B"psIf0=l<@Gk2Z@0^(UiMP;lOuWed
+4m4d5]-PnU\$p/X"?]2fYU?T@F%XP+q5PLPp6aN?+nbT@:?e"_iY46r3$F_V#P'^D/0`?gaq+`GlIFNN
+ed$>NK%[X8W$@W#r*XQ[?WmAfot>+uS^>uW$[nL[:AE=(7fFDa?,Q"*Desjg*e!)H?I$gQn-,E[p!mE0
+@.Rk#Tu"(O,tGJ#;>uP^1tYM`h)*ad@=O%:JPQa!kOCWWTDe^Ip6a[2Dk,]l>-Hi92#-8fcUBLuoj0K5
+48%8oQ[e$_"8i>n`&-]0/Pbr_o>%7.AjcA78"]DMDqpkn0REANF3HJKJ&aj-ci3p!hMqEm41[YcgUp2Z
+Lr!sNpfCqF>i5Pcs&\!8]9Sp4n)5O84;Em@a$8MOdcU;]3:>b<0VU+%`7jOo[-sF%4e*Gn/AAq#FDfq8
+c+H".oCO9qi?Sp%Edhr^[Pj)%<Pa65pH9K=DA2"NcJA'*!7JbARJFFLo0V%DhtE-$a,R0=D#3u)D]JLh
+53E#hIJ9R"6ZJSZESR/#4+eP;Yr5.GEGsPh.lfn6g).hHqR^rM*3jZLYgpFCLFP81SjrKupkArFR1GK<
+l9n?*.X7F(fQU34&+hjL21aJ0R3Np0-ZIk<kL[RA;:1dNSF`UY>F=;0g:;kKRu&3C^.EArDaN<e_<B$(
+V2\]^_%S0BCl/=.T`URR'3_4I*h1;?ELT-HDq"<EQg_NdNHOY.EAiPi,E_ii8).'1J$6L8.=1H'8uH9]
+hF,`32_pSOEa'[[arJ:QoUl'!R,Q>l=M3P&aAGmj(>bp$9=ggL'YZ[:<mB)-O'AWLII>QCIlN%m#:,29
+qu>:'PpBRsj2Sc-d3hKF4<1+j$QU?K>#`U;pYY08mLD#3B3/-&Wm,;O^H]^<JtN>R&3-Kqb=-lKh@S#T
+Xs)%tH-=(coS+FOVs2*n]4u]9msS^l%hh+9B3&loW;\#:Zj%9bkk[5u4e@Nk>auZA*-Ye:rrpmK.51gm
+%JBdo_&>pJSjP.N_&:7Tel@",b5C'"H8iO0%+fYp\JPB$e'W.VM;D$_$ej.J@#V7P=2n`:oR7,eor1!K
+p;Gsm&[qSToR8Q#H+FN))`W7Z*knDe''*h`3#t-;B5"0Hq_<([>.rpJY?irn%-l\FL3UQhU])397kb.T
+TR/mdgXgekoQV++B8+=*Z[eAp>Z:,C<_C<:(6GA!4?G9g,0qH$SsXW*-\uDJE,n<j,+^`q$tu(_T!dK4
+.<p"GSL7,?K0:lZ'c,+jp0I1S*+HsI\*@5gVG)+8cVF1E0WCsC]Qi#Y-2&c>l=gR@5Z5@AG%NE2GkQc1
+%A":IcO,;;+"'#G\`r*V"KE'[::LYZAgWpQ(?IQ_:ME>BJS/g8fIrgbBQ<RD/-J*4YTHus^aV\All<%A
+N*rC>g"D"oV_h_3B.[*+%OR`@YlX'6mOLM!>4LDQcd&6uYMe*UZd):]cta/`PstFGgEXJ>U(']1P8GkY
+MZjmB=hh426b<8V2-N,pQs_6($_p.lrLD9p9'R93V)-D.=#`=4dA#^KBMhmuVX"=3oN)6Ig<_JT<,IR[
+1g795-?8b2K)hSL%,A=eIWk+ArLj-l$2]UV^U]r;/$..XUHSUJ1UFiFp@Hn\bjt=-?S@p,Q3[C@E$rs2
+!geDS5%$[r+q%iEqg\iQ\VYeDgc2@dol$qts82`2IAhB7pH\k%NAn"ij4H:>(AT"[5^ek2=>FFe[XH+$
+UEng`TdpRt\6&DO1K96eAbBtTaZ^'ua>7LCT[YmQ5KLb=En.\\JmcGHonABcbdo+tI\NNqk@TB@p-_Z1
+bfR?j9"n+p(aT?GqBU`(IGnia4me6>[qXKI#lD-IO?%S1K<%R\Tua7Ze68D>lLhWFh[7tOofo.?^Umfn
+3Md1YW2DM5[8DMs1[<kkFl0B%$R3(?Z[MdGXW;dq#efR_,chn"O"9`8Et9t-J)OG\istcd3o:f1[u8Hq
+VcBXh2d4+oq\lc%PojNhs4QF?&q(9NJ<*s5j`p`X:&D^Q7n7f&F%OHrKC?4*00mXNh8?I$Rh*#6k'SER
+!XPFp:BZ<!j00A,s2H(<s(i57PJnKlg<@UBJMY<JV,Z+6KrptME*YPN?4g'M-[Z<=ZaIY6BLf4&;mY*(
+&-CF,b_dG%c9c]VO//Ll+LJ5B.lLp5htA$S=_P)&EN_C^(#Q4aG#"'2&NI$D>VV6rgsFJm8?;NsKXVoW
+3m_a^pC7>DD)_uci9nkaC(.L&KY#m""-qHAJ5>&R"a4$'N\t(@VrXZiVS?\57$KBc's>:Gj`a`qG)W33
+M&Np&^O+^WoHlYi;fH].]t/GFh:(PFa#8t+i@P<.0We:W]IpZ'OY'QK;E`\3dsesU(QW"gXM*D`Hlp>1
+T?si-b9N;il?EufR[8S%m2fNe2%FE*XMGO$`lC3<hIq@NL*bh>CJZhb<g\ebWR/Vmk&uDse5=sF5@Q?$
+A3#'S8nC8/Hs<W>A:'qRNb\45ms],.P]iYrK@k[u_6atLkrq#ENu"A9m)Kp`ZkZ(\.Xc+A4&`_O9rSHV
+@e[,>C@nb;/@I$4QMeP7)LC*VlT8(Pl=BkI,b+<EZGY,`q@7r=P]qM1lk"FMX/f7XXO'tHGA5;\@N^#F
+>H?'h47\7F,RnmL2W,CQ-XM/R%kWYQ827P5fR7L,SbOB5*e"M!fMKIVa*OF"1+Wd%s4sm'..ntt"/?1s
+YmEf?RgW0Do.^R[/ABa/0,uR#[+o$X\NWJO:E8ihcgSul\_VMGRQ[7BBuQ*mfKi3pXJ7Y@%)[L0$AO8a
+GejK=^;&C>>Gq]9HA7F-?us-&&l/UHTYbU_Cr<Sf)Rch>h=u<+;d,iged?5g4[2IFB#\ofSad+-L+@N(
+>fY7*SCK2L7g9K)6k(n6lR=FD(jlYWAb5af[=W=hV\1VaiiUnK%L4:b9:XpUo[FO2#:=6nqh9T4'7.M7
+=5a4(n5D%FMXg.JF2V^:KINsup%IOK&d=-=oaNa?mOr+/dBE9Ps*V<jbu);jbWV07*YtudS$,n/>^$b!
+C;PcK@<\I>)f8r5qN>D@E-lU3rQpdI,an9?"rZWuC!X",m&/[3fH]/cV"A&jQD4207uI$6hsl[[XgRqE
+[2A#c]7ug^;49?([r6j?/_4uV^&7.IY:[LWk2or.^=*H-2?HZbfI23)),-%`i!dF3_W0\>4<U$r7gmcl
+:5>7>eSc3^1VQI3;NA8fKqS]rdJI*9MO`eULM3[8k\\@(ZES#)pj0I-?"!NbQ(IV2[<M:sqY?GF+jLT;
+hTYimfVou46Kift[FcZ2?Pf"\N6!\;C_N8jZ5WJ+k\(;j$2.sS:(G-S7lWjp\?l":R\&9tGGho.pUcVW
+*%b+G(e_1nVfW$/UH8(pk]\C+2>=_H#+PMG8\^76GCf"&k>sUI5s,H:\gO9qT\l;3YrJ'+/lSs/.JC^h
+W,'+lA>0TE/DYQX1$XW.@roDsdQ0iYmWTHqo\DAsZFO"oZ)0rCZ0--Y4kMY%<]ndljiih@ei]K=^R`\H
+l.XNdH9tLUoq_$'d(MY?hlpe[Yn-_d`@nHkAnSuLNHM%o\adlu40tK^1HWJqk*_cgn8.VhlM\#^@XE1\
+d^$EYPe2%&R%<mfh_s(+>RE>MlVfTTS"7C?omHRg2*8.F=3St6=`MFIXNt!3fp$3rR%5Bi^20ZjNHhMh
+]$i*Nf0!28pN.-_G1I&&)RHbVP]"Mf,1>h:R'ST\Zc)43='1PrB,q:.3'6Fs5s_"1"6Z">ol6%VOXEH$
+1[K+Rfbp;#2*7ReE-CrZ+'=b?'0WZX3.u$iesYS,Za7rFRq?;]+;ki)BAN=@`/;7'52sfC0t(^D!hFCU
+AsQQ%fidK>!40"<1%2sF9GXb`fgGbRk8O&$^J=^YX^RP&!nKB$qS9iPa17Z0A,L8%U0*V+CIZOcRR"TE
+lK1Ai)9o?3"KPJF6c4knf211GU2f&r]4JiMZ_9IC+t`W,i.u[BDoMN/MkH:g=MibNOB6e6abO%s]&!"$
+-d5^J&$%Q7:,lET_X'pmN-Q72nfDVZXh)tk*l`7=o.]#n/Q!^,nCFf33U.F#4LD^nS6n(Zj+ObP=&JT$
+V9ZCj0bU.QMV*iq2_,S"+@c2Dh<Bi]n_DJ8hhjR)8VI%NafF7XjI(Ome6+TqFPkC0\_Y.gnu^"s%O@05
+=9pWrUH;=O4]csV>G3?76k/#LFcGR@-SrM8@-1OjH$j,o'=WYbNU[?,"\SKQOacF1;<l.[7^MW@HsP?-
+>?fD-lZ@*j#iDRY:L`K_.ZSc=\0JFk7A)V)P$r%p9_(B'?e,Th*3/AUn<9'bT::?n^QROW/R)B`m,g!r
+N6.Q/&g'uY5.JL^>,#?U66>T85f+!=R^e^[PmfVDVM`e60ei`(kp<Q<Z&eb:At\UPh@?069]!QKmmk6?
+CbIa:L+G-m6EX5+.k&d'_R64:LQ(;.IMo\jG;.<Lq8R)E)qP]Y^QMs[FOo$8"Guq"T!X4OL\-Y@B1]UD
+"+(A@s)"?*?d%t$X6V(P>Gr>lW*@@<`n3;Xh2'AdSFIko-7u#5bl`Bbq3BaLJNGDn+?E8M"`KXAq`qPt
+IO2&l7W]_Fk9R`cIO.@lb*J^LL$sY8EUeaWjnY/o"HP$@p5O[5<8<<1UPnr5]Pg1`LZif<EJS22'*6L/
+T!$MdPJaVJ`f''/+X9C"T6#2WIg[h&n-btl])RPV0)o&@ml0+H2<B+lIY?\9n@7BS3i^L=,M#q(q*S9J
+c2IerD`;*L]-1rC@so5p?nk+k`V(onIFYX;1&@):n->(;d5GQnWP!>%.hQ9kQLTs>Y2J\J&@<1W^'lkg
+m*,dWgJ'Zm6Z.<^q-E4\2jUqBm5)^qDO2muigA5\EH_cU1`3J1ohQrmB#+[>fMKCBX@i4GSjbSV2p6XY
+4i5sUVJhEAApm<(#]I1Bq]]qE&m*!*9j$7h[An-d$q@Zh<.2Tu3T),`D.keP]2a&oEgHQ8U\[0>`_a&J
+/,;-ZK.W\CiSf\2]\P%=mfqOsq2KA&N=.n^AagtC,tm*4_X_lN'C5d=2b`)A]bB6iZmjI7*1Q%FeVHoZ
+nu(fS:trH::8ncX1g[.`.UM[hX-eDiGe;qQJMZCK8D\7$n91i9H@`P0`CBH^[i9?,]7kBoiJN2")oE7\
+%X#BcW?,q+NYo1+KFVEf`j)f\Ge6-*#8T1F._+R,L<UVY3C(V"EE:?=%GN3.j=.&f'.C$R'-FAdC\s';
+Clb<^dcNj7(VJR=du4@bDRJJN%r\oq,9-5tP=<[Lm306N@UmL=3#b.'^AISmU=qeMq#9m]2ib3VJc0CQ
+L;%mj,3)hsG-g!0oF1>76cNHODJ]R./8mJh+`B<u3"&U#qE*f+8[r6e_en&O7O3sQGW$aoA"4u4)j+MO
+4<"lgB-WT+#PG:t>OOelTtg51?/[a^EOX!GF/@fuT8il)hJO&?2j?P.4Rd9?PqO]g$[hN#rIt%_HF`V;
+rVjW9=o1D8:hIGoq*E4aacuqF%;s8sV%qYc5@*>:c8:*#V',3uQ%FBp?`nip7W)M(n%1uM9etekGKfOr
+V\B46h-#jtQR`5o4\qoX']e,8Zhi-B",4C=1S24?qmYta>cndZ>H+Hn/AeR+>JJ20nI&D*m-YkH)uWLP
+oJi=5<LFT-;_$p3gnr%#B4@Kp#)X<1qn,&Zo^?la2mgZ8qY)ckno&<bb:g',8*Qp.>reslZ8V$ZD8Wn'
+DoM-t,SH9Q_PiI^6r!@0cpNt[on8Sca'cM9*\.D>A3?81"bF3^O@MY)SZWDVfCF]u%2J#$*rb:29COZ$
+^@F$<7sD-#g_&gSV9E92K9M8Er5cgHQ*JqR6Q)RXR#*h";[W`rb=`(diLGoDNs]F?OJ(^b?%thLhC`_u
+l[@$ZRuTZXl@gh^)>>)=aC]1(Bpk<UFk=?'L+@RK7B'q"op(+o>Ud1e[B4#t@ZQ8X(OGtsF-CVtkO&tD
+bOu]r,:q;q_VV*qRF_gg3,rdae6up;9^>9o?0WpDL,tmHE@inH$8PA40h\W5#nm-!fGY_kL]77a*>1!W
+^d9AkXqY"*C-/7r=ZWZC+TKO$lupKef%WicB6:R$iOK2+4K1)+D/tklAu?%V\ALWq47>G\>2Xn5'LZfJ
+;W'UUOd7hb?@8Rlj8<(k@Q#6%Hlnl:RG6Fs$8,;UoKQ+.(jJ]mSWU+)2n&#P(Q=#2(]!@Ph?20^+/Olu
+F^aZ"W6qHZc9.s3<f/sD/GS]B(rq9*q=04-N"aiF#4)hhI/EshMp^R6qr288`o/U[ES.A8A8`HBpa+q(
+=X$A:l[BUs?bp.ln1e#PED[4$+i@KJ7a?=dd$"hQ*&]\b&>>X!oa)*A&r.LoqIEoPE7dk*O=^s3Zrh:7
+L$jn9ng8;.(Pb^3,nPjVaMD[4AnEfN_^9FWMo0-qc<P>@XKlHu0HkGg_8]oIRC0k>('LsN*&c!*X4JWP
+.9L=sjf*u@-8XG`1k?7S@A]kOS%R]$g#NV(a<kg@`,QAK9NW8mYXD(n)uP^J4_`N+_k_d$Qm;f-bm]mQ
+LKTYtI@'BC-D,:@mr0,hmYSh.Q<2.9#P#?U1S3)@S%PFU0+OI?j,=HUR4UDBjII*BWA`b?R?58f*%&@L
+_o@H/i\4mW'Sd-HNPJs-J]!/9DktH$T5c4KE7igI&9+$5>`nqA&G/,hdXkt^i%Y%LAWmX*!/Jh!4S/^k
+I/(Z@CbCZor",/KNh6<RLuiBmqT<jM2,qCneEZ]&GtcR\.5p3e"ucu2*+S?]N35hOgVFq%!8+g?@,u21
+2Ul[SD(N?!9#g=KX_hi)pO(+CM<Tf)VTYLW.s^N8(&=NDhUA9'T,!h8*17I9[#tsT%!.B-o&X:IY3U"S
+3i=Y*]/Z<5/5BP>]PVt!,N`GWr@d<7(T6"#HjWVU*PEDnc-<`Uo[WG2A80#l%%M3.X6JX9<H4NCG.TlD
+OZ6W;S:7]qf-7hYdr"X6*g\'i\2\o-g"(=7%L8mf5u2IrlJPufqAT2k(oMH82`Q5Zc,o5*/0Uo!M:3!l
+Gja;%l"a[C/5EYX_oT$!W!&#kVABS7=7',T51SZb<AhJoVluhWW%g"CX3'TAEk,GF/hBb)7H7G/oMo:k
+i,lA]3.4fr.6(TGK!e>PHX+-#^<S:sYR#2/(*X9eYE&D`3.25U56e#-`9.?MGg\e9da`IO(nA=OAe`8L
+F@RIOS%SFRFK<YL/i=[<i,n2eS8O8]q;V$HZu/`[D*I".K>?`gll3o&O3-Xe@&tnS?PO=X::ED'F4@k^
+(bdoi+mbu2MoC\)9u$G4e6$,^VjisSi:I8h32`s>R1!(s",iptd5U$@\T/P=^[[Q'9jm#[[5#_pQ.<N-
+WoM7%@F"a*8iu31+'n:CbM^NXaMF.l^rlMQlN8Lg&UW\1)fPA,Xng\$[B(4?=M&R51VjWRHt>0Se:1mB
+r5S79=L*N+k"=pF4oCeR@o^JALB;N]..=$5SV(A:Y2cC%27&h/e/*O_..8dJJ#5no(3F<K`][c6lS[K#
+@iL_/bjKn/aO'8iQg>IQFW[[=$U#4UZkn$GpP/fkJ&nf?V_,ZP.o.%$jd\KohAKS/>iKN=]kR<%ge[<@
+4/FM[i58qA%N(E,6\[,aPe<5*7$jier<3($f_:1!:,##WGV8/SrpAJMRdg8!PGmX-eU)h-e`Z\><ildm
++(fMpE##U1%N3R/Sf@!-U]0:f5MkQ^f0Qo2jI#7%d.,+8[8]Y$GJ]g(#BS.i(RLOG\r%EU==K!EkF"i/
+XeDZb$qnN[erXLJE`nQl<Zi@!R71Uc.Va=kf6M+kSoLJN%G[$3\V)]qoE/QG[Q:8&JH]@KhBTY!Xr'<g
+ZkPP'^8!-/B6`[l$@oYqUoens:<I+CqR!MrSY&Un\M\S7'&kN_i2m[Q)t!OBguT(5+n5sq(l3#F,riA-
+mdaR&3%d$hYdCW`6d71H%B$V_eG.HbVb52Q5B2++]DSgA][\nmdm36q/q5#3nct3OFR[0e8,\6H^CE8+
+^SZ8ilNd/4eW7/U)H;]g=hcF*o[9IV,Hi1/6;IK:ef;>O)5B[P05K*gocoLn,`EGp\0tfOI`r3%du2'!
+9f^IJ4;H-8bfq>sfFKC1'>N2MCHR2I9H3478%>_A>q.:XCUp`X\4qFVH;4(\`EeE#O(Wt>HfeQ4lhB%<
+qgZpt1\qh>=6]1),K;oVB=r4aPf);3Drh@%bk(=rk82\sgV,M7W1J3Lir1M/dRMPbpGhDCqhG$cP,D<]
+P.^=I07Hc?O[AfHo"&<=5Kj(/5)\fOb9nid4RPQ7MN</TMsQ#MT$-G[/c71"A,2Xi/0VPWaSd/^Icg=P
+3j!kM3TQ**ZsV'@p/54@:d0fDGaJH+IFD,E_U4q]:<bG>aVV]_4r^EEoDU.>qke$%:YHWQRp7`E4`EX^
+d4]f1UAj9urMWutg!B4Rp\rD1,IYP!chCMr*q/iB'%d$JJBIii.0#/&5k1t]rkrt>&5O7Z`r-'Jp7kuj
++$2?C0DeVWoJ<*#Ik4spa1e,%LuV`/K9+D!kDR+M9CNbqW_.Qm&cD;Qs+u-547#I^80/'1"Xi9g^&O)d
+Bn-)Up<VZPSBCF5[=9gTnt4"Lmt6JcZTQ31Ou7AMl?hLE55@k(BD5oIa$*WIp,S`+Ik9KmMaK\fli$ZK
+miV<PT!*1JJ%j)*q#*)[8QYcrX$,,e?h!$8pkAFN3q"K#4(s-@<W3[-G^#I$^mG#`([4HY:XAcjrTmV]
++2>R32d#uQ*<!/(M.:W\I.=gtdJ#^=Kgg:D+au)jnt4!i?h+e!<9Q.[isXi;rJk55?VgJPIY`$ef5pqF
+nV)`g\G0.8,h;mL\F*">r$D!us0Pa3GD,sejZelG^#UE@eCT4ShO'iFXYn6;I.^kF,5\b@ro!"4.c5fL
+jZiRT_4&^F8Cjp:2D;<1"^h3u^IUO-hYJ8SH&(H"YOXoDDdN!/jEaLDrup9I_5I=O05UYoJCQlY>i3$_
+/)RgjM8O!9qBJ2a[IkH1Y:nr-obsIKfD'a,`olYh`ok#Tq:n/j/,RN*_"Wgu4C_7GF8LhJIaTl(^OWM4
+n<;")IdnuhM10YuaA:U.*pX@,ec4YGnPal0mjJu:[9r1uXhEe2:OUr#:&b5H<V#C@XHTup^JX.ZN^fP2
+jZaVID]e?L57*7/>(?)XEL"2=_qNuBZJYZBs43h?*p%/:nLONEa-0keYP*r_1qk$Wp5<sNYNN*rDll3-
+5OTtc^1qrYO-h(Ncg9\Gn+hN`H-W&-r'9Aiq9tu&5G^Qq5D7(^^NuNj7dMnF6M@<=A:O8Trfd(DgV)hL
+`*)].oL"",K0&Z!_SPth53G#EQ[\UcoEttcIT8$!Y%RQ+l;paZr;4U`_`I*&qF0]h*3j=^Dl?q,)s(6%
+VrjmI^RVLq3-YBi*<!EakkC(?obm]Pq-ebcI7E>H?[A%<UjpYPqNeAHWU2.,E4XV5T(:G*I".C$qTQ.a
+QhOFn_Qm7g=5Wf4Vt`^Pli,t;.+e7S`F"*e^>LAInIaBbhY<6eIYma,kPM#:f&(pJ^@e"'#[cnqqF17K
+A5MM\jjMJ$Q@F2[5F&`94oYBKa7$cm0)si/f5gSg]^,A\i2P,IJ1\Dg0=/7hf73_E8)f$ta8Z2,b1UG
+~>
+endstream
+endobj
+7 0 obj
+   42121
+endobj
+3 0 obj
+   << 
+      /Parent null
+      /Type /Pages
+      /MediaBox [0.0000 0.0000 655.00 705.00]
+      /Resources 8 0 R
+      /Kids [5 0 R]
+      /Count 1
+   >>
+endobj
+9 0 obj
+   [/PDF /Text /ImageC]
+endobj
+10 0 obj
+   << 
+      /S /Transparency
+      /CS /DeviceRGB
+      /I true
+      /K false
+   >>
+endobj
+11 0 obj
+   << 
+      /Alpha1
+      << 
+         /ca 1.0000
+         /CA 1.0000
+         /BM /Normal
+         /AIS false
+      >>
+   >>
+endobj
+8 0 obj
+   << 
+      /ProcSet 9 0 R
+      /ExtGState 11 0 R
+   >>
+endobj
+xref
+0 12
+0000000000 65535 f 
+0000000015 00000 n 
+0000000323 00000 n 
+0000042872 00000 n 
+0000000453 00000 n 
+0000000529 00000 n 
+0000000617 00000 n 
+0000042848 00000 n 
+0000043326 00000 n 
+0000043042 00000 n 
+0000043081 00000 n 
+0000043183 00000 n 
+trailer
+<< 
+   /Size 12
+   /Root 2 0 R
+   /Info 1 0 R
+>>
+startxref
+43399
+%%EOF
index 06c4b41..07f2983 100644 (file)
@@ -128,6 +128,7 @@ olsr_socket_remove(struct olsr_socket_entry *entry)
  */
 void
 olsr_socket_stop_scheduler(void) {
+  // TODO: invert, lets call olsr_cfg function instead of setting the variable here
   _stop_scheduler = true;
 }
 
index 73d2561..26ca2cd 100644 (file)
 
 #include "core/olsr_logging.h"
 #include "core/olsr_class.h"
-#include "core/olsr_plugins.h"
 #include "core/olsr_stream_socket.h"
 #include "core/olsr_timer.h"
 #include "core/olsr_subsystem.h"
 
-#include "tools/olsr_cfg.h"
 #include "tools/olsr_telnet.h"
 
 /* static function prototypes */
@@ -82,7 +80,6 @@ static enum olsr_telnet_result _cb_telnet_echo(struct olsr_telnet_data *data);
 static enum olsr_telnet_result _cb_telnet_repeat(struct olsr_telnet_data *data);
 static enum olsr_telnet_result _cb_telnet_timeout(struct olsr_telnet_data *data);
 static enum olsr_telnet_result _cb_telnet_version(struct olsr_telnet_data *data);
-static enum olsr_telnet_result _cb_telnet_plugin(struct olsr_telnet_data *data);
 
 /* configuration of telnet server */
 static struct cfg_schema_entry telnet_entries[] = {
@@ -117,9 +114,7 @@ static struct olsr_telnet_command _builtin[] = {
   TELNET_CMD("timeout", _cb_telnet_timeout,
       "timeout <seconds> :Sets telnet session timeout"),
   TELNET_CMD("version", _cb_telnet_version, "Displays version of the program"),
-  TELNET_CMD("plugin", _cb_telnet_plugin,
-        "control plugins dynamically, parameters are 'list',"
-        "'load <plugin>' and 'unload <plugin>'"),
+
 };
 
 /* subsystem definition */
@@ -744,68 +739,3 @@ _cb_telnet_version(struct olsr_telnet_data *data) {
   olsr_log_printversion(data->out);
   return TELNET_RESULT_ACTIVE;
 }
-
-/**
- * Telnet command 'plugin'
- * @param data pointer to telnet data
- * @return telnet command result
- */
-static enum olsr_telnet_result
-_cb_telnet_plugin(struct olsr_telnet_data *data) {
-  struct oonf_subsystem *plugin;
-  const char *plugin_name = NULL;
-
-  if (data->parameter == NULL || strcasecmp(data->parameter, "list") == 0) {
-    abuf_puts(data->out, "Plugins:\n");
-
-    avl_for_each_element(&olsr_plugin_tree, plugin, _node) {
-      abuf_appendf(data->out, "\t%s\n", plugin->name);
-    }
-    return TELNET_RESULT_ACTIVE;
-  }
-
-  plugin_name = strchr(data->parameter, ' ');
-  if (plugin_name == NULL) {
-    abuf_appendf(data->out, "Error, missing or unknown parameter\n");
-  }
-
-  /* skip whitespaces */
-  while (isspace(*plugin_name)) {
-    plugin_name++;
-  }
-
-  plugin = olsr_plugins_get(plugin_name);
-  if (str_hasnextword(data->parameter, "load") == NULL) {
-    if (plugin != NULL) {
-      abuf_appendf(data->out, "Plugin %s already loaded\n", plugin_name);
-      return TELNET_RESULT_ACTIVE;
-    }
-    plugin = olsr_plugins_load(plugin_name);
-    if (plugin != NULL) {
-      abuf_appendf(data->out, "Plugin %s successfully loaded\n", plugin_name);
-    }
-    else {
-      abuf_appendf(data->out, "Could not load plugin %s\n", plugin_name);
-    }
-    return TELNET_RESULT_ACTIVE;
-  }
-
-  if (plugin == NULL) {
-    abuf_appendf(data->out, "Error, could not find plugin '%s'.\n", plugin_name);
-    return TELNET_RESULT_ACTIVE;
-  }
-
-  if (str_hasnextword(data->parameter, "unload") == NULL) {
-    if (olsr_plugins_unload(plugin)) {
-      abuf_appendf(data->out, "Could not unload plugin %s\n", plugin_name);
-    }
-    else {
-      abuf_appendf(data->out, "Plugin %s successfully unloaded\n", plugin_name);
-    }
-    return TELNET_RESULT_ACTIVE;
-  }
-
-  abuf_appendf(data->out, "Unknown command '%s %s %s'.\n",
-      data->command, data->parameter, plugin_name);
-  return TELNET_RESULT_ACTIVE;
-}
index be84ef8..6e7c551 100644 (file)
@@ -45,6 +45,7 @@
 #include "common/common_types.h"
 #include "common/avl.h"
 #include "common/list.h"
+#include "common/netaddr.h"
 #include "common/netaddr_acl.h"
 #include "core/olsr_stream_socket.h"
 
index 0b58ec2..76bde15 100644 (file)
@@ -1,5 +1,6 @@
 # add subdirectories
 add_subdirectory(cfgparser_compact)
 add_subdirectory(cfgio_file)
-add_subdirectory(remotecontrol)
 add_subdirectory(httptelnet)
+add_subdirectory(plugin_controller)
+add_subdirectory(remotecontrol)
index 5a72f9e..0fac92c 100644 (file)
 
 #include "common/common_types.h"
 #include "common/autobuf.h"
-
+#include "common/netaddr.h"
+#include "common/netaddr_acl.h"
 #include "config/cfg_schema.h"
-
 #include "core/olsr_logging.h"
 #include "core/olsr_plugins.h"
 #include "core/olsr_subsystem.h"
-
 #include "tools/olsr_cfg.h"
 #include "tools/olsr_http.h"
 #include "tools/olsr_telnet.h"
diff --git a/src-plugins/plugin_controller/CMakeLists.txt b/src-plugins/plugin_controller/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6193667
--- /dev/null
@@ -0,0 +1,5 @@
+# set library parameters
+SET (source "plugin_controller.c")
+
+# use generic plugin maker
+oonf_create_plugin("plugin_controller" ${source} "" false)
diff --git a/src-plugins/plugin_controller/plugin_controller.c b/src-plugins/plugin_controller/plugin_controller.c
new file mode 100644 (file)
index 0000000..c1d531b
--- /dev/null
@@ -0,0 +1,196 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004-2013, the olsr.org team - see HISTORY file
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#include "common/common_types.h"
+#include "common/autobuf.h"
+#include "common/netaddr.h"
+#include "common/netaddr_acl.h"
+#include "config/cfg_schema.h"
+#include "core/olsr_logging.h"
+#include "core/olsr_plugins.h"
+#include "core/olsr_subsystem.h"
+
+#include "tools/olsr_cfg.h"
+#include "tools/olsr_telnet.h"
+
+#include "plugin_controller/plugin_controller.h"
+
+/* definitions */
+struct _acl_config {
+  struct netaddr_acl acl;
+};
+
+/* prototypes */
+static int _init(void);
+static void _cleanup(void);
+
+static enum olsr_telnet_result _cb_telnet_plugin(struct olsr_telnet_data *data);
+static void _cb_config_changed(void);
+
+struct olsr_telnet_command _telnet_commands[] = {
+  TELNET_CMD("plugin", _cb_telnet_plugin,
+        "control plugins dynamically, parameters are 'list',"
+        "'load <plugin>' and 'unload <plugin>'"),
+};
+
+/* configuration */
+static struct cfg_schema_entry _plugin_controller_entries[] = {
+  CFG_MAP_ACL(_acl_config, acl, "acl", "+127.0.0.1 " ACL_DEFAULT_REJECT, "acl for plugin controller"),
+};
+
+static struct cfg_schema_section _plugin_controller_section = {
+  .type = OONF_PLUGIN_GET_NAME(),
+  .cb_delta_handler = _cb_config_changed,
+  .entries = _plugin_controller_entries,
+  .entry_count = ARRAYSIZE(_plugin_controller_entries),
+};
+
+struct _acl_config _config;
+
+/* plugin declaration */
+struct oonf_subsystem oonf_plugin_controller_subsystem = {
+  .name = OONF_PLUGIN_GET_NAME(),
+  .descr = "OLSRD plugin controller plugin",
+  .author = "Henning Rogge",
+
+  .cfg_section = &_plugin_controller_section,
+
+  .init = _init,
+  .cleanup = _cleanup,
+};
+DECLARE_OONF_PLUGIN(oonf_plugin_controller_subsystem);
+
+/**
+ * Constructor of plugin
+ * @return 0 if initialization was successful, -1 otherwise
+ */
+static int
+_init(void) {
+  netaddr_acl_add(&_config.acl);
+  _telnet_commands[0].acl = &_config.acl;
+
+  olsr_telnet_add(&_telnet_commands[0]);
+  return 0;
+}
+
+/**
+ * Destructor of plugin
+ */
+static void
+_cleanup(void) {
+  olsr_telnet_remove(&_telnet_commands[0]);
+  netaddr_acl_remove(&_config.acl);
+}
+
+/**
+ * Telnet command 'plugin'
+ * @param data pointer to telnet data
+ * @return telnet command result
+ */
+static enum olsr_telnet_result
+_cb_telnet_plugin(struct olsr_telnet_data *data) {
+  struct oonf_subsystem *plugin;
+  const char *plugin_name = NULL;
+
+  if (data->parameter == NULL || strcasecmp(data->parameter, "list") == 0) {
+    abuf_puts(data->out, "Plugins:\n");
+
+    avl_for_each_element(&olsr_plugin_tree, plugin, _node) {
+      abuf_appendf(data->out, "\t%s\n", plugin->name);
+    }
+    return TELNET_RESULT_ACTIVE;
+  }
+
+  plugin_name = strchr(data->parameter, ' ');
+  if (plugin_name == NULL) {
+    abuf_appendf(data->out, "Error, missing or unknown parameter\n");
+  }
+
+  /* skip whitespaces */
+  while (isspace(*plugin_name)) {
+    plugin_name++;
+  }
+
+  plugin = olsr_plugins_get(plugin_name);
+  if (str_hasnextword(data->parameter, "load") == NULL) {
+    if (plugin != NULL) {
+      abuf_appendf(data->out, "Plugin %s already loaded\n", plugin_name);
+      return TELNET_RESULT_ACTIVE;
+    }
+    plugin = olsr_plugins_load(plugin_name);
+    if (plugin != NULL) {
+      abuf_appendf(data->out, "Plugin %s successfully loaded\n", plugin_name);
+    }
+    else {
+      abuf_appendf(data->out, "Could not load plugin %s\n", plugin_name);
+    }
+    return TELNET_RESULT_ACTIVE;
+  }
+
+  if (plugin == NULL) {
+    abuf_appendf(data->out, "Error, could not find plugin '%s'.\n", plugin_name);
+    return TELNET_RESULT_ACTIVE;
+  }
+
+  if (str_hasnextword(data->parameter, "unload") == NULL) {
+    if (olsr_plugins_unload(plugin)) {
+      abuf_appendf(data->out, "Could not unload plugin %s\n", plugin_name);
+    }
+    else {
+      abuf_appendf(data->out, "Plugin %s successfully unloaded\n", plugin_name);
+    }
+    return TELNET_RESULT_ACTIVE;
+  }
+
+  abuf_appendf(data->out, "Unknown command '%s %s %s'.\n",
+      data->command, data->parameter, plugin_name);
+  return TELNET_RESULT_ACTIVE;
+}
+
+/**
+ * Handler for configuration changes
+ */
+static void
+_cb_config_changed(void) {
+  /* generate binary config */
+  cfg_schema_tobin(&_config, _plugin_controller_section.post,
+      _plugin_controller_entries, ARRAYSIZE(_plugin_controller_entries));
+}
diff --git a/src-plugins/plugin_controller/plugin_controller.h b/src-plugins/plugin_controller/plugin_controller.h
new file mode 100644 (file)
index 0000000..58df40a
--- /dev/null
@@ -0,0 +1,51 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon(olsrd)
+ * Copyright (c) 2004-2013, the olsr.org team - see HISTORY file
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifndef PLUGIN_CONTROLLER_H_
+#define PLUGIN_CONTROLLER_H_
+
+
+#include "common/common_types.h"
+#include "core/olsr_subsystem.h"
+
+EXPORT extern struct oonf_subsystem oonf_plugin_controller_subsystem;
+
+#endif /* PLUGIN_CONTROLLER_H_ */