aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-04-12 01:54:16 +0800
committer魏曹先生 <1992414357@qq.com>2026-04-12 01:54:16 +0800
commit21bb211dca7ae7428a257e4006e54c10b97f8867 (patch)
treefb660cf29dd1419066b7430370cfb5d84ed6cb40
parent4867dae1235040455624ea792557c72fe7a9b6bf (diff)
Add architecture diagram to README
-rw-r--r--README.md9
-rw-r--r--res/graph.drawio221
-rw-r--r--res/graph.pngbin0 -> 69856 bytes
3 files changed, 230 insertions, 0 deletions
diff --git a/README.md b/README.md
index 931f12b..a1b6f40 100644
--- a/README.md
+++ b/README.md
@@ -97,6 +97,15 @@ Mingling abstracts command execution into the following parts:
3. **Renderer** - Stops the chain and prints the currently processed type to the terminal.
4. **Program** - Manages the lifecycle and configuration of the entire CLI application.
+<details>
+ <summary>Architecture Diagram</summary>
+ <p align="center">
+ <a href="https://github.com/CatilGrass/mingling">
+ <img alt="Mingling" src="res/graph.png" width="75%">
+ </a>
+ </p>
+</details>
+
## Project Structure
The Mingling project consists of two main parts:
diff --git a/res/graph.drawio b/res/graph.drawio
new file mode 100644
index 0000000..47ac9f4
--- /dev/null
+++ b/res/graph.drawio
@@ -0,0 +1,221 @@
+<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/29.6.6 Chrome/144.0.7559.236 Electron/40.8.4 Safari/537.36" version="29.6.6">
+ <diagram name="第 1 页" id="CLQgZkV-SbJ_8hXwUYFR">
+ <mxGraphModel dx="705" dy="877" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-26" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-21">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-3" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-2">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-11" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-3" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Match" vertex="1">
+ <mxGeometry relative="1" x="-0.3491" as="geometry">
+ <mxPoint y="14" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-1" parent="1" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" value="User Input" vertex="1">
+ <mxGeometry height="40" width="120" x="240" y="80" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-7" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-4">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-8" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-5">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-15" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-8" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Dispatch" vertex="1">
+ <mxGeometry relative="1" x="-0.4532" as="geometry">
+ <mxPoint y="-9" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-9" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-6">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;gradientColor=#ea6b66;" value="Dispatchers" vertex="1">
+ <mxGeometry height="40" width="120" x="240" y="200" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-22" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-16">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-45" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-22" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Chain" vertex="1">
+ <mxGeometry relative="1" x="-0.2067" y="1" as="geometry">
+ <mxPoint as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="EntryA" vertex="1">
+ <mxGeometry height="50" width="70" x="135" y="310" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-24" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-17">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-46" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-24" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Chain" vertex="1">
+ <mxGeometry relative="1" x="-0.2733" y="1" as="geometry">
+ <mxPoint x="-1" y="2" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-5" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="EntryB" vertex="1">
+ <mxGeometry height="50" width="70" x="230" y="310" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-27" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="T62yhzIGDhOwbh_DlgYY-18">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-47" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-27" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Chain" vertex="1">
+ <mxGeometry relative="1" x="-0.2067" y="-1" as="geometry">
+ <mxPoint x="1" y="1" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-34" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-32">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-51" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-34" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Chain" vertex="1">
+ <mxGeometry relative="1" x="0.202" y="-10" as="geometry">
+ <mxPoint as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-6" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="EntryC" vertex="1">
+ <mxGeometry height="50" width="70" x="325" y="310" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-23" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="170" y="450" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-16" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="NextA1" vertex="1">
+ <mxGeometry height="50" width="70" x="135" y="410" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-25" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-21">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-49" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-25" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBorderColor=none;labelBackgroundColor=default;" value="Route Chain" vertex="1">
+ <mxGeometry relative="1" x="-0.2451" y="3" as="geometry">
+ <mxPoint x="43" y="1" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-17" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="NextB1" vertex="1">
+ <mxGeometry height="50" width="70" x="230" y="410" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-18" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="NextC1" vertex="1">
+ <mxGeometry height="50" width="70" x="325" y="410" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-29" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-28">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="170" y="500" as="sourcePoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-48" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-29" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Chain" vertex="1">
+ <mxGeometry relative="1" x="-0.1822" as="geometry">
+ <mxPoint y="5" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-39" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-36">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-53" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-39" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Renderer" vertex="1">
+ <mxGeometry relative="1" x="-0.2327" as="geometry">
+ <mxPoint y="2" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-21" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="ResultB" vertex="1">
+ <mxGeometry height="50" width="70" x="325" y="535" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-38" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-35">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-52" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-38" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Renderer" vertex="1">
+ <mxGeometry relative="1" x="-0.1347" y="1" as="geometry">
+ <mxPoint as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-28" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="ResultA" vertex="1">
+ <mxGeometry height="50" width="70" x="135" y="535" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-40" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-37">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-54" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-40" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Route Renderer" vertex="1">
+ <mxGeometry relative="1" x="-0.3306" y="2" as="geometry">
+ <mxPoint x="-2" y="3" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-32" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;gradientColor=#97d077;strokeColor=#82b366;" value="ResultC" vertex="1">
+ <mxGeometry height="50" width="70" x="445" y="535" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-42" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-41">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-55" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-42" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Render" vertex="1">
+ <mxGeometry relative="1" x="-0.2875" y="12" as="geometry">
+ <mxPoint x="-29" y="-38" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-35" parent="1" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;" value="RendererA" vertex="1">
+ <mxGeometry height="80" width="80" x="130" y="620" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-43" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;curved=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="T62yhzIGDhOwbh_DlgYY-41">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="300" y="790" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-56" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-43" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Render" vertex="1">
+ <mxGeometry relative="1" x="-0.5734" y="-11" as="geometry">
+ <mxPoint x="11" y="-28" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-36" parent="1" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;" value="RendererB" vertex="1">
+ <mxGeometry height="80" width="80" x="320" y="620" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-44" edge="1" parent="1" source="T62yhzIGDhOwbh_DlgYY-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" target="T62yhzIGDhOwbh_DlgYY-41">
+ <mxGeometry relative="1" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-57" connectable="0" parent="T62yhzIGDhOwbh_DlgYY-44" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Render" vertex="1">
+ <mxGeometry relative="1" x="-0.2885" y="-5" as="geometry">
+ <mxPoint x="47" y="-45" as="offset" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-37" parent="1" style="ellipse;whiteSpace=wrap;html=1;fillColor=#fff2cc;gradientColor=#ffd966;strokeColor=#d6b656;" value="RendererC" vertex="1">
+ <mxGeometry height="80" width="80" x="440" y="620" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-41" parent="1" style="shape=process;whiteSpace=wrap;html=1;backgroundOutline=1;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" value="Output" vertex="1">
+ <mxGeometry height="40" width="120" x="240" y="820" as="geometry" />
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-59" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;" value="">
+ <mxGeometry height="50" relative="1" width="50" as="geometry">
+ <mxPoint x="560" y="280" as="sourcePoint" />
+ <mxPoint x="80" y="280" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-60" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;" value="">
+ <mxGeometry height="50" relative="1" width="50" as="geometry">
+ <mxPoint x="560" y="60" as="sourcePoint" />
+ <mxPoint x="80" y="60" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-61" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;" value="">
+ <mxGeometry height="50" relative="1" width="50" as="geometry">
+ <mxPoint x="560" y="760" as="sourcePoint" />
+ <mxPoint x="80" y="760" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-62" edge="1" parent="1" style="endArrow=none;html=1;rounded=0;" value="">
+ <mxGeometry height="50" relative="1" width="50" as="geometry">
+ <mxPoint x="80" y="880" as="sourcePoint" />
+ <mxPoint x="80" y="60" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-63" edge="1" parent="1" style="endArrow=none;html=1;rounded=0;" value="">
+ <mxGeometry height="50" relative="1" width="50" as="geometry">
+ <mxPoint x="560" y="880" as="sourcePoint" />
+ <mxPoint x="560" y="60" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="T62yhzIGDhOwbh_DlgYY-64" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;rounded=0;" value="">
+ <mxGeometry height="50" relative="1" width="50" as="geometry">
+ <mxPoint x="560" y="880" as="sourcePoint" />
+ <mxPoint x="80" y="880" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/res/graph.png b/res/graph.png
new file mode 100644
index 0000000..c942f02
--- /dev/null
+++ b/res/graph.png
Binary files differ