From 3ac6b42e16dca5a44ed3fec2c0314f1dbbc2322b Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Sun, 16 Jul 2023 06:02:12 +0000
Subject: [PATCH] finish path refactoring, add sourcemap + better trace support

---
 .gitignore                                 |    1 
 package-lock.json                          |  953 ------------------------------------
 quartz/components/PageTitle.tsx            |    4 
 quartz/components/PageList.tsx             |   12 
 quartz/path.test.ts                        |   96 +-
 quartz/components/Head.tsx                 |    4 
 quartz/path.ts                             |  146 +++-
 quartz/components/scripts/search.inline.ts |   13 
 quartz/bootstrap-cli.mjs                   |   11 
 quartz/components/scripts/graph.inline.ts  |   28 
 quartz/plugins/transformers/links.ts       |   49 -
 quartz/build.ts                            |    4 
 quartz/plugins/index.ts                    |    6 
 quartz/plugins/emitters/contentIndex.ts    |   18 
 quartz/plugins/emitters/tagPage.tsx        |    6 
 quartz/plugins/transformers/ofm.ts         |   14 
 quartz/plugins/transformers/toc.ts         |    3 
 quartz/processors/emit.ts                  |    3 
 content/features/table of contents.md      |    5 
 content/features/Latex.md                  |    5 
 quartz/plugins/emitters/aliases.ts         |   10 
 quartz/components/Backlinks.tsx            |   11 
 quartz/trace.ts                            |   25 
 quartz/components/TagList.tsx              |    4 
 quartz/components/scripts/spa.inline.ts    |    7 
 quartz/processors/parse.ts                 |    3 
 /dev/null                                  |    1 
 content/features/upcoming features.md      |    8 
 tsconfig.json                              |    1 
 content/configuration.md                   |    4 
 content/features/syntax highlighting.md    |    2 
 package.json                               |    4 
 quartz/plugins/emitters/folderPage.tsx     |   24 
 quartz/components/pages/TagContent.tsx     |    6 
 quartz/plugins/emitters/contentPage.tsx    |    4 
 quartz/components/pages/FolderContent.tsx  |    6 
 36 files changed, 331 insertions(+), 1,170 deletions(-)

diff --git a/.gitignore b/.gitignore
index 48f7073..9be70c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,5 +2,6 @@
 .gitignore
 node_modules
 public
+tsconfig.tsbuildinfo
 .obsidian
 .quartz-cache
diff --git a/content/configuration.md b/content/configuration.md
index f8f3a70..21d11eb 100644
--- a/content/configuration.md
+++ b/content/configuration.md
@@ -40,7 +40,7 @@
 		- `dark`: header text and icons
 		- `secondary`: link colour, current [[graph view|graph]] node
 		- `tertiary`: hover states and visited [[graph view|graph]] nodes
-		- `highlight`: internal link background, highlighted text, highlighted [[syntax highlighting|lines of code]]
+		- `highlight`: internal link background, highlighted text, [[syntax highlighting|highlighted lines of code]]
 
 ## Plugins
 You can think of Quartz plugins as a series of transformations over content.
@@ -62,7 +62,7 @@
 By adding, removing, and reordering plugins from the `tranformers`, `filters`, and `emitters` fields, you can customize the behaviour of Quartz.
 
 > [!note]
-> Note that each node is modified by every transformer *in order*. Some transformers are position-sensitive so you may need to take special note of whether it needs come before or after any other particular plugins. 
+> Each node is modified by every transformer *in order*. Some transformers are position-sensitive so you may need to take special note of whether it needs come before or after any other particular plugins. 
 
 Additionally, plugins may also have their own configuration settings that you can pass in. For example, the [[Latex]] plugin allows you to pass in a field specifying the `renderEngine` to choose between Katex and MathJax.
 
diff --git a/content/features/Latex.md b/content/features/Latex.md
index 7b28810..04bc366 100644
--- a/content/features/Latex.md
+++ b/content/features/Latex.md
@@ -1,8 +1,3 @@
----
-tags:
-- plugins/transformer
----
-
 Quartz uses [Katex](https://katex.org/) by default to typeset both inline and block math expressions at build time.
 
 ## Formatting
diff --git a/content/features/syntax highlighting.md b/content/features/syntax highlighting.md
index adad043..8f06eae 100644
--- a/content/features/syntax highlighting.md
+++ b/content/features/syntax highlighting.md
@@ -1,7 +1,5 @@
 ---
 title: Syntax Highlighting
-tags: 
-- plugins/transformer
 ---
 
 Syntax highlighting in Quartz is completely done at build-time. This means that Quartz only ships pre-calculated CSS to highlight the right words so there is no heavy client-side bundle that does the syntax highlighting.
diff --git a/content/features/table of contents.md b/content/features/table of contents.md
index e69de29..5445771 100644
--- a/content/features/table of contents.md
+++ b/content/features/table of contents.md
@@ -0,0 +1,5 @@
+---
+title: "Table of Contents"
+tags:
+- component
+---
\ No newline at end of file
diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md
index 24b8465..b93afce 100644
--- a/content/features/upcoming features.md
+++ b/content/features/upcoming features.md
@@ -1,5 +1,7 @@
 
 - fixes
+	- changing `_index` files
+	- typography
 - CLI    
     - update
     - push
@@ -29,4 +31,8 @@
     - mermaid styling: [https://mermaid.js.org/config/theming.html#theme-variables-reference-table](https://mermaid.js.org/config/theming.html#theme-variables-reference-table)
         - [https://github.com/jackyzha0/quartz/issues/331](https://github.com/jackyzha0/quartz/issues/331)
     - block links: [https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note](https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note)
-    - note/header/block transcludes: [https://help.obsidian.md/Linking+notes+and+files/Embedding+files](https://help.obsidian.md/Linking+notes+and+files/Embedding+files)
\ No newline at end of file
+    - note/header/block transcludes: [https://help.obsidian.md/Linking+notes+and+files/Embedding+files](https://help.obsidian.md/Linking+notes+and+files/Embedding+files)
+- parse all images in page
+	- use this for page lists if applicable?
+- CV mode?
+	- with print stylesheet
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index b511c56..45ad89e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -30,6 +30,7 @@
         "plausible-tracker": "^0.3.8",
         "preact": "^10.14.1",
         "preact-render-to-string": "^6.0.3",
+        "pretty-bytes": "^6.1.0",
         "pretty-time": "^1.1.0",
         "reading-time": "^1.5.0",
         "rehype-autolink-headings": "^6.1.1",
@@ -47,6 +48,7 @@
         "remark-smartypants": "^2.0.0",
         "rimraf": "^5.0.1",
         "serve-handler": "^6.1.5",
+        "source-map-support": "^0.5.21",
         "to-vfile": "^7.2.4",
         "unified": "^10.1.2",
         "unist-util-visit": "^4.1.2",
@@ -68,7 +70,6 @@
         "@types/serve-handler": "^6.1.1",
         "@types/workerpool": "^6.4.0",
         "@types/yargs": "^17.0.24",
-        "ava": "^5.3.1",
         "esbuild": "^0.18.11",
         "tsx": "^3.12.7",
         "typescript": "^5.0.4"
@@ -1567,22 +1568,6 @@
         "node": ">= 6.0.0"
       }
     },
-    "node_modules/aggregate-error": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz",
-      "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==",
-      "dev": true,
-      "dependencies": {
-        "clean-stack": "^4.0.0",
-        "indent-string": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/ansi-regex": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
@@ -1631,15 +1616,6 @@
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
-    "node_modules/array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/array-iterate": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz",
@@ -1649,136 +1625,11 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/arrgv": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz",
-      "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/arrify": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz",
-      "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
-    "node_modules/ava": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz",
-      "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.8.2",
-        "acorn-walk": "^8.2.0",
-        "ansi-styles": "^6.2.1",
-        "arrgv": "^1.0.2",
-        "arrify": "^3.0.0",
-        "callsites": "^4.0.0",
-        "cbor": "^8.1.0",
-        "chalk": "^5.2.0",
-        "chokidar": "^3.5.3",
-        "chunkd": "^2.0.1",
-        "ci-info": "^3.8.0",
-        "ci-parallel-vars": "^1.0.1",
-        "clean-yaml-object": "^0.1.0",
-        "cli-truncate": "^3.1.0",
-        "code-excerpt": "^4.0.0",
-        "common-path-prefix": "^3.0.0",
-        "concordance": "^5.0.4",
-        "currently-unhandled": "^0.4.1",
-        "debug": "^4.3.4",
-        "emittery": "^1.0.1",
-        "figures": "^5.0.0",
-        "globby": "^13.1.4",
-        "ignore-by-default": "^2.1.0",
-        "indent-string": "^5.0.0",
-        "is-error": "^2.2.2",
-        "is-plain-object": "^5.0.0",
-        "is-promise": "^4.0.0",
-        "matcher": "^5.0.0",
-        "mem": "^9.0.2",
-        "ms": "^2.1.3",
-        "p-event": "^5.0.1",
-        "p-map": "^5.5.0",
-        "picomatch": "^2.3.1",
-        "pkg-conf": "^4.0.0",
-        "plur": "^5.1.0",
-        "pretty-ms": "^8.0.0",
-        "resolve-cwd": "^3.0.0",
-        "stack-utils": "^2.0.6",
-        "strip-ansi": "^7.0.1",
-        "supertap": "^3.0.1",
-        "temp-dir": "^3.0.0",
-        "write-file-atomic": "^5.0.1",
-        "yargs": "^17.7.2"
-      },
-      "bin": {
-        "ava": "entrypoints/cli.mjs"
-      },
-      "engines": {
-        "node": ">=14.19 <15 || >=16.15 <17 || >=18"
-      },
-      "peerDependencies": {
-        "@ava/typescript": "*"
-      },
-      "peerDependenciesMeta": {
-        "@ava/typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/ava/node_modules/acorn-walk": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/ava/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/ava/node_modules/chalk": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
-      "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
-      "dev": true,
-      "engines": {
-        "node": "^12.17.0 || ^14.13 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/ava/node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
-    },
     "node_modules/bail": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
@@ -1801,12 +1652,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/blueimp-md5": {
-      "version": "2.19.0",
-      "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
-      "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==",
-      "dev": true
-    },
     "node_modules/brace-expansion": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
@@ -1834,8 +1679,7 @@
     "node_modules/buffer-from": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "dev": true
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
     },
     "node_modules/bytes": {
       "version": "3.0.0",
@@ -1845,30 +1689,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/callsites": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz",
-      "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cbor": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz",
-      "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==",
-      "dev": true,
-      "dependencies": {
-        "nofilter": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=12.19"
-      }
-    },
     "node_modules/ccount": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@@ -1928,57 +1748,6 @@
         "fsevents": "~2.3.2"
       }
     },
-    "node_modules/chunkd": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz",
-      "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==",
-      "dev": true
-    },
-    "node_modules/ci-info": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
-      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/sibiraj-s"
-        }
-      ],
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ci-parallel-vars": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz",
-      "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==",
-      "dev": true
-    },
-    "node_modules/clean-stack": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz",
-      "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "5.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/clean-yaml-object": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz",
-      "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/cli-spinner": {
       "version": "0.2.10",
       "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz",
@@ -1987,22 +1756,6 @@
         "node": ">=0.10"
       }
     },
-    "node_modules/cli-truncate": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
-      "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
-      "dev": true,
-      "dependencies": {
-        "slice-ansi": "^5.0.0",
-        "string-width": "^5.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/cliui": {
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -2069,18 +1822,6 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
-    "node_modules/code-excerpt": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz",
-      "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==",
-      "dev": true,
-      "dependencies": {
-        "convert-to-spaces": "^2.0.1"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      }
-    },
     "node_modules/color-convert": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -2125,36 +1866,11 @@
         "node": ">= 10"
       }
     },
-    "node_modules/common-path-prefix": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
-      "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
-      "dev": true
-    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
-    "node_modules/concordance": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz",
-      "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==",
-      "dev": true,
-      "dependencies": {
-        "date-time": "^3.1.0",
-        "esutils": "^2.0.3",
-        "fast-diff": "^1.2.0",
-        "js-string-escape": "^1.0.1",
-        "lodash": "^4.17.15",
-        "md5-hex": "^3.0.1",
-        "semver": "^7.3.2",
-        "well-known-symbols": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14"
-      }
-    },
     "node_modules/content-disposition": {
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@@ -2163,15 +1879,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/convert-to-spaces": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz",
-      "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==",
-      "dev": true,
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      }
-    },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -2206,18 +1913,6 @@
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
       "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
     },
-    "node_modules/currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==",
-      "dev": true,
-      "dependencies": {
-        "array-find-index": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/d3": {
       "version": "7.8.5",
       "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz",
@@ -2613,18 +2308,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/date-time": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz",
-      "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==",
-      "dev": true,
-      "dependencies": {
-        "time-zone": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/debug": {
       "version": "4.3.4",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -2717,18 +2400,6 @@
       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
     },
-    "node_modules/emittery": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.1.tgz",
-      "integrity": "sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
-      }
-    },
     "node_modules/emoji-regex": {
       "version": "9.2.2",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -2884,12 +2555,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/fast-diff": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
-      "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
-      "dev": true
-    },
     "node_modules/fast-glob": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz",
@@ -2933,22 +2598,6 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/figures": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz",
-      "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^5.0.0",
-        "is-unicode-supported": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -2960,22 +2609,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/find-up": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
-      "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^7.1.0",
-        "path-exists": "^5.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/flexsearch": {
       "version": "0.7.21",
       "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.21.tgz",
@@ -3467,41 +3100,11 @@
         "node": ">= 4"
       }
     },
-    "node_modules/ignore-by-default": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz",
-      "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10 <11 || >=12 <13 || >=14"
-      }
-    },
     "node_modules/immutable": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz",
       "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg=="
     },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/indent-string": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
-      "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/inline-style-parser": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
@@ -3515,15 +3118,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/irregular-plurals": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz",
-      "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/is-absolute-url": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
@@ -3579,12 +3173,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-error": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz",
-      "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==",
-      "dev": true
-    },
     "node_modules/is-extendable": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -3650,38 +3238,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/is-plain-object": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/is-potential-custom-element-name": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
       "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
     },
-    "node_modules/is-promise": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
-      "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
-      "dev": true
-    },
-    "node_modules/is-unicode-supported": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
-      "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -3704,15 +3265,6 @@
         "@pkgjs/parseargs": "^0.11.0"
       }
     },
-    "node_modules/js-string-escape": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
-      "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -3819,39 +3371,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/load-json-file": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz",
-      "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==",
-      "dev": true,
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
-      "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^6.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
-    },
     "node_modules/longest-streak": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
@@ -3869,18 +3388,6 @@
         "node": "14 || >=16.14"
       }
     },
-    "node_modules/map-age-cleaner": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
-      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
-      "dev": true,
-      "dependencies": {
-        "p-defer": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/markdown-table": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
@@ -3890,21 +3397,6 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/matcher": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz",
-      "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^5.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/mathjax-full": {
       "version": "3.2.2",
       "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz",
@@ -3916,18 +3408,6 @@
         "speech-rule-engine": "^4.0.6"
       }
     },
-    "node_modules/md5-hex": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz",
-      "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==",
-      "dev": true,
-      "dependencies": {
-        "blueimp-md5": "^2.10.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/mdast-util-definitions": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz",
@@ -4159,22 +3639,6 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/mem": {
-      "version": "9.0.2",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
-      "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==",
-      "dev": true,
-      "dependencies": {
-        "map-age-cleaner": "^0.1.3",
-        "mimic-fn": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/mem?sponsor=1"
-      }
-    },
     "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4797,18 +4261,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/mimic-fn": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
-      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/minimatch": {
       "version": "9.0.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz",
@@ -4861,15 +4313,6 @@
         "url": "https://opencollective.com/unified"
       }
     },
-    "node_modules/nofilter": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz",
-      "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==",
-      "dev": true,
-      "engines": {
-        "node": ">=12.19"
-      }
-    },
     "node_modules/normalize-path": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -4883,87 +4326,6 @@
       "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
       "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ=="
     },
-    "node_modules/p-defer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
-      "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/p-event": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz",
-      "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==",
-      "dev": true,
-      "dependencies": {
-        "p-timeout": "^5.0.2"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
-      "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
-      "dev": true,
-      "dependencies": {
-        "yocto-queue": "^1.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
-      "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^4.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz",
-      "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==",
-      "dev": true,
-      "dependencies": {
-        "aggregate-error": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-timeout": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz",
-      "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/parse-latin": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz",
@@ -4978,18 +4340,6 @@
         "url": "https://github.com/sponsors/wooorm"
       }
     },
-    "node_modules/parse-ms": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz",
-      "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/parse-numeric-range": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
@@ -5006,15 +4356,6 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
-    "node_modules/path-exists": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
-      "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
-      "dev": true,
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      }
-    },
     "node_modules/path-is-inside": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
@@ -5077,22 +4418,6 @@
         "url": "https://github.com/sponsors/jonschlinkert"
       }
     },
-    "node_modules/pkg-conf": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz",
-      "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==",
-      "dev": true,
-      "dependencies": {
-        "find-up": "^6.0.0",
-        "load-json-file": "^7.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/plausible-tracker": {
       "version": "0.3.8",
       "resolved": "https://registry.npmjs.org/plausible-tracker/-/plausible-tracker-0.3.8.tgz",
@@ -5101,21 +4426,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/plur": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz",
-      "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==",
-      "dev": true,
-      "dependencies": {
-        "irregular-plurals": "^3.3.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/preact": {
       "version": "10.15.1",
       "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz",
@@ -5136,26 +4446,22 @@
         "preact": ">=10"
       }
     },
-    "node_modules/pretty-format": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
-      "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
-    },
-    "node_modules/pretty-ms": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz",
-      "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==",
-      "dev": true,
-      "dependencies": {
-        "parse-ms": "^3.0.0"
-      },
+    "node_modules/pretty-bytes": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.0.tgz",
+      "integrity": "sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==",
       "engines": {
-        "node": ">=14.16"
+        "node": "^14.13.1 || >=16.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/pretty-format": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz",
+      "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
+    },
     "node_modules/pretty-time": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz",
@@ -5479,27 +4785,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/resolve-cwd": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-      "dev": true,
-      "dependencies": {
-        "resolve-from": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/resolve-pkg-maps": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
@@ -5681,60 +4966,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/semver": {
-      "version": "7.5.4",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/serialize-error": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
-      "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.13.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/serialize-error/node_modules/type-fest": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
-      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/serve-handler": {
       "version": "6.1.5",
       "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz",
@@ -5828,46 +5059,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/slice-ansi": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
-      "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^6.0.0",
-        "is-fullwidth-code-point": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "node_modules/slice-ansi/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
-      "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/sort-keys": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.0.0.tgz",
@@ -5886,7 +5077,6 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "devOptional": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -5903,7 +5093,6 @@
       "version": "0.5.21",
       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "dev": true,
       "dependencies": {
         "buffer-from": "^1.0.0",
         "source-map": "^0.6.0"
@@ -5944,27 +5133,6 @@
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
       "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
     },
-    "node_modules/stack-utils": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
-      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
-      "dev": true,
-      "dependencies": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/stack-utils/node_modules/escape-string-regexp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/string-width": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@@ -6069,43 +5237,6 @@
         "inline-style-parser": "0.1.1"
       }
     },
-    "node_modules/supertap": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz",
-      "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==",
-      "dev": true,
-      "dependencies": {
-        "indent-string": "^5.0.0",
-        "js-yaml": "^3.14.1",
-        "serialize-error": "^7.0.1",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      }
-    },
-    "node_modules/supertap/node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/supertap/node_modules/js-yaml": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -6133,24 +5264,6 @@
       "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
     },
-    "node_modules/temp-dir": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz",
-      "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==",
-      "dev": true,
-      "engines": {
-        "node": ">=14.16"
-      }
-    },
-    "node_modules/time-zone": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz",
-      "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -6549,15 +5662,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/well-known-symbols": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz",
-      "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/whatwg-encoding": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
@@ -6694,19 +5798,6 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/write-file-atomic": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
-      "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
-      "dev": true,
-      "dependencies": {
-        "imurmurhash": "^0.1.4",
-        "signal-exit": "^4.0.1"
-      },
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
     "node_modules/ws": {
       "version": "8.13.0",
       "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
@@ -6756,12 +5847,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/yargs": {
       "version": "17.7.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
@@ -6824,18 +5909,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/yocto-queue": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
-      "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
-      "dev": true,
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/zwitch": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
diff --git a/package.json b/package.json
index 9d6ae92..622c38a 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "name": "@jackyzha0/quartz",
   "description": "🌱 publish your digital garden and notes as a website",
   "private": true,
-  "version": "4.0.4",
+  "version": "4.0.5",
   "type": "module",
   "author": "jackyzha0 <j.zhao2k19@gmail.com>",
   "license": "MIT",
@@ -48,6 +48,7 @@
     "plausible-tracker": "^0.3.8",
     "preact": "^10.14.1",
     "preact-render-to-string": "^6.0.3",
+    "pretty-bytes": "^6.1.0",
     "pretty-time": "^1.1.0",
     "reading-time": "^1.5.0",
     "rehype-autolink-headings": "^6.1.1",
@@ -65,6 +66,7 @@
     "remark-smartypants": "^2.0.0",
     "rimraf": "^5.0.1",
     "serve-handler": "^6.1.5",
+    "source-map-support": "^0.5.21",
     "to-vfile": "^7.2.4",
     "unified": "^10.1.2",
     "unist-util-visit": "^4.1.2",
diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs
index b1503f2..bb83fe0 100755
--- a/quartz/bootstrap-cli.mjs
+++ b/quartz/bootstrap-cli.mjs
@@ -9,6 +9,7 @@
 import fs from 'fs'
 import { intro, isCancel, outro, select, text } from '@clack/prompts'
 import { rimraf } from 'rimraf'
+import prettyBytes from 'pretty-bytes'
 
 const cacheFile = "./.quartz-cache/transpiled-build.mjs"
 const fp = "./quartz/build.ts"
@@ -133,7 +134,7 @@
 `)
   })
   .command('build', 'Build Quartz into a bundle of static HTML files', BuildArgv, async (argv) => {
-    await esbuild.build({
+    const result = await esbuild.build({
       entryPoints: [fp],
       outfile: path.join("quartz", cacheFile),
       bundle: true,
@@ -143,6 +144,8 @@
       jsx: "automatic",
       jsxImportSource: "preact",
       packages: "external",
+      metafile: true,
+      sourcemap: true,
       plugins: [
         sassPlugin({
           type: 'css-text',
@@ -186,6 +189,12 @@
       process.exit(1)
     })
 
+    if (argv.verbose) {
+      const outputFileName = 'quartz/.quartz-cache/transpiled-build.mjs'
+      const meta = result.metafile.outputs[outputFileName]
+      console.log(chalk.gray(`[debug] Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes(meta.bytes)})`))
+    }
+
     const { default: init } = await import(cacheFile)
     init(argv, version)
   })
diff --git a/quartz/build.ts b/quartz/build.ts
index 36e3210..6926d68 100644
--- a/quartz/build.ts
+++ b/quartz/build.ts
@@ -1,3 +1,4 @@
+import 'source-map-support/register.js'
 import path from "path"
 import { PerfTimer } from "./perf"
 import { rimraf } from "rimraf"
@@ -9,6 +10,7 @@
 import { filterContent } from "./processors/filter"
 import { emitContent } from "./processors/emit"
 import cfg from "../quartz.config"
+import { FilePath } from "./path"
 
 interface Argv {
   directory: string
@@ -46,7 +48,7 @@
   })
   console.log(`Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince('glob')}`)
 
-  const filePaths = fps.map(fp => `${argv.directory}${path.sep}${fp}`)
+  const filePaths = fps.map(fp => `${argv.directory}${path.sep}${fp}` as FilePath)
   const parsedFiles = await parseMarkdown(cfg.plugins.transformers, argv.directory, filePaths, argv.verbose)
   const filteredContent = filterContent(cfg.plugins.filters, parsedFiles, argv.verbose)
   await emitContent(argv.directory, output, cfg, filteredContent, argv.verbose)
diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx
index f150f03..9331387 100644
--- a/quartz/components/Backlinks.tsx
+++ b/quartz/components/Backlinks.tsx
@@ -1,20 +1,19 @@
 import { QuartzComponentConstructor, QuartzComponentProps } from "./types"
 import style from "./styles/backlinks.scss"
-import { relativeToRoot } from "../path"
-import { clientSideSlug } from "./scripts/util"
+import { canonicalizeServer, resolveRelative } from "../path"
 
 function Backlinks({ fileData, allFiles }: QuartzComponentProps) {
-  const slug = fileData.slug!
+  const slug = canonicalizeServer(fileData.slug!)
   const backlinkFiles = allFiles.filter(file => file.links?.includes(slug))
   return <div class="backlinks">
     <h3>Backlinks</h3>
     <ul class="overflow">
       {backlinkFiles.length > 0 ?
-        backlinkFiles.map(f => <li><a href={clientSideSlug(relativeToRoot(slug, f.slug!))} class="internal">{f.frontmatter?.title}</a></li>)
+        backlinkFiles.map(f => <li><a href={resolveRelative(slug, canonicalizeServer(f.slug!))} class="internal">{f.frontmatter?.title}</a></li>)
         : <li>No backlinks found</li>}
     </ul>
-  </div> 
+  </div>
 }
 
-Backlinks.css = style 
+Backlinks.css = style
 export default (() => Backlinks) satisfies QuartzComponentConstructor
diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx
index b392a2d..b370054 100644
--- a/quartz/components/Head.tsx
+++ b/quartz/components/Head.tsx
@@ -1,10 +1,10 @@
-import { toServerSlug, pathToRoot } from "../path"
+import { canonicalizeServer, pathToRoot } from "../path"
 import { JSResourceToScriptElement } from "../resources"
 import { QuartzComponentConstructor, QuartzComponentProps } from "./types"
 
 export default (() => {
   function Head({ fileData, externalResources }: QuartzComponentProps) {
-    const slug = toServerSlug(fileData.slug!)
+    const slug = canonicalizeServer(fileData.slug!)
     const title = fileData.frontmatter?.title ?? "Untitled"
     const description = fileData.description ?? "No description provided"
     const { css, js } = externalResources
diff --git a/quartz/components/PageList.tsx b/quartz/components/PageList.tsx
index ec7f104..da1bf9f 100644
--- a/quartz/components/PageList.tsx
+++ b/quartz/components/PageList.tsx
@@ -1,7 +1,6 @@
-import { relativeToRoot } from "../path"
+import { CanonicalSlug, canonicalizeServer, resolveRelative } from "../path"
 import { QuartzPluginData } from "../plugins/vfile"
 import { Date } from "./Date"
-import { clientSideSlug } from "./scripts/util"
 import { QuartzComponentProps } from "./types"
 
 function byDateAndAlphabetical(f1: QuartzPluginData, f2: QuartzPluginData): number {
@@ -22,22 +21,23 @@
 }
 
 export function PageList({ fileData, allFiles }: QuartzComponentProps) {
-  const slug = fileData.slug!
+  const slug = canonicalizeServer(fileData.slug!)
   return <ul class="section-ul">
     {allFiles.sort(byDateAndAlphabetical).map(page => {
       const title = page.frontmatter?.title
-      const pageSlug = page.slug!
+      const pageSlug = canonicalizeServer(page.slug!)
       const tags = page.frontmatter?.tags ?? []
+
       return <li class="section-li">
         <div class="section">
           {page.dates && <p class="meta">
             <Date date={page.dates.modified} />
           </p>}
           <div class="desc">
-            <h3><a href={clientSideSlug(relativeToRoot(slug, pageSlug))} class="internal">{title}</a></h3>
+            <h3><a href={resolveRelative(slug, pageSlug)} class="internal">{title}</a></h3>
           </div>
           <ul class="tags">
-            {tags.map(tag => <li><a class="internal" href={relativeToRoot(slug, `tags/${tag}`)}>#{tag}</a></li>)}
+            {tags.map(tag => <li><a class="internal" href={resolveRelative(slug, `tags/${tag}` as CanonicalSlug)}>#{tag}</a></li>)}
           </ul>
         </div>
       </li>
diff --git a/quartz/components/PageTitle.tsx b/quartz/components/PageTitle.tsx
index ea1248f..00b2300 100644
--- a/quartz/components/PageTitle.tsx
+++ b/quartz/components/PageTitle.tsx
@@ -1,9 +1,9 @@
-import { pathToRoot } from "../path"
+import { canonicalizeServer, pathToRoot } from "../path"
 import { QuartzComponentConstructor, QuartzComponentProps } from "./types"
 
 function PageTitle({ fileData, cfg }: QuartzComponentProps) {
   const title = cfg?.pageTitle ?? "Untitled Quartz"
-  const slug = fileData.slug!
+  const slug = canonicalizeServer(fileData.slug!)
   const baseDir = pathToRoot(slug)
   return <h1 class="page-title"><a href={baseDir}>{title}</a></h1>
 }
diff --git a/quartz/components/TagList.tsx b/quartz/components/TagList.tsx
index a730062..54147db 100644
--- a/quartz/components/TagList.tsx
+++ b/quartz/components/TagList.tsx
@@ -1,10 +1,10 @@
-import { pathToRoot } from "../path"
+import { canonicalizeServer, pathToRoot } from "../path"
 import { QuartzComponentConstructor, QuartzComponentProps } from "./types"
 import { slug as slugAnchor } from 'github-slugger'
 
 function TagList({ fileData }: QuartzComponentProps) {
   const tags = fileData.frontmatter?.tags
-  const slug = fileData.slug!
+  const slug = canonicalizeServer(fileData.slug!)
   const baseDir = pathToRoot(slug)
   if (tags && tags.length > 0) {
     return <ul class="tags">{tags.map(tag => {
diff --git a/quartz/components/pages/FolderContent.tsx b/quartz/components/pages/FolderContent.tsx
index 5abdfbc..9221eac 100644
--- a/quartz/components/pages/FolderContent.tsx
+++ b/quartz/components/pages/FolderContent.tsx
@@ -5,11 +5,11 @@
 
 import style from '../styles/listPage.scss'
 import { PageList } from "../PageList"
-import { toServerSlug } from "../../path"
+import { canonicalizeServer } from "../../path"
 
 function FolderContent(props: QuartzComponentProps) {
   const { tree, fileData, allFiles } = props
-  const folderSlug = toServerSlug(fileData.slug!)
+  const folderSlug = canonicalizeServer(fileData.slug!)
   const allPagesInFolder = allFiles.filter(file => {
     const fileSlug = file.slug ?? ""
     const prefixed = fileSlug.startsWith(folderSlug)
@@ -23,7 +23,7 @@
     ...props,
     allFiles: allPagesInFolder
   }
-
+  
   // @ts-ignore
   const content = toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: 'html' })
   return <div class="popover-hint">
diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx
index de2367e..a490b8d 100644
--- a/quartz/components/pages/TagContent.tsx
+++ b/quartz/components/pages/TagContent.tsx
@@ -3,14 +3,14 @@
 import { toJsxRuntime } from "hast-util-to-jsx-runtime"
 import style from '../styles/listPage.scss'
 import { PageList } from "../PageList"
-import { toServerSlug } from "../../path"
+import { ServerSlug, canonicalizeServer } from "../../path"
 
 function TagContent(props: QuartzComponentProps) {
   const { tree, fileData, allFiles } = props
   const slug = fileData.slug
 
   if (slug?.startsWith("tags/")) {
-    const tag = toServerSlug(slug.slice("tags/".length))
+    const tag = canonicalizeServer(slug.slice("tags/".length) as ServerSlug)
     const allPagesWithTag = allFiles.filter(file => (file.frontmatter?.tags ?? []).includes(tag))
     const listProps = {
       ...props,
@@ -27,7 +27,7 @@
       </div>
     </div>
   } else {
-    throw `Component "TagContent" tried to render a non-tag page: ${slug}`
+    throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`)
   }
 }
 
diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts
index 6682d70..ae4f40f 100644
--- a/quartz/components/scripts/graph.inline.ts
+++ b/quartz/components/scripts/graph.inline.ts
@@ -1,7 +1,7 @@
 import { ContentDetails } from "../../plugins/emitters/contentIndex"
 import * as d3 from 'd3'
-import { registerEscapeHandler, clientSideRelativePath, removeAllChildren } from "./util"
-import { CanonicalSlug } from "../../path"
+import { registerEscapeHandler, removeAllChildren } from "./util"
+import { CanonicalSlug, getCanonicalSlug, getClientSlug, resolveRelative } from "../../path"
 
 type NodeData = {
   id: CanonicalSlug,
@@ -25,7 +25,7 @@
   localStorage.setItem(localStorageKey, JSON.stringify([...visited]))
 }
 
-async function renderGraph(container: string, slug: string) {
+async function renderGraph(container: string, slug: CanonicalSlug) {
   const visited = getVisited()
   const graph = document.getElementById(container)
   if (!graph) return
@@ -50,18 +50,17 @@
     const outgoing = details.links ?? []
     for (const dest of outgoing) {
       if (src in data && dest in data) {
-        links.push({ source: src, target: dest })
+        links.push({ source: src as CanonicalSlug, target: dest })
       }
     }
   }
 
-  const neighbourhood = new Set()
-
-  const wl = [slug, "__SENTINEL"]
+  const neighbourhood = new Set<CanonicalSlug>()
+  const wl: (CanonicalSlug | "__SENTINEL")[] = [slug, "__SENTINEL"]
   if (depth >= 0) {
     while (depth >= 0 && wl.length > 0) {
       // compute neighbours
-      const cur = wl.shift()
+      const cur = wl.shift()!
       if (cur === "__SENTINEL") {
         depth--
         wl.push("__SENTINEL")
@@ -73,11 +72,11 @@
       }
     }
   } else {
-    Object.keys(data).forEach(id => neighbourhood.add(id))
+    Object.keys(data).forEach(id => neighbourhood.add(id as CanonicalSlug))
   }
 
   const graphData: { nodes: NodeData[], links: LinkData[] } = {
-    nodes: Object.keys(data).filter(id => neighbourhood.has(id)).map(url => ({ id: url, text: data[url]?.title ?? url, tags: data[url]?.tags ?? [] })),
+    nodes: [...neighbourhood].map(url => ({ id: url, text: data[url]?.title ?? url, tags: data[url]?.tags ?? [] })),
     links: links.filter((l) => neighbourhood.has(l.source) && neighbourhood.has(l.target))
   }
 
@@ -168,12 +167,13 @@
     .attr("fill", color)
     .style("cursor", "pointer")
     .on("click", (_, d) => {
-      const targ = clientSideRelativePath(slug, d.id)
-      window.spaNavigate(new URL(targ))
+      const targ = resolveRelative(slug, d.id)
+      window.spaNavigate(new URL(targ, getClientSlug(window)))
     })
     .on("mouseover", function(_, d) {
-      const neighbours: string[] = data[slug].links ?? []
+      const neighbours: CanonicalSlug[] = data[slug].links ?? []
       const neighbourNodes = d3.selectAll<HTMLElement, NodeData>(".node").filter((d) => neighbours.includes(d.id))
+      console.log(neighbourNodes)
       const currentId = d.id
       const linkNodes = d3
         .selectAll(".link")
@@ -273,7 +273,7 @@
 }
 
 function renderGlobalGraph() {
-  const slug = document.body.dataset["slug"]!
+  const slug = getCanonicalSlug(window) 
   const container = document.getElementById("global-graph-outer")
   const sidebar = container?.closest(".sidebar") as HTMLElement
   container?.classList.add("active")
diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts
index d92edb1..c738fc9 100644
--- a/quartz/components/scripts/search.inline.ts
+++ b/quartz/components/scripts/search.inline.ts
@@ -1,13 +1,14 @@
 import { Document } from "flexsearch"
 import { ContentDetails } from "../../plugins/emitters/contentIndex"
-import { registerEscapeHandler, clientSideRelativePath, removeAllChildren } from "./util"
-import { CanonicalSlug } from "../../path"
+import { registerEscapeHandler, removeAllChildren } from "./util"
+import { CanonicalSlug, getClientSlug, resolveRelative } from "../../path"
 
 interface Item {
   slug: CanonicalSlug,
   title: string,
   content: string,
 }
+
 let index: Document<Item> | undefined = undefined
 
 const contextWindowWords = 30
@@ -113,8 +114,8 @@
     button.id = slug
     button.innerHTML = `<h3>${title}</h3><p>${content}</p>`
     button.addEventListener('click', () => {
-      const targ = clientSideRelativePath(currentSlug, slug)
-      window.spaNavigate(new URL(targ))
+      const targ = resolveRelative(currentSlug, slug)
+      window.spaNavigate(new URL(targ, getClientSlug(window)))
     })
     return button
   }
@@ -137,9 +138,9 @@
   function onType(e: HTMLElementEventMap["input"]) {
     const term = (e.target as HTMLInputElement).value
     const searchResults = index?.search(term, numSearchResults) ?? []
-    const getByField = (field: string): string[] => {
+    const getByField = (field: string): CanonicalSlug[] => {
       const results = searchResults.filter((x) => x.field === field)
-      return results.length === 0 ? [] : [...results[0].result] as string[]
+      return results.length === 0 ? [] : [...results[0].result] as CanonicalSlug[]
     }
 
     // order titles ahead of content
diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts
index 5ba53e3..774326e 100644
--- a/quartz/components/scripts/spa.inline.ts
+++ b/quartz/components/scripts/spa.inline.ts
@@ -1,5 +1,5 @@
 import micromorph from "micromorph"
-import { CanonicalSlug, RelativeURL } from "../../path"
+import { CanonicalSlug, RelativeURL, getCanonicalSlug } from "../../path"
 
 // adapted from `micromorph`
 // https://github.com/natemoo-re/micromorph
@@ -43,6 +43,7 @@
     .catch(() => {
       window.location.assign(url)
     })
+
   if (!contents) return;
   if (!isBack) {
     history.pushState({}, "", url)
@@ -70,7 +71,7 @@
   const elementsToAdd = html.head.querySelectorAll(':not([spa-preserve])')
   elementsToAdd.forEach(el => document.head.appendChild(el))
 
-  notifyNav(document.body.dataset.slug!)
+  notifyNav(getCanonicalSlug(window))
   delete announcer.dataset.persist
 }
 
@@ -117,7 +118,7 @@
 }
 
 createRouter()
-notifyNav(document.body.dataset.slug!)
+notifyNav(getCanonicalSlug(window))
 
 if (!customElements.get('route-announcer')) {
   const attrs = {
diff --git a/quartz/path.test.ts b/quartz/path.test.ts
index 4996648..c0ceacc 100644
--- a/quartz/path.test.ts
+++ b/quartz/path.test.ts
@@ -24,23 +24,21 @@
   })
 
   test('isCanonicalSlug', () => {
-    assert(path.isCanonicalSlug("/"))
-    assert(path.isCanonicalSlug("/abc"))
-    assert(path.isCanonicalSlug("/notindex"))
-    assert(path.isCanonicalSlug("/notindex/def"))
+    assert(path.isCanonicalSlug(""))
+    assert(path.isCanonicalSlug("abc"))
+    assert(path.isCanonicalSlug("notindex"))
+    assert(path.isCanonicalSlug("notindex/def"))
 
     assert(!path.isCanonicalSlug("//"))
-    assert(!path.isCanonicalSlug("/index"))
-    assert(!path.isCanonicalSlug(""))
     assert(!path.isCanonicalSlug("index"))
-    assert(!path.isCanonicalSlug("index/abc"))
     assert(!path.isCanonicalSlug("https://example.com"))
-    assert(!path.isCanonicalSlug("/abc/"))
-    assert(!path.isCanonicalSlug("/abc/index"))
-    assert(!path.isCanonicalSlug("/abc#anchor"))
-    assert(!path.isCanonicalSlug("/abc?query=1"))
-    assert(!path.isCanonicalSlug("/index.md"))
-    assert(!path.isCanonicalSlug("/index.html"))
+    assert(!path.isCanonicalSlug("/abc"))
+    assert(!path.isCanonicalSlug("abc/"))
+    assert(!path.isCanonicalSlug("abc/index"))
+    assert(!path.isCanonicalSlug("abc#anchor"))
+    assert(!path.isCanonicalSlug("abc?query=1"))
+    assert(!path.isCanonicalSlug("index.md"))
+    assert(!path.isCanonicalSlug("index.html"))
   })
 
   test('isRelativeURL', () => {
@@ -52,6 +50,7 @@
     assert(path.isRelativeURL("../abc/def"))
 
     assert(!path.isRelativeURL("abc"))
+    assert(!path.isRelativeURL("/abc/def"))
     assert(!path.isRelativeURL(""))
     assert(!path.isRelativeURL("../"))
     assert(!path.isRelativeURL("./"))
@@ -60,25 +59,23 @@
   })
 
   test('isServerSlug', () => {
-    assert(path.isServerSlug("/index"))
-    assert(path.isServerSlug("/abc/def"))
+    assert(path.isServerSlug("index"))
+    assert(path.isServerSlug("abc/def"))
 
-    assert(!path.isServerSlug("/"))
     assert(!path.isServerSlug("."))
     assert(!path.isServerSlug("./abc/def"))
     assert(!path.isServerSlug("../abc/def"))
-    assert(!path.isServerSlug("/index.html"))
-    assert(!path.isServerSlug("/abc/def.html"))
-    assert(!path.isServerSlug("/abc/def#anchor"))
-    assert(!path.isServerSlug("/abc/def?query=1"))
-    assert(!path.isServerSlug("/note with spaces"))
+    assert(!path.isServerSlug("index.html"))
+    assert(!path.isServerSlug("abc/def.html"))
+    assert(!path.isServerSlug("abc/def#anchor"))
+    assert(!path.isServerSlug("abc/def?query=1"))
+    assert(!path.isServerSlug("note with spaces"))
   })
 
   test('isFilePath', () => {
-    assert(path.isFilePath("/content/index.md"))
-    assert(path.isFilePath("/content/test.png"))
+    assert(path.isFilePath("content/index.md"))
+    assert(path.isFilePath("content/test.png"))
     assert(!path.isFilePath("../test.pdf"))
-    assert(!path.isFilePath("content/test.png"))
     assert(!path.isFilePath("content/test"))
     assert(!path.isFilePath("./content/test"))
   })
@@ -90,43 +87,45 @@
     for (const [inp, expected] of pairs) {
       assert(checkPre(inp), `${inp} wasn't the expected input type`)
       const actual = transform(inp)
-      assert.strictEqual(actual, expected, `after transforming ${inp}, ${actual} was not ${expected}`)
+      assert.strictEqual(actual, expected, `after transforming ${inp}, '${actual}' was not '${expected}'`)
       assert(checkPost(actual), `${actual} wasn't the expected output type`)
     }
   }
 
   test('canonicalizeServer', () => {
     asserts([
-      ["/index", "/"],
-      ["/abc/def", "/abc/def"],
+      ["index", ""],
+      ["abc/index", "abc"],
+      ["abc/def", "abc/def"],
     ], path.canonicalizeServer, path.isServerSlug, path.isCanonicalSlug)
   })
 
   test('canonicalizeClient', () => {
     asserts([
-      ["http://localhost:3000", "/"],
-      ["http://localhost:3000/index", "/"],
-      ["http://localhost:3000/test", "/test"],
-      ["http://example.com", "/"],
-      ["http://example.com/index", "/"],
-      ["http://example.com/index.html", "/"],
-      ["http://example.com/", "/"],
-      ["https://example.com", "/"],
-      ["https://example.com/abc/def", "/abc/def"],
-      ["https://example.com/abc/def/", "/abc/def"],
-      ["https://example.com/abc/def#cool", "/abc/def"],
-      ["https://example.com/abc/def?field=1&another=2", "/abc/def"],
-      ["https://example.com/abc/def?field=1&another=2#cool", "/abc/def"],
-      ["https://example.com/abc/def.html?field=1&another=2#cool", "/abc/def"],
+      ["http://localhost:3000", ""],
+      ["http://localhost:3000/index", ""],
+      ["http://localhost:3000/test", "test"],
+      ["http://example.com", ""],
+      ["http://example.com/index", ""],
+      ["http://example.com/index.html", ""],
+      ["http://example.com/", ""],
+      ["https://example.com", ""],
+      ["https://example.com/abc/def", "abc/def"],
+      ["https://example.com/abc/def/", "abc/def"],
+      ["https://example.com/abc/def#cool", "abc/def"],
+      ["https://example.com/abc/def?field=1&another=2", "abc/def"],
+      ["https://example.com/abc/def?field=1&another=2#cool", "abc/def"],
+      ["https://example.com/abc/def.html?field=1&another=2#cool", "abc/def"],
     ], path.canonicalizeClient, path.isClientSlug, path.isCanonicalSlug)
   })
 
   describe('slugifyFilePath', () => {
     asserts([
-      ["/content/index.md", "/content/index"],
-      ["/content/cool.png", "/content/cool"],
-      ["/index.md", "/index"],
-      ["/note with spaces.md", "/note-with-spaces"],
+      ["content/index.md", "content/index"],
+      ["/content/index.md", "content/index"],
+      ["content/cool.png", "content/cool"],
+      ["index.md", "index"],
+      ["note with spaces.md", "note-with-spaces"],
     ], path.slugifyFilePath, path.isFilePath, path.isServerSlug)
   })
 
@@ -146,13 +145,14 @@
       ["/tags/", "./tags"],
       ["content/with spaces", "./content/with-spaces"],
       ["content/with spaces#and Anchor!", "./content/with-spaces#and-anchor"],
-    ], path.transformInternalLink, (x: string): x is string => true, path.isRelativeURL)
+    ], path.transformInternalLink, (_x: string): _x is string => true, path.isRelativeURL)
   })
 
   describe('pathToRoot', () => {
     asserts([
-      ["/", "."],
-      ["/abc/def", "../.."],
+      ["", "."],
+      ["abc", ".."],
+      ["abc/def", "../.."],
     ], path.pathToRoot, path.isCanonicalSlug, path.isRelativeURL)
   })
 })
diff --git a/quartz/path.ts b/quartz/path.ts
index 8ea28c4..4a0bbb0 100644
--- a/quartz/path.ts
+++ b/quartz/path.ts
@@ -1,5 +1,5 @@
-import path from 'path'
 import { slug as slugAnchor } from 'github-slugger'
+import { trace } from './trace'
 
 // Quartz Paths
 // Things in boxes are not actual types but rather sources which these types can be acquired from
@@ -15,41 +15,54 @@
 //                    │                        │                                     │
 //                    │        getClientSlug() │                               .href │
 //                    │                        ▼                                     ▼
-//                    │                                                   
-//                    │                  Client Slug                           Relative URL
-// getCanonicalSlug() │     https://test.ca/note/abc#anchor?query=123          ../note/def#anchor
 //                    │
-//                    │   canonicalizeClient() │                                     ▲
-//                    │                        ▼                                     │
-//                    │                                                              │
-//                    └───────────────►  Canonical Slug                              │
-//                                         /note/abc                                 │
-//                                                                                   │
-//                                             ▲                                     │
+//                    │                  Client Slug                    ┌───►  Relative URL
+// getCanonicalSlug() │     https://test.ca/note/abc#anchor?query=123   │      ../note/def#anchor
+//                    │                                                 │
+//                    │   canonicalizeClient() │                        │      ▲     ▲
+//                    │                        ▼                        │      │     │
+//                    │                                  pathToRoot()   │      │     │
+//                    └───────────────►  Canonical Slug ────────────────┘      │     │
+//                                          note/abc                           │     │
+//                                                   ──────────────────────────┘     │
+//                                             ▲             resolveRelative()       │
 //                        canonicalizeServer() │                                     │
 //                                                                                   │
 // HTML File                               Server Slug                               │
-// /note/abc/index.html  ◄─────────────  /note/abc/index                             │
+//  note/abc/index.html  ◄─────────────   note/abc/index                             │
 //                                                                                   │
 //                                             ▲                            ┌────────┴────────┐
-//                           slugifyFilePath() │    transformInternalLink() │                 │
+//                           slugifyFilePath() │            transformLink() │                 │
 //                                             │                            │                 │
 //                                   ┌─────────┴──────────┐           ┌─────┴─────┐  ┌────────┴──────┐
 //                                   │     File Path      │           │ Wikilinks │  │ Markdown Link │
-//                                   │ /note/abc/index.md │           └───────────┘  └───────────────┘
+//                                   │  note/abc/index.md │           └───────────┘  └───────────────┘
 //                                   └────────────────────┘                 ▲                 ▲
 //                                             ▲                            │                 │
 //                                             │            ┌─────────┐     │                 │
 //                                             └────────────┤ MD File ├─────┴─────────────────┘
 //                                                          └─────────┘
 
+const STRICT_TYPE_CHECKS = true
+const HARD_EXIT_ON_FAIL = true
+
+function conditionCheck<T>(name: string, label: 'pre' | 'post', s: T, chk: (x: any) => x is T) {
+  if (STRICT_TYPE_CHECKS && !chk(s)) {
+    trace(`${name} failed ${label}-condition check: ${s} does not pass ${chk.name}`, new Error())
+    if (HARD_EXIT_ON_FAIL) {
+      process.exit(1)
+    }
+  }
+}
+
 /// Utility type to simulate nominal types in TypeScript
 type SlugLike<T> = string & { __brand: T }
 
 /** Client-side slug, usually obtained through `window.location` */
 export type ClientSlug = SlugLike<"client">
 export function isClientSlug(s: string): s is ClientSlug {
-  return /^https?:\/\/.+/.test(s)
+  const res = /^https?:\/\/.+/.test(s)
+  return res
 }
 
 /** Canonical slug, should be used whenever you need to refer to the location of a file/note.
@@ -57,9 +70,9 @@
   */
 export type CanonicalSlug = SlugLike<"canonical">
 export function isCanonicalSlug(s: string): s is CanonicalSlug {
-  const validStart = s.startsWith("/")
-  const validEnding = s.length === 1 || (!s.endsWith("/") && !s.endsWith("/index"))
-  return !_containsForbiddenCharacters(s) && validStart && validEnding && !_hasFileExtension(s)
+  const validStart = !(s.startsWith(".") || s.startsWith("/"))
+  const validEnding = !(s.endsWith("/") || s.endsWith("/index") || s === "index")
+  return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s)
 }
 
 /** A relative link, can be found on `href`s but can also be constructed for
@@ -68,15 +81,14 @@
 export type RelativeURL = SlugLike<"relative">
 export function isRelativeURL(s: string): s is RelativeURL {
   const validStart = /^\.{1,2}/.test(s)
-  const validEnding = !s.endsWith("/") && !s.endsWith("/index")
+  const validEnding = !(s.endsWith("/") || s.endsWith("/index") || s === "index")
   return validStart && validEnding && !_hasFileExtension(s)
 }
 
 /** A server side slug. This is what Quartz uses to emit files so uses index suffixes */
 export type ServerSlug = SlugLike<"server">
 export function isServerSlug(s: string): s is ServerSlug {
-  // must start with forward slash
-  const validStart = s.startsWith("/")
+  const validStart = !(s.startsWith(".") || s.startsWith("/"))
   const validEnding = !s.endsWith("/")
   return validStart && validEnding && !_containsForbiddenCharacters(s) && !_hasFileExtension(s)
 }
@@ -84,66 +96,107 @@
 /** The real file path to a file on disk */
 export type FilePath = SlugLike<"filepath">
 export function isFilePath(s: string): s is FilePath {
-  return s.startsWith("/") && _hasFileExtension(s)
+  const validStart = !s.startsWith(".")
+  return validStart && _hasFileExtension(s)
 }
 
 export function getClientSlug(window: Window): ClientSlug {
-  return window.location.href as ClientSlug
+  const res = window.location.href as ClientSlug
+  conditionCheck(getClientSlug.name, 'post', res, isClientSlug)
+  return res
 }
 
 export function getCanonicalSlug(window: Window): CanonicalSlug {
-  return window.document.body.dataset.slug! as CanonicalSlug
+  const res = window.document.body.dataset.slug! as CanonicalSlug
+  conditionCheck(getCanonicalSlug.name, 'post', res, isCanonicalSlug)
+  return res
 }
 
 export function canonicalizeClient(slug: ClientSlug): CanonicalSlug {
+  conditionCheck(canonicalizeClient.name, 'pre', slug, isClientSlug)
   const { pathname } = new URL(slug)
-  let fp = pathname
-  fp = fp.replace(new RegExp(path.extname(fp) + '$'), '')
-  return _canonicalize(fp) as CanonicalSlug
+  let fp = pathname.slice(1)
+  fp = fp.replace(new RegExp(_getFileExtension(fp) + '$'), '')
+  const res = _canonicalize(fp) as CanonicalSlug
+  conditionCheck(canonicalizeClient.name, 'post', res, isCanonicalSlug)
+  return res
 }
 
 export function canonicalizeServer(slug: ServerSlug): CanonicalSlug {
+  conditionCheck(canonicalizeServer.name, 'pre', slug, isServerSlug)
   let fp = slug as string
-  return _canonicalize(fp) as CanonicalSlug
+  const res = _canonicalize(fp) as CanonicalSlug
+  conditionCheck(canonicalizeServer.name, 'post', res, isCanonicalSlug)
+  return res
 }
 
 export function slugifyFilePath(fp: FilePath): ServerSlug {
-  // strip file extension
-  const withoutFileExt = fp.replace(new RegExp(path.extname(fp) + '$'), '')
+  conditionCheck(slugifyFilePath.name, 'pre', fp, isFilePath)
+  fp = _stripSlashes(fp) as FilePath
+  const withoutFileExt = fp.replace(new RegExp(_getFileExtension(fp) + '$'), '')
   const slug = withoutFileExt
-    .split(path.sep) // fs can have diff interpretations of /
+    .split('/')
     .map((segment) => segment.replace(/\s/g, '-')) // slugify all segments
     .join('/') // always use / as sep
     .replace(/\/$/, '') // remove trailing slash
 
+  conditionCheck(slugifyFilePath.name, 'post', slug, isServerSlug)
   return slug as ServerSlug
 }
 
 export function transformInternalLink(link: string): RelativeURL {
-  let [fplike, anchor] = link.split("#", 2)
+  let [fplike, anchor] = splitAnchor(decodeURI(link))
   let segments = fplike.split("/").filter(x => x.length > 0)
   let prefix = segments.filter(_isRelativeSegment).join("/")
-  let fp = "/" + segments.filter(seg => !_isRelativeSegment(seg)).join("/")
+  let fp = segments.filter(seg => !_isRelativeSegment(seg)).join("/")
+
+  // implicit markdown
+  if (!_hasFileExtension(fp)) {
+    fp += ".md"
+  }
+
   fp = canonicalizeServer(slugifyFilePath(fp as FilePath))
 
   if (fp.endsWith("index")) {
     fp = fp.slice(0, -"index".length)
   }
 
-  let joined = [_stripSlashes(prefix), _stripSlashes(fp)].filter(x => x !== "").join("/")
-  anchor = anchor === undefined ? "" : '#' + slugAnchor(anchor)
-  return _addRelativeToStart(joined) + anchor as RelativeURL
+  let joined = joinSegments(_stripSlashes(prefix), _stripSlashes(fp))
+  const res = _addRelativeToStart(joined) + anchor as RelativeURL
+  conditionCheck(transformInternalLink.name, 'post', res, isRelativeURL)
+  return res
 }
 
 // resolve /a/b/c to ../../
 export function pathToRoot(slug: CanonicalSlug): RelativeURL {
+  conditionCheck(pathToRoot.name, 'pre', slug, isCanonicalSlug)
   let rootPath = slug
     .split('/')
     .filter(x => x !== '')
     .map(_ => '..')
     .join('/')
 
-  return _addRelativeToStart(rootPath) as RelativeURL
+  const res = _addRelativeToStart(rootPath) as RelativeURL
+  conditionCheck(pathToRoot.name, 'post', res, isRelativeURL)
+  return res
+}
+
+export function resolveRelative(current: CanonicalSlug, target: CanonicalSlug): RelativeURL {
+  conditionCheck(resolveRelative.name, 'pre', current, isCanonicalSlug)
+  conditionCheck(resolveRelative.name, 'pre', target, isCanonicalSlug)
+  const res = joinSegments(pathToRoot(current), target) as RelativeURL
+  conditionCheck(resolveRelative.name, 'post', res, isRelativeURL)
+  return res
+}
+
+export function splitAnchor(link: string): [string, string] {
+  let [fp, anchor] = link.split("#", 2)
+  anchor = anchor === undefined ? "" : '#' + slugAnchor(anchor)
+  return [fp, anchor]
+}
+
+export function joinSegments(...args: string[]): string {
+  return args.filter(segment => segment !== "").join('/')
 }
 
 export const QUARTZ = "quartz"
@@ -153,16 +206,7 @@
     fp = fp.slice(0, -"index".length)
   }
 
-  // remove trailing slash
-  if (fp.endsWith("/")) {
-    fp = fp.slice(0, -1)
-  }
-
-  if (fp.length === 0) {
-    return "/" as CanonicalSlug
-  }
-
-  return fp
+  return _stripSlashes(fp) 
 }
 
 function _containsForbiddenCharacters(s: string): boolean {
@@ -170,7 +214,11 @@
 }
 
 function _hasFileExtension(s: string): boolean {
-  return /\.[A-Za-z]+$/.test(s)
+  return _getFileExtension(s) !== undefined
+}
+
+function _getFileExtension(s: string): string | undefined {
+  return s.match(/\.[A-Za-z]+$/)?.[0]
 }
 
 function _isRelativeSegment(s: string): boolean {
@@ -195,7 +243,7 @@
   }
 
   if (!s.startsWith(".")) {
-    s = "./" + s
+    s = joinSegments(".", s)
   }
 
   return s
diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts
index 85681f1..84ace74 100644
--- a/quartz/plugins/emitters/aliases.ts
+++ b/quartz/plugins/emitters/aliases.ts
@@ -1,4 +1,4 @@
-import { CanonicalSlug, FilePath, ServerSlug, relativeToRoot } from "../../path"
+import { CanonicalSlug, FilePath, ServerSlug, canonicalizeServer, resolveRelative } from "../../path"
 import { QuartzEmitterPlugin } from "../types"
 import path from 'path'
 
@@ -11,7 +11,7 @@
     const fps: FilePath[] = []
 
     for (const [_tree, file] of content) {
-      const ogSlug = file.data.slug!
+      const ogSlug = canonicalizeServer(file.data.slug!)
       const dir = path.relative(contentFolder, file.dirname ?? contentFolder)
 
       let aliases: CanonicalSlug[] = []
@@ -22,12 +22,10 @@
       }
 
       for (const alias of aliases) {
-        const slug = (alias.startsWith("/")
-          ? alias
-          : path.posix.join(dir, alias)) as ServerSlug
+        const slug = path.posix.join(dir, alias) as ServerSlug
 
         const fp = slug + ".html" as FilePath
-        const redirUrl = relativeToRoot(slug, ogSlug)
+        const redirUrl = resolveRelative(canonicalizeServer(slug), ogSlug)
         await emit({
           content: `
             <!DOCTYPE html>
diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts
index cb2853b..c9ad0a4 100644
--- a/quartz/plugins/emitters/contentIndex.ts
+++ b/quartz/plugins/emitters/contentIndex.ts
@@ -1,5 +1,5 @@
 import { GlobalConfiguration } from "../../cfg"
-import { CanonicalSlug, ClientSlug } from "../../path"
+import { CanonicalSlug, ClientSlug, FilePath, ServerSlug, canonicalizeServer } from "../../path"
 import { QuartzEmitterPlugin } from "../types"
 import path from "path"
 
@@ -65,10 +65,10 @@
   return {
     name: "ContentIndex",
     async emit(_contentDir, cfg, content, _resources, emit) {
-      const emitted: string[] = []
+      const emitted: FilePath[] = []
       const linkIndex: ContentIndex = new Map()
       for (const [_tree, file] of content) {
-        const slug = file.data.slug!
+        const slug = canonicalizeServer(file.data.slug!)
         const date = file.data.dates?.modified ?? new Date()
         if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) {
         linkIndex.set(slug, {
@@ -85,22 +85,22 @@
       if (opts?.enableSiteMap) {
         await emit({
           content: generateSiteMap(cfg, linkIndex),
-          slug: "sitemap",
+          slug: "sitemap" as ServerSlug,
           ext: ".xml"
         })
-        emitted.push("sitemap.xml")
+        emitted.push("sitemap.xml" as FilePath)
       }
 
       if (opts?.enableRSS) {
         await emit({
           content: generateRSSFeed(cfg, linkIndex),
-          slug: "index",
+          slug: "index" as ServerSlug,
           ext: ".xml"
         })
-        emitted.push("index.xml")
+        emitted.push("index.xml" as FilePath)
       }
 
-      const fp = path.join("static", "contentIndex")
+      const fp = path.join("static", "contentIndex") as ServerSlug
       const simplifiedIndex = Object.fromEntries(
         Array.from(linkIndex).map(([slug, content]) => {
           // remove description and from content index as nothing downstream
@@ -117,7 +117,7 @@
         slug: fp,
         ext: ".json",
       })
-      emitted.push(`${fp}.json`)
+      emitted.push(`${fp}.json` as FilePath)
 
       return emitted
     },
diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx
index cc36831..889cf60 100644
--- a/quartz/plugins/emitters/contentPage.tsx
+++ b/quartz/plugins/emitters/contentPage.tsx
@@ -4,7 +4,7 @@
 import BodyConstructor from "../../components/Body"
 import { pageResources, renderPage } from "../../components/renderPage"
 import { FullPageLayout } from "../../cfg"
-import { FilePath } from "../../path"
+import { FilePath, canonicalizeServer } from "../../path"
 
 export const ContentPage: QuartzEmitterPlugin<FullPageLayout> = (opts) => {
   if (!opts) {
@@ -24,7 +24,7 @@
       const fps: FilePath[] = []
       const allFiles = content.map(c => c[1].data)
       for (const [tree, file] of content) {
-        const slug = file.data.slug!
+        const slug = canonicalizeServer(file.data.slug!)
         const externalResources = pageResources(slug, resources)
         const componentData: QuartzComponentProps = {
           fileData: file.data,
diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx
index 0f06adc..7ac6d81 100644
--- a/quartz/plugins/emitters/folderPage.tsx
+++ b/quartz/plugins/emitters/folderPage.tsx
@@ -6,7 +6,7 @@
 import { ProcessedContent, defaultProcessedContent } from "../vfile"
 import { FullPageLayout } from "../../cfg"
 import path from "path"
-import { FilePath, toServerSlug } from "../../path"
+import { CanonicalSlug, FilePath, ServerSlug, canonicalizeServer, joinSegments } from "../../path"
 
 export const FolderPage: QuartzEmitterPlugin<FullPageLayout> = (opts) => {
   if (!opts) {
@@ -23,28 +23,34 @@
       return [Head, Header, Body, ...header, ...beforeBody, Content, ...left, ...right, Footer]
     },
     async emit(_contentDir, cfg, content, resources, emit): Promise<FilePath[]> {
-      const fps: string[] = []
+      const fps: FilePath[] = []
       const allFiles = content.map(c => c[1].data)
 
-      const folders: Set<string> = new Set(allFiles.flatMap(data => data.slug ? [path.dirname(data.slug)] : []))
+      const folders: Set<CanonicalSlug> = new Set(allFiles.flatMap(data => {
+        const slug = data.slug
+        const folderName = path.dirname(slug ?? "") as CanonicalSlug
+        if (slug && folderName !== ".") {
+          return [folderName]
+        }
+        return []
+      }))
 
       // remove special prefixes
-      folders.delete(".")
-      folders.delete("tags")
+      folders.delete("tags" as CanonicalSlug)
 
       const folderDescriptions: Record<string, ProcessedContent> = Object.fromEntries([...folders].map(folder => ([
-        folder, defaultProcessedContent({ slug: folder, frontmatter: { title: `Folder: ${folder}`, tags: [] } })
+        folder, defaultProcessedContent({ slug: joinSegments(folder, "index") as ServerSlug, frontmatter: { title: `Folder: ${folder}`, tags: [] } })
       ])))
 
       for (const [tree, file] of content) {
-        const slug = toServerSlug(file.data.slug!)
+        const slug = canonicalizeServer(file.data.slug!)
         if (folders.has(slug)) {
           folderDescriptions[slug] = [tree, file]
         }
       }
 
       for (const folder of folders) {
-        const slug = folder 
+        const slug = folder
         const externalResources = pageResources(slug, resources)
         const [tree, file] = folderDescriptions[folder]
         const componentData: QuartzComponentProps = {
@@ -63,7 +69,7 @@
           externalResources
         )
 
-        const fp = file.data.slug + ".html"
+        const fp = file.data.slug! + ".html" as FilePath
         await emit({
           content,
           slug: file.data.slug!,
diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx
index c5cf3b8..30717fa 100644
--- a/quartz/plugins/emitters/tagPage.tsx
+++ b/quartz/plugins/emitters/tagPage.tsx
@@ -5,7 +5,7 @@
 import { pageResources, renderPage } from "../../components/renderPage"
 import { ProcessedContent, defaultProcessedContent } from "../vfile"
 import { FullPageLayout } from "../../cfg"
-import { FilePath, ServerSlug, toServerSlug } from "../../path"
+import { CanonicalSlug, FilePath, ServerSlug } from "../../path"
 
 export const TagPage: QuartzEmitterPlugin<FullPageLayout> = (opts) => {
   if (!opts) {
@@ -31,7 +31,7 @@
       ])))
 
       for (const [tree, file] of content) {
-        const slug = toServerSlug(file.data.slug!)
+        const slug = file.data.slug!
         if (slug.startsWith("tags/")) {
           const tag = slug.slice("tags/".length)
           if (tags.has(tag)) {
@@ -41,7 +41,7 @@
       }
 
       for (const tag of tags) {
-        const slug = `tags/${tag}`
+        const slug = `tags/${tag}` as CanonicalSlug
         const externalResources = pageResources(slug, resources)
         const [tree, file] = tagDescriptions[tag]
         const componentData: QuartzComponentProps = {
diff --git a/quartz/plugins/index.ts b/quartz/plugins/index.ts
index c2841c3..5aed207 100644
--- a/quartz/plugins/index.ts
+++ b/quartz/plugins/index.ts
@@ -55,17 +55,17 @@
 export async function emitComponentResources(cfg: GlobalConfiguration, res: ComponentResources, emit: EmitCallback): Promise<FilePath[]> {
   const fps = await Promise.all([
     emit({
-      slug: "index",
+      slug: "index" as ServerSlug,
       ext: ".css",
       content: joinStyles(cfg.theme, styles, ...res.css)
     }),
     emit({
-      slug: "prescript",
+      slug: "prescript" as ServerSlug,
       ext: ".js",
       content: joinScripts(res.beforeDOMLoaded)
     }),
     emit({
-      slug: "postscript",
+      slug: "postscript" as ServerSlug,
       ext: ".js",
       content: joinScripts(res.afterDOMLoaded)
     })
diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts
index dd6f6f2..da1c343 100644
--- a/quartz/plugins/transformers/links.ts
+++ b/quartz/plugins/transformers/links.ts
@@ -1,5 +1,5 @@
 import { QuartzTransformerPlugin } from "../types"
-import { CanonicalSlug, transformInternalLink } from "../../path"
+import { CanonicalSlug, RelativeURL, canonicalizeServer, joinSegments, pathToRoot, resolveRelative, splitAnchor, transformInternalLink } from "../../path"
 import path from "path"
 import { visit } from 'unist-util-visit'
 import isAbsoluteUrl from "is-absolute-url"
@@ -9,15 +9,11 @@
   markdownLinkResolution: 'absolute' | 'relative' | 'shortest'
   /** Strips folders from a link so that it looks nice */
   prettyLinks: boolean
-  indexAnchorLinks: boolean
-  indexExternalLinks: boolean
 }
 
 const defaultOptions: Options = {
   markdownLinkResolution: 'absolute',
   prettyLinks: true,
-  indexAnchorLinks: false,
-  indexExternalLinks: false,
 }
 
 export const CrawlLinks: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => {
@@ -27,32 +23,34 @@
     htmlPlugins() {
       return [() => {
         return (tree, file) => {
-          const curSlug = file.data.slug!
-          const transformLink = (target: string) => {
-            const targetSlug = transformInternalLink(target) 
-            if (opts.markdownLinkResolution === 'relative' && !path.isAbsolute(targetSlug)) {
-              return './' + relative(curSlug, targetSlug)
+          const curSlug = canonicalizeServer(file.data.slug!)
+          const transformLink = (target: string): RelativeURL => {
+            const targetSlug = transformInternalLink(target).slice("./".length)
+            let [targetCanonical, targetAnchor] = splitAnchor(targetSlug)
+            if (opts.markdownLinkResolution === 'relative') {
+              return targetSlug as RelativeURL
             } else if (opts.markdownLinkResolution === 'shortest') {
               // https://forum.obsidian.md/t/settings-new-link-format-what-is-shortest-path-when-possible/6748/5
               const allSlugs = file.data.allSlugs!
 
               // if the file name is unique, then it's just the filename
               const matchingFileNames = allSlugs.filter(slug => {
-                const parts = toServerSlug(slug).split(path.posix.sep)
+                const parts = slug.split(path.posix.sep)
                 const fileName = parts.at(-1)
-                return targetSlug === fileName
+                return targetCanonical === fileName
               })
 
               if (matchingFileNames.length === 1) {
-                const targetSlug = toServerSlug(matchingFileNames[0])
-                return './' + relativeToRoot(curSlug, targetSlug)
+                const targetSlug = canonicalizeServer(matchingFileNames[0])
+                return resolveRelative(curSlug, targetSlug) + targetAnchor as RelativeURL
               }
 
               // if it's not unique, then it's the absolute path from the vault root
               // (fall-through case)
             }
+
             // treat as absolute
-            return './' + relativeToRoot(curSlug, targetSlug)
+            return joinSegments(pathToRoot(curSlug), targetSlug) as RelativeURL
           }
 
           const outgoing: Set<CanonicalSlug> = new Set()
@@ -63,26 +61,15 @@
               node.properties &&
               typeof node.properties.href === 'string'
             ) {
-              let dest = node.properties.href
+              let dest = node.properties.href as RelativeURL
               node.properties.className = isAbsoluteUrl(dest) ? "external" : "internal"
 
               // don't process external links or intra-document anchors
               if (!(isAbsoluteUrl(dest) || dest.startsWith("#"))) {
-                node.properties.href = transformLink(dest)
-              }
-
-              dest = node.properties.href
-              if (dest.startsWith(".")) {
-                const normalizedPath = path.normalize(path.join(curSlug, dest))
-                outgoing.add(trimPathSuffix(normalizedPath))
-              } else if (dest.startsWith("#")) {
-                if (opts.indexAnchorLinks) {
-                  outgoing.add(dest)
-                }
-              } else {
-                if (opts.indexExternalLinks) {
-                  outgoing.add(dest)
-                }
+                dest = node.properties.href = transformLink(dest)
+                const canonicalDest = path.normalize(joinSegments(curSlug, dest))
+                const [destCanonical, _destAnchor] = splitAnchor(canonicalDest)
+                outgoing.add(destCanonical as CanonicalSlug)
               }
 
               // rewrite link internals if prettylinks is on
diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts
index 325924d..a7f8f59 100644
--- a/quartz/plugins/transformers/ofm.ts
+++ b/quartz/plugins/transformers/ofm.ts
@@ -2,7 +2,6 @@
 import { QuartzTransformerPlugin } from "../types"
 import { Root, HTML, BlockContent, DefinitionContent, Code } from 'mdast'
 import { findAndReplace } from "mdast-util-find-and-replace"
-import { slugify } from "../../path"
 import { slug as slugAnchor } from 'github-slugger'
 import rehypeRaw from "rehype-raw"
 import { visit } from "unist-util-visit"
@@ -10,6 +9,7 @@
 import { JSResource } from "../../resources"
 // @ts-ignore
 import calloutScript from "../../components/scripts/callout.inline.ts"
+import { FilePath, slugifyFilePath, transformInternalLink } from "../../path"
 
 export interface Options {
   comments: boolean
@@ -139,14 +139,15 @@
         plugins.push(() => {
           return (tree: Root, _file) => {
             findAndReplace(tree, wikilinkRegex, (value: string, ...capture: string[]) => {
-              const [fp, rawHeader, rawAlias] = capture
+              let [fp, rawHeader, rawAlias] = capture
+              fp = fp.trim()
               const anchor = rawHeader?.trim() ?? ""
               const alias = rawAlias?.slice(1).trim()
 
               // embed cases
               if (value.startsWith("!")) {
-                const ext = path.extname(fp).toLowerCase()
-                const url = slugify(fp.trim()) + ext
+                const ext: string | undefined = path.extname(fp).toLowerCase()
+                const url = slugifyFilePath(fp as FilePath) + ext
                 if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) {
                   const dims = alias ?? ""
                   let [width, height] = dims.split("x", 2)
@@ -176,12 +177,15 @@
                     type: 'html',
                     value: `<iframe src="${url}"></iframe>`
                   }
+                } else {
+                  // TODO: this is the node embed case
                 }
                 // otherwise, fall through to regular link
               }
 
               // internal link
-              const url = slugify(fp.trim() + anchor)
+              // const url = transformInternalLink(fp + anchor)
+              const url = fp + anchor
               return {
                 type: 'link',
                 url,
diff --git a/quartz/plugins/transformers/toc.ts b/quartz/plugins/transformers/toc.ts
index ff79d66..01e0c8d 100644
--- a/quartz/plugins/transformers/toc.ts
+++ b/quartz/plugins/transformers/toc.ts
@@ -3,7 +3,6 @@
 import { visit } from "unist-util-visit"
 import { toString } from "mdast-util-to-string"
 import { slug as slugAnchor } from 'github-slugger'
-import { CanonicalSlug } from "../../path"
 
 export interface Options {
   maxDepth: 1 | 2 | 3 | 4 | 5 | 6,
@@ -20,7 +19,7 @@
 interface TocEntry {
   depth: number,
   text: string,
-  slug: CanonicalSlug
+  slug: string // this is just the anchor (#some-slug), not the canonical slug
 }
 
 export const TableOfContents: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => {
diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts
index 4f03c7e..0276ad4 100644
--- a/quartz/processors/emit.ts
+++ b/quartz/processors/emit.ts
@@ -19,6 +19,7 @@
 import { StaticResources } from "../resources"
 import { QuartzLogger } from "../log"
 import { googleFontHref } from "../theme"
+import { trace } from "../trace"
 
 function addGlobalPageResources(cfg: GlobalConfiguration, staticResources: StaticResources, componentResources: ComponentResources) {
   staticResources.css.push(googleFontHref(cfg.theme))
@@ -110,7 +111,7 @@
         }
       }
     } catch (err) {
-      console.log(chalk.red(`Failed to emit from plugin \`${emitter.name}\`: `) + err)
+      trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
       process.exit(1)
     }
   }
diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts
index 6d3d3d9..a782475 100644
--- a/quartz/processors/parse.ts
+++ b/quartz/processors/parse.ts
@@ -14,6 +14,7 @@
 import { QuartzTransformerPluginInstance } from '../plugins/types'
 import { QuartzLogger } from '../log'
 import chalk from 'chalk'
+import { trace } from '../trace'
 
 export type QuartzProcessor = Processor<MDRoot, HTMLRoot, void>
 export function createProcessor(transformers: QuartzTransformerPluginInstance[]): QuartzProcessor {
@@ -101,7 +102,7 @@
           console.log(`[process] ${fp} -> ${file.data.slug}`)
         }
       } catch (err) {
-        console.log(chalk.red(`\nFailed to process \`${fp}\`: `) + err)
+        trace(`\nFailed to process \`${fp}\``, err as Error)
         process.exit(1)
       }
     }
diff --git a/quartz/trace.ts b/quartz/trace.ts
new file mode 100644
index 0000000..47f9638
--- /dev/null
+++ b/quartz/trace.ts
@@ -0,0 +1,25 @@
+import chalk from "chalk"
+
+const rootFile = /.*at file:/
+export function trace(msg: string, err: Error) {
+  const stack = err.stack
+  console.log()
+  console.log(chalk.bgRed.white.bold(" ERROR ") + chalk.red(` ${msg}`) + (err.message.length > 0 ? `: ${err.message}` : ""))
+  if (!stack) {
+    return
+  }
+
+  let reachedEndOfLegibleTrace = false
+  for (const line of stack.split('\n').slice(1)) {
+    if (reachedEndOfLegibleTrace) {
+      break
+    }
+
+    if (!line.includes("node_modules")) {
+      console.log(` ${line}`)
+      if (rootFile.test(line)) {
+        reachedEndOfLegibleTrace = true
+      }
+    }
+  }
+}
diff --git a/tsconfig.json b/tsconfig.json
index d71eecb..ea8fd50 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -5,6 +5,7 @@
       "DOM",
       "DOM.Iterable"
     ],
+    "experimentalDecorators": true,
     "module": "esnext",
     "target": "esnext",
     "moduleResolution": "node",
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
deleted file mode 100644
index 8702ba4..0000000
--- a/tsconfig.tsbuildinfo
+++ /dev/null
@@ -1 +0,0 @@
-{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./globals.d.ts","./index.d.ts","./node_modules/preact/src/jsx.d.ts","./node_modules/preact/src/index.d.ts","./node_modules/preact/jsx-runtime/src/index.d.ts","./quartz/resources.tsx","./node_modules/@types/unist/index.d.ts","./node_modules/@types/hast/index.d.ts","./node_modules/vfile-message/lib/index.d.ts","./node_modules/vfile-message/index.d.ts","./node_modules/vfile/lib/minurl.shared.d.ts","./node_modules/vfile/lib/index.d.ts","./node_modules/vfile/index.d.ts","./quartz/plugins/vfile.ts","./quartz/components/types.ts","./node_modules/unified/index.d.ts","./quartz/plugins/types.ts","./quartz/theme.ts","./quartz/cfg.ts","./quartz/components/articletitle.tsx","./node_modules/property-information/lib/util/info.d.ts","./node_modules/property-information/lib/util/schema.d.ts","./node_modules/property-information/lib/find.d.ts","./node_modules/property-information/lib/hast-to-react.d.ts","./node_modules/property-information/lib/normalize.d.ts","./node_modules/property-information/index.d.ts","./node_modules/hast-util-to-jsx-runtime/lib/components.d.ts","./node_modules/hast-util-to-jsx-runtime/lib/index.d.ts","./node_modules/hast-util-to-jsx-runtime/index.d.ts","./quartz/components/pages/content.tsx","./node_modules/github-slugger/index.d.ts","./quartz/path.ts","./quartz/components/date.tsx","./quartz/components/scripts/util.ts","./quartz/components/pagelist.tsx","./quartz/components/pages/tagcontent.tsx","./quartz/components/pages/foldercontent.tsx","./quartz/components/scripts/darkmode.inline.ts","./quartz/components/darkmode.tsx","./quartz/components/head.tsx","./quartz/components/pagetitle.tsx","./node_modules/reading-time/index.d.ts","./quartz/components/readingtime.tsx","./quartz/components/spacer.tsx","./quartz/components/scripts/toc.inline.ts","./quartz/components/tableofcontents.tsx","./quartz/components/taglist.tsx","./quartz/plugins/emitters/contentindex.ts","./node_modules/@types/d3-array/index.d.ts","./node_modules/@types/d3-selection/index.d.ts","./node_modules/@types/d3-axis/index.d.ts","./node_modules/@types/d3-brush/index.d.ts","./node_modules/@types/d3-chord/index.d.ts","./node_modules/@types/d3-color/index.d.ts","./node_modules/@types/geojson/index.d.ts","./node_modules/@types/d3-contour/index.d.ts","./node_modules/@types/d3-delaunay/index.d.ts","./node_modules/@types/d3-dispatch/index.d.ts","./node_modules/@types/d3-drag/index.d.ts","./node_modules/@types/d3-dsv/index.d.ts","./node_modules/@types/d3-ease/index.d.ts","./node_modules/@types/d3-fetch/index.d.ts","./node_modules/@types/d3-force/index.d.ts","./node_modules/@types/d3-format/index.d.ts","./node_modules/@types/d3-geo/index.d.ts","./node_modules/@types/d3-hierarchy/index.d.ts","./node_modules/@types/d3-interpolate/index.d.ts","./node_modules/@types/d3-path/index.d.ts","./node_modules/@types/d3-polygon/index.d.ts","./node_modules/@types/d3-quadtree/index.d.ts","./node_modules/@types/d3-random/index.d.ts","./node_modules/@types/d3-time/index.d.ts","./node_modules/@types/d3-scale/index.d.ts","./node_modules/@types/d3-scale-chromatic/index.d.ts","./node_modules/@types/d3-shape/index.d.ts","./node_modules/@types/d3-time-format/index.d.ts","./node_modules/@types/d3-timer/index.d.ts","./node_modules/@types/d3-transition/index.d.ts","./node_modules/@types/d3-zoom/index.d.ts","./node_modules/@types/d3/index.d.ts","./quartz/components/scripts/graph.inline.ts","./quartz/components/graph.tsx","./quartz/components/backlinks.tsx","./node_modules/@types/flexsearch/index.d.ts","./quartz/components/scripts/search.inline.ts","./quartz/components/search.tsx","./package.json","./quartz/components/footer.tsx","./quartz/components/desktoponly.tsx","./quartz/components/mobileonly.tsx","./quartz/components/index.ts","./node_modules/gray-matter/gray-matter.d.ts","./node_modules/micromark-extension-frontmatter/matters.d.ts","./node_modules/@types/mdast/index.d.ts","./node_modules/micromark-util-types/index.d.ts","./node_modules/micromark-extension-frontmatter/lib/syntax.d.ts","./node_modules/micromark-extension-frontmatter/lib/html.d.ts","./node_modules/micromark-extension-frontmatter/index.d.ts","./node_modules/remark-frontmatter/index.d.ts","./node_modules/@types/js-yaml/index.d.ts","./quartz/plugins/transformers/frontmatter.ts","./node_modules/micromark-extension-gfm-footnote/lib/syntax.d.ts","./node_modules/micromark-extension-gfm-footnote/lib/html.d.ts","./node_modules/micromark-extension-gfm-footnote/index.d.ts","./node_modules/micromark-extension-gfm-strikethrough/lib/html.d.ts","./node_modules/micromark-extension-gfm-strikethrough/lib/syntax.d.ts","./node_modules/micromark-extension-gfm-strikethrough/index.d.ts","./node_modules/micromark-extension-gfm/index.d.ts","./node_modules/mdast-util-from-markdown/lib/index.d.ts","./node_modules/mdast-util-from-markdown/index.d.ts","./node_modules/mdast-util-to-markdown/lib/types.d.ts","./node_modules/mdast-util-to-markdown/lib/index.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/blockquote.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/break.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/code.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/definition.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/emphasis.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/heading.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/html.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/image.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/image-reference.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/inline-code.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/link.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/link-reference.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/list.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/list-item.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/paragraph.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/root.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/strong.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/text.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/thematic-break.d.ts","./node_modules/mdast-util-to-markdown/lib/handle/index.d.ts","./node_modules/mdast-util-to-markdown/index.d.ts","./node_modules/markdown-table/index.d.ts","./node_modules/mdast-util-gfm-table/lib/index.d.ts","./node_modules/mdast-util-gfm-table/index.d.ts","./node_modules/mdast-util-gfm/lib/index.d.ts","./node_modules/mdast-util-gfm/index.d.ts","./node_modules/remark-gfm/index.d.ts","./node_modules/@types/nlcst/index.d.ts","./node_modules/retext-smartypants/index.d.ts","./node_modules/remark-smartypants/index.d.ts","./node_modules/rehype-slug/index.d.ts","./node_modules/hast-util-is-element/index.d.ts","./node_modules/rehype-autolink-headings/lib/index.d.ts","./node_modules/rehype-autolink-headings/index.d.ts","./quartz/plugins/transformers/gfm.ts","./node_modules/@napi-rs/simple-git/index.d.ts","./quartz/plugins/transformers/lastmod.ts","./node_modules/mdast-util-math/lib/index.d.ts","./node_modules/mdast-util-math/index.d.ts","./node_modules/remark-math/index.d.ts","./node_modules/@types/katex/index.d.ts","./node_modules/rehype-katex/index.d.ts","./node_modules/rehype-mathjax/lib/create-plugin.d.ts","./node_modules/rehype-mathjax/svg.d.ts","./quartz/plugins/transformers/latex.ts","./node_modules/hast-util-to-string/index.d.ts","./quartz/plugins/transformers/description.ts","./node_modules/unist-util-is/lib/index.d.ts","./node_modules/unist-util-is/index.d.ts","./node_modules/unist-util-visit-parents/lib/complex-types.d.ts","./node_modules/unist-util-visit-parents/lib/index.d.ts","./node_modules/unist-util-visit-parents/index.d.ts","./node_modules/unist-util-visit-parents/complex-types.d.ts","./node_modules/unist-util-visit/lib/index.d.ts","./node_modules/unist-util-visit/index.d.ts","./node_modules/is-absolute-url/index.d.ts","./quartz/plugins/transformers/links.ts","./node_modules/mdast-util-find-and-replace/lib/index.d.ts","./node_modules/mdast-util-find-and-replace/index.d.ts","./node_modules/parse5/dist/common/html.d.ts","./node_modules/parse5/dist/common/token.d.ts","./node_modules/parse5/dist/common/error-codes.d.ts","./node_modules/parse5/dist/tokenizer/preprocessor.d.ts","./node_modules/parse5/dist/tokenizer/index.d.ts","./node_modules/parse5/dist/tree-adapters/interface.d.ts","./node_modules/parse5/dist/parser/open-element-stack.d.ts","./node_modules/parse5/dist/parser/formatting-element-list.d.ts","./node_modules/parse5/dist/parser/index.d.ts","./node_modules/parse5/dist/tree-adapters/default.d.ts","./node_modules/parse5/dist/serializer/index.d.ts","./node_modules/parse5/dist/common/foreign-content.d.ts","./node_modules/parse5/dist/index.d.ts","./node_modules/hast-util-raw/complex-types.d.ts","./node_modules/hast-util-raw/lib/index.d.ts","./node_modules/hast-util-raw/index.d.ts","./node_modules/rehype-raw/index.d.ts","./quartz/components/scripts/callout.inline.ts","./quartz/plugins/transformers/ofm.ts","./node_modules/vscode-textmate/release/utils.d.ts","./node_modules/vscode-textmate/release/oniglib.d.ts","./node_modules/vscode-textmate/release/rule.d.ts","./node_modules/vscode-textmate/release/rawgrammar.d.ts","./node_modules/vscode-textmate/release/theme.d.ts","./node_modules/vscode-textmate/release/encodedtokenattributes.d.ts","./node_modules/vscode-textmate/release/main.d.ts","./node_modules/shiki/dist/index.d.ts","./node_modules/rehype-pretty-code/index.d.ts","./quartz/plugins/transformers/syntax.ts","./node_modules/mdast-util-to-string/lib/index.d.ts","./node_modules/mdast-util-to-string/index.d.ts","./quartz/plugins/transformers/toc.ts","./quartz/plugins/transformers/index.ts","./quartz/plugins/filters/draft.ts","./quartz/plugins/filters/explicit.ts","./quartz/plugins/filters/index.ts","./quartz/components/header.tsx","./quartz/components/scripts/clipboard.inline.ts","./quartz/components/body.tsx","./node_modules/preact-render-to-string/src/index.d.ts","./quartz/components/renderpage.tsx","./quartz/plugins/emitters/contentpage.tsx","./quartz/plugins/emitters/tagpage.tsx","./quartz/plugins/emitters/folderpage.tsx","./quartz/plugins/emitters/aliases.ts","./quartz/plugins/emitters/index.ts","./quartz/plugins/index.ts","./quartz.config.ts","./node_modules/chalk/index.d.ts","./node_modules/@types/pretty-time/index.d.ts","./quartz/perf.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/minipass/index.d.ts","./node_modules/lru-cache/dist/cjs/index.d.ts","./node_modules/path-scurry/dist/cjs/index.d.ts","./node_modules/minimatch/dist/cjs/ast.d.ts","./node_modules/minimatch/dist/cjs/escape.d.ts","./node_modules/minimatch/dist/cjs/unescape.d.ts","./node_modules/minimatch/dist/cjs/index.d.ts","./node_modules/glob/dist/mjs/pattern.d.ts","./node_modules/glob/dist/mjs/processor.d.ts","./node_modules/glob/dist/mjs/walker.d.ts","./node_modules/glob/dist/mjs/ignore.d.ts","./node_modules/glob/dist/mjs/glob.d.ts","./node_modules/glob/dist/mjs/has-magic.d.ts","./node_modules/glob/dist/mjs/index.d.ts","./node_modules/rimraf/dist/mjs/index.d.ts","./node_modules/@nodelib/fs.stat/out/types/index.d.ts","./node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts","./node_modules/@nodelib/fs.stat/out/settings.d.ts","./node_modules/@nodelib/fs.stat/out/providers/async.d.ts","./node_modules/@nodelib/fs.stat/out/index.d.ts","./node_modules/@nodelib/fs.scandir/out/types/index.d.ts","./node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts","./node_modules/@nodelib/fs.scandir/out/settings.d.ts","./node_modules/@nodelib/fs.scandir/out/providers/async.d.ts","./node_modules/@nodelib/fs.scandir/out/index.d.ts","./node_modules/@nodelib/fs.walk/out/types/index.d.ts","./node_modules/@nodelib/fs.walk/out/settings.d.ts","./node_modules/@nodelib/fs.walk/out/readers/reader.d.ts","./node_modules/@nodelib/fs.walk/out/readers/async.d.ts","./node_modules/@nodelib/fs.walk/out/providers/async.d.ts","./node_modules/@nodelib/fs.walk/out/index.d.ts","./node_modules/fast-glob/out/types/index.d.ts","./node_modules/fast-glob/out/settings.d.ts","./node_modules/fast-glob/out/managers/tasks.d.ts","./node_modules/fast-glob/out/index.d.ts","./node_modules/globby/index.d.ts","./node_modules/@types/serve-handler/index.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/remark-parse/lib/index.d.ts","./node_modules/remark-parse/index.d.ts","./node_modules/mdast-util-to-hast/lib/state.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/footnote.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","./node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","./node_modules/mdast-util-to-hast/lib/index.d.ts","./node_modules/mdast-util-to-hast/index.d.ts","./node_modules/remark-rehype/lib/index.d.ts","./node_modules/remark-rehype/index.d.ts","./node_modules/to-vfile/lib/index.d.ts","./node_modules/to-vfile/index.d.ts","./node_modules/@types/workerpool/index.d.ts","./node_modules/@types/cli-spinner/index.d.ts","./quartz/log.ts","./quartz/processors/parse.ts","./quartz/processors/filter.ts","./node_modules/micromorph/index.d.ts","./quartz/components/scripts/spa.inline.ts","./node_modules/plausible-tracker/build/main/lib/request.d.ts","./node_modules/plausible-tracker/build/main/lib/tracker.d.ts","./node_modules/plausible-tracker/build/main/index.d.ts","./quartz/components/scripts/plausible.inline.ts","./node_modules/@floating-ui/core/src/computeposition.d.ts","./node_modules/@floating-ui/core/src/detectoverflow.d.ts","./node_modules/@floating-ui/core/src/middleware/arrow.d.ts","./node_modules/@floating-ui/core/src/middleware/autoplacement.d.ts","./node_modules/@floating-ui/core/src/middleware/flip.d.ts","./node_modules/@floating-ui/core/src/middleware/hide.d.ts","./node_modules/@floating-ui/core/src/middleware/inline.d.ts","./node_modules/@floating-ui/core/src/middleware/offset.d.ts","./node_modules/@floating-ui/core/src/middleware/shift.d.ts","./node_modules/@floating-ui/core/src/middleware/size.d.ts","./node_modules/@floating-ui/core/src/utils/recttoclientrect.d.ts","./node_modules/@floating-ui/core/src/types.d.ts","./node_modules/@floating-ui/core/index.d.ts","./node_modules/@floating-ui/dom/src/autoupdate.d.ts","./node_modules/@floating-ui/dom/src/platform.d.ts","./node_modules/@floating-ui/dom/src/utils/getoverflowancestors.d.ts","./node_modules/@floating-ui/dom/src/index.d.ts","./node_modules/@floating-ui/dom/src/types.d.ts","./node_modules/@floating-ui/dom/index.d.ts","./quartz/components/scripts/popover.inline.ts","./quartz/processors/emit.ts","./quartz/build.ts","./quartz/path.test.ts","./quartz/worker.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/debug/index.d.ts","./node_modules/@types/mathjax/index.d.ts","./node_modules/@types/parse5/lib/tree-adapters/default.d.ts","./node_modules/@types/parse5/index.d.ts","./node_modules/@types/web/iterable.d.ts","./node_modules/@types/web/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"f59215c5f1d886b05395ee7aca73e0ac69ddfad2843aa88530e797879d511bad","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","27147504487dc1159369da4f4da8a26406364624fa9bc3db632f7d94a5bae2c3","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","f4e736d6c8d69ae5b3ab0ddfcaa3dc365c3e76909d6660af5b4e979b3934ac20","eeeb3aca31fbadef8b82502484499dfd1757204799a6f5b33116201c810676ec",{"version":"3dda5344576193a4ae48b8d03f105c86f20b2f2aff0a1d1fd7935f5d68649654","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"9d9885c728913c1d16e0d2831b40341d6ad9a0ceecaabc55209b306ad9c736a5","affectsGlobalScope":true},{"version":"17bea081b9c0541f39dd1ae9bc8c78bdd561879a682e60e2f25f688c0ecab248","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"ab22100fdd0d24cfc2cc59d0a00fc8cf449830d9c4030dc54390a46bd562e929","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"36ae84ccc0633f7c0787bc6108386c8b773e95d3b052d9464a99cd9b8795fbec","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"f06948deb2a51aae25184561c9640fb66afeddb34531a9212d011792b1d19e0a","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"61ed9b6d07af959e745fb11f9593ecd743b279418cc8a99448ea3cd5f3b3eb22","affectsGlobalScope":true},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"f5c92f2c27b06c1a41b88f6db8299205aee52c2a2943f7ed29bd585977f254e8","affectsGlobalScope":true},{"version":"930b0e15811f84e203d3c23508674d5ded88266df4b10abee7b31b2ac77632d2","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"b9ea5778ff8b50d7c04c9890170db34c26a5358cccba36844fe319f50a43a61a","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true},{"version":"25de46552b782d43cb7284df22fe2a265de387cf0248b747a7a1b647d81861f6","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"189c0703923150aa30673fa3de411346d727cc44a11c75d05d7cf9ef095daa22","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},{"version":"134d17146352bc4d1b3411101dde431269cf9a97f2392b98ebe4d47c788044a8","affectsGlobalScope":true},{"version":"fb374a56248d8a0717687924469f8a022a4e95a2d3502f5ac79fdaf01f15edf6","affectsGlobalScope":true},"cf0779719c437592be3ed4cb0f76760a13aa6c6408e53ea6ab186a92d8b65002","2f6891be00549893b5ce20ba53f1940f56822053d1a71b8a455ee699478a7468","670683503e4e107e88dfec53d4360106fefb23ae2cb01575ba338849647b15f2","4dbc7cdffebc96b5c0a1f3e4100c749d84f9be441685a263bc197ef495cef2a7","cddf5c26907c0b8378bc05543161c11637b830da9fadf59e02a11e675d11e180","3d2cd8f3047fff04a71e7037a6a4cb9f4accb28dbd8c0d83164d414811025af0","e0c7d85789b8811c90a8d21e25021349e8a756a256ae42d9e816ecd392f00f71","bb8aba28c9589792407d6ae0c1a6568f3ddc40be20da25bc1939e2c9d76436bb","8fa1868ab5af3818ff4746f383ea84206596e284f7dc5ffd40a0fac08ed093f9","8d4537ea6fcdde620af5bfb4e19f88db40d44073f76f567283aa043b81ef8a3e","0bb848976eff244e33741d63372cbfb4d15153a92c171d0a374a3c0ef327a175",{"version":"369a83721bb0977289073703f8d75ceffffc0f630260b1a9ffe7b1220b2c922c","signature":"85f430f0f0dfd94d427b372e3bc3f15ae1bfd0bc158519f3eb3d26d3f2645356"},{"version":"bef50c2685584c78d81d93ca76ecd0ffe9fd2eb2e34758f59ea29e6ff00e1b82","signature":"75893e466a422fdafdc5aeaa4bb5681dc2381f339926ae07b7529b80fa63ec53"},"af79b166f5d41ec2ebae57e9b67df564452b90ae3f0af4cb3c2d8ad5adbfd2db",{"version":"276a5c443d019f60448c1cd3fa93dcbceab53b77f8ff11a02102daf99d6318e5","signature":"fc67371f45ff5255e73cc5b7b004a4c92517f808acdced809bdd5587cf7a4744"},"8467c73fc9a9ee4ff0ae236129b62dc3c3b0f2af70c33c1db2d338ba36f7c260",{"version":"7ef387251336b35d187c774cc9f0276489debebdaecacdff5ed1a619d0105763","signature":"837782aa36f46d05bd43a56b132e1e18d479653b1424df37e13f17ac944e7367"},{"version":"4653a12ee110d48697801371a08c4d14cc78977c14cf6fc73c73b2b6d0713a51","signature":"db268b93914f3bdbedf2e95c7bd400873cd25036dc62df98a38b2ad36726640f"},"7bd32cd2e05737c6a5041ca7a31ceca0c14ce065661c5d1ae5f7bfa35ff3fc5e","bdbb3f4e3f608f6034a78af17466f05ee85b1f1414f5e6f25f591c73a2f9b015","74e27c864416d1ad8947d13cef35e7c9afe0608255eb455096026e988c962295","46ab5ea5cdbc0ce75ade44ec0d9aa164f81e42b061d8e573b832a73ed181da57","d752d4dde165ab9bd56ddd111f59a6bf46eebbc6d4ba4e433f2ea21d1d0599e6","6527f50c0513ce908927055546f39578b9aaed6f1a69dec209b9101fd2d41017","222a249948ca193e1d11201057fe385cd69318c52314cf0a39d88d82739b7b20","4da5022999387d1d65bb058196da994891b4c46ec908c6571503dcf434766895","90c6c9dd17a3ca7c4aecf3990bc338f3a4575b70c38cac4e30d5e430f204deed",{"version":"6e4fc77ba2afcc9132c73f607740db26733d4c134546e0348950b6663292cc9c","signature":"82bd148e92253d2a148a37dff77659d20fce265b38068adf0a75aff3fe269020"},"1ac0f0d4aa1197aded0e7a41a08d2e687e7db61c967a2fad216b736f18a740fa","1b416e8211cb1da1abf942e1dfc49c6a7abf076151b219a56f5a97e5b2511c59","97d8c3d7909eaa03744e52bf89710e0a0b8397207fc0c32e5b36c6727f4c81d6","fa5ee48aad3d5d896fe40d6fe44f3dcbd250a9c85f5a2388363b25a0ff81b595",{"version":"5d74bae80a5b9b5ef5f797d98b2af3c5dd16e6670a607ffbf331e3c3d9f8b8ba","signature":"cb678ed8e3849ea3c71e229b42a8cdd53af719cdb3a0eb83107a230b2b152c82"},{"version":"467dff6e3bff3b38512ae04a684c7689659ad68febe8ec5939644f86abcc7962","signature":"a53cef57a41a198fa6895d114eb4d6f0d33b4b5c07618daf1cd4387ff2ade683"},{"version":"ecfd93a80956d243396282949bb0cce6382a399543d9a818169afac6b9ba75df","signature":"a24bc2e360abb87d683adfa231ff4a662f1e4031f847b26853f6743d03e5f07f"},{"version":"8d557cb367ee184dcb14d4626f094b50f92fa2dd9210ae1520243f5a3224f488","affectsGlobalScope":true},{"version":"bb1379f0079b639f1ad87048e58769ee67f36ec29b51a45906fb70cd8f9de1c8","signature":"c9cc7d2475deade9d2957ddd34981c4ef0dbbb81cce769f55fa1f2670b1d8546"},{"version":"4dd2d0f50ecc676fb824ae815e6db238096dbbb7c9d4cdf94570c60d1e40a6a5","signature":"b065d365ec0061cee80a56418eaf525157d1508ee9f54397c25a8cfacc2d4938"},{"version":"36efb6babf2c57021ed7c14978e6011ecf2d11b6b5a1bae935f5be10cdb9b1ba","signature":"30e33547a746e1f12f63ff74aa06db5abbd438c0f95a4f0635a52c0bdab119ea"},"3d1600dc772549c3eacc2b8b0b26f2fd51f269cb863504b3edc3bd7dbbb1e4d2",{"version":"3baccd6f2ad621c0cded0a13433711955e995c6ddd4009341206bb8fe5104f75","signature":"e3108ecd5a11b42d161aa318d1491db01e9ac3be64de77092e251478a1822477"},{"version":"9df529fdab08272fe3561ef9f54db65e4b1c12f11d9c2f6a7bb548fe0e1b50b6","signature":"9ee0417c5daee73d5a9b59d16fe3b66885de09de5b84ea204035c4b69e90ce3f"},{"version":"1bb74e8ef96bba804760216526e3ec5e547e4e1ebe9ae31274c49c96d98ffd28","affectsGlobalScope":true},{"version":"3b3eb21e2ca06c9b7ca4834a093e17e3d8166980cb84627e251a8801bba86798","signature":"c58bb444d526af6c9a29499052cc6c9282d679ee0c3b6490beebc3d8c6e829ac"},{"version":"83d5b0ace587be89d75c65626a5f27b773171d1d3f09a1bcb92a18dad1c3fc86","signature":"6f11b7d2d2015e4fb61d1ddd1c35435b44540935174b5009448b86ac9f337a12"},{"version":"752bc0d967be82657c7512624fb80f15b97dbdf935702610fd7442507423ba21","signature":"b70e088421b042a4e3518565605479bce7758369d230c0bef9609d64c85e80f5"},"4fa5c6721346cafc445797831da394916f173d79a8343ac8bbf183d06042e869","a8c897d63ae6e779bbc4f4753a386389dfc3a45ceec6b6672f55b072d822d302","8fddb452bfcb60c598245e997aa9c9dce14b85a4c2e02489a50d97ab49e9b622","25d505ffc43befd205d780441b0a16e752ec1028f383a55cadd41841d1c7f153","39cb5be3f5302e759253b89f11bd3e885930b5649b840f4d5a81a763a5dd6c40","8a460dcdabe873ab0a85e421a7f339ad74445f60917bf67deed7d15d836b0247","a3b6c93a9838b8c94c6998e85646d6f2d07c20ecfe1e235dba62158b29451391","8f2d349c69976569d4c32e0e4e66598c9688159cac28cde38bbe0039dd1cadfa","6adc0305186bd1f72ca64adbd054b8e5e71f93b1d0623e90ebabf153541c06c0","c85a93f216df4ebb6dfea7ad46c8d6161a0f1948a20967ba0c85f0fff3f9edcd","0df330f74158aee4ce076b0bb15eb53fab95f615d26ccbd6ec6f5c4273110047","7b2ff705f3c3358807afce85ef146b7f7cdc882a79442630b034ec24d6a3906e","344ac2d6764eaa6b23b2e8e736c9bf0ae06a53479c6a1371d3d89ac964022692","e5907221fa3198e26f294ad77bf8f2996990b40484fe6781b65e099b1fe57933","ada362e162ad90df10c921c845546d911a6ad648a641a6945bf08c3ef1a09a17","f156602a8527c97f898fc96a33b7e025eed27870c2a63842c0c9ed506d7203ea","a8c34714c5da0bb0d2f74d31a44c9fb8b3b87efe6d8a0891182f9f6077723e69","4b51be04eb5bd9b929448380b3ced483ef1f6c3bbfaf7d3425bdbfa3b8eab11f","c24944ff5879b91478b153cf16802b9c6a10cfa3b7d85855813a08431ec2d36a","f1ba7a42f644ba5a281dd41b4bfc813d1f4a59e9c99227315cf778284d1e0b22","7adc301a699032ffd6d57e9ce97b2507e2ad652771cda558cb7ebb49a06e7696","f6319ead2de997fe24e6acc3594942d6819a4570f40e42cb979f5b078f3da1ca","4d3ae1585844151755e9d76cc41d82a6770b150559cb318c5366c869d487e01f","589cbf58df97db61280be456952054f5d54070e87a2c371303844a4bb288d8fa","c4e910182d6de2fcb3922631733faafdecd593370248adc1013be93352a8cc78","6bbf574c575a0491388f32aaa69c648140f24637b1d98ea6f3c97074c339f9e9",{"version":"07104ffff8802481908f08b4a220e399cc692d5edcfaaa7e6632156fc267be35","affectsGlobalScope":true},"3e135eeb6a6be4b07c1d2a170c105dde5f8b5c705f9be4e0f01166259724f125","f6c30cfb96957bb21586996d7c5d5861c236417f31b5f790055624c7df07e944","be04184c354d4b7207e68298ea4e0539cd3e55889778f3bad120c71593ad408e","37cf86c0651242b9b8c1b0bf89228a7be8ae40db6f3aac0b9e1de75bc7ddd5cb","32e5beeefac1493f9dbf2498eb4de6b5ef69a411eb1b9321cdf25a6f37086361",{"version":"de91e4ee1bf679de40c7d9999c8eaa5b321176a23f2d1055cc86fa1d7d564924","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f4b452975bfbbb8a81d75386df7f1fd73121305dfd2d48a0ad9fa047a99f7e79","signature":"258ede9ca49f1cdab01cf7e562a48c5fdf55ccd4c8ec1aefa8561ea3ba4b002d"},{"version":"ad87caeb7cd6811e6035ad71861fcb9286b95a989f10e65056fc49028ee57709","signature":"34576638e093402e0614bbb69ac5f9a31f7b6881a2a6b05366440ee282a22d6c"},"30b5b2c77d0e23531941808d959ee50ab2d08c3b385d2f446203c0d5d851e252",{"version":"163f47b34144cddef467f26b428e41eae1a6132bf0cd774b4c6799df06ffc2bb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"22618530eec9f4aeaf44e7061fec5d9ec5d6fafa056877d2c9bd0ee5aff0255f","signature":"1423c5fab3117766e5080c593d8df04b898828c2cf34f6470456e5cce0e2107b"},"0f11d4db150840ac7be219fbcdde79dc02f9a77ebabcdd44c75d4d08f67faeb8",{"version":"311ec4381f9ca24750633a50b26fda87301274795fa786ca95a6723d63476a5d","signature":"710def090bb8066719ca23215c6be6d92593558476fa328f2be96893c4b85ef9"},{"version":"718accccc7822237fb0c70a9d0dcdce1714cb2282a20a8b6f2636c732cc9ce6f","signature":"9ccbbf82b7d1ca86f53d976576fe377302cf953efe6eb052aa75f95a30540a39"},{"version":"39582cde4757322edd52727a83a1c416d2e07a82b99f7341cdd2b07b07a8c082","signature":"9ccbbf82b7d1ca86f53d976576fe377302cf953efe6eb052aa75f95a30540a39"},{"version":"8accbcc195dc98c4d79023bf6ba7f0c5fd8347cbbb14a89641bf2063596bec07","signature":"4f983e837ce44bab9b258d34354ae7f82f6699f96675a35f39db62a675c97ddc"},"a52c5f687d788d283ea1fa38bdc2fabe0eac863135a7dfe175ec52b309f61892","fa81d09d80cc4288c57f8b0c30892392fc9ea7b1d59c3126472f432cb8f305dc","5774751340e987a6a9e4a5dcc03ff68a6515adc2b91423e1af2f660fc8f30e81","4cef6b76f45c58ff3044e1851afecd32be09fa6def7a626115b555b063e3e9ef","4fedbda3802091cd7dc7ca57059790ec6456a67a1f62638d0734d13e5b558d34","fea1f289a0585cdb13cd296e7fae0faaaa5dbf94d94687fe9d4f55dba6f4e138","9e4646339b6e49806147a857bedbb5d7d930a8101fb4724b4a0e2eb7910ac69d","0c0ad11991c2556f9c0e3074cc2f9bd04bd704f546b40363aec12c3fa5d5e41c","686e548ae30250d62532c8cacb43fccc922b693408371bd3503563c4a0f28eed",{"version":"ed3fa940ce95a8872ed25b4a6b1c3dd9e552aecf302cdc27db550de9615242b0","signature":"77336f441a096bdb2ca4a8321afa5c0db164a4a81b9b85c07823b06a9214f847"},"8510f56ab8598d18ec11cb2535112e2aace53e06da7d2d4fbb046e5c6cfb743e","1f85065e4d231eeb843a8485847ca66855a82984db1788ead57db359c6a52128","f10c018418c8621e4ab10596aed7202c49c36df8fda7f3c8a6ceba18724f4f85","26c304c279c0faf6ac61854c67373342e002a3d6c7ff0d8fcc7cee94f0ad323a","cc4ad1e0de78e65fbf1603669017fb939355e7bb4d38e48e78af619a390e4e23","f7598141e8c7143330f1cbfecb221b6f2beb95dc853ad6c20842891442944d0b","7ccd7b1d3c72e8ee639f48aaf190a4d2c9bf4c6650a22501d0fa98b8e3fc2fe1","31c74be259150eec1e3f8f4113f99cd10d5f1a278a5a7ef6fa29478d71766618","171a8d5b10a71ab01c4f43c110565a6a81d975eef7c46be20fc8162e21b2f188","ac052259a6eec4dc9e73e2309a64fa0fc4f7edba776418355b25e67cf24d3318","e83857dd6e1c80bacacdaee3eaf2bd71d8331880fd4705489e5e1383e0ac78a8","dceb21129b0ae66beddafba41b8765f27bf95669a8f7fbe3e94025e01c9351a8","859ea22746d11ed8386ec8d9b63b998462510705d527b83494f6a2fcaa7a5de4","825b79a00bb5650472780a23f75ee17cffe4d0eae235da96e50d3b8cd9456ea5","5b6ba1af9d52d4a47eb6908d1aebd2fe348d8212205b203d25ae528b46822eff","92ae8af22ba9f4d3728ee0075a23f5a9f2e071bb677e7db01ec2f44cc01ed473","a3f55be7fa724c524698e82466c2a651f352e673f63428d953923de161b1095c","f34def9623f89b02ac2568eeee0cfa655411e56b79f1198143053709d1987110","bc0d6e115f78a602be8f82c6977c3a3b4f84fa144e06706bd768797cd683f2b5","fb4b80d4f7140829a10b48ea77584e191098d20fbe77039e171fce8de1b257ac","871b7a0478e9b76721ca4f596acd219b2ff60f58fbf95198117ce4c1bf8eb52a","38a6564c83f8e5c76f0cbbd823c5ed16c9ea9e55f25629ca4a1384d3447b27f9","2faea076f501719cba9eb56cdf431e5efc09bc81b12a4329a825fedce77c6503","46f0d38a72546ad31308f6730267f835bea40803b9117c42a29ad009706cda9f","3a2cad3fdc52e8407c3c9a044c10a4db897bba4c1e30a96461f2e7b2be9955c0","a8e0ac700a94d9a42add85453d32842101fb1f08c1a296a02eb27105e78917e1","70cb02181c04656d711bca5c332549beae390bed0107bd97c419a3466bb39306","afe412b89ebed32a7eb2e44fe185cb24027d36f8543023e57ca36ead6e59193c","5a0012861a95843c567475a90362f686019af229a8946779ccc44c7efb5b1f44","586c4ef6496185cdbc08391fdc5f49dd80b14cdb2d01ace355b2b150f3fe71eb","148e197eb64a4c80531e4c959012755ce7fbfdbcb8d17721eac0c8a983c3e51c","edb06b0fc903fc619a7f2a3aeb6579e5b787eb624c349da738b574720558a596","d6fdaeb6f1e4e29d7827e30d743dfef5cb6c8bca4bc546001a3b3e751a2de06c","92f92e2b21f14f7ad07b15902ba806b89f37d8a83a7d127f7e638f92f241ddf8","74f4c396d57693d72e769ccc21b83542a78a6f3825ee0fe69cfefd7713f5e6cf","03a3957f7ccf2ceb0940c64e35734ed50c0d090c161924c44e79cfb7c9c437f1","010bb5235c40300fe81fd4af2dc7d48b573ef626e65d529242035274121f4c83","801bcd63fc346570aa633c166bc5869da8cb9ad252e113c4fe46800296f54147","1b23c2aae14c17f361f6fcef69be7a298f47c27724c9a1f891ea52eeea0a9f7f","4dd0179485e44a0d416b258ffc27667454ee4da96a7816ca998909cc42891d09","ff9426068448c2ecd28cef056c51c7eb9dbaeb3c7b8a5ab4843103d9081840eb","0a8e2910c8837f59fc6866cf9b81d4bb8c2d5449a242b7c0f8a41f07e88a07d8","9691ea7fbb97b0f4b0b8ce69d07b3f928800882e3b806bcd0b3bba12d2c7f443","78c5ff36a7b6e97c7825be17744fd45ffb2770ec40f486ca3dc4c1f9fabe2b6e","3c33c018c64e65691075dfae05fbc58febd6ce2d452257c35505ca70c96899d7",{"version":"07c5f039a0f2342f28d84d0b3e2048df3834e9a8f10da33905fd9d0ba914745f","signature":"8834205ba141ab91313b86538e251c725253c8929ee16ffe25dcaa8aff209dac"},"9ccad2264d463d89f9246a6e2b3c5fc2ea4fa93fd1d766661dd3fc06a0ec6128",{"version":"1ff93d60f6c23c7a52974c9378a854cf0ce492cf219db5d1db24065a35cdb7b0","signature":"11535ba3e664110f0c5d406378ce9cdf5c606c5507bcdbf468e297b9c15ae79b"},"eac47ed99cc76de6507dd9d6a9910023d3fd810227f473050546c1b786bead4b","5cc3a8b25d4670152aff1f05614a58c94829388c033951aebf4be5cfa6c43ea9","6ba2d97e94a13a5c21c3c7105f01fda5491b7ecf638230cebc46ead1204a8559","a3c1977660766af91c7b8efe2106792f0f6375bde60a4f28a438242bd93c558e","ee2beb928f0554aacc404552cb44c86c8afd1aaf8e452e405e37861681c695bd","595d5cf77d30d6b5e8609b13d0597915f05cb37773e7668d3080ed8bf04e487b","18669ea666474ce42b7975382c3b9a5768e219996146ec066b5f983827bdbaed",{"version":"ea325be965da0249e3bc7523e672e9a33a12e0b4cc392128a3af397c58478716","signature":"d1298f05ad9476d943168d307d9e712f93354a171da3355c59a4ee65f2561e7f"},"86ae9ad4466ed3302ebdf35cb380df8d798f998f44c76c8985d8edce586fa0cb",{"version":"017e963a93d80f331641c2fa19a2362a987d82d46cf67ab3818e894a9a89dc4e","signature":"c13809b0af560a664d6c648bf57ab6ab8852eae07c341b5f0be1239380a6ebef"},"63c010c8e3e0c33bfe2c4fffca858f9a7a28ee84c090652ae9f8501a6037afe5","c8abd849f7fdb1e4787b53520896cf142f2e19821f9af86615a6af4436074eef","cab76feb8bdafd8f888d060a7a014f5a407c7599e0b0d1f85e4e36694248a1f8","41a2c5474756ee1b12e5502bcaadddd6daa9b79e5fbed24b5c9e7d4352383170","cee0181994c0afe05ffc4bfc05ffdf4eba3275cef012c562b23572056e8b3466","0801dffb28c9a67ab387b8bd47392c05bbe3678d56b95a9127015e116437435f","d4de3f9c6acd93a96b7551506870ae1b84a60d07ba075d2d99296f9e27b96d35","083609ca47c047c6802bd40e974346a9509ef28367bb07769dbcead77cc7359f","082030c53946fdee90e485ee3fcf88fb07af4811d375f0d92e806ef6d893a54b",{"version":"794d2987dc78bb60805fa4500d50b7ab33523cfa0c3f96d5d9c509ca8f2f293f","signature":"a6019842d451eb3a48e292f3b462fbae9e4b694c6fdc22b99e5fe9e2e781a7ac"},"97ea5f1a03786cb55ff31e41afeef6c2c672de4697eff80f6b68f043694cf892","30d7301a01f01ccbeeced6181f48abe5715dab628868400e827d6dd057aabe97","3411c785dbe8fd42f7d644d1e05a7e72b624774a08a9356479754999419c3c5a","8fb8fdda477cd7382477ffda92c2bb7d9f7ef583b1aa531eb6b2dc2f0a206c10","66995b0c991b5c5d42eff1d950733f85482c7419f7296ab8952e03718169e379","33f3795a4617f98b1bb8dac36312119d02f31897ae75436a1e109ce042b48ee8","2850c9c5dc28d34ad5f354117d0419f325fc8932d2a62eadc4dc52c018cd569b","c753948f7e0febe7aa1a5b71a714001a127a68861309b2c4127775aa9b6d4f24","3e7a40e023e1d4a9eef1a6f08a3ded8edacb67ae5fce072014205d730f717ba5","a77be6fc44c876bc10c897107f84eaba10790913ebdcad40fcda7e47469b2160","382100b010774614310d994bbf16cc9cd291c14f0d417126c7a7cfad1dc1d3f8","91f5dbcdb25d145a56cffe957ec665256827892d779ef108eb2f3864faff523b","4fdf56315340bd1770eb52e1601c3a98e45b1d207202831357e99ce29c35b55c","927955a3de5857e0a1c575ced5a4245e74e6821d720ed213141347dd1870197f","be6fd74528b32986fbf0cd2cfa9192a5ed7f369060b32a7adcb0c8d055708e61","0e6d87e1af5b3cb046c54714f8afdd0d0fe3c499d96954f29466f92def0f435c","b25eaf53a7b338ea38921dcfe882a0e46a36a49c439a580018cd1e523a970dbb","2bc1325de383b9b270e0800b370cd33b87998f67380a0353167c37c3dcc13d3e","ded25fdd0b036433f1c7044d0f05c9c792b4873a648fbd33eec49f6238e3e572",{"version":"826229354d99c4759dbad2af176f3484be0f93b2dbd2bd0cf0f19808cdaf5516","affectsGlobalScope":true},{"version":"6b05268cec24091283de2b81503e925691747662c93ac2accd9541b61a1c63e7","signature":"2e45a21d5d6d2de77da7fc28e048739dcf4ed0512fd856ca07c71065f9471bb5"},"e617a4e3425c1c4f6337f9065c844fee758eb60f2befe40f87d6bc295fe3dd6c","84cc254263404913255f7ed1ac7bdd05d5f1f2c233f6b48915f64aca2321ec17","67a4f653163df230b46606a9b97b568b5150d0e0e1ae1d613c59f7a3b0512449","3b1c2ccfa2572201a53e54008e1a2a321ef826f4260264749ed5158643cad6c0","0b30b078f688f2b4f4e378fa383e02e2d4c4213a1b22aebb020461e36e34aa92","7f204c0b47583a898e6dbe667ad290b837cd99822bf133d0ff23ba072becec52","df8ac16e33db5d15a25a0a175e8a5d5bd3d3b2f1d5d0edff099ac26e619932b6","421c86381da2dd0b7053140641e564c6f06dbca3457dfef94dd5191c7a91e761","9771ad326e8d22467bf407c5473fc51cb8a0f73a5d420809c5ad0f7f62b65821",{"version":"afc9d9ff588336581c255a383a97174e426826aa2468da4857f54d9476ec726a","signature":"2ffb5be570de81083b20081137239470ae8a03c5b7ca1594cb93884a722b75c8"},"0cb2f19ca25c0f21a28218c5dcb5a7e994e81985086ca5daa9c8f4ebe64fde14","87f45900e657071ede09193a640840449cbbd84f442fa110ff6ad48258a79960",{"version":"6e12133b35d7f3275b86b131bd7123ca62cb8907ea48c16a869995a633d6fdf4","signature":"56fc117444fb16ff297d7c268cac9f0c2d70c300b25c313883982603958d1c77"},{"version":"a13de7ba0d4bf497c94ae018e0d7bde0966c87be667de983bff231c130694b22","signature":"2976ccd441771cd68f782e2bc1f214ec00ea1ae2d6319d791ef226920fd32b09"},{"version":"7a921d32d182b211908ad5f8923f1a830519c12aedf4e469467c98ed02429f98","signature":"55e1ed3c1bde44633a0d47f5304541684e92db561027cc5e1704e8807785528d"},{"version":"190b8d024802f36edaeb098ce014ebf32980b4e3c1ac8fbaf08f46b81f9d2c22","signature":"3dfa32f25c6a1129e7993dd3e0a66c14732e8939fe59e299581a77013de603e0"},{"version":"21f105677d8c332867fc33c0820c6c2ae3bab9359a67394d4029d4a2b2b4879f","signature":"b1478d32f7d34beab99ba1352b10e8c4d009ad07f4c544c7911f400b4a54bbbb"},{"version":"a726a3aebe92ade854602bfb7c47e5a5ff4132adc258dc16f9481317f5a49e03","signature":"d2081c21fd7f6bd7ff4326487d1bf46c31c93e6ab1a01356f3cf334da6697caf"},{"version":"4e2b4193fa5ce0c618ce53ac2b3d8971baf420b7392bcbc5a40c517a5731d11d","affectsGlobalScope":true},{"version":"21bcc28dc5705a3a8e894ce4abcc30a666a9dbebfa211ddca4dd4b7de17dfc34","signature":"ed2d3c7bef952d0a87da591e1a2bfbe1086875ec2e7b4fac37b3f26ebfadbfea"},"b8fafa9f8ae9069eff148da320ed56acd5c3c95112c5e03d4796e15ac76b974c",{"version":"03f5d297d9c13f76a7e71c93b1c63c8b5370f4575f23c1a356a0c15949348962","signature":"ce263e11bb7ede7e20e2787e9cbe298a515c588ed13a610525b60e69892b7927"},{"version":"f9552fb1f273de0fa296a6e415a75595d5321232b4dfee4f4cd489c61ecdc923","signature":"8889997e9d9431b55f9d23d07956727681a6210105152467cdebd84c550ab00b"},{"version":"055718890a584286612a5dd629dc481f394d384c3e968a0c8518dfe1b2df7dcb","signature":"0239decdb850b94c8c5b9f4389391ad4180570f202069a87f200d2114f0dbefc"},{"version":"8b9a09488511561af6cfa5c6f54a40688079d3a2d15f7e4688ae6b3f2c5da7d8","signature":"1bdf3ca937c00f3299a0649ee125acf26a795ff195f0f64bb5442daeff00e5bb"},{"version":"056c2a7d27a34b56a2da28352ac865c3c784559dd515a463b267f8777583c0cf","signature":"d3ba77bd072cc0991b464f492c747027a27fb74c89309571a6efe16eb78124f4"},{"version":"f79b2d21931fc767f49e5fccc45aeff539ffd5dc519d468c075f465316ca6933","signature":"3d11f4b949aefeffcd10d9552a7a90b8823dff997d4ffefad720fe4aeedec77a"},{"version":"2ad18f21e41ce16c0cb687d539c449ff254aa982e0a71a387106b0ae03da345d","signature":"b812948156e37b016049d1e52e99d6d0ab7747654a618e5da5a4bd400f2c47fc"},{"version":"fba296c3b05f947027cb76914c58de540aaf0e262420ce35a1fb8d0832720f42","signature":"13238d15e5de8fb1872f3075ee114727cce493008c172e8041c67de505aa8425"},"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","43a95e70896efd3483a07162a10895b0f1c9b6f05092ef114b46b1d9f7eef63a","224bc47ac7f9a1f3795c1046ebfb8aae8b76180daf7d41ed77623b03b1a078d3","587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"bce910d9164785c9f0d4dcea4be359f5f92130c7c7833dea6138ab1db310a1f9","affectsGlobalScope":true},"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228",{"version":"c81c51f43e343b6d89114b17341fb9d381c4ccbb25e0ee77532376052c801ba7","affectsGlobalScope":true},"db71be322f07f769200108aa19b79a75dd19a187c9dca2a30c4537b233aa2863","57135ce61976a8b1dadd01bb412406d1805b90db6e8ecb726d0d78e0b5f76050",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","b8e431e9b9bb2dc832b23d4e3e02774e953d5537998923f215ea446169e9a61e","3690133deae19c8127c5505fcb67b04bdc9eb053796008538a9b9abbb70d85aa","5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"b85c02e14ecb2a873dad5a1de72319b265160ba48f1b83661aeb3bba1366c1bc","affectsGlobalScope":true},"7a2ba0c9af860ac3e77b35ed01fd96d15986f17aa22fe40f188ae556fb1070df","fc3764040518a1008dd04bdc80964591b566b896283e00df85c95851c1f46237","55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","790623a47c5eda62910098884ecb154dc0e5f3a23fc36c1bfb3b5b9ed44e2c2d","42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","354612fe1d49ecc9551ea3a27d94eef2887b64ef4a71f72ca444efe0f2f0ba80",{"version":"125af9d85cb9d5e508353f10a8d52f01652d2d48b2cea54789a33e5b4d289c1c","affectsGlobalScope":true},"f5490f53d40291cc8607f5463434d1ac6c5564bc4fbb03abceb03a8f6b014457","5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d",{"version":"14a50dafe3f45713f7f27cb6320dff07c6ac31678f07959c2134260061bf91ff","affectsGlobalScope":true},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true},"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","0cab4d7d4edc40cd3af9eea7c3ed6d1016910c0954c49c4297e479bf3822a625","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270",{"version":"ba437529769c1d4766a8a6d5a304f46fbb4f5f1716f23f4cbf20b7a4fd82d8ba","affectsGlobalScope":true},{"version":"ab294c4b7279318ee2a8fdf681305457ecc05970c94108d304933f18823eeac1","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","bbda6ea452a2386093a1eda18a6e26a989e98869f1b9f37e46f510a986d2e740","812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661",{"version":"75dd741ca6a6c8d2437a6ca8349b64b816421dbf9fe82dd026afaba965576962","affectsGlobalScope":true},{"version":"8799401a7ab57764f0d464513a7fa7c72e1d70a226b172ec60fff534ea94d108","affectsGlobalScope":true},"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","92db194ef7d208d5e4b6242a3434573fd142a621ff996d84cc9dbba3553277d0","16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b",{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true},"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"247aa3419c98713231952b33801d4f46563fe542e03604acd8c63ac45a32409c","d0f7a15f34c5572c4d3710a95053196e76da944543dabe8265944bb7c6f52700","a17971bcd87302fd817c6f62f77b3a33ecb9d4b0200fddc44d6081d98092092c","2efc9e4063a2c7727ad90067d630fd4736319ad9402646d96e0143880b0c8cad","c56ef8201a294d65d1132160ebc76ed0c0a98dcf983d20775c8c8c0912210572","de0199a112f75809a7f80ec071495159dcf3e434bc021347e0175627398264c3","1a2bed55cfa62b4649485df27c0e560b04d4da4911e3a9f0475468721495563f","854045924626ba585f454b53531c42aed4365f02301aa8eca596423f4675b71f","d392cdf58e0c7a988c3df400caa63a5c070c0bf13996ec619e3535e19e952a95","6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","237aa833f2cd2ff42db5d3f5a2b7b143ead11aff861097593ecd99015a69b220","50542cad26bd372cb942d418d42cdeced50a4d4226db390a1e3405f3d9a6103f","60660150e844e9d27f7ae4dfc7456f27fc683bed718d0e4a1dd4908d5da11d35","ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","5e763f3932cf04417e4145a103da1f1f67b10f7c584bcc976641611ed72af668","a5dcba6cd802f8e47bf0d83f3836a92cd494fac81b8a49924f190f61f92795ce","46324183533e34fad2461b51174132e8e0e4b3ac1ceb5032e4952992739d1eab","d3fa0530dfb1df408f0abd76486de39def69ca47683d4a3529b2d22fce27c693","d9be977c415df16e4defe4995caeca96e637eeef9d216d0d90cdba6fc617e97e","98e0c2b48d855a844099123e8ec20fe383ecd1c5877f3895b048656befe268d0","ff53802a97b7d11ab3c4395aa052baa14cd12d2b1ed236b520a833fdd2a15003","fce9262f840a74118112caf685b725e1cc86cd2b0927311511113d90d87cc61e","d7a7cac49af2a3bfc208fe68831fbfa569864f74a7f31cc3a607f641e6c583fd","9a80e3322d08274f0e41b77923c91fe67b2c8a5134a5278c2cb60a330441554e","2460af41191009298d931c592fb6d4151beea320f1f25b73605e2211e53e4e88","2f87ea988d84d1c617afdeba9d151435473ab24cd5fc456510c8db26d8bd1581","b7336c1c536e3deaedbda956739c6250ac2d0dd171730c42cb57b10368f38a14","6fb67d664aaab2f1d1ad4613b58548aecb4b4703b9e4c5dba6b865b31bd14722","4414644199b1a047b4234965e07d189781a92b578707c79c3933918d67cd9d85","04a4b38c6a1682059eac00e7d0948d99c46642b57003d61d0fe9ccc9df442887","f12ea658b060da1752c65ae4f1e4c248587f6cd4cb4acabbf79a110b6b02ff75","011b2857871a878d5eae463bedc4b3dd14755dc3a67d5d10f8fbb7823d119294","d406b797d7b2aff9f8bd6c023acfaa5a5fc415bfbf01975e23d415d3f54857af","7d71b2d1a537fe41760a16441cd95d98fcb59ddf9c714aba2fecba961ab253b6","a9bd8a2bbd03a72054cbdf0cd2a77fabea4e3ae591dd02b8f58bda0c34e50c1c","386cc88a3bdee8bc651ead59f8afc9dc5729fc933549bbd217409eabad05ba3e","4efb2a45d9d3e146d6237c2b74c2afcc7512f8bdd939995f2beaa27ec385a600","d51a4e4450ee23d941db79652c660ca2612691dba235fd5d14d4b2a622c72312","3b8ac5f54f287ac748e109a2639392ee70ae7e9a3f58ee637e21e1b3d57bed03","ac72dfd5a793c277251c116b35791d3ce358edfea94b942c270d2bda9be5cbfe","c1b6d322936b18698bf8ea6deed76e28d5a6a3cccb6c7fa345a01c969f637b65","8b0a2400ba7522569871331988f820ba4cfc386f845b01058c63a62ad9db8d03","d3e29566a694a4068d450a58f59e3a3662fc12f74345343d441ef4d954984503","f7b3e68f7972250809e5b0cbd8f0e1f9da8c1dbf70244f289b204f1b49c2d398","4c7c99f7787c5c2ea6cbd911a7b5c7c2a4ee1cb9d7f538805ee2550cf1f1fb99","1557bf37fc8d5f129436caa0212f25d6cbeaf9d20e2e3a60b13306ff62a1d7a0","9a1e77270d63875c9a38630f9a7a9126f9a8df0245d5eb220832a65d408079eb","e48d0036e626bb40f236e236670722445ffff854908c2d9515b2b5b7f677794f","30f9018873d6d80256298011161a664a14b927f719f8a7605ceb8b49bc8808da","f543ea0fe820064a2cdbb39d2b2846c507467c4771eafcda2091da43b05c077b","9066d02264a67aae05410c340c8fa41a79bb076c33d1c6ae3ec29a05828f4c05","00435c177c3da6998c2f95b9e71239f00cfabd3461401cc4d8606ee3afb732b1","d432a2956d1efa172e1c60a8186a81657f2f9f4ba449c6abdfa9d057d484c45d","bc6679207eccaa45e49b930ad45ec8e7903bd8b0868e086d8bad91f79c914ca0","4dd35e71d52007465787dd2f374cc756a29e6c9b96dc237d0465d0294170c529","7ebf1f440efe6efebeb58a44000820cbe959da9d9496621fa6dcbc02666e3002","08a9e70641597e23d00be62e3a94b69ad93c5cf5541ec7bfdeb5e9f69c845507","ded59c554118589a8729fb70429318e41e7e8155b2aff5f3d7a77933e49dbc10","3af507089e65c1472a87e5f7345ec18838d7e923c2c06fdad3d31543278af762","c867e6d7de78f96eb55b534b3aca1da4e029a6ab0e4ea9d0610acf11d737f8a0","2df075b38e2135201202640fe92bce8d03fb319fece410b088a22ab4e1be7702","b9f07153f8e881c4cca036abccaa134df30cf09a3381772d089d1eeabe45770d","88213e972b5989f217627bdcb79a697f66821e8ff135265712346d532243084f","bf6122555f34582e6d5424a88676d90f2333e0e920764895c15d39b6c856053c","bf04a1c9ccfeabf521b7b97f388d05bc5f628422253399eb157fec0d9cd213ce","3c6ecfcc6ac82b5866368d1efbddeeb3bfae03962747bf6928d8faa092e5b369","06d19317f4c8474255b3ceab7102763faf7ff0aa4cc305384b13ccb6d27b2e50","ebe1694b3a7a0265b9cf8fb3bfed6575907247b61add671ea9771fd6715d1b29","bdf4a7242e5cce621b5ba689351af780b0b665d97ea88c71f50801aa80560236","6bd6ae32288500128ae355de57d6bc3b5884f37e1e5d5ac597b142f63b3c8121","a6634dbc56e3d75efac697e59fef032aa15cc537acf7f6ad3a045001f48483f8","0ac932efed612f58eb5033bd449a5fe7ae1bc61fa0ff960f6ebbc8bd4ceda267","b4a07a5abe3d0a4c05f6722c024f842dc7909d5ab8e9212d98c393c2ea8cb09f","7f208ece77be50a024bf2309ca2e7ad1e747fa29f31e9906e3851d3be6641b9e","c0df6627d0c30dc70d26c2d500506b073ff63584c4621f9261e510ad954ad2bd","e88f9fd0378cbd9b22b140a61d3b203727af7f3262c13de22cc86739467592f1",{"version":"bdb7c48f64a9ab61ce33025490f20f3ee64dca975980929394c3ea6f678dff91","signature":"ec68a760ec1026e96f05efae21a51772e1509c52efa154c9af9f30395fd963a1"},{"version":"f321747f0a859e20b6e228596fa370c063c37879df4878b571251c106ecf6568","signature":"20346a0a18e673d87ac10bdcec07bbef6b1d73f6354933cc6ea198052db90dde"},"9a1753ba092cbb7fa7c09355643656ce62f3e65fc204d273f4764a234194d541","1df2f76c8a0126985bc29de1c197482a4373925547ef9a36021d012540dc5501","c7180c2c85eecd28207ef8d6a1334ec7e10d968e70e17317141d036f12640af9","a64e71ab2cd1198713aafa56d16390e2a0fa07d22a0301652117abf980b22f61","11131c8f6fadf6e6584a8250f3ffb4985e1eb3cc41dce0dee3da5f6827201790","084ad3ce1720536c757bf6ef6c6ff27a97597b845308bad7c36cfaffc7fb0811","8dc56f817d20cf0717842ac1dcf3ac1a450ac3c667f1285754901e4af97bbe47","72156b7624d678a2686a22a45014218be4da7147f1058a5a5072fe981c492dd5","a20d054b8be41316bcc29752c5b9b42fab727b887a076a3af3bee18813d6e8c2","2eba4ddfbd6837ef33e58644f7dffbfe465d7222f9a9101789f02427f9541488","bb82c16e8371bfc6ee2ffd0095fd321d6acfa57c6c6445019567fec1b6b5e92a","6c65126b657a275259c4759b2b2f7b04879e61bc6c51df025b3748f87652a9eb","a5ad75d3dd3d3df0f62cb7a8ea12e76e0b4a3143ecde9e29c9cc0586b88365c0","03cd482c80ad0b724ca7d55cef7e3823d593b7cced98d7ef9d1bf757c5055b77","e93f395b0d6e68525181a6ecb3e7b81b1c5bf551f32f6cebbdffdef354fbe4a3","b881b069efb9d55b4b4b98de76d8c3920a29254e24f8f0c38557186e38cf6955","115825b28cb924401622fcab8676c3bab7ceebd9062a14229efe9c02bb8db8fb","2fa33b23888562c8111e9e10238eb26499c26616499446ac975263e41e0dc4af","b42d535c794251030828022716b5c1d526014d71a1b868679ecbe6599bb3fea1","1f542c79756fda13fdeda2c6c90a560ebddb14758eb5c3278ef8b750a03c9bec","b0ed00813c153e350a56faa8c15668bf21375928e9b88bcc482d20f1f8415179","d0608ff924f53fee147c937c04efaa1e9010d44134d6f376b2fd5939dcc32a8d","3c8a75014278db57b6fe929a8877d60abee9ca84b8cdcc6df4f7da21cf06854c","56ba943e5d952fcb6cc620d73692fba08b6bb8a36c97f3662457ead8fc1789d4","b42d535c794251030828022716b5c1d526014d71a1b868679ecbe6599bb3fea1","6e0264cee3fddcb8f261cd89d273a016af93896cd266cad69702b87325fe7bde",{"version":"01d006d95423a2b4ca4274e2480322173ef03259d7602a0f423374856528c35e","signature":"af4ad03cc9d094f7ac7e525a67f8e924f36db2be48cc38ee6c57ce1ac6e7e86b"},{"version":"14bc3ffff9a6d38b38afccd30c08c43f0b2a0162fb44d07a61a9f3f9245e28e1","signature":"984c34bfd8e9fea7d516bbfdc55674b912d5f37577535774f3769f6d71ce243a"},"c8fe9dee8de47a347fa842945abc4a52e3aad2400faa569c22d014992323cad1",{"version":"d7f12d34db496cd2a3a99323584d884ad57784c78d56f66285e8c497aaa1873a","signature":"1a7f8bea3893bf3f708d9b603407b637a09023fa43578df7a112a9964af00d8e"},"6a9c5127096b35264eb7cd21b2417bfc1d42cceca9ba4ce2bb0c3410b7816042","93b7325b49dfbf613d940ed0e471216657b2d77459dac34f1b5b1678f08f884c",{"version":"dc86a12ed9ce7fd7ec0fb346636021a9178ea44018b9db232ac222b7ee9d3b37","affectsGlobalScope":true},"fc37aca06f6b8b296c42412a2e75ab53d30cd1fa8a340a3bb328a723fd678377","5f2c582b9ef260cb9559a64221b38606378c1fabe17694592cdfe5975a6d7efa",{"version":"1299e8425dd59707f139bd03d22e732001a21d580865f9fb29e1c71ab82a5c5a","affectsGlobalScope":true},{"version":"432fd0ab160ed857ac6576c8d8c21cb5f249f8e0d129fec79e7e59e44a279d67","affectsGlobalScope":true},"70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","e9eb1b173aa166892f3eddab182e49cfe59aa2e14d33aedb6b49d175ed6a3750"],"root":[62,63,67,75,76,[78,81],91,[93,102],[104,109],[142,144],[146,152],162,208,210,218,220,230,250,251,261,[264,271],[273,280],283,[412,414],416,420,[440,444]],"options":{"allowSyntheticDefaultImports":true,"esModuleInterop":true,"jsx":4,"jsxImportSource":"preact","module":99,"skipLibCheck":true,"strict":true,"target":99},"fileIdsList":[[330],[330,432],[330,422,432],[330,421,422,423,424,425,426,427,428,429,430,431],[330,438],[330,433,434,435,436,438],[330,433,434,435,436,437],[330,357,358],[330,358,359,360,361],[330,337,358,360],[330,357,359],[301,330,337],[301,330,337,353],[330,353,354,355,356],[330,353,355],[330,354],[318,330,337,362,363,364,367],[330,363,364,366],[300,330,337,362,363,364,365],[330,364],[330,362,363],[330,337,362],[330,337],[111,139,330],[110,116,330],[121,330],[116,330],[115,330],[133,330],[129,330],[111,128,139,330],[110,111,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,330],[330,445],[68,330],[284,330],[287,330],[288,293,321,330],[289,300,301,308,318,329,330],[289,290,300,308,330],[291,330],[292,293,301,309,330],[293,318,326,330],[294,296,300,308,330],[295,330],[296,297,330],[300,330],[298,300,330],[300,301,302,318,329,330],[300,301,302,315,318,321,330],[330,334],[296,300,303,308,318,329,330],[300,301,303,304,308,318,326,329,330],[303,305,318,326,329,330],[284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336],[300,306,330],[307,329,330],[296,300,308,318,330],[309,330],[310,330],[287,311,330],[312,328,330,334],[313,330],[314,330],[300,315,316,330],[315,317,330,332],[288,300,318,319,320,321,330],[288,318,320,330],[318,319,330],[321,330],[322,330],[318,330],[300,324,325,330],[324,325,330],[293,308,318,326,330],[327,330],[308,328,330],[288,303,314,329,330],[293,330],[318,330,331],[330,332],[330,333],[288,293,300,302,311,318,329,330,332,334],[318,330,335],[330,448],[330,449],[301,303,330,337],[330,450],[289,330,334,337],[330,452],[330,337,369,370,371],[330,369,370],[330,369],[330,337,368],[330,337,338,340,344,345,348],[330,349],[330,340,344,347],[330,338,340,344,347,348,349,350],[330,337,344],[330,340,344,345,347],[330,337,338,340,345,346,348],[330,372],[68,69,246,330,405],[69,246,330,405],[246,247,330],[69,74,162,210,220,230,245,246,264,279,330,405],[88,89,330],[68,69,87,88,246,330,405],[231,330],[155,212,225,330],[156,165,168,170,330],[68,155,156,165,168,171,197,212,330],[171,194,196,212,330],[155,171,194,195,197,212,330],[198,330],[171,194,197,212,330],[155,171,194,197,211,212,330],[69,246,330,378,403,404,405],[69,155,212,246,330,378,405],[330,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402],[69,155,212,246,330,405],[172,173,193,330],[155,172,212,330],[155,212,330],[174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,330],[172,330],[68,155,194,197,212,330],[262,330],[154,157,158,330],[154,156,165,168,171,330],[156,163,164,168,171,330],[156,165,168,171,330],[156,165,166,167,171,330],[330,344],[330,341,342,343],[300,318,330,337],[234,330],[233,234,330],[233,330],[233,234,235,237,238,241,242,243,244,330],[234,238,330],[233,234,235,237,238,239,240,330],[233,238,330],[238,242,330],[234,235,236,330],[235,330],[233,234,238,330],[301,310,330,337,338,339],[330,417,418],[330,417],[65,330],[64,65,330],[64,330],[82,83,84,85,86,330],[82,83,330],[82,330],[103,318,330],[206,330],[69,77,205,246,330,405],[69,77,214,246,330,405],[69,77,246,330,405],[69,77,216,246,330,405],[69,77,246,259,330,405],[69,77,246,247,248,330,405],[77,154,155,159,212,330],[77,155,169,199,212,330],[77,155,212,330],[77,155,212,330,376],[77,155,171,197,212,330],[330,405,406],[69,77,155,212,246,330,404,405],[77,155,202,212,330],[77,201,330],[301,330,337,351],[258,330],[330,408],[74,162,210,220,230,264,279,329,330,337],[68,74,162,210,220,230,264,279,330],[68,221,330],[223,225,330],[222,224,330],[68,222,224,330],[68,221,222,223,330],[222,225,227,330],[68,221,222,225,226,330],[70,330],[73,330],[68,71,72,74,162,210,220,230,264,279,330],[256,330],[253,255,256,257,330],[252,330],[254,330],[252,253,255,330],[253,330],[66,80,152,279,330],[66,280,281,283,303,310,330,352,373,374,413,414,441],[66,76,78,79,330],[66,76,330],[63,66,76,93,95,330],[63,66,76,330],[66,330],[63,66,76,148,330],[63,66,76,142,330],[66,67,76,93,330],[66,81,91,97,98,100,101,102,104,105,107,108,143,144,147,149,150,151,330],[66,75,76,93,94,95,330],[66,76,90,330],[63,66,76,90,93,96,310,330],[63,66,76,90,93,96,330],[66,76,93,330],[66,76,103,330],[66,67,76,93,269,271,272,330],[66,95,109,141,330],[66,330,419],[66,330,439],[66,95,109,145,330],[66,330,415],[63,66,76,146,330],[66,76,92,93,330],[65,66,67,69,75,80,246,330,405],[66,330,411],[66,93,284,323,330],[66,92,310,330],[66,281,282,330],[66,78,93,310,330],[66,78,80,310,330],[66,76,78,80,269,271,273,330],[66,75,76,78,80,93,269,271,273,310,330],[66,109,274,275,276,277,330],[66,75,76,78,80,93,269,271,273,330],[66,78,330],[66,266,267,330],[63,66,67,74,76,78,79,80,93,162,210,220,230,264,265,268,278,330],[66,69,74,78,162,210,219,230,246,264,279,330,405],[66,74,78,92,153,160,161,210,220,230,264,279,330],[66,78,200,203,204,207,330],[66,162,208,210,218,220,230,251,261,264,330],[66,74,78,162,209,220,230,264,279,301,310,330],[66,78,213,215,217,330],[66,74,78,93,162,210,220,228,229,264,279,310,330],[66,67,77,78,92,93,155,212,228,232,249,310,330],[66,78,260,330],[66,74,78,92,155,162,210,212,220,228,230,263,279,330],[66,67,75,76,77,80,330],[66,69,74,162,210,220,230,246,264,279,330,405],[63,66,67,75,78,79,80,93,279,281,283,301,310,330,373,412,416,420,440],[66,75,78,283,330],[66,69,75,77,78,93,246,281,283,309,310,330,375,376,377,405,407,409,410,412],[66,293,330],[66,93,280,330,413],[80],[76,78,79],[65,76],[65],[81,91,97,98,100,101,102,104,105,107,108,143,144,147,149,150,151],[66,76],[67,76],[65,67,69,75,80,246,405],[78],[78,80],[109,274,275,276,277],[266,267],[67,74,78,80,93,162,210,220,230,264,265,268,278,279],[74,78,162,210,220,230,264,279],[162,208,210,218,220,230,251,261,264],[67,75,76,77,80],[69,74,162,210,220,230,246,264,279,405],[75,80],[75,78],[69,75,77,78,93,246,376,405],[75,93]],"referencedMap":[[62,1],[63,1],[433,2],[421,2],[422,2],[423,2],[424,3],[425,2],[426,3],[427,2],[428,2],[429,3],[430,3],[432,4],[431,2],[439,5],[434,5],[437,6],[435,5],[438,7],[436,1],[209,1],[359,8],[362,9],[361,10],[360,11],[358,12],[354,13],[357,14],[356,15],[355,16],[353,12],[368,17],[367,18],[366,19],[365,20],[364,21],[363,22],[411,23],[110,1],[112,24],[113,24],[114,1],[115,1],[117,25],[118,1],[119,1],[120,24],[121,1],[122,1],[123,26],[124,1],[125,1],[126,27],[127,1],[128,28],[129,1],[130,1],[131,1],[132,1],[135,1],[134,29],[111,1],[136,30],[137,1],[133,1],[138,1],[139,24],[140,31],[141,32],[446,33],[145,1],[116,1],[69,34],[161,1],[214,1],[447,1],[155,34],[445,1],[201,34],[284,35],[285,35],[287,36],[288,37],[289,38],[290,39],[291,40],[292,41],[293,42],[294,43],[295,44],[296,45],[297,45],[299,46],[298,47],[300,46],[301,48],[302,49],[286,50],[336,1],[303,51],[304,52],[305,53],[337,54],[306,55],[307,56],[308,57],[309,58],[310,59],[311,60],[312,61],[313,62],[314,63],[315,64],[316,64],[317,65],[318,66],[320,67],[319,68],[321,69],[322,70],[323,71],[324,72],[325,73],[326,74],[327,75],[328,76],[329,77],[330,78],[331,79],[332,80],[333,81],[334,82],[335,83],[449,84],[448,85],[282,1],[374,86],[68,1],[451,87],[450,1],[410,88],[452,1],[453,89],[281,1],[375,1],[372,90],[371,91],[370,92],[369,93],[92,1],[349,94],[350,95],[348,96],[351,97],[345,98],[346,99],[347,100],[373,101],[153,1],[205,102],[246,103],[248,104],[247,105],[90,106],[88,103],[89,107],[219,103],[229,1],[339,1],[195,1],[232,108],[231,109],[171,110],[170,111],[197,112],[196,113],[199,114],[198,115],[212,116],[211,115],[405,117],[379,118],[380,118],[381,118],[382,118],[383,118],[384,118],[385,118],[386,118],[387,118],[388,118],[389,118],[403,119],[390,118],[391,118],[392,118],[393,118],[394,118],[395,118],[396,118],[397,118],[399,118],[400,118],[398,118],[401,118],[402,118],[404,118],[378,120],[194,121],[174,122],[175,122],[176,122],[177,122],[178,122],[179,122],[180,123],[182,122],[181,122],[193,124],[183,122],[185,122],[184,122],[187,122],[186,122],[188,122],[189,122],[190,122],[191,122],[192,122],[173,125],[172,126],[263,127],[262,123],[159,128],[158,129],[157,129],[154,1],[165,130],[164,131],[163,131],[168,132],[166,131],[167,131],[169,131],[156,1],[415,1],[341,133],[342,133],[344,134],[343,133],[338,135],[235,136],[244,137],[233,1],[234,138],[245,139],[240,140],[241,141],[239,142],[243,143],[237,144],[236,145],[242,146],[238,137],[340,147],[419,148],[417,1],[418,149],[272,150],[66,151],[65,152],[64,150],[87,153],[84,154],[85,1],[86,1],[82,1],[83,155],[103,156],[207,157],[206,158],[215,159],[216,160],[217,161],[260,162],[249,163],[204,160],[160,164],[200,165],[213,166],[377,167],[376,168],[407,169],[406,170],[203,171],[202,172],[352,173],[259,174],[409,175],[408,176],[60,1],[61,1],[12,1],[13,1],[15,1],[14,1],[2,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[3,1],[4,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[10,1],[1,1],[11,1],[59,1],[77,177],[222,178],[221,34],[226,179],[225,180],[223,181],[224,182],[228,183],[227,184],[71,185],[70,34],[74,186],[73,187],[72,1],[257,188],[258,189],[253,190],[255,191],[254,192],[256,190],[252,193],[148,1],[280,194],[442,195],[80,196],[81,197],[144,198],[271,199],[100,199],[94,200],[150,197],[149,201],[143,202],[101,203],[269,197],[152,204],[151,197],[96,205],[91,206],[98,207],[97,208],[102,209],[104,210],[273,211],[250,1],[270,1],[99,1],[142,212],[420,213],[440,214],[146,215],[416,216],[106,1],[95,200],[147,217],[105,197],[107,199],[108,218],[76,219],[412,220],[443,221],[93,222],[283,223],[277,224],[109,225],[274,226],[276,227],[278,228],[275,229],[266,230],[267,230],[268,231],[279,232],[220,233],[162,234],[208,235],[265,236],[210,237],[218,238],[230,239],[251,240],[261,241],[264,242],[78,243],[75,244],[441,245],[414,246],[413,247],[67,248],[79,200],[444,249]],"exportedModulesMap":[[62,1],[63,1],[433,2],[421,2],[422,2],[423,2],[424,3],[425,2],[426,3],[427,2],[428,2],[429,3],[430,3],[432,4],[431,2],[439,5],[434,5],[437,6],[435,5],[438,7],[436,1],[209,1],[359,8],[362,9],[361,10],[360,11],[358,12],[354,13],[357,14],[356,15],[355,16],[353,12],[368,17],[367,18],[366,19],[365,20],[364,21],[363,22],[411,23],[110,1],[112,24],[113,24],[114,1],[115,1],[117,25],[118,1],[119,1],[120,24],[121,1],[122,1],[123,26],[124,1],[125,1],[126,27],[127,1],[128,28],[129,1],[130,1],[131,1],[132,1],[135,1],[134,29],[111,1],[136,30],[137,1],[133,1],[138,1],[139,24],[140,31],[141,32],[446,33],[145,1],[116,1],[69,34],[161,1],[214,1],[447,1],[155,34],[445,1],[201,34],[284,35],[285,35],[287,36],[288,37],[289,38],[290,39],[291,40],[292,41],[293,42],[294,43],[295,44],[296,45],[297,45],[299,46],[298,47],[300,46],[301,48],[302,49],[286,50],[336,1],[303,51],[304,52],[305,53],[337,54],[306,55],[307,56],[308,57],[309,58],[310,59],[311,60],[312,61],[313,62],[314,63],[315,64],[316,64],[317,65],[318,66],[320,67],[319,68],[321,69],[322,70],[323,71],[324,72],[325,73],[326,74],[327,75],[328,76],[329,77],[330,78],[331,79],[332,80],[333,81],[334,82],[335,83],[449,84],[448,85],[282,1],[374,86],[68,1],[451,87],[450,1],[410,88],[452,1],[453,89],[281,1],[375,1],[372,90],[371,91],[370,92],[369,93],[92,1],[349,94],[350,95],[348,96],[351,97],[345,98],[346,99],[347,100],[373,101],[153,1],[205,102],[246,103],[248,104],[247,105],[90,106],[88,103],[89,107],[219,103],[229,1],[339,1],[195,1],[232,108],[231,109],[171,110],[170,111],[197,112],[196,113],[199,114],[198,115],[212,116],[211,115],[405,117],[379,118],[380,118],[381,118],[382,118],[383,118],[384,118],[385,118],[386,118],[387,118],[388,118],[389,118],[403,119],[390,118],[391,118],[392,118],[393,118],[394,118],[395,118],[396,118],[397,118],[399,118],[400,118],[398,118],[401,118],[402,118],[404,118],[378,120],[194,121],[174,122],[175,122],[176,122],[177,122],[178,122],[179,122],[180,123],[182,122],[181,122],[193,124],[183,122],[185,122],[184,122],[187,122],[186,122],[188,122],[189,122],[190,122],[191,122],[192,122],[173,125],[172,126],[263,127],[262,123],[159,128],[158,129],[157,129],[154,1],[165,130],[164,131],[163,131],[168,132],[166,131],[167,131],[169,131],[156,1],[415,1],[341,133],[342,133],[344,134],[343,133],[338,135],[235,136],[244,137],[233,1],[234,138],[245,139],[240,140],[241,141],[239,142],[243,143],[237,144],[236,145],[242,146],[238,137],[340,147],[419,148],[417,1],[418,149],[272,150],[66,151],[65,152],[64,150],[87,153],[84,154],[85,1],[86,1],[82,1],[83,155],[103,156],[207,157],[206,158],[215,159],[216,160],[217,161],[260,162],[249,163],[204,160],[160,164],[200,165],[213,166],[377,167],[376,168],[407,169],[406,170],[203,171],[202,172],[352,173],[259,174],[409,175],[408,176],[60,1],[61,1],[12,1],[13,1],[15,1],[14,1],[2,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[22,1],[23,1],[3,1],[4,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[51,1],[9,1],[52,1],[53,1],[54,1],[57,1],[55,1],[56,1],[58,1],[10,1],[1,1],[11,1],[59,1],[77,177],[222,178],[221,34],[226,179],[225,180],[223,181],[224,182],[228,183],[227,184],[71,185],[70,34],[74,186],[73,187],[72,1],[257,188],[258,189],[253,190],[255,191],[254,192],[256,190],[252,193],[148,1],[280,250],[80,251],[81,252],[144,252],[271,252],[100,253],[94,200],[150,252],[149,253],[143,253],[101,252],[269,252],[152,254],[151,252],[96,252],[91,255],[98,255],[97,255],[102,252],[104,252],[273,256],[250,1],[270,1],[99,1],[420,213],[440,214],[416,216],[106,1],[95,200],[147,253],[105,252],[107,252],[108,252],[76,257],[412,220],[443,221],[93,222],[283,223],[277,258],[109,258],[274,259],[276,259],[278,260],[275,259],[266,258],[267,258],[268,261],[279,262],[220,263],[162,263],[208,258],[265,264],[210,263],[218,258],[230,263],[251,258],[261,258],[264,263],[78,265],[75,266],[441,267],[414,268],[413,269],[67,248],[79,200],[444,270]],"semanticDiagnosticsPerFile":[62,63,433,421,422,423,424,425,426,427,428,429,430,432,431,439,434,437,435,438,436,209,359,362,361,360,358,354,357,356,355,353,368,367,366,365,364,363,411,110,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,135,134,111,136,137,133,138,139,140,141,446,145,116,69,161,214,447,155,445,201,284,285,287,288,289,290,291,292,293,294,295,296,297,299,298,300,301,302,286,336,303,304,305,337,306,307,308,309,310,311,312,313,314,315,316,317,318,320,319,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,449,448,282,374,68,451,450,410,452,453,281,375,372,371,370,369,92,349,350,348,351,345,346,347,373,153,205,246,248,247,90,88,89,219,229,339,195,232,231,171,170,197,196,199,198,212,211,405,379,380,381,382,383,384,385,386,387,388,389,403,390,391,392,393,394,395,396,397,399,400,398,401,402,404,378,194,174,175,176,177,178,179,180,182,181,193,183,185,184,187,186,188,189,190,191,192,173,172,263,262,159,158,157,154,165,164,163,168,166,167,169,156,415,341,342,344,343,338,235,244,233,234,245,240,241,239,243,237,236,242,238,340,419,417,418,272,66,65,64,87,84,85,86,82,83,103,207,206,215,216,217,260,249,204,160,200,213,377,376,407,406,203,202,352,259,409,408,60,61,12,13,15,14,2,16,17,18,19,20,21,22,23,3,4,27,24,25,26,28,29,30,5,31,32,33,34,6,38,35,36,37,39,7,40,45,46,41,42,43,44,8,50,47,48,49,51,9,52,53,54,57,55,56,58,10,1,11,59,77,222,221,226,225,223,224,228,227,71,70,74,73,72,257,258,253,255,254,256,252,148,280,[442,[{"file":"./quartz/build.ts","start":1752,"length":9,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'string[]' is not assignable to parameter of type 'FilePath[]'.","category":1,"code":2345,"next":[{"messageText":"Type 'string' is not assignable to type 'FilePath'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type '{ __brand: \"filepath\"; }'.","category":1,"code":2322}]}]}}]],80,81,[144,[{"file":"./quartz/components/backlinks.tsx","start":128,"length":14,"messageText":"Module '\"../path\"' has no exported member 'relativeToRoot'.","category":1,"code":2305},{"file":"./quartz/components/backlinks.tsx","start":169,"length":14,"messageText":"Module '\"./scripts/util\"' has no exported member 'clientSideSlug'.","category":1,"code":2305}]],271,100,94,150,149,143,[101,[{"file":"./quartz/components/head.tsx","start":9,"length":12,"messageText":"'\"../path\"' has no exported member named 'toServerSlug'. Did you mean 'ServerSlug'?","category":1,"code":2724}]],269,152,151,[96,[{"file":"./quartz/components/pagelist.tsx","start":9,"length":14,"messageText":"Module '\"../path\"' has no exported member 'relativeToRoot'.","category":1,"code":2305},{"file":"./quartz/components/pagelist.tsx","start":132,"length":14,"messageText":"Module '\"./scripts/util\"' has no exported member 'clientSideSlug'.","category":1,"code":2305}]],91,[98,[{"file":"./quartz/components/pages/foldercontent.tsx","start":306,"length":12,"messageText":"'\"../../path\"' has no exported member named 'toServerSlug'. Did you mean 'ServerSlug'?","category":1,"code":2724}]],[97,[{"file":"./quartz/components/pages/tagcontent.tsx","start":281,"length":12,"messageText":"'\"../../path\"' has no exported member named 'toServerSlug'. Did you mean 'ServerSlug'?","category":1,"code":2724}]],[102,[{"file":"./quartz/components/pagetitle.tsx","start":286,"length":4,"code":2345,"category":1,"messageText":"Argument of type 'ServerSlug' is not assignable to parameter of type 'CanonicalSlug'."}]],104,[273,[{"file":"./quartz/components/renderpage.tsx","start":662,"length":4,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'string' is not assignable to parameter of type 'CanonicalSlug'.","category":1,"code":2345,"next":[{"messageText":"Type 'string' is not assignable to type '{ __brand: \"canonical\"; }'.","category":1,"code":2322}]}}]],250,270,99,[142,[{"file":"./quartz/components/scripts/graph.inline.ts","start":126,"length":22,"messageText":"Module '\"./util\"' has no exported member 'clientSideRelativePath'.","category":1,"code":2305}]],420,440,[146,[{"file":"./quartz/components/scripts/search.inline.ts","start":139,"length":22,"messageText":"Module '\"./util\"' has no exported member 'clientSideRelativePath'.","category":1,"code":2305}]],416,106,95,147,105,107,[108,[{"file":"./quartz/components/taglist.tsx","start":321,"length":4,"code":2345,"category":1,"messageText":{"messageText":"Argument of type 'ServerSlug' is not assignable to parameter of type 'CanonicalSlug'.","category":1,"code":2345,"next":[{"messageText":"Type 'ServerSlug' is not assignable to type '{ __brand: \"canonical\"; }'.","category":1,"code":2322,"next":[{"messageText":"Types of property '__brand' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type '\"server\"' is not assignable to type '\"canonical\"'.","category":1,"code":2322}]}]}]}}]],76,412,443,93,283,[277,[{"file":"./quartz/plugins/emitters/aliases.ts","start":9,"length":14,"messageText":"Module '\"../../path\"' has no exported member 'relativeToRoot'.","category":1,"code":2305}]],109,274,[276,[{"file":"./quartz/plugins/emitters/folderpage.tsx","start":434,"length":12,"messageText":"'\"../../path\"' has no exported member named 'toServerSlug'. Did you mean 'ServerSlug'?","category":1,"code":2724},{"file":"./quartz/plugins/emitters/folderpage.tsx","start":1522,"length":4,"code":2322,"category":1,"messageText":{"messageText":"Type 'string' is not assignable to type 'ServerSlug'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type '{ __brand: \"server\"; }'.","category":1,"code":2322}]},"relatedInformation":[{"file":"./quartz/plugins/index.ts","start":2756,"length":4,"messageText":"The expected type comes from property 'slug' which is declared here on type 'Partial<Data>'","category":3,"code":6500}]}]],278,[275,[{"file":"./quartz/plugins/emitters/tagpage.tsx","start":410,"length":12,"messageText":"'\"../../path\"' has no exported member named 'toServerSlug'. Did you mean 'ServerSlug'?","category":1,"code":2724},{"file":"./quartz/plugins/emitters/tagpage.tsx","start":1371,"length":4,"code":2322,"category":1,"messageText":"Type 'string' is not assignable to type 'ServerSlug'.","relatedInformation":[{"file":"./quartz/plugins/index.ts","start":2756,"length":4,"messageText":"The expected type comes from property 'slug' which is declared here on type 'Partial<Data>'","category":3,"code":6500}]}]],266,267,268,279,220,162,208,265,210,218,[230,[{"file":"./quartz/plugins/transformers/links.ts","start":60,"length":12,"messageText":"'\"../../path\"' has no exported member named 'toServerSlug'. Did you mean 'ServerSlug'?","category":1,"code":2724},{"file":"./quartz/plugins/transformers/links.ts","start":74,"length":8,"messageText":"Module '\"../../path\"' has no exported member 'relative'.","category":1,"code":2305},{"file":"./quartz/plugins/transformers/links.ts","start":84,"length":14,"messageText":"Module '\"../../path\"' has no exported member 'relativeToRoot'.","category":1,"code":2305},{"file":"./quartz/plugins/transformers/links.ts","start":100,"length":7,"messageText":"Module '\"../../path\"' has no exported member 'slugify'.","category":1,"code":2305},{"file":"./quartz/plugins/transformers/links.ts","start":109,"length":14,"messageText":"Module '\"../../path\"' has no exported member 'trimPathSuffix'.","category":1,"code":2305}]],[251,[{"file":"./quartz/plugins/transformers/ofm.ts","start":235,"length":7,"messageText":"Module '\"../../path\"' has no exported member 'slugify'.","category":1,"code":2305}]],261,264,78,75,441,414,413,67,79,444],"affectedFilesPendingEmit":[148,280,442,80,81,144,271,100,94,150,149,143,101,269,152,151,96,91,98,97,102,104,273,250,270,99,142,420,440,146,416,106,95,147,105,107,108,76,412,443,93,283,277,109,274,276,278,275,266,267,268,279,220,162,208,265,210,218,230,251,261,264,78,75,441,414,413,67,79,444]},"version":"5.1.6"}
\ No newline at end of file

--
Gitblit v1.10.0