aboutsummaryrefslogtreecommitdiffhomepage
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/2023-01-14-xpost-matcha-threads/gen-svg.sh3
-rw-r--r--content/2023-01-14-xpost-matcha-threads/index.md (renamed from content/2023-01-14-xpost-matcha-threads.md)18
-rw-r--r--content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio184
-rw-r--r--content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg3
-rw-r--r--content/2023-05-24-openwrt-migrate-to-dsa/gen-svg.sh3
-rw-r--r--content/2023-05-24-openwrt-migrate-to-dsa/home-nw.svg3
-rw-r--r--content/2023-09-01-cas-llsc-aba/gen-svg.sh5
-rw-r--r--content/2023-09-01-cas-llsc-aba/list-abc.svg3
-rw-r--r--content/2023-09-01-cas-llsc-aba/list-ac.svg3
-rw-r--r--content/2023-09-01-cas-llsc-aba/list-b.svg3
-rw-r--r--content/2024-04-24-fn-wrapper-macro-magic/Makefile11
-rw-r--r--content/2024-04-24-fn-wrapper-macro-magic/index.md202
-rw-r--r--content/2024-04-24-fn-wrapper-macro-magic/wrap-v1.cc19
-rw-r--r--content/2024-04-24-fn-wrapper-macro-magic/wrap-v2.cc14
-rw-r--r--content/2024-04-24-fn-wrapper-macro-magic/wrap-v3.cc30
-rw-r--r--content/2024-04-24-fn-wrapper-macro-magic/wrap-v4.cc47
16 files changed, 543 insertions, 8 deletions
diff --git a/content/2023-01-14-xpost-matcha-threads/gen-svg.sh b/content/2023-01-14-xpost-matcha-threads/gen-svg.sh
new file mode 100644
index 0000000..365e243
--- /dev/null
+++ b/content/2023-01-14-xpost-matcha-threads/gen-svg.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+drawio -x -f svg -t --svg-theme dark -o os-vs-user-threads.svg os-vs-user-threads.drawio
diff --git a/content/2023-01-14-xpost-matcha-threads.md b/content/2023-01-14-xpost-matcha-threads/index.md
index 9500300..3456b09 100644
--- a/content/2023-01-14-xpost-matcha-threads.md
+++ b/content/2023-01-14-xpost-matcha-threads/index.md
@@ -66,6 +66,24 @@ Implementations for different ISAs are available here:
- [armv7a][yield-arm]
- [riscv64][yield-rv64]
+## Appendix: os-level vs user-level threading
+
+The figure below depicts *os-level* threading (left) vs *user-level* threading
+(right).
+
+The main difference is that in the case of user-level threading, the operating
+system (os) does not now anything about the user threads. In the concrete
+example, only a **single** user thread can run at any given time, whereas in
+the case of os-level threading, all threads can run truly parallel.
+
+When a user-level thread is scheduled, the *stack-pointer* (sp) of the os
+thread is adjusted to the user threads' stack. For the example below, if the
+user thread **A** is scheduled (yielded to), the stack-pointer for the os
+thread **S** is switched to the **stack A**. Once the user thread yields back
+to the scheduler, the stack-pointer is switched back to **stack S**.
+
+<img src="os-vs-user-threads.svg">
+
[matcha]: https://github.com/johannst/matcha-threads
[yield-x86]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/x86_64/yield.s
[yield-arm]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/arm/yield.s
diff --git a/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio
new file mode 100644
index 0000000..d927873
--- /dev/null
+++ b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.drawio
@@ -0,0 +1,184 @@
+<mxfile host="Electron" modified="2024-04-28T17:23:14.014Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/23.1.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="TuK57NxBkEhxkh0WYATU" version="23.1.5" type="device">
+ <diagram name="Page-1" id="eupsqoG42ICuPfNcTmHv">
+ <mxGraphModel dx="231" dy="139" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="6WErTb2tg34p5fqduLaV-2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="290" width="120" height="260" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-3" value="&lt;font&gt;process address space&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="360" y="250" width="120" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-7" value="stack A" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50fa7b;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="320" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-8" value="stack B" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="400" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-9" value="stack C" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="360" y="480" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-17" value="" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="290" width="120" height="260" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-18" value="&lt;font&gt;process address space&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="820" y="250" width="120" height="30" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-20" value="stack S" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#ffffff;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="500" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-21" value="stack A" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50FA7B;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="320" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-22" value="stack C" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="440" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-23" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;user thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=bottom;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="560" y="410" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-28" value="stack B" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="820" y="380" width="120" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-29" value="&lt;font&gt;thread&lt;br&gt;S&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#ffffff;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="500" width="220" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-30" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="560" y="540" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-31" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;user thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=bottom;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="640" y="410" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-32" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;user thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=bottom;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="720" y="410" width="60" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-38" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" target="6WErTb2tg34p5fqduLaV-19" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="570" y="500" as="sourcePoint" />
+ <mxPoint x="570" y="470" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-39" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="609.9985074626868" y="460" as="sourcePoint" />
+ <mxPoint x="609.9985074626868" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-41" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;yield&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="575" y="470" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-42" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="649.89" y="500" as="sourcePoint" />
+ <mxPoint x="649.89" y="460" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-43" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="689.8885074626868" y="460" as="sourcePoint" />
+ <mxPoint x="689.8885074626868" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-44" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;yield&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="654.89" y="470" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-45" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="729.89" y="500" as="sourcePoint" />
+ <mxPoint x="729.89" y="460" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-46" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0.167;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;endFill=1;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="769.8885074626868" y="460" as="sourcePoint" />
+ <mxPoint x="769.8885074626868" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-47" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;yield&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="734.89" y="470" width="30" height="20" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-19" value="&lt;font&gt;thread&lt;br&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50fa7b;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="560" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-24" value="&lt;font&gt;thread&lt;br&gt;B&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="640" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-26" value="&lt;font&gt;thread&lt;br&gt;C&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="720" y="420" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-51" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="6WErTb2tg34p5fqduLaV-5" target="6WErTb2tg34p5fqduLaV-7" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="659.9985074626868" y="370" as="sourcePoint" />
+ <mxPoint x="659.9985074626868" y="410" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-52" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="420" as="sourcePoint" />
+ <mxPoint x="360" y="420" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-53" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="320" y="500" as="sourcePoint" />
+ <mxPoint x="360" y="500" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-5" value="&lt;font&gt;thread&lt;br&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#50fa7b;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="260" y="320" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-10" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="260" y="360" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-11" value="&lt;font&gt;thread&lt;br&gt;B&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#55FFFF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="260" y="400" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-12" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="260" y="440" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-13" value="&lt;font&gt;thread&lt;br&gt;C&lt;br&gt;&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=monospace;strokeColor=#FF55FF;fillColor=none;" parent="1" vertex="1">
+ <mxGeometry x="260" y="480" width="60" height="40" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-14" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;OS thread&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="260" y="520" width="50" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-54" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="320" y="340" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-55" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="320" y="420" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-56" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="320" y="500" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-59" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;" parent="1" vertex="1">
+ <mxGeometry x="780" y="520" width="20" height="10" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-60" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;fillColor=#76608a;strokeColor=#B3B3B3;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="520" y="560" as="sourcePoint" />
+ <mxPoint x="520" y="240" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="iekysqo_5NKT5N1MqhNL-1" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;dashed=1;strokeColor=#50FA7B;" parent="1" source="6WErTb2tg34p5fqduLaV-59" target="6WErTb2tg34p5fqduLaV-21" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="790" y="530" as="sourcePoint" />
+ <mxPoint x="830" y="530" as="targetPoint" />
+ <Array as="points">
+ <mxPoint x="800" y="340" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="iekysqo_5NKT5N1MqhNL-2" value="&lt;font size=&quot;1&quot;&gt;&lt;i style=&quot;font-size: 8px;&quot;&gt;sp when yielding to A&lt;/i&gt;&lt;/font&gt;" style="text;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=monospace;horizontal=0;" parent="1" vertex="1">
+ <mxGeometry x="800" y="390" width="10" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="6WErTb2tg34p5fqduLaV-58" value="" style="endArrow=blockThin;html=1;rounded=0;startSize=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endFill=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <mxPoint x="780" y="520" as="sourcePoint" />
+ <mxPoint x="820" y="520" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg
new file mode 100644
index 0000000..4ce2798
--- /dev/null
+++ b/content/2023-01-14-xpost-matcha-threads/os-vs-user-threads.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="681px" height="323px" viewBox="-0.5 -0.5 681 323"><defs/><g><rect x="100" y="51" width="120" height="260" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="100" y="11" width="120" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 26px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>process address space</font></div></div></div></foreignObject><text x="160" y="30" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">process address space</text></switch></g><rect x="100" y="81" width="120" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 101px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack A</div></div></div></foreignObject><text x="160" y="105" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack A</text></switch></g><rect x="100" y="161" width="120" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 181px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack B</div></div></div></foreignObject><text x="160" y="185" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack B</text></switch></g><rect x="100" y="241" width="120" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 261px; margin-left: 101px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack C</div></div></div></foreignObject><text x="160" y="265" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack C</text></switch></g><rect x="560" y="51" width="120" height="260" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><rect x="560" y="11" width="120" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 26px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>process address space</font></div></div></div></foreignObject><text x="620" y="30" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">process address space</text></switch></g><rect x="560" y="261" width="120" height="40" fill="none" stroke="#ffffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 281px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack S</div></div></div></foreignObject><text x="620" y="285" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack S</text></switch></g><rect x="560" y="81" width="120" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 101px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack A</div></div></div></foreignObject><text x="620" y="105" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack A</text></switch></g><rect x="560" y="201" width="120" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 221px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack C</div></div></div></foreignObject><text x="620" y="225" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack C</text></switch></g><rect x="300" y="171" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 178px; margin-left: 302px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">user thread</i></font></div></div></div></foreignObject><text x="302" y="178" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">user thread</text></switch></g><rect x="560" y="141" width="120" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 161px; margin-left: 561px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">stack B</div></div></div></foreignObject><text x="620" y="165" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">stack B</text></switch></g><rect x="300" y="261" width="220" height="40" fill="none" stroke="#ffffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 218px; height: 1px; padding-top: 281px; margin-left: 301px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />S<br /></font></div></div></div></foreignObject><text x="410" y="285" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="300" y="301" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 306px; margin-left: 302px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="302" y="310" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="380" y="171" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 178px; margin-left: 382px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">user thread</i></font></div></div></div></foreignObject><text x="382" y="178" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">user thread</text></switch></g><rect x="460" y="171" width="60" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 178px; margin-left: 462px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">user thread</i></font></div></div></div></foreignObject><text x="462" y="178" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">user thread</text></switch></g><path d="M 310 261 L 310.02 229.12" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 310.02 222.12 L 312.35 229.12 L 307.68 229.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 350 221 L 350 252.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 350 259.88 L 347.67 252.88 L 352.33 252.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="315" y="231" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 241px; margin-left: 316px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">yield</i></font></div></div></div></foreignObject><text x="330" y="245" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">yield</text></switch></g><path d="M 389.89 261 L 389.89 229.12" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 389.89 222.12 L 392.22 229.12 L 387.56 229.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 429.89 221 L 429.89 252.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 429.89 259.88 L 427.56 252.88 L 432.22 252.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="394.89" y="231" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 241px; margin-left: 396px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">yield</i></font></div></div></div></foreignObject><text x="410" y="245" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">yield</text></switch></g><path d="M 469.89 261 L 469.89 229.12" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 469.89 222.12 L 472.22 229.12 L 467.56 229.12 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 509.89 221 L 509.89 252.88" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 509.89 259.88 L 507.56 252.88 L 512.22 252.88 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="474.89" y="231" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 241px; margin-left: 476px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">yield</i></font></div></div></div></foreignObject><text x="490" y="245" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">yield</text></switch></g><rect x="300" y="181" width="60" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 201px; margin-left: 301px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />A</font></div></div></div></foreignObject><text x="330" y="205" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="380" y="181" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 201px; margin-left: 381px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />B<br /></font></div></div></div></foreignObject><text x="410" y="205" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="460" y="181" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 201px; margin-left: 461px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />C<br /></font></div></div></div></foreignObject><text x="490" y="205" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><path d="M 60 101 L 91.88 101" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 101 L 91.88 103.33 L 91.88 98.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 60 181 L 91.88 181" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 181 L 91.88 183.33 L 91.88 178.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 60 261 L 91.88 261" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.88 261 L 91.88 263.33 L 91.88 258.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="81" width="60" height="40" fill="none" stroke="#50fa7b" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 101px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />A</font></div></div></div></foreignObject><text x="30" y="105" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="0" y="121" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 126px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="2" y="130" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="0" y="161" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 181px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />B<br /></font></div></div></div></foreignObject><text x="30" y="185" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="0" y="201" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 206px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="2" y="210" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="0" y="241" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 261px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>thread<br />C<br /></font></div></div></div></foreignObject><text x="30" y="265" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">thread...</text></switch></g><rect x="0" y="281" width="50" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 48px; height: 1px; padding-top: 286px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">OS thread</i></font></div></div></div></foreignObject><text x="2" y="290" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">OS thread</text></switch></g><rect x="60" y="101" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 106px; margin-left: 62px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="62" y="110" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><rect x="60" y="181" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 186px; margin-left: 62px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="62" y="190" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><rect x="60" y="261" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 266px; margin-left: 62px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="62" y="270" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><rect x="520" y="281" width="20" height="10" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 18px; height: 1px; padding-top: 286px; margin-left: 522px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp</i></font></div></div></div></foreignObject><text x="522" y="290" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp</text></switch></g><path d="M 260 321 L 260 1" fill="none" stroke="#b3b3b3" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="2 6" pointer-events="stroke"/><path d="M 540 281 L 540 101 L 551.88 101" fill="none" stroke="#50fa7b" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 558.88 101 L 551.88 103.33 L 551.88 98.67 Z" fill="#50fa7b" stroke="#50fa7b" stroke-miterlimit="10" pointer-events="all"/><rect x="540" y="151" width="10" height="120" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 545 269)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 118px; height: 1px; padding-top: 269px; margin-left: 545px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font size="1"><i style="font-size: 8px;">sp when yielding to A</i></font></div></div></div></foreignObject><text x="545" y="273" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">sp when yielding to A</text></switch></g><path d="M 520 281 L 551.88 281" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 558.88 281 L 551.88 283.33 L 551.88 278.67 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2023-05-24-openwrt-migrate-to-dsa/gen-svg.sh b/content/2023-05-24-openwrt-migrate-to-dsa/gen-svg.sh
new file mode 100644
index 0000000..ca15382
--- /dev/null
+++ b/content/2023-05-24-openwrt-migrate-to-dsa/gen-svg.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+drawio -x -f svg -t --svg-theme dark -o home-nw.svg home-nw.drawio
diff --git a/content/2023-05-24-openwrt-migrate-to-dsa/home-nw.svg b/content/2023-05-24-openwrt-migrate-to-dsa/home-nw.svg
index 484511a..e0fb864 100644
--- a/content/2023-05-24-openwrt-migrate-to-dsa/home-nw.svg
+++ b/content/2023-05-24-openwrt-migrate-to-dsa/home-nw.svg
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than diagrams.net -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="481px" height="332px" viewBox="-0.5 -0.5 481 332" content="&lt;mxfile host=&quot;Electron&quot; modified=&quot;2023-07-17T20:59:29.082Z&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.8 Chrome/112.0.5615.165 Electron/24.2.0 Safari/537.36&quot; etag=&quot;rZiMTV4ibdji0EE0oQ0z&quot; version=&quot;21.2.8&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;QeHWJlUOV-UGDBzk2ikC&quot;&gt;7Vptc9o4EP41zNx9gLEt24GPQEJyc0kvc7RJ0y83ChZGibFcWQTorz8JS/hF4i2NE5I2mQG8ltfrZx+tVrtugP50cU5hMrkiAYoajhUsGuC04Tiddod/CsEyE3gdNxOEFAeZyM4FQ/wDSaElpTMcoLQ0kBESMZyUhSMSx2jESjJIKZmXh41JVL5rAkOkCYYjGOnSWxywSSZte1Yuv0A4nKg725Y8M4VqsBSkExiQeUEEzhqgTwlh2a/poo8igZ3CJbtusOHs2jCKYrbPBS74vEyHX5sXT+Hf4XX7zlom35u2l6l5gtFMPrG0li0VBJTM4gAJLVYD9AhlExKSGEaXhCRcaHPhA2JsKZ0HZ4xw0YRNI3mWG0iXX8X1LbfjK8HdStDx1iNOF/IW2dGyeHSNKJ4ihqgUrsEUBw+zaTKU9sYkRuI8g5R1hf+5bBTBNMUjJR7gaG3ZArPMME8e3am78t+5QeJA2TMmMRvAKY6EYEpikiZwJO6pO0T6KCUzOkJbvODIOcGtCxHb5i45EAUl1kqHnyPCMaJLPoCiCDL8VCYxlHMhXI9bX3pNMDfaseS09XxJWjlrHcV3pSJ7JHlVkXQ7FNmdiqLskTVF/EfheXLRitOH8NvV+P1XzGkUI6bxnKvjUQVl7ErQijhkxrX35hPM0DBz8+mcx7kyv58QZZiHjG6Ew1iQAgeBUNqL4D2KenD0GK7mUJ9EhOYc3UikMSdoZWzKKHlEShigMZxFbBvnhE1osZUjykVWxUUq9M7zeGerIDYpxLq2tZlWJT8e6jR1s4LTujdXXHACfGt4uSNA7XDWIai/ALpuuzKT2gZ0/VdFV58S3dN3hqrnVlD1dVRdA6hObaD6GqiX3U+71tJng8pPKFAbDhgMPG8wqA9spww2eHOwT0xgg48Btn9sYLdNYLuvA7aAukawfevIwAaGlY+OJjztdaz+ybsK0Y51bAsfAB83RjvusTFZzzI+TIx22scGtr6Lf70YXTPY4NiyD6BnHxrQES7s2lTdyOWSAFM0YpiIbSLfQwt5EfOkUOa45/vGew5jofTRS8Q+efVAXq/hnYpyzIyJm/XX5a/nlSgOIL8qGam47hriusEf7gv4o39x+7nZTb6R8290Oj6fW+HivKln3r+SOwA4Mnfo6WLD8Ve1CgFDQ1RqVejwv89IVsQA49VfUeSH4vsWjzG/pnHSF59SEbcr05WN2U+/55n0X/xzdbZRbYVF3COszA8oCz4RGrNtdSCKUvwD3q8UWUbeiKJpmtVPba3co+pFenytk1l2tXJhqgtZBmqBuqjV0ahlpMc2HggWmHhw/uVs+Pk3EcwhpprJm4hgijG1EcHWM/my8zPH3fAkiI9idBY/7uvbw1KkV3ZEJRVyHd0R7ZpSIaMfgCnYVwBFcaD6MBKiAoBltMtkL6aW6z5No9ClWfdszH0a0SNRXaG8aXWWS3vcNNkLWveZCs0g1aPa1Z/6uX7QVn7v7AcBiffOflCBIZ6BIUr2k20jjaCe2zpxy1r27Ryto4zK++vrHBl9oBKkF+K2YrB9CIOfycjdzNdmWl5oe0M2O95xsblTYbNVYeC+VHarxZlqN7XmJqiKEuXygHLfM9e+kMIAo7wSsDk3USNPC5utWPBSDldUlS8O1Lp5fcOCr3FuGFoZ26JM/ibD5kDzzKCxOSTUs/gGMJ2sjLblwTVkojHPJTyrsNq/V9byathptf1yOKqm1/uvrJouUC261xyRHGPB8leMSNX3A94+IumF+2OJSNp24KBk6r1HpCPLjqqvDbn2M8NRVRE4qS0WkW7y5fHf6X+LBXiIb7xh+qWJm2rKbixYjqF0oCoa5Y7X6kifEJsT+pgqFfdUnWnuWaHaUamEUxH14vs0WZ2z7I7Tsv12y25x7QMxea0/ZN3Dtv7cUTE93Lod9TN+z9bqX9qimWsQKXOdA8x9x5W6DQuEIXhsrsxWX6p0OtqaYZz6/uGLBj/MX1HOplz+njc4+x8=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><style type="text/css">@import url(https://fonts.googleapis.com/css?family=Architects+Daughter);&#xa;</style></defs><g><path d="M 399.96 143.63 L 399.56 82.45" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 399.99 148.88 L 396.45 141.9 L 399.96 143.63 L 403.45 141.86 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 399.53 77.2 L 403.07 84.18 L 399.56 82.45 L 396.07 84.22 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 370 20 C 346 20 340 40 359.2 44 C 340 52.8 361.6 72 377.2 64 C 388 80 424 80 436 64 C 460 64 460 48 445 40 C 460 24 436 8 415 16 C 400 4 376 4 370 20 Z" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 40px; margin-left: 341px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Internet</div></div></div></foreignObject><text x="400" y="44" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">Internet</text></switch></g><rect x="320" y="170" width="160" height="80" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 210px; margin-left: 321px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">AVM 7360SL</div></div></div></foreignObject><text x="400" y="214" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">AVM 7360SL</text></switch></g><rect x="380" y="150" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 160px; margin-left: 381px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ADSL</div></div></div></foreignObject><text x="400" y="164" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">ADSL</text></switch></g><rect x="360" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 361px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN2</div></div></div></foreignObject><text x="380" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN2</text></switch></g><rect x="400" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 401px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN3</div></div></div></foreignObject><text x="420" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN3</text></switch></g><rect x="440" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 441px;"><div data-drawio-colors="color: #55FFFF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(85, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN4</div></div></div></foreignObject><text x="460" y="264" fill="#55FFFF" font-family="monospace" font-size="12px" text-anchor="middle">LAN4</text></switch></g><rect x="40" y="170" width="160" height="80" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 210px; margin-left: 41px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Archer C7</div></div></div></foreignObject><text x="120" y="214" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">Archer C7</text></switch></g><rect x="80" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 81px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN2</div></div></div></foreignObject><text x="100" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN2</text></switch></g><rect x="120" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 121px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN3</div></div></div></foreignObject><text x="140" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN3</text></switch></g><rect x="160" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 161px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN4</div></div></div></foreignObject><text x="180" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN4</text></switch></g><path d="M 40 150 L 80 150" fill="none" stroke="rgb(240, 240, 240)" stroke-width="4" stroke-miterlimit="10" transform="rotate(90,60,150)" pointer-events="all"/><path d="M 160 150 L 200 150" fill="none" stroke="rgb(240, 240, 240)" stroke-width="4" stroke-miterlimit="10" transform="rotate(90,180,150)" pointer-events="all"/><rect x="20" y="100" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 115px; margin-left: 22px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font color="#ffffff">Wifi | </font><font color="#ff55ff">HOME</font></div></div></div></foreignObject><text x="22" y="119" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Wifi | HOME</text></switch></g><rect x="140" y="100" width="110" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 115px; margin-left: 142px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: nowrap;">Wifi | <font color="#55ffff">GUEST</font></div></div></div></foreignObject><text x="142" y="119" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Wifi | GUEST</text></switch></g><rect x="160" y="310" width="80" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 320px; margin-left: 161px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>VLAN trunk</font></div></div></div></foreignObject><text x="200" y="324" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">VLAN trunk</text></switch></g><path d="M 160 320 L 60.03 320 L 60 270" fill="none" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 240 320 L 339.97 320 L 340 270" fill="none" stroke="#55ffff" stroke-miterlimit="10" pointer-events="stroke"/><rect x="40" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 41px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN1</div></div></div></foreignObject><text x="60" y="264" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">LAN1</text></switch></g><path d="M 160 320 L 60.03 320 L 60 276.37" fill="none" stroke="#55ffff" stroke-miterlimit="10" stroke-dasharray="8 8" pointer-events="stroke"/><path d="M 60 271.12 L 63.51 278.12 L 60 276.37 L 56.51 278.12 Z" fill="#55ffff" stroke="#55ffff" stroke-miterlimit="10" pointer-events="all"/><rect x="320" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 321px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN1</div></div></div></foreignObject><text x="340" y="264" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">LAN1</text></switch></g><path d="M 240 320 L 339.97 320 L 340 276.37" fill="none" stroke="#ff55ff" stroke-miterlimit="10" stroke-dasharray="8 8" pointer-events="stroke"/><path d="M 340 271.12 L 343.49 278.12 L 340 276.37 L 336.49 278.12 Z" fill="#ff55ff" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="19" width="250" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 49px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font face="monospace">Networks<br />- <font color="#ff55ff">HOME  192.168.1.0/24 (VLAN 10)</font><br />- <font color="#55ffff">GUEST 10.0.0.0/24    (VLAN 20)</font><br /></font></div></div></div></foreignObject><text x="2" y="53" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px">Networks...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="481px" height="331px" viewBox="-0.5 -0.5 481 331"><defs/><g><path d="M 399.96 143.63 L 399.56 82.45" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 399.99 148.88 L 396.45 141.9 L 399.96 143.63 L 403.45 141.86 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 399.53 77.2 L 403.07 84.18 L 399.56 82.45 L 396.07 84.22 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 370 20 C 346 20 340 40 359.2 44 C 340 52.8 361.6 72 377.2 64 C 388 80 424 80 436 64 C 460 64 460 48 445 40 C 460 24 436 8 415 16 C 400 4 376 4 370 20 Z" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 40px; margin-left: 341px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Internet</div></div></div></foreignObject><text x="400" y="44" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">Internet</text></switch></g><rect x="320" y="170" width="160" height="80" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 210px; margin-left: 321px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">AVM 7360SL</div></div></div></foreignObject><text x="400" y="214" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">AVM 7360SL</text></switch></g><rect x="380" y="150" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 160px; margin-left: 381px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">ADSL</div></div></div></foreignObject><text x="400" y="164" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">ADSL</text></switch></g><rect x="360" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 361px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN2</div></div></div></foreignObject><text x="380" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN2</text></switch></g><rect x="400" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 401px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN3</div></div></div></foreignObject><text x="420" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN3</text></switch></g><rect x="440" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 441px;"><div data-drawio-colors="color: #55FFFF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(85, 255, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN4</div></div></div></foreignObject><text x="460" y="264" fill="#55FFFF" font-family="monospace" font-size="12px" text-anchor="middle">LAN4</text></switch></g><rect x="40" y="170" width="160" height="80" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 210px; margin-left: 41px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Archer C7</div></div></div></foreignObject><text x="120" y="214" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">Archer C7</text></switch></g><rect x="80" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 81px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN2</div></div></div></foreignObject><text x="100" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN2</text></switch></g><rect x="120" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 121px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN3</div></div></div></foreignObject><text x="140" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN3</text></switch></g><rect x="160" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 161px;"><div data-drawio-colors="color: #FF55FF; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(255, 85, 255); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN4</div></div></div></foreignObject><text x="180" y="264" fill="#FF55FF" font-family="monospace" font-size="12px" text-anchor="middle">LAN4</text></switch></g><path d="M 40 150 L 80 150" fill="none" stroke="rgb(240, 240, 240)" stroke-width="4" stroke-miterlimit="10" transform="rotate(90,60,150)" pointer-events="all"/><path d="M 160 150 L 200 150" fill="none" stroke="rgb(240, 240, 240)" stroke-width="4" stroke-miterlimit="10" transform="rotate(90,180,150)" pointer-events="all"/><rect x="20" y="100" width="100" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 115px; margin-left: 22px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font color="#ffffff">Wifi | </font><font color="#ff55ff">HOME</font></div></div></div></foreignObject><text x="22" y="119" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Wifi | HOME</text></switch></g><rect x="140" y="100" width="110" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 115px; margin-left: 142px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: nowrap;">Wifi | <font color="#55ffff">GUEST</font></div></div></div></foreignObject><text x="142" y="119" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Wifi | GUEST</text></switch></g><rect x="160" y="310" width="80" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 320px; margin-left: 161px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font>VLAN trunk</font></div></div></div></foreignObject><text x="200" y="324" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">VLAN trunk</text></switch></g><path d="M 160 320 L 60 320 L 60 270" fill="none" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 240 320 L 340 320 L 340 270" fill="none" stroke="#55ffff" stroke-miterlimit="10" pointer-events="stroke"/><rect x="40" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 41px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN1</div></div></div></foreignObject><text x="60" y="264" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">LAN1</text></switch></g><path d="M 160 320 L 60 320 L 60 276.37" fill="none" stroke="#55ffff" stroke-miterlimit="10" stroke-dasharray="8 8" pointer-events="stroke"/><path d="M 60 271.12 L 63.5 278.12 L 60 276.37 L 56.5 278.12 Z" fill="#55ffff" stroke="#55ffff" stroke-miterlimit="10" pointer-events="all"/><rect x="320" y="250" width="40" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 321px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">LAN1</div></div></div></foreignObject><text x="340" y="264" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">LAN1</text></switch></g><path d="M 240 320 L 340 320 L 340 276.37" fill="none" stroke="#ff55ff" stroke-miterlimit="10" stroke-dasharray="8 8" pointer-events="stroke"/><path d="M 340 271.12 L 343.5 278.12 L 340 276.37 L 336.5 278.12 Z" fill="#ff55ff" stroke="#ff55ff" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="19" width="250" height="60" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 1px; height: 1px; padding-top: 49px; margin-left: 2px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: nowrap;"><font face="monospace">Networks<br />- <font color="#ff55ff">HOME  192.168.1.0/24 (VLAN 10)</font><br />- <font color="#55ffff">GUEST 10.0.0.0/24    (VLAN 20)</font><br /></font></div></div></div></foreignObject><text x="2" y="53" fill="rgb(240, 240, 240)" font-family="Helvetica" font-size="12px">Networks...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2023-09-01-cas-llsc-aba/gen-svg.sh b/content/2023-09-01-cas-llsc-aba/gen-svg.sh
new file mode 100644
index 0000000..f24eb91
--- /dev/null
+++ b/content/2023-09-01-cas-llsc-aba/gen-svg.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+for name in list-abc list-ac list-b; do
+ drawio -x -f svg -t --svg-theme dark -o $name.svg $name.drawio
+done
diff --git a/content/2023-09-01-cas-llsc-aba/list-abc.svg b/content/2023-09-01-cas-llsc-aba/list-abc.svg
index 640f109..232d0f7 100644
--- a/content/2023-09-01-cas-llsc-aba/list-abc.svg
+++ b/content/2023-09-01-cas-llsc-aba/list-abc.svg
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" height="81px" viewBox="-0.5 -0.5 571 81" content="&lt;mxfile host=&quot;Electron&quot; modified=&quot;2023-11-21T19:23:15.317Z&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.8 Chrome/114.0.5735.289 Electron/25.5.0 Safari/537.36&quot; etag=&quot;G_zP-v5Ozj6hxyWCfY8s&quot; version=&quot;21.6.8&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;oOsWoI9GtXahTL3aIcgJ&quot;&gt;7Vpdb+I4FP0t+8AjVb5pH4GSqVba7mh5mGFeKjcxiYVjZ4yB0F+/Nna+QyktsEgLrUR8fH0d33N8nVzRs8dJ9o2BNP6LhhD3LCPMevZjz7IsY+CIL4lsFWKKf4VEDIUaK4EpeoMaNDS6QiFc1gw5pZijtA4GlBAY8BoGGKObutmc4vqsKYhgC5gGALfRHyjksULvXaPEnyCK4nxm09A9CciNNbCMQUg3Fcie9Owxo5SrqyQbQyyjl8dFjfP39BY3xiDhHxlA+d8Lz2b+1Jq8zp9m/cn927ivvawBXukFD/Xd8m0eAkZXJITSi9GzR5sYcThNQSB7N4J1gcU8waJliss5JdwHCcKS8IQSulSmoznCeEwxZQInlEhoDRlHItRDjCIizVEYyklHS87oAubWPct2XV98RE970fkKhC+YVSAdhG+QJpCzrTDRvfeaj229uSnZ9TQUV4h1NAa0nqLCbxlycaGj3s3APy/366fZ5uXH6vfbr+nz8/yZOh0MEJjxL5LQjnVMGXoT3ACsXewl6qzBN52D0bcuGX27Ff3RNerf9yUJp6GgCPCVbACnRUHP8jCXYUgBqVHh/V7JbLkLcn+5OytEujJMK812sTFUh7KXPYSyRCq+6FsDhoD4FhEHfMXkyfKuXQDSfSYbHRzZ6RiG6sGQc8j6knREovZIytIYEO3SUpjgjfeB0oCEA8EtZJU+JORH9ExGvtRdD2fC2Vz4z2fa6UqRuTv6KtNsKAvrN1b4Emt5XSDhTvpU4utrObTnDGFAGeCIkj6PUbAgcKknQgRxlK+0aVth5V27QKm+ZTfHFPDmMkO0TDHY5uYYiQ7L+AMlKWUcyJiNStWIq0h+q/yqJCYUq1Smuq4p7RZ7HoNXiEcgWES7u2nMcIqMcPhIvGhSdlsZYXyNSdnzfN/zTkOB7V1XUvZuSfmWlG9Jef+eP3tSdg4/pl00KQ86MkKDF0jCoXzlFq1XTINFnYg6ayIwbPtTNu4MGQYFzHaAM/By4DGr2j9ui1boI5x7XnLAeD6zZmCHaZti/HfIkIiG3Mfv876XvyVdsQAefp0Ts0eQH37xgGGt/NBWQ4Vut4PuHGMQi526rhctujSgZ/hOkVhZ+VrWOH6KKkbuQq1bj6oWGRqObKPhaNBwpALTcrSTZLHsz6v0/lwqrSvUPaTPDPGf2qO8rowSrXKQbHxe02eQr/NB+bpXJV+7kStN95PydZrytSVrlxSwabUUnLzEEIQnPwWPV88RZZ56GJ2PPc1a5zq7zHaZ579JC8cfWzqRlMljVkkr3YlkL7Fyt071isWjWEwjSgCelOhXzj2rnTneqzhfS+boFuqxeePBrLmxH86VM9ZDzoaZ/5INCRtPB/5wFvzZUUK+HXoVNVyJ1JxG6fvh4W4gnrOKj/k56bnGUW7PLMX26XV398WT6zwFdUP+neawazJwwdpNJwddh92tdnOr3fzfazfFnj977cY9XM09Ue1GNMtfEKgkXv4Qw578Cw==&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="70" y="40" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A</div></div></div></foreignObject><text x="100" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">A</text></switch></g><rect x="130" y="40" width="20" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">next</div></div></div></foreignObject><text x="140" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="210" y="40" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 211px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B</div></div></div></foreignObject><text x="240" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">B</text></switch></g><rect x="270" y="40" width="20" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 280 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 261px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="280" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="350" y="40" width="60" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 351px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C</div></div></div></foreignObject><text x="380" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">C</text></switch></g><rect x="410" y="40" width="20" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 420 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 401px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="420" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><path d="M 150 59.87 L 203.2 59.15" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 210.2 59.06 L 203.25 62.65 L 203.16 55.65 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 290 60 L 341.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 348.88 60 L 341.88 63.5 L 341.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="0" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 10px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">m_head</div></div></div></foreignObject><text x="30" y="14" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">m_head</text></switch></g><path d="M 30 20 L 30 60 L 61.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 68.88 60 L 61.88 63.5 L 61.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 430 59.71 L 481.88 59.71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 488.88 59.71 L 481.88 63.21 L 481.88 56.21 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="40" width="60" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 491px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">..</div></div></div></foreignObject><text x="520" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">..</text></switch></g><rect x="550" y="40" width="20" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 560 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 541px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="560" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" height="81px" viewBox="-0.5 -0.5 571 81"><defs/><g><rect x="70" y="40" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A</div></div></div></foreignObject><text x="100" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">A</text></switch></g><rect x="130" y="40" width="20" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">next</div></div></div></foreignObject><text x="140" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="210" y="40" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 211px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B</div></div></div></foreignObject><text x="240" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">B</text></switch></g><rect x="270" y="40" width="20" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 280 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 261px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="280" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="350" y="40" width="60" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 351px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C</div></div></div></foreignObject><text x="380" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">C</text></switch></g><rect x="410" y="40" width="20" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 420 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 401px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="420" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><path d="M 150 59.87 L 203.2 59.15" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 210.2 59.06 L 203.25 62.65 L 203.16 55.65 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 290 60 L 341.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 348.88 60 L 341.88 63.5 L 341.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="0" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 10px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">m_head</div></div></div></foreignObject><text x="30" y="14" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">m_head</text></switch></g><path d="M 30 20 L 30 60 L 61.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 68.88 60 L 61.88 63.5 L 61.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 430 59.71 L 481.88 59.71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 488.88 59.71 L 481.88 63.21 L 481.88 56.21 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="40" width="60" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 491px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">..</div></div></div></foreignObject><text x="520" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">..</text></switch></g><rect x="550" y="40" width="20" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 560 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 541px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="560" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2023-09-01-cas-llsc-aba/list-ac.svg b/content/2023-09-01-cas-llsc-aba/list-ac.svg
index 35fb2a9..c3ba9b9 100644
--- a/content/2023-09-01-cas-llsc-aba/list-ac.svg
+++ b/content/2023-09-01-cas-llsc-aba/list-ac.svg
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" height="161px" viewBox="-0.5 -0.5 571 161" content="&lt;mxfile host=&quot;Electron&quot; modified=&quot;2023-11-21T19:23:45.635Z&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.8 Chrome/114.0.5735.289 Electron/25.5.0 Safari/537.36&quot; etag=&quot;J6W7fg3-FFfQY40rWzDL&quot; version=&quot;21.6.8&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;uBcNzIc841T6t-VShr4X&quot;&gt;7VlLc+I4EP4te+AI5Qc44RhImL1s7VRlqyZz2lJsYasiSx5ZvObXbwvJT0EIgyFMLSRVtrrb3VZ/n1oP9/xpuv4iUJb8xSNMe54TrXv+Y8/zPOduCBcl2WiJC/9aEgsSGVkleCY/sRE6RrogEc4bhpJzKknWFIacMRzKhgwJwVdNszmnzagZirEleA4RtaXfSCQTLb0fOZX8T0zipIjsOkaTosLYCPIERXxVE/lPPX8qOJf6Ll1PMVXZK/Kin5vt0ZYvJjCTH3ngK/oWjX9M/nbC5eq1HwfTFzbrGy9LRBemww/mbeWmSIHgCxZh5cXp+ZNVQiR+zlCotCtAHWSJTCm0XLidcyZnKCVUAZ5yxnNtOpkTSqeccgFyxpkSLbGQBFL9QEnMlDmJIhV0kkvB33Bh3fP80WgGP9DYnS56AL7wuiYySfiCeYql2ICJ0d4bPDbN5qpCNzCipAbs0MiQ4VNc+q1SDjcm60cg4FkIMLyWJ4Jg5zrhgvwEbBA1LvYCddbku8OD2fcumf2Rlf3pNfI/CGazIOgGAj+4rgEQWBD0vIBKlYYMsQYUwY+FqpbbJPfz7VwB5cpxvWy9zY2jFdpeaRgXqWJ8qVsiQRBcIeNILoSaWd61C1G2z2RlkqOUQ8fRGoqlxKKvQCcstp/kIksQMy49LQPcZB9pDihxCNhiUdMRoB8zkZyiq1uNFOBsDv6LSFteaTC3U18tzIqLqPlipS/oy+sbAXfKpyZf39DBjhnhkAskCWd9mZDwjeHcBCKMSFL0tG1bQ+Vdu1Cz3rKbU45ku5sRyTOKNoU5JaDwnD9ImnEhkcrZpGIN3MXqquurphgwVrNMq66p7HY55ofedZXdux1jvpV5zKIHtX6D1ivl4Vsz1U1cIDFi81JvfFeNwahoPq7rysdN2YpmhBY+c4mELGIa/LYyY/MufHtByvlChPjwAgACxVgenqpw1Fiw2pDXMB3twLSQCUxhwC2by9xdQJsIXzmBnlUTeWsWKde9hQvdb/NUfVnacgSPDnyoMeVv1PA7Hg8cf1z9gmYUnTUrypaUZU5+nadji6fpvwlGUed14nheHbHmaiI1/Nh8751r7Bev8/sNfrwm8qXyDa3v5ml1X4VRjSLKXmDVOH42PYbJKuExZ4g+VdITSsr4gyXFvaqS4u/m6bEFZew23Pjji1YM195Rfw67DVfdGlMr3u7m6iWmwyvh2rC1D4Vp5s6tTULur3Fv5Bzl9txctM8WBoMTp66zbG9njvrrZrZrQ/DZ21vX31EQbvvb2/72/76/7XTQHz7Tuuj+1h1ag/7U3J+n8M7U4W43GLTO1csN4qcVXvts91Z4b4X3Vni7HPTt7zm7Rv1lK699ZPNPIrZHNo69EzsVhWZuD53lmKH4SPFcdpP+ds3dcbZz383ZDjSrT9V6g1J98fef/gM=&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="70" y="40" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A</div></div></div></foreignObject><text x="100" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">A</text></switch></g><rect x="130" y="40" width="20" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">next</div></div></div></foreignObject><text x="140" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="350" y="40" width="60" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 351px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C</div></div></div></foreignObject><text x="380" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">C</text></switch></g><rect x="410" y="40" width="20" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 420 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 401px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="420" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><path d="M 150 60 L 341.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 348.88 60 L 341.88 63.5 L 341.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="0" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 10px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">m_head</div></div></div></foreignObject><text x="30" y="14" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">m_head</text></switch></g><path d="M 30 20 L 30 60 L 61.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 68.88 60 L 61.88 63.5 L 61.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 430 59.71 L 481.88 59.71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 488.88 59.71 L 481.88 63.21 L 481.88 56.21 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="40" width="60" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 491px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">..</div></div></div></foreignObject><text x="520" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">..</text></switch></g><rect x="550" y="40" width="20" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 560 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 541px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="560" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="120" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B</div></div></div></foreignObject><text x="100" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">B</text></switch></g><rect x="130" y="120" width="20" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 140)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 140px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="140" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 110px; margin-left: 72px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Thread 2</div></div></div></foreignObject><text x="72" y="114" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Thread 2</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" height="161px" viewBox="-0.5 -0.5 571 161"><defs/><g><rect x="70" y="40" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A</div></div></div></foreignObject><text x="100" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">A</text></switch></g><rect x="130" y="40" width="20" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">next</div></div></div></foreignObject><text x="140" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="350" y="40" width="60" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 351px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C</div></div></div></foreignObject><text x="380" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">C</text></switch></g><rect x="410" y="40" width="20" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 420 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 401px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="420" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><path d="M 150 60 L 341.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 348.88 60 L 341.88 63.5 L 341.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="0" y="0" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 10px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">m_head</div></div></div></foreignObject><text x="30" y="14" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">m_head</text></switch></g><path d="M 30 20 L 30 60 L 61.88 60" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 68.88 60 L 61.88 63.5 L 61.88 56.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 430 59.71 L 481.88 59.71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 488.88 59.71 L 481.88 63.21 L 481.88 56.21 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="40" width="60" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 491px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">..</div></div></div></foreignObject><text x="520" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">..</text></switch></g><rect x="550" y="40" width="20" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 560 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 541px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="560" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="120" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B</div></div></div></foreignObject><text x="100" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">B</text></switch></g><rect x="130" y="120" width="20" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 140)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 140px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="140" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 110px; margin-left: 72px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Thread 2</div></div></div></foreignObject><text x="72" y="114" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Thread 2</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2023-09-01-cas-llsc-aba/list-b.svg b/content/2023-09-01-cas-llsc-aba/list-b.svg
index e17faeb..c7b6ac6 100644
--- a/content/2023-09-01-cas-llsc-aba/list-b.svg
+++ b/content/2023-09-01-cas-llsc-aba/list-b.svg
@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than draw.io -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" height="161px" viewBox="-0.5 -0.5 571 161" content="&lt;mxfile host=&quot;Electron&quot; modified=&quot;2023-11-21T19:24:23.532Z&quot; agent=&quot;Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.8 Chrome/114.0.5735.289 Electron/25.5.0 Safari/537.36&quot; etag=&quot;xTinrbtsEMi7TlRldfTl&quot; version=&quot;21.6.8&quot; type=&quot;device&quot;&gt;&lt;diagram name=&quot;Page-1&quot; id=&quot;fIKG6hPY-mFjmqtQkcuF&quot;&gt;7Vndb9owEP9b9sAjVb5I6WNLm31InSp10ranyUtMYuHYmWNK2F+/c2yThEBpV6A8UCoR313u4t/97mKbgT/Jq48CFdk9TzAdeE5SDfzbged5zmUAX0qy1BIX/rUkFSQxskbwSP5iI3SMdE4SXHYMJedUkqIrjDljOJYdGRKCL7pmU067UQuU4p7gMUa0L/1OEplp6XjkNPJPmKSZjew6RpMja2wEZYYSvmiJ/LuBPxGcS32VVxNMFXoWF31ftEW7ejCBmXzJDf734MtyUeWXw4evnx+ZN5tX90Nfe3lCdG4mPDFPK5cWAsHnLMHKizPwbxYZkfixQLHSLiDrIMtkTmHkwuWUMxmhnFCV8JwzXmrTmymhdMIpFyBnnCnRExaSANTXlKRMmZMkUUFvSin4DFvrgeeHYRSFIWj6kzY4KF+4aokMCB8xz7EUSzAxWj80CTGUHJvhokmvtchamQ2MDBlCpSvHDeZwYWB/RQqCXgoGXkilgqFArJOK8M9csaUGeVjWtXINBq5XVDU2jlZoe6VhXOSItnRPSBAE34A4knOhKutZuxgV20wWBhylDBxHayiWEouhSjphaf9OLooMMePS0zLImxwizQEljiG3WLR0BOjHTCTHTrXWSAHOpuDfRqp5pZNZl34rzIKLpPtgK18wl98zAu6UT02+oaFDP2aCYy6QJJwNZUbiGcOlCUQYkcTOdN22lZVn7WLN+p7dlHIk16eZkLKgaGnNKQGF53wgecGFRAqzm4Y1cJWqbwYRLcWAsZplWvXG2u+XeMYF+QtsUbOoXWztDwet+cDbWfPeMWs+7NV8/ivDKNk7/lvh3gOobhfT4GV91DsUppcb+ugampgl12pNAKPflMezLnxdrAEXsfzRHvxUg4uRHd5WbeXtcjVKIkKtz1IiIW1Mk5NaZmzqOyoifzS+YfTT3K2umzBqYKNszStOYPliZgw9IOMpZ4jeNdLtmS/5XMR4N2vh8VMsn7FzjUP1LM8SqUWV0QaqWJnAFHrjU3dFtok/JsIDJzC15oW/mafWgZ62uae9flpzM+66WS30rB8NS89PzeXVnP+f3uMTobchq9uiakPczWR9fUm8vm2dCNeCoMuSq6uLS2DK6s/9P+6NnFe5PTAVr3pUvLg4xV1D5KjPfl526xl4712Dffmetw3nbcN523Coot99VHDUbYNdWLWK/q3YH6bxRqNRFO0nB+vLrvC9G693brznxntuvActejfYXfXH7bz9g/JvmahPbJz+RuytWehiu+sox5TiLcVTuR/413vuhqOd8TGPdtz+Gfn1Kb73VAHsqwQ879RefKNeEnRnOp0WtFf8X7DwOG4L6h8ar1qQu/csvHcL6tH/cD0Ihs2vsPqMpPkx27/7Bw==&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="350" y="40" width="60" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 351px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C</div></div></div></foreignObject><text x="380" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">C</text></switch></g><rect x="410" y="40" width="20" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 420 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 401px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="420" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="0" y="0" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 10px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">m_head</div></div></div></foreignObject><text x="30" y="14" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">m_head</text></switch></g><path d="M 30 20 L 30 140 L 61.88 140" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 68.88 140 L 61.88 143.5 L 61.88 136.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 430 59.71 L 481.88 59.71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 488.88 59.71 L 481.88 63.21 L 481.88 56.21 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="40" width="60" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 491px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">..</div></div></div></foreignObject><text x="520" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">..</text></switch></g><rect x="550" y="40" width="20" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 560 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 541px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="560" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="120" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B</div></div></div></foreignObject><text x="100" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">B</text></switch></g><rect x="130" y="120" width="20" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 140)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 140px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="140" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 110px; margin-left: 72px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Thread 2</div></div></div></foreignObject><text x="72" y="114" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Thread 2</text></switch></g><rect x="210" y="120" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 211px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A</div></div></div></foreignObject><text x="240" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">A</text></switch></g><rect x="270" y="120" width="20" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 280 140)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 140px; margin-left: 261px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">next</div></div></div></foreignObject><text x="280" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="210" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 110px; margin-left: 212px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Thread 1</div></div></div></foreignObject><text x="212" y="114" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Thread 1</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="571px" height="161px" viewBox="-0.5 -0.5 571 161"><defs/><g><rect x="350" y="40" width="60" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 351px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">C</div></div></div></foreignObject><text x="380" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">C</text></switch></g><rect x="410" y="40" width="20" height="40" fill="none" stroke="#66ff66" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 420 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 401px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="420" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="0" y="0" width="60" height="20" fill="none" stroke="rgb(240, 240, 240)" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 10px; margin-left: 1px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">m_head</div></div></div></foreignObject><text x="30" y="14" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">m_head</text></switch></g><path d="M 30 20 L 30 140 L 61.88 140" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 68.88 140 L 61.88 143.5 L 61.88 136.5 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><path d="M 430 59.71 L 481.88 59.71" fill="none" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 488.88 59.71 L 481.88 63.21 L 481.88 56.21 Z" fill="rgb(240, 240, 240)" stroke="rgb(240, 240, 240)" stroke-miterlimit="10" pointer-events="all"/><rect x="490" y="40" width="60" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 491px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">..</div></div></div></foreignObject><text x="520" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">..</text></switch></g><rect x="550" y="40" width="20" height="40" fill="none" stroke="#f0f0f0" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 560 60)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 60px; margin-left: 541px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="560" y="64" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="120" width="60" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 71px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">B</div></div></div></foreignObject><text x="100" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">B</text></switch></g><rect x="130" y="120" width="20" height="40" fill="none" stroke="#ff55ff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 140 140)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 140px; margin-left: 121px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><span style="font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">next</span></div></div></div></foreignObject><text x="140" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="70" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 110px; margin-left: 72px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Thread 2</div></div></div></foreignObject><text x="72" y="114" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Thread 2</text></switch></g><rect x="210" y="120" width="60" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 140px; margin-left: 211px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">A</div></div></div></foreignObject><text x="240" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">A</text></switch></g><rect x="270" y="120" width="20" height="40" fill="none" stroke="#55ffff" pointer-events="all"/><g transform="translate(-0.5 -0.5)rotate(-90 280 140)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 140px; margin-left: 261px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">next</div></div></div></foreignObject><text x="280" y="144" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px" text-anchor="middle">next</text></switch></g><rect x="210" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 110px; margin-left: 212px;"><div data-drawio-colors="color: rgb(240, 240, 240); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: monospace; color: rgb(240, 240, 240); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Thread 1</div></div></div></foreignObject><text x="212" y="114" fill="rgb(240, 240, 240)" font-family="monospace" font-size="12px">Thread 1</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file
diff --git a/content/2024-04-24-fn-wrapper-macro-magic/Makefile b/content/2024-04-24-fn-wrapper-macro-magic/Makefile
new file mode 100644
index 0000000..2347615
--- /dev/null
+++ b/content/2024-04-24-fn-wrapper-macro-magic/Makefile
@@ -0,0 +1,11 @@
+check:
+ g++ -fsyntax-only wrap-v1.cc
+ g++ -fsyntax-only wrap-v2.cc
+ g++ -fsyntax-only wrap-v3.cc
+ g++ -fsyntax-only wrap-v4.cc
+
+cpp:
+ g++ -E wrap-v1.cc | clang-format
+ g++ -E wrap-v2.cc | clang-format
+ g++ -E wrap-v3.cc | clang-format
+ g++ -E wrap-v4.cc | clang-format
diff --git a/content/2024-04-24-fn-wrapper-macro-magic/index.md b/content/2024-04-24-fn-wrapper-macro-magic/index.md
new file mode 100644
index 0000000..708336b
--- /dev/null
+++ b/content/2024-04-24-fn-wrapper-macro-magic/index.md
@@ -0,0 +1,202 @@
++++
+title = "Generate function wrapper with macro magic"
+
+[taxonomies]
+tags = ["c++"]
++++
+
+**Short disclaimer at front**.
+This post discusses about c/cpp macros, which I generally try to minimize or
+avoid altogether. However, they do have their applications and can be useful.
+All I want to say is, use the right amount of macros for the specific context
+and consider your colleagues if used in production. :^)
+
+---
+
+Recently I had the need to wrap a list of c functions and execute some common
+task before and after each wrapped function call. Hence, the body of each
+wrapper function was identical. Theses wrappers were compiled and linked into a
+shared library which then was used for **LD_PRELOAD**ing.
+
+In this post I want to collect and archive a few approaches to generate the
+required boilerplate code using preprocessor macros. Progressing from top to
+bottom, the amount of macro code (*magic*?) increases.
+
+To examine the generated code, one can use the following command with all the
+code examples from this post.
+```
+g++ -E file.cc | clang-format
+```
+> With the **-E** option, g++ stops after the preprocessor stage; output is
+> written to *stdout*.
+> Alternatively, one can just invoke the preprocessor **cpp file.cc**.
+
+To syntax check the code examples, one can use the following command.
+```
+g++ -fsyntax-only file.cc
+```
+
+## Version 1
+
+The first version provides a *function definition* like macro, here called
+`WRAP`. When creating a wrapper function, this macro is directly used to define
+the wrapper. One declares the signature in the WRAP macro, which is then
+followed by curly braces including the wrapper body.
+
+The benefit of this approach is that the wrapper implementation is quite
+explicit and a reader, not familiar with the WRAP macro, might have a good
+chance to reason about what the code is doing. The draw back is that bodies
+have to be repeated for each wrapper.
+
+```cpp
+{{ include(path="content/2024-04-24-fn-wrapper-macro-magic/wrap-v1.cc") }}
+```
+
+> In the code examples, I use the `MOCK_WRAPPER_IMPL`<sup><a href="#sup-1">1</a></sup>
+> macro, to mock away the common pre and post work and to invoke the real
+> function.
+
+## Version 2
+
+The second version provides a simple approach to also generate the wrapper
+bodies by explicitly writing out a typed list of arguments and a list of
+argument names.
+
+The main drawbacks are that the wrapper definition as well as the body of the
+`WRAP` macro are somewhat obfuscated, which makes it hard for a reader to
+reason about the code. Additionally, the arguments must be specified twice,
+when defining a wrapper.
+
+```cpp
+{{ include(path="content/2024-04-24-fn-wrapper-macro-magic/wrap-v2.cc") }}
+```
+
+## Version 3
+
+The third version provides macros to generate the list of typed arguments as
+well as the list of argument names. Then for the different *arity* of the
+wrapper function, corresponding `WRAP1, WRAP2` macros are provided to generate
+the boilerplate code with the correct number of arguments.
+
+The example only supports function with **one** or **two** arguments, but the
+code can easily be extended.
+
+```cpp
+{{ include(path="content/2024-04-24-fn-wrapper-macro-magic/wrap-v3.cc") }}
+```
+
+## Version 4
+
+The fourth version improves the third one by automatically using the correct
+`TYPEDARGS` and `ARGS` macro depending on the *arity* of the wrapper function.
+
+This is achieved by dynamically constructing the correct macro name during
+preprocessing time. The technique to count the number of elements in the
+variadic argument list [__VA_ARGS__][va-args] is presented in
+[__VA_NARG__][va-narg].
+
+```cpp, hide_lines=41-100
+{{ include(path="content/2024-04-24-fn-wrapper-macro-magic/wrap-v4.cc") }}
+```
+> The implementation to handle empty arguments **CPP_ARGC() == 0** uses a gcc
+> extension for the **##** operator. This is also supported by clang, but not
+> by msvc. Maybe I will come back in the future to update this, if I have the
+> need.
+
+## Appendix: CONCAT1 and CONCAT2?
+
+> *Macro arguments are completely macro-expanded before they are substituted
+> into a macro body, unless they are stringized or pasted with other tokens
+> [..]* - [gcc][cpp-args-prescan]
+
+```cpp
+#define FOO() ABC
+
+#define CONCAT2(lhs, rhs) lhs ## rhs
+#define CONCAT1(lhs, rhs) CONCAT2(lhs, rhs)
+
+CONCAT2(MOOOSE_, FOO())
+// expands to:
+// MOOOSE_FOO()
+
+CONCAT1(MOOOSE_, FOO())
+// expands to:
+// MOOOSE_ABC
+```
+
+## Appendix: Listify codegen data
+
+A hacker friend once showed me some neat macro magic for organizing data
+relevant to code generation within a list that can be reused in multiple
+contexts.
+
+I want to archive this technique here, as it fits well in the topic.
+
+The idea is that the list can accept a macro, which is then applied to each
+entry. The processing macros, may not need to use all the elements in an entry.
+
+The example below is somewhat arbitrary and one may not see the benefit, but it
+is serves to demonstrate the technique. However, this technique really shines
+when dealing with larger datasets that are used in different locations to
+generate code.
+
+```cpp
+#define EXCEPTIONS(M) \
+ M(ill_opc , "Illegal opcode") \
+ M(mem_fault, "Memory fault") \
+ M(inv_perm , "Invalid permissions")
+
+enum exception {
+#define ELEM(e, _) e,
+ EXCEPTIONS(ELEM)
+#undef ELE
+};
+
+const char* describe(exception e) {
+ switch (e) {
+#define CASE(e, d) \
+ case e: \
+ return d;
+ EXCEPTIONS(CASE)
+#undef CASE
+ }
+}
+```
+
+This technique can also be used to generate the function wrappers when using
+the `WRAP` macro from [version 4](#version-4).
+
+```cpp
+#define API(M) \
+ M(int, foo, const char*) \
+ M(int, bar, const char*, const char*) \
+ M(int, baz, char, int, unsigned)
+
+API(WRAP)
+```
+
+To conclude this appendix, let me share a quote from that same great hacker
+friend:
+> *This is the excel-ification of cpp code*.
+
+## References
+
+- Count number of elements in VA_ARGS [[ref][va-narg]]
+- Preprocessor variadic macros [[ref][va-args]]
+- Preprocessor concatenation [[ref][cpp-concatenation]]
+- Preprocessor macro argument handling [[ref][cpp-macro-args]]
+- Preprocessor argument prescan [[ref][cpp-args-prescan]]
+
+## Footnotes
+
+<div id="sup-1"></div>
+
+**1)** In the examples above, **MOCK_WRAPPER_IMPL** is a macro. However it does
+not need to be one, as it can be seen in the [fn_hook.cc][fn-hook] example.
+
+[va-narg]: https://groups.google.com/g/comp.std.c/c/d-6Mj5Lko_s
+[va-args]: https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
+[cpp-concatenation]: https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
+[cpp-macro-args]: https://gcc.gnu.org/onlinedocs/cpp/Macro-Arguments.html
+[cpp-args-prescan]: https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html
+[fn-hook]: https://git.memzero.de/testground/cpp-templates/tree/fn_hook.cc
diff --git a/content/2024-04-24-fn-wrapper-macro-magic/wrap-v1.cc b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v1.cc
new file mode 100644
index 0000000..d3f3ddf
--- /dev/null
+++ b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v1.cc
@@ -0,0 +1,19 @@
+// Mock the common wrapper functionality. For the purpose of this discussion,
+// this is just a sink accepting any function argument.
+#define MOCK_WRAPPER_IMPL(ret, fn) \
+ /* do common work */ \
+ static ret wrap_##fn(...);
+
+// Utility to generate wrapper boilerplate.
+#define WRAP(ret, fn, ...) \
+ MOCK_WRAPPER_IMPL(ret, fn) \
+ \
+ extern "C" ret fn(__VA_ARGS__)
+
+WRAP(int, foo, const char* name) {
+ return wrap_foo(name);
+}
+
+WRAP(int, bar, const char* name, const char* value) {
+ return wrap_bar(name, value);
+}
diff --git a/content/2024-04-24-fn-wrapper-macro-magic/wrap-v2.cc b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v2.cc
new file mode 100644
index 0000000..4a71635
--- /dev/null
+++ b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v2.cc
@@ -0,0 +1,14 @@
+#define MOCK_WRAPPER_IMPL(ret, fn) \
+ /* do common work */ \
+ static ret wrap_##fn(...);
+
+// Utility to generate wrapper boilerplate.
+#define WRAP(ret, fn, typed_args, args) \
+ MOCK_WRAPPER_IMPL(ret, fn) \
+ \
+ extern "C" ret fn typed_args { \
+ return wrap_##fn args; \
+ }
+
+WRAP(int, foo, (const char* name), (name))
+WRAP(int, bar, (const char* name, const char* value), (name, value))
diff --git a/content/2024-04-24-fn-wrapper-macro-magic/wrap-v3.cc b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v3.cc
new file mode 100644
index 0000000..26e0913
--- /dev/null
+++ b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v3.cc
@@ -0,0 +1,30 @@
+#define ARGS0()
+#define ARGS1() a0
+#define ARGS2() a1, ARGS1()
+
+#define TYPEDARGS0()
+#define TYPEDARGS1(type) type a0
+#define TYPEDARGS2(type, ...) type a1, TYPEDARGS1(__VA_ARGS__)
+
+#define MOCK_WRAPPER_IMPL(ret, fn) \
+ /* do common work */ \
+ static ret wrap_##fn(...);
+
+// Utility to generate wrapper boilerplate for functions with *one* argument.
+#define WRAP1(ret, fn, ty1) \
+ MOCK_WRAPPER_IMPL(ret, fn) \
+ \
+ extern "C" ret fn(TYPEDARGS1(ty1)) { \
+ return wrap_##fn(ARGS1()); \
+ }
+
+// Utility to generate wrapper boilerplate for functions with *two* arguments.
+#define WRAP2(ret, fn, ty1, ty2) \
+ MOCK_WRAPPER_IMPL(ret, fn) \
+ \
+ extern "C" ret fn(TYPEDARGS2(ty1, ty2)) { \
+ return wrap_##fn(ARGS2()); \
+ }
+
+WRAP1(int, foo, const char*)
+WRAP2(int, bar, const char*, const char*)
diff --git a/content/2024-04-24-fn-wrapper-macro-magic/wrap-v4.cc b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v4.cc
new file mode 100644
index 0000000..ea5e41e
--- /dev/null
+++ b/content/2024-04-24-fn-wrapper-macro-magic/wrap-v4.cc
@@ -0,0 +1,47 @@
+// Get Nth argument.
+#define CPP_NTH(_0, _1, _2, _3, n, ...) n
+// Get number of arguments (uses gcc/clang extension for empty argument).
+#define CPP_ARGC(...) CPP_NTH(_0, ##__VA_ARGS__, 3, 2, 1, 0)
+
+// Utility to concatenate preprocessor tokens.
+#define CONCAT2(lhs, rhs) lhs##rhs
+#define CONCAT1(lhs, rhs) CONCAT2(lhs, rhs)
+
+#define ARGS0()
+#define ARGS1() a0
+#define ARGS2() a1, ARGS1()
+#define ARGS3() a2, ARGS2()
+
+// Invoke correct ARGSn macro depending on #arguments.
+#define ARGS(...) CONCAT1(ARGS, CPP_ARGC(__VA_ARGS__))()
+
+#define TYPEDARGS0()
+#define TYPEDARGS1(ty) ty a0
+#define TYPEDARGS2(ty, ...) ty a1, TYPEDARGS1(__VA_ARGS__)
+#define TYPEDARGS3(ty, ...) ty a2, TYPEDARGS2(__VA_ARGS__)
+
+// Invoke correct TYPEDARGSn macro depending on #arguments.
+#define TYPEDARGS(...) CONCAT1(TYPEDARGS, CPP_ARGC(__VA_ARGS__))(__VA_ARGS__)
+
+#define MOCK_WRAPPER_IMPL(ret, fn) \
+ /* do common work */ \
+ static ret wrap_##fn(...);
+
+// Utility to generate wrapper boilerplate.
+#define WRAP(ret, fn, ...) \
+ MOCK_WRAPPER_IMPL(ret, fn) \
+ \
+ extern "C" ret fn(TYPEDARGS(__VA_ARGS__)) { \
+ return wrap_##fn(ARGS(__VA_ARGS__)); \
+ }
+
+WRAP(int, foo, const char*)
+WRAP(int, bar, const char*, const char*)
+WRAP(int, baz, char, int, unsigned)
+
+// -- TESTS --------------------------------------------------------------------
+
+static_assert(CPP_ARGC() == 0);
+static_assert(CPP_ARGC(int) == 1);
+static_assert(CPP_ARGC(int, int) == 2);
+static_assert(CPP_ARGC(int, int, int) == 3);