diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..d8d6143
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,22 @@
+name: CI
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+
+jobs:
+  test:
+    name: Nim ${{ matrix.nim }}
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        # xxx trim to on use latest in each branch eg 1.0.10, 1.2.8 etc
+        nim: [1.0.0, 1.0.2, 1.0.4, 1.0.10, 1.2.0, 1.2.2, 1.2.4, 1.2.6, 1.2.8, 1.4.0, 1.4.2, 1.4.4]
+    steps:
+    - uses: actions/checkout@v2
+    - name: Run Tests
+      run: |
+        docker pull nimlang/nim:${{ matrix.nim }}
+        docker run --rm -v `pwd`:/usr/src/app -w /usr/src/app nimlang/nim:${{ matrix.nim }} /bin/bash -c "nimble install -y; nimble test"
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 62f5efb..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-services:
-  - docker
-env:
-  - NIM=0.19.6
-  - NIM=0.20.0
-  - NIM=0.20.2
-  - NIM=1.0.0
-  - NIM=1.0.2
-  - NIM=1.0.4
-  - NIM=1.2.0
-  - NIM=1.2.2
-  - NIM=1.2.4
-  - NIM=1.2.6
-before_install:
-  - docker pull nimlang/nim:$NIM
-script:
-  - docker run --rm -v `pwd`:/usr/src/app -w /usr/src/app nimlang/nim:$NIM /bin/bash -c "nimble install -y; nimble test"
-notifications:
-  email:
-    on_failure: never
-    on_success: never
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 50cac3a..cfeb30e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,28 @@
+v0.19.0
+==================
+
+* Adds support for unbounded lookaround assertions
+* Fix: parsing `{n,m}` repetitions is less strict;
+  `{}`, `{abc}`, etc are parsed as characters. This is
+  closer to PCRE, but it won't allow error prone instances
+  such as missing brackets: `{123`.
+* Fix: double repetitions: `**`, `++`, `*+`, `???`, `{n}*`, `{n}+`,
+  and other combinations are no longer allowed. The `++` PCRE hack
+  is not allowed, as it won't work the same way anyway.
+
+v0.18.0
+==================
+
+* Adds `escapeRe(string): string` function
+* Removed `unicodeplus` dependency
+
+v0.17.1
+==================
+
+* Fix: regression related to repetitions,
+  and lonely assertions; issue #83
+* Fix: make it compile with ARC; thanks to @timotheecour
+
 v0.17.0
 ==================
 
@@ -64,7 +89,7 @@ v0.13
 ==================
 
 * Add `groupFirstCapture`, `groupLastCapture`, and
-  `group(1): seq[string]` (thaks to @xmonader)
+  `group(1): seq[string]` (thanks to @xmonader)
 * Add Nim 1.0.0 to CI
 * Drop Nim 0.18 support
 * Fix nested captures with repetition range; issue #46
diff --git a/README.md b/README.md
index 0c3862a..59dadb0 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # Regex
 
-[![Build Status](https://img.shields.io/travis/nitely/nim-regex/master.svg?style=flat-square)](https://travis-ci.org/nitely/nim-regex)
+[![Build Status](https://img.shields.io/github/workflow/status/nitely/nim-regex/CI/master?style=flat-square)](https://github.com/nitely/nim-regex/actions?query=workflow%3ACI)
 [![licence](https://img.shields.io/github/license/nitely/nim-regex.svg?style=flat-square)](https://raw.githubusercontent.com/nitely/nim-regex/master/LICENSE)
 
 A library for parsing, compiling, and executing regular expressions.
@@ -34,6 +34,10 @@ Nim +0.19.0
 nimble test
 ```
 
+## Debugging
+
+Compile with `-d:regexDotDir:.` to generate [dot files](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) of the regexes (NFAs) within the nim file. A dot file can be viewed in [Graphviz](https://dreampuf.github.io/GraphvizOnline/). Requires Nim +1.2.
+
 ## LICENSE
 
 MIT
diff --git a/bench/bench.nim b/bench/bench.nim
index 8de4d9b..b38d135 100644
--- a/bench/bench.nim
+++ b/bench/bench.nim
@@ -27,6 +27,13 @@ benchRelative(regex_sol, m):
     discard regex.match(text, pattern4, m2)
   doNotOptimizeAway(m2)
 
+benchRelative(regex_macro_sol, m):
+  var d: bool
+  for i in 0 ..< m:
+    regex.match text, regex.rex"\w*sol\w*":
+      d = true
+  doNotOptimizeAway(d)
+
 var dummyTextNums = """650-253-0001"""
 
 var pattern_nums = re.re"^[0-9]+-[0-9]+-[0-9]+$"
@@ -45,6 +52,13 @@ benchRelative(regex_nums, m):
     discard regex.match(dummyTextNums, n_pattern_nums, m2)
   doNotOptimizeAway(m2)
 
+benchRelative(regex_macro_nums, m):
+  var d: bool
+  for i in 0 ..< m:
+    regex.match text, regex.rex"[0-9]+-[0-9]+-[0-9]+":
+      d = true
+  doNotOptimizeAway(d)
+
 var pattern_nums2 = re.re"^[0-9]+..*$"
 
 bench(re_nums2, m):
@@ -61,15 +75,22 @@ benchRelative(regex_nums2, m):
     discard regex.match(dummyTextNums, n_pattern_nums2, m3)
   doNotOptimizeAway(m3)
 
-var lits_find_re = re.re"do|re|mi|fa|sol"
-
-bench(re_lits_find, m):
-  var d: int
+benchRelative(regex_macro_nums2, m):
+  var d: bool
   for i in 0 ..< m:
-    d = re.find(text, lits_find_re)
+    regex.match text, regex.rex"[0-9]+..*":
+      d = true
   doNotOptimizeAway(d)
 
 when false:  # XXX remove
+  var lits_find_re = re.re"do|re|mi|fa|sol"
+
+  bench(re_lits_find, m):
+    var d: int
+    for i in 0 ..< m:
+      d = re.find(text, lits_find_re)
+    doNotOptimizeAway(d)
+
   const lits_find = regex.re"do|re|mi|fa|sol"
 
   benchRelative(regex_lits_find, m):
@@ -92,7 +113,7 @@ bench(re_email_find_all, m):
 
 const email_find_all = regex.re"[\w\.+-]+@[\w\.-]+\.[\w\.-]+"
 
-benchRelative(email_find_all, m):
+benchRelative(regex_email_find_all, m):
   var d = 0
   for i in 0 ..< m:
     for _ in regex.findAll(bench_text, email_find_all):
@@ -112,7 +133,7 @@ bench(re_uri_find_all, m):
 
 const uri_find_all = regex.re"[\w]+://[^/\s?#]+[^\s?#]+(?:\?[^\s#]*)?(?:#[^\s]*)?"
 
-benchRelative(uri_find_all, m):
+benchRelative(regex_uri_find_all, m):
   var d = 0
   for i in 0 ..< m:
     for _ in regex.findAll(bench_text, uri_find_all):
@@ -132,7 +153,7 @@ bench(re_ip_find_all, m):
 
 const ip_find_all = regex.re"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])"
 
-benchRelative(ip_find_all, m):
+benchRelative(regex_ip_find_all, m):
   var d = 0
   for i in 0 ..< m:
     for _ in regex.findAll(bench_text, ip_find_all):
diff --git a/debian/changelog b/debian/changelog
index 92bdf1d..ae56b85 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+nim-regex (0.19.0+git20220308.1.a37b8f2-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Fri, 01 Apr 2022 05:22:19 -0000
+
 nim-regex (0.17.0+ds-2) unstable; urgency=medium
 
   * Added some sanity to the package.
diff --git a/docs/dochack.js b/docs/dochack.js
new file mode 100644
index 0000000..fcc691f
--- /dev/null
+++ b/docs/dochack.js
@@ -0,0 +1,1955 @@
+/* Generated by the Nim Compiler v1.5.1 */
+var framePtr = null;
+var excHandler = 0;
+var lastJSError = null;
+var NTI536870915 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI402653734 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093812 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093811 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093810 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093809 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093808 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093807 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093806 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093805 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093804 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093803 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093802 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093801 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093800 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093799 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093798 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093797 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093796 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093795 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093794 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093793 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093792 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093791 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093790 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093698 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093742 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093741 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093861 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093858 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI520093857 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI520093788 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093860 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI520093789 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093730 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093729 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093835 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093732 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093731 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093834 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093833 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093740 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093739 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093832 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093831 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093734 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093733 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093830 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093837 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093736 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093735 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093836 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI33554454 = {size: 0,kind: 31,base: null,node: null,finalizer: null};
+var NTI520093840 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093738 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093737 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI33554464 = {size: 0,kind: 1,base: null,node: null,finalizer: null};
+var NTI520093711 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093710 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093718 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093717 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093716 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093715 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520093712 = {size: 0, kind: 14, base: null, node: null, finalizer: null};
+var NTI520093829 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093828 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093827 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI520093714 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI520093713 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI520094115 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI33555108 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555112 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555071 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555149 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI33554437 = {size: 0,kind: 28,base: null,node: null,finalizer: null};
+var NTI33554438 = {size: 0,kind: 29,base: null,node: null,finalizer: null};
+var NTI33555148 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI33555096 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555097 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555104 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI33555106 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NNI33555106 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555106.node = NNI33555106;
+var NNI33555104 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555104.node = NNI33555104;
+var NNI33555097 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555097.node = NNI33555097;
+NTI33555148.base = NTI33555096;
+NTI33555149.base = NTI33555096;
+var NNI33555096 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "parent", len: 0, typ: NTI33555148, name: "parent", sons: null}, 
+{kind: 1, offset: "name", len: 0, typ: NTI33554438, name: "name", sons: null}, 
+{kind: 1, offset: "message", len: 0, typ: NTI33554437, name: "msg", sons: null}, 
+{kind: 1, offset: "trace", len: 0, typ: NTI33554437, name: "trace", sons: null}, 
+{kind: 1, offset: "up", len: 0, typ: NTI33555149, name: "up", sons: null}]};
+NTI33555096.node = NNI33555096;
+var NNI33555071 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555071.node = NNI33555071;
+NTI33555096.base = NTI33555071;
+NTI33555097.base = NTI33555096;
+NTI33555104.base = NTI33555097;
+NTI33555106.base = NTI33555104;
+var NNI33555112 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555112.node = NNI33555112;
+NTI33555112.base = NTI33555097;
+var NNI33555108 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI33555108.node = NNI33555108;
+NTI33555108.base = NTI33555097;
+NTI520093827.base = NTI520093713;
+NTI520093828.base = NTI520093713;
+NTI520093829.base = NTI520093713;
+var NNI520093712 = {kind: 2, offset: 0, typ: null, name: null, len: 12, sons: {"1": {kind: 1, offset: 1, typ: NTI520093712, name: "ElementNode", len: 0, sons: null}, 
+"2": {kind: 1, offset: 2, typ: NTI520093712, name: "AttributeNode", len: 0, sons: null}, 
+"3": {kind: 1, offset: 3, typ: NTI520093712, name: "TextNode", len: 0, sons: null}, 
+"4": {kind: 1, offset: 4, typ: NTI520093712, name: "CDATANode", len: 0, sons: null}, 
+"5": {kind: 1, offset: 5, typ: NTI520093712, name: "EntityRefNode", len: 0, sons: null}, 
+"6": {kind: 1, offset: 6, typ: NTI520093712, name: "EntityNode", len: 0, sons: null}, 
+"7": {kind: 1, offset: 7, typ: NTI520093712, name: "ProcessingInstructionNode", len: 0, sons: null}, 
+"8": {kind: 1, offset: 8, typ: NTI520093712, name: "CommentNode", len: 0, sons: null}, 
+"9": {kind: 1, offset: 9, typ: NTI520093712, name: "DocumentNode", len: 0, sons: null}, 
+"10": {kind: 1, offset: 10, typ: NTI520093712, name: "DocumentTypeNode", len: 0, sons: null}, 
+"11": {kind: 1, offset: 11, typ: NTI520093712, name: "DocumentFragmentNode", len: 0, sons: null}, 
+"12": {kind: 1, offset: 12, typ: NTI520093712, name: "NotationNode", len: 0, sons: null}}};
+NTI520093712.node = NNI520093712;
+var NNI520093711 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI520093711.node = NNI520093711;
+NTI520093711.base = NTI33555071;
+NTI520093710.base = NTI520093711;
+NTI520093840.base = NTI520093717;
+var NNI520093738 = {kind: 2, len: 10, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "acceptCharset", len: 0, typ: NTI33554438, name: "acceptCharset", sons: null}, 
+{kind: 1, offset: "action", len: 0, typ: NTI33554438, name: "action", sons: null}, 
+{kind: 1, offset: "autocomplete", len: 0, typ: NTI33554438, name: "autocomplete", sons: null}, 
+{kind: 1, offset: "elements", len: 0, typ: NTI520093840, name: "elements", sons: null}, 
+{kind: 1, offset: "encoding", len: 0, typ: NTI33554438, name: "encoding", sons: null}, 
+{kind: 1, offset: "enctype", len: 0, typ: NTI33554438, name: "enctype", sons: null}, 
+{kind: 1, offset: "length", len: 0, typ: NTI33554454, name: "length", sons: null}, 
+{kind: 1, offset: "method", len: 0, typ: NTI33554438, name: "method", sons: null}, 
+{kind: 1, offset: "noValidate", len: 0, typ: NTI33554464, name: "noValidate", sons: null}, 
+{kind: 1, offset: "target", len: 0, typ: NTI33554438, name: "target", sons: null}]};
+NTI520093738.node = NNI520093738;
+NTI520093738.base = NTI520093718;
+NTI520093737.base = NTI520093738;
+var NNI520093736 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "defaultSelected", len: 0, typ: NTI33554464, name: "defaultSelected", sons: null}, 
+{kind: 1, offset: "selected", len: 0, typ: NTI33554464, name: "selected", sons: null}, 
+{kind: 1, offset: "selectedIndex", len: 0, typ: NTI33554454, name: "selectedIndex", sons: null}, 
+{kind: 1, offset: "text", len: 0, typ: NTI33554438, name: "text", sons: null}, 
+{kind: 1, offset: "value", len: 0, typ: NTI33554438, name: "value", sons: null}]};
+NTI520093736.node = NNI520093736;
+NTI520093736.base = NTI520093718;
+NTI520093735.base = NTI520093736;
+NTI520093836.base = NTI520093735;
+NTI520093837.base = NTI520093735;
+var NNI520093718 = {kind: 2, len: 20, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "className", len: 0, typ: NTI33554438, name: "className", sons: null}, 
+{kind: 1, offset: "classList", len: 0, typ: NTI520093710, name: "classList", sons: null}, 
+{kind: 1, offset: "checked", len: 0, typ: NTI33554464, name: "checked", sons: null}, 
+{kind: 1, offset: "defaultChecked", len: 0, typ: NTI33554464, name: "defaultChecked", sons: null}, 
+{kind: 1, offset: "defaultValue", len: 0, typ: NTI33554438, name: "defaultValue", sons: null}, 
+{kind: 1, offset: "disabled", len: 0, typ: NTI33554464, name: "disabled", sons: null}, 
+{kind: 1, offset: "form", len: 0, typ: NTI520093737, name: "form", sons: null}, 
+{kind: 1, offset: "name", len: 0, typ: NTI33554438, name: "name", sons: null}, 
+{kind: 1, offset: "readOnly", len: 0, typ: NTI33554464, name: "readOnly", sons: null}, 
+{kind: 1, offset: "options", len: 0, typ: NTI520093836, name: "options", sons: null}, 
+{kind: 1, offset: "selectedOptions", len: 0, typ: NTI520093837, name: "selectedOptions", sons: null}, 
+{kind: 1, offset: "clientWidth", len: 0, typ: NTI33554454, name: "clientWidth", sons: null}, 
+{kind: 1, offset: "clientHeight", len: 0, typ: NTI33554454, name: "clientHeight", sons: null}, 
+{kind: 1, offset: "contentEditable", len: 0, typ: NTI33554438, name: "contentEditable", sons: null}, 
+{kind: 1, offset: "isContentEditable", len: 0, typ: NTI33554464, name: "isContentEditable", sons: null}, 
+{kind: 1, offset: "dir", len: 0, typ: NTI33554438, name: "dir", sons: null}, 
+{kind: 1, offset: "offsetHeight", len: 0, typ: NTI33554454, name: "offsetHeight", sons: null}, 
+{kind: 1, offset: "offsetWidth", len: 0, typ: NTI33554454, name: "offsetWidth", sons: null}, 
+{kind: 1, offset: "offsetLeft", len: 0, typ: NTI33554454, name: "offsetLeft", sons: null}, 
+{kind: 1, offset: "offsetTop", len: 0, typ: NTI33554454, name: "offsetTop", sons: null}]};
+NTI520093718.node = NNI520093718;
+NTI520093718.base = NTI520093714;
+NTI520093717.base = NTI520093718;
+var NNI520093734 = {kind: 2, len: 3, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "text", len: 0, typ: NTI33554438, name: "text", sons: null}, 
+{kind: 1, offset: "x", len: 0, typ: NTI33554454, name: "x", sons: null}, 
+{kind: 1, offset: "y", len: 0, typ: NTI33554454, name: "y", sons: null}]};
+NTI520093734.node = NNI520093734;
+NTI520093734.base = NTI520093718;
+NTI520093733.base = NTI520093734;
+NTI520093830.base = NTI520093733;
+NTI520093831.base = NTI520093737;
+var NNI520093740 = {kind: 2, len: 8, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "border", len: 0, typ: NTI33554454, name: "border", sons: null}, 
+{kind: 1, offset: "complete", len: 0, typ: NTI33554464, name: "complete", sons: null}, 
+{kind: 1, offset: "height", len: 0, typ: NTI33554454, name: "height", sons: null}, 
+{kind: 1, offset: "hspace", len: 0, typ: NTI33554454, name: "hspace", sons: null}, 
+{kind: 1, offset: "lowsrc", len: 0, typ: NTI33554438, name: "lowsrc", sons: null}, 
+{kind: 1, offset: "src", len: 0, typ: NTI33554438, name: "src", sons: null}, 
+{kind: 1, offset: "vspace", len: 0, typ: NTI33554454, name: "vspace", sons: null}, 
+{kind: 1, offset: "width", len: 0, typ: NTI33554454, name: "width", sons: null}]};
+NTI520093740.node = NNI520093740;
+NTI520093740.base = NTI520093718;
+NTI520093739.base = NTI520093740;
+NTI520093832.base = NTI520093739;
+NTI520093833.base = NTI520093717;
+var NNI520093732 = {kind: 2, len: 6, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "height", len: 0, typ: NTI33554454, name: "height", sons: null}, 
+{kind: 1, offset: "hspace", len: 0, typ: NTI33554454, name: "hspace", sons: null}, 
+{kind: 1, offset: "src", len: 0, typ: NTI33554438, name: "src", sons: null}, 
+{kind: 1, offset: "width", len: 0, typ: NTI33554454, name: "width", sons: null}, 
+{kind: 1, offset: "type", len: 0, typ: NTI33554438, name: "type", sons: null}, 
+{kind: 1, offset: "vspace", len: 0, typ: NTI33554454, name: "vspace", sons: null}]};
+NTI520093732.node = NNI520093732;
+NTI520093732.base = NTI520093718;
+NTI520093731.base = NTI520093732;
+NTI520093834.base = NTI520093731;
+var NNI520093730 = {kind: 2, len: 4, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "target", len: 0, typ: NTI33554438, name: "target", sons: null}, 
+{kind: 1, offset: "text", len: 0, typ: NTI33554438, name: "text", sons: null}, 
+{kind: 1, offset: "x", len: 0, typ: NTI33554454, name: "x", sons: null}, 
+{kind: 1, offset: "y", len: 0, typ: NTI33554454, name: "y", sons: null}]};
+NTI520093730.node = NNI520093730;
+NTI520093730.base = NTI520093718;
+NTI520093729.base = NTI520093730;
+NTI520093835.base = NTI520093729;
+var NNI520093857 = {kind: 1, offset: "then", len: 0, typ: NTI520093858, name: "then", sons: null};
+NTI520093857.node = NNI520093857;
+NTI520093788.base = NTI520093857;
+var NNI520093860 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "ready", len: 0, typ: NTI520093788, name: "ready", sons: null}, 
+{kind: 1, offset: "onloadingdone", len: 0, typ: NTI520093861, name: "onloadingdone", sons: null}]};
+NTI520093860.node = NNI520093860;
+NTI520093789.base = NTI520093860;
+var NNI520093716 = {kind: 2, len: 23, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "activeElement", len: 0, typ: NTI520093717, name: "activeElement", sons: null}, 
+{kind: 1, offset: "documentElement", len: 0, typ: NTI520093717, name: "documentElement", sons: null}, 
+{kind: 1, offset: "alinkColor", len: 0, typ: NTI33554438, name: "alinkColor", sons: null}, 
+{kind: 1, offset: "bgColor", len: 0, typ: NTI33554438, name: "bgColor", sons: null}, 
+{kind: 1, offset: "body", len: 0, typ: NTI520093717, name: "body", sons: null}, 
+{kind: 1, offset: "charset", len: 0, typ: NTI33554438, name: "charset", sons: null}, 
+{kind: 1, offset: "cookie", len: 0, typ: NTI33554438, name: "cookie", sons: null}, 
+{kind: 1, offset: "defaultCharset", len: 0, typ: NTI33554438, name: "defaultCharset", sons: null}, 
+{kind: 1, offset: "fgColor", len: 0, typ: NTI33554438, name: "fgColor", sons: null}, 
+{kind: 1, offset: "head", len: 0, typ: NTI520093717, name: "head", sons: null}, 
+{kind: 1, offset: "lastModified", len: 0, typ: NTI33554438, name: "lastModified", sons: null}, 
+{kind: 1, offset: "linkColor", len: 0, typ: NTI33554438, name: "linkColor", sons: null}, 
+{kind: 1, offset: "referrer", len: 0, typ: NTI33554438, name: "referrer", sons: null}, 
+{kind: 1, offset: "title", len: 0, typ: NTI33554438, name: "title", sons: null}, 
+{kind: 1, offset: "URL", len: 0, typ: NTI33554438, name: "URL", sons: null}, 
+{kind: 1, offset: "vlinkColor", len: 0, typ: NTI33554438, name: "vlinkColor", sons: null}, 
+{kind: 1, offset: "anchors", len: 0, typ: NTI520093830, name: "anchors", sons: null}, 
+{kind: 1, offset: "forms", len: 0, typ: NTI520093831, name: "forms", sons: null}, 
+{kind: 1, offset: "images", len: 0, typ: NTI520093832, name: "images", sons: null}, 
+{kind: 1, offset: "applets", len: 0, typ: NTI520093833, name: "applets", sons: null}, 
+{kind: 1, offset: "embeds", len: 0, typ: NTI520093834, name: "embeds", sons: null}, 
+{kind: 1, offset: "links", len: 0, typ: NTI520093835, name: "links", sons: null}, 
+{kind: 1, offset: "fonts", len: 0, typ: NTI520093789, name: "fonts", sons: null}]};
+NTI520093716.node = NNI520093716;
+NTI520093716.base = NTI520093714;
+NTI520093715.base = NTI520093716;
+var NNI520093742 = {kind: 2, len: 368, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "alignContent", len: 0, typ: NTI33554438, name: "alignContent", sons: null}, 
+{kind: 1, offset: "alignItems", len: 0, typ: NTI33554438, name: "alignItems", sons: null}, 
+{kind: 1, offset: "alignSelf", len: 0, typ: NTI33554438, name: "alignSelf", sons: null}, 
+{kind: 1, offset: "all", len: 0, typ: NTI33554438, name: "all", sons: null}, 
+{kind: 1, offset: "animation", len: 0, typ: NTI33554438, name: "animation", sons: null}, 
+{kind: 1, offset: "animationDelay", len: 0, typ: NTI33554438, name: "animationDelay", sons: null}, 
+{kind: 1, offset: "animationDirection", len: 0, typ: NTI33554438, name: "animationDirection", sons: null}, 
+{kind: 1, offset: "animationDuration", len: 0, typ: NTI33554438, name: "animationDuration", sons: null}, 
+{kind: 1, offset: "animationFillMode", len: 0, typ: NTI33554438, name: "animationFillMode", sons: null}, 
+{kind: 1, offset: "animationIterationCount", len: 0, typ: NTI33554438, name: "animationIterationCount", sons: null}, 
+{kind: 1, offset: "animationName", len: 0, typ: NTI33554438, name: "animationName", sons: null}, 
+{kind: 1, offset: "animationPlayState", len: 0, typ: NTI33554438, name: "animationPlayState", sons: null}, 
+{kind: 1, offset: "animationTimingFunction", len: 0, typ: NTI33554438, name: "animationTimingFunction", sons: null}, 
+{kind: 1, offset: "backdropFilter", len: 0, typ: NTI33554438, name: "backdropFilter", sons: null}, 
+{kind: 1, offset: "backfaceVisibility", len: 0, typ: NTI33554438, name: "backfaceVisibility", sons: null}, 
+{kind: 1, offset: "background", len: 0, typ: NTI33554438, name: "background", sons: null}, 
+{kind: 1, offset: "backgroundAttachment", len: 0, typ: NTI33554438, name: "backgroundAttachment", sons: null}, 
+{kind: 1, offset: "backgroundBlendMode", len: 0, typ: NTI33554438, name: "backgroundBlendMode", sons: null}, 
+{kind: 1, offset: "backgroundClip", len: 0, typ: NTI33554438, name: "backgroundClip", sons: null}, 
+{kind: 1, offset: "backgroundColor", len: 0, typ: NTI33554438, name: "backgroundColor", sons: null}, 
+{kind: 1, offset: "backgroundImage", len: 0, typ: NTI33554438, name: "backgroundImage", sons: null}, 
+{kind: 1, offset: "backgroundOrigin", len: 0, typ: NTI33554438, name: "backgroundOrigin", sons: null}, 
+{kind: 1, offset: "backgroundPosition", len: 0, typ: NTI33554438, name: "backgroundPosition", sons: null}, 
+{kind: 1, offset: "backgroundRepeat", len: 0, typ: NTI33554438, name: "backgroundRepeat", sons: null}, 
+{kind: 1, offset: "backgroundSize", len: 0, typ: NTI33554438, name: "backgroundSize", sons: null}, 
+{kind: 1, offset: "blockSize", len: 0, typ: NTI33554438, name: "blockSize", sons: null}, 
+{kind: 1, offset: "border", len: 0, typ: NTI33554438, name: "border", sons: null}, 
+{kind: 1, offset: "borderBlock", len: 0, typ: NTI33554438, name: "borderBlock", sons: null}, 
+{kind: 1, offset: "borderBlockColor", len: 0, typ: NTI33554438, name: "borderBlockColor", sons: null}, 
+{kind: 1, offset: "borderBlockEnd", len: 0, typ: NTI33554438, name: "borderBlockEnd", sons: null}, 
+{kind: 1, offset: "borderBlockEndColor", len: 0, typ: NTI33554438, name: "borderBlockEndColor", sons: null}, 
+{kind: 1, offset: "borderBlockEndStyle", len: 0, typ: NTI33554438, name: "borderBlockEndStyle", sons: null}, 
+{kind: 1, offset: "borderBlockEndWidth", len: 0, typ: NTI33554438, name: "borderBlockEndWidth", sons: null}, 
+{kind: 1, offset: "borderBlockStart", len: 0, typ: NTI33554438, name: "borderBlockStart", sons: null}, 
+{kind: 1, offset: "borderBlockStartColor", len: 0, typ: NTI33554438, name: "borderBlockStartColor", sons: null}, 
+{kind: 1, offset: "borderBlockStartStyle", len: 0, typ: NTI33554438, name: "borderBlockStartStyle", sons: null}, 
+{kind: 1, offset: "borderBlockStartWidth", len: 0, typ: NTI33554438, name: "borderBlockStartWidth", sons: null}, 
+{kind: 1, offset: "borderBlockStyle", len: 0, typ: NTI33554438, name: "borderBlockStyle", sons: null}, 
+{kind: 1, offset: "borderBlockWidth", len: 0, typ: NTI33554438, name: "borderBlockWidth", sons: null}, 
+{kind: 1, offset: "borderBottom", len: 0, typ: NTI33554438, name: "borderBottom", sons: null}, 
+{kind: 1, offset: "borderBottomColor", len: 0, typ: NTI33554438, name: "borderBottomColor", sons: null}, 
+{kind: 1, offset: "borderBottomLeftRadius", len: 0, typ: NTI33554438, name: "borderBottomLeftRadius", sons: null}, 
+{kind: 1, offset: "borderBottomRightRadius", len: 0, typ: NTI33554438, name: "borderBottomRightRadius", sons: null}, 
+{kind: 1, offset: "borderBottomStyle", len: 0, typ: NTI33554438, name: "borderBottomStyle", sons: null}, 
+{kind: 1, offset: "borderBottomWidth", len: 0, typ: NTI33554438, name: "borderBottomWidth", sons: null}, 
+{kind: 1, offset: "borderCollapse", len: 0, typ: NTI33554438, name: "borderCollapse", sons: null}, 
+{kind: 1, offset: "borderColor", len: 0, typ: NTI33554438, name: "borderColor", sons: null}, 
+{kind: 1, offset: "borderEndEndRadius", len: 0, typ: NTI33554438, name: "borderEndEndRadius", sons: null}, 
+{kind: 1, offset: "borderEndStartRadius", len: 0, typ: NTI33554438, name: "borderEndStartRadius", sons: null}, 
+{kind: 1, offset: "borderImage", len: 0, typ: NTI33554438, name: "borderImage", sons: null}, 
+{kind: 1, offset: "borderImageOutset", len: 0, typ: NTI33554438, name: "borderImageOutset", sons: null}, 
+{kind: 1, offset: "borderImageRepeat", len: 0, typ: NTI33554438, name: "borderImageRepeat", sons: null}, 
+{kind: 1, offset: "borderImageSlice", len: 0, typ: NTI33554438, name: "borderImageSlice", sons: null}, 
+{kind: 1, offset: "borderImageSource", len: 0, typ: NTI33554438, name: "borderImageSource", sons: null}, 
+{kind: 1, offset: "borderImageWidth", len: 0, typ: NTI33554438, name: "borderImageWidth", sons: null}, 
+{kind: 1, offset: "borderInline", len: 0, typ: NTI33554438, name: "borderInline", sons: null}, 
+{kind: 1, offset: "borderInlineColor", len: 0, typ: NTI33554438, name: "borderInlineColor", sons: null}, 
+{kind: 1, offset: "borderInlineEnd", len: 0, typ: NTI33554438, name: "borderInlineEnd", sons: null}, 
+{kind: 1, offset: "borderInlineEndColor", len: 0, typ: NTI33554438, name: "borderInlineEndColor", sons: null}, 
+{kind: 1, offset: "borderInlineEndStyle", len: 0, typ: NTI33554438, name: "borderInlineEndStyle", sons: null}, 
+{kind: 1, offset: "borderInlineEndWidth", len: 0, typ: NTI33554438, name: "borderInlineEndWidth", sons: null}, 
+{kind: 1, offset: "borderInlineStart", len: 0, typ: NTI33554438, name: "borderInlineStart", sons: null}, 
+{kind: 1, offset: "borderInlineStartColor", len: 0, typ: NTI33554438, name: "borderInlineStartColor", sons: null}, 
+{kind: 1, offset: "borderInlineStartStyle", len: 0, typ: NTI33554438, name: "borderInlineStartStyle", sons: null}, 
+{kind: 1, offset: "borderInlineStartWidth", len: 0, typ: NTI33554438, name: "borderInlineStartWidth", sons: null}, 
+{kind: 1, offset: "borderInlineStyle", len: 0, typ: NTI33554438, name: "borderInlineStyle", sons: null}, 
+{kind: 1, offset: "borderInlineWidth", len: 0, typ: NTI33554438, name: "borderInlineWidth", sons: null}, 
+{kind: 1, offset: "borderLeft", len: 0, typ: NTI33554438, name: "borderLeft", sons: null}, 
+{kind: 1, offset: "borderLeftColor", len: 0, typ: NTI33554438, name: "borderLeftColor", sons: null}, 
+{kind: 1, offset: "borderLeftStyle", len: 0, typ: NTI33554438, name: "borderLeftStyle", sons: null}, 
+{kind: 1, offset: "borderLeftWidth", len: 0, typ: NTI33554438, name: "borderLeftWidth", sons: null}, 
+{kind: 1, offset: "borderRadius", len: 0, typ: NTI33554438, name: "borderRadius", sons: null}, 
+{kind: 1, offset: "borderRight", len: 0, typ: NTI33554438, name: "borderRight", sons: null}, 
+{kind: 1, offset: "borderRightColor", len: 0, typ: NTI33554438, name: "borderRightColor", sons: null}, 
+{kind: 1, offset: "borderRightStyle", len: 0, typ: NTI33554438, name: "borderRightStyle", sons: null}, 
+{kind: 1, offset: "borderRightWidth", len: 0, typ: NTI33554438, name: "borderRightWidth", sons: null}, 
+{kind: 1, offset: "borderSpacing", len: 0, typ: NTI33554438, name: "borderSpacing", sons: null}, 
+{kind: 1, offset: "borderStartEndRadius", len: 0, typ: NTI33554438, name: "borderStartEndRadius", sons: null}, 
+{kind: 1, offset: "borderStartStartRadius", len: 0, typ: NTI33554438, name: "borderStartStartRadius", sons: null}, 
+{kind: 1, offset: "borderStyle", len: 0, typ: NTI33554438, name: "borderStyle", sons: null}, 
+{kind: 1, offset: "borderTop", len: 0, typ: NTI33554438, name: "borderTop", sons: null}, 
+{kind: 1, offset: "borderTopColor", len: 0, typ: NTI33554438, name: "borderTopColor", sons: null}, 
+{kind: 1, offset: "borderTopLeftRadius", len: 0, typ: NTI33554438, name: "borderTopLeftRadius", sons: null}, 
+{kind: 1, offset: "borderTopRightRadius", len: 0, typ: NTI33554438, name: "borderTopRightRadius", sons: null}, 
+{kind: 1, offset: "borderTopStyle", len: 0, typ: NTI33554438, name: "borderTopStyle", sons: null}, 
+{kind: 1, offset: "borderTopWidth", len: 0, typ: NTI33554438, name: "borderTopWidth", sons: null}, 
+{kind: 1, offset: "borderWidth", len: 0, typ: NTI33554438, name: "borderWidth", sons: null}, 
+{kind: 1, offset: "bottom", len: 0, typ: NTI33554438, name: "bottom", sons: null}, 
+{kind: 1, offset: "boxDecorationBreak", len: 0, typ: NTI33554438, name: "boxDecorationBreak", sons: null}, 
+{kind: 1, offset: "boxShadow", len: 0, typ: NTI33554438, name: "boxShadow", sons: null}, 
+{kind: 1, offset: "boxSizing", len: 0, typ: NTI33554438, name: "boxSizing", sons: null}, 
+{kind: 1, offset: "breakAfter", len: 0, typ: NTI33554438, name: "breakAfter", sons: null}, 
+{kind: 1, offset: "breakBefore", len: 0, typ: NTI33554438, name: "breakBefore", sons: null}, 
+{kind: 1, offset: "breakInside", len: 0, typ: NTI33554438, name: "breakInside", sons: null}, 
+{kind: 1, offset: "captionSide", len: 0, typ: NTI33554438, name: "captionSide", sons: null}, 
+{kind: 1, offset: "caretColor", len: 0, typ: NTI33554438, name: "caretColor", sons: null}, 
+{kind: 1, offset: "clear", len: 0, typ: NTI33554438, name: "clear", sons: null}, 
+{kind: 1, offset: "clip", len: 0, typ: NTI33554438, name: "clip", sons: null}, 
+{kind: 1, offset: "clipPath", len: 0, typ: NTI33554438, name: "clipPath", sons: null}, 
+{kind: 1, offset: "color", len: 0, typ: NTI33554438, name: "color", sons: null}, 
+{kind: 1, offset: "colorAdjust", len: 0, typ: NTI33554438, name: "colorAdjust", sons: null}, 
+{kind: 1, offset: "columnCount", len: 0, typ: NTI33554438, name: "columnCount", sons: null}, 
+{kind: 1, offset: "columnFill", len: 0, typ: NTI33554438, name: "columnFill", sons: null}, 
+{kind: 1, offset: "columnGap", len: 0, typ: NTI33554438, name: "columnGap", sons: null}, 
+{kind: 1, offset: "columnRule", len: 0, typ: NTI33554438, name: "columnRule", sons: null}, 
+{kind: 1, offset: "columnRuleColor", len: 0, typ: NTI33554438, name: "columnRuleColor", sons: null}, 
+{kind: 1, offset: "columnRuleStyle", len: 0, typ: NTI33554438, name: "columnRuleStyle", sons: null}, 
+{kind: 1, offset: "columnRuleWidth", len: 0, typ: NTI33554438, name: "columnRuleWidth", sons: null}, 
+{kind: 1, offset: "columnSpan", len: 0, typ: NTI33554438, name: "columnSpan", sons: null}, 
+{kind: 1, offset: "columnWidth", len: 0, typ: NTI33554438, name: "columnWidth", sons: null}, 
+{kind: 1, offset: "columns", len: 0, typ: NTI33554438, name: "columns", sons: null}, 
+{kind: 1, offset: "contain", len: 0, typ: NTI33554438, name: "contain", sons: null}, 
+{kind: 1, offset: "content", len: 0, typ: NTI33554438, name: "content", sons: null}, 
+{kind: 1, offset: "counterIncrement", len: 0, typ: NTI33554438, name: "counterIncrement", sons: null}, 
+{kind: 1, offset: "counterReset", len: 0, typ: NTI33554438, name: "counterReset", sons: null}, 
+{kind: 1, offset: "counterSet", len: 0, typ: NTI33554438, name: "counterSet", sons: null}, 
+{kind: 1, offset: "cursor", len: 0, typ: NTI33554438, name: "cursor", sons: null}, 
+{kind: 1, offset: "direction", len: 0, typ: NTI33554438, name: "direction", sons: null}, 
+{kind: 1, offset: "display", len: 0, typ: NTI33554438, name: "display", sons: null}, 
+{kind: 1, offset: "emptyCells", len: 0, typ: NTI33554438, name: "emptyCells", sons: null}, 
+{kind: 1, offset: "filter", len: 0, typ: NTI33554438, name: "filter", sons: null}, 
+{kind: 1, offset: "flex", len: 0, typ: NTI33554438, name: "flex", sons: null}, 
+{kind: 1, offset: "flexBasis", len: 0, typ: NTI33554438, name: "flexBasis", sons: null}, 
+{kind: 1, offset: "flexDirection", len: 0, typ: NTI33554438, name: "flexDirection", sons: null}, 
+{kind: 1, offset: "flexFlow", len: 0, typ: NTI33554438, name: "flexFlow", sons: null}, 
+{kind: 1, offset: "flexGrow", len: 0, typ: NTI33554438, name: "flexGrow", sons: null}, 
+{kind: 1, offset: "flexShrink", len: 0, typ: NTI33554438, name: "flexShrink", sons: null}, 
+{kind: 1, offset: "flexWrap", len: 0, typ: NTI33554438, name: "flexWrap", sons: null}, 
+{kind: 1, offset: "cssFloat", len: 0, typ: NTI33554438, name: "cssFloat", sons: null}, 
+{kind: 1, offset: "font", len: 0, typ: NTI33554438, name: "font", sons: null}, 
+{kind: 1, offset: "fontFamily", len: 0, typ: NTI33554438, name: "fontFamily", sons: null}, 
+{kind: 1, offset: "fontFeatureSettings", len: 0, typ: NTI33554438, name: "fontFeatureSettings", sons: null}, 
+{kind: 1, offset: "fontKerning", len: 0, typ: NTI33554438, name: "fontKerning", sons: null}, 
+{kind: 1, offset: "fontLanguageOverride", len: 0, typ: NTI33554438, name: "fontLanguageOverride", sons: null}, 
+{kind: 1, offset: "fontOpticalSizing", len: 0, typ: NTI33554438, name: "fontOpticalSizing", sons: null}, 
+{kind: 1, offset: "fontSize", len: 0, typ: NTI33554438, name: "fontSize", sons: null}, 
+{kind: 1, offset: "fontSizeAdjust", len: 0, typ: NTI33554438, name: "fontSizeAdjust", sons: null}, 
+{kind: 1, offset: "fontStretch", len: 0, typ: NTI33554438, name: "fontStretch", sons: null}, 
+{kind: 1, offset: "fontStyle", len: 0, typ: NTI33554438, name: "fontStyle", sons: null}, 
+{kind: 1, offset: "fontSynthesis", len: 0, typ: NTI33554438, name: "fontSynthesis", sons: null}, 
+{kind: 1, offset: "fontVariant", len: 0, typ: NTI33554438, name: "fontVariant", sons: null}, 
+{kind: 1, offset: "fontVariantAlternates", len: 0, typ: NTI33554438, name: "fontVariantAlternates", sons: null}, 
+{kind: 1, offset: "fontVariantCaps", len: 0, typ: NTI33554438, name: "fontVariantCaps", sons: null}, 
+{kind: 1, offset: "fontVariantEastAsian", len: 0, typ: NTI33554438, name: "fontVariantEastAsian", sons: null}, 
+{kind: 1, offset: "fontVariantLigatures", len: 0, typ: NTI33554438, name: "fontVariantLigatures", sons: null}, 
+{kind: 1, offset: "fontVariantNumeric", len: 0, typ: NTI33554438, name: "fontVariantNumeric", sons: null}, 
+{kind: 1, offset: "fontVariantPosition", len: 0, typ: NTI33554438, name: "fontVariantPosition", sons: null}, 
+{kind: 1, offset: "fontVariationSettings", len: 0, typ: NTI33554438, name: "fontVariationSettings", sons: null}, 
+{kind: 1, offset: "fontWeight", len: 0, typ: NTI33554438, name: "fontWeight", sons: null}, 
+{kind: 1, offset: "gap", len: 0, typ: NTI33554438, name: "gap", sons: null}, 
+{kind: 1, offset: "grid", len: 0, typ: NTI33554438, name: "grid", sons: null}, 
+{kind: 1, offset: "gridArea", len: 0, typ: NTI33554438, name: "gridArea", sons: null}, 
+{kind: 1, offset: "gridAutoColumns", len: 0, typ: NTI33554438, name: "gridAutoColumns", sons: null}, 
+{kind: 1, offset: "gridAutoFlow", len: 0, typ: NTI33554438, name: "gridAutoFlow", sons: null}, 
+{kind: 1, offset: "gridAutoRows", len: 0, typ: NTI33554438, name: "gridAutoRows", sons: null}, 
+{kind: 1, offset: "gridColumn", len: 0, typ: NTI33554438, name: "gridColumn", sons: null}, 
+{kind: 1, offset: "gridColumnEnd", len: 0, typ: NTI33554438, name: "gridColumnEnd", sons: null}, 
+{kind: 1, offset: "gridColumnStart", len: 0, typ: NTI33554438, name: "gridColumnStart", sons: null}, 
+{kind: 1, offset: "gridRow", len: 0, typ: NTI33554438, name: "gridRow", sons: null}, 
+{kind: 1, offset: "gridRowEnd", len: 0, typ: NTI33554438, name: "gridRowEnd", sons: null}, 
+{kind: 1, offset: "gridRowStart", len: 0, typ: NTI33554438, name: "gridRowStart", sons: null}, 
+{kind: 1, offset: "gridTemplate", len: 0, typ: NTI33554438, name: "gridTemplate", sons: null}, 
+{kind: 1, offset: "gridTemplateAreas", len: 0, typ: NTI33554438, name: "gridTemplateAreas", sons: null}, 
+{kind: 1, offset: "gridTemplateColumns", len: 0, typ: NTI33554438, name: "gridTemplateColumns", sons: null}, 
+{kind: 1, offset: "gridTemplateRows", len: 0, typ: NTI33554438, name: "gridTemplateRows", sons: null}, 
+{kind: 1, offset: "hangingPunctuation", len: 0, typ: NTI33554438, name: "hangingPunctuation", sons: null}, 
+{kind: 1, offset: "height", len: 0, typ: NTI33554438, name: "height", sons: null}, 
+{kind: 1, offset: "hyphens", len: 0, typ: NTI33554438, name: "hyphens", sons: null}, 
+{kind: 1, offset: "imageOrientation", len: 0, typ: NTI33554438, name: "imageOrientation", sons: null}, 
+{kind: 1, offset: "imageRendering", len: 0, typ: NTI33554438, name: "imageRendering", sons: null}, 
+{kind: 1, offset: "inlineSize", len: 0, typ: NTI33554438, name: "inlineSize", sons: null}, 
+{kind: 1, offset: "inset", len: 0, typ: NTI33554438, name: "inset", sons: null}, 
+{kind: 1, offset: "insetBlock", len: 0, typ: NTI33554438, name: "insetBlock", sons: null}, 
+{kind: 1, offset: "insetBlockEnd", len: 0, typ: NTI33554438, name: "insetBlockEnd", sons: null}, 
+{kind: 1, offset: "insetBlockStart", len: 0, typ: NTI33554438, name: "insetBlockStart", sons: null}, 
+{kind: 1, offset: "insetInline", len: 0, typ: NTI33554438, name: "insetInline", sons: null}, 
+{kind: 1, offset: "insetInlineEnd", len: 0, typ: NTI33554438, name: "insetInlineEnd", sons: null}, 
+{kind: 1, offset: "insetInlineStart", len: 0, typ: NTI33554438, name: "insetInlineStart", sons: null}, 
+{kind: 1, offset: "isolation", len: 0, typ: NTI33554438, name: "isolation", sons: null}, 
+{kind: 1, offset: "justifyContent", len: 0, typ: NTI33554438, name: "justifyContent", sons: null}, 
+{kind: 1, offset: "justifyItems", len: 0, typ: NTI33554438, name: "justifyItems", sons: null}, 
+{kind: 1, offset: "justifySelf", len: 0, typ: NTI33554438, name: "justifySelf", sons: null}, 
+{kind: 1, offset: "left", len: 0, typ: NTI33554438, name: "left", sons: null}, 
+{kind: 1, offset: "letterSpacing", len: 0, typ: NTI33554438, name: "letterSpacing", sons: null}, 
+{kind: 1, offset: "lineBreak", len: 0, typ: NTI33554438, name: "lineBreak", sons: null}, 
+{kind: 1, offset: "lineHeight", len: 0, typ: NTI33554438, name: "lineHeight", sons: null}, 
+{kind: 1, offset: "listStyle", len: 0, typ: NTI33554438, name: "listStyle", sons: null}, 
+{kind: 1, offset: "listStyleImage", len: 0, typ: NTI33554438, name: "listStyleImage", sons: null}, 
+{kind: 1, offset: "listStylePosition", len: 0, typ: NTI33554438, name: "listStylePosition", sons: null}, 
+{kind: 1, offset: "listStyleType", len: 0, typ: NTI33554438, name: "listStyleType", sons: null}, 
+{kind: 1, offset: "margin", len: 0, typ: NTI33554438, name: "margin", sons: null}, 
+{kind: 1, offset: "marginBlock", len: 0, typ: NTI33554438, name: "marginBlock", sons: null}, 
+{kind: 1, offset: "marginBlockEnd", len: 0, typ: NTI33554438, name: "marginBlockEnd", sons: null}, 
+{kind: 1, offset: "marginBlockStart", len: 0, typ: NTI33554438, name: "marginBlockStart", sons: null}, 
+{kind: 1, offset: "marginBottom", len: 0, typ: NTI33554438, name: "marginBottom", sons: null}, 
+{kind: 1, offset: "marginInline", len: 0, typ: NTI33554438, name: "marginInline", sons: null}, 
+{kind: 1, offset: "marginInlineEnd", len: 0, typ: NTI33554438, name: "marginInlineEnd", sons: null}, 
+{kind: 1, offset: "marginInlineStart", len: 0, typ: NTI33554438, name: "marginInlineStart", sons: null}, 
+{kind: 1, offset: "marginLeft", len: 0, typ: NTI33554438, name: "marginLeft", sons: null}, 
+{kind: 1, offset: "marginRight", len: 0, typ: NTI33554438, name: "marginRight", sons: null}, 
+{kind: 1, offset: "marginTop", len: 0, typ: NTI33554438, name: "marginTop", sons: null}, 
+{kind: 1, offset: "mask", len: 0, typ: NTI33554438, name: "mask", sons: null}, 
+{kind: 1, offset: "maskBorder", len: 0, typ: NTI33554438, name: "maskBorder", sons: null}, 
+{kind: 1, offset: "maskBorderMode", len: 0, typ: NTI33554438, name: "maskBorderMode", sons: null}, 
+{kind: 1, offset: "maskBorderOutset", len: 0, typ: NTI33554438, name: "maskBorderOutset", sons: null}, 
+{kind: 1, offset: "maskBorderRepeat", len: 0, typ: NTI33554438, name: "maskBorderRepeat", sons: null}, 
+{kind: 1, offset: "maskBorderSlice", len: 0, typ: NTI33554438, name: "maskBorderSlice", sons: null}, 
+{kind: 1, offset: "maskBorderSource", len: 0, typ: NTI33554438, name: "maskBorderSource", sons: null}, 
+{kind: 1, offset: "maskBorderWidth", len: 0, typ: NTI33554438, name: "maskBorderWidth", sons: null}, 
+{kind: 1, offset: "maskClip", len: 0, typ: NTI33554438, name: "maskClip", sons: null}, 
+{kind: 1, offset: "maskComposite", len: 0, typ: NTI33554438, name: "maskComposite", sons: null}, 
+{kind: 1, offset: "maskImage", len: 0, typ: NTI33554438, name: "maskImage", sons: null}, 
+{kind: 1, offset: "maskMode", len: 0, typ: NTI33554438, name: "maskMode", sons: null}, 
+{kind: 1, offset: "maskOrigin", len: 0, typ: NTI33554438, name: "maskOrigin", sons: null}, 
+{kind: 1, offset: "maskPosition", len: 0, typ: NTI33554438, name: "maskPosition", sons: null}, 
+{kind: 1, offset: "maskRepeat", len: 0, typ: NTI33554438, name: "maskRepeat", sons: null}, 
+{kind: 1, offset: "maskSize", len: 0, typ: NTI33554438, name: "maskSize", sons: null}, 
+{kind: 1, offset: "maskType", len: 0, typ: NTI33554438, name: "maskType", sons: null}, 
+{kind: 1, offset: "maxBlockSize", len: 0, typ: NTI33554438, name: "maxBlockSize", sons: null}, 
+{kind: 1, offset: "maxHeight", len: 0, typ: NTI33554438, name: "maxHeight", sons: null}, 
+{kind: 1, offset: "maxInlineSize", len: 0, typ: NTI33554438, name: "maxInlineSize", sons: null}, 
+{kind: 1, offset: "maxWidth", len: 0, typ: NTI33554438, name: "maxWidth", sons: null}, 
+{kind: 1, offset: "minBlockSize", len: 0, typ: NTI33554438, name: "minBlockSize", sons: null}, 
+{kind: 1, offset: "minHeight", len: 0, typ: NTI33554438, name: "minHeight", sons: null}, 
+{kind: 1, offset: "minInlineSize", len: 0, typ: NTI33554438, name: "minInlineSize", sons: null}, 
+{kind: 1, offset: "minWidth", len: 0, typ: NTI33554438, name: "minWidth", sons: null}, 
+{kind: 1, offset: "mixBlendMode", len: 0, typ: NTI33554438, name: "mixBlendMode", sons: null}, 
+{kind: 1, offset: "objectFit", len: 0, typ: NTI33554438, name: "objectFit", sons: null}, 
+{kind: 1, offset: "objectPosition", len: 0, typ: NTI33554438, name: "objectPosition", sons: null}, 
+{kind: 1, offset: "offset", len: 0, typ: NTI33554438, name: "offset", sons: null}, 
+{kind: 1, offset: "offsetAnchor", len: 0, typ: NTI33554438, name: "offsetAnchor", sons: null}, 
+{kind: 1, offset: "offsetDistance", len: 0, typ: NTI33554438, name: "offsetDistance", sons: null}, 
+{kind: 1, offset: "offsetPath", len: 0, typ: NTI33554438, name: "offsetPath", sons: null}, 
+{kind: 1, offset: "offsetRotate", len: 0, typ: NTI33554438, name: "offsetRotate", sons: null}, 
+{kind: 1, offset: "opacity", len: 0, typ: NTI33554438, name: "opacity", sons: null}, 
+{kind: 1, offset: "order", len: 0, typ: NTI33554438, name: "order", sons: null}, 
+{kind: 1, offset: "orphans", len: 0, typ: NTI33554438, name: "orphans", sons: null}, 
+{kind: 1, offset: "outline", len: 0, typ: NTI33554438, name: "outline", sons: null}, 
+{kind: 1, offset: "outlineColor", len: 0, typ: NTI33554438, name: "outlineColor", sons: null}, 
+{kind: 1, offset: "outlineOffset", len: 0, typ: NTI33554438, name: "outlineOffset", sons: null}, 
+{kind: 1, offset: "outlineStyle", len: 0, typ: NTI33554438, name: "outlineStyle", sons: null}, 
+{kind: 1, offset: "outlineWidth", len: 0, typ: NTI33554438, name: "outlineWidth", sons: null}, 
+{kind: 1, offset: "overflow", len: 0, typ: NTI33554438, name: "overflow", sons: null}, 
+{kind: 1, offset: "overflowAnchor", len: 0, typ: NTI33554438, name: "overflowAnchor", sons: null}, 
+{kind: 1, offset: "overflowBlock", len: 0, typ: NTI33554438, name: "overflowBlock", sons: null}, 
+{kind: 1, offset: "overflowInline", len: 0, typ: NTI33554438, name: "overflowInline", sons: null}, 
+{kind: 1, offset: "overflowWrap", len: 0, typ: NTI33554438, name: "overflowWrap", sons: null}, 
+{kind: 1, offset: "overflowX", len: 0, typ: NTI33554438, name: "overflowX", sons: null}, 
+{kind: 1, offset: "overflowY", len: 0, typ: NTI33554438, name: "overflowY", sons: null}, 
+{kind: 1, offset: "overscrollBehavior", len: 0, typ: NTI33554438, name: "overscrollBehavior", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorBlock", len: 0, typ: NTI33554438, name: "overscrollBehaviorBlock", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorInline", len: 0, typ: NTI33554438, name: "overscrollBehaviorInline", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorX", len: 0, typ: NTI33554438, name: "overscrollBehaviorX", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorY", len: 0, typ: NTI33554438, name: "overscrollBehaviorY", sons: null}, 
+{kind: 1, offset: "padding", len: 0, typ: NTI33554438, name: "padding", sons: null}, 
+{kind: 1, offset: "paddingBlock", len: 0, typ: NTI33554438, name: "paddingBlock", sons: null}, 
+{kind: 1, offset: "paddingBlockEnd", len: 0, typ: NTI33554438, name: "paddingBlockEnd", sons: null}, 
+{kind: 1, offset: "paddingBlockStart", len: 0, typ: NTI33554438, name: "paddingBlockStart", sons: null}, 
+{kind: 1, offset: "paddingBottom", len: 0, typ: NTI33554438, name: "paddingBottom", sons: null}, 
+{kind: 1, offset: "paddingInline", len: 0, typ: NTI33554438, name: "paddingInline", sons: null}, 
+{kind: 1, offset: "paddingInlineEnd", len: 0, typ: NTI33554438, name: "paddingInlineEnd", sons: null}, 
+{kind: 1, offset: "paddingInlineStart", len: 0, typ: NTI33554438, name: "paddingInlineStart", sons: null}, 
+{kind: 1, offset: "paddingLeft", len: 0, typ: NTI33554438, name: "paddingLeft", sons: null}, 
+{kind: 1, offset: "paddingRight", len: 0, typ: NTI33554438, name: "paddingRight", sons: null}, 
+{kind: 1, offset: "paddingTop", len: 0, typ: NTI33554438, name: "paddingTop", sons: null}, 
+{kind: 1, offset: "pageBreakAfter", len: 0, typ: NTI33554438, name: "pageBreakAfter", sons: null}, 
+{kind: 1, offset: "pageBreakBefore", len: 0, typ: NTI33554438, name: "pageBreakBefore", sons: null}, 
+{kind: 1, offset: "pageBreakInside", len: 0, typ: NTI33554438, name: "pageBreakInside", sons: null}, 
+{kind: 1, offset: "paintOrder", len: 0, typ: NTI33554438, name: "paintOrder", sons: null}, 
+{kind: 1, offset: "perspective", len: 0, typ: NTI33554438, name: "perspective", sons: null}, 
+{kind: 1, offset: "perspectiveOrigin", len: 0, typ: NTI33554438, name: "perspectiveOrigin", sons: null}, 
+{kind: 1, offset: "placeContent", len: 0, typ: NTI33554438, name: "placeContent", sons: null}, 
+{kind: 1, offset: "placeItems", len: 0, typ: NTI33554438, name: "placeItems", sons: null}, 
+{kind: 1, offset: "placeSelf", len: 0, typ: NTI33554438, name: "placeSelf", sons: null}, 
+{kind: 1, offset: "pointerEvents", len: 0, typ: NTI33554438, name: "pointerEvents", sons: null}, 
+{kind: 1, offset: "position", len: 0, typ: NTI33554438, name: "position", sons: null}, 
+{kind: 1, offset: "quotes", len: 0, typ: NTI33554438, name: "quotes", sons: null}, 
+{kind: 1, offset: "resize", len: 0, typ: NTI33554438, name: "resize", sons: null}, 
+{kind: 1, offset: "right", len: 0, typ: NTI33554438, name: "right", sons: null}, 
+{kind: 1, offset: "rotate", len: 0, typ: NTI33554438, name: "rotate", sons: null}, 
+{kind: 1, offset: "rowGap", len: 0, typ: NTI33554438, name: "rowGap", sons: null}, 
+{kind: 1, offset: "scale", len: 0, typ: NTI33554438, name: "scale", sons: null}, 
+{kind: 1, offset: "scrollBehavior", len: 0, typ: NTI33554438, name: "scrollBehavior", sons: null}, 
+{kind: 1, offset: "scrollMargin", len: 0, typ: NTI33554438, name: "scrollMargin", sons: null}, 
+{kind: 1, offset: "scrollMarginBlock", len: 0, typ: NTI33554438, name: "scrollMarginBlock", sons: null}, 
+{kind: 1, offset: "scrollMarginBlockEnd", len: 0, typ: NTI33554438, name: "scrollMarginBlockEnd", sons: null}, 
+{kind: 1, offset: "scrollMarginBlockStart", len: 0, typ: NTI33554438, name: "scrollMarginBlockStart", sons: null}, 
+{kind: 1, offset: "scrollMarginBottom", len: 0, typ: NTI33554438, name: "scrollMarginBottom", sons: null}, 
+{kind: 1, offset: "scrollMarginInline", len: 0, typ: NTI33554438, name: "scrollMarginInline", sons: null}, 
+{kind: 1, offset: "scrollMarginInlineEnd", len: 0, typ: NTI33554438, name: "scrollMarginInlineEnd", sons: null}, 
+{kind: 1, offset: "scrollMarginInlineStart", len: 0, typ: NTI33554438, name: "scrollMarginInlineStart", sons: null}, 
+{kind: 1, offset: "scrollMarginLeft", len: 0, typ: NTI33554438, name: "scrollMarginLeft", sons: null}, 
+{kind: 1, offset: "scrollMarginRight", len: 0, typ: NTI33554438, name: "scrollMarginRight", sons: null}, 
+{kind: 1, offset: "scrollMarginTop", len: 0, typ: NTI33554438, name: "scrollMarginTop", sons: null}, 
+{kind: 1, offset: "scrollPadding", len: 0, typ: NTI33554438, name: "scrollPadding", sons: null}, 
+{kind: 1, offset: "scrollPaddingBlock", len: 0, typ: NTI33554438, name: "scrollPaddingBlock", sons: null}, 
+{kind: 1, offset: "scrollPaddingBlockEnd", len: 0, typ: NTI33554438, name: "scrollPaddingBlockEnd", sons: null}, 
+{kind: 1, offset: "scrollPaddingBlockStart", len: 0, typ: NTI33554438, name: "scrollPaddingBlockStart", sons: null}, 
+{kind: 1, offset: "scrollPaddingBottom", len: 0, typ: NTI33554438, name: "scrollPaddingBottom", sons: null}, 
+{kind: 1, offset: "scrollPaddingInline", len: 0, typ: NTI33554438, name: "scrollPaddingInline", sons: null}, 
+{kind: 1, offset: "scrollPaddingInlineEnd", len: 0, typ: NTI33554438, name: "scrollPaddingInlineEnd", sons: null}, 
+{kind: 1, offset: "scrollPaddingInlineStart", len: 0, typ: NTI33554438, name: "scrollPaddingInlineStart", sons: null}, 
+{kind: 1, offset: "scrollPaddingLeft", len: 0, typ: NTI33554438, name: "scrollPaddingLeft", sons: null}, 
+{kind: 1, offset: "scrollPaddingRight", len: 0, typ: NTI33554438, name: "scrollPaddingRight", sons: null}, 
+{kind: 1, offset: "scrollPaddingTop", len: 0, typ: NTI33554438, name: "scrollPaddingTop", sons: null}, 
+{kind: 1, offset: "scrollSnapAlign", len: 0, typ: NTI33554438, name: "scrollSnapAlign", sons: null}, 
+{kind: 1, offset: "scrollSnapStop", len: 0, typ: NTI33554438, name: "scrollSnapStop", sons: null}, 
+{kind: 1, offset: "scrollSnapType", len: 0, typ: NTI33554438, name: "scrollSnapType", sons: null}, 
+{kind: 1, offset: "scrollbar3dLightColor", len: 0, typ: NTI33554438, name: "scrollbar3dLightColor", sons: null}, 
+{kind: 1, offset: "scrollbarArrowColor", len: 0, typ: NTI33554438, name: "scrollbarArrowColor", sons: null}, 
+{kind: 1, offset: "scrollbarBaseColor", len: 0, typ: NTI33554438, name: "scrollbarBaseColor", sons: null}, 
+{kind: 1, offset: "scrollbarColor", len: 0, typ: NTI33554438, name: "scrollbarColor", sons: null}, 
+{kind: 1, offset: "scrollbarDarkshadowColor", len: 0, typ: NTI33554438, name: "scrollbarDarkshadowColor", sons: null}, 
+{kind: 1, offset: "scrollbarFaceColor", len: 0, typ: NTI33554438, name: "scrollbarFaceColor", sons: null}, 
+{kind: 1, offset: "scrollbarHighlightColor", len: 0, typ: NTI33554438, name: "scrollbarHighlightColor", sons: null}, 
+{kind: 1, offset: "scrollbarShadowColor", len: 0, typ: NTI33554438, name: "scrollbarShadowColor", sons: null}, 
+{kind: 1, offset: "scrollbarTrackColor", len: 0, typ: NTI33554438, name: "scrollbarTrackColor", sons: null}, 
+{kind: 1, offset: "scrollbarWidth", len: 0, typ: NTI33554438, name: "scrollbarWidth", sons: null}, 
+{kind: 1, offset: "shapeImageThreshold", len: 0, typ: NTI33554438, name: "shapeImageThreshold", sons: null}, 
+{kind: 1, offset: "shapeMargin", len: 0, typ: NTI33554438, name: "shapeMargin", sons: null}, 
+{kind: 1, offset: "shapeOutside", len: 0, typ: NTI33554438, name: "shapeOutside", sons: null}, 
+{kind: 1, offset: "tabSize", len: 0, typ: NTI33554438, name: "tabSize", sons: null}, 
+{kind: 1, offset: "tableLayout", len: 0, typ: NTI33554438, name: "tableLayout", sons: null}, 
+{kind: 1, offset: "textAlign", len: 0, typ: NTI33554438, name: "textAlign", sons: null}, 
+{kind: 1, offset: "textAlignLast", len: 0, typ: NTI33554438, name: "textAlignLast", sons: null}, 
+{kind: 1, offset: "textCombineUpright", len: 0, typ: NTI33554438, name: "textCombineUpright", sons: null}, 
+{kind: 1, offset: "textDecoration", len: 0, typ: NTI33554438, name: "textDecoration", sons: null}, 
+{kind: 1, offset: "textDecorationColor", len: 0, typ: NTI33554438, name: "textDecorationColor", sons: null}, 
+{kind: 1, offset: "textDecorationLine", len: 0, typ: NTI33554438, name: "textDecorationLine", sons: null}, 
+{kind: 1, offset: "textDecorationSkipInk", len: 0, typ: NTI33554438, name: "textDecorationSkipInk", sons: null}, 
+{kind: 1, offset: "textDecorationStyle", len: 0, typ: NTI33554438, name: "textDecorationStyle", sons: null}, 
+{kind: 1, offset: "textDecorationThickness", len: 0, typ: NTI33554438, name: "textDecorationThickness", sons: null}, 
+{kind: 1, offset: "textEmphasis", len: 0, typ: NTI33554438, name: "textEmphasis", sons: null}, 
+{kind: 1, offset: "textEmphasisColor", len: 0, typ: NTI33554438, name: "textEmphasisColor", sons: null}, 
+{kind: 1, offset: "textEmphasisPosition", len: 0, typ: NTI33554438, name: "textEmphasisPosition", sons: null}, 
+{kind: 1, offset: "textEmphasisStyle", len: 0, typ: NTI33554438, name: "textEmphasisStyle", sons: null}, 
+{kind: 1, offset: "textIndent", len: 0, typ: NTI33554438, name: "textIndent", sons: null}, 
+{kind: 1, offset: "textJustify", len: 0, typ: NTI33554438, name: "textJustify", sons: null}, 
+{kind: 1, offset: "textOrientation", len: 0, typ: NTI33554438, name: "textOrientation", sons: null}, 
+{kind: 1, offset: "textOverflow", len: 0, typ: NTI33554438, name: "textOverflow", sons: null}, 
+{kind: 1, offset: "textRendering", len: 0, typ: NTI33554438, name: "textRendering", sons: null}, 
+{kind: 1, offset: "textShadow", len: 0, typ: NTI33554438, name: "textShadow", sons: null}, 
+{kind: 1, offset: "textTransform", len: 0, typ: NTI33554438, name: "textTransform", sons: null}, 
+{kind: 1, offset: "textUnderlineOffset", len: 0, typ: NTI33554438, name: "textUnderlineOffset", sons: null}, 
+{kind: 1, offset: "textUnderlinePosition", len: 0, typ: NTI33554438, name: "textUnderlinePosition", sons: null}, 
+{kind: 1, offset: "top", len: 0, typ: NTI33554438, name: "top", sons: null}, 
+{kind: 1, offset: "touchAction", len: 0, typ: NTI33554438, name: "touchAction", sons: null}, 
+{kind: 1, offset: "transform", len: 0, typ: NTI33554438, name: "transform", sons: null}, 
+{kind: 1, offset: "transformBox", len: 0, typ: NTI33554438, name: "transformBox", sons: null}, 
+{kind: 1, offset: "transformOrigin", len: 0, typ: NTI33554438, name: "transformOrigin", sons: null}, 
+{kind: 1, offset: "transformStyle", len: 0, typ: NTI33554438, name: "transformStyle", sons: null}, 
+{kind: 1, offset: "transition", len: 0, typ: NTI33554438, name: "transition", sons: null}, 
+{kind: 1, offset: "transitionDelay", len: 0, typ: NTI33554438, name: "transitionDelay", sons: null}, 
+{kind: 1, offset: "transitionDuration", len: 0, typ: NTI33554438, name: "transitionDuration", sons: null}, 
+{kind: 1, offset: "transitionProperty", len: 0, typ: NTI33554438, name: "transitionProperty", sons: null}, 
+{kind: 1, offset: "transitionTimingFunction", len: 0, typ: NTI33554438, name: "transitionTimingFunction", sons: null}, 
+{kind: 1, offset: "translate", len: 0, typ: NTI33554438, name: "translate", sons: null}, 
+{kind: 1, offset: "unicodeBidi", len: 0, typ: NTI33554438, name: "unicodeBidi", sons: null}, 
+{kind: 1, offset: "verticalAlign", len: 0, typ: NTI33554438, name: "verticalAlign", sons: null}, 
+{kind: 1, offset: "visibility", len: 0, typ: NTI33554438, name: "visibility", sons: null}, 
+{kind: 1, offset: "whiteSpace", len: 0, typ: NTI33554438, name: "whiteSpace", sons: null}, 
+{kind: 1, offset: "widows", len: 0, typ: NTI33554438, name: "widows", sons: null}, 
+{kind: 1, offset: "width", len: 0, typ: NTI33554438, name: "width", sons: null}, 
+{kind: 1, offset: "willChange", len: 0, typ: NTI33554438, name: "willChange", sons: null}, 
+{kind: 1, offset: "wordBreak", len: 0, typ: NTI33554438, name: "wordBreak", sons: null}, 
+{kind: 1, offset: "wordSpacing", len: 0, typ: NTI33554438, name: "wordSpacing", sons: null}, 
+{kind: 1, offset: "writingMode", len: 0, typ: NTI33554438, name: "writingMode", sons: null}, 
+{kind: 1, offset: "zIndex", len: 0, typ: NTI33554438, name: "zIndex", sons: null}]};
+NTI520093742.node = NNI520093742;
+NTI520093742.base = NTI33555071;
+NTI520093741.base = NTI520093742;
+var NNI520093714 = {kind: 2, len: 22, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "attributes", len: 0, typ: NTI520093827, name: "attributes", sons: null}, 
+{kind: 1, offset: "childNodes", len: 0, typ: NTI520093828, name: "childNodes", sons: null}, 
+{kind: 1, offset: "children", len: 0, typ: NTI520093829, name: "children", sons: null}, 
+{kind: 1, offset: "data", len: 0, typ: NTI33554438, name: "data", sons: null}, 
+{kind: 1, offset: "firstChild", len: 0, typ: NTI520093713, name: "firstChild", sons: null}, 
+{kind: 1, offset: "lastChild", len: 0, typ: NTI520093713, name: "lastChild", sons: null}, 
+{kind: 1, offset: "nextSibling", len: 0, typ: NTI520093713, name: "nextSibling", sons: null}, 
+{kind: 1, offset: "nodeName", len: 0, typ: NTI33554438, name: "nodeName", sons: null}, 
+{kind: 1, offset: "nodeType", len: 0, typ: NTI520093712, name: "nodeType", sons: null}, 
+{kind: 1, offset: "nodeValue", len: 0, typ: NTI33554438, name: "nodeValue", sons: null}, 
+{kind: 1, offset: "parentNode", len: 0, typ: NTI520093713, name: "parentNode", sons: null}, 
+{kind: 1, offset: "content", len: 0, typ: NTI520093713, name: "content", sons: null}, 
+{kind: 1, offset: "previousSibling", len: 0, typ: NTI520093713, name: "previousSibling", sons: null}, 
+{kind: 1, offset: "ownerDocument", len: 0, typ: NTI520093715, name: "ownerDocument", sons: null}, 
+{kind: 1, offset: "innerHTML", len: 0, typ: NTI33554438, name: "innerHTML", sons: null}, 
+{kind: 1, offset: "outerHTML", len: 0, typ: NTI33554438, name: "outerHTML", sons: null}, 
+{kind: 1, offset: "innerText", len: 0, typ: NTI33554438, name: "innerText", sons: null}, 
+{kind: 1, offset: "textContent", len: 0, typ: NTI33554438, name: "textContent", sons: null}, 
+{kind: 1, offset: "style", len: 0, typ: NTI520093741, name: "style", sons: null}, 
+{kind: 1, offset: "baseURI", len: 0, typ: NTI33554438, name: "baseURI", sons: null}, 
+{kind: 1, offset: "parentElement", len: 0, typ: NTI520093717, name: "parentElement", sons: null}, 
+{kind: 1, offset: "isConnected", len: 0, typ: NTI33554464, name: "isConnected", sons: null}]};
+NTI520093714.node = NNI520093714;
+var NNI520093698 = {kind: 2, len: 23, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "onabort", len: 0, typ: NTI520093790, name: "onabort", sons: null}, 
+{kind: 1, offset: "onblur", len: 0, typ: NTI520093791, name: "onblur", sons: null}, 
+{kind: 1, offset: "onchange", len: 0, typ: NTI520093792, name: "onchange", sons: null}, 
+{kind: 1, offset: "onclick", len: 0, typ: NTI520093793, name: "onclick", sons: null}, 
+{kind: 1, offset: "ondblclick", len: 0, typ: NTI520093794, name: "ondblclick", sons: null}, 
+{kind: 1, offset: "onerror", len: 0, typ: NTI520093795, name: "onerror", sons: null}, 
+{kind: 1, offset: "onfocus", len: 0, typ: NTI520093796, name: "onfocus", sons: null}, 
+{kind: 1, offset: "onkeydown", len: 0, typ: NTI520093797, name: "onkeydown", sons: null}, 
+{kind: 1, offset: "onkeypress", len: 0, typ: NTI520093798, name: "onkeypress", sons: null}, 
+{kind: 1, offset: "onkeyup", len: 0, typ: NTI520093799, name: "onkeyup", sons: null}, 
+{kind: 1, offset: "onload", len: 0, typ: NTI520093800, name: "onload", sons: null}, 
+{kind: 1, offset: "onmousedown", len: 0, typ: NTI520093801, name: "onmousedown", sons: null}, 
+{kind: 1, offset: "onmousemove", len: 0, typ: NTI520093802, name: "onmousemove", sons: null}, 
+{kind: 1, offset: "onmouseout", len: 0, typ: NTI520093803, name: "onmouseout", sons: null}, 
+{kind: 1, offset: "onmouseover", len: 0, typ: NTI520093804, name: "onmouseover", sons: null}, 
+{kind: 1, offset: "onmouseup", len: 0, typ: NTI520093805, name: "onmouseup", sons: null}, 
+{kind: 1, offset: "onreset", len: 0, typ: NTI520093806, name: "onreset", sons: null}, 
+{kind: 1, offset: "onselect", len: 0, typ: NTI520093807, name: "onselect", sons: null}, 
+{kind: 1, offset: "onsubmit", len: 0, typ: NTI520093808, name: "onsubmit", sons: null}, 
+{kind: 1, offset: "onunload", len: 0, typ: NTI520093809, name: "onunload", sons: null}, 
+{kind: 1, offset: "onloadstart", len: 0, typ: NTI520093810, name: "onloadstart", sons: null}, 
+{kind: 1, offset: "onprogress", len: 0, typ: NTI520093811, name: "onprogress", sons: null}, 
+{kind: 1, offset: "onloadend", len: 0, typ: NTI520093812, name: "onloadend", sons: null}]};
+NTI520093698.node = NNI520093698;
+NTI520093698.base = NTI33555071;
+NTI520093714.base = NTI520093698;
+NTI520093713.base = NTI520093714;
+NTI520094115.base = NTI520093713;
+NTI402653734.base = NTI33554438;
+var NNI536870915 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "Field0", len: 0, typ: NTI33554454, name: "Field0", sons: null}, 
+{kind: 1, offset: "Field1", len: 0, typ: NTI33554464, name: "Field1", sons: null}]};
+NTI536870915.node = NNI536870915;
+function makeNimstrLit(c_33556787) {
+      var result = [];
+  for (var i = 0; i < c_33556787.length; ++i) {
+    result[i] = c_33556787.charCodeAt(i);
+  }
+  return result;
+  
+
+  
+}
+function toJSStr(s_33556793) {
+                    var Tmp5;
+            var Tmp7;
+
+  var result_33556794 = null;
+
+    var res_33556828 = newSeq_33556811((s_33556793).length);
+    var i_33556829 = 0;
+    var j_33556830 = 0;
+    L1: do {
+        L2: while (true) {
+        if (!(i_33556829 < (s_33556793).length)) break L2;
+          var c_33556831 = s_33556793[i_33556829];
+          if ((c_33556831 < 128)) {
+          res_33556828[j_33556830] = String.fromCharCode(c_33556831);
+          i_33556829 += 1;
+          }
+          else {
+            var helper_33556843 = newSeq_33556811(0);
+            L3: do {
+                L4: while (true) {
+                if (!true) break L4;
+                  var code_33556844 = c_33556831.toString(16);
+                  if (((code_33556844).length == 1)) {
+                  helper_33556843.push("%0");;
+                  }
+                  else {
+                  helper_33556843.push("%");;
+                  }
+                  
+                  helper_33556843.push(code_33556844);;
+                  i_33556829 += 1;
+                    if (((s_33556793).length <= i_33556829)) Tmp5 = true; else {                      Tmp5 = (s_33556793[i_33556829] < 128);                    }                  if (Tmp5) {
+                  break L3;
+                  }
+                  
+                  c_33556831 = s_33556793[i_33556829];
+                }
+            } while(false);
+++excHandler;
+            Tmp7 = framePtr;
+            try {
+            res_33556828[j_33556830] = decodeURIComponent(helper_33556843.join(""));
+--excHandler;
+} catch (EXC) {
+ var prevJSError = lastJSError;
+ lastJSError = EXC;
+ --excHandler;
+            framePtr = Tmp7;
+            res_33556828[j_33556830] = helper_33556843.join("");
+            lastJSError = prevJSError;
+            } finally {
+            framePtr = Tmp7;
+            }
+          }
+          
+          j_33556830 += 1;
+        }
+    } while(false);
+    if (res_33556828.length < j_33556830) { for (var i=res_33556828.length;i<j_33556830;++i) res_33556828.push(null); }
+               else { res_33556828.length = j_33556830; };
+    result_33556794 = res_33556828.join("");
+
+  return result_33556794;
+
+}
+function raiseException(e_33556654, ename_33556655) {
+    e_33556654.name = ename_33556655;
+    if ((excHandler == 0)) {
+    unhandledException(e_33556654);
+    }
+    
+    throw e_33556654;
+
+  
+}
+function addInt(a_33556926, b_33556927) {
+        var result = a_33556926 + b_33556927;
+    checkOverflowInt(result);
+    return result;
+  
+
+  
+}
+function cstrToNimstr(c_33556790) {
+      var ln = c_33556790.length;
+  var result = new Array(ln);
+  var r = 0;
+  for (var i = 0; i < ln; ++i) {
+    var ch = c_33556790.charCodeAt(i);
+
+    if (ch < 128) {
+      result[r] = ch;
+    }
+    else {
+      if (ch < 2048) {
+        result[r] = (ch >> 6) | 192;
+      }
+      else {
+        if (ch < 55296 || ch >= 57344) {
+          result[r] = (ch >> 12) | 224;
+        }
+        else {
+            ++i;
+            ch = 65536 + (((ch & 1023) << 10) | (c_33556790.charCodeAt(i) & 1023));
+            result[r] = (ch >> 18) | 240;
+            ++r;
+            result[r] = ((ch >> 12) & 63) | 128;
+        }
+        ++r;
+        result[r] = ((ch >> 6) & 63) | 128;
+      }
+      ++r;
+      result[r] = (ch & 63) | 128;
+    }
+    ++r;
+  }
+  return result;
+  
+
+  
+}
+function setConstr() {
+        var result = {};
+    for (var i = 0; i < arguments.length; ++i) {
+      var x = arguments[i];
+      if (typeof(x) == "object") {
+        for (var j = x[0]; j <= x[1]; ++j) {
+          result[j] = true;
+        }
+      } else {
+        result[x] = true;
+      }
+    }
+    return result;
+  
+
+  
+}
+var ConstSet1 = setConstr(17, 16, 4, 18, 27, 19, 23, 22, 21);
+function nimCopy(dest_33557120, src_33557121, ti_33557122) {
+  var result_33557131 = null;
+
+    switch (ti_33557122.kind) {
+    case 21:
+    case 22:
+    case 23:
+    case 5:
+      if (!(isFatPointer_33557111(ti_33557122))) {
+      result_33557131 = src_33557121;
+      }
+      else {
+        result_33557131 = [src_33557121[0], src_33557121[1]];
+      }
+      
+      break;
+    case 19:
+            if (dest_33557120 === null || dest_33557120 === undefined) {
+        dest_33557120 = {};
+      }
+      else {
+        for (var key in dest_33557120) { delete dest_33557120[key]; }
+      }
+      for (var key in src_33557121) { dest_33557120[key] = src_33557121[key]; }
+      result_33557131 = dest_33557120;
+    
+      break;
+    case 18:
+    case 17:
+      if (!((ti_33557122.base == null))) {
+      result_33557131 = nimCopy(dest_33557120, src_33557121, ti_33557122.base);
+      }
+      else {
+      if ((ti_33557122.kind == 17)) {
+      result_33557131 = (dest_33557120 === null || dest_33557120 === undefined) ? {m_type: ti_33557122} : dest_33557120;
+      }
+      else {
+        result_33557131 = (dest_33557120 === null || dest_33557120 === undefined) ? {} : dest_33557120;
+      }
+      }
+      nimCopyAux(result_33557131, src_33557121, ti_33557122.node);
+      break;
+    case 24:
+    case 4:
+    case 27:
+    case 16:
+            if (src_33557121 === null) {
+        result_33557131 = null;
+      }
+      else {
+        if (dest_33557120 === null || dest_33557120 === undefined) {
+          dest_33557120 = new Array(src_33557121.length);
+        }
+        else {
+          dest_33557120.length = src_33557121.length;
+        }
+        result_33557131 = dest_33557120;
+        for (var i = 0; i < src_33557121.length; ++i) {
+          result_33557131[i] = nimCopy(result_33557131[i], src_33557121[i], ti_33557122.base);
+        }
+      }
+    
+      break;
+    case 28:
+            if (src_33557121 !== null) {
+        result_33557131 = src_33557121.slice(0);
+      }
+    
+      break;
+    default: 
+      result_33557131 = src_33557121;
+      break;
+    }
+
+  return result_33557131;
+
+}
+function chckIndx(i_33557164, a_33557165, b_33557166) {
+      var Tmp1;
+
+  var result_33557167 = 0;
+
+  BeforeRet: do {
+      if (!(a_33557165 <= i_33557164)) Tmp1 = false; else {        Tmp1 = (i_33557164 <= b_33557166);      }    if (Tmp1) {
+    result_33557167 = i_33557164;
+    break BeforeRet;
+    }
+    else {
+    raiseIndexError(i_33557164, a_33557165, b_33557166);
+    }
+    
+  } while (false);
+
+  return result_33557167;
+
+}
+function subInt(a_33556930, b_33556931) {
+        var result = a_33556930 - b_33556931;
+    checkOverflowInt(result);
+    return result;
+  
+
+  
+}
+var ConstSet2 = setConstr([65, 90]);
+var ConstSet3 = setConstr(95, 32, 46);
+var ConstSet4 = setConstr(95, 32, 46);
+function mulInt(a_33556934, b_33556935) {
+        var result = a_33556934 * b_33556935;
+    checkOverflowInt(result);
+    return result;
+  
+
+  
+}
+var ConstSet5 = setConstr([97, 122]);
+var ConstSet6 = setConstr([65, 90], [97, 122]);
+var ConstSet7 = setConstr([97, 122]);
+var ConstSet8 = setConstr([65, 90]);
+var ConstSet9 = setConstr([65, 90], [97, 122]);
+function nimMax(a_33556987, b_33556988) {
+    var Tmp1;
+
+  var result_33556989 = 0;
+
+  BeforeRet: do {
+    if ((b_33556988 <= a_33556987)) {
+    Tmp1 = a_33556987;
+    }
+    else {
+    Tmp1 = b_33556988;
+    }
+    
+    result_33556989 = Tmp1;
+    break BeforeRet;
+  } while (false);
+
+  return result_33556989;
+
+}
+function nimMin(a_33556983, b_33556984) {
+    var Tmp1;
+
+  var result_33556985 = 0;
+
+  BeforeRet: do {
+    if ((a_33556983 <= b_33556984)) {
+    Tmp1 = a_33556983;
+    }
+    else {
+    Tmp1 = b_33556984;
+    }
+    
+    result_33556985 = Tmp1;
+    break BeforeRet;
+  } while (false);
+
+  return result_33556985;
+
+}
+function addChar(x_33557235, c_33557236) {
+    x_33557235.push(c_33557236);
+
+  
+}
+if (!Math.trunc) {
+  Math.trunc = function(v) {
+    v = +v;
+    if (!isFinite(v)) return v;
+    return (v - v % 1) || (v < 0 ? -0 : v === 0 ? v : 0);
+  };
+}
+
+var alternative_402653757 = [null];
+function add_33556409(x_33556410, x_33556410_Idx, y_33556411) {
+          if (x_33556410[x_33556410_Idx] === null) { x_33556410[x_33556410_Idx] = []; }
+      var off = x_33556410[x_33556410_Idx].length;
+      x_33556410[x_33556410_Idx].length += y_33556411.length;
+      for (var i = 0; i < y_33556411.length; ++i) {
+        x_33556410[x_33556410_Idx][off+i] = y_33556411.charCodeAt(i);
+      }
+    
+
+  
+}
+function newSeq_33556811(len_33556813) {
+  var result_33556814 = [];
+
+    result_33556814 = new Array(len_33556813); for (var i=0;i<len_33556813;++i) {result_33556814[i]=null;}
+  return result_33556814;
+
+}
+function unhandledException(e_33556650) {
+    var buf_33556651 = [[]];
+    if (!(((e_33556650.message).length == 0))) {
+    buf_33556651[0].push.apply(buf_33556651[0], makeNimstrLit("Error: unhandled exception: "));;
+    buf_33556651[0].push.apply(buf_33556651[0], e_33556650.message);;
+    }
+    else {
+    buf_33556651[0].push.apply(buf_33556651[0], makeNimstrLit("Error: unhandled exception"));;
+    }
+    
+    buf_33556651[0].push.apply(buf_33556651[0], makeNimstrLit(" ["));;
+    add_33556409(buf_33556651, 0, e_33556650.name);
+    buf_33556651[0].push.apply(buf_33556651[0], makeNimstrLit("]\x0A"));;
+    var cbuf_33556652 = toJSStr(buf_33556651[0]);
+    framePtr = null;
+      if (typeof(Error) !== "undefined") {
+    throw new Error(cbuf_33556652);
+  }
+  else {
+    throw cbuf_33556652;
+  }
+  
+
+  
+}
+function raiseOverflow() {
+    raiseException({message: makeNimstrLit("over- or underflow"), parent: null, m_type: NTI33555106, name: null, trace: [], up: null}, "OverflowDefect");
+
+  
+}
+function checkOverflowInt(a_33556924) {
+        if (a_33556924 > 2147483647 || a_33556924 < -2147483648) raiseOverflow();
+  
+
+  
+}
+function isWhitespace_402653490(text_402653491) {
+         return !/[^\s]/.test(text_402653491);
+  
+
+  
+}
+function isWhitespace_402653493(x_402653494) {
+    var Tmp1;
+    var Tmp2;
+
+  var result_402653495 = false;
+
+    if (!(x_402653494.nodeName == "#text")) Tmp2 = false; else {      Tmp2 = isWhitespace_402653490(x_402653494.textContent);    }    if (Tmp2) Tmp1 = true; else {      Tmp1 = (x_402653494.nodeName == "#comment");    }    result_402653495 = Tmp1;
+
+  return result_402653495;
+
+}
+function isFatPointer_33557111(ti_33557112) {
+  var result_33557113 = false;
+
+  BeforeRet: do {
+    result_33557113 = !((ConstSet1[ti_33557112.base.kind] != undefined));
+    break BeforeRet;
+  } while (false);
+
+  return result_33557113;
+
+}
+function nimCopyAux(dest_33557124, src_33557125, n_33557126) {
+    switch (n_33557126.kind) {
+    case 0:
+      break;
+    case 1:
+            dest_33557124[n_33557126.offset] = nimCopy(dest_33557124[n_33557126.offset], src_33557125[n_33557126.offset], n_33557126.typ);
+    
+      break;
+    case 2:
+          for (var i = 0; i < n_33557126.sons.length; i++) {
+      nimCopyAux(dest_33557124, src_33557125, n_33557126.sons[i]);
+    }
+    
+      break;
+    case 3:
+            dest_33557124[n_33557126.offset] = nimCopy(dest_33557124[n_33557126.offset], src_33557125[n_33557126.offset], n_33557126.typ);
+      for (var i = 0; i < n_33557126.sons.length; ++i) {
+        nimCopyAux(dest_33557124, src_33557125, n_33557126.sons[i][1]);
+      }
+    
+      break;
+    }
+
+  
+}
+function raiseIndexError(i_33556741, a_33556742, b_33556743) {
+    var Tmp1;
+
+    if ((b_33556743 < a_33556742)) {
+    Tmp1 = makeNimstrLit("index out of bounds, the container is empty");
+    }
+    else {
+    Tmp1 = (makeNimstrLit("index ") || []).concat(cstrToNimstr((i_33556741)+"") || [],makeNimstrLit(" not in ") || [],cstrToNimstr((a_33556742)+"") || [],makeNimstrLit(" .. ") || [],cstrToNimstr((b_33556743)+"") || []);
+    }
+    
+    raiseException({message: nimCopy(null, Tmp1, NTI33554437), parent: null, m_type: NTI33555112, name: null, trace: [], up: null}, "IndexDefect");
+
+  
+}
+function toToc_402653496(x_402653497, father_402653498) {
+                var Tmp5;
+            var Tmp6;
+            var Tmp7;
+            var Tmp8;
+      var Tmp15;
+
+    if ((x_402653497.nodeName == "UL")) {
+    var f_402653506 = {heading: null, kids: [], sortId: (father_402653498.kids).length, doSort: false};
+    var i_402653507 = 0;
+    L1: do {
+        L2: while (true) {
+        if (!(i_402653507 < x_402653497.childNodes.length)) break L2;
+          var nxt_402653508 = addInt(i_402653507, 1);
+          L3: do {
+              L4: while (true) {
+                if (!(nxt_402653508 < x_402653497.childNodes.length)) Tmp5 = false; else {                  Tmp5 = isWhitespace_402653493(x_402653497.childNodes[nxt_402653508]);                }              if (!Tmp5) break L4;
+                nxt_402653508 = addInt(nxt_402653508, 1);
+              }
+          } while(false);
+            if (!(nxt_402653508 < x_402653497.childNodes.length)) Tmp8 = false; else {              Tmp8 = (x_402653497.childNodes[i_402653507].nodeName == "LI");            }            if (!Tmp8) Tmp7 = false; else {              Tmp7 = (x_402653497.childNodes[i_402653507].childNodes.length == 1);            }            if (!Tmp7) Tmp6 = false; else {              Tmp6 = (x_402653497.childNodes[nxt_402653508].nodeName == "UL");            }          if (Tmp6) {
+          var e_402653520 = {heading: x_402653497.childNodes[i_402653507].childNodes[0], kids: [], sortId: (f_402653506.kids).length, doSort: false};
+          var it_402653521 = x_402653497.childNodes[nxt_402653508];
+          L9: do {
+            var j_402653526 = 0;
+            var colontmp__402653786 = 0;
+            colontmp__402653786 = it_402653521.childNodes.length;
+            var i_402653787 = 0;
+            L10: do {
+                L11: while (true) {
+                if (!(i_402653787 < colontmp__402653786)) break L11;
+                  j_402653526 = i_402653787;
+                  toToc_402653496(it_402653521.childNodes[j_402653526], e_402653520);
+                  i_402653787 = addInt(i_402653787, 1);
+                }
+            } while(false);
+          } while(false);
+          f_402653506.kids.push(e_402653520);;
+          i_402653507 = addInt(nxt_402653508, 1);
+          }
+          else {
+            toToc_402653496(x_402653497.childNodes[i_402653507], f_402653506);
+            i_402653507 = addInt(i_402653507, 1);
+          }
+          
+        }
+    } while(false);
+    father_402653498.kids.push(f_402653506);;
+    }
+    else {
+    if (isWhitespace_402653493(x_402653497)) {
+    }
+    else {
+    if ((x_402653497.nodeName == "LI")) {
+    var idx_402653543 = [];
+    L12: do {
+      var i_402653548 = 0;
+      var colontmp__402653790 = 0;
+      colontmp__402653790 = x_402653497.childNodes.length;
+      var i_402653791 = 0;
+      L13: do {
+          L14: while (true) {
+          if (!(i_402653791 < colontmp__402653790)) break L14;
+            i_402653548 = i_402653791;
+            if (!(isWhitespace_402653493(x_402653497.childNodes[i_402653548]))) {
+            idx_402653543.push(i_402653548);;
+            }
+            
+            i_402653791 = addInt(i_402653791, 1);
+          }
+      } while(false);
+    } while(false);
+      if (!((idx_402653543).length == 2)) Tmp15 = false; else {        Tmp15 = (x_402653497.childNodes[idx_402653543[chckIndx(1, 0, (idx_402653543).length-1)]].nodeName == "UL");      }    if (Tmp15) {
+    var e_402653563 = {heading: x_402653497.childNodes[idx_402653543[chckIndx(0, 0, (idx_402653543).length-1)]], kids: [], sortId: (father_402653498.kids).length, doSort: false};
+    var it_402653564 = x_402653497.childNodes[idx_402653543[chckIndx(1, 0, (idx_402653543).length-1)]];
+    L16: do {
+      var j_402653569 = 0;
+      var colontmp__402653794 = 0;
+      colontmp__402653794 = it_402653564.childNodes.length;
+      var i_402653795 = 0;
+      L17: do {
+          L18: while (true) {
+          if (!(i_402653795 < colontmp__402653794)) break L18;
+            j_402653569 = i_402653795;
+            toToc_402653496(it_402653564.childNodes[j_402653569], e_402653563);
+            i_402653795 = addInt(i_402653795, 1);
+          }
+      } while(false);
+    } while(false);
+    father_402653498.kids.push(e_402653563);;
+    }
+    else {
+      L19: do {
+        var i_402653578 = 0;
+        var colontmp__402653798 = 0;
+        colontmp__402653798 = x_402653497.childNodes.length;
+        var i_402653799 = 0;
+        L20: do {
+            L21: while (true) {
+            if (!(i_402653799 < colontmp__402653798)) break L21;
+              i_402653578 = i_402653799;
+              toToc_402653496(x_402653497.childNodes[i_402653578], father_402653498);
+              i_402653799 = addInt(i_402653799, 1);
+            }
+        } while(false);
+      } while(false);
+    }
+    
+    }
+    else {
+    father_402653498.kids.push({heading: x_402653497, kids: [], sortId: (father_402653498.kids).length, doSort: false});;
+    }
+    }}
+
+  
+}
+function extractItems_402653315(x_402653316, heading_402653317, items_402653318, items_402653318_Idx) {
+      var Tmp1;
+
+  BeforeRet: do {
+    if ((x_402653316 == null)) {
+    break BeforeRet;
+    }
+    
+      if (!!((x_402653316.heading == null))) Tmp1 = false; else {        Tmp1 = (x_402653316.heading.textContent == heading_402653317);      }    if (Tmp1) {
+    L2: do {
+      var i_402653334 = 0;
+      var colontmp__402653804 = 0;
+      colontmp__402653804 = (x_402653316.kids).length;
+      var i_402653805 = 0;
+      L3: do {
+          L4: while (true) {
+          if (!(i_402653805 < colontmp__402653804)) break L4;
+            i_402653334 = i_402653805;
+            items_402653318[items_402653318_Idx].push(x_402653316.kids[chckIndx(i_402653334, 0, (x_402653316.kids).length-1)].heading);;
+            i_402653805 = addInt(i_402653805, 1);
+          }
+      } while(false);
+    } while(false);
+    }
+    else {
+      L5: do {
+        var i_402653346 = 0;
+        var colontmp__402653808 = 0;
+        colontmp__402653808 = (x_402653316.kids).length;
+        var i_402653809 = 0;
+        L6: do {
+            L7: while (true) {
+            if (!(i_402653809 < colontmp__402653808)) break L7;
+              i_402653346 = i_402653809;
+              var it_402653347 = x_402653316.kids[chckIndx(i_402653346, 0, (x_402653316.kids).length-1)];
+              extractItems_402653315(it_402653347, heading_402653317, items_402653318, items_402653318_Idx);
+              i_402653809 = addInt(i_402653809, 1);
+            }
+        } while(false);
+      } while(false);
+    }
+    
+  } while (false);
+
+  
+}
+function tree_402653189(tag_402653190, kids_402653191) {
+  var result_402653192 = null;
+
+    result_402653192 = document.createElement(toJSStr(tag_402653190));
+    L1: do {
+      var k_402653204 = null;
+      var k_402653204_Idx = 0;
+      var i_402653822 = 0;
+      L2: do {
+          L3: while (true) {
+          if (!(i_402653822 < (kids_402653191).length)) break L3;
+            k_402653204 = kids_402653191; k_402653204_Idx = chckIndx(i_402653822, 0, (kids_402653191).length-1);
+            result_402653192.appendChild(k_402653204[k_402653204_Idx]);
+            i_402653822 = addInt(i_402653822, 1);
+          }
+      } while(false);
+    } while(false);
+
+  return result_402653192;
+
+}
+function text_402653242(s_402653243) {
+  var result_402653244 = null;
+
+    result_402653244 = document.createTextNode(s_402653243);
+
+  return result_402653244;
+
+}
+function sysFatal_218103843(message_218103846) {
+    raiseException({message: nimCopy(null, message_218103846, NTI33554437), m_type: NTI33555108, parent: null, name: null, trace: [], up: null}, "AssertionDefect");
+
+  
+}
+function raiseAssert_218103841(msg_218103842) {
+    sysFatal_218103843(msg_218103842);
+
+  
+}
+function failedAssertImpl_218103865(msg_218103866) {
+    raiseAssert_218103841(msg_218103866);
+
+  
+}
+function uncovered_402653626(x_402653627) {
+      var Tmp1;
+    var Tmp2;
+
+  var result_402653628 = null;
+
+  BeforeRet: do {
+      if (!((x_402653627.kids).length == 0)) Tmp1 = false; else {        Tmp1 = !((x_402653627.heading == null));      }    if (Tmp1) {
+    if (!(x_402653627.heading.hasOwnProperty('__karaxMarker__'))) {
+    Tmp2 = x_402653627;
+    }
+    else {
+    Tmp2 = null;
+    }
+    
+    result_402653628 = Tmp2;
+    break BeforeRet;
+    }
+    
+    result_402653628 = {heading: x_402653627.heading, kids: [], sortId: x_402653627.sortId, doSort: x_402653627.doSort};
+    L3: do {
+      var i_402653647 = 0;
+      var colontmp__402653829 = 0;
+      colontmp__402653829 = (x_402653627.kids).length;
+      var i_402653830 = 0;
+      L4: do {
+          L5: while (true) {
+          if (!(i_402653830 < colontmp__402653829)) break L5;
+            i_402653647 = i_402653830;
+            var y_402653648 = uncovered_402653626(x_402653627.kids[chckIndx(i_402653647, 0, (x_402653627.kids).length-1)]);
+            if (!((y_402653648 == null))) {
+            result_402653628.kids.push(y_402653648);;
+            }
+            
+            i_402653830 = addInt(i_402653830, 1);
+          }
+      } while(false);
+    } while(false);
+    if (((result_402653628.kids).length == 0)) {
+    result_402653628 = null;
+    }
+    
+  } while (false);
+
+  return result_402653628;
+
+}
+function mergeTocs_402653660(orig_402653661, news_402653662) {
+  var result_402653663 = null;
+
+    result_402653663 = uncovered_402653626(orig_402653661);
+    if ((result_402653663 == null)) {
+    result_402653663 = news_402653662;
+    }
+    else {
+      L1: do {
+        var i_402653675 = 0;
+        var colontmp__402653825 = 0;
+        colontmp__402653825 = (news_402653662.kids).length;
+        var i_402653826 = 0;
+        L2: do {
+            L3: while (true) {
+            if (!(i_402653826 < colontmp__402653825)) break L3;
+              i_402653675 = i_402653826;
+              result_402653663.kids.push(news_402653662.kids[chckIndx(i_402653675, 0, (news_402653662.kids).length-1)]);;
+              i_402653826 = addInt(i_402653826, 1);
+            }
+        } while(false);
+      } while(false);
+    }
+    
+
+  return result_402653663;
+
+}
+function buildToc_402653680(orig_402653681, types_402653682, procs_402653683) {
+                      var Tmp7;
+
+  var result_402653684 = null;
+
+    var newStuff_402653689 = {heading: null, kids: [], doSort: true, sortId: 0};
+    L1: do {
+      var t_402653712 = null;
+      var t_402653712_Idx = 0;
+      var i_402653817 = 0;
+      var L_402653818 = (types_402653682).length;
+      L2: do {
+          L3: while (true) {
+          if (!(i_402653817 < L_402653818)) break L3;
+            t_402653712 = types_402653682; t_402653712_Idx = chckIndx(i_402653817, 0, (types_402653682).length-1);
+            var c_402653717 = {heading: t_402653712[t_402653712_Idx].cloneNode(true), kids: [], doSort: true, sortId: 0};
+            t_402653712[t_402653712_Idx].__karaxMarker__ = true;
+            L4: do {
+              var p_402653721 = null;
+              var p_402653721_Idx = 0;
+              var i_402653814 = 0;
+              var L_402653815 = (procs_402653683).length;
+              L5: do {
+                  L6: while (true) {
+                  if (!(i_402653814 < L_402653815)) break L6;
+                    p_402653721 = procs_402653683; p_402653721_Idx = chckIndx(i_402653814, 0, (procs_402653683).length-1);
+                    if (!(p_402653721[p_402653721_Idx].hasOwnProperty('__karaxMarker__'))) {
+                    var xx_402653722 = p_402653721[p_402653721_Idx].parentNode.getElementsByClassName("attachedType");
+                      if (!((xx_402653722).length == 1)) Tmp7 = false; else {                        Tmp7 = (xx_402653722[chckIndx(0, 0, (xx_402653722).length-1)].textContent == t_402653712[t_402653712_Idx].textContent);                      }                    if (Tmp7) {
+                    var q_402653726 = tree_402653189(makeNimstrLit("A"), [text_402653242(p_402653721[p_402653721_Idx].title)]);
+                    q_402653726.setAttribute("href", p_402653721[p_402653721_Idx].getAttribute("href"));
+                    c_402653717.kids.push({heading: q_402653726, kids: [], sortId: 0, doSort: false});;
+                    p_402653721[p_402653721_Idx].__karaxMarker__ = true;
+                    }
+                    
+                    }
+                    
+                    i_402653814 = addInt(i_402653814, 1);
+                    if (!(((procs_402653683).length == L_402653815))) {
+                    failedAssertImpl_218103865(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+                    }
+                    
+                  }
+              } while(false);
+            } while(false);
+            newStuff_402653689.kids.push(c_402653717);;
+            i_402653817 = addInt(i_402653817, 1);
+            if (!(((types_402653682).length == L_402653818))) {
+            failedAssertImpl_218103865(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+            }
+            
+          }
+      } while(false);
+    } while(false);
+    result_402653684 = mergeTocs_402653660(orig_402653681, newStuff_402653689);
+
+  return result_402653684;
+
+}
+function add_402653232(parent_402653233, kid_402653234) {
+      var Tmp1;
+        var Tmp2;
+
+      if (!(parent_402653233.nodeName == "TR")) Tmp1 = false; else {        if ((kid_402653234.nodeName == "TD")) Tmp2 = true; else {          Tmp2 = (kid_402653234.nodeName == "TH");        }        Tmp1 = Tmp2;      }    if (Tmp1) {
+    var k_402653235 = document.createElement("TD");
+    k_402653235.appendChild(kid_402653234);
+    parent_402653233.appendChild(k_402653235);
+    }
+    else {
+    parent_402653233.appendChild(kid_402653234);
+    }
+    
+
+  
+}
+function setClass_402653236(e_402653237, value_402653238) {
+    e_402653237.setAttribute("class", toJSStr(value_402653238));
+
+  
+}
+function toHtml_402653357(x_402653358, isRoot_402653359) {
+      var Tmp1;
+    function HEX3Aanonymous_402653377(a_402653378, b_402653379) {
+          var Tmp1;
+
+      var result_402653380 = 0;
+
+      BeforeRet: do {
+          if (!!((a_402653378.heading == null))) Tmp1 = false; else {            Tmp1 = !((b_402653379.heading == null));          }        if (Tmp1) {
+        var x_402653389 = a_402653378.heading.textContent;
+        var y_402653390 = b_402653379.heading.textContent;
+        if ((x_402653389 < y_402653390)) {
+        result_402653380 = -1;
+        break BeforeRet;
+        }
+        
+        if ((y_402653390 < x_402653389)) {
+        result_402653380 = 1;
+        break BeforeRet;
+        }
+        
+        result_402653380 = 0;
+        break BeforeRet;
+        }
+        else {
+          result_402653380 = subInt(a_402653378.sortId, b_402653379.sortId);
+          break BeforeRet;
+        }
+        
+      } while (false);
+
+      return result_402653380;
+
+    }
+
+  var result_402653360 = null;
+
+  BeforeRet: do {
+    if ((x_402653358 == null)) {
+    result_402653360 = null;
+    break BeforeRet;
+    }
+    
+    if (((x_402653358.kids).length == 0)) {
+    if ((x_402653358.heading == null)) {
+    result_402653360 = null;
+    break BeforeRet;
+    }
+    
+    result_402653360 = x_402653358.heading.cloneNode(true);
+    break BeforeRet;
+    }
+    
+    result_402653360 = tree_402653189(makeNimstrLit("DIV"), []);
+      if (!!((x_402653358.heading == null))) Tmp1 = false; else {        Tmp1 = !(x_402653358.heading.hasOwnProperty('__karaxMarker__'));      }    if (Tmp1) {
+    add_402653232(result_402653360, x_402653358.heading.cloneNode(true));
+    }
+    
+    var ul_402653376 = tree_402653189(makeNimstrLit("UL"), []);
+    if (isRoot_402653359) {
+    setClass_402653236(ul_402653376, makeNimstrLit("simple simple-toc"));
+    }
+    else {
+    setClass_402653236(ul_402653376, makeNimstrLit("simple"));
+    }
+    
+    if (x_402653358.doSort) {
+    x_402653358.kids.sort(HEX3Aanonymous_402653377);
+    }
+    
+    L2: do {
+      var k_402653421 = null;
+      var k_402653421_Idx = 0;
+      var i_402653834 = 0;
+      var L_402653835 = (x_402653358.kids).length;
+      L3: do {
+          L4: while (true) {
+          if (!(i_402653834 < L_402653835)) break L4;
+            k_402653421 = x_402653358.kids; k_402653421_Idx = chckIndx(i_402653834, 0, (x_402653358.kids).length-1);
+            var y_402653422 = toHtml_402653357(k_402653421[k_402653421_Idx], false);
+            if (!((y_402653422 == null))) {
+            add_402653232(ul_402653376, tree_402653189(makeNimstrLit("LI"), [y_402653422]));
+            }
+            
+            i_402653834 = addInt(i_402653834, 1);
+            if (!(((x_402653358.kids).length == L_402653835))) {
+            failedAssertImpl_218103865(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+            }
+            
+          }
+      } while(false);
+    } while(false);
+    if (!((ul_402653376.childNodes.length == 0))) {
+    add_402653232(result_402653360, ul_402653376);
+    }
+    
+    if ((result_402653360.childNodes.length == 0)) {
+    result_402653360 = null;
+    }
+    
+  } while (false);
+
+  return result_402653360;
+
+}
+function replaceById_402653247(id_402653248, newTree_402653249) {
+    var x_402653250 = document.getElementById(id_402653248);
+    x_402653250.parentNode.replaceChild(newTree_402653249, x_402653250);
+    newTree_402653249.id = id_402653248;
+
+  
+}
+function togglevis_402653758(d_402653759) {
+        if (d_402653759.style.display == 'none')
+      d_402653759.style.display = 'inline';
+    else
+      d_402653759.style.display = 'none';
+  
+
+  
+}
+function groupBy(value_402653761) {
+    var toc_402653762 = document.getElementById("toc-list");
+    if ((alternative_402653757[0] == null)) {
+    var tt_402653770 = {heading: null, kids: [], sortId: 0, doSort: false};
+    toToc_402653496(toc_402653762, tt_402653770);
+    tt_402653770 = tt_402653770.kids[chckIndx(0, 0, (tt_402653770.kids).length-1)];
+    var types_402653775 = [[]];
+    var procs_402653780 = [[]];
+    extractItems_402653315(tt_402653770, "Types", types_402653775, 0);
+    extractItems_402653315(tt_402653770, "Procs", procs_402653780, 0);
+    extractItems_402653315(tt_402653770, "Converters", procs_402653780, 0);
+    extractItems_402653315(tt_402653770, "Methods", procs_402653780, 0);
+    extractItems_402653315(tt_402653770, "Templates", procs_402653780, 0);
+    extractItems_402653315(tt_402653770, "Macros", procs_402653780, 0);
+    extractItems_402653315(tt_402653770, "Iterators", procs_402653780, 0);
+    var ntoc_402653781 = buildToc_402653680(tt_402653770, types_402653775[0], procs_402653780[0]);
+    var x_402653782 = toHtml_402653357(ntoc_402653781, true);
+    alternative_402653757[0] = tree_402653189(makeNimstrLit("DIV"), [x_402653782]);
+    }
+    
+    if ((value_402653761 == "type")) {
+    replaceById_402653247("tocRoot", alternative_402653757[0]);
+    }
+    else {
+    replaceById_402653247("tocRoot", tree_402653189(makeNimstrLit("DIV"), []));
+    }
+    
+    togglevis_402653758(document.getElementById("toc-list"));
+
+  
+}
+var db_402653837 = [[]];
+var contents_402653838 = [[]];
+var oldtoc_402653986 = [null];
+var timer_402653987 = [null];
+function nsuToLowerAsciiChar(c_553648189) {
+  var result_553648190 = 0;
+
+    if ((ConstSet2[c_553648189] != undefined)) {
+    result_553648190 = (c_553648189 ^ 32);
+    }
+    else {
+      result_553648190 = c_553648189;
+    }
+    
+
+  return result_553648190;
+
+}
+function fuzzyMatch_536870923(pattern_536870924, str_536870925) {
+              var Tmp4;
+              var Tmp5;
+                var Tmp6;
+      var Tmp7;
+        var Tmp8;
+
+  var result_536870928 = {Field0: 0, Field1: false};
+
+    var scoreState_536870929 = -100;
+    var headerMatched_536870930 = false;
+    var unmatchedLeadingCharCount_536870931 = 0;
+    var consecutiveMatchCount_536870932 = 0;
+    var strIndex_536870933 = 0;
+    var patIndex_536870934 = 0;
+    var score_536870935 = 0;
+    L1: do {
+        L2: while (true) {
+        if (!((strIndex_536870933 < (str_536870925).length) && (patIndex_536870934 < (pattern_536870924).length))) break L2;
+          L3: do {
+            var patternChar_536870938 = nsuToLowerAsciiChar(pattern_536870924.charCodeAt(chckIndx(patIndex_536870934, 0, (pattern_536870924).length-1)));
+            var strChar_536870939 = nsuToLowerAsciiChar(str_536870925.charCodeAt(chckIndx(strIndex_536870933, 0, (str_536870925).length-1)));
+            if ((ConstSet3[patternChar_536870938] != undefined)) {
+            patIndex_536870934 = addInt(patIndex_536870934, 1);
+            break L3;
+            }
+            
+            if ((ConstSet4[strChar_536870939] != undefined)) {
+            strIndex_536870933 = addInt(strIndex_536870933, 1);
+            break L3;
+            }
+            
+            if ((!(headerMatched_536870930) && (strChar_536870939 == 58))) {
+            headerMatched_536870930 = true;
+            scoreState_536870929 = -100;
+            score_536870935 = ((Math.floor((5.0000000000000000e-01 * score_536870935)))|0);
+            patIndex_536870934 = 0;
+            strIndex_536870933 = addInt(strIndex_536870933, 1);
+            break L3;
+            }
+            
+            if ((strChar_536870939 == patternChar_536870938)) {
+            switch (scoreState_536870929) {
+            case -100:
+            case 20:
+              scoreState_536870929 = 10;
+              break;
+            case 0:
+              scoreState_536870929 = 5;
+              score_536870935 = addInt(score_536870935, scoreState_536870929);
+              break;
+            case 10:
+            case 5:
+              consecutiveMatchCount_536870932 = addInt(consecutiveMatchCount_536870932, 1);
+              scoreState_536870929 = 5;
+              score_536870935 = addInt(score_536870935, mulInt(5, consecutiveMatchCount_536870932));
+              if ((scoreState_536870929 == 10)) {
+              score_536870935 = addInt(score_536870935, 10);
+              }
+              
+              var onBoundary_536870990 = (patIndex_536870934 == ((pattern_536870924).length-1));
+              if ((!(onBoundary_536870990) && (strIndex_536870933 < ((str_536870925).length-1)))) {
+              var nextPatternChar_536870991 = nsuToLowerAsciiChar(pattern_536870924.charCodeAt(chckIndx(addInt(patIndex_536870934, 1), 0, (pattern_536870924).length-1)));
+              var nextStrChar_536870992 = nsuToLowerAsciiChar(str_536870925.charCodeAt(chckIndx(addInt(strIndex_536870933, 1), 0, (str_536870925).length-1)));
+              if (!!((ConstSet5[nextStrChar_536870992] != undefined))) Tmp4 = false; else {                Tmp4 = !((nextStrChar_536870992 == nextPatternChar_536870991));              }              onBoundary_536870990 = Tmp4;
+              }
+              
+              if (onBoundary_536870990) {
+              scoreState_536870929 = 20;
+              score_536870935 = addInt(score_536870935, scoreState_536870929);
+              }
+              
+              break;
+            case -1:
+            case -3:
+              if (!((ConstSet6[str_536870925.charCodeAt(chckIndx(subInt(strIndex_536870933, 1), 0, (str_536870925).length-1))] != undefined))) Tmp5 = true; else {                if (!(ConstSet7[str_536870925.charCodeAt(chckIndx(subInt(strIndex_536870933, 1), 0, (str_536870925).length-1))] != undefined)) Tmp6 = false; else {                  Tmp6 = (ConstSet8[str_536870925.charCodeAt(chckIndx(strIndex_536870933, 0, (str_536870925).length-1))] != undefined);                }                Tmp5 = Tmp6;              }              var isLeadingChar_536871016 = Tmp5;
+              if (isLeadingChar_536871016) {
+              scoreState_536870929 = 10;
+              }
+              else {
+                scoreState_536870929 = 0;
+                score_536870935 = addInt(score_536870935, scoreState_536870929);
+              }
+              
+              break;
+            }
+            patIndex_536870934 = addInt(patIndex_536870934, 1);
+            }
+            else {
+              switch (scoreState_536870929) {
+              case -100:
+                scoreState_536870929 = -3;
+                score_536870935 = addInt(score_536870935, scoreState_536870929);
+                break;
+              case 5:
+                scoreState_536870929 = -1;
+                score_536870935 = addInt(score_536870935, scoreState_536870929);
+                consecutiveMatchCount_536870932 = 0;
+                break;
+              case -3:
+                if ((unmatchedLeadingCharCount_536870931 < 3)) {
+                scoreState_536870929 = -3;
+                score_536870935 = addInt(score_536870935, scoreState_536870929);
+                }
+                
+                unmatchedLeadingCharCount_536870931 = addInt(unmatchedLeadingCharCount_536870931, 1);
+                break;
+              default: 
+                scoreState_536870929 = -1;
+                score_536870935 = addInt(score_536870935, scoreState_536870929);
+                break;
+              }
+            }
+            
+            strIndex_536870933 = addInt(strIndex_536870933, 1);
+          } while(false);
+        }
+    } while(false);
+      if (!(patIndex_536870934 == (pattern_536870924).length)) Tmp7 = false; else {        if ((strIndex_536870933 == (str_536870925).length)) Tmp8 = true; else {          Tmp8 = !((ConstSet9[str_536870925.charCodeAt(chckIndx(strIndex_536870933, 0, (str_536870925).length-1))] != undefined));        }        Tmp7 = Tmp8;      }    if (Tmp7) {
+    score_536870935 = addInt(score_536870935, 10);
+    }
+    
+    var colontmp__402654047 = nimMax(0, score_536870935);
+    var colontmp__402654048 = (0 < score_536870935);
+    result_536870928 = nimCopy(result_536870928, {Field0: colontmp__402654047, Field1: colontmp__402654048}, NTI536870915);
+
+  return result_536870928;
+
+}
+function escapeCString_402653841(x_402653842, x_402653842_Idx) {
+    var s_402653843 = [];
+    L1: do {
+      var c_402653844 = 0;
+      var i_402654051 = 0;
+      var L_402654052 = (x_402653842[x_402653842_Idx]).length;
+      L2: do {
+          L3: while (true) {
+          if (!(i_402654051 < L_402654052)) break L3;
+            c_402653844 = x_402653842[x_402653842_Idx].charCodeAt(chckIndx(i_402654051, 0, (x_402653842[x_402653842_Idx]).length-1));
+            switch (c_402653844) {
+            case 60:
+              s_402653843.push.apply(s_402653843, makeNimstrLit("&lt;"));;
+              break;
+            case 62:
+              s_402653843.push.apply(s_402653843, makeNimstrLit("&gt;"));;
+              break;
+            default: 
+              addChar(s_402653843, c_402653844);;
+              break;
+            }
+            i_402654051 = addInt(i_402654051, 1);
+          }
+      } while(false);
+    } while(false);
+    x_402653842[x_402653842_Idx] = toJSStr(s_402653843);
+
+  
+}
+function text_402653239(s_402653240) {
+  var result_402653241 = null;
+
+    result_402653241 = document.createTextNode(toJSStr(s_402653240));
+
+  return result_402653241;
+
+}
+function dosearch_402653845(value_402653846) {
+    function HEX3Aanonymous_402653904(a_402653909, b_402653910) {
+      var result_402653915 = 0;
+
+        result_402653915 = subInt(b_402653910["Field1"], a_402653909["Field1"]);
+
+      return result_402653915;
+
+    }
+
+  var result_402653847 = null;
+
+    if (((db_402653837[0]).length == 0)) {
+    var stuff_402653851 = null;
+        var request = new XMLHttpRequest();
+    request.open("GET", "theindex.html", false);
+    request.send(null);
+
+    var doc = document.implementation.createHTMLDocument("theindex");
+    doc.documentElement.innerHTML = request.responseText;
+
+    //parser=new DOMParser();
+    //doc=parser.parseFromString("<html></html>", "text/html");
+
+    stuff_402653851 = doc.documentElement;
+    
+    db_402653837[0] = nimCopy(null, stuff_402653851.getElementsByClassName("reference"), NTI520094115);
+    contents_402653838[0] = nimCopy(null, [], NTI402653734);
+    L1: do {
+      var ahref_402653878 = null;
+      var ahref_402653878_Idx = 0;
+      var i_402654032 = 0;
+      var L_402654033 = (db_402653837[0]).length;
+      L2: do {
+          L3: while (true) {
+          if (!(i_402654032 < L_402654033)) break L3;
+            ahref_402653878 = db_402653837[0]; ahref_402653878_Idx = chckIndx(i_402654032, 0, (db_402653837[0]).length-1);
+            contents_402653838[0].push(ahref_402653878[ahref_402653878_Idx].getAttribute("data-doc-search-tag"));;
+            i_402654032 = addInt(i_402654032, 1);
+            if (!(((db_402653837[0]).length == L_402654033))) {
+            failedAssertImpl_218103865(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+            }
+            
+          }
+      } while(false);
+    } while(false);
+    }
+    
+    var ul_402653883 = tree_402653189(makeNimstrLit("UL"), []);
+    result_402653847 = tree_402653189(makeNimstrLit("DIV"), []);
+    setClass_402653236(result_402653847, makeNimstrLit("search_results"));
+    var matches_402653888 = [];
+    L4: do {
+      var i_402653896 = 0;
+      var colontmp__402654037 = 0;
+      colontmp__402654037 = (db_402653837[0]).length;
+      var i_402654038 = 0;
+      L5: do {
+          L6: while (true) {
+          if (!(i_402654038 < colontmp__402654037)) break L6;
+            i_402653896 = i_402654038;
+            L7: do {
+              var c_402653897 = contents_402653838[0][chckIndx(i_402653896, 0, (contents_402653838[0]).length-1)];
+              if (((c_402653897 == "Examples") || (c_402653897 == "PEG construction"))) {
+              break L7;
+              }
+              
+              var colontmp__402654044 = fuzzyMatch_536870923(value_402653846, c_402653897);
+              var score_402653898 = colontmp__402654044["Field0"];
+              var matched_402653899 = colontmp__402654044["Field1"];
+              if (matched_402653899) {
+              matches_402653888.push({Field0: db_402653837[0][chckIndx(i_402653896, 0, (db_402653837[0]).length-1)], Field1: score_402653898});;
+              }
+              
+            } while(false);
+            i_402654038 = addInt(i_402654038, 1);
+          }
+      } while(false);
+    } while(false);
+    matches_402653888.sort(HEX3Aanonymous_402653904);
+    L8: do {
+      var i_402653931 = 0;
+      var colontmp__402654041 = 0;
+      colontmp__402654041 = nimMin((matches_402653888).length, 29);
+      var i_402654042 = 0;
+      L9: do {
+          L10: while (true) {
+          if (!(i_402654042 < colontmp__402654041)) break L10;
+            i_402653931 = i_402654042;
+            matches_402653888[chckIndx(i_402653931, 0, (matches_402653888).length-1)]["Field0"].innerHTML = matches_402653888[chckIndx(i_402653931, 0, (matches_402653888).length-1)]["Field0"].getAttribute("data-doc-search-tag");
+            escapeCString_402653841(matches_402653888[chckIndx(i_402653931, 0, (matches_402653888).length-1)]["Field0"], "innerHTML");
+            add_402653232(ul_402653883, tree_402653189(makeNimstrLit("LI"), [matches_402653888[chckIndx(i_402653931, 0, (matches_402653888).length-1)]["Field0"]]));
+            i_402654042 = addInt(i_402654042, 1);
+          }
+      } while(false);
+    } while(false);
+    if ((ul_402653883.childNodes.length == 0)) {
+    add_402653232(result_402653847, tree_402653189(makeNimstrLit("B"), [text_402653239(makeNimstrLit("no search results"))]));
+    }
+    else {
+      add_402653232(result_402653847, tree_402653189(makeNimstrLit("B"), [text_402653239(makeNimstrLit("search results"))]));
+      add_402653232(result_402653847, ul_402653883);
+    }
+    
+
+  return result_402653847;
+
+}
+function search() {
+    function wrapper_402653998() {
+        var elem_402653999 = document.getElementById("searchInput");
+        var value_402654000 = elem_402653999.value;
+        if (!(((value_402654000).length == 0))) {
+        if ((oldtoc_402653986[0] == null)) {
+        oldtoc_402653986[0] = document.getElementById("tocRoot");
+        }
+        
+        var results_402654004 = dosearch_402653845(value_402654000);
+        replaceById_402653247("tocRoot", results_402654004);
+        }
+        else {
+        if (!((oldtoc_402653986[0] == null))) {
+        replaceById_402653247("tocRoot", oldtoc_402653986[0]);
+        }
+        }
+
+      
+    }
+
+    if (!((timer_402653987[0] == null))) {
+    clearTimeout(timer_402653987[0]);
+    }
+    
+    timer_402653987[0] = setTimeout(wrapper_402653998, 400);
+
+  
+}
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..5ba945b
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Refresh" content="0; url=regex.html" />
+  </head>
+  <body>
+    <p>Please follow <a href="regex.html">this link</a>.</p>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/nimdoc.out.css b/docs/nimdoc.out.css
new file mode 100644
index 0000000..7d4a399
--- /dev/null
+++ b/docs/nimdoc.out.css
@@ -0,0 +1,938 @@
+/*
+Stylesheet for use with Docutils/rst2html.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+
+Modified from Chad Skeeters' rst2html-style
+https://bitbucket.org/cskeeters/rst2html-style/
+
+Modified by Boyd Greenfield and narimiran
+*/
+
+:root {
+  --primary-background: #fff;
+  --secondary-background: ghostwhite;
+  --third-background: #e8e8e8;
+  --info-background: #50c050;
+  --warning-background: #c0a000;
+  --error-background: #e04040;
+  --border: #dde;
+  --text: #222;
+  --anchor: #07b;
+  --anchor-focus: #607c9f;
+  --input-focus: #1fa0eb;
+  --strong: #3c3c3c;
+  --hint: #9A9A9A;
+  --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN4AAAA9CAYAAADCt9ebAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjAzOjQ4KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1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");
+
+  --keyword: #5e8f60;
+  --identifier: #222;
+  --comment: #484a86;
+  --operator: #155da4;
+  --punctuation: black;
+  --other: black;
+  --escapeSequence: #c4891b;
+  --number: #252dbe;
+  --literal: #a4255b;
+  --raw-data: #a4255b;
+}
+
+[data-theme="dark"] {
+  --primary-background: #171921;
+  --secondary-background: #1e202a;
+  --third-background: #2b2e3b;
+  --info-background: #008000;
+  --warning-background: #807000;
+  --error-background: #c03000;
+  --border: #0e1014;
+  --text: #fff;
+  --anchor: #8be9fd;
+  --anchor-focus: #8be9fd;
+  --input-focus: #8be9fd;
+  --strong: #bd93f9;
+  --hint: #7A7C85;
+  --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQy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");
+
+  --keyword: #ff79c6;
+  --identifier: #f8f8f2;
+  --comment: #6272a4;
+  --operator: #ff79c6;
+  --punctuation: #f8f8f2;
+  --other: #f8f8f2;
+  --escapeSequence: #bd93f9;
+  --number: #bd93f9;
+  --literal: #f1fa8c;
+  --raw-data: #8be9fd;
+}
+
+.theme-switch-wrapper {
+  display: flex;
+  align-items: center;
+}
+
+.theme-switch-wrapper em {
+  margin-left: 10px;
+  font-size: 1rem;
+}
+
+.theme-switch {
+  display: inline-block;
+  height: 22px;
+  position: relative;
+  width: 50px;
+}
+
+.theme-switch input {
+  display: none;
+}
+
+.slider {
+  background-color: #ccc;
+  bottom: 0;
+  cursor: pointer;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  transition: .4s;
+}
+
+.slider:before {
+  background-color: #fff;
+  bottom: 4px;
+  content: "";
+  height: 13px;
+  left: 4px;
+  position: absolute;
+  transition: .4s;
+  width: 13px;
+}
+
+input:checked + .slider {
+  background-color: #66bb6a;
+}
+
+input:checked + .slider:before {
+  transform: translateX(26px);
+}
+
+.slider.round {
+  border-radius: 17px;
+}
+
+.slider.round:before {
+  border-radius: 50%;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%; }
+
+body {
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-weight: 400;
+  font-size: 1.125em;
+  line-height: 1.5;
+  color: var(--text);
+  background-color: var(--primary-background); }
+
+/* Skeleton grid */
+.container {
+  position: relative;
+  width: 100%;
+  max-width: 1050px;
+  margin: 0 auto;
+  padding: 0;
+  box-sizing: border-box; }
+
+.column,
+.columns {
+  width: 100%;
+  float: left;
+  box-sizing: border-box;
+  margin-left: 1%;
+}
+
+.column:first-child,
+.columns:first-child {
+  margin-left: 0; }
+
+.three.columns {
+  width: 22%;
+}
+
+.nine.columns {
+  width: 77.0%; }
+
+.twelve.columns {
+  width: 100%;
+  margin-left: 0; }
+
+@media screen and (max-width: 860px) {
+  .three.columns {
+    display: none;
+  }
+  .nine.columns {
+    width: 98.0%;
+  }
+  body {
+    font-size: 1em;
+    line-height: 1.35;
+  }
+}
+
+cite {
+  font-style: italic !important; }
+
+
+/* Nim search input */
+div#searchInputDiv {
+  margin-bottom: 1em;
+}
+input#searchInput {
+  width: 80%;
+}
+
+/*
+ * Some custom formatting for input forms.
+ * This also fixes input form colors on Firefox with a dark system theme on Linux.
+ */
+input {
+  -moz-appearance: none;
+  background-color: var(--secondary-background);
+  color: var(--text);
+  border: 1px solid var(--border);
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-size: 0.9em;
+  padding: 6px;
+}
+
+input:focus {
+  border: 1px solid var(--input-focus);
+  box-shadow: 0 0 3px var(--input-focus);
+}
+
+select {
+  -moz-appearance: none;
+  background-color: var(--secondary-background);
+  color: var(--text);
+  border: 1px solid var(--border);
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-size: 0.9em;
+  padding: 6px;
+}
+
+select:focus {
+  border: 1px solid var(--input-focus);
+  box-shadow: 0 0 3px var(--input-focus);
+}
+
+/* Docgen styles */
+/* Links */
+a {
+  color: var(--anchor);
+  text-decoration: none;
+}
+
+a span.Identifier {
+  text-decoration: underline;
+  text-decoration-color: #aab;
+}
+
+a.reference-toplevel {
+  font-weight: bold;
+}
+
+a.toc-backref {
+  text-decoration: none;
+  color: var(--text); }
+
+a.link-seesrc {
+  color: #607c9f;
+  font-size: 0.9em;
+  font-style: italic; }
+
+a:hover,
+a:focus {
+  color: var(--anchor-focus);
+  text-decoration: underline; }
+
+a:hover span.Identifier {
+  color: var(--anchor);
+}
+
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline; }
+
+sup {
+  top: -0.5em; }
+
+sub {
+  bottom: -0.25em; }
+
+img {
+  width: auto;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic; }
+
+@media print {
+  * {
+    color: black !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important; }
+
+  a,
+  a:visited {
+    text-decoration: underline; }
+
+  a[href]:after {
+    content: " (" attr(href) ")"; }
+
+  abbr[title]:after {
+    content: " (" attr(title) ")"; }
+
+  .ir a:after,
+  a[href^="javascript:"]:after,
+  a[href^="#"]:after {
+    content: ""; }
+
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid; }
+
+  thead {
+    display: table-header-group; }
+
+  tr,
+  img {
+    page-break-inside: avoid; }
+
+  img {
+    max-width: 100% !important; }
+
+  @page {
+    margin: 0.5cm; }
+
+  h1 {
+    page-break-before: always; }
+
+  h1.title {
+    page-break-before: avoid; }
+
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3; }
+
+  h2,
+  h3 {
+    page-break-after: avoid; }
+}
+
+
+p {
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+}
+
+small {
+  font-size: 85%; }
+
+strong {
+  font-weight: 600;
+  font-size: 0.95em;
+  color: var(--strong);
+}
+
+em {
+  font-style: italic; }
+
+h1 {
+  font-size: 1.8em;
+  font-weight: 400;
+  padding-bottom: .25em;
+  border-bottom: 6px solid var(--third-background);
+  margin-top: 2.5em;
+  margin-bottom: 1em;
+  line-height: 1.2em; }
+
+h1.title {
+  padding-bottom: 1em;
+  border-bottom: 0px;
+  font-size: 2.5em;
+  text-align: center;
+  font-weight: 900;
+  margin-top: 0.75em;
+  margin-bottom: 0em;
+}
+
+h2 {
+  font-size: 1.3em;
+  margin-top: 2em; }
+
+h2.subtitle {
+  text-align: center; }
+
+h3 {
+  font-size: 1.125em;
+  font-style: italic;
+  margin-top: 1.5em; }
+
+h4 {
+  font-size: 1.125em;
+  margin-top: 1em; }
+
+h5 {
+  font-size: 1.125em;
+  margin-top: 0.75em; }
+
+h6 {
+  font-size: 1.1em; }
+
+
+ul,
+ol {
+  padding: 0;
+  margin-top: 0.5em;
+  margin-left: 0.75em; }
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+  margin-left: 1.25em; }
+
+ul.simple > li {
+    list-style-type: circle;
+}
+
+ul.simple-boot li {
+    list-style-type: none;
+    margin-left: 0em;
+    margin-bottom: 0.5em;
+}
+
+ol.simple > li, ul.simple > li {
+  margin-bottom: 0.2em;
+  margin-left: 0.4em }
+
+ul.simple.simple-toc > li {
+    margin-top: 1em;
+}
+
+ul.simple-toc {
+  list-style: none;
+  font-size: 0.9em;
+  margin-left: -0.3em;
+  margin-top: 1em; }
+
+ul.simple-toc > li {
+    list-style-type: none;
+}
+
+ul.simple-toc-section {
+  list-style-type: circle;
+  margin-left: 0.8em;
+  color: #6c9aae; }
+
+ul.nested-toc-section {
+  list-style-type: circle;
+  margin-left: -0.75em;
+  color: var(--text);
+}
+
+ul.nested-toc-section > li {
+  margin-left: 1.25em;
+}
+
+
+ol.arabic {
+  list-style: decimal; }
+
+ol.loweralpha {
+  list-style: lower-alpha; }
+
+ol.upperalpha {
+  list-style: upper-alpha; }
+
+ol.lowerroman {
+  list-style: lower-roman; }
+
+ol.upperroman {
+  list-style: upper-roman; }
+
+ul.auto-toc {
+  list-style-type: none; }
+
+
+dl {
+  margin-bottom: 1.5em; }
+
+dt {
+  margin-bottom: -0.5em;
+  margin-left: 0.0em; }
+
+dd {
+  margin-left: 2.0em;
+  margin-bottom: 3.0em;
+  margin-top: 0.5em; }
+
+
+hr {
+  margin: 2em 0;
+  border: 0;
+  border-top: 1px solid #aaa; }
+
+blockquote {
+  font-size: 0.9em;
+  font-style: italic;
+  padding-left: 0.5em;
+  margin-left: 0;
+  border-left: 5px solid #bbc;
+}
+
+.pre {
+  font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-weight: 500;
+  font-size: 0.85em;
+  color: var(--text);
+  background-color: var(--third-background);
+  padding-left: 3px;
+  padding-right: 3px;
+  border-radius: 4px;
+}
+
+pre {
+  font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+  color: var(--text);
+  font-weight: 500;
+  display: inline-block;
+  box-sizing: border-box;
+  min-width: 100%;
+  padding: 0.5em;
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+  font-size: 0.85em;
+  white-space: pre !important;
+  overflow-y: hidden;
+  overflow-x: visible;
+  background-color: var(--secondary-background);
+  border: 1px solid var(--border);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px; }
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll; }
+
+
+/* Nim line-numbered tables */
+.line-nums-table {
+  width: 100%;
+  table-layout: fixed; }
+
+table.line-nums-table {
+  border-radius: 4px;
+  border: 1px solid #cccccc;
+  background-color: ghostwhite;
+  border-collapse: separate;
+  margin-top: 15px;
+  margin-bottom: 25px; }
+
+.line-nums-table tbody {
+  border: none; }
+
+.line-nums-table td pre {
+  border: none;
+  background-color: transparent; }
+
+.line-nums-table td.blob-line-nums {
+  width: 28px; }
+
+.line-nums-table td.blob-line-nums pre {
+  color: #b0b0b0;
+  -webkit-filter: opacity(75%);
+  text-align: right;
+  border-color: transparent;
+  background-color: transparent;
+  padding-left: 0px;
+  margin-left: 0px;
+  padding-right: 0px;
+  margin-right: 0px; }
+
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  margin-top: 0.5em;
+  margin-bottom: 1.5em;
+  border-collapse: collapse;
+  border-color: var(--third-background);
+  border-spacing: 0;
+  font-size: 0.9em;
+}
+
+table th, table td {
+  padding: 0px 0.5em 0px;
+  border-color: var(--third-background);
+}
+
+table th {
+  background-color: var(--third-background);
+  border-color: var(--third-background);
+  font-weight: bold; }
+
+table th.docinfo-name {
+    background-color: transparent;
+    text-align: right;
+}
+
+table tr:hover {
+  background-color: var(--third-background); }
+
+
+/* rst2html default used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0; }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 !important; }
+
+.admonition {
+    padding: 0.3em;
+    background-color: var(--secondary-background);
+    border-left: 0.4em solid #7f7f84;
+    margin-bottom: 0.5em;
+    -webkit-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
+       -moz-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
+            box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
+}
+.admonition-info {
+    border-color: var(--info-background);
+}
+.admonition-info-text {
+    color: var(--info-background);
+}
+.admonition-warning {
+    border-color: var(--warning-background);
+}
+.admonition-warning-text {
+    color: var(--warning-background);
+}
+.admonition-error {
+    border-color: var(--error-background);
+}
+.admonition-error-text {
+    color: var(--error-background);
+}
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 !important; }
+
+.last, .with-subtitle {
+  margin-bottom: 0 !important; }
+
+.hidden {
+  display: none; }
+
+blockquote.epigraph {
+  margin: 2em 5em; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em; }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden; }
+
+
+div.figure {
+  margin-left: 2em;
+  margin-right: 2em; }
+
+div.footer, div.header {
+  clear: both;
+  text-align: center;
+  color: #666;
+  font-size: smaller; }
+
+div.footer {
+    padding-top: 5em;
+}
+
+div.line-block {
+  display: block;
+  margin-top: 1em;
+  margin-bottom: 1em; }
+
+div.line-block div.line-block {
+  margin-top: 0;
+  margin-bottom: 0;
+  margin-left: 1.5em; }
+
+div.topic {
+  margin: 2em; }
+
+div.search_results {
+  background-color: var(--third-background);
+  margin: 3em;
+  padding: 1em;
+  border: 1px solid #4d4d4d;
+}
+
+div#global-links ul {
+  margin-left: 0;
+  list-style-type: none;
+}
+
+div#global-links > simple-boot {
+    margin-left: 3em;
+}
+
+hr.docutils {
+  width: 75%; }
+
+img.align-left, .figure.align-left, object.align-left {
+  clear: left;
+  float: left;
+  margin-right: 1em; }
+
+img.align-right, .figure.align-right, object.align-right {
+  clear: right;
+  float: right;
+  margin-left: 1em; }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto; }
+
+.align-left {
+  text-align: left; }
+
+.align-center {
+  clear: both;
+  text-align: center; }
+
+.align-right {
+  text-align: right; }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit; }
+
+p.attribution {
+  text-align: right;
+  margin-left: 50%; }
+
+p.caption {
+  font-style: italic; }
+
+p.credits {
+  font-style: italic;
+  font-size: smaller; }
+
+p.label {
+  white-space: nowrap; }
+
+p.rubric {
+  font-weight: bold;
+  font-size: larger;
+  color: maroon;
+  text-align: center; }
+
+p.topic-title {
+  font-weight: bold; }
+
+pre.address {
+  margin-bottom: 0;
+  margin-top: 0;
+  font: inherit; }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em;
+  margin-right: 2em; }
+
+pre.code .ln {
+  color: grey; }
+
+/* line numbers */
+pre.code, code {
+  background-color: #eeeeee; }
+
+pre.code .comment, code .comment {
+  color: #5c6576; }
+
+pre.code .keyword, code .keyword {
+  color: #3B0D06;
+  font-weight: bold; }
+
+pre.code .literal.string, code .literal.string {
+  color: #0c5404; }
+
+pre.code .name.builtin, code .name.builtin {
+  color: #352b84; }
+
+pre.code .deleted, code .deleted {
+  background-color: #DEB0A1; }
+
+pre.code .inserted, code .inserted {
+  background-color: #A3D289; }
+
+span.classifier {
+  font-style: oblique; }
+
+span.classifier-delimiter {
+  font-weight: bold; }
+
+span.option {
+  white-space: nowrap; }
+
+span.problematic {
+  color: #b30000; }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80%; }
+
+span.DecNumber {
+  color: var(--number); }
+
+span.BinNumber {
+  color: var(--number); }
+
+span.HexNumber {
+  color: var(--number); }
+
+span.OctNumber {
+  color: var(--number); }
+
+span.FloatNumber {
+  color: var(--number); }
+
+span.Identifier {
+  color: var(--identifier); }
+
+span.Keyword {
+  font-weight: 600;
+  color: var(--keyword); }
+
+span.StringLit {
+  color: var(--literal); }
+
+span.LongStringLit {
+  color: var(--literal); }
+
+span.CharLit {
+  color: var(--literal); }
+
+span.EscapeSequence {
+  color: var(--escapeSequence); }
+
+span.Operator {
+  color: var(--operator); }
+
+span.Punctuation {
+  color: var(--punctuation); }
+
+span.Comment, span.LongComment {
+  font-style: italic;
+  font-weight: 400;
+  color: var(--comment); }
+
+span.RegularExpression {
+  color: darkviolet; }
+
+span.TagStart {
+  color: darkviolet; }
+
+span.TagEnd {
+  color: darkviolet; }
+
+span.Key {
+  color: #252dbe; }
+
+span.Value {
+  color: #252dbe; }
+
+span.RawData {
+  color: var(--raw-data); }
+
+span.Assembler {
+  color: #252dbe; }
+
+span.Preprocessor {
+  color: #252dbe; }
+
+span.Directive {
+  color: #252dbe; }
+
+span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference,
+span.Other {
+  color: var(--other); }
+
+/* Pop type, const, proc, and iterator defs in nim def blocks */
+dt pre > span.Identifier, dt pre > span.Operator {
+  color: var(--identifier);
+  font-weight: 700; }
+
+dt pre > span.Keyword ~ span.Identifier, dt pre > span.Identifier ~ span.Identifier,
+dt pre > span.Operator ~ span.Identifier, dt pre > span.Other ~ span.Identifier {
+  color: var(--identifier);
+  font-weight: inherit; }
+
+/* Nim sprite for the footer (taken from main page favicon) */
+.nim-sprite {
+  display: inline-block;
+  width: 51px;
+  height: 14px;
+  background-position: 0 0;
+  background-size: 51px 14px;
+  -webkit-filter: opacity(50%);
+  background-repeat: no-repeat;
+  background-image: var(--nim-sprite-base64);
+  margin-bottom: 5px; }
+
+span.pragmadots {
+  /* Position: relative frees us up to make the dots
+  look really nice without fucking up the layout and
+  causing bulging in the parent container */
+  position: relative;
+  /* 1px down looks slightly nicer */
+  top: 1px;
+  padding: 2px;
+  background-color: var(--third-background);
+  border-radius: 4px;
+  margin: 0 2px;
+  cursor: pointer;
+  font-size: 0.8em;
+}
+
+span.pragmadots:hover {
+  background-color: var(--hint);
+}
+span.pragmawrap {
+  display: none;
+}
+
+span.attachedType {
+  display: none;
+  visibility: hidden;
+}
diff --git a/docs/regex.html b/docs/regex.html
new file mode 100644
index 0000000..82ea931
--- /dev/null
+++ b/docs/regex.html
@@ -0,0 +1,875 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li><a class="reference" id="syntax_toc" href="#syntax">Syntax</a></li>
+<ul class="simple"><li><a class="reference" id="syntax-matching-one-character_toc" href="#syntax-matching-one-character">Matching one character</a></li>
+<li><a class="reference" id="syntax-character-classes_toc" href="#syntax-character-classes">Character classes</a></li>
+<li><a class="reference" id="syntax-composites_toc" href="#syntax-composites">Composites</a></li>
+<li><a class="reference" id="syntax-repetitions_toc" href="#syntax-repetitions">Repetitions</a></li>
+<li><a class="reference" id="syntax-empty-matches_toc" href="#syntax-empty-matches">Empty matches</a></li>
+<li><a class="reference" id="syntax-grouping-and-flags_toc" href="#syntax-grouping-and-flags">Grouping and flags</a></li>
+<li><a class="reference" id="syntax-escape-sequences_toc" href="#syntax-escape-sequences">Escape sequences</a></li>
+<li><a class="reference" id="syntax-perl-character-classes-unicode-friendly_toc" href="#syntax-perl-character-classes-unicode-friendly">Perl character classes (Unicode friendly)</a></li>
+<li><a class="reference" id="syntax-ascii-character-classes_toc" href="#syntax-ascii-character-classes">ASCII character classes</a></li>
+<li><a class="reference" id="syntax-lookaround-assertions_toc" href="#syntax-lookaround-assertions">Lookaround Assertions</a></li>
+</ul><li><a class="reference" id="examples_toc" href="#examples">Examples</a></li>
+<ul class="simple"><li><a class="reference" id="examples-multiple-captures_toc" href="#examples-multiple-captures">Multiple captures</a></li>
+<li><a class="reference" id="examples-verbose-mode_toc" href="#examples-verbose-mode">Verbose Mode</a></li>
+<li><a class="reference" id="examples-find-all_toc" href="#examples-find-all">Find All</a></li>
+<li><a class="reference" id="examples-match-macro_toc" href="#examples-match-macro">Match Macro</a></li>
+</ul><li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">contains
+      <li><a class="reference" href="#contains%2Cstring%2CRegex"
+    title="contains(s: string; pattern: Regex): bool">contains,<wbr>string,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">isInitialized
+      <li><a class="reference" href="#isInitialized%2CRegex"
+    title="isInitialized(re: Regex): bool">isInitialized,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">replace
+      <li><a class="reference" href="#replace%2Cstring%2CRegex%2Cstring%2Cint"
+    title="replace(s: string; pattern: Regex; by: string; limit = 0): string">replace,<wbr>string,<wbr>Regex,<wbr>string,<wbr>int</a></li>
+  <li><a class="reference" href="#replace%2Cstring%2CRegex%2Cproc%28RegexMatch%2Cstring%29%2Cint"
+    title="replace(s: string; pattern: Regex; by: proc (m: RegexMatch; s: string): string;
+        limit = 0): string">replace,<wbr>string,<wbr>Regex,<wbr>proc(RegexMatch,<wbr>string),<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">escapeRe
+      <li><a class="reference" href="#escapeRe%2Cstring"
+    title="escapeRe(s: string): string">escapeRe,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">split
+      <li><a class="reference" href="#split%2Cstring%2CRegex"
+    title="split(s: string; sep: Regex): seq[string]">split,<wbr>string,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">startsWith
+      <li><a class="reference" href="#startsWith%2Cstring%2CRegex%2Cint"
+    title="startsWith(s: string; pattern: Regex; start = 0): bool">startsWith,<wbr>string,<wbr>Regex,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">splitIncl
+      <li><a class="reference" href="#splitIncl%2Cstring%2CRegex"
+    title="splitIncl(s: string; sep: Regex): seq[string]">splitIncl,<wbr>string,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">match
+      <li><a class="reference" href="#match%2Cstring%2CRegex%2CRegexMatch%2Cint"
+    title="match(s: string; pattern: Regex; m: var RegexMatch; start = 0): bool">match,<wbr>string,<wbr>Regex,<wbr>RegexMatch,<wbr>int</a></li>
+  <li><a class="reference" href="#match%2Cstring%2CRegex"
+    title="match(s: string; pattern: Regex): bool">match,<wbr>string,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">toPattern
+      <li><a class="reference" href="#toPattern%2Cstring"
+    title="toPattern(s: string): Regex">toPattern,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">findAll
+      <li><a class="reference" href="#findAll%2Cstring%2CRegex%2Cint"
+    title="findAll(s: string; pattern: Regex; start = 0): seq[RegexMatch]">findAll,<wbr>string,<wbr>Regex,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">findAllBounds
+      <li><a class="reference" href="#findAllBounds%2Cstring%2CRegex%2Cint"
+    title="findAllBounds(s: string; pattern: Regex; start = 0): seq[Slice[int]]">findAllBounds,<wbr>string,<wbr>Regex,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">groupLastCapture
+      <li><a class="reference" href="#groupLastCapture%2CRegexMatch%2Cint%2Cstring"
+    title="groupLastCapture(m: RegexMatch; i: int; text: string): string">groupLastCapture,<wbr>RegexMatch,<wbr>int,<wbr>string</a></li>
+  <li><a class="reference" href="#groupLastCapture%2CRegexMatch%2Cstring%2Cstring"
+    title="groupLastCapture(m: RegexMatch; groupName: string; text: string): string">groupLastCapture,<wbr>RegexMatch,<wbr>string,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">group
+      <li><a class="reference" href="#group%2CRegexMatch%2Cint"
+    title="group(m: RegexMatch; i: int): seq[Slice[int]]">group,<wbr>RegexMatch,<wbr>int</a></li>
+  <li><a class="reference" href="#group%2CRegexMatch%2Cint%2Cstring"
+    title="group(m: RegexMatch; i: int; text: string): seq[string]">group,<wbr>RegexMatch,<wbr>int,<wbr>string</a></li>
+  <li><a class="reference" href="#group%2CRegexMatch%2Cstring"
+    title="group(m: RegexMatch; s: string): seq[Slice[int]]">group,<wbr>RegexMatch,<wbr>string</a></li>
+  <li><a class="reference" href="#group%2CRegexMatch%2Cstring%2Cstring"
+    title="group(m: RegexMatch; groupName: string; text: string): seq[string]">group,<wbr>RegexMatch,<wbr>string,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">groupNames
+      <li><a class="reference" href="#groupNames%2CRegexMatch"
+    title="groupNames(m: RegexMatch): seq[string]">groupNames,<wbr>RegexMatch</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">findAndCaptureAll
+      <li><a class="reference" href="#findAndCaptureAll%2Cstring%2CRegex"
+    title="findAndCaptureAll(s: string; pattern: Regex): seq[string]">findAndCaptureAll,<wbr>string,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">endsWith
+      <li><a class="reference" href="#endsWith%2Cstring%2CRegex"
+    title="endsWith(s: string; pattern: Regex): bool">endsWith,<wbr>string,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">re
+      <li><a class="reference" href="#re%2Cstring"
+    title="re(s: string): Regex">re,<wbr>string</a></li>
+  <li><a class="reference" href="#re%2Cstaticstring"
+    title="re(s: static string): static[Regex]">re,<wbr>staticstring</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">groupFirstCapture
+      <li><a class="reference" href="#groupFirstCapture%2CRegexMatch%2Cint%2Cstring"
+    title="groupFirstCapture(m: RegexMatch; i: int; text: string): string">groupFirstCapture,<wbr>RegexMatch,<wbr>int,<wbr>string</a></li>
+  <li><a class="reference" href="#groupFirstCapture%2CRegexMatch%2Cstring%2Cstring"
+    title="groupFirstCapture(m: RegexMatch; groupName: string; text: string): string">groupFirstCapture,<wbr>RegexMatch,<wbr>string,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">find
+      <li><a class="reference" href="#find%2Cstring%2CRegex%2CRegexMatch%2Cint"
+    title="find(s: string; pattern: Regex; m: var RegexMatch; start = 0): bool">find,<wbr>string,<wbr>Regex,<wbr>RegexMatch,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">groupsCount
+      <li><a class="reference" href="#groupsCount%2CRegexMatch"
+    title="groupsCount(m: RegexMatch): int">groupsCount,<wbr>RegexMatch</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">rex
+      <li><a class="reference" href="#rex%2Cstring"
+    title="rex(s: string): RegexLit">rex,<wbr>string</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#15" id="65">Iterators</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#group.i%2CRegexMatch%2Cint"
+    title="group(m: RegexMatch; i: int): Slice[int]">group</a></li>
+  <li><a class="reference" href="#group.i%2CRegexMatch%2Cstring"
+    title="group(m: RegexMatch; s: string): Slice[int]">group</a></li>
+  <li><a class="reference" href="#findAll.i%2Cstring%2CRegex%2Cint"
+    title="findAll(s: string; pattern: Regex; start = 0): RegexMatch">findAll</a></li>
+  <li><a class="reference" href="#findAllBounds.i%2Cstring%2CRegex%2Cint"
+    title="findAllBounds(s: string; pattern: Regex; start = 0): Slice[int]">findAllBounds</a></li>
+  <li><a class="reference" href="#split.i%2Cstring%2CRegex"
+    title="split(s: string; sep: Regex): string">split</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#17" id="67">Macros</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#match.m%2Cstring%2CRegexLit%2Cuntyped"
+    title="match(text: string; regex: RegexLit; body: untyped): untyped">match</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#19" id="69">Exports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc">A library for parsing, compiling, and executing regular expressions. The match time is linear in the length of the text and the regular expression. So, it can handle input from untrusted users. The syntax is similar to PCRE but lacks a few features that can not be implemented while keeping the space/time complexity guarantees, ex: backreferences.
+<h1><a class="toc-backref" id="syntax" href="#syntax">Syntax</a></h1>
+<h2><a class="toc-backref" id="syntax-matching-one-character" href="#syntax-matching-one-character">Matching one character</a></h2><pre class="listing"><span class="Operator">.</span>          <span class="Identifier">any</span> <span class="Identifier">character</span> <span class="Keyword">except</span> <span class="Identifier">new</span> <span class="Identifier">line</span> <span class="Punctuation">(</span><span class="Identifier">includes</span> <span class="Identifier">new</span> <span class="Identifier">line</span> <span class="Identifier">with</span> <span class="Identifier">s</span> <span class="Identifier">flag</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">d</span>         <span class="Identifier">digit</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">Nd</span><span class="Punctuation">}</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">D</span>         <span class="Keyword">not</span> <span class="Identifier">digit</span>
+<span class="Operator">\</span><span class="Identifier">pN</span>        <span class="Identifier">One</span><span class="Operator">-</span><span class="Identifier">letter</span> <span class="Identifier">name</span> <span class="Identifier">Unicode</span> <span class="Identifier">character</span> <span class="Identifier">class</span>
+<span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">Greek</span><span class="Punctuation">}</span>  <span class="Identifier">Unicode</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Punctuation">(</span><span class="Identifier">general</span> <span class="Identifier">category</span> <span class="Keyword">or</span> <span class="Identifier">script</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">PN</span>        <span class="Identifier">Negated</span> <span class="Identifier">one</span><span class="Operator">-</span><span class="Identifier">letter</span> <span class="Identifier">name</span> <span class="Identifier">Unicode</span> <span class="Identifier">character</span> <span class="Identifier">class</span>
+<span class="Operator">\</span><span class="Identifier">P</span><span class="Punctuation">{</span><span class="Identifier">Greek</span><span class="Punctuation">}</span>  <span class="Identifier">negated</span> <span class="Identifier">Unicode</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Punctuation">(</span><span class="Identifier">general</span> <span class="Identifier">category</span> <span class="Keyword">or</span> <span class="Identifier">script</span><span class="Punctuation">)</span></pre>
+<h2><a class="toc-backref" id="syntax-character-classes" href="#syntax-character-classes">Character classes</a></h2><pre class="listing"><span class="Punctuation">[</span><span class="Identifier">xyz</span><span class="Punctuation">]</span>         <span class="Identifier">A</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Identifier">matching</span> <span class="Identifier">either</span> <span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">y</span> <span class="Keyword">or</span> <span class="Identifier">z</span> <span class="Punctuation">(</span><span class="Identifier">union</span><span class="Punctuation">)</span><span class="Operator">.</span>
+<span class="Punctuation">[</span><span class="Operator">^</span><span class="Identifier">xyz</span><span class="Punctuation">]</span>        <span class="Identifier">A</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Identifier">matching</span> <span class="Identifier">any</span> <span class="Identifier">character</span> <span class="Keyword">except</span> <span class="Identifier">x</span><span class="Punctuation">,</span> <span class="Identifier">y</span> <span class="Keyword">and</span> <span class="Identifier">z</span><span class="Operator">.</span>
+<span class="Punctuation">[</span><span class="Identifier">a</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Punctuation">]</span>         <span class="Identifier">A</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Identifier">matching</span> <span class="Identifier">any</span> <span class="Identifier">character</span> <span class="Keyword">in</span> <span class="Identifier">range</span> <span class="Identifier">a</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Operator">.</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">alpha</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">ASCII</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Za</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Operator">^</span><span class="Identifier">alpha</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>  <span class="Identifier">Negated</span> <span class="Identifier">ASCII</span> <span class="Identifier">character</span> <span class="Identifier">class</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">^</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Za</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Operator">\</span><span class="Punctuation">[</span><span class="Operator">\</span><span class="Punctuation">]</span><span class="Punctuation">]</span>        <span class="Identifier">Escaping</span> <span class="Keyword">in</span> <span class="Identifier">character</span> <span class="Identifier">classes</span> <span class="Punctuation">(</span><span class="Identifier">matching</span> <span class="Punctuation">[</span> <span class="Keyword">or</span> <span class="Punctuation">]</span><span class="Punctuation">)</span></pre>
+<h2><a class="toc-backref" id="syntax-composites" href="#syntax-composites">Composites</a></h2><pre class="listing"><span class="Identifier">xy</span>   <span class="Identifier">concatenation</span> <span class="Punctuation">(</span><span class="Identifier">x</span> <span class="Identifier">followed</span> <span class="Identifier">by</span> <span class="Identifier">y</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Operator">|</span><span class="Identifier">y</span>  <span class="Identifier">alternation</span> <span class="Punctuation">(</span><span class="Identifier">x</span> <span class="Keyword">or</span> <span class="Identifier">y</span><span class="Punctuation">,</span> <span class="Identifier">prefer</span> <span class="Identifier">x</span><span class="Punctuation">)</span></pre>
+<h2><a class="toc-backref" id="syntax-repetitions" href="#syntax-repetitions">Repetitions</a></h2><pre class="listing"><span class="Identifier">x</span><span class="Operator">*</span>       <span class="Identifier">zero</span> <span class="Keyword">or</span> <span class="Identifier">more</span> <span class="Keyword">of</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">greedy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Operator">+</span>       <span class="Identifier">one</span> <span class="Keyword">or</span> <span class="Identifier">more</span> <span class="Keyword">of</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">greedy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Operator">?</span>       <span class="Identifier">zero</span> <span class="Keyword">or</span> <span class="Identifier">one</span> <span class="Keyword">of</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">greedy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Operator">*?</span>      <span class="Identifier">zero</span> <span class="Keyword">or</span> <span class="Identifier">more</span> <span class="Keyword">of</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">ungreedy</span><span class="Operator">/</span><span class="Identifier">lazy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Operator">+?</span>      <span class="Identifier">one</span> <span class="Keyword">or</span> <span class="Identifier">more</span> <span class="Keyword">of</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">ungreedy</span><span class="Operator">/</span><span class="Identifier">lazy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Operator">??</span>      <span class="Identifier">zero</span> <span class="Keyword">or</span> <span class="Identifier">one</span> <span class="Keyword">of</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">ungreedy</span><span class="Operator">/</span><span class="Identifier">lazy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Punctuation">{</span><span class="Identifier">n</span><span class="Punctuation">,</span><span class="Identifier">m</span><span class="Punctuation">}</span>   <span class="Identifier">at</span> <span class="Identifier">least</span> <span class="Identifier">n</span> <span class="Identifier">x</span> <span class="Keyword">and</span> <span class="Identifier">at</span> <span class="Identifier">most</span> <span class="Identifier">m</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">greedy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Punctuation">{</span><span class="Identifier">n</span><span class="Punctuation">,</span><span class="Punctuation">}</span>    <span class="Identifier">at</span> <span class="Identifier">least</span> <span class="Identifier">n</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">greedy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Punctuation">{</span><span class="Identifier">n</span><span class="Punctuation">}</span>     <span class="Identifier">exactly</span> <span class="Identifier">n</span> <span class="Identifier">x</span>
+<span class="Identifier">x</span><span class="Punctuation">{</span><span class="Identifier">n</span><span class="Punctuation">,</span><span class="Identifier">m</span><span class="Punctuation">}</span><span class="Operator">?</span>  <span class="Identifier">at</span> <span class="Identifier">least</span> <span class="Identifier">n</span> <span class="Identifier">x</span> <span class="Keyword">and</span> <span class="Identifier">at</span> <span class="Identifier">most</span> <span class="Identifier">m</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">ungreedy</span><span class="Operator">/</span><span class="Identifier">lazy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Punctuation">{</span><span class="Identifier">n</span><span class="Punctuation">,</span><span class="Punctuation">}</span><span class="Operator">?</span>   <span class="Identifier">at</span> <span class="Identifier">least</span> <span class="Identifier">n</span> <span class="Identifier">x</span> <span class="Punctuation">(</span><span class="Identifier">ungreedy</span><span class="Operator">/</span><span class="Identifier">lazy</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span><span class="Punctuation">{</span><span class="Identifier">n</span><span class="Punctuation">}</span><span class="Operator">?</span>    <span class="Identifier">exactly</span> <span class="Identifier">n</span> <span class="Identifier">x</span></pre>
+<h2><a class="toc-backref" id="syntax-empty-matches" href="#syntax-empty-matches">Empty matches</a></h2><pre class="listing"><span class="Operator">^</span>   <span class="Identifier">the</span> <span class="Identifier">beginning</span> <span class="Keyword">of</span> <span class="Identifier">text</span> <span class="Punctuation">(</span><span class="Keyword">or</span> <span class="Identifier">start</span><span class="Operator">-</span><span class="Keyword">of</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">with</span> <span class="Identifier">multi</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">mode</span><span class="Punctuation">)</span>
+<span class="Operator">$</span>   <span class="Identifier">the</span> <span class="Keyword">end</span> <span class="Keyword">of</span> <span class="Identifier">text</span> <span class="Punctuation">(</span><span class="Keyword">or</span> <span class="Keyword">end</span><span class="Operator">-</span><span class="Keyword">of</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">with</span> <span class="Identifier">multi</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">mode</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">A</span>  <span class="Identifier">only</span> <span class="Identifier">the</span> <span class="Identifier">beginning</span> <span class="Keyword">of</span> <span class="Identifier">text</span> <span class="Punctuation">(</span><span class="Identifier">even</span> <span class="Identifier">with</span> <span class="Identifier">multi</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">mode</span> <span class="Identifier">enabled</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">z</span>  <span class="Identifier">only</span> <span class="Identifier">the</span> <span class="Keyword">end</span> <span class="Keyword">of</span> <span class="Identifier">text</span> <span class="Punctuation">(</span><span class="Identifier">even</span> <span class="Identifier">with</span> <span class="Identifier">multi</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">mode</span> <span class="Identifier">enabled</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">b</span>  <span class="Identifier">a</span> <span class="Identifier">Unicode</span> <span class="Identifier">word</span> <span class="Identifier">boundary</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">w</span> <span class="Identifier">on</span> <span class="Identifier">one</span> <span class="Identifier">side</span> <span class="Keyword">and</span> <span class="Operator">\</span><span class="Identifier">W</span><span class="Punctuation">,</span> <span class="Operator">\</span><span class="Identifier">A</span><span class="Punctuation">,</span> <span class="Keyword">or</span> <span class="Operator">\</span><span class="Identifier">z</span> <span class="Identifier">on</span> <span class="Identifier">other</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">B</span>  <span class="Keyword">not</span> <span class="Identifier">a</span> <span class="Identifier">Unicode</span> <span class="Identifier">word</span> <span class="Identifier">boundary</span></pre>
+<h2><a class="toc-backref" id="syntax-grouping-and-flags" href="#syntax-grouping-and-flags">Grouping and flags</a></h2><pre class="listing"><span class="Punctuation">(</span><span class="Identifier">exp</span><span class="Punctuation">)</span>          <span class="Identifier">numbered</span> <span class="Identifier">capture</span> <span class="Identifier">group</span> <span class="Punctuation">(</span><span class="Identifier">indexed</span> <span class="Identifier">by</span> <span class="Identifier">opening</span> <span class="Identifier">parenthesis</span><span class="Punctuation">)</span>
+<span class="Punctuation">(</span><span class="Operator">?</span><span class="Identifier">P</span><span class="Operator">&lt;</span><span class="Identifier">name</span><span class="Operator">&gt;</span><span class="Identifier">exp</span><span class="Punctuation">)</span>  <span class="Identifier">named</span> <span class="Punctuation">(</span><span class="Identifier">also</span> <span class="Identifier">numbered</span><span class="Punctuation">)</span> <span class="Identifier">capture</span> <span class="Identifier">group</span> <span class="Punctuation">(</span><span class="Identifier">allowed</span> <span class="Identifier">chars</span><span class="Punctuation">:</span> <span class="Punctuation">[</span><span class="Identifier">_0</span><span class="Operator">-</span><span class="DecNumber">9</span><span class="Identifier">a</span><span class="Operator">-</span><span class="Identifier">zA</span><span class="Operator">-</span><span class="Identifier">Z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">(</span><span class="Operator">?:</span><span class="Identifier">exp</span><span class="Punctuation">)</span>        <span class="Identifier">non</span><span class="Operator">-</span><span class="Identifier">capturing</span> <span class="Identifier">group</span>
+<span class="Punctuation">(</span><span class="Operator">?</span><span class="Identifier">flags</span><span class="Punctuation">)</span>       <span class="Identifier">set</span> <span class="Identifier">flags</span> <span class="Identifier">within</span> <span class="Identifier">current</span> <span class="Identifier">group</span>
+<span class="Punctuation">(</span><span class="Operator">?</span><span class="Identifier">flags</span><span class="Punctuation">:</span><span class="Identifier">exp</span><span class="Punctuation">)</span>   <span class="Identifier">set</span> <span class="Identifier">flags</span> <span class="Keyword">for</span> <span class="Identifier">exp</span> <span class="Punctuation">(</span><span class="Identifier">non</span><span class="Operator">-</span><span class="Identifier">capturing</span><span class="Punctuation">)</span></pre><p>Flags are each a single character. For example, (?x) sets the flag x and (?-x) clears the flag x. Multiple flags can be set or cleared at the same time: (?xy) sets both the x and y flags, (?x-y) sets the x flag and clears the y flag, and (?-xy) clears both the x and y flags.</p>
+<pre class="listing"><span class="Identifier">i</span>  <span class="Keyword">case</span><span class="Operator">-</span><span class="Identifier">insensitive</span><span class="Punctuation">:</span> <span class="Identifier">letters</span> <span class="Identifier">match</span> <span class="Identifier">both</span> <span class="Identifier">upper</span> <span class="Keyword">and</span> <span class="Identifier">lower</span> <span class="Keyword">case</span>
+<span class="Identifier">m</span>  <span class="Identifier">multi</span><span class="Operator">-</span><span class="Identifier">line</span> <span class="Identifier">mode</span><span class="Punctuation">:</span> <span class="Operator">^</span> <span class="Keyword">and</span> <span class="Operator">$</span> <span class="Identifier">match</span> <span class="Identifier">begin</span><span class="Operator">/</span><span class="Keyword">end</span> <span class="Keyword">of</span> <span class="Identifier">line</span>
+<span class="Identifier">s</span>  <span class="Identifier">allow</span> <span class="Operator">.</span> <span class="Identifier">to</span> <span class="Identifier">match</span> <span class="Operator">\</span><span class="Identifier">L</span> <span class="Punctuation">(</span><span class="Identifier">new</span> <span class="Identifier">line</span><span class="Punctuation">)</span>
+<span class="Identifier">U</span>  <span class="Identifier">swap</span> <span class="Identifier">the</span> <span class="Identifier">meaning</span> <span class="Keyword">of</span> <span class="Identifier">x</span><span class="Operator">*</span> <span class="Keyword">and</span> <span class="Identifier">x</span><span class="Operator">*?</span> <span class="Punctuation">(</span><span class="Identifier">un</span><span class="Operator">-</span><span class="Identifier">greedy</span> <span class="Identifier">mode</span><span class="Punctuation">)</span>
+<span class="Identifier">u</span>  <span class="Identifier">Unicode</span> <span class="Identifier">support</span> <span class="Punctuation">(</span><span class="Identifier">enabled</span> <span class="Identifier">by</span> <span class="Identifier">default</span><span class="Punctuation">)</span>
+<span class="Identifier">x</span>  <span class="Identifier">ignore</span> <span class="Identifier">whitespace</span> <span class="Keyword">and</span> <span class="Identifier">allow</span> <span class="Identifier">line</span> <span class="Identifier">comments</span> <span class="Punctuation">(</span><span class="Identifier">starting</span> <span class="Identifier">with</span> <span class="Punctuation">`</span><span class="Comment">#`)</span></pre><p><tt class="docutils literal"><span class="pre">All flags are disabled by default unless stated otherwise</span></tt></p>
+
+<h2><a class="toc-backref" id="syntax-escape-sequences" href="#syntax-escape-sequences">Escape sequences</a></h2><pre class="listing"><span class="Operator">\*</span>         <span class="Identifier">literal</span> <span class="Operator">*</span><span class="Punctuation">,</span> <span class="Identifier">works</span> <span class="Keyword">for</span> <span class="Identifier">any</span> <span class="Identifier">punctuation</span> <span class="Identifier">character</span><span class="Punctuation">:</span> <span class="Operator">\.+*?</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Operator">|</span><span class="Punctuation">[</span><span class="Punctuation">]</span><span class="Punctuation">{</span><span class="Punctuation">}</span><span class="Operator">^$</span>
+<span class="Operator">\</span><span class="Identifier">a</span>         <span class="Identifier">bell</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">x07</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">f</span>         <span class="Identifier">form</span> <span class="Identifier">feed</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">x0C</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">t</span>         <span class="Identifier">horizontal</span> <span class="Identifier">tab</span>
+<span class="Operator">\</span><span class="Identifier">n</span>         <span class="Identifier">new</span> <span class="Identifier">line</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">L</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">r</span>         <span class="Identifier">carriage</span> <span class="Keyword">return</span>
+<span class="Operator">\</span><span class="Identifier">v</span>         <span class="Identifier">vertical</span> <span class="Identifier">tab</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">x0B</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="DecNumber">123</span>       <span class="Identifier">octal</span> <span class="Identifier">character</span> <span class="Identifier">code</span> <span class="Punctuation">(</span><span class="Identifier">up</span> <span class="Identifier">to</span> <span class="Identifier">three</span> <span class="Identifier">digits</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">x7F</span>       <span class="Identifier">hex</span> <span class="Identifier">character</span> <span class="Identifier">code</span> <span class="Punctuation">(</span><span class="Identifier">exactly</span> <span class="Identifier">two</span> <span class="Identifier">digits</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">x</span><span class="Punctuation">{</span><span class="DecNumber">10</span><span class="Identifier">FFFF</span><span class="Punctuation">}</span> <span class="Identifier">any</span> <span class="Identifier">hex</span> <span class="Identifier">character</span> <span class="Identifier">code</span> <span class="Identifier">corresponding</span> <span class="Identifier">to</span> <span class="Identifier">a</span> <span class="Identifier">Unicode</span> <span class="Identifier">code</span> <span class="Identifier">point</span>
+<span class="Operator">\</span><span class="Identifier">u007F</span>     <span class="Identifier">hex</span> <span class="Identifier">character</span> <span class="Identifier">code</span> <span class="Punctuation">(</span><span class="Identifier">exactly</span> <span class="Identifier">four</span> <span class="Identifier">digits</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">U0010FFFF</span> <span class="Identifier">hex</span> <span class="Identifier">character</span> <span class="Identifier">code</span> <span class="Punctuation">(</span><span class="Identifier">exactly</span> <span class="Identifier">eight</span> <span class="Identifier">digits</span><span class="Punctuation">)</span></pre>
+<h2><a class="toc-backref" id="syntax-perl-character-classes-unicode-friendly" href="#syntax-perl-character-classes-unicode-friendly">Perl character classes (Unicode friendly)</a></h2><p>These classes are based on the definitions provided in <a class="reference external" href="http://www.unicode.org/reports/tr18/#Compatibility_Properties">UTS#18</a></p>
+<pre class="listing"><span class="Operator">\</span><span class="Identifier">d</span>  <span class="Identifier">digit</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">Nd</span><span class="Punctuation">}</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">D</span>  <span class="Keyword">not</span> <span class="Identifier">digit</span>
+<span class="Operator">\</span><span class="Identifier">s</span>  <span class="Identifier">whitespace</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">White_Space</span><span class="Punctuation">}</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">S</span>  <span class="Keyword">not</span> <span class="Identifier">whitespace</span>
+<span class="Operator">\</span><span class="Identifier">w</span>  <span class="Identifier">word</span> <span class="Identifier">character</span> <span class="Punctuation">(</span><span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">Alphabetic</span><span class="Punctuation">}</span> <span class="Operator">+</span> <span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">M</span><span class="Punctuation">}</span> <span class="Operator">+</span> <span class="Operator">\</span><span class="Identifier">d</span> <span class="Operator">+</span> <span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">Pc</span><span class="Punctuation">}</span> <span class="Operator">+</span> <span class="Operator">\</span><span class="Identifier">p</span><span class="Punctuation">{</span><span class="Identifier">Join_Control</span><span class="Punctuation">}</span><span class="Punctuation">)</span>
+<span class="Operator">\</span><span class="Identifier">W</span>  <span class="Keyword">not</span> <span class="Identifier">word</span> <span class="Identifier">character</span></pre>
+<h2><a class="toc-backref" id="syntax-ascii-character-classes" href="#syntax-ascii-character-classes">ASCII character classes</a></h2><pre class="listing"><span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">alnum</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">alphanumeric</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Operator">-</span><span class="DecNumber">9</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Za</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">alpha</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">alphabetic</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Za</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">ascii</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">ASCII</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">\</span><span class="Identifier">x00</span><span class="Operator">-\</span><span class="Identifier">x7F</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">blank</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">blank</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">\</span><span class="Identifier">t</span> <span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">cntrl</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">control</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">\</span><span class="Identifier">x00</span><span class="Operator">-\</span><span class="Identifier">x1F</span><span class="Operator">\</span><span class="Identifier">x7F</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">digit</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">digits</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Operator">-</span><span class="DecNumber">9</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">graph</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">graphical</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">!-~</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">lower</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">lower</span> <span class="Keyword">case</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Identifier">a</span><span class="Operator">-</span><span class="Identifier">z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">print</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">printable</span> <span class="Punctuation">(</span><span class="Punctuation">[</span> <span class="Operator">-~</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">punct</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">punctuation</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">!-/:-@\</span><span class="Punctuation">[</span><span class="Operator">-</span><span class="Punctuation">`</span><span class="Punctuation">{</span><span class="Operator">-~</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">space</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">whitespace</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Operator">\</span><span class="Identifier">t</span><span class="Operator">\</span><span class="Identifier">n</span><span class="Operator">\</span><span class="Identifier">v</span><span class="Operator">\</span><span class="Identifier">f</span><span class="Operator">\</span><span class="Identifier">r</span> <span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">upper</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>   <span class="Identifier">upper</span> <span class="Keyword">case</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Z</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">word</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>    <span class="Identifier">word</span> <span class="Identifier">characters</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Operator">-</span><span class="DecNumber">9</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Za</span><span class="Operator">-</span><span class="Identifier">z_</span><span class="Punctuation">]</span><span class="Punctuation">)</span>
+<span class="Punctuation">[</span><span class="Punctuation">[</span><span class="Punctuation">:</span><span class="Identifier">xdigit</span><span class="Punctuation">:</span><span class="Punctuation">]</span><span class="Punctuation">]</span>  <span class="Identifier">hex</span> <span class="Identifier">digit</span> <span class="Punctuation">(</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Operator">-</span><span class="DecNumber">9</span><span class="Identifier">A</span><span class="Operator">-</span><span class="Identifier">Fa</span><span class="Operator">-</span><span class="Identifier">f</span><span class="Punctuation">]</span><span class="Punctuation">)</span></pre>
+<h2><a class="toc-backref" id="syntax-lookaround-assertions" href="#syntax-lookaround-assertions">Lookaround Assertions</a></h2><pre class="listing"><span class="Punctuation">(</span><span class="Operator">?=</span><span class="Identifier">regex</span><span class="Punctuation">)</span>   <span class="Identifier">A</span> <span class="Identifier">positive</span> <span class="Identifier">lookahead</span> <span class="Identifier">assertion</span>
+<span class="Punctuation">(</span><span class="Operator">?!</span><span class="Identifier">regex</span><span class="Punctuation">)</span>   <span class="Identifier">A</span> <span class="Identifier">negative</span> <span class="Identifier">lookahead</span> <span class="Identifier">assertion</span>
+<span class="Punctuation">(</span><span class="Operator">?&lt;=</span><span class="Identifier">regex</span><span class="Punctuation">)</span>  <span class="Identifier">A</span> <span class="Identifier">positive</span> <span class="Identifier">lookbehind</span> <span class="Identifier">assertion</span>
+<span class="Punctuation">(</span><span class="Operator">?&lt;!</span><span class="Identifier">regex</span><span class="Punctuation">)</span>  <span class="Identifier">A</span> <span class="Identifier">negative</span> <span class="Identifier">lookbehind</span> <span class="Identifier">assertion</span></pre><p>Any regex expression is a valid lookaround; groups are captured as well. Beware, lookarounds containing repetitions (<tt class="docutils literal"><span class="pre">*</span></tt>, <tt class="docutils literal"><span class="pre">+</span></tt>, and <tt class="docutils literal"><span class="pre">{n,}</span></tt>) may run in polynomial time.</p>
+
+<h1><a class="toc-backref" id="examples" href="#examples">Examples</a></h1>
+<h2><a class="toc-backref" id="examples-multiple-captures" href="#examples-multiple-captures">Multiple captures</a></h2><p>Unlike most regex engines, this library supports capturing all repetitions. Most other libraries return only the last capture. The caveat is even non-repeated groups or characters are returned as a list of captures instead of a single capture.</p>
+<pre class="listing"><span class="Keyword">let</span> <span class="Identifier">text</span> <span class="Operator">=</span> <span class="StringLit">&quot;nim c --styleCheck:hint --colors:off regex.nim&quot;</span>
+<span class="Keyword">var</span> <span class="Identifier">m</span><span class="Punctuation">:</span> <span class="Identifier">RegexMatch</span>
+<span class="Keyword">if</span> <span class="Identifier">match</span><span class="Punctuation">(</span><span class="Identifier">text</span><span class="Punctuation">,</span> <span class="RawData">re&quot;nim c (?:--(\w+:\w+) *)+ (\w+).nim&quot;</span><span class="Punctuation">,</span> <span class="Identifier">m</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
+  <span class="Identifier">doAssert</span> <span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">,</span> <span class="Identifier">text</span><span class="Punctuation">)</span> <span class="Operator">==</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;styleCheck:hint&quot;</span><span class="Punctuation">,</span> <span class="StringLit">&quot;colors:off&quot;</span><span class="Punctuation">]</span>
+  <span class="Identifier">doAssert</span> <span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">1</span><span class="Punctuation">,</span> <span class="Identifier">text</span><span class="Punctuation">)</span> <span class="Operator">==</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;regex&quot;</span><span class="Punctuation">]</span>
+<span class="Keyword">else</span><span class="Punctuation">:</span>
+  <span class="Identifier">doAssert</span> <span class="Identifier">false</span><span class="Punctuation">,</span> <span class="StringLit">&quot;no match&quot;</span></pre>
+<h2><a class="toc-backref" id="examples-verbose-mode" href="#examples-verbose-mode">Verbose Mode</a></h2><p>Verbose mode <tt class="docutils literal"><span class="pre">(?x)</span></tt> makes regexes more readable by allowing comments and multi-lines within the regular expression itself. The caveat is spaces and pound signs must be scaped to be matched.</p>
+<pre class="listing"><span class="Keyword">const</span> <span class="Identifier">exp</span> <span class="Operator">=</span> <span class="LongStringLit">re&quot;&quot;&quot;(?x)
+\#   # the hashtag
+\w+  # hashtag words
+&quot;&quot;&quot;</span>
+<span class="Keyword">let</span> <span class="Identifier">text</span> <span class="Operator">=</span> <span class="StringLit">&quot;#NimLang&quot;</span>
+<span class="Identifier">doAssert</span> <span class="Identifier">match</span><span class="Punctuation">(</span><span class="Identifier">text</span><span class="Punctuation">,</span> <span class="Identifier">exp</span><span class="Punctuation">)</span></pre>
+<h2><a class="toc-backref" id="examples-find-all" href="#examples-find-all">Find All</a></h2><p>The <tt class="docutils literal"><span class="pre">findAll</span></tt> function will find all boundaries and captures that match the regular expression.</p>
+<pre class="listing"><span class="Keyword">let</span> <span class="Identifier">text</span> <span class="Operator">=</span> <span class="LongStringLit">&quot;&quot;&quot;
+The Continental's email list:
+john_wick@continental.com
+winston@continental.com
+ms_perkins@continental.com
+&quot;&quot;&quot;</span>
+<span class="Keyword">var</span> <span class="Identifier">matches</span> <span class="Operator">=</span> <span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
+<span class="Keyword">var</span> <span class="Identifier">captures</span> <span class="Operator">=</span> <span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span>
+<span class="Keyword">for</span> <span class="Identifier">m</span> <span class="Keyword">in</span> <span class="Identifier">findAll</span><span class="Punctuation">(</span><span class="Identifier">text</span><span class="Punctuation">,</span> <span class="RawData">re&quot;(\w+)@\w+\.\w+&quot;</span><span class="Punctuation">)</span><span class="Punctuation">:</span>
+  <span class="Identifier">matches</span><span class="Operator">.</span><span class="Identifier">add</span> <span class="Identifier">text</span><span class="Punctuation">[</span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">boundaries</span><span class="Punctuation">]</span>
+  <span class="Identifier">captures</span><span class="Operator">.</span><span class="Identifier">add</span> <span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">,</span> <span class="Identifier">text</span><span class="Punctuation">)</span>
+<span class="Identifier">doAssert</span> <span class="Identifier">matches</span> <span class="Operator">==</span> <span class="Operator">@</span><span class="Punctuation">[</span>
+  <span class="StringLit">&quot;john_wick@continental.com&quot;</span><span class="Punctuation">,</span>
+  <span class="StringLit">&quot;winston@continental.com&quot;</span><span class="Punctuation">,</span>
+  <span class="StringLit">&quot;ms_perkins@continental.com&quot;</span>
+<span class="Punctuation">]</span>
+<span class="Identifier">doAssert</span> <span class="Identifier">captures</span> <span class="Operator">==</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;john_wick&quot;</span><span class="Punctuation">,</span> <span class="StringLit">&quot;winston&quot;</span><span class="Punctuation">,</span> <span class="StringLit">&quot;ms_perkins&quot;</span><span class="Punctuation">]</span></pre>
+<h2><a class="toc-backref" id="examples-match-macro" href="#examples-match-macro">Match Macro</a></h2><p>The <tt class="docutils literal"><span class="pre">match</span></tt> macro is sometimes more convenient, and faster than the function version. It will run a full match on the whole string, similar to <tt class="docutils literal"><span class="pre">^regex$</span></tt>.</p>
+<p>A <tt class="docutils literal"><span class="pre">matches: seq[string]</span></tt> variable is injected into the scope, and it contains the submatches for every capture group.</p>
+<pre class="listing"><span class="Keyword">var</span> <span class="Identifier">matched</span> <span class="Operator">=</span> <span class="Identifier">false</span>
+<span class="Keyword">let</span> <span class="Identifier">text</span> <span class="Operator">=</span> <span class="StringLit">&quot;[my link](https://example.com)&quot;</span>
+<span class="Identifier">match</span> <span class="Identifier">text</span><span class="Punctuation">,</span> <span class="RawData">rex&quot;\[([^\]]+)\]\((https?://[^)]+)\)&quot;</span><span class="Punctuation">:</span>
+  <span class="Identifier">doAssert</span> <span class="Identifier">matches</span> <span class="Operator">==</span> <span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;my link&quot;</span><span class="Punctuation">,</span> <span class="StringLit">&quot;https://example.com&quot;</span><span class="Punctuation">]</span>
+  <span class="Identifier">matched</span> <span class="Operator">=</span> <span class="Identifier">true</span>
+<span class="Identifier">doAssert</span> <span class="Identifier">matched</span></pre></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="regex/types.html">regex/types</a>, <a class="reference external" href="regex/common.html">regex/common</a>, <a class="reference external" href="regex/compiler.html">regex/compiler</a>, <a class="reference external" href="regex/nfatype.html">regex/nfatype</a>, <a class="reference external" href="regex/nfafindall.html">regex/nfafindall</a>, <a class="reference external" href="regex/nfamatch.html">regex/nfamatch</a>, <a class="reference external" href="regex/litopt.html">regex/litopt</a>, <a class="reference external" href="regex/nfamacro.html">regex/nfamacro</a>, <a class="reference external" href="regex/parser.html">regex/parser</a>, <a class="reference external" href="regex/exptransformation.html">regex/exptransformation</a>, <a class="reference external" href="regex/dotgraph.html">regex/dotgraph</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="re,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#re%2Cstring"><span class="Identifier">re</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><a href="regex/common.html#RegexError"><span class="Identifier">RegexError</span></a><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Parse and compile a regular expression at run-time
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">abcx</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="RawData">re&quot;abc\w&quot;</span><span class="Whitespace">
+</span><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">abcx2</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">re</span><span class="Punctuation">(</span><span class="RawData">r&quot;abc\w&quot;</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">pat</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="RawData">r&quot;abc\w&quot;</span><span class="Whitespace">
+</span><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">abcx3</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">re</span><span class="Punctuation">(</span><span class="Identifier">pat</span><span class="Punctuation">)</span></pre>
+
+</dd>
+<a id="re,staticstring"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#re%2Cstaticstring"><span class="Identifier">re</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">static</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">static</span><span class="Other">[</span><a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Parse and compile a regular expression at compile-time
+
+</dd>
+<a id="toPattern,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#toPattern%2Cstring"><span class="Identifier">toPattern</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><a href="regex/common.html#RegexError"><span class="Identifier">RegexError</span></a><span class="Other">]</span><span class="Other">,</span>
+                                   <span class="Identifier">deprecated</span><span class="Other">:</span> <span class="StringLit">&quot;Use `re` instead&quot;</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+  <div class="deprecation-message">
+    <b>Deprecated:</b> Use `re` instead
+  </div>
+
+
+
+</dd>
+<a id="rex,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#rex%2Cstring"><span class="Identifier">rex</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexLit"><span class="Identifier">RegexLit</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Raw regex literal string
+
+</dd>
+<a id="group,RegexMatch,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#group%2CRegexMatch%2Cint"><span class="Identifier">group</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return slices for a given group. Use the iterator version if you care about performance
+
+</dd>
+<a id="group,RegexMatch,int,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#group%2CRegexMatch%2Cint%2Cstring"><span class="Identifier">group</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return seq of captured text by group number <tt class="docutils literal"><span class="pre">i</span></tt>
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello beautiful world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(hello) (?:([^\s]+)\s?)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;hello&quot;</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">1</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;beautiful&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;world&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="groupFirstCapture,RegexMatch,int,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#groupFirstCapture%2CRegexMatch%2Cint%2Cstring"><span class="Identifier">groupFirstCapture</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return first capture for a given capturing group
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello beautiful world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(hello) (?:([^\s]+)\s?)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupFirstCapture</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupFirstCapture</span><span class="Punctuation">(</span><span class="DecNumber">1</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;beautiful&quot;</span></pre>
+
+</dd>
+<a id="groupLastCapture,RegexMatch,int,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#groupLastCapture%2CRegexMatch%2Cint%2Cstring"><span class="Identifier">groupLastCapture</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return last capture for a given capturing group
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello beautiful world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(hello) (?:([^\s]+)\s?)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupLastCapture</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupLastCapture</span><span class="Punctuation">(</span><span class="DecNumber">1</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;world&quot;</span></pre>
+
+</dd>
+<a id="group,RegexMatch,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#group%2CRegexMatch%2Cstring"><span class="Identifier">group</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">KeyError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return slices for a given named group. Use the iterator version if you care about performance
+
+</dd>
+<a id="group,RegexMatch,string,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#group%2CRegexMatch%2Cstring%2Cstring"><span class="Identifier">group</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">groupName</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">KeyError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return seq of captured text by group <tt class="docutils literal"><span class="pre">groupName</span></tt>
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello beautiful world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(?P&lt;greet&gt;hello) (?:(?P&lt;who&gt;[^\s]+)\s?)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="StringLit">&quot;greet&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;hello&quot;</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="StringLit">&quot;who&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;beautiful&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;world&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="groupFirstCapture,RegexMatch,string,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#groupFirstCapture%2CRegexMatch%2Cstring%2Cstring"><span class="Identifier">groupFirstCapture</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">groupName</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">KeyError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return first capture for a given capturing group
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello beautiful world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(?P&lt;greet&gt;hello) (?:(?P&lt;who&gt;[^\s]+)\s?)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupFirstCapture</span><span class="Punctuation">(</span><span class="StringLit">&quot;greet&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupFirstCapture</span><span class="Punctuation">(</span><span class="StringLit">&quot;who&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;beautiful&quot;</span></pre>
+
+</dd>
+<a id="groupLastCapture,RegexMatch,string,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#groupLastCapture%2CRegexMatch%2Cstring%2Cstring"><span class="Identifier">groupLastCapture</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">groupName</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">KeyError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return last capture for a given capturing group
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello beautiful world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(?P&lt;greet&gt;hello) (?:(?P&lt;who&gt;[^\s]+)\s?)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupLastCapture</span><span class="Punctuation">(</span><span class="StringLit">&quot;greet&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupLastCapture</span><span class="Punctuation">(</span><span class="StringLit">&quot;who&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;world&quot;</span></pre>
+
+</dd>
+<a id="groupsCount,RegexMatch"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#groupsCount%2CRegexMatch"><span class="Identifier">groupsCount</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return the number of capturing groups
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;ab&quot;</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(a)(b)&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupsCount</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="DecNumber">2</span></pre>
+
+</dd>
+<a id="groupNames,RegexMatch"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#groupNames%2CRegexMatch"><span class="Identifier">groupNames</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return the names of capturing groups.
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;hello world&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(?P&lt;greet&gt;hello) (?P&lt;who&gt;world)&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">groupNames</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;greet&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;who&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="match,string,Regex,RegexMatch,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#match%2Cstring%2CRegex%2CRegexMatch%2Cint"><span class="Identifier">match</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">m</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return a match if the whole string matches the regular expression. This is similar to <tt class="docutils literal"><span class="pre">find(text, re&quot;^regex$&quot;, m)</span></tt> but has better performance
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcd&quot;</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;abcd&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Keyword">not</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcd&quot;</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;abc&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span></pre>
+
+</dd>
+<a id="match,string,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#match%2Cstring%2CRegex"><span class="Identifier">match</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="findAll,string,Regex,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#findAll%2Cstring%2CRegex%2Cint"><span class="Identifier">findAll</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="findAllBounds,string,Regex,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#findAllBounds%2Cstring%2CRegex%2Cint"><span class="Identifier">findAllBounds</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="findAndCaptureAll,string,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#findAndCaptureAll%2Cstring%2CRegex"><span class="Identifier">findAndCaptureAll</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+search through the string and return a seq with captures.
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">findAndCaptureAll</span><span class="Punctuation">(</span><span class="StringLit">&quot;a1b2c3d4e5&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">re&quot;\d&quot;</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace">
+  </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;1&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;2&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;3&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;4&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;5&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="contains,string,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#contains%2Cstring%2CRegex"><span class="Identifier">contains</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+search for the pattern anywhere in the string
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="RawData">re&quot;bc&quot;</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcd&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="RawData">re&quot;(23)+&quot;</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="StringLit">&quot;23232&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="RawData">re&quot;^(23)+$&quot;</span><span class="Whitespace"> </span><span class="Keyword">notin</span><span class="Whitespace"> </span><span class="StringLit">&quot;23232&quot;</span></pre>
+
+</dd>
+<a id="find,string,Regex,RegexMatch,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#find%2Cstring%2CRegex%2CRegexMatch%2Cint"><span class="Identifier">find</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">m</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+search through the string looking for the first location where there is a match
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcd&quot;</span><span class="Operator">.</span><span class="Identifier">find</span><span class="Punctuation">(</span><span class="RawData">re&quot;bc&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Keyword">and</span><span class="Whitespace">
+  </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">boundaries</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="DecNumber">1</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">2</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Keyword">not</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcd&quot;</span><span class="Operator">.</span><span class="Identifier">find</span><span class="Punctuation">(</span><span class="RawData">re&quot;de&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;2222&quot;</span><span class="Operator">.</span><span class="Identifier">find</span><span class="Punctuation">(</span><span class="RawData">re&quot;(22)*&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Keyword">and</span><span class="Whitespace">
+  </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">1</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="DecNumber">2</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">3</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="split,string,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#split%2Cstring%2CRegex"><span class="Identifier">split</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">sep</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return not matched substrings
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">split</span><span class="Punctuation">(</span><span class="StringLit">&quot;11a22Ϊ33Ⓐ44弢55&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">re&quot;\d+&quot;</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace">
+  </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;a&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;Ϊ&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;Ⓐ&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;弢&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="splitIncl,string,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#splitIncl%2Cstring%2CRegex"><span class="Identifier">splitIncl</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">sep</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return not matched substrings, including captured groups
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace">
+  </span><span class="Identifier">parts</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">splitIncl</span><span class="Punctuation">(</span><span class="StringLit">&quot;a,b&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">re&quot;(,)&quot;</span><span class="Punctuation">)</span><span class="Whitespace">
+  </span><span class="Identifier">expected</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;a&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;,&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;b&quot;</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">parts</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Identifier">expected</span></pre>
+
+</dd>
+<a id="startsWith,string,Regex,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#startsWith%2Cstring%2CRegex%2Cint"><span class="Identifier">startsWith</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return whether the string starts with the pattern or not
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Operator">.</span><span class="Identifier">startsWith</span><span class="Punctuation">(</span><span class="RawData">re&quot;\w&quot;</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Keyword">not</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Operator">.</span><span class="Identifier">startsWith</span><span class="Punctuation">(</span><span class="RawData">re&quot;\d&quot;</span><span class="Punctuation">)</span></pre>
+
+</dd>
+<a id="endsWith,string,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#endsWith%2Cstring%2CRegex"><span class="Identifier">endsWith</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return whether the string ends with the pattern or not
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Operator">.</span><span class="Identifier">endsWith</span><span class="Punctuation">(</span><span class="RawData">re&quot;\w&quot;</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Keyword">not</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Operator">.</span><span class="Identifier">endsWith</span><span class="Punctuation">(</span><span class="RawData">re&quot;\d&quot;</span><span class="Punctuation">)</span></pre>
+
+</dd>
+<a id="replace,string,Regex,string,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#replace%2Cstring%2CRegex%2Cstring%2Cint"><span class="Identifier">replace</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">by</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">limit</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+<p>Replace matched substrings.</p>
+<p>Matched groups can be accessed with <tt class="docutils literal"><span class="pre">$N</span></tt> notation, where <tt class="docutils literal"><span class="pre">N</span></tt> is the group's index, starting at 1 (1-indexed). <tt class="docutils literal"><span class="pre">$$</span></tt> means literal <tt class="docutils literal"><span class="pre">$</span></tt>.</p>
+<p>If <tt class="docutils literal"><span class="pre">limit</span></tt> is given, at most <tt class="docutils literal"><span class="pre">limit</span></tt> replacements are done. <tt class="docutils literal"><span class="pre">limit</span></tt> of 0 means there is no limit</p>
+
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;aaa&quot;</span><span class="Operator">.</span><span class="Identifier">replace</span><span class="Punctuation">(</span><span class="RawData">re&quot;a&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;b&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="DecNumber">1</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="StringLit">&quot;baa&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Operator">.</span><span class="Identifier">replace</span><span class="Punctuation">(</span><span class="RawData">re&quot;(a(b)c)&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;m($1) m($2)&quot;</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace">
+  </span><span class="StringLit">&quot;m(abc) m(b)&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="StringLit">&quot;Nim is awesome!&quot;</span><span class="Operator">.</span><span class="Identifier">replace</span><span class="Punctuation">(</span><span class="RawData">re&quot;(\w\B)&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;$1_&quot;</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace">
+  </span><span class="StringLit">&quot;N_i_m i_s a_w_e_s_o_m_e!&quot;</span></pre>
+
+</dd>
+<a id="replace,string,Regex,proc(RegexMatch,string),int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#replace%2Cstring%2CRegex%2Cproc%28RegexMatch%2Cstring%29%2Cint"><span class="Identifier">replace</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span>
+             <span class="Identifier">by</span><span class="Other">:</span> <span class="Keyword">proc</span> <span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">limit</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+<p>Replace matched substrings.</p>
+<p>If <tt class="docutils literal"><span class="pre">limit</span></tt> is given, at most <tt class="docutils literal"><span class="pre">limit</span></tt> replacements are done. <tt class="docutils literal"><span class="pre">limit</span></tt> of 0 means there is no limit</p>
+
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">proc</span><span class="Whitespace"> </span><span class="Identifier">removeEvenWords</span><span class="Punctuation">(</span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">s</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">string</span><span class="Punctuation">)</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">string</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace">
+  </span><span class="Identifier">result</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;&quot;</span><span class="Whitespace">
+  </span><span class="Keyword">if</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">1</span><span class="Punctuation">)</span><span class="Operator">.</span><span class="Identifier">len</span><span class="Whitespace"> </span><span class="Keyword">mod</span><span class="Whitespace"> </span><span class="DecNumber">2</span><span class="Whitespace"> </span><span class="Operator">!=</span><span class="Whitespace"> </span><span class="DecNumber">0</span><span class="Punctuation">:</span><span class="Whitespace">
+    </span><span class="Identifier">result</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">s</span><span class="Punctuation">[</span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">)</span><span class="Punctuation">[</span><span class="DecNumber">0</span><span class="Punctuation">]</span><span class="Punctuation">]</span><span class="Whitespace">
+
+</span><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;Es macht Spaß, alle geraden Wörter zu entfernen!&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">replace</span><span class="Punctuation">(</span><span class="RawData">re&quot;((\w)+\s*)&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">removeEvenWords</span><span class="Punctuation">)</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace">
+  </span><span class="StringLit">&quot;macht , geraden entfernen!&quot;</span></pre>
+
+</dd>
+<a id="isInitialized,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#isInitialized%2CRegex"><span class="Identifier">isInitialized</span></a><span class="Other">(</span><span class="Identifier">re</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Check whether the regex has been initialized
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">re</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">Regex</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Keyword">not</span><span class="Whitespace"> </span><span class="Identifier">re</span><span class="Operator">.</span><span class="Identifier">isInitialized</span><span class="Whitespace">
+</span><span class="Identifier">re</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="RawData">re&quot;foo&quot;</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">re</span><span class="Operator">.</span><span class="Identifier">isInitialized</span></pre>
+
+</dd>
+<a id="escapeRe,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#escapeRe%2Cstring"><span class="Identifier">escapeRe</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Escape special regex characters in <tt class="docutils literal"><span class="pre">s</span></tt> so that it can be matched verbatim
+
+</dd>
+
+</dl></div>
+<div class="section" id="15">
+<h1><a class="toc-backref" href="#15">Iterators</a></h1>
+<dl class="item">
+<a id="group.i,RegexMatch,int"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#group.i%2CRegexMatch%2Cint"><span class="Identifier">group</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return slices for a given group. Slices of start &gt; end are empty matches (i.e.: <tt class="docutils literal"><span class="pre">re&quot;(\d?)&quot;</span></tt>) and they are included same as in PCRE.
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(\w)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">captures</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">for</span><span class="Whitespace"> </span><span class="Identifier">bounds</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="DecNumber">0</span><span class="Punctuation">)</span><span class="Punctuation">:</span><span class="Whitespace">
+  </span><span class="Identifier">captures</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">[</span><span class="Identifier">bounds</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">captures</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;a&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;b&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;c&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="group.i,RegexMatch,string"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#group.i%2CRegexMatch%2Cstring"><span class="Identifier">group</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">KeyError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return slices for a given named group
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">:</span><span class="Whitespace"> </span><span class="Identifier">RegexMatch</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Operator">.</span><span class="Identifier">match</span><span class="Punctuation">(</span><span class="RawData">re&quot;(?P&lt;foo&gt;\w)+&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">captures</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">for</span><span class="Whitespace"> </span><span class="Identifier">bounds</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">group</span><span class="Punctuation">(</span><span class="StringLit">&quot;foo&quot;</span><span class="Punctuation">)</span><span class="Punctuation">:</span><span class="Whitespace">
+  </span><span class="Identifier">captures</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">[</span><span class="Identifier">bounds</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">captures</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;a&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;b&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;c&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="findAll.i,string,Regex,int"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#findAll.i%2Cstring%2CRegex%2Cint"><span class="Identifier">findAll</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+search through the string and return each match. Empty matches (start &gt; end) are included
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcabc&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">bounds</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">Slice</span><span class="Punctuation">[</span><span class="Identifier">int</span><span class="Punctuation">]</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">found</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">for</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="Identifier">findAll</span><span class="Punctuation">(</span><span class="Identifier">text</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">re&quot;bc&quot;</span><span class="Punctuation">)</span><span class="Punctuation">:</span><span class="Whitespace">
+  </span><span class="Identifier">bounds</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Whitespace"> </span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">boundaries</span><span class="Whitespace">
+  </span><span class="Identifier">found</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Punctuation">[</span><span class="Identifier">m</span><span class="Operator">.</span><span class="Identifier">boundaries</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">bounds</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">2</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="DecNumber">4</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">5</span><span class="Punctuation">]</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">found</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;bc&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;bc&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="findAllBounds.i,string,Regex,int"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#findAllBounds.i%2Cstring%2CRegex%2Cint"><span class="Identifier">findAllBounds</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">pattern</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+search through the string and return each match. Empty matches (start &gt; end) are included
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">let</span><span class="Whitespace"> </span><span class="Identifier">text</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="StringLit">&quot;abcabc&quot;</span><span class="Whitespace">
+</span><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">bounds</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">Slice</span><span class="Punctuation">[</span><span class="Identifier">int</span><span class="Punctuation">]</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">for</span><span class="Whitespace"> </span><span class="Identifier">bd</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="Identifier">findAllBounds</span><span class="Punctuation">(</span><span class="Identifier">text</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">re&quot;bc&quot;</span><span class="Punctuation">)</span><span class="Punctuation">:</span><span class="Whitespace">
+  </span><span class="Identifier">bounds</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Whitespace"> </span><span class="Identifier">bd</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">bounds</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="DecNumber">1</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">2</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="DecNumber">4</span><span class="Whitespace"> </span><span class="Operator">..</span><span class="Whitespace"> </span><span class="DecNumber">5</span><span class="Punctuation">]</span></pre>
+
+</dd>
+<a id="split.i,string,Regex"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#split.i%2Cstring%2CRegex"><span class="Identifier">split</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">sep</span><span class="Other">:</span> <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return not matched substrings
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Keyword">var</span><span class="Whitespace"> </span><span class="Identifier">found</span><span class="Whitespace"> </span><span class="Operator">=</span><span class="Whitespace"> </span><span class="Identifier">newSeq</span><span class="Punctuation">[</span><span class="Identifier">string</span><span class="Punctuation">]</span><span class="Punctuation">(</span><span class="Punctuation">)</span><span class="Whitespace">
+</span><span class="Keyword">for</span><span class="Whitespace"> </span><span class="Identifier">s</span><span class="Whitespace"> </span><span class="Keyword">in</span><span class="Whitespace"> </span><span class="Identifier">split</span><span class="Punctuation">(</span><span class="StringLit">&quot;11a22Ϊ33Ⓐ44弢55&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">re&quot;\d+&quot;</span><span class="Punctuation">)</span><span class="Punctuation">:</span><span class="Whitespace">
+  </span><span class="Identifier">found</span><span class="Operator">.</span><span class="Identifier">add</span><span class="Whitespace"> </span><span class="Identifier">s</span><span class="Whitespace">
+</span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">found</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;a&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;Ϊ&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;Ⓐ&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;弢&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+
+</dl></div>
+<div class="section" id="17">
+<h1><a class="toc-backref" href="#17">Macros</a></h1>
+<dl class="item">
+<a id="match.m,string,RegexLit,untyped"></a>
+<dt><pre><span class="Keyword">macro</span> <a href="#match.m%2Cstring%2CRegexLit%2Cuntyped"><span class="Identifier">match</span></a><span class="Other">(</span><span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">regex</span><span class="Other">:</span> <a href="regex/nfatype.html#RegexLit"><span class="Identifier">RegexLit</span></a><span class="Other">;</span> <span class="Identifier">body</span><span class="Other">:</span> <span class="Identifier">untyped</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">untyped</span></pre></dt>
+<dd>
+
+<p>return a match if the whole string matches the regular expression. This is similar to the <tt class="docutils literal"><span class="pre">match</span></tt> function, but faster. Notice it requires a raw regex <em>literal</em> string as second parameter; the regex must be known at compile time, and cannot be a var/let/const</p>
+<p>A <tt class="docutils literal"><span class="pre">matches: seq[string]</span></tt> variable is injected into the scope, and it contains the submatches for every capture group. If a group is repeated (ex: <tt class="docutils literal"><span class="pre">(\w)+</span></tt>), it will contain the last capture for that group.</p>
+<p>Note: Only available in Nim +1.1</p>
+
+<p><strong class="examples_text">Example:</strong></p>
+<pre class="listing"><span class="Identifier">match</span><span class="Whitespace"> </span><span class="StringLit">&quot;abc&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="RawData">rex&quot;(a(b)c)&quot;</span><span class="Punctuation">:</span><span class="Whitespace">
+  </span><span class="Identifier">doAssert</span><span class="Whitespace"> </span><span class="Identifier">matches</span><span class="Whitespace"> </span><span class="Operator">==</span><span class="Whitespace"> </span><span class="Operator">@</span><span class="Punctuation">[</span><span class="StringLit">&quot;abc&quot;</span><span class="Punctuation">,</span><span class="Whitespace"> </span><span class="StringLit">&quot;b&quot;</span><span class="Punctuation">]</span></pre>
+
+</dd>
+
+</dl></div>
+<div class="section" id="19">
+<h1><a class="toc-backref" href="#19">Exports</a></h1>
+<dl class="item">
+<a href="regex/nfatype.html#RegexLit"><span class="Identifier">RegexLit</span></a>, <a href="regex/nfatype.html#Regex"><span class="Identifier">Regex</span></a>, <a href="regex/nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a>, <a href="regex/common.html#RegexError"><span class="Identifier">RegexError</span></a>
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:33 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex.idx b/docs/regex.idx
new file mode 100644
index 0000000..13f658c
--- /dev/null
+++ b/docs/regex.idx
@@ -0,0 +1,51 @@
+Syntax	regex.html#syntax	 Syntax	
+Matching one character	regex.html#syntax-matching-one-character	  Matching one character	
+Character classes	regex.html#syntax-character-classes	  Character classes	
+Composites	regex.html#syntax-composites	  Composites	
+Repetitions	regex.html#syntax-repetitions	  Repetitions	
+Empty matches	regex.html#syntax-empty-matches	  Empty matches	
+Grouping and flags	regex.html#syntax-grouping-and-flags	  Grouping and flags	
+Escape sequences	regex.html#syntax-escape-sequences	  Escape sequences	
+Perl character classes (Unicode friendly)	regex.html#syntax-perl-character-classes-unicode-friendly	  Perl character classes (Unicode friendly)	
+ASCII character classes	regex.html#syntax-ascii-character-classes	  ASCII character classes	
+Lookaround Assertions	regex.html#syntax-lookaround-assertions	  Lookaround Assertions	
+Examples	regex.html#examples	 Examples	
+Multiple captures	regex.html#examples-multiple-captures	  Multiple captures	
+Verbose Mode	regex.html#examples-verbose-mode	  Verbose Mode	
+Find All	regex.html#examples-find-all	  Find All	
+Match Macro	regex.html#examples-match-macro	  Match Macro	
+re	regex.html#re,string	regex: re(s: string): Regex	
+re	regex.html#re,staticstring	regex: re(s: static string): static[Regex]	
+toPattern	regex.html#toPattern,string	regex: toPattern(s: string): Regex	
+rex	regex.html#rex,string	regex: rex(s: string): RegexLit	
+group	regex.html#group.i,RegexMatch,int	regex: group(m: RegexMatch; i: int): Slice[int]	
+group	regex.html#group,RegexMatch,int	regex: group(m: RegexMatch; i: int): seq[Slice[int]]	
+group	regex.html#group,RegexMatch,int,string	regex: group(m: RegexMatch; i: int; text: string): seq[string]	
+groupFirstCapture	regex.html#groupFirstCapture,RegexMatch,int,string	regex: groupFirstCapture(m: RegexMatch; i: int; text: string): string	
+groupLastCapture	regex.html#groupLastCapture,RegexMatch,int,string	regex: groupLastCapture(m: RegexMatch; i: int; text: string): string	
+group	regex.html#group.i,RegexMatch,string	regex: group(m: RegexMatch; s: string): Slice[int]	
+group	regex.html#group,RegexMatch,string	regex: group(m: RegexMatch; s: string): seq[Slice[int]]	
+group	regex.html#group,RegexMatch,string,string	regex: group(m: RegexMatch; groupName: string; text: string): seq[string]	
+groupFirstCapture	regex.html#groupFirstCapture,RegexMatch,string,string	regex: groupFirstCapture(m: RegexMatch; groupName: string; text: string): string	
+groupLastCapture	regex.html#groupLastCapture,RegexMatch,string,string	regex: groupLastCapture(m: RegexMatch; groupName: string; text: string): string	
+groupsCount	regex.html#groupsCount,RegexMatch	regex: groupsCount(m: RegexMatch): int	
+groupNames	regex.html#groupNames,RegexMatch	regex: groupNames(m: RegexMatch): seq[string]	
+match	regex.html#match.m,string,RegexLit,untyped	regex: match(text: string; regex: RegexLit; body: untyped): untyped	
+match	regex.html#match,string,Regex,RegexMatch,int	regex: match(s: string; pattern: Regex; m: var RegexMatch; start = 0): bool	
+match	regex.html#match,string,Regex	regex: match(s: string; pattern: Regex): bool	
+findAll	regex.html#findAll.i,string,Regex,int	regex: findAll(s: string; pattern: Regex; start = 0): RegexMatch	
+findAll	regex.html#findAll,string,Regex,int	regex: findAll(s: string; pattern: Regex; start = 0): seq[RegexMatch]	
+findAllBounds	regex.html#findAllBounds.i,string,Regex,int	regex: findAllBounds(s: string; pattern: Regex; start = 0): Slice[int]	
+findAllBounds	regex.html#findAllBounds,string,Regex,int	regex: findAllBounds(s: string; pattern: Regex; start = 0): seq[Slice[int]]	
+findAndCaptureAll	regex.html#findAndCaptureAll,string,Regex	regex: findAndCaptureAll(s: string; pattern: Regex): seq[string]	
+contains	regex.html#contains,string,Regex	regex: contains(s: string; pattern: Regex): bool	
+find	regex.html#find,string,Regex,RegexMatch,int	regex: find(s: string; pattern: Regex; m: var RegexMatch; start = 0): bool	
+split	regex.html#split.i,string,Regex	regex: split(s: string; sep: Regex): string	
+split	regex.html#split,string,Regex	regex: split(s: string; sep: Regex): seq[string]	
+splitIncl	regex.html#splitIncl,string,Regex	regex: splitIncl(s: string; sep: Regex): seq[string]	
+startsWith	regex.html#startsWith,string,Regex,int	regex: startsWith(s: string; pattern: Regex; start = 0): bool	
+endsWith	regex.html#endsWith,string,Regex	regex: endsWith(s: string; pattern: Regex): bool	
+replace	regex.html#replace,string,Regex,string,int	regex: replace(s: string; pattern: Regex; by: string; limit = 0): string	
+replace	regex.html#replace,string,Regex,proc(RegexMatch,string),int	regex: replace(s: string; pattern: Regex; by: proc (m: RegexMatch; s: string): string;\n        limit = 0): string	
+isInitialized	regex.html#isInitialized,Regex	regex: isInitialized(re: Regex): bool	
+escapeRe	regex.html#escapeRe,string	regex: escapeRe(s: string): string	
diff --git a/docs/regex/common.html b/docs/regex/common.html
new file mode 100644
index 0000000..21c9711
--- /dev/null
+++ b/docs/regex/common.html
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/common</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/common</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#RegexError"
+    title="RegexError = object of ValueError">RegexError</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#10" id="60">Consts</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#invalidRune"
+    title="invalidRune = -1&apos;i32">invalidRune</a></li>
+  <li><a class="reference" href="#lineBreakRune"
+    title="lineBreakRune = 10&apos;i32">lineBreakRune</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section"><=
+      <li><a class="reference" href="#%3C%3D%2CRune%2CRune"
+    title="`&lt;=`(x, y: Rune): bool"><=,<wbr>Rune,<wbr>Rune</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">toRune
+      <li><a class="reference" href="#toRune%2Cstring"
+    title="toRune(s: string): Rune">toRune,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">cmp
+      <li><a class="reference" href="#cmp%2CRune%2CRune"
+    title="cmp(x, y: Rune): int">cmp,<wbr>Rune,<wbr>Rune</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">bwRuneAt
+      <li><a class="reference" href="#bwRuneAt%2Cstring%2Cint"
+    title="bwRuneAt(s: string; n: int): Rune">bwRuneAt,<wbr>string,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">%%
+      <li><a class="reference" href="#%25%25%2Cstring%2CopenArray%5Bstring%5D"
+    title="`%%`(formatstr: string; a: openArray[string]): string">%%,<wbr>string,<wbr>openArray[string]</a></li>
+  <li><a class="reference" href="#%25%25%2Cstring%2Cstring"
+    title="`%%`(formatstr: string; a: string): string">%%,<wbr>string,<wbr>string</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#18" id="68">Templates</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#bwFastRuneAt.t%2Cstring%2Cint%2CRune"
+    title="bwFastRuneAt(s: string; n: var int; result: var Rune): untyped">bwFastRuneAt</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="RegexError"></a>
+<dt><pre><a href="common.html#RegexError"><span class="Identifier">RegexError</span></a> <span class="Other">=</span> <span class="Keyword">object</span> <span class="Keyword">of</span> <span class="Identifier">ValueError</span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="10">
+<h1><a class="toc-backref" href="#10">Consts</a></h1>
+<dl class="item">
+<a id="invalidRune"></a>
+<dt><pre><a href="common.html#invalidRune"><span class="Identifier">invalidRune</span></a> <span class="Other">=</span> <span class="DecNumber">-1'i32</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="lineBreakRune"></a>
+<dt><pre><a href="common.html#lineBreakRune"><span class="Identifier">lineBreakRune</span></a> <span class="Other">=</span> <span class="DecNumber">10'i32</span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="toRune,string"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#toRune%2Cstring"><span class="Identifier">toRune</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Rune</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="<=,Rune,Rune"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#%3C%3D%2CRune%2CRune"><span class="Identifier">`&lt;=`</span></a><span class="Other">(</span><span class="Identifier">x</span><span class="Other">,</span> <span class="Identifier">y</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="cmp,Rune,Rune"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#cmp%2CRune%2CRune"><span class="Identifier">cmp</span></a><span class="Other">(</span><span class="Identifier">x</span><span class="Other">,</span> <span class="Identifier">y</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="bwRuneAt,string,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#bwRuneAt%2Cstring%2Cint"><span class="Identifier">bwRuneAt</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">n</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Rune</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Take rune ending at <tt class="docutils literal"><span class="pre">n</span></tt>
+
+</dd>
+<a id="%%,string,openArray[string]"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#%25%25%2Cstring%2CopenArray%5Bstring%5D"><span class="Identifier">`%%`</span></a><span class="Other">(</span><span class="Identifier">formatstr</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">a</span><span class="Other">:</span> <span class="Identifier">openArray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">noSideEffect</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+same as <tt class="docutils literal"><span class="pre">&quot;$#&quot; % [&quot;foo&quot;]</span></tt> but returns empty string on error
+
+</dd>
+<a id="%%,string,string"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#%25%25%2Cstring%2Cstring"><span class="Identifier">`%%`</span></a><span class="Other">(</span><span class="Identifier">formatstr</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">a</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="18">
+<h1><a class="toc-backref" href="#18">Templates</a></h1>
+<dl class="item">
+<a id="bwFastRuneAt.t,string,int,Rune"></a>
+<dt><pre><span class="Keyword">template</span> <a href="#bwFastRuneAt.t%2Cstring%2Cint%2CRune"><span class="Identifier">bwFastRuneAt</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">n</span><span class="Other">:</span> <span class="Keyword">var</span> <span class="Identifier">int</span><span class="Other">;</span> <span class="Identifier">result</span><span class="Other">:</span> <span class="Keyword">var</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">untyped</span></pre></dt>
+<dd>
+
+Take rune ending at <tt class="docutils literal"><span class="pre">n</span></tt>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:28 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/common.idx b/docs/regex/common.idx
new file mode 100644
index 0000000..576d474
--- /dev/null
+++ b/docs/regex/common.idx
@@ -0,0 +1,10 @@
+RegexError	regex/common.html#RegexError	common: RegexError	
+invalidRune	regex/common.html#invalidRune	common: invalidRune	
+lineBreakRune	regex/common.html#lineBreakRune	common: lineBreakRune	
+toRune	regex/common.html#toRune,string	common: toRune(s: string): Rune	
+`&lt;=`	regex/common.html#<=,Rune,Rune	common: `&lt;=`(x, y: Rune): bool	
+cmp	regex/common.html#cmp,Rune,Rune	common: cmp(x, y: Rune): int	
+bwRuneAt	regex/common.html#bwRuneAt,string,int	common: bwRuneAt(s: string; n: int): Rune	
+bwFastRuneAt	regex/common.html#bwFastRuneAt.t,string,int,Rune	common: bwFastRuneAt(s: string; n: var int; result: var Rune): untyped	
+`%%`	regex/common.html#%%,string,openArray[string]	common: `%%`(formatstr: string; a: openArray[string]): string	
+`%%`	regex/common.html#%%,string,string	common: `%%`(formatstr: string; a: string): string	
diff --git a/docs/regex/compiler.html b/docs/regex/compiler.html
new file mode 100644
index 0000000..8c7310f
--- /dev/null
+++ b/docs/regex/compiler.html
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/compiler</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/compiler</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">reCt
+      <li><a class="reference" href="#reCt%2Cstring"
+    title="reCt(s: string): Regex">reCt,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">reImpl
+      <li><a class="reference" href="#reImpl%2Cstring"
+    title="reImpl(s: string): Regex">reImpl,<wbr>string</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="parser.html">parser</a>, <a class="reference external" href="exptransformation.html">exptransformation</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="nfatype.html">nfatype</a>, <a class="reference external" href="nfa.html">nfa</a>, <a class="reference external" href="litopt.html">litopt</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="reImpl,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#reImpl%2Cstring"><span class="Identifier">reImpl</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="reCt,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#reCt%2Cstring"><span class="Identifier">reCt</span></a><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">compileTime</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/compiler.idx b/docs/regex/compiler.idx
new file mode 100644
index 0000000..9c79cb6
--- /dev/null
+++ b/docs/regex/compiler.idx
@@ -0,0 +1,2 @@
+reImpl	regex/compiler.html#reImpl,string	compiler: reImpl(s: string): Regex	
+reCt	regex/compiler.html#reCt,string	compiler: reCt(s: string): Regex	
diff --git a/docs/regex/dotgraph.html b/docs/regex/dotgraph.html
new file mode 100644
index 0000000..4929425
--- /dev/null
+++ b/docs/regex/dotgraph.html
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/dotgraph</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/dotgraph</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">graphToFile
+      <li><a class="reference" href="#graphToFile%2CRegex%2Cstring"
+    title="graphToFile(regex: Regex; dir: string)">graphToFile,<wbr>Regex,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">graph
+      <li><a class="reference" href="#graph%2CNfa"
+    title="graph(nfa: Nfa): string">graph,<wbr>Nfa</a></li>
+  <li><a class="reference" href="#graph%2CRegex"
+    title="graph(regex: Regex): string">graph,<wbr>Regex</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="nfatype.html">nfatype</a>, <a class="reference external" href="types.html">types</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="graph,Nfa"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#graph%2CNfa"><span class="Identifier">graph</span></a><span class="Other">(</span><span class="Identifier">nfa</span><span class="Other">:</span> <a href="types.html#Nfa"><span class="Identifier">Nfa</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="graph,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#graph%2CRegex"><span class="Identifier">graph</span></a><span class="Other">(</span><span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="graphToFile,Regex,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#graphToFile%2CRegex%2Cstring"><span class="Identifier">graphToFile</span></a><span class="Other">(</span><span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">dir</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">WriteIOEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/dotgraph.idx b/docs/regex/dotgraph.idx
new file mode 100644
index 0000000..72f49b1
--- /dev/null
+++ b/docs/regex/dotgraph.idx
@@ -0,0 +1,3 @@
+graph	regex/dotgraph.html#graph,Nfa	dotgraph: graph(nfa: Nfa): string	
+graph	regex/dotgraph.html#graph,Regex	dotgraph: graph(regex: Regex): string	
+graphToFile	regex/dotgraph.html#graphToFile,Regex,string	dotgraph: graphToFile(regex: Regex; dir: string)	
diff --git a/docs/regex/exptransformation.html b/docs/regex/exptransformation.html
new file mode 100644
index 0000000..beb0a1b
--- /dev/null
+++ b/docs/regex/exptransformation.html
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/exptransformation</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/exptransformation</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#GroupsCapture"
+    title="GroupsCapture = object
+  count*: int16
+  names*: OrderedTable[string, int16]">GroupsCapture</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">toAtoms
+      <li><a class="reference" href="#toAtoms%2CExp%2CGroupsCapture"
+    title="toAtoms(exp: Exp; groups: var GroupsCapture): AtomsExp">toAtoms,<wbr>Exp,<wbr>GroupsCapture</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">transformExp
+      <li><a class="reference" href="#transformExp%2CExp%2CGroupsCapture"
+    title="transformExp(exp: Exp; groups: var GroupsCapture): RpnExp">transformExp,<wbr>Exp,<wbr>GroupsCapture</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="exptype.html">exptype</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="common.html">common</a>, <a class="reference external" href="scanner.html">scanner</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="GroupsCapture"></a>
+<dt><pre><a href="exptransformation.html#GroupsCapture"><span class="Identifier">GroupsCapture</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">count</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int16</span>
+  <span class="Identifier">names</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">OrderedTable</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">,</span> <span class="Identifier">int16</span><span class="Other">]</span>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="toAtoms,Exp,GroupsCapture"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#toAtoms%2CExp%2CGroupsCapture"><span class="Identifier">toAtoms</span></a><span class="Other">(</span><span class="Identifier">exp</span><span class="Other">:</span> <a href="exptype.html#Exp"><span class="Identifier">Exp</span></a><span class="Other">;</span> <span class="Identifier">groups</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="exptransformation.html#GroupsCapture"><span class="Identifier">GroupsCapture</span></a><span class="Other">)</span><span class="Other">:</span> <a href="exptype.html#AtomsExp"><span class="Identifier">AtomsExp</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="transformExp,Exp,GroupsCapture"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#transformExp%2CExp%2CGroupsCapture"><span class="Identifier">transformExp</span></a><span class="Other">(</span><span class="Identifier">exp</span><span class="Other">:</span> <a href="exptype.html#Exp"><span class="Identifier">Exp</span></a><span class="Other">;</span> <span class="Identifier">groups</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="exptransformation.html#GroupsCapture"><span class="Identifier">GroupsCapture</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#RpnExp"><span class="Identifier">RpnExp</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span>
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/exptransformation.idx b/docs/regex/exptransformation.idx
new file mode 100644
index 0000000..2348f8a
--- /dev/null
+++ b/docs/regex/exptransformation.idx
@@ -0,0 +1,3 @@
+GroupsCapture	regex/exptransformation.html#GroupsCapture	exptransformation: GroupsCapture	
+toAtoms	regex/exptransformation.html#toAtoms,Exp,GroupsCapture	exptransformation: toAtoms(exp: Exp; groups: var GroupsCapture): AtomsExp	
+transformExp	regex/exptransformation.html#transformExp,Exp,GroupsCapture	exptransformation: transformExp(exp: Exp; groups: var GroupsCapture): RpnExp	
diff --git a/docs/regex/exptype.html b/docs/regex/exptype.html
new file mode 100644
index 0000000..faa8ea4
--- /dev/null
+++ b/docs/regex/exptype.html
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/exptype</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/exptype</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#Exp"
+    title="Exp = object
+  s*: seq[Node]">Exp</a></li>
+  <li><a class="reference" href="#AtomsExp"
+    title="AtomsExp = object
+  s*: seq[Node]">AtomsExp</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="Exp"></a>
+<dt><pre><a href="exptype.html#Exp"><span class="Identifier">Exp</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">s</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="types.html#Node"><span class="Identifier">Node</span></a><span class="Other">]</span>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="AtomsExp"></a>
+<dt><pre><a href="exptype.html#AtomsExp"><span class="Identifier">AtomsExp</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">s</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="types.html#Node"><span class="Identifier">Node</span></a><span class="Other">]</span>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:28 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/exptype.idx b/docs/regex/exptype.idx
new file mode 100644
index 0000000..da31e1d
--- /dev/null
+++ b/docs/regex/exptype.idx
@@ -0,0 +1,2 @@
+Exp	regex/exptype.html#Exp	exptype: Exp	
+AtomsExp	regex/exptype.html#AtomsExp	exptype: AtomsExp	
diff --git a/docs/regex/litopt.html b/docs/regex/litopt.html
new file mode 100644
index 0000000..2fad1c0
--- /dev/null
+++ b/docs/regex/litopt.html
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/litopt</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/litopt</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#LitOpt"
+    title="LitOpt = object
+  lit*: Rune
+  nfa*: Nfa">LitOpt</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">litopt2
+      <li><a class="reference" href="#litopt2%2CRpnExp"
+    title="litopt2(exp: RpnExp): LitOpt">litopt2,<wbr>RpnExp</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">canOpt
+      <li><a class="reference" href="#canOpt%2CLitOpt"
+    title="canOpt(litOpt: LitOpt): bool">canOpt,<wbr>LitOpt</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc">Literals optimization. This is about optimizing the find operation by quickly searching Regular Expression literals within the input string. See issue #59.</p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>, <a class="reference external" href="nodematch.html">nodematch</a>, <a class="reference external" href="nfa.html">nfa</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="LitOpt"></a>
+<dt><pre><a href="litopt.html#LitOpt"><span class="Identifier">LitOpt</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">lit</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">Rune</span>
+  <span class="Identifier">nfa</span><span class="Operator">*</span><span class="Other">:</span> <a href="types.html#Nfa"><span class="Identifier">Nfa</span></a>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="canOpt,LitOpt"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#canOpt%2CLitOpt"><span class="Identifier">canOpt</span></a><span class="Other">(</span><span class="Identifier">litOpt</span><span class="Other">:</span> <a href="litopt.html#LitOpt"><span class="Identifier">LitOpt</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="litopt2,RpnExp"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#litopt2%2CRpnExp"><span class="Identifier">litopt2</span></a><span class="Other">(</span><span class="Identifier">exp</span><span class="Other">:</span> <a href="types.html#RpnExp"><span class="Identifier">RpnExp</span></a><span class="Other">)</span><span class="Other">:</span> <a href="litopt.html#LitOpt"><span class="Identifier">LitOpt</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/litopt.idx b/docs/regex/litopt.idx
new file mode 100644
index 0000000..17ad921
--- /dev/null
+++ b/docs/regex/litopt.idx
@@ -0,0 +1,3 @@
+LitOpt	regex/litopt.html#LitOpt	litopt: LitOpt	
+canOpt	regex/litopt.html#canOpt,LitOpt	litopt: canOpt(litOpt: LitOpt): bool	
+litopt2	regex/litopt.html#litopt2,RpnExp	litopt: litopt2(exp: RpnExp): LitOpt	
diff --git a/docs/regex/nfa.html b/docs/regex/nfa.html
new file mode 100644
index 0000000..5d48767
--- /dev/null
+++ b/docs/regex/nfa.html
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nfa</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nfa</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">subExps
+      <li><a class="reference" href="#subExps%2CRpnExp"
+    title="subExps(exp: RpnExp): RpnExp">subExps,<wbr>RpnExp</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">eNfa
+      <li><a class="reference" href="#eNfa%2CRpnExp"
+    title="eNfa(exp: RpnExp): Enfa">eNfa,<wbr>RpnExp</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">eRemoval
+      <li><a class="reference" href="#eRemoval%2CEnfa"
+    title="eRemoval(eNfa: Enfa): Nfa">eRemoval,<wbr>Enfa</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">nfa2
+      <li><a class="reference" href="#nfa2%2CRpnExp"
+    title="nfa2(exp: RpnExp): Nfa">nfa2,<wbr>RpnExp</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>, <a class="reference external" href="common.html">common</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="eNfa,RpnExp"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#eNfa%2CRpnExp"><span class="Identifier">eNfa</span></a><span class="Other">(</span><span class="Identifier">exp</span><span class="Other">:</span> <a href="types.html#RpnExp"><span class="Identifier">RpnExp</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#Enfa"><span class="Identifier">Enfa</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><a href="common.html#RegexError"><span class="Identifier">RegexError</span></a><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Thompson's construction
+
+</dd>
+<a id="eRemoval,Enfa"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#eRemoval%2CEnfa"><span class="Identifier">eRemoval</span></a><span class="Other">(</span><span class="Identifier">eNfa</span><span class="Other">:</span> <a href="types.html#Enfa"><span class="Identifier">Enfa</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#Nfa"><span class="Identifier">Nfa</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Remove e-transitions and return remaining state transtions and submatches, and zero matches. Transitions are added in matching order (BFS), which may help matching performance
+
+</dd>
+<a id="subExps,RpnExp"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#subExps%2CRpnExp"><span class="Identifier">subExps</span></a><span class="Other">(</span><span class="Identifier">exp</span><span class="Other">:</span> <a href="types.html#RpnExp"><span class="Identifier">RpnExp</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#RpnExp"><span class="Identifier">RpnExp</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="nfa2,RpnExp"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#nfa2%2CRpnExp"><span class="Identifier">nfa2</span></a><span class="Other">(</span><span class="Identifier">exp</span><span class="Other">:</span> <a href="types.html#RpnExp"><span class="Identifier">RpnExp</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#Nfa"><span class="Identifier">Nfa</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><a href="common.html#RegexError"><span class="Identifier">RegexError</span></a><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nfa.idx b/docs/regex/nfa.idx
new file mode 100644
index 0000000..e9f2c56
--- /dev/null
+++ b/docs/regex/nfa.idx
@@ -0,0 +1,4 @@
+eNfa	regex/nfa.html#eNfa,RpnExp	nfa: eNfa(exp: RpnExp): Enfa	
+eRemoval	regex/nfa.html#eRemoval,Enfa	nfa: eRemoval(eNfa: Enfa): Nfa	
+subExps	regex/nfa.html#subExps,RpnExp	nfa: subExps(exp: RpnExp): RpnExp	
+nfa2	regex/nfa.html#nfa2,RpnExp	nfa: nfa2(exp: RpnExp): Nfa	
diff --git a/docs/regex/nfafindall.html b/docs/regex/nfafindall.html
new file mode 100644
index 0000000..d8b15bd
--- /dev/null
+++ b/docs/regex/nfafindall.html
@@ -0,0 +1,254 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nfafindall</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nfafindall</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#RegexMatches"
+    title="RegexMatches = object
+  a, b: Submatches
+  m: Matches
+  c: Capts
+  look: Lookaround">RegexMatches</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">dummyMatch
+      <li><a class="reference" href="#dummyMatch%2CRegexMatches%2Cint"
+    title="dummyMatch(ms: var RegexMatches; i: int)">dummyMatch,<wbr>RegexMatches,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">findSomeImpl
+      <li><a class="reference" href="#findSomeImpl%2Cstring%2CRegex%2CRegexMatches%2CNatural%2Cset%5BMatchFlag%5D"
+    title="findSomeImpl(text: string; regex: Regex; ms: var RegexMatches;
+             start: Natural = 0; flags: set[MatchFlag] = {}): int">findSomeImpl,<wbr>string,<wbr>Regex,<wbr>RegexMatches,<wbr>Natural,<wbr>set[MatchFlag]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">fillMatchImpl
+      <li><a class="reference" href="#fillMatchImpl%2CRegexMatch%2CMatchItemIdx%2CRegexMatches%2CRegex"
+    title="fillMatchImpl(m: var RegexMatch; mi: MatchItemIdx; ms: RegexMatches;
+              regex: Regex)">fillMatchImpl,<wbr>RegexMatch,<wbr>MatchItemIdx,<wbr>RegexMatches,<wbr>Regex</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">findSomeOptImpl
+      <li><a class="reference" href="#findSomeOptImpl%2Cstring%2CRegex%2CRegexMatches%2CNatural"
+    title="findSomeOptImpl(text: string; regex: Regex; ms: var RegexMatches; start: Natural): int">findSomeOptImpl,<wbr>string,<wbr>Regex,<wbr>RegexMatches,<wbr>Natural</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#15" id="65">Iterators</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#bounds.i%2CRegexMatches"
+    title="bounds(ms: RegexMatches): Slice[int]">bounds</a></li>
+  <li><a class="reference" href="#items.i%2CRegexMatches"
+    title="items(ms: RegexMatches): MatchItemIdx">items</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc">Linear time NFA findAll</p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="common.html">common</a>, <a class="reference external" href="nodematch.html">nodematch</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="nfatype.html">nfatype</a>, <a class="reference external" href="nfamatch.html">nfamatch</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="RegexMatches"></a>
+<dt><pre><a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">a</span><span class="Other">,</span> <span class="Identifier">b</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a>
+  <span class="Identifier">m</span><span class="Other">:</span> <span class="Identifier">Matches</span>
+  <span class="Identifier">c</span><span class="Other">:</span> <a href="nfatype.html#Capts"><span class="Identifier">Capts</span></a>
+  <span class="Identifier">look</span><span class="Other">:</span> <a href="nfamatch.html#Lookaround"><span class="Identifier">Lookaround</span></a>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="fillMatchImpl,RegexMatch,MatchItemIdx,RegexMatches,Regex"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#fillMatchImpl%2CRegexMatch%2CMatchItemIdx%2CRegexMatches%2CRegex"><span class="Identifier">fillMatchImpl</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">mi</span><span class="Other">:</span> <span class="Identifier">MatchItemIdx</span><span class="Other">;</span> <span class="Identifier">ms</span><span class="Other">:</span> <a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a><span class="Other">;</span>
+                   <span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="dummyMatch,RegexMatches,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#dummyMatch%2CRegexMatches%2Cint"><span class="Identifier">dummyMatch</span></a><span class="Other">(</span><span class="Identifier">ms</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+hack to support <tt class="docutils literal"><span class="pre">split</span></tt> last value. we need to add the end boundary if it has not matched the end (no match implies this too)
+
+</dd>
+<a id="findSomeImpl,string,Regex,RegexMatches,Natural,set[MatchFlag]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#findSomeImpl%2Cstring%2CRegex%2CRegexMatches%2CNatural%2Cset%5BMatchFlag%5D"><span class="Identifier">findSomeImpl</span></a><span class="Other">(</span><span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">ms</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a><span class="Other">;</span>
+                  <span class="Identifier">start</span><span class="Other">:</span> <span class="Identifier">Natural</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">;</span> <span class="Identifier">flags</span><span class="Other">:</span> <span class="Identifier">set</span><span class="Other">[</span><a href="nfatype.html#MatchFlag"><span class="Identifier">MatchFlag</span></a><span class="Other">]</span> <span class="Other">=</span> <span class="Other">{</span><span class="Other">}</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="findSomeOptImpl,string,Regex,RegexMatches,Natural"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#findSomeOptImpl%2Cstring%2CRegex%2CRegexMatches%2CNatural"><span class="Identifier">findSomeOptImpl</span></a><span class="Other">(</span><span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">ms</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a><span class="Other">;</span>
+                     <span class="Identifier">start</span><span class="Other">:</span> <span class="Identifier">Natural</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="15">
+<h1><a class="toc-backref" href="#15">Iterators</a></h1>
+<dl class="item">
+<a id="bounds.i,RegexMatches"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#bounds.i%2CRegexMatches"><span class="Identifier">bounds</span></a><span class="Other">(</span><span class="Identifier">ms</span><span class="Other">:</span> <a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="items.i,RegexMatches"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#items.i%2CRegexMatches"><span class="Identifier">items</span></a><span class="Other">(</span><span class="Identifier">ms</span><span class="Other">:</span> <a href="nfafindall.html#RegexMatches"><span class="Identifier">RegexMatches</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">MatchItemIdx</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nfafindall.idx b/docs/regex/nfafindall.idx
new file mode 100644
index 0000000..3400374
--- /dev/null
+++ b/docs/regex/nfafindall.idx
@@ -0,0 +1,7 @@
+RegexMatches	regex/nfafindall.html#RegexMatches	nfafindall: RegexMatches	
+bounds	regex/nfafindall.html#bounds.i,RegexMatches	nfafindall: bounds(ms: RegexMatches): Slice[int]	
+items	regex/nfafindall.html#items.i,RegexMatches	nfafindall: items(ms: RegexMatches): MatchItemIdx	
+fillMatchImpl	regex/nfafindall.html#fillMatchImpl,RegexMatch,MatchItemIdx,RegexMatches,Regex	nfafindall: fillMatchImpl(m: var RegexMatch; mi: MatchItemIdx; ms: RegexMatches;\n              regex: Regex)	
+dummyMatch	regex/nfafindall.html#dummyMatch,RegexMatches,int	nfafindall: dummyMatch(ms: var RegexMatches; i: int)	
+findSomeImpl	regex/nfafindall.html#findSomeImpl,string,Regex,RegexMatches,Natural,set[MatchFlag]	nfafindall: findSomeImpl(text: string; regex: Regex; ms: var RegexMatches;\n             start: Natural = 0; flags: set[MatchFlag] = {}): int	
+findSomeOptImpl	regex/nfafindall.html#findSomeOptImpl,string,Regex,RegexMatches,Natural	nfafindall: findSomeOptImpl(text: string; regex: Regex; ms: var RegexMatches; start: Natural): int	
diff --git a/docs/regex/nfamacro.html b/docs/regex/nfamacro.html
new file mode 100644
index 0000000..58ea4a1
--- /dev/null
+++ b/docs/regex/nfamacro.html
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nfamacro</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nfamacro</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">matchImpl
+      <li><a class="reference" href="#matchImpl%2CNimNode%2CNimNode%2CNimNode"
+    title="matchImpl(text, expLit, body: NimNode): NimNode">matchImpl,<wbr>NimNode,<wbr>NimNode,<wbr>NimNode</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc">NFA matcher for static regexes</p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="common.html">common</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="nfatype.html">nfatype</a>, <a class="reference external" href="compiler.html">compiler</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="matchImpl,NimNode,NimNode,NimNode"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#matchImpl%2CNimNode%2CNimNode%2CNimNode"><span class="Identifier">matchImpl</span></a><span class="Other">(</span><span class="Identifier">text</span><span class="Other">,</span> <span class="Identifier">expLit</span><span class="Other">,</span> <span class="Identifier">body</span><span class="Other">:</span> <span class="Identifier">NimNode</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">NimNode</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">Exception</span><span class="Other">,</span> <span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nfamacro.idx b/docs/regex/nfamacro.idx
new file mode 100644
index 0000000..228212e
--- /dev/null
+++ b/docs/regex/nfamacro.idx
@@ -0,0 +1 @@
+matchImpl	regex/nfamacro.html#matchImpl,NimNode,NimNode,NimNode	nfamacro: matchImpl(text, expLit, body: NimNode): NimNode	
diff --git a/docs/regex/nfamatch.html b/docs/regex/nfamatch.html
new file mode 100644
index 0000000..6985df7
--- /dev/null
+++ b/docs/regex/nfamatch.html
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nfamatch</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nfamatch</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#Lookaround"
+    title="Lookaround = object
+  ahead*: AheadSig
+  behind*: BehindSig
+  smL*: SmLookaround">Lookaround</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">startsWithImpl
+      <li><a class="reference" href="#startsWithImpl%2Cstring%2CRegex%2Cint"
+    title="startsWithImpl(text: string; regex: Regex; start: int): bool">startsWithImpl,<wbr>string,<wbr>Regex,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">matchImpl
+      <li><a class="reference" href="#matchImpl%2Cstring%2CRegex%2CRegexMatch%2Cint"
+    title="matchImpl(text: string; regex: Regex; m: var RegexMatch; start = 0): bool">matchImpl,<wbr>string,<wbr>Regex,<wbr>RegexMatch,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">reversedMatchImpl
+      <li><a class="reference" href="#reversedMatchImpl%2CSubmatches%2CSubmatches%2Cstring%2CNfa%2CLookaround%2Cint%2Cint"
+    title="reversedMatchImpl(smA, smB: var Submatches; text: string; nfa: Nfa;
+                  look: var Lookaround; start, limit: int): int">reversedMatchImpl,<wbr>Submatches,<wbr>Submatches,<wbr>string,<wbr>Nfa,<wbr>Lookaround,<wbr>int,<wbr>int</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#18" id="68">Templates</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#lookAroundTpl.t"
+    title="lookAroundTpl(): untyped">lookAroundTpl</a></li>
+  <li><a class="reference" href="#initLook.t"
+    title="initLook(): Lookaround">initLook</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc">NFA matcher for non-static regexes</p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="common.html">common</a>, <a class="reference external" href="nodematch.html">nodematch</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="nfatype.html">nfatype</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="Lookaround"></a>
+<dt><pre><a href="nfamatch.html#Lookaround"><span class="Identifier">Lookaround</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">ahead</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">AheadSig</span>
+  <span class="Identifier">behind</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">BehindSig</span>
+  <span class="Identifier">smL</span><span class="Operator">*</span><span class="Other">:</span> <a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="reversedMatchImpl,Submatches,Submatches,string,Nfa,Lookaround,int,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#reversedMatchImpl%2CSubmatches%2CSubmatches%2Cstring%2CNfa%2CLookaround%2Cint%2Cint"><span class="Identifier">reversedMatchImpl</span></a><span class="Other">(</span><span class="Identifier">smA</span><span class="Other">,</span> <span class="Identifier">smB</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">;</span> <span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">nfa</span><span class="Other">:</span> <a href="types.html#Nfa"><span class="Identifier">Nfa</span></a><span class="Other">;</span>
+                       <span class="Identifier">look</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfamatch.html#Lookaround"><span class="Identifier">Lookaround</span></a><span class="Other">;</span> <span class="Identifier">start</span><span class="Other">,</span> <span class="Identifier">limit</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="matchImpl,string,Regex,RegexMatch,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#matchImpl%2Cstring%2CRegex%2CRegexMatch%2Cint"><span class="Identifier">matchImpl</span></a><span class="Other">(</span><span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">m</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">;</span> <span class="Identifier">start</span> <span class="Other">=</span> <span class="DecNumber">0</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="startsWithImpl,string,Regex,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#startsWithImpl%2Cstring%2CRegex%2Cint"><span class="Identifier">startsWithImpl</span></a><span class="Other">(</span><span class="Identifier">text</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">;</span> <span class="Identifier">regex</span><span class="Other">:</span> <a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a><span class="Other">;</span> <span class="Identifier">start</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="18">
+<h1><a class="toc-backref" href="#18">Templates</a></h1>
+<dl class="item">
+<a id="lookAroundTpl.t"></a>
+<dt><pre><span class="Keyword">template</span> <a href="#lookAroundTpl.t"><span class="Identifier">lookAroundTpl</span></a><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">untyped</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">dirty</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="initLook.t"></a>
+<dt><pre><span class="Keyword">template</span> <a href="#initLook.t"><span class="Identifier">initLook</span></a><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <a href="nfamatch.html#Lookaround"><span class="Identifier">Lookaround</span></a></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nfamatch.idx b/docs/regex/nfamatch.idx
new file mode 100644
index 0000000..0b87631
--- /dev/null
+++ b/docs/regex/nfamatch.idx
@@ -0,0 +1,6 @@
+Lookaround	regex/nfamatch.html#Lookaround	nfamatch: Lookaround	
+lookAroundTpl	regex/nfamatch.html#lookAroundTpl.t	nfamatch: lookAroundTpl(): untyped	
+reversedMatchImpl	regex/nfamatch.html#reversedMatchImpl,Submatches,Submatches,string,Nfa,Lookaround,int,int	nfamatch: reversedMatchImpl(smA, smB: var Submatches; text: string; nfa: Nfa;\n                  look: var Lookaround; start, limit: int): int	
+initLook	regex/nfamatch.html#initLook.t	nfamatch: initLook(): Lookaround	
+matchImpl	regex/nfamatch.html#matchImpl,string,Regex,RegexMatch,int	nfamatch: matchImpl(text: string; regex: Regex; m: var RegexMatch; start = 0): bool	
+startsWithImpl	regex/nfamatch.html#startsWithImpl,string,Regex,int	nfamatch: startsWithImpl(text: string; regex: Regex; start: int): bool	
diff --git a/docs/regex/nfatype.html b/docs/regex/nfatype.html
new file mode 100644
index 0000000..832ea7b
--- /dev/null
+++ b/docs/regex/nfatype.html
@@ -0,0 +1,552 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nfatype</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nfatype</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#CaptIdx"
+    title="CaptIdx = int32">CaptIdx</a></li>
+  <li><a class="reference" href="#CaptNode"
+    title="CaptNode = object
+  parent*: CaptIdx
+  bound*: int
+  idx*: int16">CaptNode</a></li>
+  <li><a class="reference" href="#Capts"
+    title="Capts = seq[CaptNode]">Capts</a></li>
+  <li><a class="reference" href="#Captures"
+    title="Captures = seq[seq[Slice[int]]]">Captures</a></li>
+  <li><a class="reference" href="#RegexLit"
+    title="RegexLit = distinct string">RegexLit</a></li>
+  <li><a class="reference" href="#Regex"
+    title="Regex = object
+  nfa*: Nfa
+  groupsCount*: int16
+  namedGroups*: OrderedTable[string, int16]
+  litOpt*: LitOpt">Regex</a></li>
+  <li><a class="reference" href="#MatchFlag"
+    title="MatchFlag = enum
+  mfShortestMatch, mfNoCaptures, mfFindMatch, mfFindMatchOpt, mfAnchored,
+  mfBwMatch, mfReverseCapts">MatchFlag</a></li>
+  <li><a class="reference" href="#MatchFlags"
+    title="MatchFlags = set[MatchFlag]">MatchFlags</a></li>
+  <li><a class="reference" href="#RegexMatch"
+    title="RegexMatch = object
+  captures*: Captures
+  namedGroups*: OrderedTable[string, int16]
+  boundaries*: Slice[int]">RegexMatch</a></li>
+  <li><a class="reference" href="#NodeIdx"
+    title="NodeIdx = int16">NodeIdx</a></li>
+  <li><a class="reference" href="#Bounds"
+    title="Bounds = Slice[int]">Bounds</a></li>
+  <li><a class="reference" href="#PState"
+    title="PState = tuple[ni: NodeIdx, ci: CaptIdx, bounds: Bounds]">PState</a></li>
+  <li><a class="reference" href="#Submatches"
+    title="Submatches = ref object
+  sx: seq[PState]
+  ss: seq[int16]
+  si: int16">Submatches</a></li>
+  <li><a class="reference" href="#SmLookaroundItem"
+    title="SmLookaroundItem = object
+  a, b: Submatches">SmLookaroundItem</a></li>
+  <li><a class="reference" href="#SmLookaround"
+    title="SmLookaround = object
+  s: seq[SmLookaroundItem]
+  i: int">SmLookaround</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">setLen
+      <li><a class="reference" href="#setLen%2CSubmatches%2Cint"
+    title="setLen(sm: var Submatches; size: int)">setLen,<wbr>Submatches,<wbr>int</a></li>
+  <li><a class="reference" href="#setLen%2CSmLookaroundItem%2Cint"
+    title="setLen(item: var SmLookaroundItem; size: int)">setLen,<wbr>SmLookaroundItem,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">constructSubmatches
+      <li><a class="reference" href="#constructSubmatches%2CCaptures%2CCapts%2Cint%2Cint"
+    title="constructSubmatches(captures: var Captures; capts: Capts; capt, size: int)">constructSubmatches,<wbr>Captures,<wbr>Capts,<wbr>int,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">len
+      <li><a class="reference" href="#len%2CSubmatches"
+    title="len(sm: Submatches): int">len,<wbr>Submatches</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">add
+      <li><a class="reference" href="#add%2CSubmatches%2CPState"
+    title="add(sm: var Submatches; item: PState)">add,<wbr>Submatches,<wbr>PState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">hasState
+      <li><a class="reference" href="#hasState%2CSubmatches%2Cint16"
+    title="hasState(sm: Submatches; n: int16): bool">hasState,<wbr>Submatches,<wbr>int16</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">removeLast
+      <li><a class="reference" href="#removeLast%2CSmLookaround"
+    title="removeLast(sm: var SmLookaround)">removeLast,<wbr>SmLookaround</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">clear
+      <li><a class="reference" href="#clear%2CRegexMatch"
+    title="clear(m: var RegexMatch)">clear,<wbr>RegexMatch</a></li>
+  <li><a class="reference" href="#clear%2CSubmatches"
+    title="clear(sm: var Submatches)">clear,<wbr>Submatches</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">grow
+      <li><a class="reference" href="#grow%2CSmLookaround"
+    title="grow(sm: var SmLookaround)">grow,<wbr>SmLookaround</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">reverse
+      <li><a class="reference" href="#reverse%2CCapts%2Cint32%2Cint32"
+    title="reverse(capts: var Capts; a, b: int32): int32">reverse,<wbr>Capts,<wbr>int32,<wbr>int32</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">cap
+      <li><a class="reference" href="#cap%2CSubmatches"
+    title="cap(sm: Submatches): int">cap,<wbr>Submatches</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">[]
+      <li><a class="reference" href="#%5B%5D%2CSubmatches%2Cint"
+    title="`[]`(sm: Submatches; i: int): PState">[],<wbr>Submatches,<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">newSubmatches
+      <li><a class="reference" href="#newSubmatches%2Cint"
+    title="newSubmatches(size: int): Submatches">newSubmatches,<wbr>int</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#15" id="65">Iterators</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#items.i%2CSubmatches"
+    title="items(sm: Submatches): PState">items</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#18" id="68">Templates</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#last.t%2CSmLookaround"
+    title="last(sm: var SmLookaround): untyped">last</a></li>
+  <li><a class="reference" href="#lastA.t%2CSmLookaround"
+    title="lastA(sm: var SmLookaround): untyped">lastA</a></li>
+  <li><a class="reference" href="#lastB.t%2CSmLookaround"
+    title="lastB(sm: var SmLookaround): untyped">lastB</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc">Types used by the NFA</p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>, <a class="reference external" href="litopt.html">litopt</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="CaptIdx"></a>
+<dt><pre><a href="nfatype.html#CaptIdx"><span class="Identifier">CaptIdx</span></a> <span class="Other">=</span> <span class="Identifier">int32</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="CaptNode"></a>
+<dt><pre><a href="nfatype.html#CaptNode"><span class="Identifier">CaptNode</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">parent</span><span class="Operator">*</span><span class="Other">:</span> <a href="nfatype.html#CaptIdx"><span class="Identifier">CaptIdx</span></a>
+  <span class="Identifier">bound</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int</span>
+  <span class="Identifier">idx</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int16</span>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="Capts"></a>
+<dt><pre><a href="nfatype.html#Capts"><span class="Identifier">Capts</span></a> <span class="Other">=</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nfatype.html#CaptNode"><span class="Identifier">CaptNode</span></a><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="Captures"></a>
+<dt><pre><a href="nfatype.html#Captures"><span class="Identifier">Captures</span></a> <span class="Other">=</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span><span class="Other">]</span><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="RegexLit"></a>
+<dt><pre><a href="nfatype.html#RegexLit"><span class="Identifier">RegexLit</span></a> <span class="Other">=</span> <span class="Keyword">distinct</span> <span class="Identifier">string</span></pre></dt>
+<dd>
+
+raw regex literal string
+
+</dd>
+<a id="Regex"></a>
+<dt><pre><a href="nfatype.html#Regex"><span class="Identifier">Regex</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">nfa</span><span class="Operator">*</span><span class="Other">:</span> <a href="types.html#Nfa"><span class="Identifier">Nfa</span></a>
+  <span class="Identifier">groupsCount</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int16</span>
+  <span class="Identifier">namedGroups</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">OrderedTable</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">,</span> <span class="Identifier">int16</span><span class="Other">]</span>
+  <span class="Identifier">litOpt</span><span class="Operator">*</span><span class="Other">:</span> <a href="litopt.html#LitOpt"><span class="Identifier">LitOpt</span></a>
+</pre></dt>
+<dd>
+
+a compiled regular expression
+
+</dd>
+<a id="MatchFlag"></a>
+<dt><pre><a href="nfatype.html#MatchFlag"><span class="Identifier">MatchFlag</span></a> <span class="Other">=</span> <span class="Keyword">enum</span>
+  <span class="Identifier">mfShortestMatch</span><span class="Other">,</span> <span class="Identifier">mfNoCaptures</span><span class="Other">,</span> <span class="Identifier">mfFindMatch</span><span class="Other">,</span> <span class="Identifier">mfFindMatchOpt</span><span class="Other">,</span> <span class="Identifier">mfAnchored</span><span class="Other">,</span>
+  <span class="Identifier">mfBwMatch</span><span class="Other">,</span> <span class="Identifier">mfReverseCapts</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="MatchFlags"></a>
+<dt><pre><a href="nfatype.html#MatchFlags"><span class="Identifier">MatchFlags</span></a> <span class="Other">=</span> <span class="Identifier">set</span><span class="Other">[</span><a href="nfatype.html#MatchFlag"><span class="Identifier">MatchFlag</span></a><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="RegexMatch"></a>
+<dt><pre><a href="nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">captures</span><span class="Operator">*</span><span class="Other">:</span> <a href="nfatype.html#Captures"><span class="Identifier">Captures</span></a>
+  <span class="Identifier">namedGroups</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">OrderedTable</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">,</span> <span class="Identifier">int16</span><span class="Other">]</span>
+  <span class="Identifier">boundaries</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span>
+</pre></dt>
+<dd>
+
+result from matching operations
+
+</dd>
+<a id="NodeIdx"></a>
+<dt><pre><a href="nfatype.html#NodeIdx"><span class="Identifier">NodeIdx</span></a> <span class="Other">=</span> <span class="Identifier">int16</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="Bounds"></a>
+<dt><pre><a href="nfatype.html#Bounds"><span class="Identifier">Bounds</span></a> <span class="Other">=</span> <span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">int</span><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="PState"></a>
+<dt><pre><a href="nfatype.html#PState"><span class="Identifier">PState</span></a> <span class="Other">=</span> <span class="Keyword">tuple</span><span class="Other">[</span><span class="Identifier">ni</span><span class="Other">:</span> <a href="nfatype.html#NodeIdx"><span class="Identifier">NodeIdx</span></a><span class="Other">,</span> <span class="Identifier">ci</span><span class="Other">:</span> <a href="nfatype.html#CaptIdx"><span class="Identifier">CaptIdx</span></a><span class="Other">,</span> <span class="Identifier">bounds</span><span class="Other">:</span> <a href="nfatype.html#Bounds"><span class="Identifier">Bounds</span></a><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="Submatches"></a>
+<dt><pre><a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a> <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span>
+  <span class="Identifier">sx</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nfatype.html#PState"><span class="Identifier">PState</span></a><span class="Other">]</span>
+  <span class="Identifier">ss</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">int16</span><span class="Other">]</span>
+  <span class="Identifier">si</span><span class="Other">:</span> <span class="Identifier">int16</span>
+</pre></dt>
+<dd>
+
+Parallel states would be a better name. This is a sparse set
+
+</dd>
+<a id="SmLookaroundItem"></a>
+<dt><pre><a href="nfatype.html#SmLookaroundItem"><span class="Identifier">SmLookaroundItem</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">a</span><span class="Other">,</span> <span class="Identifier">b</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="SmLookaround"></a>
+<dt><pre><a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nfatype.html#SmLookaroundItem"><span class="Identifier">SmLookaroundItem</span></a><span class="Other">]</span>
+  <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="constructSubmatches,Captures,Capts,int,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#constructSubmatches%2CCaptures%2CCapts%2Cint%2Cint"><span class="Identifier">constructSubmatches</span></a><span class="Other">(</span><span class="Identifier">captures</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#Captures"><span class="Identifier">Captures</span></a><span class="Other">;</span> <span class="Identifier">capts</span><span class="Other">:</span> <a href="nfatype.html#Capts"><span class="Identifier">Capts</span></a><span class="Other">;</span> <span class="Identifier">capt</span><span class="Other">,</span> <span class="Identifier">size</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="reverse,Capts,int32,int32"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#reverse%2CCapts%2Cint32%2Cint32"><span class="Identifier">reverse</span></a><span class="Other">(</span><span class="Identifier">capts</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#Capts"><span class="Identifier">Capts</span></a><span class="Other">;</span> <span class="Identifier">a</span><span class="Other">,</span> <span class="Identifier">b</span><span class="Other">:</span> <span class="Identifier">int32</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int32</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+reverse capture indices from a to b; return head
+
+</dd>
+<a id="clear,RegexMatch"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#clear%2CRegexMatch"><span class="Identifier">clear</span></a><span class="Other">(</span><span class="Identifier">m</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#RegexMatch"><span class="Identifier">RegexMatch</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="newSubmatches,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#newSubmatches%2Cint"><span class="Identifier">newSubmatches</span></a><span class="Other">(</span><span class="Identifier">size</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="[],Submatches,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#%5B%5D%2CSubmatches%2Cint"><span class="Identifier">`[]`</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">;</span> <span class="Identifier">i</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <a href="nfatype.html#PState"><span class="Identifier">PState</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="hasState,Submatches,int16"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#hasState%2CSubmatches%2Cint16"><span class="Identifier">hasState</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">;</span> <span class="Identifier">n</span><span class="Other">:</span> <span class="Identifier">int16</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="add,Submatches,PState"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#add%2CSubmatches%2CPState"><span class="Identifier">add</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">;</span> <span class="Identifier">item</span><span class="Other">:</span> <a href="nfatype.html#PState"><span class="Identifier">PState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="len,Submatches"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#len%2CSubmatches"><span class="Identifier">len</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="clear,Submatches"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#clear%2CSubmatches"><span class="Identifier">clear</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="cap,Submatches"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#cap%2CSubmatches"><span class="Identifier">cap</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="setLen,Submatches,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#setLen%2CSubmatches%2Cint"><span class="Identifier">setLen</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">;</span> <span class="Identifier">size</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="setLen,SmLookaroundItem,int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#setLen%2CSmLookaroundItem%2Cint"><span class="Identifier">setLen</span></a><span class="Other">(</span><span class="Identifier">item</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#SmLookaroundItem"><span class="Identifier">SmLookaroundItem</span></a><span class="Other">;</span> <span class="Identifier">size</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="grow,SmLookaround"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#grow%2CSmLookaround"><span class="Identifier">grow</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="removeLast,SmLookaround"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#removeLast%2CSmLookaround"><span class="Identifier">removeLast</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="15">
+<h1><a class="toc-backref" href="#15">Iterators</a></h1>
+<dl class="item">
+<a id="items.i,Submatches"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#items.i%2CSubmatches"><span class="Identifier">items</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <a href="nfatype.html#Submatches"><span class="Identifier">Submatches</span></a><span class="Other">)</span><span class="Other">:</span> <a href="nfatype.html#PState"><span class="Identifier">PState</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="18">
+<h1><a class="toc-backref" href="#18">Templates</a></h1>
+<dl class="item">
+<a id="last.t,SmLookaround"></a>
+<dt><pre><span class="Keyword">template</span> <a href="#last.t%2CSmLookaround"><span class="Identifier">last</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">untyped</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="lastA.t,SmLookaround"></a>
+<dt><pre><span class="Keyword">template</span> <a href="#lastA.t%2CSmLookaround"><span class="Identifier">lastA</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">untyped</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="lastB.t,SmLookaround"></a>
+<dt><pre><span class="Keyword">template</span> <a href="#lastB.t%2CSmLookaround"><span class="Identifier">lastB</span></a><span class="Other">(</span><span class="Identifier">sm</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="nfatype.html#SmLookaround"><span class="Identifier">SmLookaround</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">untyped</span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nfatype.idx b/docs/regex/nfatype.idx
new file mode 100644
index 0000000..b7fd88c
--- /dev/null
+++ b/docs/regex/nfatype.idx
@@ -0,0 +1,40 @@
+CaptIdx	regex/nfatype.html#CaptIdx	nfatype: CaptIdx	
+CaptNode	regex/nfatype.html#CaptNode	nfatype: CaptNode	
+Capts	regex/nfatype.html#Capts	nfatype: Capts	
+Captures	regex/nfatype.html#Captures	nfatype: Captures	
+constructSubmatches	regex/nfatype.html#constructSubmatches,Captures,Capts,int,int	nfatype: constructSubmatches(captures: var Captures; capts: Capts; capt, size: int)	
+reverse	regex/nfatype.html#reverse,Capts,int32,int32	nfatype: reverse(capts: var Capts; a, b: int32): int32	
+RegexLit	regex/nfatype.html#RegexLit	nfatype: RegexLit	
+Regex	regex/nfatype.html#Regex	nfatype: Regex	
+mfShortestMatch	regex/nfatype.html#mfShortestMatch	MatchFlag.mfShortestMatch	
+mfNoCaptures	regex/nfatype.html#mfNoCaptures	MatchFlag.mfNoCaptures	
+mfFindMatch	regex/nfatype.html#mfFindMatch	MatchFlag.mfFindMatch	
+mfFindMatchOpt	regex/nfatype.html#mfFindMatchOpt	MatchFlag.mfFindMatchOpt	
+mfAnchored	regex/nfatype.html#mfAnchored	MatchFlag.mfAnchored	
+mfBwMatch	regex/nfatype.html#mfBwMatch	MatchFlag.mfBwMatch	
+mfReverseCapts	regex/nfatype.html#mfReverseCapts	MatchFlag.mfReverseCapts	
+MatchFlag	regex/nfatype.html#MatchFlag	nfatype: MatchFlag	
+MatchFlags	regex/nfatype.html#MatchFlags	nfatype: MatchFlags	
+RegexMatch	regex/nfatype.html#RegexMatch	nfatype: RegexMatch	
+clear	regex/nfatype.html#clear,RegexMatch	nfatype: clear(m: var RegexMatch)	
+NodeIdx	regex/nfatype.html#NodeIdx	nfatype: NodeIdx	
+Bounds	regex/nfatype.html#Bounds	nfatype: Bounds	
+PState	regex/nfatype.html#PState	nfatype: PState	
+Submatches	regex/nfatype.html#Submatches	nfatype: Submatches	
+newSubmatches	regex/nfatype.html#newSubmatches,int	nfatype: newSubmatches(size: int): Submatches	
+`[]`	regex/nfatype.html#[],Submatches,int	nfatype: `[]`(sm: Submatches; i: int): PState	
+hasState	regex/nfatype.html#hasState,Submatches,int16	nfatype: hasState(sm: Submatches; n: int16): bool	
+add	regex/nfatype.html#add,Submatches,PState	nfatype: add(sm: var Submatches; item: PState)	
+len	regex/nfatype.html#len,Submatches	nfatype: len(sm: Submatches): int	
+clear	regex/nfatype.html#clear,Submatches	nfatype: clear(sm: var Submatches)	
+items	regex/nfatype.html#items.i,Submatches	nfatype: items(sm: Submatches): PState	
+cap	regex/nfatype.html#cap,Submatches	nfatype: cap(sm: Submatches): int	
+setLen	regex/nfatype.html#setLen,Submatches,int	nfatype: setLen(sm: var Submatches; size: int)	
+SmLookaroundItem	regex/nfatype.html#SmLookaroundItem	nfatype: SmLookaroundItem	
+SmLookaround	regex/nfatype.html#SmLookaround	nfatype: SmLookaround	
+setLen	regex/nfatype.html#setLen,SmLookaroundItem,int	nfatype: setLen(item: var SmLookaroundItem; size: int)	
+last	regex/nfatype.html#last.t,SmLookaround	nfatype: last(sm: var SmLookaround): untyped	
+lastA	regex/nfatype.html#lastA.t,SmLookaround	nfatype: lastA(sm: var SmLookaround): untyped	
+lastB	regex/nfatype.html#lastB.t,SmLookaround	nfatype: lastB(sm: var SmLookaround): untyped	
+grow	regex/nfatype.html#grow,SmLookaround	nfatype: grow(sm: var SmLookaround)	
+removeLast	regex/nfatype.html#removeLast,SmLookaround	nfatype: removeLast(sm: var SmLookaround)	
diff --git a/docs/regex/nimdoc.out.css b/docs/regex/nimdoc.out.css
new file mode 100644
index 0000000..4ee73ea
--- /dev/null
+++ b/docs/regex/nimdoc.out.css
@@ -0,0 +1,891 @@
+/*
+Stylesheet for use with Docutils/rst2html.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+
+Modified from Chad Skeeters' rst2html-style
+https://bitbucket.org/cskeeters/rst2html-style/
+
+Modified by Boyd Greenfield and narimiran
+*/
+
+:root {
+  --primary-background: #fff;
+  --secondary-background: ghostwhite;
+  --third-background: #e8e8e8;
+  --border: #dde;
+  --text: #222;
+  --anchor: #07b;
+  --anchor-focus: #607c9f;
+  --input-focus: #1fa0eb;
+  --strong: #3c3c3c;
+  --hint: #9A9A9A;
+  --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN4AAAA9CAYAAADCt9ebAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjAzOjQ4KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1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");
+
+  --keyword: #5e8f60;
+  --identifier: #222;
+  --comment: #484a86;
+  --operator: #155da4;
+  --punctuation: black;
+  --other: black;
+  --escapeSequence: #c4891b;
+  --number: #252dbe;
+  --literal: #a4255b;
+  --raw-data: #a4255b;
+}
+
+[data-theme="dark"] {
+  --primary-background: #171921;
+  --secondary-background: #1e202a;
+  --third-background: #2b2e3b;
+  --border: #0e1014;
+  --text: #fff;
+  --anchor: #8be9fd;
+  --anchor-focus: #8be9fd;
+  --input-focus: #8be9fd;
+  --strong: #bd93f9;
+  --hint: #7A7C85;
+  --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQyNDQtYTExZi0yMjc5YmY4NDNhYTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ZWRlYjM1NzAtYjZmYy1kMjQ0LWExMWYtMjI3OWJmODQzYWEwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZWRlYjM1NzAtYjZmYy1kMjQ0LWExMWYtMjI3OWJmODQzYWEwIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQyNDQtYTExZi0yMjc5YmY4NDNhYTAiIHN0RXZ0OndoZW49IjIwMTktMTItMDNUMDE6MTg6MjIrMDE6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMS4wIChXaW5kb3dzKSIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4JZNR8AAAfG0lEQVR4nO2deViTZ7r/7yxkJaxJ2MK+GCBAMCwS1kgUFQSKK4XWWqsz1jpjp3b0tDP1V+eqU391fqfT/mpPPd20drTFDS0KFEVWJSGAEgLIZpAICBJACIRs549Rj1WILAkBfD/XlevySp68z/0S3+/7vPdzLyidTgcLkU2bd+z39/f/q1gshsrKSoJELFCa2iaEuU9K6kb+8uXxv54/fzE8L/eswNT2zCfQpjbAGKS8lPFKSEjIXiaTCSEhIeDj4xNnapsQ5j6rktZGp6UlfxIdzQVzCplmanvmG1hTG2BIAtlc26CgoDfT0tL2e3l5AQCAjY0NkMnk/a9s2k6rrKw8UV8n1JjYTIQ5RlAw14KzmL3xze1vfJyUuMJaq9UCFovFm9qu+YbBxcSPFUYkk8l2Q0NDsvo6ocrQx5+I8Ih4bz6f/0l8fHyKlZXV4/dRKBQwmcwwMpn8A4FAoPgHhH9bV1sxa488wZxoaycnJ/a9e/duCa5fkc3WvAiTI4Ib77p+XdqHG9anbfLy8gAAgLGxMdBpF+bjvzExqJj4scKI0dHRnwQHB++orq7+AgDeMuTxJ2Jl4rqU9PT0EwEBAUQCgTDuGAaDAampqYepVKpHUHDk325Ulw0a266YuFW+Gzdu/MDPz29jfn7+XgA4aOw5ESZP6kvpCXv3vnM8NiaSamVl+fj9BepGNDoGFRN7e/slcXFxO1xcXMDJyWnH7j//H/fi4uJdgutXmgw5z5O8smn7X9euXbvf29sbMBjMhONQKBRYWVlBbGzsbjMzM3JoOG+/sKKwy1h2rd/4elpGRsYuLy+vaDweD2w2Oy1h5ZrCvEunEaeeiVnMiabyl/F2/+X9P+8JDPQHHA5napMWBAYTk6DgSNuEhIS9DAYDAP7tq1i6dOkqOp3OWbNu0wens44emeoxA9lcWwKBYEMkEm2JRKIdHo+3QKFQWJ1Op8ZgMER3d/dVq1evTnFycpr0MSkUCsTExGzH4/Gk1LTME/39/TI0Go1FoVCg1WrVY2NjipGRkcGRkRH5dPwrEZHLXMPCwjJSUlIy3dzcfB+97+rqGhYSEpIOAIiYmBguN3zL77dt3uPh4W5qUxYUBhMTb2/vjeHh4cvR6P/dILK0tITIyEg7BweHr363/Z3Ampqaf1Zcu/zMKiVsyVJvMplsRyKR7IhEor2FhYUbhUJhJCYm2pFIJB6JRAIymQx4PB7QaDRoNBowMzMDJycnwOOn7icjEokQGxu7icFgbLp///7jFY1WqwWlUgkjIyOgUCgO7Ni5Rz48PCwfHh7uGRkZeaBQKOSjo6ODCoVCXlNVKn/6uCsT13FXrVr1emho6BYKhfLMnP7+/omrU9LPX8g+UThloxEMxqJFXjxESAyPQcSEExrLWLNmzW57e/txP/fw8ABHR8cdDAaDt3xF2ru9vb03sVgs0cbGxs/FxWVZUlISj0aj+dna2oKtrS1M5PcwJCgUCry8vODRrs84vPfoH6OjoyCXy6Gvr+/R6+CWrX9s7evrk/b19bWr1Wqli4sLZ8OGDe95eXmxUSjUuAd0cHDwjoqK2sYKXFIhvnldYYTTQpgU4/8+jyASCYDGoCd+ZkYYF8OICYezl8PhuOkbQyAQIDo62s/NzS2np6cHbGxsgEajAYFAAAwGA1gsFia6CE0NgUAABwcHsLe3B61WC2q1eo9WqwWNRgNKpRLUajUQiUSgUCh6zwGHwwGTydzo5+eXBQBnZu8MEJ5keHhYPqyYWMtHR0ZBpVIhYj9FUDONgOUvT12+du3avMDAQJjssdRqNWCxCyrEZdLodDoQi8Ulx44de628NL/V1Pa8iERE8l2dHB2CJvpcq9Nqbt1qKURWj1Njxld0ZGTkAW9v70kLCQC8sEIC8O/HKx8fn2gmk8kHgCk7pRFmzrWyAikASE1tx0Jj2uH0EZHL/N7YtuvT4OBgzmz4OBYSeDweIiMjt2S++vtMP1YYEmmJsCCY8mNOIJtr6+zsHBcZGXmIw+G4mZubG8m0hU9HRwcUFxe/KxQKTyDRsQjznSmJCS9+dVRERMTfQ0NDo2xtbfUGiSFMjtHRUaitrc3Jzc09kHvxVLmp7UFAmC6oZQkvrZLL5RJhReHtiQb5scKIXC7371FRUX90dnYGIpE4JR8Jgn40Gg20t7fXFxYWfnr9+vWjz8sdYi+Osh4vzgUBwZSgtu94V+fs7Hx7YGCgra6u7khLS0u2RCwYeTQgKmYFh8fj/f/g4OAldnZ2prR1wdPd3Q1CofBQSUnJkdLi3N8E93FCY6k+Pj48FxcXjlar1ZSWlh65VvYr4kREmDNg79+/D3FxcW5OTk5uXl5evNbW1tL0jK3ZXV1d1ykUintycvInoaGhdkj+gvGxs7MDPp+/m0AgWMQvS/lyeHhYTqPRPJycnIJSU1NZ3t7eW2g0Gly/fv2oWq1Gij0hzClQ/gHhpLS0tEM8Hm/7I8Ho7++HlpYWsLa2Bg8PDxOb+OKhUCigqakJ7t+/D25ubuDu7g4oFAp0Oh08ePAAvv7666TTWUdzTG0nAsKTYMU3ryuSU18+4+bmFrZo0SIOAICVlRUsXrx4zkakLnRIJBI8CgJ8MtdJp9NBZ2enqL29XWRC8xAQxgUNAHD+3L8KGhoaCp78ABES04JCoX4jJAAAAwMDUFtbe96YpRMQEKbL41DU5ubmko6Ojj2PSgggzD36+/vrb9y4cX425zzw93/8EBjon2is44+NjSkePBjqGRwc7G5v7xBV19w8U5B/3qgrr9+/uWtXUuKKD/TZ9MXh/066/OuFmunO8dGBQ98HBbGSp/t9U6LRaDXK0dHBoeFhuVzeL22/0yFqamopufjLqRJ933ssJi0tLSXV1dWHGAzGbuObOzs8ubqa71vZKpUKOjo6blwpOF8zm/Mu5cVkLlkSaswprAHAaVihgK7O7oSGxltvfXLon3nXK4RHT2cdN4pfKDCAlZyUuMJan02nTmczAaBmunPw4qI3cbnh0/36XICq0+lgcPABp7OrK629vUP5z8++LLh2XXD05L++yxrvC4/F5EZ12WBS8saLS5Ys2U2lUufUY45SqQSlUgkqlQrUavXj19jYGGg0GtBoNKDT6UCn05VotVq1TqfToFAojFar1eh0Og0Wi8XhcDgeGo1+/PhgZmYGOBwOsFgsmJmZ/eY1F+nt7YXa2trs2Z73wdCQBgCMHp1IJpHA09MdPD3dLRIS+OtKisvWvbP7vf2lZdePVFwzbHTwyMiI3hidkZFRUKvUYzOZ48HQkBIA5nWqBAqFAktLC7C0tADmIh88Pz4uMSyUk7hn776DV4tKPn/6d/lNxp1MJqsRCASf8vn8XdMpOjRTVCoVjI2NgUqlAq1WCyMjI9DX1wf379+Hvr6+/Q8ePOgdGRmRKxSKx0WLFAqFXKlUKnQ6nUar1arHq47mxwrD4/F4Eg6HI2GxWDwej7cgkUjWFAqFam5uTjU3N6eRyeQPLSwswNraGqysrIBAIDwWFywW+zja11Qi29LSclIikeSZZPJZBovBAI8XA8HBQR9kZZ3lR8cmvFZSlGe00p8IkwONRkNERBj4+i7a4+XpHv307/IbMakWlciXJbx0nMPh7Jqo0JGh0el0MDo6Cl1dXSCVSkEmk7177969W319fe1DQ0M9KpVKoVarlWq1WjndNhUPG3ApAWDcOxLTLwSDwWAOotFoDBaLxRMIBAsrKysne3t7Xzqd7k2n0/c4OzsDlUoFHA4364IyMDAATU1NxdWikhcq6tXKyhJezljPJZKI2eERS5cZeoWCMD2srCwhPX0tVzk2djiCG//GtfLLUoBxShB0dHTU3Lx580sLC4vtJBLJKMZoNBqQSqUglUqPdnR01PT09DT19/fLHjx40DM0NNQ72933GiSVGgB4JFQK+LfoSAGgnL04yppEIh2xtLS0t7GxcaFSqR7Ozs4fMRgMcHR0nJX8pJs3b54Ui8UXjT7RHIRMIkFK8irfwcEHPwQELUmqvYHUGJkLmJubw8YNa/i9vfffY/px3myQiDTPiEl9nVDDX576jaenZ7SnpyfLUJNrNBqQyWRw+/bt4x0dHTdkMlltV1dXw/XygjkdEv4wB0YOAK0AUM70C8HQ6fSzdDrdm0qlejg6OrLc3Ny2MBiMadWjfR4PHjyAmzdvZs/1v5MxoVAokJK8iicWS95k+nH+s0EiQhqpzQGoVFtYk5a87ba0XQAA34xbpagg/5zoT7s/OGNnZ8eaaYkBuVwOnZ2d5VKpVNTS0lLS2NhYWFVZ3Dujg5qQh6uY+ocvCAiKIPn4+Jz19PSMdnV15VCpVL6Dg4NBViw6nQ5EItHRpqamqzM+2DzHzo4O69amftLQeKsAZrDLgmBY/PyYsCIhfs+SiKUFE5Y8EwqFx11cXDihoaFTjjFAoVAwPDwMHR0dourq6jNCofDHhZqUVnvjmgIAcgAgJyg40mLRokX8kJCQjT4+PussLS1n1JPl7t27UFxcfHguB6mNjY2B7G4naNRTWyygUCjAYDGAx+PB0sICSCSi3vFYLBbCwjjA8vddBQtATKb7d3saBwc7IJPJBpsHjUGDGRYLJBIJLK0sAfucmyIGg4FFi3y8AwNZtycUk5KiS02vvf7WWQaDkejg4DApQwAeh3xDaWnpPoFAcPxFqnP6sEvgGf+A8Bx3d/cvIyIiNi1evHjT8wpNj8fAwACUlZW9P9dD5+/ckcFbf9gd2dcnn9LNAovF4inmZHtXNxdOdBR3+/JlS33pdP29wolEInA4weuiYxOy5vvuTkeHDHb+8c8xvb33Z3R9/N+Df+uIjYk02DwkEsna2trS1d/fNyGeF7uTyw1/7g3R3t4O2OxA/TVghULhcQqFQk1JSfmYSNR/5wD4d6EfgUBwvLS09IhUKhW9qAV5H9YjKQwJi6uvrKw8ERoamhkSEpKp7w7yJEqlEiQSyZmysrJv53qjdaVSCZdyTk+3qFMrAJRHRPLPN95qeifj5fU7mYt8JhyMRqMhMJDFdnF25gDAvBYTpXIMWlpay2fq/8m5mDcIABYGnEcGAGI/VlhBZWX1yZdSkz55OX0dV5+7w9bGGvz8mPrFpK62QskJjf2GTqd7x8bGbpnID4BCoUAmk0lLSkqOiESik2UleS/MakQflYKrXQDQxY1a3tTe3i6KiIjY5OXlxX7e9+rr6wsuXbr0t4ffn9OgMWjghMZQRcLp+8GulRVI/QPC37Wxtnal0ajJtjY2E451ZjiBra31vE9lR2PQQKFQaAAwo98Yi8Xq9fpPd56HO6rlvKWJv/PwcK+JilyCmajWMw6HAzs7+rMFpQOCIn6zHywSFvXm5eUdFAqFZ9Rq9bgHa2trq79w4cK+zz49cAARkmcpL81v/a/Dhz49d+7c3qqqqjyVSjXuOJ1OBxKJpDw3N/fA5V+zax6978cKw/sHhM/raMrnUVdboSy4fPWQSFSjd5yFBQWIRNKEd2IEw1J4JUd88WL+R51d3XrHWVDMnxUTa2tr1zXrNiUGsrmPf7DS4tymCxcu7Kuurs55+kKQSqVN586d23vs+8NHDXUCC5Wzp3/Iy8rKeruysvLM2Nhvo7VVKhXU1tYWnj17du/T7UOdnZ2D7OzsfGGB09raVi4S1RzXl0eFw+EAj8chYjKLVFffyOrq1C8mJBLpWTFRKBRyDofzC4vFWvXk+1ev/CLOzs7eKxAIslQqFeh0Oujp6enKzs7em/XTd7OayTqfKb56sT4rK+sPAoHg5KO/o0KhAKFQmHXy5MkdF3/5+TeZmctXpIXZ29v7zqVcKWNRX1epuXu3U/y8pEw0GmndOZt0dnXVDw0P6/W5oNHoZ30mQ0NDPb29vfvj4+Pf3rR5B/7od188XnEUXr4gDgmL+0NfX5/U19d3d3l5+YGfTnyDtLmcIhXXLsu4UcvfR6PRGGtra9eysrIjYrE45+kt4Fheou/69es/unnz5vm7d+/Wmsre2WRkZGTQ1DYg/JYGiUiTm1ugBAC9IfHPiEmDpFITE7fqJI/H27lmzZpDq5LWtz55t6wUXO3ihMYerK+vz2tpaUFaM0yT8tL81ujYle+TSCTrvEunBU9/voTLd92wYcPHVCqV39XVdXCu7+oYCp1O90Kc50Jk3I5+xVcv1jc3N5d4enpSMzIyvkpK3sh78nORsKg3++yPBS/q1q+hKCm61DSekERGJ3ikp6d/ERsbm1xVVXWwtbX1hRFtFAqFPMLMUyZsDyoQCI7LZDKIiIjwzczM/GpV0vro2TTsRSUqZoX3+vXrP1u9enXi0NAQiESirIdRtggIc5oJ40zq6uryGhoa8ry8vBJCQ0O9USjU94mrN7yWc+EnvaXb5gJMvxCMp6cnl0Kh2Le1tZVXXLs8L1LXefGrWRkZGZ/x+XyeUqkEkUh0vqenZ14HZyG8OEwoJjdrygd37NxTEBkZmWBtbQ3BwcEeKBTq+/UbX3/355Pfzlmn66qk9dGbN29+k8PhbCSRSNDZ2Snb9ae/HCkpKTksEhbN2QTD5NSX+Vu3bj0cHBzsjcFg4O7du1BWVvbNwxB9BIQ5j94I2Fu3bhXW19cDl8sFLBYLHA7Hg0wmf/e77e84ffXlPz6fLSMnQ2paZkJ4eHjmtm3b+B4eHvZkMhlQKBTY29s72dvbfxgUFJT8x7ffP1NRUfHjXErnZ/qFYKKjo7dt3rz5g8DAQPtH/XHa2tpqGhsbC55/BASEuYFeMblz505NTU3NgfDw8PcwGAygUCjw9fW1IJPJn/1130Hv0tLSI4WXL4hny9inYS+Osvbz80tgMpn8jIwMPovFch2vpoiDgwM4ODhwfH19OYsWLeJv3/Hu+cbGxquzXZz5aZYlvMRJT0/fFhkZue3JZmfd3d0gEolOIr4ShPmEXjFpkFRqXlrzSnFnZ+d7Tk5OjzNfXVxcICMjY6ezszNnVdL6vU8HWhmbgKAIkrOzMyc1NTXz0YU4maAuOp0OK1as4EVFRfGEQqHg1dfePHzr1q2rs71S8WOF4f38/BLS09M/iIyM5DxdxLq5uVlcVVU1bgVwBIS5il4xAQCQyWRigUBwJikpKe3JVGQcDgdLly7l2tranti0ecf7IpEoy9hbxX6sMDydTvdevXr1ltjY2F3u7u6AxT73FJ7B3Nwc4uLiwthsdphQKCzZkL7l0/r6+oKbNeVG90+EhMXZL1++fFtycvKHrq6uz4igUqmE5ubmEiTHCWG+8dwrUXD9imz9xtd/jIuLS7N5KpsTjUZDUFCQE4PB+F4oFGYmJW888Mv5k4UTHGpGxC9LYaenp78VEhKyxdHRESgUyoyOh0KhwNraGuLi4qIDAgKi6+rqyjekb/mHMSN6N6RvSdu+ffseNpsdZm09ftuW+vp6EIvFSB9hhHnHpG7rUqm0orW1tdXS0tLj6TIEaDQaaDQaxMfH811dXTl/3Xfw+JUrVz411J01cfWG6IiIiC07d+5McHNzs7ewMGyOFw6HAwcHB6BSqVx3d/fwz7/4rkAgEBwXCoUnHpZonDGrU9J5MTEx27du3Zrm4uKC0beaqq6u/ry+vj7XEPMiIMwmkxKTimuXZe/u+fCkp6fnexPdUfF4PPj7+1szGIydLi4unF1/+kvenTt3RG1tbRXTqfma8lIG39/fP/HVV19NZrFYHpMpzjQTzMzMwNPTE+Pp6Zng6emZ4Ofnl5CesfV8bW1tznQe3/wDwvFeXl7Rvr6+Ca+88kpaUFCQh74GXzqdDrq7u6GpqankRQmdR1hYTNrhUFVVlcXj8d6ysrKy0OfstLS0hPj4eC6Xy+U2NzeDRCI5/sa2XeX37t1rGhwc7BoYGJBN1P+FFbiE5OzszGaxWImvvvrqpoCAAKfp+ERmCpPJBCaTmcnhcDJLS0u/TE59+YxUKhXoi/lg+oVgrKysGJaWlna2trYeaWlpXDabvTMgIGDSfp2KiorzbW1tL0zoPMLCYtJX6uVfs2u++PKowMPDgz+ZIslEIhECAgKAxWJlajSazJ6eHmhra4PW1tZvtmz9o6Czs7O+r6+vfWxsbFir1WosLCzsV6xYkcnj8d7z9vaelmPV0Hh5eYGnp+f2mJiY7UVFRZ/HL0v5tru7+5ZGo1FisVg8Docj4fF4CxsbG1c+nx/m7e39sYeHB7i4uIC5ufmU6r4ODQ1BZWXlifkSrYuA8DRTumIrKytPent78728vCb9HRQKBVgsFhwcHIBOpwObzd4yNja2RaVSwdDQEHR1dcHo6CjQaDRwdXWdsWPV0KBQKPDw8AA7O7udERERO2tra2FgYACoVCo4OTkBjUYDMpkMeDz+8WuqaLVaaGxsbL19+/YzSX8ICPOFqYrJidDQ0AwvLy/e80c/CwaDARKJBI86BdJoNHB3dwe1Wj0nViL6IJPJwGQywdnZGZRKJRAIBDBUx8OBgQEoLS39BtkORpjPTJg1PB61N64pmpqarvb39xvUiLkuJE9CJpPBxsbGYEICANDZ2SlHgtQQ5jtTEhMAgLq6ulyJRFJvDGNeREZGRkAikRSUFuci2cEI85opi0l+7hmBWCzOeV6dToTJcfv27cHr168jxbgR5j1TFhMAgObm5hKZDNl0MAQtLS3Xzpw6hkS8Isx7piUmUqlUIBAIJuyjgzA5Ojs7QSKRINGuCAuCaYmJsKKw68qVK59KJJIu5HFneiiVSigqKjouEolOmtoWBARDMC0xAQC4+MvPJadOnXq3ra1N8yL0dDEkOp0OSktLy/Pz8w8+3d4CAWG+Mm0xAQA4fuy/jl+8ePGju3fvGsqeBY9Wq4XKysrWU6dOvX31yi8mKyyFgGBoZiQmAAD/79D+fadPn96PCMrz0el0UFVV1frtt9+mj9fiAgFhPjNjMQEAyMvLO3Ds2LE/tLS0INmuerh27Vr9999//xoiJAgLEYOEntbVVigB4PNNm3cMpqSkfMRms50McdyFgkqlgqKiovJTp069nZ97BhEShAWJQePYj373xdF1GzbLFQrFx6Ghob766ne8KNy7dw+KiopO5ubmfmTK4tsICMbG4EkxWT99d35l4rre/v7+D0NCQvh0Ot3QU8wL1Go1SKVSTX5+/sH8/PyDSP8bhIWOUTLsLuVklQcFR65pbGzcvnLlyvfc3NwsCASCMaaac+h0OhgaGoLq6uqaCxcu/OV01tGcTw7uM7VZCAhGx2jpug/vxAd58atzoqKitq1cuXKnvb29saabE+h0Oqiurpbm5eUdrK6uPlspuDrvY0hmO4YIhUIBGq1/X2CmNqFQKL3/79HomZ/z82xEowyy9zFr80zGDqPn/hdeviBmL47ad+fOnRsRERGbQkNDo62srIw97azT2dkJxcXFx0tKSo7Mdh8hY4LD4TDPH2U4MFjMc6tLmZmZzaj+Aw6H0/t9PB4PGCxmRudNJBL0ngeZTAI0Gj3jv+1szfM88Hic8cUEAKCmqlQOAN/ELU2qkEgkySwWK3HRokVcBoMxG9MbDZ1OB83NzdDU1FRQW1t7XiAQHJ+ovu18pbr6Rg6L5ZtoM0EhcUPT0tJW8tWRb0vQqIkvgKqqmhnVfrl2TfANXo+gjKlUio4OWc1M5sjOzjnQUH8rbqLPu3t6moaGhmfc+3q25tGHUqmECoEIUKbIrVkcEkONiIh4jcvlvu7s7OxLo9GmVe7QVCgUCujq6oKGhoaCioqKo9XV1WeM3YDMVPDik1gpyas+XrVyeaKXl8czjyANjbcgI/MNmkg49Q4ECPOH3NyC4RUr+M8IcHt7B1y9WlKRl3/5kElKnD1sfXEoJCzueEBAQGJYWFgGk8nk2djYAIFAgLm4pTw6Ogqjo6Mgl8vhxo0b50tLS4/U19fnLvS2FIWXfxEDQNLmLW9ueW1TxtchHDaQyWRTm4VgYkZHR6G+vhF+/NfP+y5e+vVjiVgwZpKVydOwF0dZW1lZOTGZTD6bzU4LCAiIptPp8HTDL1MwOjoKLS0tUFdXd1IsFudIpdKKgYGB7tloJTrX4MUnsVJTEj9etzY10dHRAQAAGm81wcsZW5CVyQInL69gNCGBjwcAGBx8ANnncypOnTr3H9nn/reD55wovvrQpyIHAHFUzIocGo3mQaPRfBwdHVlubm7bXF1dgcFgABqNNvruglwuh7t374JMJoOOjo7P79y5I+ru7m7q7e1tXQi7MzOh8PIv4pCw2DdaWtte37Au7aPIyCWAxWABjUbPif9HCMbjURtKiaQBfvr5zH9evlJ0uLQ4r/nJMXNiZTIRrMAlJAcHB18HBweWo6Mjy8rKajeJRAJLS0uwtLQECwsLoFAogMfjAYvFgpmZ2XNXMyqVCoaHh2FoaAiGh4cfvwYGBqCvrw+6u7vfvnfvXlNvb29rT09Pq0QsUM7S6c4rNqS/lrZ5U+YPRBKR9M7u9xwqBUUvtNAudH766XSLE8PR49ixE78/8tVnX403Zk7fUR46NUUAIPIPCMdTKJTdNjY2QKPRgE6nA51OB1tbWyCRSIDD4YBAIAAejwcCgfDYUajVakGlUoFarQadTvfY79HX1wf9/f0gl8tBLpfDvXv3HvXw+dxQPYYXMj+d+P7Mmzv+5OHr6/OJWq1GBHeB09TcUiKuq/coKS3/eqIx/wPkiIXC3w6YjAAAAABJRU5ErkJggg==");
+
+  --keyword: #ff79c6;
+  --identifier: #f8f8f2;
+  --comment: #6272a4;
+  --operator: #ff79c6;
+  --punctuation: #f8f8f2;
+  --other: #f8f8f2;
+  --escapeSequence: #bd93f9;
+  --number: #bd93f9;
+  --literal: #f1fa8c;
+  --raw-data: #8be9fd;
+}
+
+.theme-switch-wrapper {
+  display: flex;
+  align-items: center;
+
+  em {
+    margin-left: 10px;
+    font-size: 1rem;
+  }
+}
+.theme-switch {
+  display: inline-block;
+  height: 22px;
+  position: relative;
+  width: 50px;
+}
+
+.theme-switch input {
+  display: none;
+}
+
+.slider {
+  background-color: #ccc;
+  bottom: 0;
+  cursor: pointer;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  transition: .4s;
+}
+
+.slider:before {
+  background-color: #fff;
+  bottom: 4px;
+  content: "";
+  height: 13px;
+  left: 4px;
+  position: absolute;
+  transition: .4s;
+  width: 13px;
+}
+
+input:checked + .slider {
+  background-color: #66bb6a;
+}
+
+input:checked + .slider:before {
+  transform: translateX(26px);
+}
+
+.slider.round {
+  border-radius: 17px;
+}
+
+.slider.round:before {
+  border-radius: 50%;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%; }
+
+body {
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-weight: 400;
+  font-size: 1.125em;
+  line-height: 1.5;
+  color: var(--text);
+  background-color: var(--primary-background); }
+
+/* Skeleton grid */
+.container {
+  position: relative;
+  width: 100%;
+  max-width: 1050px;
+  margin: 0 auto;
+  padding: 0;
+  box-sizing: border-box; }
+
+.column,
+.columns {
+  width: 100%;
+  float: left;
+  box-sizing: border-box;
+  margin-left: 1%;
+}
+
+.column:first-child,
+.columns:first-child {
+  margin-left: 0; }
+
+.three.columns {
+  width: 19%; }
+
+.nine.columns {
+  width: 80.0%; }
+
+.twelve.columns {
+  width: 100%;
+  margin-left: 0; }
+
+@media screen and (max-width: 860px) {
+  .three.columns {
+    display: none;
+  }
+  .nine.columns {
+    width: 98.0%;
+  }
+  body {
+    font-size: 1em;
+    line-height: 1.35;
+  }
+}
+
+cite {
+  font-style: italic !important; }
+
+
+/* Nim search input */
+div#searchInputDiv {
+  margin-bottom: 1em;
+}
+input#searchInput {
+  width: 80%;
+}
+
+/*
+ * Some custom formatting for input forms.
+ * This also fixes input form colors on Firefox with a dark system theme on Linux.
+ */
+input {
+  -moz-appearance: none;
+  background-color: var(--secondary-background);
+  color: var(--text);
+  border: 1px solid var(--border);
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-size: 0.9em;
+  padding: 6px;
+}
+
+input:focus {
+  border: 1px solid var(--input-focus);
+  box-shadow: 0 0 3px var(--input-focus);
+}
+
+select {
+  -moz-appearance: none;
+  background-color: var(--secondary-background);
+  color: var(--text);
+  border: 1px solid var(--border);
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-size: 0.9em;
+  padding: 6px;
+}
+
+select:focus {
+  border: 1px solid var(--input-focus);
+  box-shadow: 0 0 3px var(--input-focus);
+}
+
+/* Docgen styles */
+/* Links */
+a {
+  color: var(--anchor);
+  text-decoration: none;
+}
+
+a span.Identifier {
+  text-decoration: underline;
+  text-decoration-color: #aab;
+}
+
+a.reference-toplevel {
+  font-weight: bold;
+}
+
+a.toc-backref {
+  text-decoration: none;
+  color: var(--text); }
+
+a.link-seesrc {
+  color: #607c9f;
+  font-size: 0.9em;
+  font-style: italic; }
+
+a:hover,
+a:focus {
+  color: var(--anchor-focus);
+  text-decoration: underline; }
+
+a:hover span.Identifier {
+  color: var(--anchor);
+}
+
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline; }
+
+sup {
+  top: -0.5em; }
+
+sub {
+  bottom: -0.25em; }
+
+img {
+  width: auto;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic; }
+
+@media print {
+  * {
+    color: black !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important; }
+
+  a,
+  a:visited {
+    text-decoration: underline; }
+
+  a[href]:after {
+    content: " (" attr(href) ")"; }
+
+  abbr[title]:after {
+    content: " (" attr(title) ")"; }
+
+  .ir a:after,
+  a[href^="javascript:"]:after,
+  a[href^="#"]:after {
+    content: ""; }
+
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid; }
+
+  thead {
+    display: table-header-group; }
+
+  tr,
+  img {
+    page-break-inside: avoid; }
+
+  img {
+    max-width: 100% !important; }
+
+  @page {
+    margin: 0.5cm; }
+
+  h1 {
+    page-break-before: always; }
+
+  h1.title {
+    page-break-before: avoid; }
+
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3; }
+
+  h2,
+  h3 {
+    page-break-after: avoid; }
+}
+
+
+p {
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+}
+
+small {
+  font-size: 85%; }
+
+strong {
+  font-weight: 600;
+  font-size: 0.95em;
+  color: var(--strong);
+}
+
+em {
+  font-style: italic; }
+
+h1 {
+  font-size: 1.8em;
+  font-weight: 400;
+  padding-bottom: .25em;
+  border-bottom: 6px solid var(--third-background);
+  margin-top: 2.5em;
+  margin-bottom: 1em;
+  line-height: 1.2em; }
+
+h1.title {
+  padding-bottom: 1em;
+  border-bottom: 0px;
+  font-size: 2.5em;
+  text-align: center;
+  font-weight: 900;
+  margin-top: 0.75em;
+  margin-bottom: 0em;
+}
+
+h2 {
+  font-size: 1.3em;
+  margin-top: 2em; }
+
+h2.subtitle {
+  text-align: center; }
+
+h3 {
+  font-size: 1.125em;
+  font-style: italic;
+  margin-top: 1.5em; }
+
+h4 {
+  font-size: 1.125em;
+  margin-top: 1em; }
+
+h5 {
+  font-size: 1.125em;
+  margin-top: 0.75em; }
+
+h6 {
+  font-size: 1.1em; }
+
+
+ul,
+ol {
+  padding: 0;
+  margin-top: 0.5em;
+  margin-left: 0.75em; }
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+  margin-left: 1.25em; }
+
+li {
+    list-style-type: circle;
+}
+
+ul.simple-boot li {
+    list-style-type: none;
+    margin-left: 0em;
+    margin-bottom: 0.5em;
+}
+
+ol.simple > li, ul.simple > li {
+  margin-bottom: 0.25em;
+  margin-left: 0.4em }
+
+ul.simple.simple-toc > li {
+    margin-top: 1em;
+}
+
+ul.simple-toc {
+  list-style: none;
+  font-size: 0.9em;
+  margin-left: -0.3em;
+  margin-top: 1em; }
+
+ul.simple-toc > li {
+    list-style-type: none;
+}
+
+ul.simple-toc-section {
+  list-style-type: circle;
+  margin-left: 1em;
+  color: #6c9aae; }
+
+
+ol.arabic {
+  list-style: decimal; }
+
+ol.loweralpha {
+  list-style: lower-alpha; }
+
+ol.upperalpha {
+  list-style: upper-alpha; }
+
+ol.lowerroman {
+  list-style: lower-roman; }
+
+ol.upperroman {
+  list-style: upper-roman; }
+
+ul.auto-toc {
+  list-style-type: none; }
+
+
+dl {
+  margin-bottom: 1.5em; }
+
+dt {
+  margin-bottom: -0.5em;
+  margin-left: 0.0em; }
+
+dd {
+  margin-left: 2.0em;
+  margin-bottom: 3.0em;
+  margin-top: 0.5em; }
+
+
+hr {
+  margin: 2em 0;
+  border: 0;
+  border-top: 1px solid #aaa; }
+
+blockquote {
+  font-size: 0.9em;
+  font-style: italic;
+  padding-left: 0.5em;
+  margin-left: 0;
+  border-left: 5px solid #bbc;
+}
+
+.pre {
+  font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-weight: 500;
+  font-size: 0.85em;
+  color: var(--text);
+  background-color: var(--third-background);
+  padding-left: 3px;
+  padding-right: 3px;
+  border-radius: 4px;
+}
+
+pre {
+  font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+  color: var(--text);
+  font-weight: 500;
+  display: inline-block;
+  box-sizing: border-box;
+  min-width: 100%;
+  padding: 0.5em;
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+  font-size: 0.85em;
+  white-space: pre !important;
+  overflow-y: hidden;
+  overflow-x: visible;
+  background-color: var(--secondary-background);
+  border: 1px solid var(--border);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px; }
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll; }
+
+
+/* Nim line-numbered tables */
+.line-nums-table {
+  width: 100%;
+  table-layout: fixed; }
+
+table.line-nums-table {
+  border-radius: 4px;
+  border: 1px solid #cccccc;
+  background-color: ghostwhite;
+  border-collapse: separate;
+  margin-top: 15px;
+  margin-bottom: 25px; }
+
+.line-nums-table tbody {
+  border: none; }
+
+.line-nums-table td pre {
+  border: none;
+  background-color: transparent; }
+
+.line-nums-table td.blob-line-nums {
+  width: 28px; }
+
+.line-nums-table td.blob-line-nums pre {
+  color: #b0b0b0;
+  -webkit-filter: opacity(75%);
+  text-align: right;
+  border-color: transparent;
+  background-color: transparent;
+  padding-left: 0px;
+  margin-left: 0px;
+  padding-right: 0px;
+  margin-right: 0px; }
+
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  margin-top: 0.5em;
+  margin-bottom: 1.5em;
+  border-collapse: collapse;
+  border-color: var(--third-background);
+  border-spacing: 0;
+  font-size: 0.9em;
+}
+
+table th, table td {
+  padding: 0px 0.5em 0px;
+  border-color: var(--third-background);
+}
+
+table th {
+  background-color: var(--third-background);
+  border-color: var(--third-background);
+  font-weight: bold; }
+
+table th.docinfo-name {
+    background-color: transparent;
+}
+
+table tr:hover {
+  background-color: var(--third-background); }
+
+
+/* rst2html default used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0; }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 !important; }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 !important; }
+
+.last, .with-subtitle {
+  margin-bottom: 0 !important; }
+
+.hidden {
+  display: none; }
+
+blockquote.epigraph {
+  margin: 2em 5em; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em; }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden; }
+
+
+div.figure {
+  margin-left: 2em;
+  margin-right: 2em; }
+
+div.footer, div.header {
+  clear: both;
+  text-align: center;
+  color: #666;
+  font-size: smaller; }
+
+div.footer {
+    padding-top: 5em;
+}
+
+div.line-block {
+  display: block;
+  margin-top: 1em;
+  margin-bottom: 1em; }
+
+div.line-block div.line-block {
+  margin-top: 0;
+  margin-bottom: 0;
+  margin-left: 1.5em; }
+
+div.topic {
+  margin: 2em; }
+
+div.search_results {
+  background-color: antiquewhite;
+  margin: 3em;
+  padding: 1em;
+  border: 1px solid #4d4d4d;
+}
+
+div#global-links ul {
+  margin-left: 0;
+  list-style-type: none;
+}
+
+div#global-links > simple-boot {
+    margin-left: 3em;
+}
+
+hr.docutils {
+  width: 75%; }
+
+img.align-left, .figure.align-left, object.align-left {
+  clear: left;
+  float: left;
+  margin-right: 1em; }
+
+img.align-right, .figure.align-right, object.align-right {
+  clear: right;
+  float: right;
+  margin-left: 1em; }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto; }
+
+.align-left {
+  text-align: left; }
+
+.align-center {
+  clear: both;
+  text-align: center; }
+
+.align-right {
+  text-align: right; }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit; }
+
+p.attribution {
+  text-align: right;
+  margin-left: 50%; }
+
+p.caption {
+  font-style: italic; }
+
+p.credits {
+  font-style: italic;
+  font-size: smaller; }
+
+p.label {
+  white-space: nowrap; }
+
+p.rubric {
+  font-weight: bold;
+  font-size: larger;
+  color: maroon;
+  text-align: center; }
+
+p.topic-title {
+  font-weight: bold; }
+
+pre.address {
+  margin-bottom: 0;
+  margin-top: 0;
+  font: inherit; }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em;
+  margin-right: 2em; }
+
+pre.code .ln {
+  color: grey; }
+
+/* line numbers */
+pre.code, code {
+  background-color: #eeeeee; }
+
+pre.code .comment, code .comment {
+  color: #5c6576; }
+
+pre.code .keyword, code .keyword {
+  color: #3B0D06;
+  font-weight: bold; }
+
+pre.code .literal.string, code .literal.string {
+  color: #0c5404; }
+
+pre.code .name.builtin, code .name.builtin {
+  color: #352b84; }
+
+pre.code .deleted, code .deleted {
+  background-color: #DEB0A1; }
+
+pre.code .inserted, code .inserted {
+  background-color: #A3D289; }
+
+span.classifier {
+  font-style: oblique; }
+
+span.classifier-delimiter {
+  font-weight: bold; }
+
+span.option {
+  white-space: nowrap; }
+
+span.problematic {
+  color: #b30000; }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80%; }
+
+span.DecNumber {
+  color: var(--number); }
+
+span.BinNumber {
+  color: var(--number); }
+
+span.HexNumber {
+  color: var(--number); }
+
+span.OctNumber {
+  color: var(--number); }
+
+span.FloatNumber {
+  color: var(--number); }
+
+span.Identifier {
+  color: var(--identifier); }
+
+span.Keyword {
+  font-weight: 600;
+  color: var(--keyword); }
+
+span.StringLit {
+  color: var(--literal); }
+
+span.LongStringLit {
+  color: var(--literal); }
+
+span.CharLit {
+  color: var(--literal); }
+
+span.EscapeSequence {
+  color: var(--escapeSequence); }
+
+span.Operator {
+  color: var(--operator); }
+
+span.Punctuation {
+  color: var(--punctuation); }
+
+span.Comment, span.LongComment {
+  font-style: italic;
+  font-weight: 400;
+  color: var(--comment); }
+
+span.RegularExpression {
+  color: darkviolet; }
+
+span.TagStart {
+  color: darkviolet; }
+
+span.TagEnd {
+  color: darkviolet; }
+
+span.Key {
+  color: #252dbe; }
+
+span.Value {
+  color: #252dbe; }
+
+span.RawData {
+  color: var(--raw-data); }
+
+span.Assembler {
+  color: #252dbe; }
+
+span.Preprocessor {
+  color: #252dbe; }
+
+span.Directive {
+  color: #252dbe; }
+
+span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference,
+span.Other {
+  color: var(--other); }
+
+/* Pop type, const, proc, and iterator defs in nim def blocks */
+dt pre > span.Identifier, dt pre > span.Operator {
+  color: var(--identifier);
+  font-weight: 700; }
+
+dt pre > span.Keyword ~ span.Identifier, dt pre > span.Identifier ~ span.Identifier,
+dt pre > span.Operator ~ span.Identifier, dt pre > span.Other ~ span.Identifier {
+  color: var(--identifier);
+  font-weight: inherit; }
+
+/* Nim sprite for the footer (taken from main page favicon) */
+.nim-sprite {
+  display: inline-block;
+  width: 51px;
+  height: 14px;
+  background-position: 0 0;
+  background-size: 51px 14px;
+  -webkit-filter: opacity(50%);
+  background-repeat: no-repeat;
+  background-image: var(--nim-sprite-base64);
+  margin-bottom: 5px; }
+
+span.pragmadots {
+  /* Position: relative frees us up to make the dots
+  look really nice without fucking up the layout and
+  causing bulging in the parent container */
+  position: relative;
+  /* 1px down looks slightly nicer */
+  top: 1px;
+  padding: 2px;
+  background-color: var(--third-background);
+  border-radius: 4px;
+  margin: 0 2px;
+  cursor: pointer;
+  font-size: 0.8em;
+}
+
+span.pragmadots:hover {
+  background-color: var(--hint);
+}
+span.pragmawrap {
+  display: none;
+}
+
+span.attachedType {
+  display: none;
+  visibility: hidden;
+}
\ No newline at end of file
diff --git a/docs/regex/nodematch.html b/docs/regex/nodematch.html
new file mode 100644
index 0000000..822535c
--- /dev/null
+++ b/docs/regex/nodematch.html
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nodematch</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nodematch</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">swapCase
+      <li><a class="reference" href="#swapCase%2CRune"
+    title="swapCase(r: Rune): Rune">swapCase,<wbr>Rune</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">match
+      <li><a class="reference" href="#match%2CNode%2CRune%2CRune"
+    title="match(n: Node; r: Rune; nxt: Rune): bool">match,<wbr>Node,<wbr>Rune,<wbr>Rune</a></li>
+  <li><a class="reference" href="#match%2CNode%2CRune"
+    title="match(n: Node; r: Rune): bool">match,<wbr>Node,<wbr>Rune</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>, <a class="reference external" href="common.html">common</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="match,Node,Rune,Rune"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#match%2CNode%2CRune%2CRune"><span class="Identifier">match</span></a><span class="Other">(</span><span class="Identifier">n</span><span class="Other">:</span> <a href="types.html#Node"><span class="Identifier">Node</span></a><span class="Other">;</span> <span class="Identifier">r</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">;</span> <span class="Identifier">nxt</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+match for <tt class="docutils literal"><span class="pre">Node</span></tt> of assertion kind. Return whether the node matches the current characters or not
+
+</dd>
+<a id="swapCase,Rune"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#swapCase%2CRune"><span class="Identifier">swapCase</span></a><span class="Other">(</span><span class="Identifier">r</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Rune</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="match,Node,Rune"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#match%2CNode%2CRune"><span class="Identifier">match</span></a><span class="Other">(</span><span class="Identifier">n</span><span class="Other">:</span> <a href="types.html#Node"><span class="Identifier">Node</span></a><span class="Other">;</span> <span class="Identifier">r</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">inline</span><span class="Other">,</span> <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+match for <tt class="docutils literal"><span class="pre">Node</span></tt> of matchable kind. Return whether the node matches the current character or not
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nodematch.idx b/docs/regex/nodematch.idx
new file mode 100644
index 0000000..4304fe4
--- /dev/null
+++ b/docs/regex/nodematch.idx
@@ -0,0 +1,3 @@
+match	regex/nodematch.html#match,Node,Rune,Rune	nodematch: match(n: Node; r: Rune; nxt: Rune): bool	
+swapCase	regex/nodematch.html#swapCase,Rune	nodematch: swapCase(r: Rune): Rune	
+match	regex/nodematch.html#match,Node,Rune	nodematch: match(n: Node; r: Rune): bool	
diff --git a/docs/regex/nodetype.html b/docs/regex/nodetype.html
new file mode 100644
index 0000000..fe4307c
--- /dev/null
+++ b/docs/regex/nodetype.html
@@ -0,0 +1,443 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/nodetype</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/nodetype</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#Flag"
+    title="Flag = enum
+  flagCaseInsensitive, flagNotCaseInsensitive, flagMultiLine, flagNotMultiLine,
+  flagAnyMatchNewLine, flagNotAnyMatchNewLine, flagUnGreedy, flagNotUnGreedy,
+  flagUnicode, flagNotUnicode, flagVerbose, flagNotVerbose">Flag</a></li>
+  <li><a class="reference" href="#NodeKind"
+    title="NodeKind = enum
+  reChar, reCharCi, reJoiner, reGroupStart, reGroupEnd, reOr, reZeroOrMore,
+  reOneOrMore, reZeroOrOne, reRepRange, reStartSym, reEndSym, reStartSymML,
+  reEndSymML, reStart, reEnd, reWordBoundary, reNotWordBoundary, reWord,
+  reDigit, reWhiteSpace, reUCC, reNotAlphaNum, reNotDigit, reNotWhiteSpace,
+  reNotUCC, reAny, reAnyNl, reWordBoundaryAscii, reNotWordBoundaryAscii,
+  reWordAscii, reDigitAscii, reWhiteSpaceAscii, reNotAlphaNumAscii,
+  reNotDigitAscii, reNotWhiteSpaceAscii, reAnyAscii, reAnyNlAscii, reInSet,
+  reNotSet, reLookahead, reLookbehind, reNotLookahead, reNotLookbehind, reSkip,
+  reEoe">NodeKind</a></li>
+  <li><a class="reference" href="#NodeUid"
+    title="NodeUid = int16">NodeUid</a></li>
+  <li><a class="reference" href="#Node"
+    title="Node = object
+  kind*: NodeKind
+  cp*: Rune
+  next*: seq[int16]
+  isGreedy*: bool
+  uid*: NodeUid
+  idx*: int16
+  isCapturing*: bool
+  name*: string
+  flags*: seq[Flag]
+  min*, max*: int16
+  cps*: HashSet[Rune]
+  ranges*: seq[Slice[Rune]]
+  shorthands*: seq[Node]
+  cc*: UnicodeCategorySet">Node</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#10" id="60">Consts</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#opKind"
+    title="opKind = {reJoiner, reOr, reZeroOrMore, reOneOrMore, reZeroOrOne, reRepRange}">opKind</a></li>
+  <li><a class="reference" href="#assertionKind"
+    title="assertionKind = {reStartSym, reEndSym, reStartSymML, reEndSymML, reStart, reEnd,
+                 reWordBoundary, reNotWordBoundary, reWordBoundaryAscii,
+                 reNotWordBoundaryAscii, reLookahead, reLookbehind,
+                 reNotLookahead, reNotLookbehind}">assertionKind</a></li>
+  <li><a class="reference" href="#shorthandKind"
+    title="shorthandKind = {reWord, reDigit, reWhiteSpace, reUCC, reNotAlphaNum,
+                 reNotDigit, reNotWhiteSpace, reNotUCC, reWordAscii,
+                 reDigitAscii, reWhiteSpaceAscii, reNotAlphaNumAscii,
+                 reNotDigitAscii, reNotWhiteSpaceAscii}">shorthandKind</a></li>
+  <li><a class="reference" href="#matchableKind"
+    title="matchableKind = {reChar, reCharCi, reWord, reDigit, reWhiteSpace, reUCC,
+                 reNotAlphaNum, reNotDigit, reNotWhiteSpace, reNotUCC, reAny,
+                 reAnyNl, reInSet, reNotSet, reWordAscii, reDigitAscii,
+                 reWhiteSpaceAscii, reNotAlphaNumAscii, reNotDigitAscii,
+                 reNotWhiteSpaceAscii, reAnyAscii, reAnyNlAscii}">matchableKind</a></li>
+  <li><a class="reference" href="#repetitionKind"
+    title="repetitionKind = {reZeroOrMore, reOneOrMore, reRepRange}">repetitionKind</a></li>
+  <li><a class="reference" href="#groupKind"
+    title="groupKind = {reGroupStart, reGroupEnd}">groupKind</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#13" id="63">Funcs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">initNotSetNode
+      <li><a class="reference" href="#initNotSetNode"
+    title="initNotSetNode(): Node">initNotSetNode</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">initEoeNode
+      <li><a class="reference" href="#initEoeNode"
+    title="initEoeNode(): Node">initEoeNode</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">initSkipNode
+      <li><a class="reference" href="#initSkipNode%2CopenArray%5Bint16%5D"
+    title="initSkipNode(next: openArray[int16]): Node">initSkipNode,<wbr>openArray[int16]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">initGroupStart
+      <li><a class="reference" href="#initGroupStart%2Cstring%2Cseq%5BFlag%5D"
+    title="initGroupStart(name: string = &quot;&quot;; flags: seq[Flag] = @[]; isCapturing = true): Node">initGroupStart,<wbr>string,<wbr>seq[Flag]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">initJoinerNode
+      <li><a class="reference" href="#initJoinerNode"
+    title="initJoinerNode(): Node">initJoinerNode</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">initSetNode
+      <li><a class="reference" href="#initSetNode"
+    title="initSetNode(): Node">initSetNode</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">toString
+      <li><a class="reference" href="#toString%2CNode"
+    title="toString(n: Node): string">toString,<wbr>Node</a></li>
+  <li><a class="reference" href="#toString%2Cseq%5BNode%5D"
+    title="toString(n: seq[Node]): string">toString,<wbr>seq[Node]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">isEmpty
+      <li><a class="reference" href="#isEmpty%2CNode"
+    title="isEmpty(n: Node): bool">isEmpty,<wbr>Node</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">toCharNode
+      <li><a class="reference" href="#toCharNode%2CRune"
+    title="toCharNode(r: Rune): Node">toCharNode,<wbr>Rune</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="common.html">common</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="Flag"></a>
+<dt><pre><a href="nodetype.html#Flag"><span class="Identifier">Flag</span></a> <span class="Other">=</span> <span class="Keyword">enum</span>
+  <span class="Identifier">flagCaseInsensitive</span><span class="Other">,</span> <span class="Identifier">flagNotCaseInsensitive</span><span class="Other">,</span> <span class="Identifier">flagMultiLine</span><span class="Other">,</span> <span class="Identifier">flagNotMultiLine</span><span class="Other">,</span>
+  <span class="Identifier">flagAnyMatchNewLine</span><span class="Other">,</span> <span class="Identifier">flagNotAnyMatchNewLine</span><span class="Other">,</span> <span class="Identifier">flagUnGreedy</span><span class="Other">,</span> <span class="Identifier">flagNotUnGreedy</span><span class="Other">,</span>
+  <span class="Identifier">flagUnicode</span><span class="Other">,</span> <span class="Identifier">flagNotUnicode</span><span class="Other">,</span> <span class="Identifier">flagVerbose</span><span class="Other">,</span> <span class="Identifier">flagNotVerbose</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="NodeKind"></a>
+<dt><pre><a href="nodetype.html#NodeKind"><span class="Identifier">NodeKind</span></a> <span class="Other">=</span> <span class="Keyword">enum</span>
+  <span class="Identifier">reChar</span><span class="Other">,</span> <span class="Identifier">reCharCi</span><span class="Other">,</span> <span class="Identifier">reJoiner</span><span class="Other">,</span> <span class="Identifier">reGroupStart</span><span class="Other">,</span> <span class="Identifier">reGroupEnd</span><span class="Other">,</span> <span class="Identifier">reOr</span><span class="Other">,</span> <span class="Identifier">reZeroOrMore</span><span class="Other">,</span>
+  <span class="Identifier">reOneOrMore</span><span class="Other">,</span> <span class="Identifier">reZeroOrOne</span><span class="Other">,</span> <span class="Identifier">reRepRange</span><span class="Other">,</span> <span class="Identifier">reStartSym</span><span class="Other">,</span> <span class="Identifier">reEndSym</span><span class="Other">,</span> <span class="Identifier">reStartSymML</span><span class="Other">,</span>
+  <span class="Identifier">reEndSymML</span><span class="Other">,</span> <span class="Identifier">reStart</span><span class="Other">,</span> <span class="Identifier">reEnd</span><span class="Other">,</span> <span class="Identifier">reWordBoundary</span><span class="Other">,</span> <span class="Identifier">reNotWordBoundary</span><span class="Other">,</span> <span class="Identifier">reWord</span><span class="Other">,</span>
+  <span class="Identifier">reDigit</span><span class="Other">,</span> <span class="Identifier">reWhiteSpace</span><span class="Other">,</span> <span class="Identifier">reUCC</span><span class="Other">,</span> <span class="Identifier">reNotAlphaNum</span><span class="Other">,</span> <span class="Identifier">reNotDigit</span><span class="Other">,</span> <span class="Identifier">reNotWhiteSpace</span><span class="Other">,</span>
+  <span class="Identifier">reNotUCC</span><span class="Other">,</span> <span class="Identifier">reAny</span><span class="Other">,</span> <span class="Identifier">reAnyNl</span><span class="Other">,</span> <span class="Identifier">reWordBoundaryAscii</span><span class="Other">,</span> <span class="Identifier">reNotWordBoundaryAscii</span><span class="Other">,</span>
+  <span class="Identifier">reWordAscii</span><span class="Other">,</span> <span class="Identifier">reDigitAscii</span><span class="Other">,</span> <span class="Identifier">reWhiteSpaceAscii</span><span class="Other">,</span> <span class="Identifier">reNotAlphaNumAscii</span><span class="Other">,</span>
+  <span class="Identifier">reNotDigitAscii</span><span class="Other">,</span> <span class="Identifier">reNotWhiteSpaceAscii</span><span class="Other">,</span> <span class="Identifier">reAnyAscii</span><span class="Other">,</span> <span class="Identifier">reAnyNlAscii</span><span class="Other">,</span> <span class="Identifier">reInSet</span><span class="Other">,</span>
+  <span class="Identifier">reNotSet</span><span class="Other">,</span> <span class="Identifier">reLookahead</span><span class="Other">,</span> <span class="Identifier">reLookbehind</span><span class="Other">,</span> <span class="Identifier">reNotLookahead</span><span class="Other">,</span> <span class="Identifier">reNotLookbehind</span><span class="Other">,</span> <span class="Identifier">reSkip</span><span class="Other">,</span>
+  <span class="Identifier">reEoe</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="NodeUid"></a>
+<dt><pre><a href="nodetype.html#NodeUid"><span class="Identifier">NodeUid</span></a> <span class="Other">=</span> <span class="Identifier">int16</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="Node"></a>
+<dt><pre><a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span class="Other">=</span> <span class="Keyword">object</span>
+  <span class="Identifier">kind</span><span class="Operator">*</span><span class="Other">:</span> <a href="nodetype.html#NodeKind"><span class="Identifier">NodeKind</span></a>
+  <span class="Identifier">cp</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">Rune</span>
+  <span class="Identifier">next</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">int16</span><span class="Other">]</span>
+  <span class="Identifier">isGreedy</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">bool</span>
+  <span class="Identifier">uid</span><span class="Operator">*</span><span class="Other">:</span> <a href="nodetype.html#NodeUid"><span class="Identifier">NodeUid</span></a>
+  <span class="Identifier">idx</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int16</span>
+  <span class="Identifier">isCapturing</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">bool</span>
+  <span class="Identifier">name</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">string</span>
+  <span class="Identifier">flags</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nodetype.html#Flag"><span class="Identifier">Flag</span></a><span class="Other">]</span>
+  <span class="Identifier">min</span><span class="Operator">*</span><span class="Other">,</span> <span class="Identifier">max</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int16</span>
+  <span class="Identifier">cps</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">HashSet</span><span class="Other">[</span><span class="Identifier">Rune</span><span class="Other">]</span>
+  <span class="Identifier">ranges</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">Slice</span><span class="Other">[</span><span class="Identifier">Rune</span><span class="Other">]</span><span class="Other">]</span>
+  <span class="Identifier">shorthands</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nodetype.html#Node"><span class="Identifier">Node</span></a><span class="Other">]</span>
+  <span class="Identifier">cc</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">UnicodeCategorySet</span>
+</pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="10">
+<h1><a class="toc-backref" href="#10">Consts</a></h1>
+<dl class="item">
+<a id="opKind"></a>
+<dt><pre><a href="nodetype.html#opKind"><span class="Identifier">opKind</span></a> <span class="Other">=</span> <span class="Other">{</span><span class="DecNumber">reJoiner</span><span class="Other">,</span> <span class="DecNumber">reOr</span><span class="Other">,</span> <span class="DecNumber">reZeroOrMore</span><span class="Other">,</span> <span class="DecNumber">reOneOrMore</span><span class="Other">,</span> <span class="DecNumber">reZeroOrOne</span><span class="Other">,</span> <span class="DecNumber">reRepRange</span><span class="Other">}</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="assertionKind"></a>
+<dt><pre><a href="nodetype.html#assertionKind"><span class="Identifier">assertionKind</span></a> <span class="Other">=</span> <span class="Other">{</span><span class="DecNumber">reStartSym</span><span class="Other">,</span> <span class="DecNumber">reEndSym</span><span class="Other">,</span> <span class="DecNumber">reStartSymML</span><span class="Other">,</span> <span class="DecNumber">reEndSymML</span><span class="Other">,</span> <span class="DecNumber">reStart</span><span class="Other">,</span> <span class="DecNumber">reEnd</span><span class="Other">,</span>
+                 <span class="DecNumber">reWordBoundary</span><span class="Other">,</span> <span class="DecNumber">reNotWordBoundary</span><span class="Other">,</span> <span class="DecNumber">reWordBoundaryAscii</span><span class="Other">,</span>
+                 <span class="DecNumber">reNotWordBoundaryAscii</span><span class="Other">,</span> <span class="DecNumber">reLookahead</span><span class="Other">,</span> <span class="DecNumber">reLookbehind</span><span class="Other">,</span>
+                 <span class="DecNumber">reNotLookahead</span><span class="Other">,</span> <span class="DecNumber">reNotLookbehind</span><span class="Other">}</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="shorthandKind"></a>
+<dt><pre><a href="nodetype.html#shorthandKind"><span class="Identifier">shorthandKind</span></a> <span class="Other">=</span> <span class="Other">{</span><span class="DecNumber">reWord</span><span class="Other">,</span> <span class="DecNumber">reDigit</span><span class="Other">,</span> <span class="DecNumber">reWhiteSpace</span><span class="Other">,</span> <span class="DecNumber">reUCC</span><span class="Other">,</span> <span class="DecNumber">reNotAlphaNum</span><span class="Other">,</span>
+                 <span class="DecNumber">reNotDigit</span><span class="Other">,</span> <span class="DecNumber">reNotWhiteSpace</span><span class="Other">,</span> <span class="DecNumber">reNotUCC</span><span class="Other">,</span> <span class="DecNumber">reWordAscii</span><span class="Other">,</span>
+                 <span class="DecNumber">reDigitAscii</span><span class="Other">,</span> <span class="DecNumber">reWhiteSpaceAscii</span><span class="Other">,</span> <span class="DecNumber">reNotAlphaNumAscii</span><span class="Other">,</span>
+                 <span class="DecNumber">reNotDigitAscii</span><span class="Other">,</span> <span class="DecNumber">reNotWhiteSpaceAscii</span><span class="Other">}</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="matchableKind"></a>
+<dt><pre><a href="nodetype.html#matchableKind"><span class="Identifier">matchableKind</span></a> <span class="Other">=</span> <span class="Other">{</span><span class="DecNumber">reChar</span><span class="Other">,</span> <span class="DecNumber">reCharCi</span><span class="Other">,</span> <span class="DecNumber">reWord</span><span class="Other">,</span> <span class="DecNumber">reDigit</span><span class="Other">,</span> <span class="DecNumber">reWhiteSpace</span><span class="Other">,</span> <span class="DecNumber">reUCC</span><span class="Other">,</span>
+                 <span class="DecNumber">reNotAlphaNum</span><span class="Other">,</span> <span class="DecNumber">reNotDigit</span><span class="Other">,</span> <span class="DecNumber">reNotWhiteSpace</span><span class="Other">,</span> <span class="DecNumber">reNotUCC</span><span class="Other">,</span> <span class="DecNumber">reAny</span><span class="Other">,</span>
+                 <span class="DecNumber">reAnyNl</span><span class="Other">,</span> <span class="DecNumber">reInSet</span><span class="Other">,</span> <span class="DecNumber">reNotSet</span><span class="Other">,</span> <span class="DecNumber">reWordAscii</span><span class="Other">,</span> <span class="DecNumber">reDigitAscii</span><span class="Other">,</span>
+                 <span class="DecNumber">reWhiteSpaceAscii</span><span class="Other">,</span> <span class="DecNumber">reNotAlphaNumAscii</span><span class="Other">,</span> <span class="DecNumber">reNotDigitAscii</span><span class="Other">,</span>
+                 <span class="DecNumber">reNotWhiteSpaceAscii</span><span class="Other">,</span> <span class="DecNumber">reAnyAscii</span><span class="Other">,</span> <span class="DecNumber">reAnyNlAscii</span><span class="Other">}</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="repetitionKind"></a>
+<dt><pre><a href="nodetype.html#repetitionKind"><span class="Identifier">repetitionKind</span></a> <span class="Other">=</span> <span class="Other">{</span><span class="DecNumber">reZeroOrMore</span><span class="Other">,</span> <span class="DecNumber">reOneOrMore</span><span class="Other">,</span> <span class="DecNumber">reRepRange</span><span class="Other">}</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="groupKind"></a>
+<dt><pre><a href="nodetype.html#groupKind"><span class="Identifier">groupKind</span></a> <span class="Other">=</span> <span class="Other">{</span><span class="DecNumber">reGroupStart</span><span class="Other">,</span> <span class="DecNumber">reGroupEnd</span><span class="Other">}</span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+<div class="section" id="13">
+<h1><a class="toc-backref" href="#13">Funcs</a></h1>
+<dl class="item">
+<a id="toCharNode,Rune"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#toCharNode%2CRune"><span class="Identifier">toCharNode</span></a><span class="Other">(</span><span class="Identifier">r</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return a <tt class="docutils literal"><span class="pre">Node</span></tt> that is meant to be matched against text characters
+
+</dd>
+<a id="initJoinerNode"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#initJoinerNode"><span class="Identifier">initJoinerNode</span></a><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return a <tt class="docutils literal"><span class="pre">Node</span></tt> of <tt class="docutils literal"><span class="pre">reJoiner</span></tt> kind. Joiners are temporary nodes, they serve to generate the NFA but they are never part of it
+
+</dd>
+<a id="initEoeNode"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#initEoeNode"><span class="Identifier">initEoeNode</span></a><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return the end-of-expression <tt class="docutils literal"><span class="pre">Node</span></tt>. This is a dummy node that marks a match as successful
+
+</dd>
+<a id="initSetNode"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#initSetNode"><span class="Identifier">initSetNode</span></a><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return a set <tt class="docutils literal"><span class="pre">Node</span></tt>, parsed from an expression such as <tt class="docutils literal"><span class="pre">[a-z]</span></tt>
+
+</dd>
+<a id="initNotSetNode"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#initNotSetNode"><span class="Identifier">initNotSetNode</span></a><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return a negated set <tt class="docutils literal"><span class="pre">Node</span></tt>, parsed from an expression such as <tt class="docutils literal"><span class="pre">[^a-z]</span></tt>
+
+</dd>
+<a id="initGroupStart,string,seq[Flag]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#initGroupStart%2Cstring%2Cseq%5BFlag%5D"><span class="Identifier">initGroupStart</span></a><span class="Other">(</span><span class="Identifier">name</span><span class="Other">:</span> <span class="Identifier">string</span> <span class="Other">=</span> <span class="StringLit">&quot;&quot;</span><span class="Other">;</span> <span class="Identifier">flags</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nodetype.html#Flag"><span class="Identifier">Flag</span></a><span class="Other">]</span> <span class="Other">=</span> <span class="Operator">@</span><span class="Other">[</span><span class="Other">]</span><span class="Other">;</span>
+                    <span class="Identifier">isCapturing</span> <span class="Other">=</span> <span class="Identifier">true</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return a <tt class="docutils literal"><span class="pre">reGroupStart</span></tt> node
+
+</dd>
+<a id="initSkipNode,openArray[int16]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#initSkipNode%2CopenArray%5Bint16%5D"><span class="Identifier">initSkipNode</span></a><span class="Other">(</span><span class="Identifier">next</span><span class="Other">:</span> <span class="Identifier">openArray</span><span class="Other">[</span><span class="Identifier">int16</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+Return a dummy node that should be skipped while traversing the NFA
+
+</dd>
+<a id="isEmpty,Node"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#isEmpty%2CNode"><span class="Identifier">isEmpty</span></a><span class="Other">(</span><span class="Identifier">n</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+check if a set <tt class="docutils literal"><span class="pre">Node</span></tt> is empty
+
+</dd>
+<a id="toString,Node"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#toString%2CNode"><span class="Identifier">toString</span></a><span class="Other">(</span><span class="Identifier">n</span><span class="Other">:</span> <a href="nodetype.html#Node"><span class="Identifier">Node</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return the string representation of a <tt class="docutils literal"><span class="pre">Node</span></tt>. The string is always equivalent to the original expression but not necessarily equal
+
+</dd>
+<a id="toString,seq[Node]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#toString%2Cseq%5BNode%5D"><span class="Identifier">toString</span></a><span class="Other">(</span><span class="Identifier">n</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><a href="nodetype.html#Node"><span class="Identifier">Node</span></a><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2020-11-22 06:24:09 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/nodetype.idx b/docs/regex/nodetype.idx
new file mode 100644
index 0000000..0e94f5e
--- /dev/null
+++ b/docs/regex/nodetype.idx
@@ -0,0 +1,78 @@
+flagCaseInsensitive	regex/nodetype.html#flagCaseInsensitive	Flag.flagCaseInsensitive	
+flagNotCaseInsensitive	regex/nodetype.html#flagNotCaseInsensitive	Flag.flagNotCaseInsensitive	
+flagMultiLine	regex/nodetype.html#flagMultiLine	Flag.flagMultiLine	
+flagNotMultiLine	regex/nodetype.html#flagNotMultiLine	Flag.flagNotMultiLine	
+flagAnyMatchNewLine	regex/nodetype.html#flagAnyMatchNewLine	Flag.flagAnyMatchNewLine	
+flagNotAnyMatchNewLine	regex/nodetype.html#flagNotAnyMatchNewLine	Flag.flagNotAnyMatchNewLine	
+flagUnGreedy	regex/nodetype.html#flagUnGreedy	Flag.flagUnGreedy	
+flagNotUnGreedy	regex/nodetype.html#flagNotUnGreedy	Flag.flagNotUnGreedy	
+flagUnicode	regex/nodetype.html#flagUnicode	Flag.flagUnicode	
+flagNotUnicode	regex/nodetype.html#flagNotUnicode	Flag.flagNotUnicode	
+flagVerbose	regex/nodetype.html#flagVerbose	Flag.flagVerbose	
+flagNotVerbose	regex/nodetype.html#flagNotVerbose	Flag.flagNotVerbose	
+Flag	regex/nodetype.html#Flag	nodetype: Flag	
+reChar	regex/nodetype.html#reChar	NodeKind.reChar	
+reCharCi	regex/nodetype.html#reCharCi	NodeKind.reCharCi	
+reJoiner	regex/nodetype.html#reJoiner	NodeKind.reJoiner	
+reGroupStart	regex/nodetype.html#reGroupStart	NodeKind.reGroupStart	
+reGroupEnd	regex/nodetype.html#reGroupEnd	NodeKind.reGroupEnd	
+reOr	regex/nodetype.html#reOr	NodeKind.reOr	
+reZeroOrMore	regex/nodetype.html#reZeroOrMore	NodeKind.reZeroOrMore	
+reOneOrMore	regex/nodetype.html#reOneOrMore	NodeKind.reOneOrMore	
+reZeroOrOne	regex/nodetype.html#reZeroOrOne	NodeKind.reZeroOrOne	
+reRepRange	regex/nodetype.html#reRepRange	NodeKind.reRepRange	
+reStartSym	regex/nodetype.html#reStartSym	NodeKind.reStartSym	
+reEndSym	regex/nodetype.html#reEndSym	NodeKind.reEndSym	
+reStartSymML	regex/nodetype.html#reStartSymML	NodeKind.reStartSymML	
+reEndSymML	regex/nodetype.html#reEndSymML	NodeKind.reEndSymML	
+reStart	regex/nodetype.html#reStart	NodeKind.reStart	
+reEnd	regex/nodetype.html#reEnd	NodeKind.reEnd	
+reWordBoundary	regex/nodetype.html#reWordBoundary	NodeKind.reWordBoundary	
+reNotWordBoundary	regex/nodetype.html#reNotWordBoundary	NodeKind.reNotWordBoundary	
+reWord	regex/nodetype.html#reWord	NodeKind.reWord	
+reDigit	regex/nodetype.html#reDigit	NodeKind.reDigit	
+reWhiteSpace	regex/nodetype.html#reWhiteSpace	NodeKind.reWhiteSpace	
+reUCC	regex/nodetype.html#reUCC	NodeKind.reUCC	
+reNotAlphaNum	regex/nodetype.html#reNotAlphaNum	NodeKind.reNotAlphaNum	
+reNotDigit	regex/nodetype.html#reNotDigit	NodeKind.reNotDigit	
+reNotWhiteSpace	regex/nodetype.html#reNotWhiteSpace	NodeKind.reNotWhiteSpace	
+reNotUCC	regex/nodetype.html#reNotUCC	NodeKind.reNotUCC	
+reAny	regex/nodetype.html#reAny	NodeKind.reAny	
+reAnyNl	regex/nodetype.html#reAnyNl	NodeKind.reAnyNl	
+reWordBoundaryAscii	regex/nodetype.html#reWordBoundaryAscii	NodeKind.reWordBoundaryAscii	
+reNotWordBoundaryAscii	regex/nodetype.html#reNotWordBoundaryAscii	NodeKind.reNotWordBoundaryAscii	
+reWordAscii	regex/nodetype.html#reWordAscii	NodeKind.reWordAscii	
+reDigitAscii	regex/nodetype.html#reDigitAscii	NodeKind.reDigitAscii	
+reWhiteSpaceAscii	regex/nodetype.html#reWhiteSpaceAscii	NodeKind.reWhiteSpaceAscii	
+reNotAlphaNumAscii	regex/nodetype.html#reNotAlphaNumAscii	NodeKind.reNotAlphaNumAscii	
+reNotDigitAscii	regex/nodetype.html#reNotDigitAscii	NodeKind.reNotDigitAscii	
+reNotWhiteSpaceAscii	regex/nodetype.html#reNotWhiteSpaceAscii	NodeKind.reNotWhiteSpaceAscii	
+reAnyAscii	regex/nodetype.html#reAnyAscii	NodeKind.reAnyAscii	
+reAnyNlAscii	regex/nodetype.html#reAnyNlAscii	NodeKind.reAnyNlAscii	
+reInSet	regex/nodetype.html#reInSet	NodeKind.reInSet	
+reNotSet	regex/nodetype.html#reNotSet	NodeKind.reNotSet	
+reLookahead	regex/nodetype.html#reLookahead	NodeKind.reLookahead	
+reLookbehind	regex/nodetype.html#reLookbehind	NodeKind.reLookbehind	
+reNotLookahead	regex/nodetype.html#reNotLookahead	NodeKind.reNotLookahead	
+reNotLookbehind	regex/nodetype.html#reNotLookbehind	NodeKind.reNotLookbehind	
+reSkip	regex/nodetype.html#reSkip	NodeKind.reSkip	
+reEoe	regex/nodetype.html#reEoe	NodeKind.reEoe	
+NodeKind	regex/nodetype.html#NodeKind	nodetype: NodeKind	
+NodeUid	regex/nodetype.html#NodeUid	nodetype: NodeUid	
+Node	regex/nodetype.html#Node	nodetype: Node	
+toCharNode	regex/nodetype.html#toCharNode,Rune	nodetype: toCharNode(r: Rune): Node	
+initJoinerNode	regex/nodetype.html#initJoinerNode	nodetype: initJoinerNode(): Node	
+initEoeNode	regex/nodetype.html#initEoeNode	nodetype: initEoeNode(): Node	
+initSetNode	regex/nodetype.html#initSetNode	nodetype: initSetNode(): Node	
+initNotSetNode	regex/nodetype.html#initNotSetNode	nodetype: initNotSetNode(): Node	
+initGroupStart	regex/nodetype.html#initGroupStart,string,seq[Flag]	nodetype: initGroupStart(name: string = &quot;&quot;; flags: seq[Flag] = @[]; isCapturing = true): Node	
+initSkipNode	regex/nodetype.html#initSkipNode,openArray[int16]	nodetype: initSkipNode(next: openArray[int16]): Node	
+isEmpty	regex/nodetype.html#isEmpty,Node	nodetype: isEmpty(n: Node): bool	
+opKind	regex/nodetype.html#opKind	nodetype: opKind	
+assertionKind	regex/nodetype.html#assertionKind	nodetype: assertionKind	
+shorthandKind	regex/nodetype.html#shorthandKind	nodetype: shorthandKind	
+matchableKind	regex/nodetype.html#matchableKind	nodetype: matchableKind	
+repetitionKind	regex/nodetype.html#repetitionKind	nodetype: repetitionKind	
+groupKind	regex/nodetype.html#groupKind	nodetype: groupKind	
+toString	regex/nodetype.html#toString,Node	nodetype: toString(n: Node): string	
+toString	regex/nodetype.html#toString,seq[Node]	nodetype: toString(n: seq[Node]): string	
diff --git a/docs/regex/parser.html b/docs/regex/parser.html
new file mode 100644
index 0000000..89a3a8b
--- /dev/null
+++ b/docs/regex/parser.html
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/parser</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/parser</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">parse
+      <li><a class="reference" href="#parse%2Cstring"
+    title="parse(expression: string): Exp">parse,<wbr>string</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="exptype.html">exptype</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="common.html">common</a>, <a class="reference external" href="scanner.html">scanner</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="parse,string"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#parse%2Cstring"><span class="Identifier">parse</span></a><span class="Other">(</span><span class="Identifier">expression</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="exptype.html#Exp"><span class="Identifier">Exp</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RegexError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+convert a <tt class="docutils literal"><span class="pre">string</span></tt> regex expression into a <tt class="docutils literal"><span class="pre">Node</span></tt> expression
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:29 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/parser.idx b/docs/regex/parser.idx
new file mode 100644
index 0000000..d2e67a7
--- /dev/null
+++ b/docs/regex/parser.idx
@@ -0,0 +1 @@
+parse	regex/parser.html#parse,string	parser: parse(expression: string): Exp	
diff --git a/docs/regex/scanner.html b/docs/regex/scanner.html
new file mode 100644
index 0000000..898a070
--- /dev/null
+++ b/docs/regex/scanner.html
@@ -0,0 +1,330 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/scanner</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+
+window.addEventListener('DOMContentLoaded', main);
+</script>
+
+</head>
+<body>
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">regex/scanner</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="../theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#Scanner"
+    title="Scanner[T] = ref object
+  raw*: string
+  s*: seq[T]
+  pos*: int">Scanner</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">scan
+      <li><a class="reference" href="#scan%2Cseq%5BT%5D"
+    title="scan[T](s: seq[T]): Scanner[T]">scan,<wbr>seq[T]</a></li>
+  <li><a class="reference" href="#scan%2Cstring"
+    title="scan(raw: string): Scanner[Rune]">scan,<wbr>string</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">newScanner
+      <li><a class="reference" href="#newScanner%2Cseq%5BT%5D"
+    title="newScanner[T](s: seq[T]): Scanner[T]">newScanner,<wbr>seq[T]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">peek
+      <li><a class="reference" href="#peek%2CScanner%5BRune%5D"
+    title="peek(sc: Scanner[Rune]): Rune">peek,<wbr>Scanner[Rune]</a></li>
+  <li><a class="reference" href="#peek%2CScanner%5BNode%5D"
+    title="peek(sc: Scanner[Node]): Node">peek,<wbr>Scanner[Node]</a></li>
+  <li><a class="reference" href="#peek%2CScanner%5BRune%5D%2Cint"
+    title="peek(sc: Scanner[Rune]; n: int): Rune">peek,<wbr>Scanner[Rune],<wbr>int</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">next
+      <li><a class="reference" href="#next%2CScanner%5BT%5D"
+    title="next[T](sc: Scanner[T]): T">next,<wbr>Scanner[T]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">curr
+      <li><a class="reference" href="#curr%2CScanner%5BT%5D"
+    title="curr[T](sc: Scanner[T]): T">curr,<wbr>Scanner[T]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">find
+      <li><a class="reference" href="#find%2CScanner%5BRune%5D%2CRune"
+    title="find(sc: Scanner[Rune]; r: Rune): int">find,<wbr>Scanner[Rune],<wbr>Rune</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">finished
+      <li><a class="reference" href="#finished%2CScanner%5BT%5D"
+    title="finished[T](sc: Scanner[T]): bool">finished,<wbr>Scanner[T]</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">prev
+      <li><a class="reference" href="#prev%2CScanner%5BT%5D"
+    title="prev[T](sc: Scanner[T]): T">prev,<wbr>Scanner[T]</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#15" id="65">Iterators</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#items.i%2CScanner%5BT%5D"
+    title="items[T](sc: Scanner[T]): T">items</a></li>
+  <li><a class="reference" href="#mitems.i%2CScanner%5BT%5D"
+    title="mitems[T](sc: var Scanner[T]): var T">mitems</a></li>
+  <li><a class="reference" href="#peek.i%2CScanner%5BT%5D"
+    title="peek[T](sc: Scanner[T]): (T, T)">peek</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>, <a class="reference external" href="common.html">common</a>
+</dl></div>
+<div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="Scanner"></a>
+<dt><pre><a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span> <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span>
+  <span class="Identifier">raw</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">string</span>
+  <span class="Identifier">s</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span>
+  <span class="Identifier">pos</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">int</span>
+</pre></dt>
+<dd>
+
+A scanner is a common construct for reading data
+
+</dd>
+
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="newScanner,seq[T]"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#newScanner%2Cseq%5BT%5D"><span class="Identifier">newScanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="scan,seq[T]"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#scan%2Cseq%5BT%5D"><span class="Identifier">scan</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">seq</span><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="scan,string"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#scan%2Cstring"><span class="Identifier">scan</span></a><span class="Other">(</span><span class="Identifier">raw</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">Rune</span><span class="Other">]</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="finished,Scanner[T]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#finished%2CScanner%5BT%5D"><span class="Identifier">finished</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="prev,Scanner[T]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#prev%2CScanner%5BT%5D"><span class="Identifier">prev</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">T</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="curr,Scanner[T]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#curr%2CScanner%5BT%5D"><span class="Identifier">curr</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">T</span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="next,Scanner[T]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#next%2CScanner%5BT%5D"><span class="Identifier">next</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">T</span></pre></dt>
+<dd>
+
+return current item and consume it
+
+</dd>
+<a id="peek,Scanner[Rune]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#peek%2CScanner%5BRune%5D"><span class="Identifier">peek</span></a><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">Rune</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Rune</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="peek,Scanner[Node]"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#peek%2CScanner%5BNode%5D"><span class="Identifier">peek</span></a><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><a href="types.html#Node"><span class="Identifier">Node</span></a><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <a href="types.html#Node"><span class="Identifier">Node</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="peek,Scanner[Rune],int"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#peek%2CScanner%5BRune%5D%2Cint"><span class="Identifier">peek</span></a><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">Rune</span><span class="Other">]</span><span class="Other">;</span> <span class="Identifier">n</span><span class="Other">:</span> <span class="Identifier">int</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">Rune</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+
+</dd>
+<a id="find,Scanner[Rune],Rune"></a>
+<dt><pre><span class="Keyword">func</span> <a href="#find%2CScanner%5BRune%5D%2CRune"><span class="Identifier">find</span></a><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">Rune</span><span class="Other">]</span><span class="Other">;</span> <span class="Identifier">r</span><span class="Other">:</span> <span class="Identifier">Rune</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">int</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+return number of consumed chars. The scanner's position is not moved. <tt class="docutils literal"><span class="pre">-1</span></tt> is returned when char is not found
+
+</dd>
+
+</dl></div>
+<div class="section" id="15">
+<h1><a class="toc-backref" href="#15">Iterators</a></h1>
+<dl class="item">
+<a id="items.i,Scanner[T]"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#items.i%2CScanner%5BT%5D"><span class="Identifier">items</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">T</span></pre></dt>
+<dd>
+
+the yielded item gets consumed
+
+</dd>
+<a id="mitems.i,Scanner[T]"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#mitems.i%2CScanner%5BT%5D"><span class="Identifier">mitems</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Keyword">var</span> <span class="Identifier">T</span></pre></dt>
+<dd>
+
+the yielded item gets consumed
+
+</dd>
+<a id="peek.i,Scanner[T]"></a>
+<dt><pre><span class="Keyword">iterator</span> <a href="#peek.i%2CScanner%5BT%5D"><span class="Identifier">peek</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">(</span><span class="Identifier">sc</span><span class="Other">:</span> <a href="scanner.html#Scanner"><span class="Identifier">Scanner</span></a><span class="Other">[</span><span class="Identifier">T</span><span class="Other">]</span><span class="Other">)</span><span class="Other">:</span> <span class="Other">(</span><span class="Identifier">T</span><span class="Other">,</span> <span class="Identifier">T</span><span class="Other">)</span></pre></dt>
+<dd>
+
+
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-01-06 13:01:28 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/docs/regex/scanner.idx b/docs/regex/scanner.idx
new file mode 100644
index 0000000..abf7669
--- /dev/null
+++ b/docs/regex/scanner.idx
@@ -0,0 +1,15 @@
+Scanner	regex/scanner.html#Scanner	scanner: Scanner	
+newScanner	regex/scanner.html#newScanner,seq[T]	scanner: newScanner[T](s: seq[T]): Scanner[T]	
+scan	regex/scanner.html#scan,seq[T]	scanner: scan[T](s: seq[T]): Scanner[T]	
+scan	regex/scanner.html#scan,string	scanner: scan(raw: string): Scanner[Rune]	
+items	regex/scanner.html#items.i,Scanner[T]	scanner: items[T](sc: Scanner[T]): T	
+mitems	regex/scanner.html#mitems.i,Scanner[T]	scanner: mitems[T](sc: var Scanner[T]): var T	
+finished	regex/scanner.html#finished,Scanner[T]	scanner: finished[T](sc: Scanner[T]): bool	
+prev	regex/scanner.html#prev,Scanner[T]	scanner: prev[T](sc: Scanner[T]): T	
+curr	regex/scanner.html#curr,Scanner[T]	scanner: curr[T](sc: Scanner[T]): T	
+next	regex/scanner.html#next,Scanner[T]	scanner: next[T](sc: Scanner[T]): T	
+peek	regex/scanner.html#peek,Scanner[Rune]	scanner: peek(sc: Scanner[Rune]): Rune	
+peek	regex/scanner.html#peek,Scanner[Node]	scanner: peek(sc: Scanner[Node]): Node	
+peek	regex/scanner.html#peek.i,Scanner[T]	scanner: peek[T](sc: Scanner[T]): (T, T)	
+peek	regex/scanner.html#peek,Scanner[Rune],int	scanner: peek(sc: Scanner[Rune]; n: int): Rune	
+find	regex/scanner.html#find,Scanner[Rune],Rune	scanner: find(sc: Scanner[Rune]; r: Rune): int	
diff --git a/docs/regex/types.html b/docs/regex/types.html
new file mode 100644
index 0000000..705acbd
--- /dev/null
+++ b/docs/regex/types.html
@@ -0,0 +1,572 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>regex/types</title>
+<link rel="stylesheet" type="text/css" href="../nimdoc.out.css">
+
+<script type="text/javascript" src="../dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual