1 line
98 KiB
HTML
1 line
98 KiB
HTML
<!doctype html><title>Introduction to RegEx</title><meta charset=utf-8><meta content="width=device-width,initial-scale=1" name=viewport><link href=res/favicon.png rel=icon sizes=512x512><link href=res/favicon.png rel=image_src type=image/png><link title="alexs168's blog" href=atom.xml rel=alternate type=application/atom+xml><body><style>@font-face{font-family:DejaVu Sans Mono;src:local(DejaVu Sans Mono),url(res/DejaVuSansMono.woff2)format("woff2"),local(Courier New),local(Courier),local(monospace);font-weight:400;font-style:normal;font-display:swap}body{font-family:DejaVu Sans Mono;font-size:17pt}td{vertical-align:top;width:100%;display:inline}h1,h2,h3,h4{margin-top:1%;margin-bottom:.75%;margin-left:-.75%}p{margin-top:.75%;margin-bottom:.75%}ul{margin-top:0%}.current{font-weight:700}pre{margin-top:0;margin-bottom:0;display:inline}a,a:visited{color:#3f51b5;text-decoration:none}</style><table><tr><td><span class=sidebar><span class=column-fixed style=justify-content:center;width:25%;display:inline-flex;position:fixed><table><tr><td><span class=table-of-contents><div style="border:1.2pt solid #000;border-radius:2pt;padding:3%"><p><span style=text-decoration:underline>Table of contents</span><br><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>├─</span> <span style=flex:1><span class=headingr id=headingr-0><a href=#loc-1>Introduction</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>├─</span> <span style=flex:1><span class=headingr id=headingr-1><a href=#loc-2>Syntax</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-2><a href=#loc-3>“Atoms”</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| | ├─</span> <span style=flex:1><span class=headingr id=headingr-3><a href=#loc-4>Characters</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| | ├─</span> <span style=flex:1><span class=headingr id=headingr-4><a href=#escaped-chars>Escaped Characters</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| | ├─</span> <span style=flex:1><span class=headingr id=headingr-5><a href=#char-groups>Character Groups</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| | └─</span> <span style=flex:1><span class=headingr id=headingr-6><a href=#loc-5>Anchors</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-7><a href=#greedy>Greedy VS Lazy</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| └─</span> <span style=flex:1><span class=headingr id=headingr-8><a href=#loc-6>Combinators</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-9><a href=#loc-7>Chain</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-10><a href=#loc-8>Or</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-11><a href=#loc-9>Or-Not</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-12><a href=#loc-10>Repeated</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-13><a href=#loc-11>Repeated At Least Once</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-14><a href=#non-capture-group>(Non-Capture) Group</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| ├─</span> <span style=flex:1><span class=headingr id=headingr-15><a href=#loc-12>Capture Group</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>| └─</span> <span style=flex:1><span class=headingr id=headingr-16><a href=#loc-13>Character Set</a></span></span></span><p style=line-height:1.1><span style=text-indent:0;display:flex><span style=margin-right:11pt>└─</span> <span style=flex:1><span class=headingr id=headingr-17><a href=#loc-14>Conclusion</a></span></span></span></div></span><span class=table-of-contents><script>document.addEventListener(`DOMContentLoaded`,(()=>{let a=[`h2`,`h3`,`h4`].flatMap(a=>Array.from(document.getElementsByTagName(a))).sort((a,b)=>a.getBoundingClientRect().top- b.getBoundingClientRect().top);let b=document.documentElement.scrollHeight- window.innerHeight;document.addEventListener(`scroll`,c=>{let d=-(document.documentElement.getBoundingClientRect().y/b);let e=d*window.innerHeight;let f=a.map(a=>0>a.getBoundingClientRect().top- e).lastIndexOf(!0);Array.from(document.getElementsByClassName(`headingr`)).map(a=>a.classList.remove(`current`));f!=-1&&document.getElementById(`headingr-`+ f).classList.add(`current`)})}))</script><style>.table-of-contents>p>span{width:100%}</style></span><tr><td><br> <a href=index.html><b>Website Home</b></a> <br><tr><td><p>Renderings of this page:<ul><li><a onclick='gotoVariant(".min.pdf");' href=#>minimal PDF (printable)</a><li><a onclick='gotoVariant(".nano.html");' href=#>minimal HTML</a></ul><tr><td><a href=atom.xml>Atom feed</a> <br><tr><td><style>@media only screen and (width<=1200px){.sidebar{display:none!important}.column-fixed{width:0%!important}.body-column{left:3%!important}}@media only screen and (width<=1800px){.body-column>span{width:75%!important}}@media only screen and (width<=1200px){.body-column{width:97%!important}.body-column>span{width:100%!important}}.hide{background:#000;transition:background .3s linear;display:inline}.hide:hover,.hide:focus{background:0 0}</style></table><style>.column-fixed>table>tbody>tr>td>*{width:100%}</style></span></span><td><span class=body-column style=width:72%;position:absolute;left:28%><span style=width:50%;display:inline-block><div><p><br><h1>Making a simple RegEx engine: Part 1: Introduction to RegEx</h1><p><span style=font-size:14pt><p>Git revision <a href=https://github.com/alex-s168/website/tree/fee2a36453b624f2e6ede5186b5f3e59aa3e6cc7>#fee2a364</a><br>Modified at 26. July 2025 14:20<p>Written by <a href=https://alex.vxcc.dev>alex_s168</a></span></div><div><br>Note that the <a onclick='gotoVariant(".min.pdf");' href=#>PDF Version</a> of this page might look a bit better styling wise.</div><div><p><br><span id=loc-1 style=text-decoration:underline><h2>Introduction</h2></span> If you are any kind of programmer, you’ve probably heard of <a href=https://en.wikipedia.org/wiki/Regular_expression>RegEx</a><p>RegEx (Regular expression) is kind of like a small programming language used to define string search and replace patterns.<p><br>RegEx might seem overwhelming at first, but you can learn the most important features of RegEx very quickly.<p><br>It is important to mention that there is not a single standard for RegEx syntax, but instead each “implementation” has it’s own quirks, and additional features. Most common features however behave identically on most RegEx “engines”/implementations.</div><div><p><br><span id=loc-2 style=text-decoration:underline><h2>Syntax</h2></span> The behavior of RegEx expressions / patterns depends on the match options passed to the RegEx engine.<p>Common match options<span id=match-options>:</span><ul><li>Anchored at start and end of line<li>Case insensitive<li>multi-line or instead whole string</ul></div><div><br><span id=loc-3 style=text-decoration:underline><h3>“Atoms”</h3></span> In this article, we will refer to single expression parts as “atoms”.</div><div><br><span id=loc-4 style=text-decoration:underline><h4>Characters</h4></span> Just use the character that you want to match. For example <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span> to match an <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>. This however does not work for all characters, because many are part of special RegEx syntax.</div><div><p><br><span id=escaped-chars style=text-decoration:underline><h4>Escaped Characters</h4></span> Thee previously mentioned special characters like <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>[</code></span> can be matched by putting a backslash in front of them: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#1d6c76>\[</span></code></span></p><svg viewbox="0 0 347.515625 83.58164062499999" class=typst-frame height=83.58164062499999pt style=width:20.4421em;height:4.91657em;overflow:visible width=347.515625pt xmlns=http://www.w3.org/2000/svg xmlns:h5=http://www.w3.org/1999/xhtml xmlns:xlink=http://www.w3.org/1999/xlink><g><g transform="translate(0 0)"><g class=typst-group><g><g transform="translate(0 -0.5)"><path d="M 0 0 L 0 84.58164" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(81.64404296875 -0.5)"><path d="M 0 0 L 0 84.58164" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(347.515625 -0.5)"><path d="M 0 0 L 0 84.58164" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 0)"><path d="M 0 0 L 348.51563 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 22.916015625)"><path d="M 0 0 L 348.51563 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 53.248828124999996)"><path d="M 0 0 L 348.51563 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 83.58164062499999)"><path d="M 0 0 L 348.51563 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gD50A97DBFCC1B2AF88274C574B62AD0F y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gDFA239FF7EF365A2405280CFC1B30A88 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /></g></g><g transform="translate(0 22.916015625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#1d6c76 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#1d6c76 fill-rule=nonzero x=8.187890625 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g35BF6B03EF89CF7767A7FE0A80AABDB5 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=133.05322265625 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=163.7578125 xlink:href=#gFF8E70305C9B4F601E02AB26F65CF687 y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=194.46240234375 xlink:href=#g6CF87839CD3E8D9C3AE5A144A46E9E75 y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=225.1669921875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=245.63671875 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /></g></g></g></g></g><g transform="translate(0 53.248828124999996)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#1d6c76 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#1d6c76 fill-rule=nonzero x=8.187890625 xlink:href=#g70A289BFCD7786312D0559D10B396C25 y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g35BF6B03EF89CF7767A7FE0A80AABDB5 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#gF468206C1E68B7C03DB0A6C10E852788 y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gC739666B161A484290AFC054395BB590 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=133.05322265625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /></g></g></g></g></g></g></g></g></g><defs id=glyph><symbol id=gD50A97DBFCC1B2AF88274C574B62AD0F overflow=visible><path d="M 3.3120117 11.015137 L 3.3120117 6.3583984 L 5.2543945 6.3583984 Q 6.416504 6.3583984 7.068115 6.9726563 Q 7.7197266 7.586914 7.7197266 8.690918 Q 7.7197266 9.794922 7.0722656 10.405029 Q 6.4248047 11.015137 5.2543945 11.015137 L 3.3120117 11.015137 Z M 1.6352539 12.393066 L 5.2543945 12.393066 Q 7.32959 12.393066 8.400391 11.450928 Q 9.471191 10.508789 9.471191 8.690918 Q 9.471191 6.8564453 8.404541 5.918457 Q 7.3378906 4.9804688 5.2543945 4.9804688 L 3.3120117 4.9804688 L 3.3120117 0 L 1.6352539 0 L 1.6352539 12.393066 Z"/></symbol><symbol id=g6B1726F4DF965EF5F691F5F83A105856 overflow=visible><path d="M 5.8271484 4.67334 L 5.320801 4.67334 Q 3.984375 4.67334 3.3078613 4.2043457 Q 2.6313477 3.7353516 2.6313477 2.805664 Q 2.6313477 1.9672852 3.1376953 1.5024414 Q 3.644043 1.0375977 4.5405273 1.0375977 Q 5.802246 1.0375977 6.524414 1.9133301 Q 7.246582 2.7890625 7.254883 4.333008 L 7.254883 4.67334 L 5.8271484 4.67334 Z M 8.790527 5.304199 L 8.790527 0 L 7.254883 0 L 7.254883 1.3779297 Q 6.7651367 0.54785156 6.022217 0.15356445 Q 5.279297 -0.24072266 4.216797 -0.24072266 Q 2.7973633 -0.24072266 1.9506836 0.56030273 Q 1.1040039 1.3613281 1.1040039 2.7060547 Q 1.1040039 4.258301 2.145752 5.0634766 Q 3.1875 5.8686523 5.20459 5.8686523 L 7.254883 5.8686523 L 7.254883 6.109375 Q 7.246582 7.2216797 6.6904297 7.723877 Q 6.1342773 8.226074 4.9140625 8.226074 Q 4.133789 8.226074 3.336914 8.001953 Q 2.540039 7.777832 1.784668 7.3461914 L 1.784668 8.873535 Q 2.6313477 9.197266 3.4074707 9.359131 Q 4.1835938 9.520996 4.9140625 9.520996 Q 6.067871 9.520996 6.885498 9.180664 Q 7.703125 8.840332 8.209473 8.159668 Q 8.524902 7.744629 8.657715 7.1345215 Q 8.790527 6.524414 8.790527 5.304199 Z"/></symbol><symbol id=g6DFAAC9B19C5F55A301A27DA78BC3D2B overflow=visible><path d="M 5.0966797 11.936523 L 5.0966797 9.296875 L 8.566406 9.296875 L 8.566406 8.109863 L 5.0966797 8.109863 L 5.0966797 3.0629883 Q 5.0966797 2.0336914 5.4868164 1.6269531 Q 5.876953 1.2202148 6.8481445 1.2202148 L 8.566406 1.2202148 L 8.566406 0 L 6.6987305 0 Q 4.9804688 0 4.2749023 0.68896484 Q 3.569336 1.3779297 3.569336 3.0629883 L 3.569336 8.109863 L 1.0874023 8.109863 L 1.0874023 9.296875 L 3.569336 9.296875 L 3.569336 11.936523 L 5.0966797 11.936523 Z"/></symbol><symbol id=gDB38173BD41D6F8246F6E4E5034FA1E3 overflow=visible><path d="M 9.230469 5.0302734 L 9.230469 4.283203 L 2.614746 4.283203 L 2.614746 4.2333984 Q 2.614746 2.7143555 3.4074707 1.8842773 Q 4.2001953 1.0541992 5.6445313 1.0541992 Q 6.375 1.0541992 7.171875 1.2866211 Q 7.96875 1.519043 8.873535 1.9921875 L 8.873535 0.47314453 Q 8.001953 0.11621094 7.192627 -0.06225586 Q 6.383301 -0.24072266 5.6279297 -0.24072266 Q 3.4614258 -0.24072266 2.241211 1.0583496 Q 1.0209961 2.3574219 1.0209961 4.6401367 Q 1.0209961 6.864746 2.2163086 8.192871 Q 3.411621 9.520996 5.4038086 9.520996 Q 7.180176 9.520996 8.205322 8.317383 Q 9.230469 7.1137695 9.230469 5.0302734 Z M 7.703125 5.4785156 Q 7.669922 6.823242 7.068115 7.524658 Q 6.4663086 8.226074 5.3374023 8.226074 Q 4.2333984 8.226074 3.5195313 7.4956055 Q 2.805664 6.7651367 2.6728516 5.470215 L 7.703125 5.4785156 Z"/></symbol><symbol id=gD1C7956DAF8AD82D229D654A639ECA4 overflow=visible><path d="M 9.587402 7.3793945 Q 9.097656 7.7612305 8.591309 7.935547 Q 8.084961 8.109863 7.479004 8.109863 Q 6.0512695 8.109863 5.2958984 7.213379 Q 4.5405273 6.3168945 4.5405273 4.623535 L 4.5405273 0 L 3.0048828 0 L 3.0048828 9.296875 L 4.5405273 9.296875 L 4.5405273 7.479004 Q 4.9223633 8.466797 5.715088 8.9938965 Q 6.5078125 9.520996 7.595215 9.520996 Q 8.159668 9.520996 8.649414 9.379883 Q 9.13916 9.23877 9.587402 8.939941 L 9.587402 7.3793945 Z"/></symbol><symbol id=g15F8D98A982CAFFBB2DC5CFB952688B3 overflow=visible><path d="M 8.724121 5.760742 L 8.724121 0 L 7.1884766 0 L 7.1884766 5.760742 Q 7.1884766 7.01416 6.748535 7.6035156 Q 6.3085938 8.192871 5.3706055 8.192871 Q 4.2998047 8.192871 3.7229004 7.4333496 Q 3.145996 6.673828 3.145996 5.2543945 L 3.145996 0 L 1.6186523 0 L 1.6186523 9.296875 L 3.145996 9.296875 L 3.145996 7.9023438 Q 3.5527344 8.699219 4.25 9.110107 Q 4.9472656 9.520996 5.9018555 9.520996 Q 7.321289 9.520996 8.022705 8.587158 Q 8.724121 7.6533203 8.724121 5.760742 Z"/></symbol><symbol id=gDFA239FF7EF365A2405280CFC1B30A88 overflow=visible><path d="M 3.6191406 1.3779297 Q 5.73584 1.3779297 6.5742188 2.4196777 Q 7.4125977 3.4614258 7.4125977 6.184082 Q 7.4125977 8.931641 6.578369 9.973389 Q 5.7441406 11.015137 3.6191406 11.015137 L 2.8222656 11.015137 L 2.8222656 1.3779297 L 3.6191406 1.3779297 Z M 3.6523438 12.393066 Q 6.491211 12.393066 7.8359375 10.882324 Q 9.180664 9.371582 9.180664 6.184082 Q 9.180664 3.0131836 7.8359375 1.5065918 Q 6.491211 0 3.6523438 0 L 1.137207 0 L 1.137207 12.393066 L 3.6523438 12.393066 Z"/></symbol><symbol id=gAD49535C0E195BFBF1C53D400910C0D3 overflow=visible><path d="M 8.07666 8.973145 L 8.07666 7.479004 Q 7.4208984 7.86084 6.756836 8.051758 Q 6.0927734 8.242676 5.4038086 8.242676 Q 4.366211 8.242676 3.855713 7.906494 Q 3.3452148 7.5703125 3.3452148 6.8813477 Q 3.3452148 6.258789 3.7270508 5.95166 Q 4.1088867 5.6445313 5.6279297 5.354004 L 6.2421875 5.237793 Q 7.3793945 5.0219727 7.9645996 4.3745117 Q 8.549805 3.7270508 8.549805 2.6894531 Q 8.549805 1.3115234 7.5703125 0.5354004 Q 6.5908203 -0.24072266 4.8476563 -0.24072266 Q 4.1586914 -0.24072266 3.4033203 -0.095458984 Q 2.6479492 0.049804688 1.7680664 0.34033203 L 1.7680664 1.9174805 Q 2.6230469 1.4775391 3.4033203 1.2575684 Q 4.1835938 1.0375977 4.8808594 1.0375977 Q 5.8935547 1.0375977 6.449707 1.4484863 Q 7.0058594 1.859375 7.0058594 2.5981445 Q 7.0058594 3.6606445 4.972168 4.067383 L 4.9057617 4.0839844 L 4.333008 4.2001953 Q 3.0131836 4.4575195 2.4072266 5.067627 Q 1.8012695 5.6777344 1.8012695 6.7319336 Q 1.8012695 8.068359 2.7060547 8.794678 Q 3.6108398 9.520996 5.2875977 9.520996 Q 6.034668 9.520996 6.723633 9.384033 Q 7.4125977 9.24707 8.07666 8.973145 Z"/></symbol><symbol id=g287DBFEC2AF7D6697558565F1658C356 overflow=visible><path d="M 8.807129 0.47314453 Q 8.192871 0.11621094 7.54126 -0.06225586 Q 6.8896484 -0.24072266 6.2089844 -0.24072266 Q 4.0507813 -0.24072266 2.8347168 1.0541992 Q 1.6186523 2.349121 1.6186523 4.6401367 Q 1.6186523 6.9311523 2.8347168 8.226074 Q 4.0507813 9.520996 6.2089844 9.520996 Q 6.8813477 9.520996 7.520508 9.34668 Q 8.159668 9.172363 8.807129 8.807129 L 8.807129 7.205078 Q 8.201172 7.744629 7.5910645 7.9853516 Q 6.980957 8.226074 6.2089844 8.226074 Q 4.772949 8.226074 4.0009766 7.2963867 Q 3.229004 6.366699 3.229004 4.6401367 Q 3.229004 2.921875 4.005127 1.9880371 Q 4.78125 1.0541992 6.2089844 1.0541992 Q 7.0058594 1.0541992 7.6367188 1.2990723 Q 8.267578 1.5439453 8.807129 2.0585938 L 8.807129 0.47314453 Z"/></symbol><symbol id=g8994DF9C9688059F90C624273B89485C overflow=visible><path d="M 2.125 9.296875 L 6.034668 9.296875 L 6.034668 1.1870117 L 9.064453 1.1870117 L 9.064453 0 L 1.4775391 0 L 1.4775391 1.1870117 L 4.507324 1.1870117 L 4.507324 8.109863 L 2.125 8.109863 L 2.125 9.296875 Z M 4.507324 12.916016 L 6.034668 12.916016 L 6.034668 10.981934 L 4.507324 10.981934 L 4.507324 12.916016 Z"/></symbol><symbol id=gD0269DB94B2B0282AF9573513A87B979 overflow=visible><path d="M 3.112793 1.1704102 L 3.112793 -3.5361328 L 1.5771484 -3.5361328 L 1.5771484 9.296875 L 3.112793 9.296875 L 3.112793 8.109863 Q 3.494629 8.798828 4.1296387 9.159912 Q 4.7646484 9.520996 5.5947266 9.520996 Q 7.279785 9.520996 8.238525 8.217773 Q 9.197266 6.914551 9.197266 4.6069336 Q 9.197266 2.3408203 8.234375 1.0500488 Q 7.2714844 -0.24072266 5.5947266 -0.24072266 Q 4.748047 -0.24072266 4.113037 0.12036133 Q 3.4780273 0.4814453 3.112793 1.1704102 Z M 7.595215 4.6401367 Q 7.595215 6.416504 7.034912 7.321289 Q 6.4746094 8.226074 5.3706055 8.226074 Q 4.258301 8.226074 3.6855469 7.3171387 Q 3.112793 6.408203 3.112793 4.6401367 Q 3.112793 2.880371 3.6855469 1.9672852 Q 4.258301 1.0541992 5.3706055 1.0541992 Q 6.4746094 1.0541992 7.034912 1.9589844 Q 7.595215 2.8637695 7.595215 4.6401367 Z"/></symbol><symbol id=gC9947EF6A39C68349F7D66C615F6F2B0 overflow=visible><path d="M 5.1132813 8.226074 Q 3.9511719 8.226074 3.3535156 7.321289 Q 2.7558594 6.416504 2.7558594 4.6401367 Q 2.7558594 2.8720703 3.3535156 1.9631348 Q 3.9511719 1.0541992 5.1132813 1.0541992 Q 6.2836914 1.0541992 6.8813477 1.9631348 Q 7.479004 2.8720703 7.479004 4.6401367 Q 7.479004 6.416504 6.8813477 7.321289 Q 6.2836914 8.226074 5.1132813 8.226074 Z M 5.1132813 9.520996 Q 7.0473633 9.520996 8.07251 8.267578 Q 9.097656 7.01416 9.097656 4.6401367 Q 9.097656 2.2578125 8.07666 1.0085449 Q 7.055664 -0.24072266 5.1132813 -0.24072266 Q 3.1791992 -0.24072266 2.1582031 1.0085449 Q 1.137207 2.2578125 1.137207 4.6401367 Q 1.137207 7.01416 2.1582031 8.267578 Q 3.1791992 9.520996 5.1132813 9.520996 Z"/></symbol><symbol id=g77B515F5A19B726699BB309F6E7D1982 overflow=visible><path d="M 1.9457031 9.9144535 L 7.1652346 -1.2617188 L 5.903516 -1.2617188 L 0.6773438 9.9144535 L 1.9457031 9.9144535 Z"/></symbol><symbol id=g35BF6B03EF89CF7767A7FE0A80AABDB5 overflow=visible><path d="M 5.611328 8.350586 Q 5.8935547 8.948242 6.3293457 9.234619 Q 6.7651367 9.520996 7.3793945 9.520996 Q 8.5 9.520996 8.960693 8.653564 Q 9.421387 7.786133 9.421387 5.387207 L 9.421387 0 L 8.026855 0 L 8.026855 5.320801 Q 8.026855 7.288086 7.806885 7.765381 Q 7.586914 8.242676 7.0058594 8.242676 Q 6.341797 8.242676 6.096924 7.7321777 Q 5.852051 7.2216797 5.852051 5.320801 L 5.852051 0 L 4.4575195 0 L 4.4575195 5.320801 Q 4.4575195 7.3129883 4.2209473 7.777832 Q 3.984375 8.242676 3.3701172 8.242676 Q 2.7641602 8.242676 2.527588 7.7321777 Q 2.2910156 7.2216797 2.2910156 5.320801 L 2.2910156 0 L 0.90478516 0 L 0.90478516 9.296875 L 2.2910156 9.296875 L 2.2910156 8.5 Q 2.5649414 8.998047 2.97583 9.2595215 Q 3.3867188 9.520996 3.909668 9.520996 Q 4.5405273 9.520996 4.959717 9.230469 Q 5.3789063 8.939941 5.611328 8.350586 Z"/></symbol><symbol id=g749DDD24D2CF11CC6BABE93F5597223 overflow=visible><path d="M 8.724121 5.760742 L 8.724121 0 L 7.1884766 0 L 7.1884766 5.760742 Q 7.1884766 7.01416 6.748535 7.6035156 Q 6.3085938 8.192871 5.3706055 8.192871 Q 4.2998047 8.192871 3.7229004 7.4333496 Q 3.145996 6.673828 3.145996 5.2543945 L 3.145996 0 L 1.6186523 0 L 1.6186523 12.916016 L 3.145996 12.916016 L 3.145996 7.9023438 Q 3.5527344 8.699219 4.25 9.110107 Q 4.9472656 9.520996 5.9018555 9.520996 Q 7.321289 9.520996 8.022705 8.587158 Q 8.724121 7.6533203 8.724121 5.760742 Z"/></symbol><symbol id=g24E3568E488DCB2078ED57BE6FD97B56 overflow=visible><path d="M 5.304199 3.3701172 Q 5.304199 2.3408203 5.681885 1.8178711 Q 6.0595703 1.2949219 6.79834 1.2949219 L 8.583008 1.2949219 L 8.583008 0 L 6.648926 0 Q 5.279297 0 4.528076 0.8798828 Q 3.7768555 1.7597656 3.7768555 3.3701172 L 3.7768555 11.812012 L 1.328125 11.812012 L 1.328125 13.007324 L 5.304199 13.007324 L 5.304199 3.3701172 Z"/></symbol><symbol id=gFF8E70305C9B4F601E02AB26F65CF687 overflow=visible><path d="M 7.620117 4.6401367 Q 7.620117 6.416504 7.055664 7.321289 Q 6.491211 8.226074 5.387207 8.226074 Q 4.2749023 8.226074 3.7021484 7.3171387 Q 3.1293945 6.408203 3.1293945 4.6401367 Q 3.1293945 2.880371 3.7021484 1.9672852 Q 4.2749023 1.0541992 5.387207 1.0541992 Q 6.491211 1.0541992 7.055664 1.9589844 Q 7.620117 2.8637695 7.620117 4.6401367 Z M 3.1293945 8.109863 Q 3.494629 8.790527 4.1379395 9.155762 Q 4.78125 9.520996 5.6279297 9.520996 Q 7.3046875 9.520996 8.267578 8.230225 Q 9.230469 6.939453 9.230469 4.67334 Q 9.230469 2.3740234 8.263428 1.0666504 Q 7.2963867 -0.24072266 5.611328 -0.24072266 Q 4.78125 -0.24072266 4.14624 0.12036133 Q 3.5112305 0.4814453 3.1293945 1.1704102 L 3.1293945 0 L 1.6020508 0 L 1.6020508 12.916016 L 3.1293945 12.916016 L 3.1293945 8.109863 Z"/></symbol><symbol id=g6CF87839CD3E8D9C3AE5A144A46E9E75 overflow=visible><path d="M 1.9589844 12.916016 L 3.5361328 12.916016 L 3.5361328 5.4370117 L 7.54541 9.296875 L 9.404785 9.296875 L 5.7441406 5.7939453 L 9.977539 0 L 8.109863 0 L 4.67334 4.7978516 L 3.5361328 3.7270508 L 3.5361328 0 L 1.9589844 0 L 1.9589844 12.916016 Z"/></symbol><symbol id=g70A289BFCD7786312D0559D10B396C25 overflow=visible><path d="M 6.979297 4.608594 L 6.979297 0 L 5.7507815 0 L 5.7507815 4.608594 Q 5.7507815 5.611328 5.3988285 6.082813 Q 5.046875 6.554297 4.2964845 6.554297 Q 3.439844 6.554297 2.9783204 5.94668 Q 2.5167968 5.3390627 2.5167968 4.2035155 L 2.5167968 0 L 1.2949219 0 L 1.2949219 7.4375 L 2.5167968 7.4375 L 2.5167968 6.321875 Q 2.8421876 6.9593754 3.4 7.288086 Q 3.9578125 7.616797 4.7214847 7.616797 Q 5.8570313 7.616797 6.4181643 6.8697267 Q 6.979297 6.1226563 6.979297 4.608594 Z"/></symbol><symbol id=gF468206C1E68B7C03DB0A6C10E852788 overflow=visible><path d="M 0 9.296875 L 1.5107422 9.296875 L 3.1293945 1.784668 L 4.4575195 6.5825195 L 5.760742 6.5825195 L 7.1054688 1.784668 L 8.724121 9.296875 L 10.234863 9.296875 L 8.060059 0 L 6.599121 0 L 5.1132813 5.0966797 L 3.6357422 0 L 2.1748047 0 L 0 9.296875 Z"/></symbol><symbol id=gC739666B161A484290AFC054395BB590 overflow=visible><path d="M 2.9550781 5.3374023 L 7.279785 5.3374023 L 7.279785 3.9760742 L 2.9550781 3.9760742 L 2.9550781 5.3374023 Z"/></symbol></defs></svg></div><div><p><br><span id=char-groups style=text-decoration:underline><h4>Character Groups</h4></span> RegEx engines already define some groups of characters that can make writing RegEx expressions quicker.</p><svg viewbox="0 0 675.03125 235.24570312500003" class=typst-frame height=235.24570312500003pt style=width:39.7077em;height:13.838em;overflow:visible width=675.03125pt xmlns=http://www.w3.org/2000/svg xmlns:h5=http://www.w3.org/1999/xhtml xmlns:xlink=http://www.w3.org/1999/xlink><g><g transform="translate(0 0)"><g class=typst-group><g><g transform="translate(0 -0.5)"><path d="M 0 0 L 0 236.2457" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(81.64404296875 -0.5)"><path d="M 0 0 L 0 236.2457" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(675.03125 -0.5)"><path d="M 0 0 L 0 236.2457" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 0)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 22.916015625)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 53.248828124999996)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 83.58164062499999)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 113.914453125)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 144.24726562499998)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 174.580078125)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 204.91289062500002)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(-0.5 235.24570312500003)"><path d="M 0 0 L 676.03125 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gD50A97DBFCC1B2AF88274C574B62AD0F y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#gDFA239FF7EF365A2405280CFC1B30A88 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /></g></g><g transform="translate(0 22.916015625)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 16.687891 0 C 17.516317 0 18.187891 0.67157286 18.187891 1.5 L 18.187891 18.832813 C 18.187891 19.66124 17.516317 20.332813 16.687891 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#gDB4F87C53AA688C04B27F90D7D4956AF y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g22BB7F87581003081CACEB300774C57F y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#gB785B0A2E202BDDAFD2D1BD6098DB78A y=0 /><use fill=#000000 fill-rule=nonzero x=163.7578125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=194.46240234375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#g3D3A895CF8B7FBD193F547B40ED49009 y=0 /><use fill=#000000 fill-rule=nonzero x=225.1669921875 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=255.87158203125 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=266.1064453125 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=276.34130859375 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=286.576171875 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=307.0458984375 xlink:href=#gFF8E70305C9B4F601E02AB26F65CF687 y=0 /><use fill=#000000 fill-rule=nonzero x=317.28076171875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=327.515625 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=337.75048828125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=347.9853515625 xlink:href=#g6CF87839CD3E8D9C3AE5A144A46E9E75 y=0 /><use fill=#000000 fill-rule=nonzero x=358.22021484375 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /></g></g></g></g></g><g transform="translate(0 53.248828124999996)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#d73a49 fill-rule=nonzero x=8.187890625 xlink:href=#gB034F787F09585BA1FF5236D1F06E3D3 y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g22BB7F87581003081CACEB300774C57F y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#gF468206C1E68B7C03DB0A6C10E852788 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=133.05322265625 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=163.7578125 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=194.46240234375 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#gFF8E70305C9B4F601E02AB26F65CF687 y=0 /><use fill=#000000 fill-rule=nonzero x=245.63671875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=255.87158203125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=266.1064453125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=276.34130859375 xlink:href=#g6CF87839CD3E8D9C3AE5A144A46E9E75 y=0 /></g></g></g></g></g><g transform="translate(0 83.58164062499999)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#d73a49 fill-rule=nonzero x=8.187890625 xlink:href=#gAD6C26F03E3A39D528E1E18DA7B1B8AE y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g22BB7F87581003081CACEB300774C57F y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#gB785B0A2E202BDDAFD2D1BD6098DB78A y=0 /><use fill=#000000 fill-rule=nonzero x=163.7578125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=194.46240234375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#gF468206C1E68B7C03DB0A6C10E852788 y=0 /><use fill=#000000 fill-rule=nonzero x=225.1669921875 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=245.63671875 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=255.87158203125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=266.1064453125 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=276.34130859375 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=286.576171875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=296.81103515625 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=307.0458984375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=317.28076171875 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=337.75048828125 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=347.9853515625 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=368.455078125 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=378.68994140625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=388.9248046875 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=399.15966796875 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=419.62939453125 xlink:href=#gFF8E70305C9B4F601E02AB26F65CF687 y=0 /><use fill=#000000 fill-rule=nonzero x=429.8642578125 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=440.09912109375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=450.333984375 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=460.56884765625 xlink:href=#g6CF87839CD3E8D9C3AE5A144A46E9E75 y=0 /><use fill=#000000 fill-rule=nonzero x=470.8037109375 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /></g></g></g></g></g><g transform="translate(0 113.914453125)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#d73a49 fill-rule=nonzero x=8.187890625 xlink:href=#g7C532BDA3B5D8A81B35335F76ACBCF30 y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g22BB7F87581003081CACEB300774C57F y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#gB867E918A4E2661645635F384E764254 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g3D3A895CF8B7FBD193F547B40ED49009 y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=133.05322265625 xlink:href=#g35BF6B03EF89CF7767A7FE0A80AABDB5 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#g30FCAC3B435FB3AC4069238FB96B06DD y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#g200F656D5CFFD9B50E894E289C11E6CF y=0 /></g></g></g></g></g><g transform="translate(0 144.24726562499998)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#d73a49 fill-rule=nonzero x=8.187890625 xlink:href=#g3951AB7FB8AF1BF3ECDD41E01B5EC4F1 y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g22BB7F87581003081CACEB300774C57F y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#gB785B0A2E202BDDAFD2D1BD6098DB78A y=0 /><use fill=#000000 fill-rule=nonzero x=163.7578125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=194.46240234375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=225.1669921875 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#gB867E918A4E2661645635F384E764254 y=0 /><use fill=#000000 fill-rule=nonzero x=245.63671875 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=255.87158203125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=266.1064453125 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=286.576171875 xlink:href=#g3D3A895CF8B7FBD193F547B40ED49009 y=0 /><use fill=#000000 fill-rule=nonzero x=296.81103515625 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=307.0458984375 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=317.28076171875 xlink:href=#g35BF6B03EF89CF7767A7FE0A80AABDB5 y=0 /><use fill=#000000 fill-rule=nonzero x=337.75048828125 xlink:href=#g30FCAC3B435FB3AC4069238FB96B06DD y=0 /><use fill=#000000 fill-rule=nonzero x=358.22021484375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=368.455078125 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=388.9248046875 xlink:href=#g200F656D5CFFD9B50E894E289C11E6CF y=0 /></g></g></g></g></g><g transform="translate(0 174.580078125)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#d73a49 fill-rule=nonzero x=8.187890625 xlink:href=#gC0627B222C0A997C36396EB980A889A5 y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=30.70458984375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g6D7057CCE3B27AA91C8177EE42F604FC y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gB867E918A4E2661645635F384E764254 y=0 /><use fill=#000000 fill-rule=nonzero x=133.05322265625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#g6D7057CCE3B27AA91C8177EE42F604FC y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=204.697265625 xlink:href=#g91164FC0321F75AFFDF6C4C0508B9403 y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=225.1669921875 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=245.63671875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=255.87158203125 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=266.1064453125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=276.34130859375 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=286.576171875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=296.81103515625 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /></g></g></g></g></g><g transform="translate(0 204.91289062500002)"><g class=typst-group><g><g transform="translate(5 5)"><g class=typst-group><g><g transform="translate(-0 -0)"><path d="M 1.5 0 L 24.875782 0 C 25.704208 0 26.375782 0.67157286 26.375782 1.5 L 26.375782 18.832813 C 26.375782 19.66124 25.704208 20.332813 24.875782 20.332813 L 1.5 20.332813 C 0.67157286 20.332813 0 19.66124 0 18.832813 L 0 1.5 C 0 0.67157286 0.67157286 0 1.5 0" class=typst-shape fill=none stroke=#000000 stroke-linecap=butt stroke-linejoin=miter stroke-miterlimit=4 stroke-width=1 /></g><g transform="translate(5 15.332812500000001)"><g transform="scale(1, -1)" class=typst-text><use fill=#d73a49 fill-rule=nonzero x=0 xlink:href=#g77B515F5A19B726699BB309F6E7D1982 y=0 /><use fill=#d73a49 fill-rule=nonzero x=8.187890625 xlink:href=#g4F298DF10B025E01D569158CD543023C y=0 /></g></g></g></g></g><g transform="translate(86.64404296875 17.916015625)"><g transform="scale(1, -1)" class=typst-text><use fill=#000000 fill-rule=nonzero x=0 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=10.23486328125 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=20.4697265625 xlink:href=#g22BB7F87581003081CACEB300774C57F y=0 /><use fill=#000000 fill-rule=nonzero x=40.939453125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=51.17431640625 xlink:href=#g749DDD24D2CF11CC6BABE93F5597223 y=0 /><use fill=#000000 fill-rule=nonzero x=61.4091796875 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=71.64404296875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=81.87890625 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=92.11376953125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=102.3486328125 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=112.58349609375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=122.818359375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=143.2880859375 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=153.52294921875 xlink:href=#gB785B0A2E202BDDAFD2D1BD6098DB78A y=0 /><use fill=#000000 fill-rule=nonzero x=163.7578125 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=173.99267578125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=184.2275390625 xlink:href=#gD0269DB94B2B0282AF9573513A87B979 y=0 /><use fill=#000000 fill-rule=nonzero x=194.46240234375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=214.93212890625 xlink:href=#g3D3A895CF8B7FBD193F547B40ED49009 y=0 /><use fill=#000000 fill-rule=nonzero x=225.1669921875 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=235.40185546875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=255.87158203125 xlink:href=#g24E3568E488DCB2078ED57BE6FD97B56 y=0 /><use fill=#000000 fill-rule=nonzero x=266.1064453125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=276.34130859375 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=286.576171875 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=296.81103515625 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=307.0458984375 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=317.28076171875 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=327.515625 xlink:href=#g6D7057CCE3B27AA91C8177EE42F604FC y=0 /><use fill=#000000 fill-rule=nonzero x=347.9853515625 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=358.22021484375 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=368.455078125 xlink:href=#gB867E918A4E2661645635F384E764254 y=0 /><use fill=#000000 fill-rule=nonzero x=378.68994140625 xlink:href=#g8994DF9C9688059F90C624273B89485C y=0 /><use fill=#000000 fill-rule=nonzero x=388.9248046875 xlink:href=#g6DFAAC9B19C5F55A301A27DA78BC3D2B y=0 /><use fill=#000000 fill-rule=nonzero x=399.15966796875 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=409.39453125 xlink:href=#g6D7057CCE3B27AA91C8177EE42F604FC y=0 /><use fill=#000000 fill-rule=nonzero x=429.8642578125 xlink:href=#g6B1726F4DF965EF5F691F5F83A105856 y=0 /><use fill=#000000 fill-rule=nonzero x=440.09912109375 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=450.333984375 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=470.8037109375 xlink:href=#g91164FC0321F75AFFDF6C4C0508B9403 y=0 /><use fill=#000000 fill-rule=nonzero x=481.03857421875 xlink:href=#g15F8D98A982CAFFBB2DC5CFB952688B3 y=0 /><use fill=#000000 fill-rule=nonzero x=491.2734375 xlink:href=#g616EBC7276319E939FB1D86AB5DBB912 y=0 /><use fill=#000000 fill-rule=nonzero x=501.50830078125 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=511.7431640625 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=521.97802734375 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /><use fill=#000000 fill-rule=nonzero x=532.212890625 xlink:href=#g287DBFEC2AF7D6697558565F1658C356 y=0 /><use fill=#000000 fill-rule=nonzero x=542.44775390625 xlink:href=#gC9947EF6A39C68349F7D66C615F6F2B0 y=0 /><use fill=#000000 fill-rule=nonzero x=552.6826171875 xlink:href=#gD1C7956DAF8AD82D229D654A639ECA4 y=0 /><use fill=#000000 fill-rule=nonzero x=562.91748046875 xlink:href=#gDB38173BD41D6F8246F6E4E5034FA1E3 y=0 /><use fill=#000000 fill-rule=nonzero x=573.15234375 xlink:href=#gAD49535C0E195BFBF1C53D400910C0D3 y=0 /></g></g></g></g></g></g></g></g></g><defs id=glyph><symbol id=gD50A97DBFCC1B2AF88274C574B62AD0F overflow=visible><path d="M 3.3120117 11.015137 L 3.3120117 6.3583984 L 5.2543945 6.3583984 Q 6.416504 6.3583984 7.068115 6.9726563 Q 7.7197266 7.586914 7.7197266 8.690918 Q 7.7197266 9.794922 7.0722656 10.405029 Q 6.4248047 11.015137 5.2543945 11.015137 L 3.3120117 11.015137 Z M 1.6352539 12.393066 L 5.2543945 12.393066 Q 7.32959 12.393066 8.400391 11.450928 Q 9.471191 10.508789 9.471191 8.690918 Q 9.471191 6.8564453 8.404541 5.918457 Q 7.3378906 4.9804688 5.2543945 4.9804688 L 3.3120117 4.9804688 L 3.3120117 0 L 1.6352539 0 L 1.6352539 12.393066 Z"/></symbol><symbol id=g6B1726F4DF965EF5F691F5F83A105856 overflow=visible><path d="M 5.8271484 4.67334 L 5.320801 4.67334 Q 3.984375 4.67334 3.3078613 4.2043457 Q 2.6313477 3.7353516 2.6313477 2.805664 Q 2.6313477 1.9672852 3.1376953 1.5024414 Q 3.644043 1.0375977 4.5405273 1.0375977 Q 5.802246 1.0375977 6.524414 1.9133301 Q 7.246582 2.7890625 7.254883 4.333008 L 7.254883 4.67334 L 5.8271484 4.67334 Z M 8.790527 5.304199 L 8.790527 0 L 7.254883 0 L 7.254883 1.3779297 Q 6.7651367 0.54785156 6.022217 0.15356445 Q 5.279297 -0.24072266 4.216797 -0.24072266 Q 2.7973633 -0.24072266 1.9506836 0.56030273 Q 1.1040039 1.3613281 1.1040039 2.7060547 Q 1.1040039 4.258301 2.145752 5.0634766 Q 3.1875 5.8686523 5.20459 5.8686523 L 7.254883 5.8686523 L 7.254883 6.109375 Q 7.246582 7.2216797 6.6904297 7.723877 Q 6.1342773 8.226074 4.9140625 8.226074 Q 4.133789 8.226074 3.336914 8.001953 Q 2.540039 7.777832 1.784668 7.3461914 L 1.784668 8.873535 Q 2.6313477 9.197266 3.4074707 9.359131 Q 4.1835938 9.520996 4.9140625 9.520996 Q 6.067871 9.520996 6.885498 9.180664 Q 7.703125 8.840332 8.209473 8.159668 Q 8.524902 7.744629 8.657715 7.1345215 Q 8.790527 6.524414 8.790527 5.304199 Z"/></symbol><symbol id=g6DFAAC9B19C5F55A301A27DA78BC3D2B overflow=visible><path d="M 5.0966797 11.936523 L 5.0966797 9.296875 L 8.566406 9.296875 L 8.566406 8.109863 L 5.0966797 8.109863 L 5.0966797 3.0629883 Q 5.0966797 2.0336914 5.4868164 1.6269531 Q 5.876953 1.2202148 6.8481445 1.2202148 L 8.566406 1.2202148 L 8.566406 0 L 6.6987305 0 Q 4.9804688 0 4.2749023 0.68896484 Q 3.569336 1.3779297 3.569336 3.0629883 L 3.569336 8.109863 L 1.0874023 8.109863 L 1.0874023 9.296875 L 3.569336 9.296875 L 3.569336 11.936523 L 5.0966797 11.936523 Z"/></symbol><symbol id=gDB38173BD41D6F8246F6E4E5034FA1E3 overflow=visible><path d="M 9.230469 5.0302734 L 9.230469 4.283203 L 2.614746 4.283203 L 2.614746 4.2333984 Q 2.614746 2.7143555 3.4074707 1.8842773 Q 4.2001953 1.0541992 5.6445313 1.0541992 Q 6.375 1.0541992 7.171875 1.2866211 Q 7.96875 1.519043 8.873535 1.9921875 L 8.873535 0.47314453 Q 8.001953 0.11621094 7.192627 -0.06225586 Q 6.383301 -0.24072266 5.6279297 -0.24072266 Q 3.4614258 -0.24072266 2.241211 1.0583496 Q 1.0209961 2.3574219 1.0209961 4.6401367 Q 1.0209961 6.864746 2.2163086 8.192871 Q 3.411621 9.520996 5.4038086 9.520996 Q 7.180176 9.520996 8.205322 8.317383 Q 9.230469 7.1137695 9.230469 5.0302734 Z M 7.703125 5.4785156 Q 7.669922 6.823242 7.068115 7.524658 Q 6.4663086 8.226074 5.3374023 8.226074 Q 4.2333984 8.226074 3.5195313 7.4956055 Q 2.805664 6.7651367 2.6728516 5.470215 L 7.703125 5.4785156 Z"/></symbol><symbol id=gD1C7956DAF8AD82D229D654A639ECA4 overflow=visible><path d="M 9.587402 7.3793945 Q 9.097656 7.7612305 8.591309 7.935547 Q 8.084961 8.109863 7.479004 8.109863 Q 6.0512695 8.109863 5.2958984 7.213379 Q 4.5405273 6.3168945 4.5405273 4.623535 L 4.5405273 0 L 3.0048828 0 L 3.0048828 9.296875 L 4.5405273 9.296875 L 4.5405273 7.479004 Q 4.9223633 8.466797 5.715088 8.9938965 Q 6.5078125 9.520996 7.595215 9.520996 Q 8.159668 9.520996 8.649414 9.379883 Q 9.13916 9.23877 9.587402 8.939941 L 9.587402 7.3793945 Z"/></symbol><symbol id=g15F8D98A982CAFFBB2DC5CFB952688B3 overflow=visible><path d="M 8.724121 5.760742 L 8.724121 0 L 7.1884766 0 L 7.1884766 5.760742 Q 7.1884766 7.01416 6.748535 7.6035156 Q 6.3085938 8.192871 5.3706055 8.192871 Q 4.2998047 8.192871 3.7229004 7.4333496 Q 3.145996 6.673828 3.145996 5.2543945 L 3.145996 0 L 1.6186523 0 L 1.6186523 9.296875 L 3.145996 9.296875 L 3.145996 7.9023438 Q 3.5527344 8.699219 4.25 9.110107 Q 4.9472656 9.520996 5.9018555 9.520996 Q 7.321289 9.520996 8.022705 8.587158 Q 8.724121 7.6533203 8.724121 5.760742 Z"/></symbol><symbol id=gDFA239FF7EF365A2405280CFC1B30A88 overflow=visible><path d="M 3.6191406 1.3779297 Q 5.73584 1.3779297 6.5742188 2.4196777 Q 7.4125977 3.4614258 7.4125977 6.184082 Q 7.4125977 8.931641 6.578369 9.973389 Q 5.7441406 11.015137 3.6191406 11.015137 L 2.8222656 11.015137 L 2.8222656 1.3779297 L 3.6191406 1.3779297 Z M 3.6523438 12.393066 Q 6.491211 12.393066 7.8359375 10.882324 Q 9.180664 9.371582 9.180664 6.184082 Q 9.180664 3.0131836 7.8359375 1.5065918 Q 6.491211 0 3.6523438 0 L 1.137207 0 L 1.137207 12.393066 L 3.6523438 12.393066 Z"/></symbol><symbol id=gAD49535C0E195BFBF1C53D400910C0D3 overflow=visible><path d="M 8.07666 8.973145 L 8.07666 7.479004 Q 7.4208984 7.86084 6.756836 8.051758 Q 6.0927734 8.242676 5.4038086 8.242676 Q 4.366211 8.242676 3.855713 7.906494 Q 3.3452148 7.5703125 3.3452148 6.8813477 Q 3.3452148 6.258789 3.7270508 5.95166 Q 4.1088867 5.6445313 5.6279297 5.354004 L 6.2421875 5.237793 Q 7.3793945 5.0219727 7.9645996 4.3745117 Q 8.549805 3.7270508 8.549805 2.6894531 Q 8.549805 1.3115234 7.5703125 0.5354004 Q 6.5908203 -0.24072266 4.8476563 -0.24072266 Q 4.1586914 -0.24072266 3.4033203 -0.095458984 Q 2.6479492 0.049804688 1.7680664 0.34033203 L 1.7680664 1.9174805 Q 2.6230469 1.4775391 3.4033203 1.2575684 Q 4.1835938 1.0375977 4.8808594 1.0375977 Q 5.8935547 1.0375977 6.449707 1.4484863 Q 7.0058594 1.859375 7.0058594 2.5981445 Q 7.0058594 3.6606445 4.972168 4.067383 L 4.9057617 4.0839844 L 4.333008 4.2001953 Q 3.0131836 4.4575195 2.4072266 5.067627 Q 1.8012695 5.6777344 1.8012695 6.7319336 Q 1.8012695 8.068359 2.7060547 8.794678 Q 3.6108398 9.520996 5.2875977 9.520996 Q 6.034668 9.520996 6.723633 9.384033 Q 7.4125977 9.24707 8.07666 8.973145 Z"/></symbol><symbol id=g287DBFEC2AF7D6697558565F1658C356 overflow=visible><path d="M 8.807129 0.47314453 Q 8.192871 0.11621094 7.54126 -0.06225586 Q 6.8896484 -0.24072266 6.2089844 -0.24072266 Q 4.0507813 -0.24072266 2.8347168 1.0541992 Q 1.6186523 2.349121 1.6186523 4.6401367 Q 1.6186523 6.9311523 2.8347168 8.226074 Q 4.0507813 9.520996 6.2089844 9.520996 Q 6.8813477 9.520996 7.520508 9.34668 Q 8.159668 9.172363 8.807129 8.807129 L 8.807129 7.205078 Q 8.201172 7.744629 7.5910645 7.9853516 Q 6.980957 8.226074 6.2089844 8.226074 Q 4.772949 8.226074 4.0009766 7.2963867 Q 3.229004 6.366699 3.229004 4.6401367 Q 3.229004 2.921875 4.005127 1.9880371 Q 4.78125 1.0541992 6.2089844 1.0541992 Q 7.0058594 1.0541992 7.6367188 1.2990723 Q 8.267578 1.5439453 8.807129 2.0585938 L 8.807129 0.47314453 Z"/></symbol><symbol id=g8994DF9C9688059F90C624273B89485C overflow=visible><path d="M 2.125 9.296875 L 6.034668 9.296875 L 6.034668 1.1870117 L 9.064453 1.1870117 L 9.064453 0 L 1.4775391 0 L 1.4775391 1.1870117 L 4.507324 1.1870117 L 4.507324 8.109863 L 2.125 8.109863 L 2.125 9.296875 Z M 4.507324 12.916016 L 6.034668 12.916016 L 6.034668 10.981934 L 4.507324 10.981934 L 4.507324 12.916016 Z"/></symbol><symbol id=gD0269DB94B2B0282AF9573513A87B979 overflow=visible><path d="M 3.112793 1.1704102 L 3.112793 -3.5361328 L 1.5771484 -3.5361328 L 1.5771484 9.296875 L 3.112793 9.296875 L 3.112793 8.109863 Q 3.494629 8.798828 4.1296387 9.159912 Q 4.7646484 9.520996 5.5947266 9.520996 Q 7.279785 9.520996 8.238525 8.217773 Q 9.197266 6.914551 9.197266 4.6069336 Q 9.197266 2.3408203 8.234375 1.0500488 Q 7.2714844 -0.24072266 5.5947266 -0.24072266 Q 4.748047 -0.24072266 4.113037 0.12036133 Q 3.4780273 0.4814453 3.112793 1.1704102 Z M 7.595215 4.6401367 Q 7.595215 6.416504 7.034912 7.321289 Q 6.4746094 8.226074 5.3706055 8.226074 Q 4.258301 8.226074 3.6855469 7.3171387 Q 3.112793 6.408203 3.112793 4.6401367 Q 3.112793 2.880371 3.6855469 1.9672852 Q 4.258301 1.0541992 5.3706055 1.0541992 Q 6.4746094 1.0541992 7.034912 1.9589844 Q 7.595215 2.8637695 7.595215 4.6401367 Z"/></symbol><symbol id=gC9947EF6A39C68349F7D66C615F6F2B0 overflow=visible><path d="M 5.1132813 8.226074 Q 3.9511719 8.226074 3.3535156 7.321289 Q 2.7558594 6.416504 2.7558594 4.6401367 Q 2.7558594 2.8720703 3.3535156 1.9631348 Q 3.9511719 1.0541992 5.1132813 1.0541992 Q 6.2836914 1.0541992 6.8813477 1.9631348 Q 7.479004 2.8720703 7.479004 4.6401367 Q 7.479004 6.416504 6.8813477 7.321289 Q 6.2836914 8.226074 5.1132813 8.226074 Z M 5.1132813 9.520996 Q 7.0473633 9.520996 8.07251 8.267578 Q 9.097656 7.01416 9.097656 4.6401367 Q 9.097656 2.2578125 8.07666 1.0085449 Q 7.055664 -0.24072266 5.1132813 -0.24072266 Q 3.1791992 -0.24072266 2.1582031 1.0085449 Q 1.137207 2.2578125 1.137207 4.6401367 Q 1.137207 7.01416 2.1582031 8.267578 Q 3.1791992 9.520996 5.1132813 9.520996 Z"/></symbol><symbol id=gDB4F87C53AA688C04B27F90D7D4956AF overflow=visible><path d="M 3.2472658 2.0253906 L 4.9207034 2.0253906 L 4.9207034 0 L 3.2472658 0 L 3.2472658 2.0253906 Z"/></symbol><symbol id=g22BB7F87581003081CACEB300774C57F overflow=visible><path d="M 7.1220703 2.9882813 Q 6.7402344 2.0170898 6.150879 0.43164063 Q 5.3291016 -1.7597656 5.046875 -2.241211 Q 4.665039 -2.8886719 4.092285 -3.2124023 Q 3.5195313 -3.5361328 2.7558594 -3.5361328 L 1.5273438 -3.5361328 L 1.5273438 -2.2578125 L 2.432129 -2.2578125 Q 3.1044922 -2.2578125 3.4863281 -1.8676758 Q 3.868164 -1.4775391 4.4575195 0.14941406 L 0.86328125 9.296875 L 2.4819336 9.296875 L 5.237793 2.0253906 L 7.9521484 9.296875 L 9.570801 9.296875 L 7.1220703 2.9882813 Z"/></symbol><symbol id=g749DDD24D2CF11CC6BABE93F5597223 overflow=visible><path d="M 8.724121 5.760742 L 8.724121 0 L 7.1884766 0 L 7.1884766 5.760742 Q 7.1884766 7.01416 6.748535 7.6035156 Q 6.3085938 8.192871 5.3706055 8.192871 Q 4.2998047 8.192871 3.7229004 7.4333496 Q 3.145996 6.673828 3.145996 5.2543945 L 3.145996 0 L 1.6186523 0 L 1.6186523 12.916016 L 3.145996 12.916016 L 3.145996 7.9023438 Q 3.5527344 8.699219 4.25 9.110107 Q 4.9472656 9.520996 5.9018555 9.520996 Q 7.321289 9.520996 8.022705 8.587158 Q 8.724121 7.6533203 8.724121 5.760742 Z"/></symbol><symbol id=gB785B0A2E202BDDAFD2D1BD6098DB78A overflow=visible><path d="M 9.280273 9.296875 L 5.95166 4.8476563 L 9.604004 0 L 7.8359375 0 L 5.1132813 3.7270508 L 2.3989258 0 L 0.6308594 0 L 4.283203 4.8476563 L 0.95458984 9.296875 L 2.6479492 9.296875 L 5.1132813 5.9350586 L 7.5620117 9.296875 L 9.280273 9.296875 Z"/></symbol><symbol id=g3D3A895CF8B7FBD193F547B40ED49009 overflow=visible><path d="M 8.82373 12.916016 L 8.82373 11.645996 L 7.088867 11.645996 Q 6.26709 11.645996 5.94751 11.309814 Q 5.6279297 10.973633 5.6279297 10.118652 L 5.6279297 9.296875 L 8.82373 9.296875 L 8.82373 8.109863 L 5.6279297 8.109863 L 5.6279297 0 L 4.100586 0 L 4.100586 8.109863 L 1.6186523 8.109863 L 1.6186523 9.296875 L 4.100586 9.296875 L 4.100586 9.944336 Q 4.100586 11.47168 4.802002 12.193848 Q 5.503418 12.916016 6.989258 12.916016 L 8.82373 12.916016 Z"/></symbol><symbol id=g24E3568E488DCB2078ED57BE6FD97B56 overflow=visible><path d="M 5.304199 3.3701172 Q 5.304199 2.3408203 5.681885 1.8178711 Q 6.0595703 1.2949219 6.79834 1.2949219 L 8.583008 1.2949219 L 8.583008 0 L 6.648926 0 Q 5.279297 0 4.528076 0.8798828 Q 3.7768555 1.7597656 3.7768555 3.3701172 L 3.7768555 11.812012 L 1.328125 11.812012 L 1.328125 13.007324 L 5.304199 13.007324 L 5.304199 3.3701172 Z"/></symbol><symbol id=gFF8E70305C9B4F601E02AB26F65CF687 overflow=visible><path d="M 7.620117 4.6401367 Q 7.620117 6.416504 7.055664 7.321289 Q 6.491211 8.226074 5.387207 8.226074 Q 4.2749023 8.226074 3.7021484 7.3171387 Q 3.1293945 6.408203 3.1293945 4.6401367 Q 3.1293945 2.880371 3.7021484 1.9672852 Q 4.2749023 1.0541992 5.387207 1.0541992 Q 6.491211 1.0541992 7.055664 1.9589844 Q 7.620117 2.8637695 7.620117 4.6401367 Z M 3.1293945 8.109863 Q 3.494629 8.790527 4.1379395 9.155762 Q 4.78125 9.520996 5.6279297 9.520996 Q 7.3046875 9.520996 8.267578 8.230225 Q 9.230469 6.939453 9.230469 4.67334 Q 9.230469 2.3740234 8.263428 1.0666504 Q 7.2963867 -0.24072266 5.611328 -0.24072266 Q 4.78125 -0.24072266 4.14624 0.12036133 Q 3.5112305 0.4814453 3.1293945 1.1704102 L 3.1293945 0 L 1.6020508 0 L 1.6020508 12.916016 L 3.1293945 12.916016 L 3.1293945 8.109863 Z"/></symbol><symbol id=g6CF87839CD3E8D9C3AE5A144A46E9E75 overflow=visible><path d="M 1.9589844 12.916016 L 3.5361328 12.916016 L 3.5361328 5.4370117 L 7.54541 9.296875 L 9.404785 9.296875 L 5.7441406 5.7939453 L 9.977539 0 L 8.109863 0 L 4.67334 4.7978516 L 3.5361328 3.7270508 L 3.5361328 0 L 1.9589844 0 L 1.9589844 12.916016 Z"/></symbol><symbol id=g77B515F5A19B726699BB309F6E7D1982 overflow=visible><path d="M 1.9457031 9.9144535 L 7.1652346 -1.2617188 L 5.903516 -1.2617188 L 0.6773438 9.9144535 L 1.9457031 9.9144535 Z"/></symbol><symbol id=gB034F787F09585BA1FF5236D1F06E3D3 overflow=visible><path d="M 6.4613285 7.178516 L 6.4613285 5.9832034 Q 5.936719 6.288672 5.405469 6.4414063 Q 4.874219 6.594141 4.323047 6.594141 Q 3.4929688 6.594141 3.0845704 6.3251953 Q 2.676172 6.05625 2.676172 5.5050783 Q 2.676172 5.0070314 2.9816408 4.761328 Q 3.2871094 4.515625 4.5023437 4.283203 L 4.99375 4.1902347 Q 5.903516 4.017578 6.37168 3.4996095 Q 6.8398438 2.9816408 6.8398438 2.1515625 Q 6.8398438 1.0492188 6.05625 0.42832032 Q 5.2726564 -0.19257814 3.8781252 -0.19257814 Q 3.3269532 -0.19257814 2.7226563 -0.07636719 Q 2.1183593 0.039843753 1.4144531 0.27226564 L 1.4144531 1.5339844 Q 2.0984375 1.1820313 2.7226563 1.0060548 Q 3.3468752 0.8300781 3.9046876 0.8300781 Q 4.7148438 0.8300781 5.1597657 1.158789 Q 5.6046877 1.4875001 5.6046877 2.0785158 Q 5.6046877 2.9285157 3.9777346 3.2539063 L 3.9246094 3.2671876 L 3.4664063 3.3601563 Q 2.410547 3.5660157 1.9257813 4.0541015 Q 1.4410157 4.5421877 1.4410157 5.385547 Q 1.4410157 6.4546876 2.1648438 7.0357423 Q 2.8886719 7.616797 4.230078 7.616797 Q 4.8277345 7.616797 5.3789063 7.507227 Q 5.9300785 7.3976564 6.4613285 7.178516 Z"/></symbol><symbol id=gF468206C1E68B7C03DB0A6C10E852788 overflow=visible><path d="M 0 9.296875 L 1.5107422 9.296875 L 3.1293945 1.784668 L 4.4575195 6.5825195 L 5.760742 6.5825195 L 7.1054688 1.784668 L 8.724121 9.296875 L 10.234863 9.296875 L 8.060059 0 L 6.599121 0 L 5.1132813 5.0966797 L 3.6357422 0 L 2.1748047 0 L 0 9.296875 Z"/></symbol><symbol id=gAD6C26F03E3A39D528E1E18DA7B1B8AE overflow=visible><path d="M 6.7203126 9.575782 L 6.7203126 8.214454 Q 6.109375 8.60625 5.495117 8.805469 Q 4.8808594 9.004687 4.256641 9.004687 Q 3.3070314 9.004687 2.7558594 8.5630865 Q 2.2046876 8.121485 2.2046876 7.3710938 Q 2.2046876 6.713672 2.5666018 6.3683596 Q 2.9285157 6.023047 3.9179688 5.790625 L 4.6218753 5.6312504 Q 6.0164065 5.3058596 6.6539063 4.608594 Q 7.2914066 3.9113283 7.2914066 2.7093751 Q 7.2914066 1.2949219 6.414844 0.5511719 Q 5.5382814 -0.19257814 3.8648438 -0.19257814 Q 3.1675782 -0.19257814 2.463672 -0.043164063 Q 1.7597656 0.10625 1.0492188 0.40507814 L 1.0492188 1.8328125 Q 1.8128906 1.3480469 2.4935548 1.1222657 Q 3.174219 0.8964844 3.8648438 0.8964844 Q 4.8808594 0.8964844 5.4453125 1.3513672 Q 6.0097656 1.8062501 6.0097656 2.6230469 Q 6.0097656 3.366797 5.6212893 3.7585938 Q 5.232813 4.1503906 4.269922 4.3628907 L 3.5527344 4.5289063 Q 2.1714845 4.841016 1.5472656 5.471875 Q 0.9230469 6.1027346 0.9230469 7.1652346 Q 0.9230469 8.49336 1.816211 9.293555 Q 2.7093751 10.09375 4.1902347 10.09375 Q 4.761328 10.09375 5.3921876 9.964258 Q 6.023047 9.834765 6.7203126 9.575782 Z"/></symbol><symbol id=g7C532BDA3B5D8A81B35335F76ACBCF30 overflow=visible><path d="M 5.6976566 6.4878907 L 5.6976566 10.332813 L 6.9195313 10.332813 L 6.9195313 0 L 5.6976566 0 L 5.6976566 0.9363282 Q 5.3921876 0.38515627 4.8841796 0.09628907 Q 4.376172 -0.19257814 3.7121096 -0.19257814 Q 2.3640625 -0.19257814 1.5904298 0.85332036 Q 0.8167969 1.8992188 0.8167969 3.738672 Q 0.8167969 5.551563 1.59375 6.58418 Q 2.3707032 7.616797 3.7121096 7.616797 Q 4.3828125 7.616797 4.8941407 7.32793 Q 5.405469 7.0390625 5.6976566 6.4878907 Z M 2.1050782 3.7121096 Q 2.1050782 2.2910156 2.5566406 1.5671875 Q 3.0082033 0.8433594 3.8914063 0.8433594 Q 4.7746096 0.8433594 5.236133 1.5738282 Q 5.6976566 2.304297 5.6976566 3.7121096 Q 5.6976566 5.1265626 5.236133 5.853711 Q 4.7746096 6.5808597 3.8914063 6.5808597 Q 3.0082033 6.5808597 2.5566406 5.8570313 Q 2.1050782 5.1332035 2.1050782 3.7121096 Z"/></symbol><symbol id=g616EBC7276319E939FB1D86AB5DBB912 overflow=visible><path d="M 7.1220703 8.109863 L 7.1220703 12.916016 L 8.649414 12.916016 L 8.649414 0 L 7.1220703 0 L 7.1220703 1.1704102 Q 6.7402344 0.4814453 6.1052246 0.12036133 Q 5.470215 -0.24072266 4.6401367 -0.24072266 Q 2.9550781 -0.24072266 1.9880371 1.0666504 Q 1.0209961 2.3740234 1.0209961 4.67334 Q 1.0209961 6.939453 1.9921875 8.230225 Q 2.963379 9.520996 4.6401367 9.520996 Q 5.4785156 9.520996 6.117676 9.159912 Q 6.756836 8.798828 7.1220703 8.109863 Z M 2.6313477 4.6401367 Q 2.6313477 2.8637695 3.1958008 1.9589844 Q 3.760254 1.0541992 4.864258 1.0541992 Q 5.9682617 1.0541992 6.545166 1.9672852 Q 7.1220703 2.880371 7.1220703 4.6401367 Q 7.1220703 6.408203 6.545166 7.3171387 Q 5.9682617 8.226074 4.864258 8.226074 Q 3.760254 8.226074 3.1958008 7.321289 Q 2.6313477 6.416504 2.6313477 4.6401367 Z"/></symbol><symbol id=gB867E918A4E2661645635F384E764254 overflow=visible><path d="M 7.1220703 4.7231445 Q 7.1220703 6.4414063 6.5617676 7.33374 Q 6.001465 8.226074 4.930664 8.226074 Q 3.8100586 8.226074 3.2207031 7.33374 Q 2.6313477 6.4414063 2.6313477 4.7231445 Q 2.6313477 3.0048828 3.2248535 2.104248 Q 3.8183594 1.2036133 4.9472656 1.2036133 Q 6.001465 1.2036133 6.5617676 2.1083984 Q 7.1220703 3.0131836 7.1220703 4.7231445 Z M 8.649414 0.59765625 Q 8.649414 -1.4941406 7.661621 -2.5732422 Q 6.673828 -3.6523438 4.7563477 -3.6523438 Q 4.1254883 -3.6523438 3.4365234 -3.5361328 Q 2.7475586 -3.4199219 2.0585938 -3.1958008 L 2.0585938 -1.6850586 Q 2.8720703 -2.0668945 3.5361328 -2.2495117 Q 4.2001953 -2.432129 4.7563477 -2.432129 Q 5.993164 -2.432129 6.557617 -1.7597656 Q 7.1220703 -1.0874023 7.1220703 0.37353516 L 7.1220703 0.4399414 L 7.1220703 1.4775391 Q 6.756836 0.6972656 6.1259766 0.3154297 Q 5.495117 -0.06640625 4.590332 -0.06640625 Q 2.963379 -0.06640625 1.9921875 1.2368164 Q 1.0209961 2.540039 1.0209961 4.7231445 Q 1.0209961 6.914551 1.9921875 8.217773 Q 2.963379 9.520996 4.590332 9.520996 Q 5.4868164 9.520996 6.109375 9.1640625 Q 6.7319336 8.807129 7.1220703 8.060059 L 7.1220703 9.263672 L 8.649414 9.263672 L 8.649414 0.59765625 Z"/></symbol><symbol id=g35BF6B03EF89CF7767A7FE0A80AABDB5 overflow=visible><path d="M 5.611328 8.350586 Q 5.8935547 8.948242 6.3293457 9.234619 Q 6.7651367 9.520996 7.3793945 9.520996 Q 8.5 9.520996 8.960693 8.653564 Q 9.421387 7.786133 9.421387 5.387207 L 9.421387 0 L 8.026855 0 L 8.026855 5.320801 Q 8.026855 7.288086 7.806885 7.765381 Q 7.586914 8.242676 7.0058594 8.242676 Q 6.341797 8.242676 6.096924 7.7321777 Q 5.852051 7.2216797 5.852051 5.320801 L 5.852051 0 L 4.4575195 0 L 4.4575195 5.320801 Q 4.4575195 7.3129883 4.2209473 7.777832 Q 3.984375 8.242676 3.3701172 8.242676 Q 2.7641602 8.242676 2.527588 7.7321777 Q 2.2910156 7.2216797 2.2910156 5.320801 L 2.2910156 0 L 0.90478516 0 L 0.90478516 9.296875 L 2.2910156 9.296875 L 2.2910156 8.5 Q 2.5649414 8.998047 2.97583 9.2595215 Q 3.3867188 9.520996 3.909668 9.520996 Q 4.5405273 9.520996 4.959717 9.230469 Q 5.3789063 8.939941 5.611328 8.350586 Z"/></symbol><symbol id=g30FCAC3B435FB3AC4069238FB96B06DD overflow=visible><path d="M 4.0092773 6.225586 Q 4.0092773 6.682129 4.3288574 7.01416 Q 4.6484375 7.3461914 5.0966797 7.3461914 Q 5.5615234 7.3461914 5.8935547 7.01416 Q 6.225586 6.682129 6.225586 6.225586 Q 6.225586 5.760742 5.897705 5.4370117 Q 5.569824 5.1132813 5.0966797 5.1132813 Q 4.631836 5.1132813 4.3205566 5.428711 Q 4.0092773 5.7441406 4.0092773 6.225586 Z M 5.1132813 11.2890625 Q 3.942871 11.2890625 3.3659668 10.027344 Q 2.7890625 8.765625 2.7890625 6.184082 Q 2.7890625 3.6108398 3.3659668 2.349121 Q 3.942871 1.0874023 5.1132813 1.0874023 Q 6.291992 1.0874023 6.8688965 2.349121 Q 7.445801 3.6108398 7.445801 6.184082 Q 7.445801 8.765625 6.8688965 10.027344 Q 6.291992 11.2890625 5.1132813 11.2890625 Z M 5.1132813 12.6171875 Q 7.097168 12.6171875 8.114014 10.990234 Q 9.130859 9.363281 9.130859 6.184082 Q 9.130859 3.0131836 8.114014 1.3862305 Q 7.097168 -0.24072266 5.1132813 -0.24072266 Q 3.1293945 -0.24072266 2.1166992 1.3862305 Q 1.1040039 3.0131836 1.1040039 6.184082 Q 1.1040039 9.363281 2.1166992 10.990234 Q 3.1293945 12.6171875 5.1132813 12.6171875 Z"/></symbol><symbol id=g200F656D5CFFD9B50E894E289C11E6CF overflow=visible><path d="M 4.9472656 5.495117 Q 6.0180664 5.495117 6.628174 6.26709 Q 7.2382813 7.0390625 7.2382813 8.400391 Q 7.2382813 9.761719 6.628174 10.533691 Q 6.0180664 11.305664 4.9472656 11.305664 Q 3.834961 11.305664 3.2705078 10.571045 Q 2.7060547 9.836426 2.7060547 8.400391 Q 2.7060547 6.9560547 3.2663574 6.225586 Q 3.8266602 5.495117 4.9472656 5.495117 Z M 1.9589844 0.25732422 L 1.9589844 1.8012695 Q 2.4819336 1.4941406 3.071289 1.3322754 Q 3.6606445 1.1704102 4.2998047 1.1704102 Q 5.8935547 1.1704102 6.7111816 2.369873 Q 7.5288086 3.569336 7.5288086 5.9018555 Q 7.138672 5.0717773 6.4331055 4.6276855 Q 5.727539 4.1835938 4.814453 4.1835938 Q 3.0214844 4.1835938 2.0378418 5.2875977 Q 1.0541992 6.3916016 1.0541992 8.416992 Q 1.0541992 10.41748 2.0627441 11.517334 Q 3.071289 12.6171875 4.9140625 12.6171875 Q 7.0722656 12.6171875 8.07666 11.064941 Q 9.081055 9.512695 9.081055 6.184082 Q 9.081055 3.0546875 7.873291 1.4069824 Q 6.6655273 -0.24072266 4.366211 -0.24072266 Q 3.760254 -0.24072266 3.145996 -0.11206055 Q 2.5317383 0.016601563 1.9589844 0.25732422 Z"/></symbol><symbol id=g3951AB7FB8AF1BF3ECDD41E01B5EC4F1 overflow=visible><path d="M 2.8953125 1.1023438 Q 4.588672 1.1023438 5.259375 1.9357423 Q 5.9300785 2.7691407 5.9300785 4.9472656 Q 5.9300785 7.145313 5.2626953 7.978711 Q 4.5953126 8.81211 2.8953125 8.81211 L 2.2578125 8.81211 L 2.2578125 1.1023438 L 2.8953125 1.1023438 Z M 2.921875 9.9144535 Q 5.192969 9.9144535 6.26875 8.705859 Q 7.3445315 7.497266 7.3445315 4.9472656 Q 7.3445315 2.410547 6.26875 1.2052735 Q 5.192969 0 2.921875 0 L 0.90976566 0 L 0.90976566 9.9144535 L 2.921875 9.9144535 Z"/></symbol><symbol id=gC0627B222C0A997C36396EB980A889A5 overflow=visible><path d="M 0 7.4375 L 1.2085937 7.4375 L 2.5035157 1.4277344 L 3.5660157 5.266016 L 4.608594 5.266016 L 5.6843753 1.4277344 L 6.979297 7.4375 L 8.187891 7.4375 L 6.448047 0 L 5.279297 0 L 4.0906253 4.077344 L 2.908594 0 L 1.7398438 0 L 0 7.4375 Z"/></symbol><symbol id=g6D7057CCE3B27AA91C8177EE42F604FC overflow=visible><path d="M 4.166992 2.5151367 L 6.258789 2.5151367 L 6.258789 0.796875 L 4.623535 -2.3823242 L 3.3452148 -2.3823242 L 4.166992 0.796875 L 4.166992 2.5151367 Z"/></symbol><symbol id=g91164FC0321F75AFFDF6C4C0508B9403 overflow=visible><path d="M 1.6186523 3.5195313 L 1.6186523 9.280273 L 3.145996 9.280273 L 3.145996 3.5195313 Q 3.145996 2.2661133 3.590088 1.6767578 Q 4.0341797 1.0874023 4.963867 1.0874023 Q 6.0429688 1.0874023 6.6157227 1.8469238 Q 7.1884766 2.6064453 7.1884766 4.025879 L 7.1884766 9.280273 L 8.724121 9.280273 L 8.724121 0 L 7.1884766 0 L 7.1884766 1.3945313 Q 6.7817383 0.58935547 6.0803223 0.1743164 Q 5.3789063 -0.24072266 4.440918 -0.24072266 Q 3.0131836 -0.24072266 2.315918 0.69311523 Q 1.6186523 1.6269531 1.6186523 3.5195313 Z"/></symbol><symbol id=g4F298DF10B025E01D569158CD543023C overflow=visible><path d="M 0 9.9144535 L 1.3082032 9.9144535 L 2.2578125 1.8660157 L 3.3867188 7.1917973 L 4.787891 7.1917973 L 5.9300785 1.8527344 L 6.879688 9.9144535 L 8.187891 9.9144535 L 6.7070313 0 L 5.438672 0 L 4.0906253 5.8902345 L 2.749219 0 L 1.4808594 0 L 0 9.9144535 Z"/></symbol></defs></svg></div><div><p><br><span id=loc-5 style=text-decoration:underline><h4>Anchors</h4></span> <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>^</span></code></span> is used to assert the beginning of a line in multi-line mode, or the beginning of the string in whole-string mode.<p><span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>$</span></code></span> is used to assert the end of a line in multi-line mode, or the end of the string in whole-string mode.<p>The behaviours of these depend on the <a href=#match-options>match options</a></div><div><p><br><span id=greedy style=text-decoration:underline><h3>Greedy VS Lazy</h3></span> Some combinators will either match “lazy”, or “greedy”.<p>Lazy is when the engine only matches as many characters required to get to the next step. This should almost always be used.<p>Greedy matching is when the engine tries to match as many characters as possible. The problem with this is that it might cause “backtracking”, which happens when the engine goes back in the pattern multiple times to ensure that as many characters as possible where matched. This can cause big performance issues.</div><div><br><span id=loc-6 style=text-decoration:underline><h3>Combinators</h3></span> Multiple atoms can be combined together to form more complex patterns.</div><div><p><br><span id=loc-7 style=text-decoration:underline><h4>Chain</h4></span> When two expressions are next to each other, they will be chained together, which means that both will be evaluated in-order.<p>Example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>x<span style=color:#d73a49>\d</span></code></span> matches a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>x</code></span> and then a digit, like for example <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>x9</code></span></div><div><p><br><span id=loc-8 style=text-decoration:underline><h4>Or</h4></span> Two expressions separated by a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>|</code></span> cause the RegEx engine to first try to match the left side, and only if it fails, it tries the right side instead.<p>Note that “or” has a long left and right scope, which means that <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>ab<span style=color:#d73a49>|</span>cd</code></span> will match either <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>ab</code></span> or <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>cd</code></span></div><div><p><br><span id=loc-9 style=text-decoration:underline><h4>Or-Not</h4></span> Tries to match the expression on the left to it, but won’t error if it doesn’t succeed.<p>Note that “or-not” has a short left scope, which means that <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>ab<span style=color:#d73a49>?</span></code></span> will always match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>, and then try to match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>b</code></span></div><div><p><br><span id=loc-10 style=text-decoration:underline><h4>Repeated</h4></span> A expression followed by either a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>*</code></span> for <a href=#greedy>greedy</a> repeat, or a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>*?</code></span> for <a href=#greedy>lazy</a> repeat.<p>This matches as many times as possible, but can also match the pattern zero times.<p>Note that this has a short left scope.</div><div><p><br><span id=loc-11 style=text-decoration:underline><h4>Repeated At Least Once</h4></span> A expression followed by either a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>+</code></span> for <a href=#greedy>greedy</a> repeat, or a <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>+?</code></span> for <a href=#greedy>lazy</a> repeat.<p>This matches as many times as possible, and at least one time.<p>Note that this has a short left scope.</div><div><p><br><span id=non-capture-group style=text-decoration:underline><h4>(Non-Capture) Group</h4></span> Groups multiple expressions together for scoping.<p>Example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>(</span><span style=color:#b60157>?:</span>abc<span style=color:#d73a49>)</span></code></span> will just match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>abc</code></span></div><div><p><br><span id=loc-12 style=text-decoration:underline><h4>Capture Group</h4></span> Similar to <a href=#non-capture-group>Non-Capture Groups</a> except that they capture the matched text. This allows the matched text of the inner expression to be extracted later.<p>Capture group IDs are enumerated from left to right, starting with 1.<p>Example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>(</span>abc<span style=color:#d73a49>)</span>de</code></span> will match <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>abcde</code></span>, and store <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>abc</code></span> in group 1.</div><div><p><br><span id=loc-13 style=text-decoration:underline><h4>Character Set</h4></span> By surrounding multiple characters in square brackets, the engine will match any of them. Special characters or expressions won’t be parsed inside them, which means that this can also be used to escape characters.<p>For example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>[</span>abc<span style=color:#d73a49>]</span></code></span> will match either <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>b</code></span> or <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>c</code></span>.<p>and <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>[</span>ab(?:c)<span style=color:#d73a49>]</span></code></span> will match either <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>a</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>b</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>(</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>?</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>:</code></span>, <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>c</code></span>, or <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap>)</code></span>.<p><a href=#char-groups>Character groups</a> and <a href=#escaped-chars>escaped characters</a> still work inside character sets.<p>Character sets can also contain ranges. For example: <span style="border:1pt solid #000;border-radius:2pt;padding:1.6pt;display:inline-block"><code style=white-space:pre-wrap><span style=color:#d73a49>[</span><span style=color:#b60157>0</span><span style=color:#b60157>-9</span><span style=color:#b60157>a</span><span style=color:#b60157>-z</span><span style=color:#d73a49>]</span></code></span> will match either any digit, or any lowercase letter.</div><div><p><br><span id=loc-14 style=text-decoration:underline><h2>Conclusion</h2></span> RegEx is perfect for when you just want to match some patterns, but the syntax can make patterns very hard to read or modify.<p>In the next article, we will start to dive into implementing RegEx.<p>Stay tuned!</div></span></span><td></table><script>var gotoVariant=(a=>{window.location.href=window.location.href.replace(/\.\w+.html/g,a)});window.addEventListener(`beforeprint`,a=>{gotoVariant(`.min.pdf`)})</script><script async src=coffee.js></script> |