commit 0f4d9fcfb54791c6f4e8c973327c6a11b9f2be16 Author: zhouzhongping Date: Wed Jan 10 14:39:54 2024 +0800 project: init diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1d9e591 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM node:20-slim as builder +WORKDIR /usr/src/app +COPY package.json . +COPY package-lock.json* . +RUN npm ci + +FROM node:20-slim +WORKDIR /usr/src/app +COPY --from=builder /usr/src/app/ /usr/src/app/ +COPY . . +CMD ["npx", "quartz", "build", "--serve"] diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..147e2ca --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 jackyzha0 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4b4731c --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Quartz v4 + +> “[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.” — Richard Hamming + +Quartz is a set of tools that helps you publish your [digital garden](https://jzhao.xyz/posts/networked-thought) and notes as a website for free. +Quartz v4 features a from-the-ground rewrite focusing on end-user extensibility and ease-of-use. + +**If you are looking for Quartz v3, you can find it on the [`hugo` branch](https://github.com/jackyzha0/quartz/tree/hugo).** + +🔗 Read the documentation and get started: https://quartz.jzhao.xyz/ + +[Join the Discord Community](https://discord.gg/cRFFHYye7t) + +## Sponsors + +

+ + + +

diff --git a/globals.d.ts b/globals.d.ts new file mode 100644 index 0000000..4473d59 --- /dev/null +++ b/globals.d.ts @@ -0,0 +1,12 @@ +export declare global { + interface Document { + addEventListener( + type: K, + listener: (this: Document, ev: CustomEventMap[K]) => void, + ): void + dispatchEvent(ev: CustomEventMap[K]): void + } + interface Window { + spaNavigate(url: URL, isBack: boolean = false) + } +} diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..aec536d --- /dev/null +++ b/index.d.ts @@ -0,0 +1,11 @@ +declare module "*.scss" { + const content: string + export = content +} + +// dom custom event +interface CustomEventMap { + nav: CustomEvent<{ url: FullSlug }> +} + +declare const fetchData: Promise diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e4208c4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6213 @@ +{ + "name": "@jackyzha0/quartz", + "version": "4.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@jackyzha0/quartz", + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@clack/prompts": "^0.6.3", + "@floating-ui/dom": "^1.4.0", + "@napi-rs/simple-git": "0.1.9", + "async-mutex": "^0.4.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-spinner": "^0.2.10", + "d3": "^7.8.5", + "esbuild-sass-plugin": "^2.12.0", + "flexsearch": "0.7.21", + "github-slugger": "^2.0.0", + "globby": "^13.1.4", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^8.0.4", + "hast-util-to-jsx-runtime": "^1.2.0", + "hast-util-to-string": "^2.0.0", + "is-absolute-url": "^4.0.1", + "js-yaml": "^4.1.0", + "lightningcss": "1.21.7", + "mdast-util-find-and-replace": "^2.2.2", + "mdast-util-to-hast": "^12.3.0", + "mdast-util-to-string": "^3.2.0", + "micromorph": "^0.4.5", + "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", + "rehype-katex": "^6.0.3", + "rehype-mathjax": "^4.0.3", + "rehype-pretty-code": "^0.10.0", + "rehype-raw": "^6.1.1", + "rehype-slug": "^5.1.0", + "remark": "^14.0.2", + "remark-breaks": "^3.0.3", + "remark-frontmatter": "^4.0.1", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", + "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", + "toml": "^3.0.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.2", + "vfile": "^5.3.7", + "workerpool": "^6.4.0", + "ws": "^8.13.0", + "yargs": "^17.7.2" + }, + "bin": { + "quartz": "quartz/bootstrap-cli.mjs" + }, + "devDependencies": { + "@types/cli-spinner": "^0.2.1", + "@types/d3": "^7.4.0", + "@types/flexsearch": "^0.7.3", + "@types/hast": "^2.3.4", + "@types/js-yaml": "^4.0.5", + "@types/node": "^20.1.2", + "@types/pretty-time": "^1.1.2", + "@types/source-map-support": "^0.5.6", + "@types/workerpool": "^6.4.0", + "@types/ws": "^8.5.5", + "@types/yargs": "^17.0.24", + "esbuild": "0.19.2", + "prettier": "^3.0.0", + "tsx": "^3.12.7", + "typescript": "^5.0.4" + }, + "engines": { + "node": ">=18.14", + "npm": ">=9.3.1" + } + }, + "node_modules/@clack/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.2.tgz", + "integrity": "sha512-FZnsNynwGDIDktx6PEZK1EuCkFpY4ldEX6VYvfl0dqeoLPb9Jpw1xoUXaVcGR8ExmYNm1w2vdGdJkEUYD/2pqg==", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.6.3.tgz", + "integrity": "sha512-AM+kFmAHawpUQv2q9+mcB6jLKxXGjgu/r2EQjEwujgpCdzrST6BJqYw00GRn56/L/Izw5U7ImoLmy00X/r80Pw==", + "bundleDependencies": [ + "is-unicode-supported" + ], + "dependencies": { + "@clack/core": "^0.3.2", + "is-unicode-supported": "*", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts/node_modules/is-unicode-supported": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild-kit/cjs-loader": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz", + "integrity": "sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.0.0", + "get-tsconfig": "^4.4.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.1.0.tgz", + "integrity": "sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==", + "dev": true, + "dependencies": { + "esbuild": "~0.17.6", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz", + "integrity": "sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==", + "dev": true, + "dependencies": { + "@esbuild-kit/core-utils": "^3.0.0", + "get-tsconfig": "^4.4.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", + "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.3.tgz", + "integrity": "sha512-nB/68NyaQlcdY22L+Fgd1HERQ7UGv7XFN+tPxwrEfQL4nKtAP/jIZnZtpUlXbtV+VEGHh6W/63Gy2C5biWI3sA==", + "dependencies": { + "@floating-ui/core": "^1.3.1" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@napi-rs/simple-git": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.9.tgz", + "integrity": "sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@napi-rs/simple-git-android-arm-eabi": "0.1.9", + "@napi-rs/simple-git-android-arm64": "0.1.9", + "@napi-rs/simple-git-darwin-arm64": "0.1.9", + "@napi-rs/simple-git-darwin-x64": "0.1.9", + "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.9", + "@napi-rs/simple-git-linux-arm64-gnu": "0.1.9", + "@napi-rs/simple-git-linux-arm64-musl": "0.1.9", + "@napi-rs/simple-git-linux-x64-gnu": "0.1.9", + "@napi-rs/simple-git-linux-x64-musl": "0.1.9", + "@napi-rs/simple-git-win32-arm64-msvc": "0.1.9", + "@napi-rs/simple-git-win32-x64-msvc": "0.1.9" + } + }, + "node_modules/@napi-rs/simple-git-android-arm-eabi": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.9.tgz", + "integrity": "sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-android-arm64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.9.tgz", + "integrity": "sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-arm64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.9.tgz", + "integrity": "sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-darwin-x64": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.9.tgz", + "integrity": "sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.9.tgz", + "integrity": "sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.9.tgz", + "integrity": "sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-arm64-musl": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.9.tgz", + "integrity": "sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-gnu": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.9.tgz", + "integrity": "sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-linux-x64-musl": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.9.tgz", + "integrity": "sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.9.tgz", + "integrity": "sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/simple-git-win32-x64-msvc": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.9.tgz", + "integrity": "sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cli-spinner": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/cli-spinner/-/cli-spinner-0.2.1.tgz", + "integrity": "sha512-bsdlZy3LThi9QbsK0GXm5s/e3F6HAJi1tMsIanm9trtoStSlV3gzir9JpfOK40gERMNIVevDTpG5NzSGnYs3QA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", + "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/flexsearch": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.3.tgz", + "integrity": "sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==", + "dev": true + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "dev": true + }, + "node_modules/@types/hast": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, + "node_modules/@types/katex": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", + "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==" + }, + "node_modules/@types/mathjax": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/mathjax/-/mathjax-0.0.37.tgz", + "integrity": "sha512-y0WSZBtBNQwcYipTU/BhgeFu1EZNlFvUNCmkMXV9kBQZq7/o5z82dNVyH3yy2Xv5zzeNeQoHSL4Xm06+EQiH+g==" + }, + "node_modules/@types/mdast": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", + "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, + "node_modules/@types/nlcst": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.0.tgz", + "integrity": "sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", + "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", + "dev": true + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, + "node_modules/@types/pretty-time": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/pretty-time/-/pretty-time-1.1.2.tgz", + "integrity": "sha512-4i+Y+O5H80Rh01lY/3Z0hB/UWc4R64ReE83joEpVsIG3iQWpYx66k6pQh1amJNZquKtJQyu/RcfkTtvL0KwssA==", + "dev": true + }, + "node_modules/@types/source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.0" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/workerpool": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@types/workerpool/-/workerpool-6.4.0.tgz", + "integrity": "sha512-SIF2/169pDsLKeM8GQGHkOFifGalDbZgiBSaLUnnlVSRsAOenkAvQ6h4uhV2W+PZZczS+8LQxACwNkSykdT91A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "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==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "peer": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "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/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" + } + }, + "node_modules/esbuild-sass-plugin": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.12.0.tgz", + "integrity": "sha512-+k/5WM/Yf/Ur7ahn6XXxEPwa/lmuacLO7vrCIAJuvQapX1CiIHtlX/nc2eiMoJ6P6RvqZhKpQvIiwgYJonzHtw==", + "dependencies": { + "resolve": "^1.22.2", + "sass": "^1.65.1" + }, + "peerDependencies": { + "esbuild": "^0.19.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flexsearch": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.21.tgz", + "integrity": "sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==" + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-tsconfig": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz", + "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + }, + "node_modules/glob": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", + "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.10.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.1.tgz", + "integrity": "sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/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==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-obj": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz", + "integrity": "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==", + "dependencies": { + "is-obj": "^3.0.0", + "sort-keys": "^5.0.0", + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hast-util-from-dom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz", + "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==", + "dependencies": { + "hastscript": "^7.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz", + "integrity": "sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^7.0.0", + "vfile": "^5.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz", + "integrity": "sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-dom": "^4.0.0", + "hast-util-from-html": "^1.0.0", + "unist-util-remove-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", + "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-heading-rank": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz", + "integrity": "sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", + "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-to-html": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", + "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-1.2.0.tgz", + "integrity": "sha512-Y4FB8Dx2k6zJZrwbexkVm6YVRA8Sho2tTwacjDSr/x5c0wioOpc1VIoLyGUSb8+8xkAnQPAtHbdMvzA6bl0F1w==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.1", + "unist-util-position": "^4.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", + "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", + "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", + "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "peer": true + }, + "node_modules/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.7.tgz", + "integrity": "sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.21.7", + "lightningcss-darwin-x64": "1.21.7", + "lightningcss-freebsd-x64": "1.21.7", + "lightningcss-linux-arm-gnueabihf": "1.21.7", + "lightningcss-linux-arm64-gnu": "1.21.7", + "lightningcss-linux-arm64-musl": "1.21.7", + "lightningcss-linux-x64-gnu": "1.21.7", + "lightningcss-linux-x64-musl": "1.21.7", + "lightningcss-win32-x64-msvc": "1.21.7" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.7.tgz", + "integrity": "sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.7.tgz", + "integrity": "sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.21.7.tgz", + "integrity": "sha512-RMfNzJWXCSfPnL55fcLWEAadcY6QUFT0S8NceNKYzp1KiCZtkJIy6RQ5SaVxPzRqd3iMsahUf5sfnG8N1UQSNQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.7.tgz", + "integrity": "sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.7.tgz", + "integrity": "sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.7.tgz", + "integrity": "sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.7.tgz", + "integrity": "sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.7.tgz", + "integrity": "sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.7.tgz", + "integrity": "sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mathjax-full": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", + "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==", + "dependencies": { + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" + } + }, + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", + "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-extension-frontmatter": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-math": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", + "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", + "dependencies": { + "@types/mdast": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-newline-to-break": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-1.0.0.tgz", + "integrity": "sha512-491LcYv3gbGhhCrLoeALncQmega2xPh+m3gbsIhVsOX4sw85+ShLFPvPyibxc1Swx/6GtzxgVodq+cGa/47ULg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-find-and-replace": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "dependencies": { + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", + "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", + "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", + "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", + "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==", + "dependencies": { + "@types/katex": "^0.16.0", + "katex": "^0.16.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math/node_modules/@types/katex": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", + "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==" + }, + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromorph": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/micromorph/-/micromorph-0.4.5.tgz", + "integrity": "sha512-Erasr0xiDvDeEhh7B/k7RFTwwfaAX10D7BMorNpokkwDh6XsRLYWDPaWF1m5JQeMSkGdqlEtQ8s68NcdDWuGgw==" + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", + "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nlcst-to-string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", + "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", + "dependencies": { + "@types/nlcst": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "node_modules/parse-latin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", + "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", + "dependencies": { + "nlcst-to-string": "^3.0.0", + "unist-util-modify-children": "^3.0.0", + "unist-util-visit-children": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", + "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plausible-tracker": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/plausible-tracker/-/plausible-tracker-0.3.8.tgz", + "integrity": "sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/preact": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", + "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.1.0.tgz", + "integrity": "sha512-/AsKU4Q4R8r4aKwwNQrkQQNUVEDmTeZr6IwesDffobFRPcTk4dSQrfo1VOcXjtlcUss6QYEe7JShUGbQIhaw+A==", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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.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", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/property-information": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", + "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rehype-autolink-headings": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz", + "integrity": "sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==", + "dependencies": { + "@types/hast": "^2.0.0", + "extend": "^3.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-heading-rank": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-katex": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz", + "integrity": "sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/katex": "^0.14.0", + "hast-util-from-html-isomorphic": "^1.0.0", + "hast-util-to-text": "^3.1.0", + "katex": "^0.16.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-mathjax": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-4.0.3.tgz", + "integrity": "sha512-QIwWH9U+r54nMQklVkT1qluxhKyzdPWz9dFwgel3BrseQsWZafRTDTUj8VR8/14nFuRIV2ChuCMz4zpACPoYvg==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mathjax": "^0.0.37", + "hast-util-from-dom": "^4.0.0", + "hast-util-to-text": "^3.1.0", + "jsdom": "^20.0.0", + "mathjax-full": "^3.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-pretty-code": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.10.0.tgz", + "integrity": "sha512-qCD071Y+vUxEy9yyrATPk2+W9q7qCbzZgtc9suZhu75bmRQvOlBhJt4d3WvqSMTamkKoFkvqtCjyAk+ggH+aXQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hash-obj": "^4.0.0", + "parse-numeric-range": "^1.3.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "shiki": "0.x" + } + }, + "node_modules/rehype-raw": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-raw": "^7.2.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-5.1.0.tgz", + "integrity": "sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==", + "dependencies": { + "@types/hast": "^2.0.0", + "github-slugger": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-heading-rank": "^2.0.0", + "hast-util-to-string": "^2.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", + "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", + "dependencies": { + "@types/mdast": "^3.0.0", + "remark-parse": "^10.0.0", + "remark-stringify": "^10.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-breaks": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.3.tgz", + "integrity": "sha512-C7VkvcUp1TPUc2eAYzsPdaUh8Xj4FSbQnYA5A9f80diApLZscTDeG7efiWP65W8hV2sEy3JuGVU0i6qr5D8Hug==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-newline-to-break": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-frontmatter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", + "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-frontmatter": "^1.0.0", + "micromark-extension-frontmatter": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-math": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz", + "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-math": "^2.0.0", + "micromark-extension-math": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", + "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", + "dependencies": { + "retext": "^8.1.0", + "retext-smartypants": "^5.1.0", + "unist-util-visit": "^4.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", + "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retext": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", + "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "retext-latin": "^3.0.0", + "retext-stringify": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", + "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "parse-latin": "^5.0.0", + "unherit": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", + "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "nlcst-to-string": "^3.0.0", + "unified": "^10.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", + "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", + "dependencies": { + "@types/nlcst": "^1.0.0", + "nlcst-to-string": "^3.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "dependencies": { + "glob": "^10.2.5" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "peer": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "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", + "integrity": "sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "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==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speech-rule-engine": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", + "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", + "dependencies": { + "commander": "9.2.0", + "wicked-good-xpath": "1.3.0", + "xmldom-sre": "0.1.31" + }, + "bin": { + "sre": "bin/sre" + } + }, + "node_modules/speech-rule-engine/node_modules/commander": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-vfile": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-7.2.4.tgz", + "integrity": "sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==", + "dependencies": { + "is-buffer": "^2.0.0", + "vfile": "^5.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsx": { + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.7.tgz", + "integrity": "sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==", + "dev": true, + "dependencies": { + "@esbuild-kit/cjs-loader": "^2.4.2", + "@esbuild-kit/core-utils": "^3.0.0", + "@esbuild-kit/esm-loader": "^2.5.5" + }, + "bin": { + "tsx": "dist/cli.js" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unherit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", + "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-find-after": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", + "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", + "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", + "dependencies": { + "@types/unist": "^2.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", + "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", + "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "peer": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "peer": true + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" + }, + "node_modules/workerpool": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.4.0.tgz", + "integrity": "sha512-i3KR1mQMNwY2wx20ozq2EjISGtQWDIfV56We+yGJ5yDs8jTwQiLLaqHlkBHITlCuJnYlVRmXegxFxZg7gqI++A==" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3fa8c23 --- /dev/null +++ b/package.json @@ -0,0 +1,109 @@ +{ + "name": "@jackyzha0/quartz", + "description": "🌱 publish your digital garden and notes as a website", + "private": true, + "version": "4.1.0", + "type": "module", + "author": "jackyzha0 ", + "license": "MIT", + "homepage": "https://quartz.jzhao.xyz", + "repository": { + "type": "git", + "url": "https://github.com/jackyzha0/quartz.git" + }, + "scripts": { + "docs": "npx quartz build --serve -d docs", + "check": "tsc --noEmit && npx prettier . --check", + "format": "npx prettier . --write", + "test": "tsx ./quartz/util/path.test.ts", + "profile": "0x -D prof ./quartz/bootstrap-cli.mjs build --concurrency=1" + }, + "engines": { + "npm": ">=9.3.1", + "node": ">=18.14" + }, + "keywords": [ + "site generator", + "ssg", + "digital-garden", + "markdown", + "blog", + "quartz" + ], + "bin": { + "quartz": "./quartz/bootstrap-cli.mjs" + }, + "dependencies": { + "@clack/prompts": "^0.6.3", + "@floating-ui/dom": "^1.4.0", + "@napi-rs/simple-git": "0.1.9", + "async-mutex": "^0.4.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-spinner": "^0.2.10", + "d3": "^7.8.5", + "esbuild-sass-plugin": "^2.12.0", + "flexsearch": "0.7.21", + "github-slugger": "^2.0.0", + "globby": "^13.1.4", + "gray-matter": "^4.0.3", + "hast-util-to-html": "^8.0.4", + "hast-util-to-jsx-runtime": "^1.2.0", + "hast-util-to-string": "^2.0.0", + "is-absolute-url": "^4.0.1", + "js-yaml": "^4.1.0", + "lightningcss": "1.21.7", + "mdast-util-find-and-replace": "^2.2.2", + "mdast-util-to-hast": "^12.3.0", + "mdast-util-to-string": "^3.2.0", + "micromorph": "^0.4.5", + "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", + "rehype-katex": "^6.0.3", + "rehype-mathjax": "^4.0.3", + "rehype-pretty-code": "^0.10.0", + "rehype-raw": "^6.1.1", + "rehype-slug": "^5.1.0", + "remark": "^14.0.2", + "remark-breaks": "^3.0.3", + "remark-frontmatter": "^4.0.1", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", + "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", + "toml": "^3.0.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.2", + "vfile": "^5.3.7", + "workerpool": "^6.4.0", + "ws": "^8.13.0", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@types/cli-spinner": "^0.2.1", + "@types/d3": "^7.4.0", + "@types/flexsearch": "^0.7.3", + "@types/hast": "^2.3.4", + "@types/js-yaml": "^4.0.5", + "@types/node": "^20.1.2", + "@types/pretty-time": "^1.1.2", + "@types/source-map-support": "^0.5.6", + "@types/workerpool": "^6.4.0", + "@types/ws": "^8.5.5", + "@types/yargs": "^17.0.24", + "esbuild": "0.19.2", + "prettier": "^3.0.0", + "tsx": "^3.12.7", + "typescript": "^5.0.4" + } +} diff --git a/quartz.config.ts b/quartz.config.ts new file mode 100644 index 0000000..61ac442 --- /dev/null +++ b/quartz.config.ts @@ -0,0 +1,75 @@ +import { QuartzConfig } from "./quartz/cfg" +import * as Plugin from "./quartz/plugins" + +const config: QuartzConfig = { + configuration: { + pageTitle: "📚 X·Eden", + enableSPA: true, + enablePopovers: true, + analytics: null, + baseUrl: "wiki.7wate.com", + ignorePatterns: ["private", "Templates", ".obsidian", "Canvas", "Static"], + defaultDateType: "created", + theme: { + typography: { + header: "Schibsted Grotesk", + body: "Source Sans Pro", + code: "IBM Plex Mono", + }, + colors: { + lightMode: { + light: "#faf8f8", + lightgray: "#e5e5e5", + gray: "#b8b8b8", + darkgray: "#4e4e4e", + dark: "#2b2b2b", + secondary: "#284b63", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + }, + darkMode: { + light: "#161618", + lightgray: "#393639", + gray: "#646464", + darkgray: "#d4d4d4", + dark: "#ebebec", + secondary: "#7b97aa", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)", + }, + }, + }, + }, + plugins: { + transformers: [ + Plugin.FrontMatter(), + Plugin.TableOfContents(), + Plugin.CreatedModifiedDate({ + priority: ["frontmatter", "filesystem"], // you can add 'git' here for last modified from Git but this makes the build slower + }), + Plugin.SyntaxHighlighting(), + Plugin.ObsidianFlavoredMarkdown({ enableInHtmlEmbed: false }), + Plugin.GitHubFlavoredMarkdown(), + Plugin.CrawlLinks({ markdownLinkResolution: "shortest" }), + Plugin.Latex({ renderEngine: "katex" }), + Plugin.Description(), + ], + filters: [Plugin.RemoveDrafts()], + emitters: [ + Plugin.AliasRedirects(), + Plugin.ComponentResources({ fontOrigin: "googleFonts" }), + Plugin.ContentPage(), + Plugin.FolderPage(), + Plugin.TagPage(), + Plugin.ContentIndex({ + enableSiteMap: true, + enableRSS: true, + }), + Plugin.Assets(), + Plugin.Static(), + Plugin.NotFoundPage(), + ], + }, +} + +export default config diff --git a/quartz.layout.ts b/quartz.layout.ts new file mode 100644 index 0000000..1f16595 --- /dev/null +++ b/quartz.layout.ts @@ -0,0 +1,57 @@ +import { PageLayout, SharedLayout, } from "./quartz/cfg" +import * as Component from "./quartz/components" +import { QuartzPluginData } from "./quartz/plugins/vfile"; + +// components shared across all pages +export const sharedPageComponents: SharedLayout = { + head: Component.Head(), + header: [], + footer: Component.Footer({ + links: { + "Blog": "https://blog.7wate.com", + GitHub: "https://github.com/7wate", + }, + }), +} + +// components for pages that display a single page (e.g. a single note) +export const defaultContentPageLayout: PageLayout = { + beforeBody: [ + Component.Breadcrumbs(), + Component.ArticleTitle(), + Component.ContentMeta(), + Component.TagList(), + ], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Search(), + Component.Darkmode(), + Component.DesktopOnly(Component.Explorer()), + Component.DesktopOnly(Component.RecentNotes({ + filter:(data: QuartzPluginData) => { + // 是否以 'Blog/' 开头 + // console.log('Current file path:', data.filePath); + return data.filePath ? data.filePath.startsWith('content/Blog') : false; + } + } + )), + ], + right: [ + Component.Graph(), + Component.DesktopOnly(Component.TableOfContents()), + Component.Backlinks(), + ], +} + +// components for pages that display lists of pages (e.g. tags or folders) +export const defaultListPageLayout: PageLayout = { + beforeBody: [Component.ArticleTitle()], + left: [ + Component.PageTitle(), + Component.MobileOnly(Component.Spacer()), + Component.Search(), + Component.Darkmode(), + ], + right: [], +} diff --git a/quartz/.quartz-cache/transpiled-build.mjs b/quartz/.quartz-cache/transpiled-build.mjs new file mode 100644 index 0000000..4a153a4 --- /dev/null +++ b/quartz/.quartz-cache/transpiled-build.mjs @@ -0,0 +1,8026 @@ +var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});import sourceMapSupport from"source-map-support";import path12 from"path";import chalk from"chalk";import pretty from"pretty-time";var PerfTimer=class{static{__name(this,"PerfTimer")}evts;constructor(){this.evts={},this.addEvent("start")}addEvent(evtName){this.evts[evtName]=process.hrtime()}timeSince(evtName){return chalk.yellow(pretty(process.hrtime(this.evts[evtName??"start"])))}};import{rimraf}from"rimraf";import{isGitIgnored}from"globby";import chalk5 from"chalk";import esbuild from"esbuild";import remarkParse from"remark-parse";import remarkRehype from"remark-rehype";import{unified}from"unified";import{read}from"to-vfile";import{slug}from"github-slugger";var QUARTZ="quartz";function slugifyFilePath(fp,excludeExt){fp=_stripSlashes(fp);let ext=_getFileExtension(fp),withoutFileExt=fp.replace(new RegExp(ext+"$"),"");(excludeExt||[".md",".html",void 0].includes(ext))&&(ext="");let slug2=withoutFileExt.split("/").map(segment=>segment.replace(/\s/g,"-").replace(/%/g,"-percent").replace(/\?/g,"-q")).join("/").replace(/\/$/,"");return _endsWith(slug2,"_index")&&(slug2=slug2.replace(/_index$/,"index")),slug2+ext}__name(slugifyFilePath,"slugifyFilePath");function simplifySlug(fp){return _stripSlashes(_trimSuffix(fp,"index"),!0)}__name(simplifySlug,"simplifySlug");function transformInternalLink(link){let[fplike,anchor]=splitAnchor(decodeURI(link)),folderPath=_isFolderPath(fplike),segments=fplike.split("/").filter(x=>x.length>0),prefix=segments.filter(_isRelativeSegment).join("/"),fp=segments.filter(seg=>!_isRelativeSegment(seg)&&seg!=="").join("/"),simpleSlug=simplifySlug(slugifyFilePath(fp)),joined=joinSegments(_stripSlashes(prefix),_stripSlashes(simpleSlug)),trail=folderPath?"/":"";return _addRelativeToStart(joined)+trail+anchor}__name(transformInternalLink,"transformInternalLink");function pathToRoot(slug2){let rootPath=slug2.split("/").filter(x=>x!=="").slice(0,-1).map(_=>"..").join("/");return rootPath.length===0&&(rootPath="."),rootPath}__name(pathToRoot,"pathToRoot");function resolveRelative(current,target){return joinSegments(pathToRoot(current),simplifySlug(target))}__name(resolveRelative,"resolveRelative");function splitAnchor(link){let[fp,anchor]=link.split("#",2);return anchor=anchor===void 0?"":"#"+slugAnchor(anchor),[fp,anchor]}__name(splitAnchor,"splitAnchor");function slugAnchor(anchor){return slug(anchor)}__name(slugAnchor,"slugAnchor");function slugTag(tag){return tag.split("/").map(tagSegment=>slug(tagSegment)).join("/")}__name(slugTag,"slugTag");function joinSegments(...args){return args.filter(segment=>segment!=="").join("/").replace(/\/\/+/g,"/")}__name(joinSegments,"joinSegments");function getAllSegmentPrefixes(tags){let segments=tags.split("/"),results=[];for(let i=0;i{let fileName=slug2.split("/").at(-1);return targetCanonical===fileName});if(matchingFileNames.length===1){let targetSlug2=matchingFileNames[0];return resolveRelative(src,targetSlug2)+targetAnchor}}return joinSegments(pathToRoot(src),canonicalSlug)+folderTail}}__name(transformLink,"transformLink");function _isFolderPath(fplike){return fplike.endsWith("/")||_endsWith(fplike,"index")||_endsWith(fplike,"index.md")||_endsWith(fplike,"index.html")}__name(_isFolderPath,"_isFolderPath");function _endsWith(s,suffix){return s===suffix||s.endsWith("/"+suffix)}__name(_endsWith,"_endsWith");function _trimSuffix(s,suffix){return _endsWith(s,suffix)&&(s=s.slice(0,-suffix.length)),s}__name(_trimSuffix,"_trimSuffix");function _getFileExtension(s){return s.match(/\.[A-Za-z0-9]+$/)?.[0]}__name(_getFileExtension,"_getFileExtension");function _isRelativeSegment(s){return/^\.{0,2}$/.test(s)}__name(_isRelativeSegment,"_isRelativeSegment");function _stripSlashes(s,onlyStripPrefix){return s.startsWith("/")&&(s=s.substring(1)),!onlyStripPrefix&&s.endsWith("/")&&(s=s.slice(0,-1)),s}__name(_stripSlashes,"_stripSlashes");function _addRelativeToStart(s){return s===""&&(s="."),s.startsWith(".")||(s=joinSegments(".",s)),s}__name(_addRelativeToStart,"_addRelativeToStart");import path from"path";import workerpool,{Promise as WorkerPromise}from"workerpool";import{Spinner}from"cli-spinner";var QuartzLogger=class{static{__name(this,"QuartzLogger")}verbose;spinner;constructor(verbose){this.verbose=verbose}start(text){this.verbose?console.log(text):(this.spinner=new Spinner(`%s ${text}`),this.spinner.setSpinnerString(18),this.spinner.start())}end(text){this.verbose||this.spinner.stop(!0),text&&console.log(text)}};import chalk2 from"chalk";import process2 from"process";import{isMainThread}from"workerpool";var rootFile=/.*at file:/;function trace(msg,err){let stack=err.stack??"",lines=[];lines.push(""),lines.push(` +`+chalk2.bgRed.black.bold(" ERROR ")+` + +`+chalk2.red(` ${msg}`)+(err.message.length>0?`: ${err.message}`:""));let reachedEndOfLegibleTrace=!1;for(let line of stack.split(` +`).slice(1)){if(reachedEndOfLegibleTrace)break;line.includes("node_modules")||(lines.push(` ${line}`),rootFile.test(line)&&(reachedEndOfLegibleTrace=!0))}let traceMsg=lines.join(` +`);if(isMainThread)console.error(traceMsg),process2.exit(1);else throw new Error(traceMsg)}__name(trace,"trace");function createProcessor(ctx){let transformers=ctx.cfg.plugins.transformers,processor=unified().use(remarkParse);for(let plugin of transformers.filter(p=>p.markdownPlugins))processor=processor.use(plugin.markdownPlugins(ctx));processor=processor.use(remarkRehype,{allowDangerousHtml:!0});for(let plugin of transformers.filter(p=>p.htmlPlugins))processor=processor.use(plugin.htmlPlugins(ctx));return processor}__name(createProcessor,"createProcessor");function*chunks(arr,n){for(let i=0;i({contents:"",loader:"text"})),build.onLoad({filter:/\.inline\.(ts|js)$/},_=>({contents:"",loader:"text"}))}}]})}__name(transpileWorkerScript,"transpileWorkerScript");function createFileParser(ctx,fps){let{argv,cfg}=ctx;return async processor=>{let res=[];for(let fp of fps)try{let perf=new PerfTimer,file=await read(fp);file.value=file.value.toString().trim();for(let plugin of cfg.plugins.transformers.filter(p=>p.textTransform))file.value=plugin.textTransform(ctx,file.value);file.data.slug=slugifyFilePath(path.posix.relative(argv.directory,file.path)),file.data.filePath=fp;let ast=processor.parse(file),newAst=await processor.run(ast,file);res.push([newAst,file]),argv.verbose&&console.log(`[process] ${fp} -> ${file.data.slug} (${perf.timeSince()})`)}catch(err){trace(` +Failed to process \`${fp}\``,err)}return res}}__name(createFileParser,"createFileParser");var clamp=__name((num,min,max)=>Math.min(Math.max(Math.round(num),min),max),"clamp");async function parseMarkdown(ctx,fps){let{argv}=ctx,perf=new PerfTimer,log=new QuartzLogger(argv.verbose),CHUNK_SIZE=128,concurrency=ctx.argv.concurrency??clamp(fps.length/CHUNK_SIZE,1,4),res=[];if(log.start(`Parsing input files using ${concurrency} threads`),concurrency===1)try{let processor=createProcessor(ctx);res=await createFileParser(ctx,fps)(processor)}catch(error){throw log.end(),error}else{await transpileWorkerScript();let pool=workerpool.pool("./quartz/bootstrap-worker.mjs",{minWorkers:"max",maxWorkers:concurrency,workerType:"thread"}),childPromises=[];for(let chunk of chunks(fps,CHUNK_SIZE))childPromises.push(pool.exec("parseFiles",[argv,chunk,ctx.allSlugs]));res=(await WorkerPromise.all(childPromises).catch(err=>{let errString=err.toString().slice(6);console.error(errString),process.exit(1)})).flat(),await pool.terminate()}return log.end(`Parsed ${res.length} Markdown files in ${perf.timeSince()}`),res}__name(parseMarkdown,"parseMarkdown");function filterContent(ctx,content){let{cfg,argv}=ctx,perf=new PerfTimer,initialLength=content.length;for(let plugin of cfg.plugins.filters){let updatedContent=content.filter(item=>plugin.shouldPublish(ctx,item));if(argv.verbose){let diff=content.filter(x=>!updatedContent.includes(x));for(let file of diff)console.log(`[filter:${plugin.name}] ${file[1].data.slug}`)}content=updatedContent}return console.log(`Filtered out ${initialLength-content.length} files in ${perf.timeSince()}`),content}__name(filterContent,"filterContent");import path11 from"path";import fs4 from"fs";import matter from"gray-matter";import remarkFrontmatter from"remark-frontmatter";import yaml from"js-yaml";import toml from"toml";var defaultOptions={delims:"---",language:"yaml"},FrontMatter=__name(userOpts=>{let opts={...defaultOptions,...userOpts};return{name:"FrontMatter",markdownPlugins(){return[[remarkFrontmatter,["yaml","toml"]],()=>(_,file)=>{let{data}=matter(file.value,{...opts,engines:{yaml:s=>yaml.load(s,{schema:yaml.JSON_SCHEMA}),toml:s=>toml.parse(s)}});data.tag&&(data.tags=data.tag),data.title&&(data.title=data.title.toString()),data.tags&&!Array.isArray(data.tags)&&(data.tags=data.tags.toString().split(",").map(tag=>tag.trim())),data.tags=[...new Set(data.tags?.map(tag=>slugTag(tag)))],file.data.frontmatter={title:file.stem??"Untitled",tags:[],...data}}]}}},"FrontMatter");import remarkGfm from"remark-gfm";import smartypants from"remark-smartypants";import rehypeSlug from"rehype-slug";import rehypeAutolinkHeadings from"rehype-autolink-headings";var defaultOptions2={enableSmartyPants:!0,linkHeadings:!0},GitHubFlavoredMarkdown=__name(userOpts=>{let opts={...defaultOptions2,...userOpts};return{name:"GitHubFlavoredMarkdown",markdownPlugins(){return opts.enableSmartyPants?[remarkGfm,smartypants]:[remarkGfm]},htmlPlugins(){return opts.linkHeadings?[rehypeSlug,[rehypeAutolinkHeadings,{behavior:"append",content:{type:"text",value:" \xA7"}}]]:[]}}},"GitHubFlavoredMarkdown");import fs from"fs";import path2 from"path";import{Repository}from"@napi-rs/simple-git";import chalk3 from"chalk";var defaultOptions3={priority:["frontmatter","git","filesystem"]};function coerceDate(fp,d){let dt=new Date(d),invalidDate=isNaN(dt.getTime())||dt.getTime()===0;return invalidDate&&d!==void 0&&console.log(chalk3.yellow(` +Warning: found invalid date "${d}" in \`${fp}\`. Supported formats: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format`)),invalidDate?new Date:dt}__name(coerceDate,"coerceDate");var CreatedModifiedDate=__name(userOpts=>{let opts={...defaultOptions3,...userOpts};return{name:"CreatedModifiedDate",markdownPlugins(){return[()=>{let repo;return async(_tree,file)=>{let created,modified,published,fp=file.data.filePath,fullFp=path2.posix.join(file.cwd,fp);for(let source of opts.priority)if(source==="filesystem"){let st=await fs.promises.stat(fullFp);created||=st.birthtimeMs,modified||=st.mtimeMs}else source==="frontmatter"&&file.data.frontmatter?(created||=file.data.frontmatter.date,modified||=file.data.frontmatter.lastmod,modified||=file.data.frontmatter.updated,modified||=file.data.frontmatter["last-modified"],published||=file.data.frontmatter.publishDate):source==="git"&&(repo||(repo=new Repository(file.cwd)),modified||=await repo.getFileLatestModifiedDateAsync(file.data.filePath));file.data.dates={created:coerceDate(fp,created),modified:coerceDate(fp,modified),published:coerceDate(fp,published)}}}]}}},"CreatedModifiedDate");import remarkMath from"remark-math";import rehypeKatex from"rehype-katex";import rehypeMathjax from"rehype-mathjax/svg.js";var Latex=__name(opts=>{let engine=opts?.renderEngine??"katex";return{name:"Latex",markdownPlugins(){return[remarkMath]},htmlPlugins(){return engine==="katex"?[[rehypeKatex,{output:"html"}]]:[rehypeMathjax]},externalResources(){return engine==="katex"?{css:["https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"],js:[{src:"https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js",loadTime:"afterDOMReady",contentType:"external"}]}:{}}}},"Latex");import{toString}from"hast-util-to-string";var escapeHTML=__name(unsafe=>unsafe.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'"),"escapeHTML");var defaultOptions4={descriptionLength:150},Description=__name(userOpts=>{let opts={...defaultOptions4,...userOpts};return{name:"Description",htmlPlugins(){return[()=>async(tree,file)=>{let frontMatterDescription=file.data.frontmatter?.description,text=escapeHTML(toString(tree)),sentences=(frontMatterDescription??text).replace(/\s+/g," ").split("."),finalDesc="",sentenceIdx=0,len=opts.descriptionLength;for(;finalDesc.length{let opts={...defaultOptions5,...userOpts};return{name:"LinkProcessing",htmlPlugins(ctx){return[()=>(tree,file)=>{let curSlug=simplifySlug(file.data.slug),outgoing=new Set,transformOptions={strategy:opts.markdownLinkResolution,allSlugs:ctx.allSlugs};visit(tree,"element",(node,_index,_parent)=>{if(node.tagName==="a"&&node.properties&&typeof node.properties.href=="string"){let dest=node.properties.href;node.properties.className??=[],node.properties.className.push(isAbsoluteUrl(dest)?"external":"internal"),opts.openLinksInNewTab&&(node.properties.target="_blank");let isInternal=!(isAbsoluteUrl(dest)||dest.startsWith("#"));if(isInternal){dest=node.properties.href=transformLink(file.data.slug,dest,transformOptions);let canonicalDest=new URL(dest,`https://base.com/${curSlug}`).pathname,[destCanonical,_destAnchor]=splitAnchor(canonicalDest),simple=decodeURIComponent(simplifySlug(destCanonical));outgoing.add(simple),node.properties["data-slug"]=simple}opts.prettyLinks&&isInternal&&node.children.length===1&&node.children[0].type==="text"&&!node.children[0].value.startsWith("#")&&(node.children[0].value=path3.basename(node.children[0].value))}if(["img","video","audio","iframe"].includes(node.tagName)&&node.properties&&typeof node.properties.src=="string"&&!isAbsoluteUrl(node.properties.src)){let dest=node.properties.src;dest=node.properties.src=transformLink(file.data.slug,dest,transformOptions),node.properties.src=dest}}),file.data.links=[...outgoing]}]}}},"CrawlLinks");import{findAndReplace as mdastFindReplace}from"mdast-util-find-and-replace";import{slug as slugAnchor2}from"github-slugger";import rehypeRaw from"rehype-raw";import{visit as visit2}from"unist-util-visit";import path4 from"path";var callout_inline_default=`// quartz/components/scripts/quartz/components/scripts/callout.inline.ts +function toggleCallout() { + const outerBlock = this.parentElement; + outerBlock.classList.toggle(\`is-collapsed\`); + const collapsed = outerBlock.classList.contains(\`is-collapsed\`); + const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight; + outerBlock.style.maxHeight = height + \`px\`; + let current = outerBlock; + let parent = outerBlock.parentElement; + while (parent) { + if (!parent.classList.contains(\`callout\`)) { + return; + } + const collapsed2 = parent.classList.contains(\`is-collapsed\`); + const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight; + parent.style.maxHeight = height2 + \`px\`; + current = parent; + parent = parent.parentElement; + } +} +function setupCallout() { + const collapsible = document.getElementsByClassName( + \`callout is-collapsible\` + ); + for (const div of collapsible) { + const title = div.firstElementChild; + if (title) { + title.removeEventListener(\`click\`, toggleCallout); + title.addEventListener(\`click\`, toggleCallout); + const collapsed = div.classList.contains(\`is-collapsed\`); + const height = collapsed ? title.scrollHeight : div.scrollHeight; + div.style.maxHeight = height + \`px\`; + } + } +} +document.addEventListener(\`nav\`, setupCallout); +window.addEventListener(\`resize\`, setupCallout); +`;import{toHast}from"mdast-util-to-hast";import{toHtml}from"hast-util-to-html";function pluralize(count,s){return count===1?`1 ${s}`:`${count} ${s}s`}__name(pluralize,"pluralize");function capitalize(s){return s.substring(0,1).toUpperCase()+s.substring(1)}__name(capitalize,"capitalize");var defaultOptions6={comments:!0,highlight:!0,wikilinks:!0,callouts:!0,mermaid:!0,parseTags:!0,parseBlockReferences:!0,enableInHtmlEmbed:!1},icons={infoIcon:'',pencilIcon:'',clipboardListIcon:'',checkCircleIcon:'',flameIcon:'',checkIcon:'',helpCircleIcon:'',alertTriangleIcon:'',xIcon:'',zapIcon:'',bugIcon:'',listIcon:'',quoteIcon:''},callouts={note:icons.pencilIcon,abstract:icons.clipboardListIcon,info:icons.infoIcon,todo:icons.checkCircleIcon,tip:icons.flameIcon,success:icons.checkIcon,question:icons.helpCircleIcon,warning:icons.alertTriangleIcon,failure:icons.xIcon,danger:icons.zapIcon,bug:icons.bugIcon,example:icons.listIcon,quote:icons.quoteIcon},calloutMapping={note:"note",abstract:"abstract",summary:"abstract",tldr:"abstract",info:"info",todo:"todo",tip:"tip",hint:"tip",important:"tip",success:"success",check:"success",done:"success",question:"question",help:"question",faq:"question",warning:"warning",attention:"warning",caution:"warning",failure:"failure",missing:"failure",fail:"failure",danger:"danger",error:"danger",bug:"bug",example:"example",quote:"quote",cite:"quote"};function canonicalizeCallout(calloutName){let callout=calloutName.toLowerCase();return calloutMapping[callout]??"note"}__name(canonicalizeCallout,"canonicalizeCallout");var wikilinkRegex=new RegExp(/!?\[\[([^\[\]\|\#]+)?(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/,"g"),highlightRegex=new RegExp(/==([^=]+)==/,"g"),commentRegex=new RegExp(/%%(.+)%%/,"g"),calloutRegex=new RegExp(/^\[\!(\w+)\]([+-]?)/),calloutLineRegex=new RegExp(/^> *\[\!\w+\][+-]?.*$/,"gm"),tagRegex=new RegExp(/(?:^| )#((?:[-_\p{L}\d])+(?:\/[-_\p{L}\d]+)*)/,"gu"),blockReferenceRegex=new RegExp(/\^([A-Za-z0-9]+)$/,"g"),ObsidianFlavoredMarkdown=__name(userOpts=>{let opts={...defaultOptions6,...userOpts},mdastToHtml=__name(ast=>{let hast=toHast(ast,{allowDangerousHtml:!0});return toHtml(hast,{allowDangerousHtml:!0})},"mdastToHtml"),findAndReplace=opts.enableInHtmlEmbed?(tree,regex,replace)=>{replace&&visit2(tree,"html",node=>{typeof replace=="string"?node.value=node.value.replace(regex,replace):node.value=node.value.replaceAll(regex,(substring,...args)=>{let replaceValue=replace(substring,...args);return typeof replaceValue=="string"?replaceValue:Array.isArray(replaceValue)?replaceValue.map(mdastToHtml).join(""):typeof replaceValue=="object"&&replaceValue!==null?mdastToHtml(replaceValue):substring})}),mdastFindReplace(tree,regex,replace)}:mdastFindReplace;return{name:"ObsidianFlavoredMarkdown",textTransform(_ctx,src){return opts.callouts&&(src=src.toString(),src=src.replaceAll(calloutLineRegex,value=>value+` +> `)),opts.wikilinks&&(src=src.toString(),src=src.replaceAll(wikilinkRegex,(value,...capture)=>{let[rawFp,rawHeader,rawAlias]=capture,fp=rawFp??"",anchor=rawHeader?.trim().slice(1),displayAnchor=anchor?`#${slugAnchor2(anchor)}`:"",displayAlias=rawAlias??rawHeader?.replace("#","|")??"";return`${value.startsWith("!")?"!":""}[[${fp}${displayAnchor}${displayAlias}]]`})),src},markdownPlugins(){let plugins=[];return opts.wikilinks&&plugins.push(()=>(tree,_file)=>{findAndReplace(tree,wikilinkRegex,(value,...capture)=>{let[rawFp,rawHeader,rawAlias]=capture,fp=rawFp?.trim()??"",anchor=rawHeader?.trim()??"",alias=rawAlias?.slice(1).trim();if(value.startsWith("!")){let ext=path4.extname(fp).toLowerCase(),url2=slugifyFilePath(fp);if([".png",".jpg",".jpeg",".gif",".bmp",".svg"].includes(ext)){let dims=alias??"",[width,height]=dims.split("x",2);return width||="auto",height||="auto",{type:"image",url:url2,data:{hProperties:{width,height}}}}else{if([".mp4",".webm",".ogv",".mov",".mkv"].includes(ext))return{type:"html",value:``};if([".mp3",".webm",".wav",".m4a",".ogg",".3gp",".flac"].includes(ext))return{type:"html",value:``};if([".pdf"].includes(ext))return{type:"html",value:``};if(ext===""){let block=anchor.slice(1);return{type:"html",data:{hProperties:{transclude:!0}},value:`
Transclude of block ${block}
`}}}}return{type:"link",url:fp+anchor,children:[{type:"text",value:alias??fp}]}})}),opts.highlight&&plugins.push(()=>(tree,_file)=>{findAndReplace(tree,highlightRegex,(_value,...capture)=>{let[inner]=capture;return{type:"html",value:`${inner}`}})}),opts.comments&&plugins.push(()=>(tree,_file)=>{findAndReplace(tree,commentRegex,(_value,..._capture)=>({type:"text",value:""}))}),opts.callouts&&plugins.push(()=>(tree,_file)=>{visit2(tree,"blockquote",node=>{if(node.children.length===0)return;let firstChild=node.children[0];if(firstChild.type!=="paragraph"||firstChild.children[0]?.type!=="text")return;let text=firstChild.children[0].value,restChildren=firstChild.children.slice(1),[firstLine,...remainingLines]=text.split(` +`),remainingText=remainingLines.join(` +`),match=firstLine.match(calloutRegex);if(match&&match.input){let[calloutDirective,typeString,collapseChar]=match,calloutType=canonicalizeCallout(typeString.toLowerCase()),collapse=collapseChar==="+"||collapseChar==="-",defaultState=collapseChar==="-"?"collapsed":"expanded",titleNode={type:"paragraph",children:[{type:"text",value:(match.input.slice(calloutDirective.length).trim()||capitalize(calloutType))+" "},...restChildren]},title=mdastToHtml(titleNode),toggleIcon=` + + `,blockquoteContent=[{type:"html",value:`
+
${callouts[calloutType]}
+
${title}
+ ${collapse?toggleIcon:""} +
`}];remainingText.length>0&&blockquoteContent.push({type:"paragraph",children:[{type:"text",value:remainingText}]}),node.children.splice(0,1,...blockquoteContent),node.data={hProperties:{...node.data?.hProperties??{},className:`callout ${collapse?"is-collapsible":""} ${defaultState==="collapsed"?"is-collapsed":""}`,"data-callout":calloutType,"data-callout-fold":collapse}}}})}),opts.mermaid&&plugins.push(()=>(tree,_file)=>{visit2(tree,"code",node=>{node.lang==="mermaid"&&(node.data={hProperties:{className:["mermaid"]}})})}),opts.parseTags&&plugins.push(()=>(tree,file)=>{let base=pathToRoot(file.data.slug);findAndReplace(tree,tagRegex,(_value,tag)=>/^\d+$/.test(tag)?!1:(tag=slugTag(tag),file.data.frontmatter&&!file.data.frontmatter.tags.includes(tag)&&file.data.frontmatter.tags.push(tag),{type:"link",url:base+`/tags/${tag}`,data:{hProperties:{className:["tag-link"]}},children:[{type:"text",value:`#${tag}`}]}))}),plugins},htmlPlugins(){let plugins=[rehypeRaw];return opts.parseBlockReferences&&plugins.push(()=>{let inlineTagTypes=new Set(["p","li"]),blockTagTypes=new Set(["blockquote"]);return(tree,file)=>{file.data.blocks={},visit2(tree,"element",(node,index,parent)=>{if(blockTagTypes.has(node.tagName)){let nextChild=parent?.children.at(index+2);if(nextChild&&nextChild.tagName==="p"){let text=nextChild.children.at(0);if(text&&text.value&&text.type==="text"){let matches=text.value.match(blockReferenceRegex);if(matches&&matches.length>=1){parent.children.splice(index+2,1);let block=matches[0].slice(1);Object.keys(file.data.blocks).includes(block)||(node.properties={...node.properties,id:block},file.data.blocks[block]=node)}}}}else if(inlineTagTypes.has(node.tagName)){let last=node.children.at(-1);if(last&&last.value&&typeof last.value=="string"){let matches=last.value.match(blockReferenceRegex);if(matches&&matches.length>=1){last.value=last.value.slice(0,-matches[0].length);let block=matches[0].slice(1);Object.keys(file.data.blocks).includes(block)||(node.properties={...node.properties,id:block},file.data.blocks[block]=node)}}}})}}),plugins},externalResources(){let js=[];return opts.callouts&&js.push({script:callout_inline_default,loadTime:"afterDOMReady",contentType:"inline"}),opts.mermaid&&js.push({script:` + import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; + const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + theme: darkMode ? 'dark' : 'default' + }); + document.addEventListener('nav', async () => { + await mermaid.run({ + querySelector: '.mermaid' + }) + }); + `,loadTime:"afterDOMReady",moduleType:"module",contentType:"inline"}),{js}}}},"ObsidianFlavoredMarkdown");var relrefRegex=new RegExp(/\[([^\]]+)\]\(\{\{< relref "([^"]+)" >\}\}\)/,"g"),predefinedHeadingIdRegex=new RegExp(/(.*) {#(?:.*)}/,"g"),hugoShortcodeRegex=new RegExp(/{{(.*)}}/,"g"),figureTagRegex=new RegExp(/< ?figure src="(.*)" ?>/,"g"),inlineLatexRegex=new RegExp(/\\\\\((.+?)\\\\\)/,"g"),blockLatexRegex=new RegExp(/(?:\\begin{equation}|\\\\\(|\\\\\[)([\s\S]*?)(?:\\\\\]|\\\\\)|\\end{equation})/,"g"),quartzLatexRegex=new RegExp(/\$\$[\s\S]*?\$\$|\$.*?\$/,"g");import rehypePrettyCode from"rehype-pretty-code";var SyntaxHighlighting=__name(()=>({name:"SyntaxHighlighting",htmlPlugins(){return[[rehypePrettyCode,{theme:"css-variables"}]]}}),"SyntaxHighlighting");import{visit as visit3}from"unist-util-visit";import{toString as toString2}from"mdast-util-to-string";import Slugger from"github-slugger";var defaultOptions7={maxDepth:3,minEntries:1,showByDefault:!0,collapseByDefault:!1},TableOfContents=__name(userOpts=>{let opts={...defaultOptions7,...userOpts};return{name:"TableOfContents",markdownPlugins(){return[()=>async(tree,file)=>{if(file.data.frontmatter?.enableToc??opts.showByDefault){let slugAnchor3=new Slugger,toc=[],highestDepth=opts.maxDepth;visit3(tree,"heading",node=>{if(node.depth<=opts.maxDepth){let text=toString2(node);highestDepth=Math.min(highestDepth,node.depth),toc.push({depth:node.depth,text,slug:slugAnchor3.slug(text)})}}),toc.length>opts.minEntries&&(file.data.toc=toc.map(entry=>({...entry,depth:entry.depth-highestDepth})),file.data.collapseToc=opts.collapseByDefault)}}]}}},"TableOfContents");import remarkBreaks from"remark-breaks";var RemoveDrafts=__name(()=>({name:"RemoveDrafts",shouldPublish(_ctx,[_tree,vfile]){return!(vfile.data?.frontmatter?.draft??!1)}}),"RemoveDrafts");import{jsx}from"preact/jsx-runtime";function Header({children}){return children.length>0?jsx("header",{children}):null}__name(Header,"Header");Header.css=` +header { + display: flex; + flex-direction: row; + align-items: center; + margin: 2rem 0; + gap: 1.5rem; +} + +header h1 { + margin: 0; + flex: auto; +} +`;var Header_default=__name(()=>Header,"default");var clipboard_inline_default=`// quartz/components/scripts/quartz/components/scripts/clipboard.inline.ts +var svgCopy = ''; +var svgCheck = ''; +document.addEventListener("nav", () => { + const els = document.getElementsByTagName("pre"); + for (let i = 0; i < els.length; i++) { + const codeBlock = els[i].getElementsByTagName("code")[0]; + if (codeBlock) { + const source = codeBlock.innerText.replace(/\\n\\n/g, "\\n"); + const button = document.createElement("button"); + button.className = "clipboard-button"; + button.type = "button"; + button.innerHTML = svgCopy; + button.ariaLabel = "Copy source"; + button.addEventListener("click", () => { + navigator.clipboard.writeText(source).then( + () => { + button.blur(); + button.innerHTML = svgCheck; + setTimeout(() => { + button.innerHTML = svgCopy; + button.style.borderColor = ""; + }, 2e3); + }, + (error) => console.error(error) + ); + }); + els[i].prepend(button); + } + } +}); +`;var clipboard_default=` +.clipboard-button { + position: absolute; + display: flex; + float: right; + right: 0; + padding: 0.4rem; + margin: -0.2rem 0.3rem; + color: var(--gray); + border-color: var(--dark); + background-color: var(--light); + border: 1px solid; + border-radius: 5px; + opacity: 0; + transition: 0.2s; +} +.clipboard-button > svg { + fill: var(--light); + filter: contrast(0.3); +} +.clipboard-button:hover { + cursor: pointer; + border-color: var(--secondary); +} +.clipboard-button:focus { + outline: 0; +} + +pre:hover > .clipboard-button { + opacity: 1; + transition: 0.2s; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiY2xpcGJvYXJkLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7OztBQUtGO0VBQ0U7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi5jbGlwYm9hcmQtYnV0dG9uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbG9hdDogcmlnaHQ7XG4gIHJpZ2h0OiAwO1xuICBwYWRkaW5nOiAwLjRyZW07XG4gIG1hcmdpbjogLTAuMnJlbSAwLjNyZW07XG4gIGNvbG9yOiB2YXIoLS1ncmF5KTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1kYXJrKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQpO1xuICBib3JkZXI6IDFweCBzb2xpZDtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBvcGFjaXR5OiAwO1xuICB0cmFuc2l0aW9uOiAwLjJzO1xuXG4gICYgPiBzdmcge1xuICAgIGZpbGw6IHZhcigtLWxpZ2h0KTtcbiAgICBmaWx0ZXI6IGNvbnRyYXN0KDAuMyk7XG4gIH1cblxuICAmOmhvdmVyIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuICB9XG5cbiAgJjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxufVxuXG5wcmUge1xuICAmOmhvdmVyID4gLmNsaXBib2FyZC1idXR0b24ge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgdHJhbnNpdGlvbjogMC4ycztcbiAgfVxufVxuIl19 */`;import{jsx as jsx2}from"preact/jsx-runtime";function Body({children}){return jsx2("div",{id:"quartz-body",children})}__name(Body,"Body");Body.afterDOMLoaded=clipboard_inline_default;Body.css=clipboard_default;var Body_default=__name(()=>Body,"default");import{render}from"preact-render-to-string";import{randomUUID}from"crypto";import{jsx as jsx3}from"preact/jsx-runtime";function JSResourceToScriptElement(resource,preserve){let scriptType=resource.moduleType??"application/javascript",spaPreserve=preserve??resource.spaPreserve;if(resource.contentType==="external")return jsx3("script",{src:resource.src,type:scriptType,"spa-preserve":spaPreserve},resource.src);{let content=resource.script;return jsx3("script",{type:scriptType,"spa-preserve":spaPreserve,children:content},randomUUID())}}__name(JSResourceToScriptElement,"JSResourceToScriptElement");import{visit as visit4}from"unist-util-visit";import{jsx as jsx4,jsxs}from"preact/jsx-runtime";function pageResources(baseDir,staticResources){let contentIndexScript=`const fetchData = fetch(\`${joinSegments(baseDir,"static/contentIndex.json")}\`).then(data => data.json())`;return{css:[joinSegments(baseDir,"index.css"),...staticResources.css],js:[{src:joinSegments(baseDir,"prescript.js"),loadTime:"beforeDOMReady",contentType:"external"},{loadTime:"beforeDOMReady",contentType:"inline",spaPreserve:!0,script:contentIndexScript},...staticResources.js,{src:joinSegments(baseDir,"postscript.js"),loadTime:"afterDOMReady",moduleType:"module",contentType:"external"}]}}__name(pageResources,"pageResources");function renderPage(slug2,componentData,components,pageResources2){visit4(componentData.tree,"element",(node,_index,_parent)=>{if(node.tagName==="blockquote"&&(node.properties?.className??[]).includes("transclude")){let inner=node.children[0],blockSlug=inner.properties?.["data-slug"],blockRef=node.properties.dataBlock,blockNode=componentData.allFiles.find(f=>f.slug===blockSlug)?.blocks?.[blockRef];blockNode&&(blockNode.tagName==="li"&&(blockNode={type:"element",tagName:"ul",children:[blockNode]}),node.children=[blockNode,{type:"element",tagName:"a",properties:{href:inner.properties?.href,class:["internal"]},children:[{type:"text",value:"Link to original"}]}])}});let{head:Head,header,beforeBody,pageBody:Content2,left,right,footer:Footer}=components,Header2=Header_default(),Body2=Body_default(),LeftComponent=jsx4("div",{class:"left sidebar",children:left.map(BodyComponent=>jsx4(BodyComponent,{...componentData}))}),RightComponent=jsx4("div",{class:"right sidebar",children:right.map(BodyComponent=>jsx4(BodyComponent,{...componentData}))}),doc=jsxs("html",{children:[jsx4(Head,{...componentData}),jsx4("body",{"data-slug":slug2,children:jsxs("div",{id:"quartz-root",class:"page",children:[jsxs(Body2,{...componentData,children:[LeftComponent,jsxs("div",{class:"center",children:[jsxs("div",{class:"page-header",children:[jsx4(Header2,{...componentData,children:header.map(HeaderComponent=>jsx4(HeaderComponent,{...componentData}))}),jsx4("div",{class:"popover-hint",children:beforeBody.map(BodyComponent=>jsx4(BodyComponent,{...componentData}))})]}),jsx4(Content2,{...componentData})]}),RightComponent]}),jsx4(Footer,{...componentData})]})}),pageResources2.js.filter(resource=>resource.loadTime==="afterDOMReady").map(res=>JSResourceToScriptElement(res))]});return` +`+render(doc)}__name(renderPage,"renderPage");import{toJsxRuntime}from"hast-util-to-jsx-runtime";import{Fragment,jsx as jsx5,jsxs as jsxs2}from"preact/jsx-runtime";function htmlToJsx(fp,tree){try{return toJsxRuntime(tree,{Fragment,jsx:jsx5,jsxs:jsxs2,elementAttributeNameCase:"html"})}catch(e){trace(`Failed to parse Markdown in \`${fp}\` into JSX`,e)}}__name(htmlToJsx,"htmlToJsx");import{jsx as jsx6}from"preact/jsx-runtime";function Content({fileData,tree}){let content=htmlToJsx(fileData.filePath,tree);return jsx6("article",{class:"popover-hint",children:content})}__name(Content,"Content");var Content_default=__name(()=>Content,"default");var listPage_default=` +ul.section-ul { + list-style: none; + margin-top: 2em; + padding-left: 0; +} + +li.section-li { + margin-bottom: 1em; +} +li.section-li > .section { + display: grid; + grid-template-columns: 6em 3fr 1fr; +} +@media all and (max-width: 600px) { + li.section-li > .section > .tags { + display: none; + } +} +li.section-li > .section > .desc > h3 > a { + background-color: transparent; +} +li.section-li > .section > .meta { + margin: 0; + flex-basis: 6em; + opacity: 0.6; +} + +.popover .section { + grid-template-columns: 6em 1fr !important; +} +.popover .section > .tags { + display: none; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsibGlzdFBhZ2Uuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7QUFFQTtFQUNFO0VBQ0E7O0FBRUE7RUFDRTtJQUNFOzs7QUFJSjtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFNTjtFQUNFOztBQUNBO0VBQ0UiLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlIFwiLi4vLi4vc3R5bGVzL3ZhcmlhYmxlcy5zY3NzXCIgYXMgKjtcblxudWwuc2VjdGlvbi11bCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIG1hcmdpbi10b3A6IDJlbTtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuXG5saS5zZWN0aW9uLWxpIHtcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xuXG4gICYgPiAuc2VjdGlvbiB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDZlbSAzZnIgMWZyO1xuXG4gICAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJG1vYmlsZUJyZWFrcG9pbnQpIHtcbiAgICAgICYgPiAudGFncyB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJiA+IC5kZXNjID4gaDMgPiBhIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIH1cblxuICAgICYgPiAubWV0YSB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBmbGV4LWJhc2lzOiA2ZW07XG4gICAgICBvcGFjaXR5OiAwLjY7XG4gICAgfVxuICB9XG59XG5cbi8vIG1vZGlmaWNhdGlvbnMgaW4gcG9wb3ZlciBjb250ZXh0XG4ucG9wb3ZlciAuc2VjdGlvbiB7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNmVtIDFmciAhaW1wb3J0YW50O1xuICAmID4gLnRhZ3Mge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cbiJdfQ== */`;import{Fragment as Fragment2,jsx as jsx7}from"preact/jsx-runtime";function getDate(cfg,data){if(!cfg.defaultDateType)throw new Error("Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.");return data.dates?.[cfg.defaultDateType]}__name(getDate,"getDate");function formatDate(d){return d.toLocaleDateString("en-US",{year:"numeric",month:"short",day:"2-digit"})}__name(formatDate,"formatDate");function Date2({date}){return jsx7(Fragment2,{children:formatDate(date)})}__name(Date2,"Date");import{jsx as jsx8,jsxs as jsxs3}from"preact/jsx-runtime";function byDateAndAlphabetical(cfg){return(f1,f2)=>{if(f1.dates&&f2.dates)return getDate(cfg,f2).getTime()-getDate(cfg,f1).getTime();if(f1.dates&&!f2.dates)return-1;if(!f1.dates&&f2.dates)return 1;let f1Title=f1.frontmatter?.title.toLowerCase()??"",f2Title=f2.frontmatter?.title.toLowerCase()??"";return f1Title.localeCompare(f2Title)}}__name(byDateAndAlphabetical,"byDateAndAlphabetical");function PageList({cfg,fileData,allFiles,limit}){let list=allFiles.sort(byDateAndAlphabetical(cfg));return limit&&(list=list.slice(0,limit)),jsx8("ul",{class:"section-ul",children:list.map(page=>{let title=page.frontmatter?.title,tags=page.frontmatter?.tags??[];return jsx8("li",{class:"section-li",children:jsxs3("div",{class:"section",children:[page.dates&&jsx8("p",{class:"meta",children:jsx8(Date2,{date:getDate(cfg,page)})}),jsx8("div",{class:"desc",children:jsx8("h3",{children:jsx8("a",{href:resolveRelative(fileData.slug,page.slug),class:"internal",children:title})})}),jsx8("ul",{class:"tags",children:tags.map(tag=>jsx8("li",{children:jsxs3("a",{class:"internal tag-link",href:resolveRelative(fileData.slug,`tags/${tag}`),children:["#",tag]})}))})]})})})})}__name(PageList,"PageList");PageList.css=` +.section h3 { + margin: 0; +} + +.section > .tags { + margin: 0; +} +`;import{jsx as jsx9,jsxs as jsxs4}from"preact/jsx-runtime";var numPages=10;function TagContent(props){let{tree,fileData,allFiles}=props,slug2=fileData.slug;if(!(slug2?.startsWith("tags/")||slug2==="tags"))throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug2}`);let tag=simplifySlug(slug2.slice(5)),allPagesWithTag=__name(tag2=>allFiles.filter(file=>(file.frontmatter?.tags??[]).flatMap(getAllSegmentPrefixes).includes(tag2)),"allPagesWithTag"),content=tree.children.length===0?fileData.description:htmlToJsx(fileData.filePath,tree);if(tag===""){let tags=[...new Set(allFiles.flatMap(data=>data.frontmatter?.tags??[]))],tagItemMap=new Map;for(let tag2 of tags)tagItemMap.set(tag2,allPagesWithTag(tag2));return jsxs4("div",{class:"popover-hint",children:[jsx9("article",{children:jsx9("p",{children:content})}),jsxs4("p",{children:["Found ",tags.length," total tags."]}),jsx9("div",{children:tags.map(tag2=>{let pages=tagItemMap.get(tag2),listProps={...props,allFiles:pages},content2=allFiles.filter(file=>file.slug===`tags/${tag2}`)[0]?.description;return jsxs4("div",{children:[jsx9("h2",{children:jsxs4("a",{class:"internal tag-link",href:`./${tag2}`,children:["#",tag2]})}),content2&&jsx9("p",{children:content2}),jsxs4("p",{children:[pluralize(pages.length,"item")," with this tag."," ",pages.length>numPages&&`Showing first ${numPages}.`]}),jsx9(PageList,{limit:numPages,...listProps})]})})})]})}else{let pages=allPagesWithTag(tag),listProps={...props,allFiles:pages};return jsxs4("div",{class:"popover-hint",children:[jsx9("article",{children:content}),jsxs4("p",{children:[pluralize(pages.length,"item")," with this tag."]}),jsx9("div",{children:jsx9(PageList,{...listProps})})]})}}__name(TagContent,"TagContent");TagContent.css=listPage_default+PageList.css;var TagContent_default=__name(()=>TagContent,"default");import path5 from"path";import{jsx as jsx10,jsxs as jsxs5}from"preact/jsx-runtime";function FolderContent(props){let{tree,fileData,allFiles}=props,folderSlug=_stripSlashes(simplifySlug(fileData.slug)),allPagesInFolder=allFiles.filter(file=>{let fileSlug=_stripSlashes(simplifySlug(file.slug)),prefixed=fileSlug.startsWith(folderSlug)&&fileSlug!==folderSlug,folderParts=folderSlug.split(path5.posix.sep),isDirectChild=fileSlug.split(path5.posix.sep).length===folderParts.length+1;return prefixed&&isDirectChild}),listProps={...props,allFiles:allPagesInFolder},content=tree.children.length===0?fileData.description:htmlToJsx(fileData.filePath,tree);return jsxs5("div",{class:"popover-hint",children:[jsx10("article",{children:jsx10("p",{children:content})}),jsxs5("p",{children:[pluralize(allPagesInFolder.length,"item")," under this folder."]}),jsx10("div",{children:jsx10(PageList,{...listProps})})]})}__name(FolderContent,"FolderContent");FolderContent.css=listPage_default+PageList.css;var FolderContent_default=__name(()=>FolderContent,"default");import{jsx as jsx11,jsxs as jsxs6}from"preact/jsx-runtime";function NotFound(){return jsxs6("article",{class:"popover-hint",children:[jsx11("h1",{children:"404"}),jsx11("p",{children:"Either this page is private or doesn't exist."})]})}__name(NotFound,"NotFound");var __default=__name(()=>NotFound,"default");import{jsx as jsx12}from"preact/jsx-runtime";function ArticleTitle({fileData,displayClass}){let title=fileData.frontmatter?.title;return title?jsx12("h1",{class:`article-title ${displayClass??""}`,children:title}):null}__name(ArticleTitle,"ArticleTitle");ArticleTitle.css=` +.article-title { + margin: 2rem 0 0 0; +} +`;var ArticleTitle_default=__name(()=>ArticleTitle,"default");var darkmode_inline_default=`// quartz/components/scripts/quartz/components/scripts/darkmode.inline.ts +var userPref = window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark"; +var currentTheme = localStorage.getItem("theme") ?? userPref; +document.documentElement.setAttribute("saved-theme", currentTheme); +document.addEventListener("nav", () => { + const switchTheme = (e) => { + if (e.target.checked) { + document.documentElement.setAttribute("saved-theme", "dark"); + localStorage.setItem("theme", "dark"); + } else { + document.documentElement.setAttribute("saved-theme", "light"); + localStorage.setItem("theme", "light"); + } + }; + const toggleSwitch = document.querySelector("#darkmode-toggle"); + toggleSwitch.removeEventListener("change", switchTheme); + toggleSwitch.addEventListener("change", switchTheme); + if (currentTheme === "dark") { + toggleSwitch.checked = true; + } + const colorSchemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + colorSchemeMediaQuery.addEventListener("change", (e) => { + const newTheme = e.matches ? "dark" : "light"; + document.documentElement.setAttribute("saved-theme", newTheme); + localStorage.setItem("theme", newTheme); + toggleSwitch.checked = e.matches; + }); +}); +`;var darkmode_default=` +.darkmode { + position: relative; + width: 20px; + height: 20px; + margin: 0 10px; +} +.darkmode > .toggle { + display: none; + box-sizing: border-box; +} +.darkmode svg { + cursor: pointer; + opacity: 0; + position: absolute; + width: 20px; + height: 20px; + top: calc(50% - 10px); + fill: var(--darkgray); + transition: opacity 0.1s ease; +} + +:root[saved-theme=dark] { + color-scheme: dark; +} + +:root[saved-theme=light] { + color-scheme: light; +} + +:root[saved-theme=dark] .toggle ~ label > #dayIcon { + opacity: 0; +} +:root[saved-theme=dark] .toggle ~ label > #nightIcon { + opacity: 1; +} + +:root .toggle ~ label > #dayIcon { + opacity: 1; +} +:root .toggle ~ label > #nightIcon { + opacity: 0; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiZGFya21vZGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7OztBQUdGO0VBQ0U7OztBQUlBO0VBQ0U7O0FBRUY7RUFDRTs7O0FBS0Y7RUFDRTs7QUFFRjtFQUNFIiwic291cmNlc0NvbnRlbnQiOlsiLmRhcmttb2RlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBtYXJnaW46IDAgMTBweDtcblxuICAmID4gLnRvZ2dsZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG5cbiAgJiBzdmcge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgdG9wOiBjYWxjKDUwJSAtIDEwcHgpO1xuICAgIGZpbGw6IHZhcigtLWRhcmtncmF5KTtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgZWFzZTtcbiAgfVxufVxuXG46cm9vdFtzYXZlZC10aGVtZT1cImRhcmtcIl0ge1xuICBjb2xvci1zY2hlbWU6IGRhcms7XG59XG5cbjpyb290W3NhdmVkLXRoZW1lPVwibGlnaHRcIl0ge1xuICBjb2xvci1zY2hlbWU6IGxpZ2h0O1xufVxuXG46cm9vdFtzYXZlZC10aGVtZT1cImRhcmtcIl0gLnRvZ2dsZSB+IGxhYmVsIHtcbiAgJiA+ICNkYXlJY29uIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG4gICYgPiAjbmlnaHRJY29uIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbjpyb290IC50b2dnbGUgfiBsYWJlbCB7XG4gICYgPiAjZGF5SWNvbiB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuICAmID4gI25pZ2h0SWNvbiB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxufVxuIl19 */`;import{jsx as jsx13,jsxs as jsxs7}from"preact/jsx-runtime";function Darkmode({displayClass}){return jsxs7("div",{class:`darkmode ${displayClass??""}`,children:[jsx13("input",{class:"toggle",id:"darkmode-toggle",type:"checkbox",tabIndex:-1}),jsx13("label",{id:"toggle-label-light",for:"darkmode-toggle",tabIndex:-1,children:jsxs7("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",version:"1.1",id:"dayIcon",x:"0px",y:"0px",viewBox:"0 0 35 35",style:"enable-background:new 0 0 35 35;",xmlSpace:"preserve",children:[jsx13("title",{children:"Light mode"}),jsx13("path",{d:"M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"})]})}),jsx13("label",{id:"toggle-label-dark",for:"darkmode-toggle",tabIndex:-1,children:jsxs7("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",version:"1.1",id:"nightIcon",x:"0px",y:"0px",viewBox:"0 0 100 100",style:"enable-background='new 0 0 100 100'",xmlSpace:"preserve",children:[jsx13("title",{children:"Dark mode"}),jsx13("path",{d:"M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.008-14.65,35.369 c0,13.36,5.203,25.921,14.65,35.368s22.008,14.65,35.368,14.65c13.361,0,25.921-5.203,35.369-14.65 c3.872-3.871,7.064-8.328,9.491-13.246C97.826,68.608,97.611,67.309,96.76,66.458z"})]})})]})}__name(Darkmode,"Darkmode");Darkmode.beforeDOMLoaded=darkmode_inline_default;Darkmode.css=darkmode_default;var Darkmode_default=__name(()=>Darkmode,"default");import{jsx as jsx14,jsxs as jsxs8}from"preact/jsx-runtime";var Head_default=__name(()=>{function Head({cfg,fileData,externalResources}){let title=fileData.frontmatter?.title??"Untitled",description=fileData.description?.trim()??"No description provided",{css,js}=externalResources,path13=new URL(`https://${cfg.baseUrl??"example.com"}`).pathname,baseDir=fileData.slug==="404"?path13:pathToRoot(fileData.slug),iconPath=joinSegments(baseDir,"static/icon.png"),ogImagePath=`https://${cfg.baseUrl}/static/og-image.png`;return jsxs8("head",{children:[jsx14("title",{children:title}),jsx14("meta",{charSet:"utf-8"}),jsx14("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),jsx14("meta",{property:"og:title",content:title}),jsx14("meta",{property:"og:description",content:description}),cfg.baseUrl&&jsx14("meta",{property:"og:image",content:ogImagePath}),jsx14("meta",{property:"og:width",content:"1200"}),jsx14("meta",{property:"og:height",content:"675"}),jsx14("link",{rel:"icon",href:iconPath}),jsx14("meta",{name:"description",content:description}),jsx14("meta",{name:"generator",content:"Quartz"}),jsx14("link",{rel:"preconnect",href:"https://fonts.googleapis.com"}),jsx14("link",{rel:"preconnect",href:"https://fonts.gstatic.com"}),css.map(href=>jsx14("link",{href,rel:"stylesheet",type:"text/css","spa-preserve":!0},href)),js.filter(resource=>resource.loadTime==="beforeDOMReady").map(res=>JSResourceToScriptElement(res,!0))]})}return __name(Head,"Head"),Head},"default");import{jsx as jsx15}from"preact/jsx-runtime";function PageTitle({fileData,cfg,displayClass}){let title=cfg?.pageTitle??"Untitled Quartz",baseDir=pathToRoot(fileData.slug);return jsx15("h1",{class:`page-title ${displayClass??""}`,children:jsx15("a",{href:baseDir,children:title})})}__name(PageTitle,"PageTitle");PageTitle.css=` +.page-title { + margin: 0; +} +`;var PageTitle_default=__name(()=>PageTitle,"default");import readingTime from"reading-time";import{jsx as jsx16}from"preact/jsx-runtime";var ContentMeta_default=__name(()=>{function ContentMetadata({cfg,fileData,displayClass}){let text=fileData.text;if(text){let segments=[],{text:timeTaken,words:_words}=readingTime(text);return fileData.dates&&segments.push(formatDate(getDate(cfg,fileData))),segments.push(timeTaken),jsx16("p",{class:`content-meta ${displayClass??""}`,children:segments.join(", ")})}else return null}return __name(ContentMetadata,"ContentMetadata"),ContentMetadata.css=` + .content-meta { + margin-top: 0; + color: var(--gray); + } + `,ContentMetadata},"default");import{jsx as jsx17}from"preact/jsx-runtime";function Spacer({displayClass}){return jsx17("div",{class:`spacer ${displayClass??""}`})}__name(Spacer,"Spacer");var Spacer_default=__name(()=>Spacer,"default");var legacyToc_default=` +details#toc summary { + cursor: pointer; +} +details#toc summary::marker { + color: var(--dark); +} +details#toc summary > * { + padding-left: 0.25rem; + display: inline-block; + margin: 0; +} +details#toc ul { + list-style: none; + margin: 0.5rem 1.25rem; + padding: 0; +} +details#toc .depth-1 { + padding-left: calc(1rem * 1); +} +details#toc .depth-2 { + padding-left: calc(1rem * 2); +} +details#toc .depth-3 { + padding-left: calc(1rem * 3); +} +details#toc .depth-4 { + padding-left: calc(1rem * 4); +} +details#toc .depth-5 { + padding-left: calc(1rem * 5); +} +details#toc .depth-6 { + padding-left: calc(1rem * 6); +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsibGVnYWN5VG9jLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0U7RUFDRTs7QUFFQTtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUlKO0VBQ0U7RUFDQTtFQUNBOztBQUlBO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFIiwic291cmNlc0NvbnRlbnQiOlsiZGV0YWlscyN0b2Mge1xuICAmIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgICY6Om1hcmtlciB7XG4gICAgICBjb2xvcjogdmFyKC0tZGFyayk7XG4gICAgfVxuXG4gICAgJiA+ICoge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwLjI1cmVtO1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgfVxuXG4gICYgdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwLjVyZW0gMS4yNXJlbTtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG5cbiAgQGZvciAkaSBmcm9tIDEgdGhyb3VnaCA2IHtcbiAgICAmIC5kZXB0aC0jeyRpfSB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IGNhbGMoMXJlbSAqICN7JGl9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== */`;var toc_default=` +button#toc { + background-color: transparent; + border: none; + text-align: left; + cursor: pointer; + padding: 0; + color: var(--dark); + display: flex; + align-items: center; +} +button#toc h3 { + font-size: 1rem; + display: inline-block; + margin: 0; +} +button#toc .fold { + margin-left: 0.5rem; + transition: transform 0.3s ease; + opacity: 0.8; +} +button#toc.collapsed .fold { + transform: rotateZ(-90deg); +} + +#toc-content { + list-style: none; + overflow: hidden; + max-height: none; + transition: max-height 0.5s ease; +} +#toc-content.collapsed > .overflow::after { + opacity: 0; +} +#toc-content ul { + list-style: none; + margin: 0.5rem 0; + padding: 0; +} +#toc-content ul > li > a { + color: var(--dark); + opacity: 0.35; + transition: 0.5s ease opacity, 0.3s ease color; +} +#toc-content ul > li > a.in-view { + opacity: 0.75; +} +#toc-content .depth-0 { + padding-left: calc(1rem * 0); +} +#toc-content .depth-1 { + padding-left: calc(1rem * 1); +} +#toc-content .depth-2 { + padding-left: calc(1rem * 2); +} +#toc-content .depth-3 { + padding-left: calc(1rem * 3); +} +#toc-content .depth-4 { + padding-left: calc(1rem * 4); +} +#toc-content .depth-5 { + padding-left: calc(1rem * 5); +} +#toc-content .depth-6 { + padding-left: calc(1rem * 6); +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsidG9jLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7QUFDQTtFQUNFO0VBQ0E7RUFDQSxZQUNFOztBQUVGO0VBQ0U7O0FBTUo7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRTs7QUFERjtFQUNFOztBQURGO0VBQ0U7O0FBREY7RUFDRSIsInNvdXJjZXNDb250ZW50IjpbImJ1dHRvbiN0b2Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiBub25lO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDA7XG4gIGNvbG9yOiB2YXIoLS1kYXJrKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAmIGgzIHtcbiAgICBmb250LXNpemU6IDFyZW07XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbjogMDtcbiAgfVxuXG4gICYgLmZvbGQge1xuICAgIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZTtcbiAgICBvcGFjaXR5OiAwLjg7XG4gIH1cblxuICAmLmNvbGxhcHNlZCAuZm9sZCB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGVaKC05MGRlZyk7XG4gIH1cbn1cblxuI3RvYy1jb250ZW50IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgbWF4LWhlaWdodDogbm9uZTtcbiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2U7XG5cbiAgJi5jb2xsYXBzZWQgPiAub3ZlcmZsb3c6OmFmdGVyIHtcbiAgICBvcGFjaXR5OiAwO1xuICB9XG5cbiAgJiB1bCB7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICBtYXJnaW46IDAuNXJlbSAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgJiA+IGxpID4gYSB7XG4gICAgICBjb2xvcjogdmFyKC0tZGFyayk7XG4gICAgICBvcGFjaXR5OiAwLjM1O1xuICAgICAgdHJhbnNpdGlvbjpcbiAgICAgICAgMC41cyBlYXNlIG9wYWNpdHksXG4gICAgICAgIDAuM3MgZWFzZSBjb2xvcjtcbiAgICAgICYuaW4tdmlldyB7XG4gICAgICAgIG9wYWNpdHk6IDAuNzU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGZvciAkaSBmcm9tIDAgdGhyb3VnaCA2IHtcbiAgICAmIC5kZXB0aC0jeyRpfSB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IGNhbGMoMXJlbSAqICN7JGl9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== */`;var toc_inline_default=`// quartz/components/scripts/quartz/components/scripts/toc.inline.ts +var observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const slug = entry.target.id; + const tocEntryElement = document.querySelector(\`a[data-for="\${slug}"]\`); + const windowHeight = entry.rootBounds?.height; + if (windowHeight && tocEntryElement) { + if (entry.boundingClientRect.y < windowHeight) { + tocEntryElement.classList.add("in-view"); + } else { + tocEntryElement.classList.remove("in-view"); + } + } + } +}); +function toggleToc() { + this.classList.toggle("collapsed"); + const content = this.nextElementSibling; + content.classList.toggle("collapsed"); + content.style.maxHeight = content.style.maxHeight === "0px" ? content.scrollHeight + "px" : "0px"; +} +function setupToc() { + const toc = document.getElementById("toc"); + if (toc) { + const collapsed = toc.classList.contains("collapsed"); + const content = toc.nextElementSibling; + content.style.maxHeight = collapsed ? "0px" : content.scrollHeight + "px"; + toc.removeEventListener("click", toggleToc); + toc.addEventListener("click", toggleToc); + } +} +window.addEventListener("resize", setupToc); +document.addEventListener("nav", () => { + setupToc(); + observer.disconnect(); + const headers = document.querySelectorAll("h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]"); + headers.forEach((header) => observer.observe(header)); +}); +`;import{jsx as jsx18,jsxs as jsxs9}from"preact/jsx-runtime";var defaultOptions8={layout:"modern"};function TableOfContents2({fileData,displayClass}){return fileData.toc?jsxs9("div",{class:`toc ${displayClass??""}`,children:[jsxs9("button",{type:"button",id:"toc",class:fileData.collapseToc?"collapsed":"",children:[jsx18("h3",{children:"Table of Contents"}),jsx18("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"fold",children:jsx18("polyline",{points:"6 9 12 15 18 9"})})]}),jsx18("div",{id:"toc-content",children:jsx18("ul",{class:"overflow",children:fileData.toc.map(tocEntry=>jsx18("li",{class:`depth-${tocEntry.depth}`,children:jsx18("a",{href:`#${tocEntry.slug}`,"data-for":tocEntry.slug,children:tocEntry.text})},tocEntry.slug))})})]}):null}__name(TableOfContents2,"TableOfContents");TableOfContents2.css=toc_default;TableOfContents2.afterDOMLoaded=toc_inline_default;function LegacyTableOfContents({fileData}){return fileData.toc?jsxs9("details",{id:"toc",open:!fileData.collapseToc,children:[jsx18("summary",{children:jsx18("h3",{children:"Table of Contents"})}),jsx18("ul",{children:fileData.toc.map(tocEntry=>jsx18("li",{class:`depth-${tocEntry.depth}`,children:jsx18("a",{href:`#${tocEntry.slug}`,"data-for":tocEntry.slug,children:tocEntry.text})},tocEntry.slug))})]}):null}__name(LegacyTableOfContents,"LegacyTableOfContents");LegacyTableOfContents.css=legacyToc_default;var TableOfContents_default=__name(opts=>(opts?.layout??defaultOptions8.layout)==="modern"?TableOfContents2:LegacyTableOfContents,"default");var explorer_default=` +button#explorer { + all: unset; + background-color: transparent; + border: none; + text-align: left; + cursor: pointer; + padding: 0; + color: var(--dark); + display: flex; + align-items: center; +} +button#explorer h1 { + font-size: 1rem; + display: inline-block; + margin: 0; +} +button#explorer .fold { + margin-left: 0.5rem; + transition: transform 0.3s ease; + opacity: 0.8; +} +button#explorer.collapsed .fold { + transform: rotateZ(-90deg); +} + +.folder-outer { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 0.3s ease-in-out; +} + +.folder-outer.open { + grid-template-rows: 1fr; +} + +.folder-outer > ul { + overflow: hidden; +} + +#explorer-content { + list-style: none; + overflow: hidden; + max-height: none; + transition: max-height 0.35s ease; + margin-top: 0.5rem; +} +#explorer-content.collapsed > .overflow::after { + opacity: 0; +} +#explorer-content ul { + list-style: none; + margin: 0.08rem 0; + padding: 0; + transition: max-height 0.35s ease, transform 0.35s ease, opacity 0.2s ease; +} +#explorer-content ul li > a { + color: var(--dark); + opacity: 0.75; + pointer-events: all; +} + +svg { + pointer-events: all; +} +svg > polyline { + pointer-events: none; +} + +.folder-container { + flex-direction: row; + display: flex; + align-items: center; + user-select: none; +} +.folder-container div > a { + color: var(--secondary); + font-family: var(--headerFont); + font-size: 0.95rem; + font-weight: 600; + line-height: 1.5rem; + display: inline-block; +} +.folder-container div > a:hover { + color: var(--tertiary); +} +.folder-container div > button { + color: var(--dark); + background-color: transparent; + border: none; + text-align: left; + cursor: pointer; + padding-left: 0; + padding-right: 0; + display: flex; + align-items: center; + font-family: var(--headerFont); +} +.folder-container div > button p { + font-size: 0.95rem; + display: inline-block; + color: var(--secondary); + font-weight: 600; + margin: 0; + line-height: 1.5rem; + pointer-events: none; +} + +.folder-icon { + margin-right: 5px; + color: var(--secondary); + cursor: pointer; + transition: transform 0.3s ease; + backface-visibility: visible; +} + +div:has(> .folder-outer:not(.open)) > .folder-container > svg { + transform: rotate(-90deg); +} + +.folder-icon:hover { + color: var(--tertiary); +} + +.no-background::after { + background: none !important; +} + +#explorer-end { + height: 4px; + margin: 0; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiZXhwbG9yZXIuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7QUFHRjtFQUNFOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQSxZQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFLTjtFQUNFOztBQUVBO0VBQ0U7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFFRTtFQUVBIiwic291cmNlc0NvbnRlbnQiOlsiYnV0dG9uI2V4cGxvcmVyIHtcbiAgYWxsOiB1bnNldDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAwO1xuICBjb2xvcjogdmFyKC0tZGFyayk7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgJiBoMSB7XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICAmIC5mb2xkIHtcbiAgICBtYXJnaW4tbGVmdDogMC41cmVtO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7XG4gICAgb3BhY2l0eTogMC44O1xuICB9XG5cbiAgJi5jb2xsYXBzZWQgLmZvbGQge1xuICAgIHRyYW5zZm9ybTogcm90YXRlWigtOTBkZWcpO1xuICB9XG59XG5cbi5mb2xkZXItb3V0ZXIge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLXJvd3M6IDBmcjtcbiAgdHJhbnNpdGlvbjogZ3JpZC10ZW1wbGF0ZS1yb3dzIDAuM3MgZWFzZS1pbi1vdXQ7XG59XG5cbi5mb2xkZXItb3V0ZXIub3BlbiB7XG4gIGdyaWQtdGVtcGxhdGUtcm93czogMWZyO1xufVxuXG4uZm9sZGVyLW91dGVyID4gdWwge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4jZXhwbG9yZXItY29udGVudCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIG1heC1oZWlnaHQ6IG5vbmU7XG4gIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4zNXMgZWFzZTtcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xuXG4gICYuY29sbGFwc2VkID4gLm92ZXJmbG93OjphZnRlciB7XG4gICAgb3BhY2l0eTogMDtcbiAgfVxuXG4gICYgdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwLjA4cmVtIDA7XG4gICAgcGFkZGluZzogMDtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgbWF4LWhlaWdodCAwLjM1cyBlYXNlLFxuICAgICAgdHJhbnNmb3JtIDAuMzVzIGVhc2UsXG4gICAgICBvcGFjaXR5IDAuMnMgZWFzZTtcbiAgICAmIGxpID4gYSB7XG4gICAgICBjb2xvcjogdmFyKC0tZGFyayk7XG4gICAgICBvcGFjaXR5OiAwLjc1O1xuICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICB9XG4gIH1cbn1cblxuc3ZnIHtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcblxuICAmID4gcG9seWxpbmUge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG59XG5cbi5mb2xkZXItY29udGFpbmVyIHtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgJiBkaXYgPiBhIHtcbiAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5KTtcbiAgICBmb250LWZhbWlseTogdmFyKC0taGVhZGVyRm9udCk7XG4gICAgZm9udC1zaXplOiAwLjk1cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgbGluZS1oZWlnaHQ6IDEuNXJlbTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cblxuICAmIGRpdiA+IGE6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS10ZXJ0aWFyeSk7XG4gIH1cblxuICAmIGRpdiA+IGJ1dHRvbiB7XG4gICAgY29sb3I6IHZhcigtLWRhcmspO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1yaWdodDogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWhlYWRlckZvbnQpO1xuXG4gICAgJiBwIHtcbiAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjVyZW07XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG4gIH1cbn1cblxuLmZvbGRlci1pY29uIHtcbiAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7XG4gIGJhY2tmYWNlLXZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbmRpdjpoYXMoPiAuZm9sZGVyLW91dGVyOm5vdCgub3BlbikpID4gLmZvbGRlci1jb250YWluZXIgPiBzdmcge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xufVxuXG4uZm9sZGVyLWljb246aG92ZXIge1xuICBjb2xvcjogdmFyKC0tdGVydGlhcnkpO1xufVxuXG4ubm8tYmFja2dyb3VuZDo6YWZ0ZXIge1xuICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7XG59XG5cbiNleHBsb3Jlci1lbmQge1xuICAvLyBuZWVkcyBoZWlnaHQgc28gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgZ2V0cyB0cmlnZ2VyZWRcbiAgaGVpZ2h0OiA0cHg7XG4gIC8vIHJlbW92ZSBkZWZhdWx0IG1hcmdpbiBmcm9tIGxpXG4gIG1hcmdpbjogMDtcbn1cbiJdfQ== */`;var explorer_inline_default=`// quartz/components/scripts/quartz/components/scripts/explorer.inline.ts +var explorerState; +var observer = new IntersectionObserver((entries) => { + const explorer = document.getElementById("explorer-ul"); + for (const entry of entries) { + if (entry.isIntersecting) { + explorer?.classList.add("no-background"); + } else { + explorer?.classList.remove("no-background"); + } + } +}); +function toggleExplorer() { + this.classList.toggle("collapsed"); + const content = this.nextElementSibling; + content.classList.toggle("collapsed"); + content.style.maxHeight = content.style.maxHeight === "0px" ? content.scrollHeight + "px" : "0px"; +} +function toggleFolder(evt) { + evt.stopPropagation(); + const target = evt.target; + const isSvg = target.nodeName === "svg"; + let childFolderContainer; + let currentFolderParent; + if (isSvg) { + childFolderContainer = target.parentElement?.nextSibling; + currentFolderParent = target.nextElementSibling; + childFolderContainer.classList.toggle("open"); + } else { + childFolderContainer = target.parentElement?.parentElement?.nextElementSibling; + currentFolderParent = target.parentElement; + childFolderContainer.classList.toggle("open"); + } + if (!childFolderContainer) + return; + const isCollapsed = childFolderContainer.classList.contains("open"); + setFolderState(childFolderContainer, !isCollapsed); + const clickFolderPath = currentFolderParent.dataset.folderpath; + const fullFolderPath = clickFolderPath.substring(1); + toggleCollapsedByPath(explorerState, fullFolderPath); + const stringifiedFileTree = JSON.stringify(explorerState); + localStorage.setItem("fileTree", stringifiedFileTree); +} +function setupExplorer() { + const explorer = document.getElementById("explorer"); + const storageTree = localStorage.getItem("fileTree"); + const useSavedFolderState = explorer?.dataset.savestate === "true"; + if (explorer) { + const collapseBehavior = explorer.dataset.behavior; + if (collapseBehavior === "collapse") { + Array.prototype.forEach.call( + document.getElementsByClassName("folder-button"), + function(item) { + item.removeEventListener("click", toggleFolder); + item.addEventListener("click", toggleFolder); + } + ); + } + explorer.removeEventListener("click", toggleExplorer); + explorer.addEventListener("click", toggleExplorer); + } + Array.prototype.forEach.call(document.getElementsByClassName("folder-icon"), function(item) { + item.removeEventListener("click", toggleFolder); + item.addEventListener("click", toggleFolder); + }); + if (storageTree && useSavedFolderState) { + explorerState = JSON.parse(storageTree); + explorerState.map((folderUl) => { + const folderLi = document.querySelector( + \`[data-folderpath='/\${folderUl.path}']\` + ); + if (folderLi) { + const folderUL = folderLi.parentElement?.nextElementSibling; + if (folderUL) { + setFolderState(folderUL, folderUl.collapsed); + } + } + }); + } else { + explorerState = JSON.parse(explorer?.dataset.tree); + } +} +window.addEventListener("resize", setupExplorer); +document.addEventListener("nav", () => { + setupExplorer(); + const explorerContent = document.getElementById("explorer-ul"); + const lastItem = document.getElementById("explorer-end"); + observer.disconnect(); + observer.observe(lastItem); +}); +function setFolderState(folderElement, collapsed) { + if (collapsed) { + folderElement?.classList.remove("open"); + } else { + folderElement?.classList.add("open"); + } +} +function toggleCollapsedByPath(array, path) { + const entry = array.find((item) => item.path === path); + if (entry) { + entry.collapsed = !entry.collapsed; + } +} +`;import{jsx as jsx19,jsxs as jsxs10}from"preact/jsx-runtime";var FileNode=class _FileNode{static{__name(this,"FileNode")}children;name;displayName;file;depth;constructor(name,file,depth){this.children=[],this.name=name,this.displayName=name,this.file=file?structuredClone(file):null,this.depth=depth??0}insert(file){if(file.path.length===1)if(file.path[0]!=="index.md")this.children.push(new _FileNode(file.file.frontmatter.title,file.file,this.depth+1));else{let title=file.file.frontmatter?.title;title&&title!=="index"&&file.path[0]==="index.md"&&(this.displayName=title)}else{let next=file.path[0];file.path=file.path.splice(1);for(let child of this.children)if(child.name===next){child.insert(file);return}let newChild=new _FileNode(next,void 0,this.depth+1);newChild.insert(file),this.children.push(newChild)}}add(file,splice=0){this.insert({file,path:file.filePath.split("/").splice(splice)})}print(depth=0){let folderChar="";this.file||(folderChar="|"),console.log("-".repeat(depth),folderChar,this.name,this.depth),this.children.forEach(e=>e.print(depth+1))}filter(filterFn){this.children=this.children.filter(filterFn),this.children.forEach(child=>child.filter(filterFn))}map(mapFn){mapFn(this),this.children.forEach(child=>child.map(mapFn))}getFolderPaths(collapsed){let folderPaths=[],traverse=__name((node,currentPath)=>{if(!node.file){let folderPath=currentPath+(currentPath?"/":"")+node.name;folderPath!==""&&folderPaths.push({path:folderPath,collapsed}),node.children.forEach(child=>traverse(child,folderPath))}},"traverse");return traverse(this,""),folderPaths}sort(sortFn){this.children=this.children.sort(sortFn),this.children.forEach(e=>e.sort(sortFn))}};function ExplorerNode({node,opts,fullPath,fileData}){let folderBehavior=opts.folderClickBehavior,isDefaultOpen=opts.folderDefaultState==="open",pathOld=fullPath||"",folderPath="";return node.name!==""&&(folderPath=`${pathOld}/${node.name}`),jsx19("li",{children:node.file?jsx19("li",{children:jsx19("a",{href:resolveRelative(fileData.slug,node.file.slug),"data-for":node.file.slug,children:node.displayName})},node.file.slug):jsxs10("div",{children:[node.name!==""&&jsxs10("div",{class:"folder-container",children:[jsx19("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"12",viewBox:"5 8 14 8",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"folder-icon",children:jsx19("polyline",{points:"6 9 12 15 18 9"})}),jsx19("div",{"data-folderpath":folderPath,children:folderBehavior==="link"?jsx19("a",{href:`${folderPath}`,"data-for":node.name,class:"folder-title",children:node.displayName}):jsx19("button",{class:"folder-button",children:jsx19("p",{class:"folder-title",children:node.displayName})})},node.name)]}),jsx19("div",{class:`folder-outer ${node.depth===0||isDefaultOpen?"open":""}`,children:jsx19("ul",{style:{paddingLeft:node.name!==""?"1.4rem":"0"},class:"content","data-folderul":folderPath,children:node.children.map((childNode,i)=>jsx19(ExplorerNode,{node:childNode,opts,fullPath:folderPath,fileData},i))})})]})})}__name(ExplorerNode,"ExplorerNode");import{jsx as jsx20,jsxs as jsxs11}from"preact/jsx-runtime";var defaultOptions9={title:"Explorer",folderClickBehavior:"collapse",folderDefaultState:"collapsed",useSavedState:!0,sortFn:(a,b)=>!a.file&&!b.file||a.file&&b.file?a.displayName.localeCompare(b.displayName,void 0,{numeric:!0,sensitivity:"base"}):a.file&&!b.file?1:-1,filterFn:node=>node.name!=="tags",order:["filter","map","sort"]},Explorer_default=__name(userOpts=>{let opts={...defaultOptions9,...userOpts},fileTree,jsonTree;function constructFileTree(allFiles){if(!fileTree){fileTree=new FileNode(""),allFiles.forEach(file=>fileTree.add(file,1));let functions={map:opts.mapFn,sort:opts.sortFn,filter:opts.filterFn};if(opts.order)for(let i=0;i0?jsx21("ul",{class:`tags ${displayClass??""}`,children:tags.map(tag=>{let display=`#${tag}`,linkDest=baseDir+`/tags/${slugTag(tag)}`;return jsx21("li",{children:jsx21("a",{href:linkDest,class:"internal tag-link",children:display})})})}):null}__name(TagList,"TagList");TagList.css=` +.tags { + list-style: none; + display: flex; + padding-left: 0; + gap: 0.4rem; + margin: 1rem 0; + flex-wrap: wrap; + justify-self: end; +} + +.section-li > .section > .tags { + justify-content: flex-end; +} + +.tags > li { + display: inline-block; + white-space: nowrap; + margin: 0; + overflow-wrap: normal; +} + +a.internal.tag-link { + border-radius: 8px; + background-color: var(--highlight); + padding: 0.2rem 0.4rem; + margin: 0 0.1rem; +} +`;var TagList_default=__name(()=>TagList,"default");var graph_inline_default=`// node_modules/d3-dispatch/src/dispatch.js +var noop = { value: () => { +} }; +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || t in _ || /[\\s.]/.test(t)) + throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} +function Dispatch(_) { + this._ = _; +} +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) + name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) + throw new Error("unknown type: " + t); + return { type: t, name }; + }); +} +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length; + if (arguments.length < 2) { + while (++i < n) + if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) + return t; + return; + } + if (callback != null && typeof callback !== "function") + throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) + _[t] = set(_[t], typename.name, callback); + else if (callback == null) + for (t in _) + _[t] = set(_[t], typename.name, null); + } + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) + copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type2, that) { + if ((n = arguments.length - 2) > 0) + for (var args = new Array(n), i = 0, n, t; i < n; ++i) + args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type2)) + throw new Error("unknown type: " + type2); + for (t = this._[type2], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + }, + apply: function(type2, that, args) { + if (!this._.hasOwnProperty(type2)) + throw new Error("unknown type: " + type2); + for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) + t[i].value.apply(that, args); + } +}; +function get(type2, name) { + for (var i = 0, n = type2.length, c2; i < n; ++i) { + if ((c2 = type2[i]).name === name) { + return c2.value; + } + } +} +function set(type2, name, callback) { + for (var i = 0, n = type2.length; i < n; ++i) { + if (type2[i].name === name) { + type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1)); + break; + } + } + if (callback != null) + type2.push({ name, value: callback }); + return type2; +} +var dispatch_default = dispatch; + +// node_modules/d3-selection/src/namespaces.js +var xhtml = "http://www.w3.org/1999/xhtml"; +var namespaces_default = { + svg: "http://www.w3.org/2000/svg", + xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +// node_modules/d3-selection/src/namespace.js +function namespace_default(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") + name = name.slice(i + 1); + return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name; +} + +// node_modules/d3-selection/src/creator.js +function creatorInherit(name) { + return function() { + var document2 = this.ownerDocument, uri = this.namespaceURI; + return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name); + }; +} +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} +function creator_default(name) { + var fullname = namespace_default(name); + return (fullname.local ? creatorFixed : creatorInherit)(fullname); +} + +// node_modules/d3-selection/src/selector.js +function none() { +} +function selector_default(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +// node_modules/d3-selection/src/selection/select.js +function select_default(select) { + if (typeof select !== "function") + select = selector_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) + subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/array.js +function array(x2) { + return x2 == null ? [] : Array.isArray(x2) ? x2 : Array.from(x2); +} + +// node_modules/d3-selection/src/selectorAll.js +function empty() { + return []; +} +function selectorAll_default(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} + +// node_modules/d3-selection/src/selection/selectAll.js +function arrayAll(select) { + return function() { + return array(select.apply(this, arguments)); + }; +} +function selectAll_default(select) { + if (typeof select === "function") + select = arrayAll(select); + else + select = selectorAll_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + return new Selection(subgroups, parents); +} + +// node_modules/d3-selection/src/matcher.js +function matcher_default(selector) { + return function() { + return this.matches(selector); + }; +} +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +// node_modules/d3-selection/src/selection/selectChild.js +var find = Array.prototype.find; +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} +function childFirst() { + return this.firstElementChild; +} +function selectChild_default(match) { + return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/selectChildren.js +var filter = Array.prototype.filter; +function children() { + return Array.from(this.children); +} +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} +function selectChildren_default(match) { + return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/filter.js +function filter_default(match) { + if (typeof match !== "function") + match = matcher_default(match); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/selection/sparse.js +function sparse_default(update) { + return new Array(update.length); +} + +// node_modules/d3-selection/src/selection/enter.js +function enter_default() { + return new Selection(this._enter || this._groups.map(sparse_default), this._parents); +} +function EnterNode(parent, datum2) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum2; +} +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function(child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function(selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function(selector) { + return this._parent.querySelectorAll(selector); + } +}; + +// node_modules/d3-selection/src/constant.js +function constant_default(x2) { + return function() { + return x2; + }; +} + +// node_modules/d3-selection/src/selection/data.js +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, node, groupLength = group.length, dataLength = data.length; + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} +function bindKey(parent, group, enter, update, exit, data, key) { + var i, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { + exit[i] = node; + } + } +} +function datum(node) { + return node.__data__; +} +function data_default(value, key) { + if (!arguments.length) + return Array.from(this, datum); + var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; + if (typeof value !== "function") + value = constant_default(value); + for (var m2 = groups.length, update = new Array(m2), enter = new Array(m2), exit = new Array(m2), j = 0; j < m2; ++j) { + var parent = parents[j], group = groups[j], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength); + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) + i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) + ; + previous._next = next || null; + } + } + } + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} +function arraylike(data) { + return typeof data === "object" && "length" in data ? data : Array.from(data); +} + +// node_modules/d3-selection/src/selection/exit.js +function exit_default() { + return new Selection(this._exit || this._groups.map(sparse_default), this._parents); +} + +// node_modules/d3-selection/src/selection/join.js +function join_default(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + if (typeof onenter === "function") { + enter = onenter(enter); + if (enter) + enter = enter.selection(); + } else { + enter = enter.append(onenter + ""); + } + if (onupdate != null) { + update = onupdate(update); + if (update) + update = update.selection(); + } + if (onexit == null) + exit.remove(); + else + onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +// node_modules/d3-selection/src/selection/merge.js +function merge_default(context) { + var selection2 = context.selection ? context.selection() : context; + for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Selection(merges, this._parents); +} + +// node_modules/d3-selection/src/selection/order.js +function order_default() { + for (var groups = this._groups, j = -1, m2 = groups.length; ++j < m2; ) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) + next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; +} + +// node_modules/d3-selection/src/selection/sort.js +function sort_default(compare) { + if (!compare) + compare = ascending; + function compareNode(a2, b) { + return a2 && b ? compare(a2.__data__, b.__data__) : !a2 - !b; + } + for (var groups = this._groups, m2 = groups.length, sortgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + return new Selection(sortgroups, this._parents).order(); +} +function ascending(a2, b) { + return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN; +} + +// node_modules/d3-selection/src/selection/call.js +function call_default() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +// node_modules/d3-selection/src/selection/nodes.js +function nodes_default() { + return Array.from(this); +} + +// node_modules/d3-selection/src/selection/node.js +function node_default() { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) + return node; + } + } + return null; +} + +// node_modules/d3-selection/src/selection/size.js +function size_default() { + let size = 0; + for (const node of this) + ++size; + return size; +} + +// node_modules/d3-selection/src/selection/empty.js +function empty_default() { + return !this.node(); +} + +// node_modules/d3-selection/src/selection/each.js +function each_default(callback) { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) + callback.call(node, node.__data__, i, group); + } + } + return this; +} + +// node_modules/d3-selection/src/selection/attr.js +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + this.removeAttribute(name); + else + this.setAttribute(name, v); + }; +} +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + this.removeAttributeNS(fullname.space, fullname.local); + else + this.setAttributeNS(fullname.space, fullname.local, v); + }; +} +function attr_default(name, value) { + var fullname = namespace_default(name); + if (arguments.length < 2) { + var node = this.node(); + return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); + } + return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value)); +} + +// node_modules/d3-selection/src/window.js +function window_default(node) { + return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView; +} + +// node_modules/d3-selection/src/selection/style.js +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + this.style.removeProperty(name); + else + this.style.setProperty(name, v, priority); + }; +} +function style_default(name, value, priority) { + return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); +} +function styleValue(node, name) { + return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name); +} + +// node_modules/d3-selection/src/selection/property.js +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) + delete this[name]; + else + this[name] = v; + }; +} +function property_default(name, value) { + return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; +} + +// node_modules/d3-selection/src/selection/classed.js +function classArray(string) { + return string.trim().split(/^|\\s+/); +} +function classList(node) { + return node.classList || new ClassList(node); +} +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) + list.add(names[i]); +} +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) + list.remove(names[i]); +} +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} +function classed_default(name, value) { + var names = classArray(name + ""); + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) + if (!list.contains(names[i])) + return false; + return true; + } + return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); +} + +// node_modules/d3-selection/src/selection/text.js +function textRemove() { + this.textContent = ""; +} +function textConstant(value) { + return function() { + this.textContent = value; + }; +} +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} +function text_default(value) { + return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent; +} + +// node_modules/d3-selection/src/selection/html.js +function htmlRemove() { + this.innerHTML = ""; +} +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} +function html_default(value) { + return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; +} + +// node_modules/d3-selection/src/selection/raise.js +function raise() { + if (this.nextSibling) + this.parentNode.appendChild(this); +} +function raise_default() { + return this.each(raise); +} + +// node_modules/d3-selection/src/selection/lower.js +function lower() { + if (this.previousSibling) + this.parentNode.insertBefore(this, this.parentNode.firstChild); +} +function lower_default() { + return this.each(lower); +} + +// node_modules/d3-selection/src/selection/append.js +function append_default(name) { + var create2 = typeof name === "function" ? name : creator_default(name); + return this.select(function() { + return this.appendChild(create2.apply(this, arguments)); + }); +} + +// node_modules/d3-selection/src/selection/insert.js +function constantNull() { + return null; +} +function insert_default(name, before) { + var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before); + return this.select(function() { + return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +// node_modules/d3-selection/src/selection/remove.js +function remove() { + var parent = this.parentNode; + if (parent) + parent.removeChild(this); +} +function remove_default() { + return this.each(remove); +} + +// node_modules/d3-selection/src/selection/clone.js +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function clone_default(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +// node_modules/d3-selection/src/selection/datum.js +function datum_default(value) { + return arguments.length ? this.property("__data__", value) : this.node().__data__; +} + +// node_modules/d3-selection/src/selection/on.js +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} +function parseTypenames2(typenames) { + return typenames.trim().split(/^|\\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) + name = t.slice(i + 1), t = t.slice(0, i); + return { type: t, name }; + }); +} +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) + return; + for (var j = 0, i = -1, m2 = on.length, o; j < m2; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) + on.length = i; + else + delete this.__on; + }; +} +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) + for (var j = 0, m2 = on.length; j < m2; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = { type: typename.type, name: typename.name, value, listener, options }; + if (!on) + this.__on = [o]; + else + on.push(o); + }; +} +function on_default(typename, value, options) { + var typenames = parseTypenames2(typename + ""), i, n = typenames.length, t; + if (arguments.length < 2) { + var on = this.node().__on; + if (on) + for (var j = 0, m2 = on.length, o; j < m2; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) + this.each(on(typenames[i], value, options)); + return this; +} + +// node_modules/d3-selection/src/selection/dispatch.js +function dispatchEvent(node, type2, params) { + var window2 = window_default(node), event = window2.CustomEvent; + if (typeof event === "function") { + event = new event(type2, params); + } else { + event = window2.document.createEvent("Event"); + if (params) + event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail; + else + event.initEvent(type2, false, false); + } + node.dispatchEvent(event); +} +function dispatchConstant(type2, params) { + return function() { + return dispatchEvent(this, type2, params); + }; +} +function dispatchFunction(type2, params) { + return function() { + return dispatchEvent(this, type2, params.apply(this, arguments)); + }; +} +function dispatch_default2(type2, params) { + return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params)); +} + +// node_modules/d3-selection/src/selection/iterator.js +function* iterator_default() { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) + yield node; + } + } +} + +// node_modules/d3-selection/src/selection/index.js +var root = [null]; +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} +function selection() { + return new Selection([[document.documentElement]], root); +} +function selection_selection() { + return this; +} +Selection.prototype = selection.prototype = { + constructor: Selection, + select: select_default, + selectAll: selectAll_default, + selectChild: selectChild_default, + selectChildren: selectChildren_default, + filter: filter_default, + data: data_default, + enter: enter_default, + exit: exit_default, + join: join_default, + merge: merge_default, + selection: selection_selection, + order: order_default, + sort: sort_default, + call: call_default, + nodes: nodes_default, + node: node_default, + size: size_default, + empty: empty_default, + each: each_default, + attr: attr_default, + style: style_default, + property: property_default, + classed: classed_default, + text: text_default, + html: html_default, + raise: raise_default, + lower: lower_default, + append: append_default, + insert: insert_default, + remove: remove_default, + clone: clone_default, + datum: datum_default, + on: on_default, + dispatch: dispatch_default2, + [Symbol.iterator]: iterator_default +}; +var selection_default = selection; + +// node_modules/d3-selection/src/select.js +function select_default2(selector) { + return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root); +} + +// node_modules/d3-selection/src/sourceEvent.js +function sourceEvent_default(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) + event = sourceEvent; + return event; +} + +// node_modules/d3-selection/src/pointer.js +function pointer_default(event, node) { + event = sourceEvent_default(event); + if (node === void 0) + node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +// node_modules/d3-selection/src/selectAll.js +function selectAll_default2(selector) { + return typeof selector === "string" ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) : new Selection([array(selector)], root); +} + +// node_modules/d3-drag/src/noevent.js +var nonpassive = { passive: false }; +var nonpassivecapture = { capture: true, passive: false }; +function nopropagation(event) { + event.stopImmediatePropagation(); +} +function noevent_default(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-drag/src/nodrag.js +function nodrag_default(view) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture); + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", noevent_default, nonpassivecapture); + } else { + root2.__noselect = root2.style.MozUserSelect; + root2.style.MozUserSelect = "none"; + } +} +function yesdrag(view, noclick) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null); + if (noclick) { + selection2.on("click.drag", noevent_default, nonpassivecapture); + setTimeout(function() { + selection2.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", null); + } else { + root2.style.MozUserSelect = root2.__noselect; + delete root2.__noselect; + } +} + +// node_modules/d3-drag/src/constant.js +var constant_default2 = (x2) => () => x2; + +// node_modules/d3-drag/src/event.js +function DragEvent(type2, { + sourceEvent, + subject, + target, + identifier, + active, + x: x2, + y: y2, + dx, + dy, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type2, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + subject: { value: subject, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + identifier: { value: identifier, enumerable: true, configurable: true }, + active: { value: active, enumerable: true, configurable: true }, + x: { value: x2, enumerable: true, configurable: true }, + y: { value: y2, enumerable: true, configurable: true }, + dx: { value: dx, enumerable: true, configurable: true }, + dy: { value: dy, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// node_modules/d3-drag/src/drag.js +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} +function defaultContainer() { + return this.parentNode; +} +function defaultSubject(event, d) { + return d == null ? { x: event.x, y: event.y } : d; +} +function defaultTouchable() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function drag_default() { + var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0; + function drag(selection2) { + selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + function mousedowned(event, d) { + if (touchending || !filter2.call(this, event, d)) + return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) + return; + select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture); + nodrag_default(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + function mousemoved(event) { + noevent_default(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + function mouseupped(event) { + select_default2(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent_default(event); + gestures.mouse("end", event); + } + function touchstarted(event, d) { + if (!filter2.call(this, event, d)) + return; + var touches = event.changedTouches, c2 = container.call(this, event, d), n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c2, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } + } + function touchmoved(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent_default(event); + gesture("drag", event, touches[i]); + } + } + } + function touchended(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, 500); + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } + function beforestart(that, container2, event, d, identifier, touch) { + var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch: dispatch2 + }), d)) == null) + return; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return function gesture(type2, event2, touch2) { + var p0 = p, n; + switch (type2) { + case "start": + gestures[identifier] = gesture, n = active++; + break; + case "end": + delete gestures[identifier], --active; + case "drag": + p = pointer_default(touch2 || event2, container2), n = active; + break; + } + dispatch2.call( + type2, + that, + new DragEvent(type2, { + sourceEvent: event2, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch: dispatch2 + }), + d + ); + }; + } + drag.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2; + }; + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container; + }; + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject; + }; + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable; + }; + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + return drag; +} + +// node_modules/d3-color/src/define.js +function define_default(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) + prototype[key] = definition[key]; + return prototype; +} + +// node_modules/d3-color/src/color.js +function Color() { +} +var darker = 0.7; +var brighter = 1 / darker; +var reI = "\\\\s*([+-]?\\\\d+)\\\\s*"; +var reN = "\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*"; +var reP = "\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*"; +var reHex = /^#([0-9a-f]{3,8})$/; +var reRgbInteger = new RegExp(\`^rgb\\\\(\${reI},\${reI},\${reI}\\\\)$\`); +var reRgbPercent = new RegExp(\`^rgb\\\\(\${reP},\${reP},\${reP}\\\\)$\`); +var reRgbaInteger = new RegExp(\`^rgba\\\\(\${reI},\${reI},\${reI},\${reN}\\\\)$\`); +var reRgbaPercent = new RegExp(\`^rgba\\\\(\${reP},\${reP},\${reP},\${reN}\\\\)$\`); +var reHslPercent = new RegExp(\`^hsl\\\\(\${reN},\${reP},\${reP}\\\\)$\`); +var reHslaPercent = new RegExp(\`^hsla\\\\(\${reN},\${reP},\${reP},\${reN}\\\\)$\`); +var named = { + aliceblue: 15792383, + antiquewhite: 16444375, + aqua: 65535, + aquamarine: 8388564, + azure: 15794175, + beige: 16119260, + bisque: 16770244, + black: 0, + blanchedalmond: 16772045, + blue: 255, + blueviolet: 9055202, + brown: 10824234, + burlywood: 14596231, + cadetblue: 6266528, + chartreuse: 8388352, + chocolate: 13789470, + coral: 16744272, + cornflowerblue: 6591981, + cornsilk: 16775388, + crimson: 14423100, + cyan: 65535, + darkblue: 139, + darkcyan: 35723, + darkgoldenrod: 12092939, + darkgray: 11119017, + darkgreen: 25600, + darkgrey: 11119017, + darkkhaki: 12433259, + darkmagenta: 9109643, + darkolivegreen: 5597999, + darkorange: 16747520, + darkorchid: 10040012, + darkred: 9109504, + darksalmon: 15308410, + darkseagreen: 9419919, + darkslateblue: 4734347, + darkslategray: 3100495, + darkslategrey: 3100495, + darkturquoise: 52945, + darkviolet: 9699539, + deeppink: 16716947, + deepskyblue: 49151, + dimgray: 6908265, + dimgrey: 6908265, + dodgerblue: 2003199, + firebrick: 11674146, + floralwhite: 16775920, + forestgreen: 2263842, + fuchsia: 16711935, + gainsboro: 14474460, + ghostwhite: 16316671, + gold: 16766720, + goldenrod: 14329120, + gray: 8421504, + green: 32768, + greenyellow: 11403055, + grey: 8421504, + honeydew: 15794160, + hotpink: 16738740, + indianred: 13458524, + indigo: 4915330, + ivory: 16777200, + khaki: 15787660, + lavender: 15132410, + lavenderblush: 16773365, + lawngreen: 8190976, + lemonchiffon: 16775885, + lightblue: 11393254, + lightcoral: 15761536, + lightcyan: 14745599, + lightgoldenrodyellow: 16448210, + lightgray: 13882323, + lightgreen: 9498256, + lightgrey: 13882323, + lightpink: 16758465, + lightsalmon: 16752762, + lightseagreen: 2142890, + lightskyblue: 8900346, + lightslategray: 7833753, + lightslategrey: 7833753, + lightsteelblue: 11584734, + lightyellow: 16777184, + lime: 65280, + limegreen: 3329330, + linen: 16445670, + magenta: 16711935, + maroon: 8388608, + mediumaquamarine: 6737322, + mediumblue: 205, + mediumorchid: 12211667, + mediumpurple: 9662683, + mediumseagreen: 3978097, + mediumslateblue: 8087790, + mediumspringgreen: 64154, + mediumturquoise: 4772300, + mediumvioletred: 13047173, + midnightblue: 1644912, + mintcream: 16121850, + mistyrose: 16770273, + moccasin: 16770229, + navajowhite: 16768685, + navy: 128, + oldlace: 16643558, + olive: 8421376, + olivedrab: 7048739, + orange: 16753920, + orangered: 16729344, + orchid: 14315734, + palegoldenrod: 15657130, + palegreen: 10025880, + paleturquoise: 11529966, + palevioletred: 14381203, + papayawhip: 16773077, + peachpuff: 16767673, + peru: 13468991, + pink: 16761035, + plum: 14524637, + powderblue: 11591910, + purple: 8388736, + rebeccapurple: 6697881, + red: 16711680, + rosybrown: 12357519, + royalblue: 4286945, + saddlebrown: 9127187, + salmon: 16416882, + sandybrown: 16032864, + seagreen: 3050327, + seashell: 16774638, + sienna: 10506797, + silver: 12632256, + skyblue: 8900331, + slateblue: 6970061, + slategray: 7372944, + slategrey: 7372944, + snow: 16775930, + springgreen: 65407, + steelblue: 4620980, + tan: 13808780, + teal: 32896, + thistle: 14204888, + tomato: 16737095, + turquoise: 4251856, + violet: 15631086, + wheat: 16113331, + white: 16777215, + whitesmoke: 16119285, + yellow: 16776960, + yellowgreen: 10145074 +}; +define_default(Color, color, { + copy(channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable() { + return this.rgb().displayable(); + }, + hex: color_formatHex, + // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHex8: color_formatHex8, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); +function color_formatHex() { + return this.rgb().formatHex(); +} +function color_formatHex8() { + return this.rgb().formatHex8(); +} +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} +function color_formatRgb() { + return this.rgb().formatRgb(); +} +function color(format) { + var m2, l; + format = (format + "").trim().toLowerCase(); + return (m2 = reHex.exec(format)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; +} +function rgbn(n) { + return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1); +} +function rgba(r, g, b, a2) { + if (a2 <= 0) + r = g = b = NaN; + return new Rgb(r, g, b, a2); +} +function rgbConvert(o) { + if (!(o instanceof Color)) + o = color(o); + if (!o) + return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} +define_default(Rgb, rgb, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb() { + return this; + }, + clamp() { + return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); + }, + displayable() { + return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, + // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatHex8: rgb_formatHex8, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); +function rgb_formatHex() { + return \`#\${hex(this.r)}\${hex(this.g)}\${hex(this.b)}\`; +} +function rgb_formatHex8() { + return \`#\${hex(this.r)}\${hex(this.g)}\${hex(this.b)}\${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}\`; +} +function rgb_formatRgb() { + const a2 = clampa(this.opacity); + return \`\${a2 === 1 ? "rgb(" : "rgba("}\${clampi(this.r)}, \${clampi(this.g)}, \${clampi(this.b)}\${a2 === 1 ? ")" : \`, \${a2})\`}\`; +} +function clampa(opacity) { + return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); +} +function clampi(value) { + return Math.max(0, Math.min(255, Math.round(value) || 0)); +} +function hex(value) { + value = clampi(value); + return (value < 16 ? "0" : "") + value.toString(16); +} +function hsla(h, s, l, a2) { + if (a2 <= 0) + h = s = l = NaN; + else if (l <= 0 || l >= 1) + h = s = NaN; + else if (s <= 0) + h = NaN; + return new Hsl(h, s, l, a2); +} +function hslConvert(o) { + if (o instanceof Hsl) + return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) + o = color(o); + if (!o) + return new Hsl(); + if (o instanceof Hsl) + return o; + o = o.rgb(); + var r = o.r / 255, g = o.g / 255, b = o.b / 255, min2 = Math.min(r, g, b), max2 = Math.max(r, g, b), h = NaN, s = max2 - min2, l = (max2 + min2) / 2; + if (s) { + if (r === max2) + h = (g - b) / s + (g < b) * 6; + else if (g === max2) + h = (b - r) / s + 2; + else + h = (r - g) / s + 4; + s /= l < 0.5 ? max2 + min2 : 2 - max2 - min2; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} +define_default(Hsl, hsl, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb() { + var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + clamp() { + return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); + }, + displayable() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl() { + const a2 = clampa(this.opacity); + return \`\${a2 === 1 ? "hsl(" : "hsla("}\${clamph(this.h)}, \${clampt(this.s) * 100}%, \${clampt(this.l) * 100}%\${a2 === 1 ? ")" : \`, \${a2})\`}\`; + } +})); +function clamph(value) { + value = (value || 0) % 360; + return value < 0 ? value + 360 : value; +} +function clampt(value) { + return Math.max(0, Math.min(1, value || 0)); +} +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; +} + +// node_modules/d3-interpolate/src/basis.js +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6; +} +function basis_default(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/basisClosed.js +function basisClosed_default(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/constant.js +var constant_default3 = (x2) => () => x2; + +// node_modules/d3-interpolate/src/color.js +function linear(a2, d) { + return function(t) { + return a2 + t * d; + }; +} +function exponential(a2, b, y2) { + return a2 = Math.pow(a2, y2), b = Math.pow(b, y2) - a2, y2 = 1 / y2, function(t) { + return Math.pow(a2 + t * b, y2); + }; +} +function gamma(y2) { + return (y2 = +y2) === 1 ? nogamma : function(a2, b) { + return b - a2 ? exponential(a2, b, y2) : constant_default3(isNaN(a2) ? b : a2); + }; +} +function nogamma(a2, b) { + var d = b - a2; + return d ? linear(a2, d) : constant_default3(isNaN(a2) ? b : a2); +} + +// node_modules/d3-interpolate/src/rgb.js +var rgb_default = function rgbGamma(y2) { + var color2 = gamma(y2); + function rgb2(start2, end) { + var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.r = r(t); + start2.g = g(t); + start2.b = b(t); + start2.opacity = opacity(t); + return start2 + ""; + }; + } + rgb2.gamma = rgbGamma; + return rgb2; +}(1); +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2; + for (i = 0; i < n; ++i) { + color2 = rgb(colors[i]); + r[i] = color2.r || 0; + g[i] = color2.g || 0; + b[i] = color2.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color2.opacity = 1; + return function(t) { + color2.r = r(t); + color2.g = g(t); + color2.b = b(t); + return color2 + ""; + }; + }; +} +var rgbBasis = rgbSpline(basis_default); +var rgbBasisClosed = rgbSpline(basisClosed_default); + +// node_modules/d3-interpolate/src/number.js +function number_default(a2, b) { + return a2 = +a2, b = +b, function(t) { + return a2 * (1 - t) + b * t; + }; +} + +// node_modules/d3-interpolate/src/string.js +var reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g; +var reB = new RegExp(reA.source, "g"); +function zero(b) { + return function() { + return b; + }; +} +function one(b) { + return function(t) { + return b(t) + ""; + }; +} +function string_default(a2, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a2 = a2 + "", b = b + ""; + while ((am = reA.exec(a2)) && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) + s[i] += bs; + else + s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) + s[i] += bm; + else + s[++i] = bm; + } else { + s[++i] = null; + q.push({ i, x: number_default(am, bm) }); + } + bi = reB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) + s[i] += bs; + else + s[++i] = bs; + } + return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) { + for (var i2 = 0, o; i2 < b; ++i2) + s[(o = q[i2]).i] = o.x(t); + return s.join(""); + }); +} + +// node_modules/d3-interpolate/src/transform/decompose.js +var degrees = 180 / Math.PI; +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; +function decompose_default(a2, b, c2, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a2 * a2 + b * b)) + a2 /= scaleX, b /= scaleX; + if (skewX = a2 * c2 + b * d) + c2 -= a2 * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c2 * c2 + d * d)) + c2 /= scaleY, d /= scaleY, skewX /= scaleY; + if (a2 * d < b * c2) + a2 = -a2, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a2) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX, + scaleY + }; +} + +// node_modules/d3-interpolate/src/transform/parse.js +var svgNode; +function parseCss(value) { + const m2 = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m2.isIdentity ? identity : decompose_default(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f); +} +function parseSvg(value) { + if (value == null) + return identity; + if (!svgNode) + svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) + return identity; + value = value.matrix; + return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f); +} + +// node_modules/d3-interpolate/src/transform/index.js +function interpolateTransform(parse, pxComma, pxParen, degParen) { + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + function rotate(a2, b, s, q) { + if (a2 !== b) { + if (a2 - b > 180) + b += 360; + else if (b - a2 > 180) + a2 += 360; + q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a2, b) }); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + function skewX(a2, b, s, q) { + if (a2 !== b) { + q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a2, b) }); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + return function(a2, b) { + var s = [], q = []; + a2 = parse(a2), b = parse(b); + translate(a2.translateX, a2.translateY, b.translateX, b.translateY, s, q); + rotate(a2.rotate, b.rotate, s, q); + skewX(a2.skewX, b.skewX, s, q); + scale(a2.scaleX, a2.scaleY, b.scaleX, b.scaleY, s, q); + a2 = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) + s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +// node_modules/d3-interpolate/src/zoom.js +var epsilon2 = 1e-12; +function cosh(x2) { + return ((x2 = Math.exp(x2)) + 1 / x2) / 2; +} +function sinh(x2) { + return ((x2 = Math.exp(x2)) - 1 / x2) / 2; +} +function tanh(x2) { + return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1); +} +var zoom_default = function zoomRho(rho, rho2, rho4) { + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } else { + var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + i.duration = S * 1e3 * rho / Math.SQRT2; + return i; + } + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + return zoom; +}(Math.SQRT2, 2, 4); + +// node_modules/d3-timer/src/timer.js +var frame = 0; +var timeout = 0; +var interval = 0; +var pokeDelay = 1e3; +var taskHead; +var taskTail; +var clockLast = 0; +var clockNow = 0; +var clockSkew = 0; +var clock = typeof performance === "object" && performance.now ? performance : Date; +var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { + setTimeout(f, 17); +}; +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} +function clearNow() { + clockNow = 0; +} +function Timer() { + this._call = this._time = this._next = null; +} +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") + throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) + taskTail._next = this; + else + taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; +function timer(callback, delay, time) { + var t = new Timer(); + t.restart(callback, delay, time); + return t; +} +function timerFlush() { + now(); + ++frame; + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) + t._call.call(void 0, e); + t = t._next; + } + --frame; +} +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} +function poke() { + var now2 = clock.now(), delay = now2 - clockLast; + if (delay > pokeDelay) + clockSkew -= delay, clockLast = now2; +} +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) + time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} +function sleep(time) { + if (frame) + return; + if (timeout) + timeout = clearTimeout(timeout); + var delay = time - clockNow; + if (delay > 24) { + if (time < Infinity) + timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) + interval = clearInterval(interval); + } else { + if (!interval) + clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +// node_modules/d3-timer/src/timeout.js +function timeout_default(callback, delay, time) { + var t = new Timer(); + delay = delay == null ? 0 : +delay; + t.restart((elapsed) => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +// node_modules/d3-transition/src/transition/schedule.js +var emptyOn = dispatch_default("start", "end", "cancel", "interrupt"); +var emptyTween = []; +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; +function schedule_default(node, name, id2, index2, group, timing) { + var schedules = node.__transition; + if (!schedules) + node.__transition = {}; + else if (id2 in schedules) + return; + create(node, id2, { + name, + index: index2, + // For context during callback. + group, + // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} +function init(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > CREATED) + throw new Error("too late; already scheduled"); + return schedule; +} +function set2(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > STARTED) + throw new Error("too late; already running"); + return schedule; +} +function get2(node, id2) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id2])) + throw new Error("transition not found"); + return schedule; +} +function create(node, id2, self) { + var schedules = node.__transition, tween; + schedules[id2] = self; + self.timer = timer(schedule, 0, self.time); + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start2, self.delay, self.time); + if (self.delay <= elapsed) + start2(elapsed - self.delay); + } + function start2(elapsed) { + var i, j, n, o; + if (self.state !== SCHEDULED) + return stop(); + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) + continue; + if (o.state === STARTED) + return timeout_default(start2); + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } else if (+i < id2) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + timeout_default(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) + return; + self.state = STARTED; + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), i = -1, n = tween.length; + while (++i < n) { + tween[i].call(node, t); + } + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id2]; + for (var i in schedules) + return; + delete node.__transition; + } +} + +// node_modules/d3-transition/src/interrupt.js +function interrupt_default(node, name) { + var schedules = node.__transition, schedule, active, empty2 = true, i; + if (!schedules) + return; + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty2 = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + if (empty2) + delete node.__transition; +} + +// node_modules/d3-transition/src/selection/interrupt.js +function interrupt_default2(name) { + return this.each(function() { + interrupt_default(this, name); + }); +} + +// node_modules/d3-transition/src/transition/tween.js +function tweenRemove(id2, name) { + var tween0, tween1; + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + schedule.tween = tween1; + }; +} +function tweenFunction(id2, name, value) { + var tween0, tween1; + if (typeof value !== "function") + throw new Error(); + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) + tween1.push(t); + } + schedule.tween = tween1; + }; +} +function tween_default(name, value) { + var id2 = this._id; + name += ""; + if (arguments.length < 2) { + var tween = get2(this.node(), id2).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value)); +} +function tweenValue(transition2, name, value) { + var id2 = transition2._id; + transition2.each(function() { + var schedule = set2(this, id2); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + return function(node) { + return get2(node, id2).value[name]; + }; +} + +// node_modules/d3-transition/src/transition/interpolate.js +function interpolate_default(a2, b) { + var c2; + return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c2 = color(b)) ? (b = c2, rgb_default) : string_default)(a2, b); +} + +// node_modules/d3-transition/src/transition/attr.js +function attrRemove2(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS2(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrConstantNS2(fullname, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) + return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attrFunctionNS2(fullname, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) + return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attr_default2(name, value) { + var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default; + return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value)); +} + +// node_modules/d3-transition/src/transition/attrTween.js +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} +function attrTween_default(name, value) { + var key = "attr." + name; + if (arguments.length < 2) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error(); + var fullname = namespace_default(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +// node_modules/d3-transition/src/transition/delay.js +function delayFunction(id2, value) { + return function() { + init(this, id2).delay = +value.apply(this, arguments); + }; +} +function delayConstant(id2, value) { + return value = +value, function() { + init(this, id2).delay = value; + }; +} +function delay_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay; +} + +// node_modules/d3-transition/src/transition/duration.js +function durationFunction(id2, value) { + return function() { + set2(this, id2).duration = +value.apply(this, arguments); + }; +} +function durationConstant(id2, value) { + return value = +value, function() { + set2(this, id2).duration = value; + }; +} +function duration_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration; +} + +// node_modules/d3-transition/src/transition/ease.js +function easeConstant(id2, value) { + if (typeof value !== "function") + throw new Error(); + return function() { + set2(this, id2).ease = value; + }; +} +function ease_default(value) { + var id2 = this._id; + return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease; +} + +// node_modules/d3-transition/src/transition/easeVarying.js +function easeVarying(id2, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") + throw new Error(); + set2(this, id2).ease = v; + }; +} +function easeVarying_default(value) { + if (typeof value !== "function") + throw new Error(); + return this.each(easeVarying(this._id, value)); +} + +// node_modules/d3-transition/src/transition/filter.js +function filter_default2(match) { + if (typeof match !== "function") + match = matcher_default(match); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Transition(subgroups, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/merge.js +function merge_default2(transition2) { + if (transition2._id !== this._id) + throw new Error(); + for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Transition(merges, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/on.js +function start(name) { + return (name + "").trim().split(/^|\\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) + t = t.slice(0, i); + return !t || t === "start"; + }); +} +function onFunction(id2, name, listener) { + var on0, on1, sit = start(name) ? init : set2; + return function() { + var schedule = sit(this, id2), on = schedule.on; + if (on !== on0) + (on1 = (on0 = on).copy()).on(name, listener); + schedule.on = on1; + }; +} +function on_default2(name, listener) { + var id2 = this._id; + return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener)); +} + +// node_modules/d3-transition/src/transition/remove.js +function removeFunction(id2) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) + if (+i !== id2) + return; + if (parent) + parent.removeChild(this); + }; +} +function remove_default2() { + return this.on("end.remove", removeFunction(this._id)); +} + +// node_modules/d3-transition/src/transition/select.js +function select_default3(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") + select = selector_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) + subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2)); + } + } + } + return new Transition(subgroups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selectAll.js +function selectAll_default3(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") + select = selectorAll_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children2 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) { + if (child = children2[k]) { + schedule_default(child, name, id2, k, children2, inherit2); + } + } + subgroups.push(children2); + parents.push(node); + } + } + } + return new Transition(subgroups, parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selection.js +var Selection2 = selection_default.prototype.constructor; +function selection_default2() { + return new Selection2(this._groups, this._parents); +} + +// node_modules/d3-transition/src/transition/style.js +function styleNull(name, interpolate) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} +function styleRemove2(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function styleFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + ""; + if (value1 == null) + string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function styleMaybeRemove(id2, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2; + return function() { + var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0; + if (on !== on0 || listener0 !== listener) + (on1 = (on0 = on).copy()).on(event, listener0 = listener); + schedule.on = on1; + }; +} +function style_default2(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; + return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null); +} + +// node_modules/d3-transition/src/transition/styleTween.js +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} +function styleTween_default(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error(); + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +// node_modules/d3-transition/src/transition/text.js +function textConstant2(value) { + return function() { + this.textContent = value; + }; +} +function textFunction2(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} +function text_default2(value) { + return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + "")); +} + +// node_modules/d3-transition/src/transition/textTween.js +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) + t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} +function textTween_default(value) { + var key = "text"; + if (arguments.length < 1) + return (key = this.tween(key)) && key._value; + if (value == null) + return this.tween(key, null); + if (typeof value !== "function") + throw new Error(); + return this.tween(key, textTween(value)); +} + +// node_modules/d3-transition/src/transition/transition.js +function transition_default() { + var name = this._name, id0 = this._id, id1 = newId(); + for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit2 = get2(node, id0); + schedule_default(node, name, id1, i, group, { + time: inherit2.time + inherit2.delay + inherit2.duration, + delay: 0, + duration: inherit2.duration, + ease: inherit2.ease + }); + } + } + } + return new Transition(groups, this._parents, name, id1); +} + +// node_modules/d3-transition/src/transition/end.js +function end_default() { + var on0, on1, that = this, id2 = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = { value: reject }, end = { value: function() { + if (--size === 0) + resolve(); + } }; + that.each(function() { + var schedule = set2(this, id2), on = schedule.on; + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + schedule.on = on1; + }); + if (size === 0) + resolve(); + }); +} + +// node_modules/d3-transition/src/transition/index.js +var id = 0; +function Transition(groups, parents, name, id2) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id2; +} +function transition(name) { + return selection_default().transition(name); +} +function newId() { + return ++id; +} +var selection_prototype = selection_default.prototype; +Transition.prototype = transition.prototype = { + constructor: Transition, + select: select_default3, + selectAll: selectAll_default3, + selectChild: selection_prototype.selectChild, + selectChildren: selection_prototype.selectChildren, + filter: filter_default2, + merge: merge_default2, + selection: selection_default2, + transition: transition_default, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: on_default2, + attr: attr_default2, + attrTween: attrTween_default, + style: style_default2, + styleTween: styleTween_default, + text: text_default2, + textTween: textTween_default, + remove: remove_default2, + tween: tween_default, + delay: delay_default, + duration: duration_default, + ease: ease_default, + easeVarying: easeVarying_default, + end: end_default, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +// node_modules/d3-ease/src/cubic.js +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +// node_modules/d3-transition/src/selection/transition.js +var defaultTiming = { + time: null, + // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; +function inherit(node, id2) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id2])) { + if (!(node = node.parentNode)) { + throw new Error(\`transition \${id2} not found\`); + } + } + return timing; +} +function transition_default2(name) { + var id2, timing; + if (name instanceof Transition) { + id2 = name._id, name = name._name; + } else { + id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule_default(node, name, id2, i, group, timing || inherit(node, id2)); + } + } + } + return new Transition(groups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/selection/index.js +selection_default.prototype.interrupt = interrupt_default2; +selection_default.prototype.transition = transition_default2; + +// node_modules/d3-brush/src/brush.js +var { abs, max, min } = Math; +function number1(e) { + return [+e[0], +e[1]]; +} +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x2, e) { + return x2 == null ? null : [[+x2[0], e[0][1]], [+x2[1], e[1][1]]]; + }, + output: function(xy) { + return xy && [xy[0][0], xy[1][0]]; + } +}; +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y2, e) { + return y2 == null ? null : [[e[0][0], +y2[0]], [e[1][0], +y2[1]]]; + }, + output: function(xy) { + return xy && [xy[0][1], xy[1][1]]; + } +}; +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { + return xy == null ? null : number2(xy); + }, + output: function(xy) { + return xy; + } +}; +function type(t) { + return { type: t }; +} + +// node_modules/d3-force/src/center.js +function center_default(x2, y2) { + var nodes, strength = 1; + if (x2 == null) + x2 = 0; + if (y2 == null) + y2 = 0; + function force() { + var i, n = nodes.length, node, sx = 0, sy = 0; + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + for (sx = (sx / n - x2) * strength, sy = (sy / n - y2) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + force.initialize = function(_) { + nodes = _; + }; + force.x = function(_) { + return arguments.length ? (x2 = +_, force) : x2; + }; + force.y = function(_) { + return arguments.length ? (y2 = +_, force) : y2; + }; + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + return force; +} + +// node_modules/d3-quadtree/src/add.js +function add_default(d) { + const x2 = +this._x.call(null, d), y2 = +this._y.call(null, d); + return add(this.cover(x2, y2), x2, y2, d); +} +function add(tree, x2, y2, d) { + if (isNaN(x2) || isNaN(y2)) + return tree; + var parent, node = tree._root, leaf = { data: d }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j; + if (!node) + return tree._root = leaf, tree; + while (node.length) { + if (right = x2 >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y2 >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) + return parent[i] = leaf, tree; + } + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x2 === xp && y2 === yp) + return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x2 >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y2 >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm)); + return parent[j] = node, parent[i] = leaf, tree; +} +function addAll(data) { + var d, i, n = data.length, x2, y2, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity; + for (i = 0; i < n; ++i) { + if (isNaN(x2 = +this._x.call(null, d = data[i])) || isNaN(y2 = +this._y.call(null, d))) + continue; + xz[i] = x2; + yz[i] = y2; + if (x2 < x0) + x0 = x2; + if (x2 > x1) + x1 = x2; + if (y2 < y0) + y0 = y2; + if (y2 > y1) + y1 = y2; + } + if (x0 > x1 || y0 > y1) + return this; + this.cover(x0, y0).cover(x1, y1); + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + return this; +} + +// node_modules/d3-quadtree/src/cover.js +function cover_default(x2, y2) { + if (isNaN(x2 = +x2) || isNaN(y2 = +y2)) + return this; + var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1; + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x2)) + 1; + y1 = (y0 = Math.floor(y2)) + 1; + } else { + var z = x1 - x0 || 1, node = this._root, parent, i; + while (x0 > x2 || x2 >= x1 || y0 > y2 || y2 >= y1) { + i = (y2 < y0) << 1 | x2 < x0; + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + if (this._root && this._root.length) + this._root = node; + } + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +// node_modules/d3-quadtree/src/data.js +function data_default2() { + var data = []; + this.visit(function(node) { + if (!node.length) + do + data.push(node.data); + while (node = node.next); + }); + return data; +} + +// node_modules/d3-quadtree/src/extent.js +function extent_default(_) { + return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +// node_modules/d3-quadtree/src/quad.js +function quad_default(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +// node_modules/d3-quadtree/src/find.js +function find_default(x2, y2, radius) { + var data, x0 = this._x0, y0 = this._y0, x1, y1, x22, y22, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i; + if (node) + quads.push(new quad_default(node, x0, y0, x3, y3)); + if (radius == null) + radius = Infinity; + else { + x0 = x2 - radius, y0 = y2 - radius; + x3 = x2 + radius, y3 = y2 + radius; + radius *= radius; + } + while (q = quads.pop()) { + if (!(node = q.node) || (x1 = q.x0) > x3 || (y1 = q.y0) > y3 || (x22 = q.x1) < x0 || (y22 = q.y1) < y0) + continue; + if (node.length) { + var xm = (x1 + x22) / 2, ym = (y1 + y22) / 2; + quads.push( + new quad_default(node[3], xm, ym, x22, y22), + new quad_default(node[2], x1, ym, xm, y22), + new quad_default(node[1], xm, y1, x22, ym), + new quad_default(node[0], x1, y1, xm, ym) + ); + if (i = (y2 >= ym) << 1 | x2 >= xm) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } else { + var dx = x2 - +this._x.call(null, node.data), dy = y2 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x2 - d, y0 = y2 - d; + x3 = x2 + d, y3 = y2 + d; + data = node.data; + } + } + } + return data; +} + +// node_modules/d3-quadtree/src/remove.js +function remove_default3(d) { + if (isNaN(x2 = +this._x.call(null, d)) || isNaN(y2 = +this._y.call(null, d))) + return this; + var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x2, y2, xm, ym, right, bottom, i, j; + if (!node) + return this; + if (node.length) + while (true) { + if (right = x2 >= (xm = (x0 + x1) / 2)) + x0 = xm; + else + x1 = xm; + if (bottom = y2 >= (ym = (y0 + y1) / 2)) + y0 = ym; + else + y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) + return this; + if (!node.length) + break; + if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) + retainer = parent, j = i; + } + while (node.data !== d) + if (!(previous = node, node = node.next)) + return this; + if (next = node.next) + delete node.next; + if (previous) + return next ? previous.next = next : delete previous.next, this; + if (!parent) + return this._root = next, this; + next ? parent[i] = next : delete parent[i]; + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) { + if (retainer) + retainer[j] = node; + else + this._root = node; + } + return this; +} +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) + this.remove(data[i]); + return this; +} + +// node_modules/d3-quadtree/src/root.js +function root_default() { + return this._root; +} + +// node_modules/d3-quadtree/src/size.js +function size_default2() { + var size = 0; + this.visit(function(node) { + if (!node.length) + do + ++size; + while (node = node.next); + }); + return size; +} + +// node_modules/d3-quadtree/src/visit.js +function visit_default(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) + quads.push(new quad_default(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) + quads.push(new quad_default(child, xm, ym, x1, y1)); + if (child = node[2]) + quads.push(new quad_default(child, x0, ym, xm, y1)); + if (child = node[1]) + quads.push(new quad_default(child, xm, y0, x1, ym)); + if (child = node[0]) + quads.push(new quad_default(child, x0, y0, xm, ym)); + } + } + return this; +} + +// node_modules/d3-quadtree/src/visitAfter.js +function visitAfter_default(callback) { + var quads = [], next = [], q; + if (this._root) + quads.push(new quad_default(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) + quads.push(new quad_default(child, x0, y0, xm, ym)); + if (child = node[1]) + quads.push(new quad_default(child, xm, y0, x1, ym)); + if (child = node[2]) + quads.push(new quad_default(child, x0, ym, xm, y1)); + if (child = node[3]) + quads.push(new quad_default(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +// node_modules/d3-quadtree/src/x.js +function defaultX(d) { + return d[0]; +} +function x_default(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +// node_modules/d3-quadtree/src/y.js +function defaultY(d) { + return d[1]; +} +function y_default(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +// node_modules/d3-quadtree/src/quadtree.js +function quadtree(nodes, x2, y2) { + var tree = new Quadtree(x2 == null ? defaultX : x2, y2 == null ? defaultY : y2, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} +function Quadtree(x2, y2, x0, y0, x1, y1) { + this._x = x2; + this._y = y2; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = void 0; +} +function leaf_copy(leaf) { + var copy = { data: leaf.data }, next = copy; + while (leaf = leaf.next) + next = next.next = { data: leaf.data }; + return copy; +} +var treeProto = quadtree.prototype = Quadtree.prototype; +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child; + if (!node) + return copy; + if (!node.length) + return copy._root = leaf_copy(node), copy; + nodes = [{ source: node, target: copy._root = new Array(4) }]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) + nodes.push({ source: child, target: node.target[i] = new Array(4) }); + else + node.target[i] = leaf_copy(child); + } + } + } + return copy; +}; +treeProto.add = add_default; +treeProto.addAll = addAll; +treeProto.cover = cover_default; +treeProto.data = data_default2; +treeProto.extent = extent_default; +treeProto.find = find_default; +treeProto.remove = remove_default3; +treeProto.removeAll = removeAll; +treeProto.root = root_default; +treeProto.size = size_default2; +treeProto.visit = visit_default; +treeProto.visitAfter = visitAfter_default; +treeProto.x = x_default; +treeProto.y = y_default; + +// node_modules/d3-force/src/constant.js +function constant_default5(x2) { + return function() { + return x2; + }; +} + +// node_modules/d3-force/src/jiggle.js +function jiggle_default(random) { + return (random() - 0.5) * 1e-6; +} + +// node_modules/d3-force/src/link.js +function index(d) { + return d.index; +} +function find2(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) + throw new Error("node not found: " + nodeId); + return node; +} +function link_default(links) { + var id2 = index, strength = defaultStrength, strengths, distance = constant_default5(30), distances, nodes, count, bias, random, iterations = 1; + if (links == null) + links = []; + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x2, y2, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x2 = target.x + target.vx - source.x - source.vx || jiggle_default(random); + y2 = target.y + target.vy - source.y - source.vy || jiggle_default(random); + l = Math.sqrt(x2 * x2 + y2 * y2); + l = (l - distances[i]) / l * alpha * strengths[i]; + x2 *= l, y2 *= l; + target.vx -= x2 * (b = bias[i]); + target.vy -= y2 * b; + source.vx += x2 * (b = 1 - b); + source.vy += y2 * b; + } + } + } + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link; + for (i = 0, count = new Array(n); i < m2; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") + link.source = find2(nodeById, link.source); + if (typeof link.target !== "object") + link.target = find2(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + for (i = 0, bias = new Array(m2); i < m2; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + strengths = new Array(m2), initializeStrength(); + distances = new Array(m2), initializeDistance(); + } + function initializeStrength() { + if (!nodes) + return; + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + function initializeDistance() { + if (!nodes) + return; + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + force.id = function(_) { + return arguments.length ? (id2 = _, force) : id2; + }; + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initializeStrength(), force) : strength; + }; + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant_default5(+_), initializeDistance(), force) : distance; + }; + return force; +} + +// node_modules/d3-force/src/lcg.js +var a = 1664525; +var c = 1013904223; +var m = 4294967296; +function lcg_default() { + let s = 1; + return () => (s = (a * s + c) % m) / m; +} + +// node_modules/d3-force/src/simulation.js +function x(d) { + return d.x; +} +function y(d) { + return d.y; +} +var initialRadius = 10; +var initialAngle = Math.PI * (3 - Math.sqrt(5)); +function simulation_default(nodes) { + var simulation, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer(step), event = dispatch_default("tick", "end"), random = lcg_default(); + if (nodes == null) + nodes = []; + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + function tick(iterations) { + var i, n = nodes.length, node; + if (iterations === void 0) + iterations = 1; + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + forces.forEach(function(force) { + force(alpha); + }); + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) + node.x += node.vx *= velocityDecay; + else + node.x = node.fx, node.vx = 0; + if (node.fy == null) + node.y += node.vy *= velocityDecay; + else + node.y = node.fy, node.vy = 0; + } + } + return simulation; + } + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) + node.x = node.fx; + if (node.fy != null) + node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + function initializeForce(force) { + if (force.initialize) + force.initialize(nodes, random); + return force; + } + initializeNodes(); + return simulation = { + tick, + restart: function() { + return stepper.restart(step), simulation; + }, + stop: function() { + return stepper.stop(), simulation; + }, + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + force: function(name, _) { + return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name); + }, + find: function(x2, y2, radius) { + var i = 0, n = nodes.length, dx, dy, d2, node, closest; + if (radius == null) + radius = Infinity; + else + radius *= radius; + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x2 - node.x; + dy = y2 - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) + closest = node, radius = d2; + } + return closest; + }, + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +// node_modules/d3-force/src/manyBody.js +function manyBody_default() { + var nodes, node, random, alpha, strength = constant_default5(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81; + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) + node = nodes[i], tree.visit(apply); + } + function initialize() { + if (!nodes) + return; + var i, n = nodes.length, node2; + strengths = new Array(n); + for (i = 0; i < n; ++i) + node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes); + } + function accumulate(quad) { + var strength2 = 0, q, c2, weight = 0, x2, y2, i; + if (quad.length) { + for (x2 = y2 = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c2 = Math.abs(q.value))) { + strength2 += q.value, weight += c2, x2 += c2 * q.x, y2 += c2 * q.y; + } + } + quad.x = x2 / weight; + quad.y = y2 / weight; + } else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do + strength2 += strengths[q.data.index]; + while (q = q.next); + } + quad.value = strength2; + } + function apply(quad, x1, _, x2) { + if (!quad.value) + return true; + var x3 = quad.x - node.x, y2 = quad.y - node.y, w = x2 - x1, l = x3 * x3 + y2 * y2; + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x3 === 0) + x3 = jiggle_default(random), l += x3 * x3; + if (y2 === 0) + y2 = jiggle_default(random), l += y2 * y2; + if (l < distanceMin2) + l = Math.sqrt(distanceMin2 * l); + node.vx += x3 * quad.value * alpha / l; + node.vy += y2 * quad.value * alpha / l; + } + return true; + } else if (quad.length || l >= distanceMax2) + return; + if (quad.data !== node || quad.next) { + if (x3 === 0) + x3 = jiggle_default(random), l += x3 * x3; + if (y2 === 0) + y2 = jiggle_default(random), l += y2 * y2; + if (l < distanceMin2) + l = Math.sqrt(distanceMin2 * l); + } + do + if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x3 * w; + node.vy += y2 * w; + } + while (quad = quad.next); + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength; + }; + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + return force; +} + +// node_modules/d3-zoom/src/constant.js +var constant_default6 = (x2) => () => x2; + +// node_modules/d3-zoom/src/event.js +function ZoomEvent(type2, { + sourceEvent, + target, + transform: transform2, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type2, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + transform: { value: transform2, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} + +// node_modules/d3-zoom/src/transform.js +function Transform(k, x2, y2) { + this.k = k; + this.x = x2; + this.y = y2; +} +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x2, y2) { + return x2 === 0 & y2 === 0 ? this : new Transform(this.k, this.x + this.k * x2, this.y + this.k * y2); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x2) { + return x2 * this.k + this.x; + }, + applyY: function(y2) { + return y2 * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x2) { + return (x2 - this.x) / this.k; + }, + invertY: function(y2) { + return (y2 - this.y) / this.k; + }, + rescaleX: function(x2) { + return x2.copy().domain(x2.range().map(this.invertX, this).map(x2.invert, x2)); + }, + rescaleY: function(y2) { + return y2.copy().domain(y2.range().map(this.invertY, this).map(y2.invert, y2)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; +var identity2 = new Transform(1, 0, 0); +transform.prototype = Transform.prototype; +function transform(node) { + while (!node.__zoom) + if (!(node = node.parentNode)) + return identity2; + return node.__zoom; +} + +// node_modules/d3-zoom/src/noevent.js +function nopropagation3(event) { + event.stopImmediatePropagation(); +} +function noevent_default3(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-zoom/src/zoom.js +function defaultFilter2(event) { + return (!event.ctrlKey || event.type === "wheel") && !event.button; +} +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} +function defaultTransform() { + return this.__zoom || identity2; +} +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1); +} +function defaultTouchable2() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function defaultConstrain(transform2, extent, translateExtent) { + var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1]; + return transform2.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} +function zoom_default2() { + var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10; + function zoom(selection2) { + selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + zoom.transform = function(collection, transform2, point, event) { + var selection2 = collection.selection ? collection.selection() : collection; + selection2.property("__zoom", defaultTransform); + if (collection !== selection2) { + schedule(collection, transform2, point, event); + } else { + selection2.interrupt().each(function() { + gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(); + }); + } + }; + zoom.scaleBy = function(selection2, k, p, event) { + zoom.scaleTo(selection2, function() { + var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + zoom.scaleTo = function(selection2, k, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + zoom.translateBy = function(selection2, x2, y2, event) { + zoom.transform(selection2, function() { + return constrain(this.__zoom.translate( + typeof x2 === "function" ? x2.apply(this, arguments) : x2, + typeof y2 === "function" ? y2.apply(this, arguments) : y2 + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + zoom.translateTo = function(selection2, x2, y2, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity2.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x2 === "function" ? -x2.apply(this, arguments) : -x2, + typeof y2 === "function" ? -y2.apply(this, arguments) : -y2 + ), e, translateExtent); + }, p, event); + }; + function scale(transform2, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); + } + function translate(transform2, p0, p1) { + var x2 = p0[0] - p1[0] * transform2.k, y2 = p0[1] - p1[1] * transform2.k; + return x2 === transform2.x && y2 === transform2.y ? transform2 : new Transform(transform2.k, x2, y2); + } + function centroid(extent2) { + return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; + } + function schedule(transition2, transform2, point, event) { + transition2.on("start.zoom", function() { + gesture(this, arguments).event(event).start(); + }).on("interrupt.zoom end.zoom", function() { + gesture(this, arguments).event(event).end(); + }).tween("zoom", function() { + var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a2 = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a2.invert(p).concat(w / a2.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) + t = b; + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + function gesture(that, args, clean) { + return !clean && that.__zooming || new Gesture(that, args); + } + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + Gesture.prototype = { + event: function(event) { + if (event) + this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform2) { + if (this.mouse && key !== "mouse") + this.mouse[1] = transform2.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") + this.touch0[1] = transform2.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") + this.touch1[1] = transform2.invert(this.touch1[0]); + this.that.__zoom = transform2; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type2) { + var d = select_default2(this.that).datum(); + listeners.call( + type2, + this.that, + new ZoomEvent(type2, { + sourceEvent: this.sourceEvent, + target: zoom, + type: type2, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + function wheeled(event, ...args) { + if (!filter2.apply(this, arguments)) + return; + var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event); + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } else if (t.k === k) + return; + else { + g.mouse = [p, t.invert(p)]; + interrupt_default(this); + g.start(); + } + noevent_default3(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function wheelidled() { + g.wheel = null; + g.end(); + } + } + function mousedowned(event, ...args) { + if (touchending || !filter2.apply(this, arguments)) + return; + var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x0 = event.clientX, y0 = event.clientY; + nodrag_default(event.view); + nopropagation3(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt_default(this); + g.start(); + function mousemoved(event2) { + noevent_default3(event2); + if (!g.moved) { + var dx = event2.clientX - x0, dy = event2.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + function mouseupped(event2) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event2.view, g.moved); + noevent_default3(event2); + g.event(event2).end(); + } + } + function dblclicked(event, ...args) { + if (!filter2.apply(this, arguments)) + return; + var t0 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + noevent_default3(event); + if (duration > 0) + select_default2(this).transition().duration(duration).call(schedule, t1, p0, event); + else + select_default2(this).call(zoom.transform, t1, p0, event); + } + function touchstarted(event, ...args) { + if (!filter2.apply(this, arguments)) + return; + var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p; + nopropagation3(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) + g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) + g.touch1 = p, g.taps = 0; + } + if (touchstarting) + touchstarting = clearTimeout(touchstarting); + if (started) { + if (g.taps < 2) + touchfirst = p[0], touchstarting = setTimeout(function() { + touchstarting = null; + }, touchDelay); + interrupt_default(this); + g.start(); + } + } + function touchmoved(event, ...args) { + if (!this.__zooming) + return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l; + noevent_default3(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) + g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) + g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) + p = g.touch0[0], l = g.touch0[1]; + else + return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + function touchended(event, ...args) { + if (!this.__zooming) + return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t; + nopropagation3(event); + if (touchending) + clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) + delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) + delete g.touch1; + } + if (g.touch1 && !g.touch0) + g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) + g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + if (g.taps === 2) { + t = pointer_default(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select_default2(this).on("dblclick.zoom"); + if (p) + p.apply(this, arguments); + } + } + } + } + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default6(+_), zoom) : wheelDelta; + }; + zoom.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default6(!!_), zoom) : filter2; + }; + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default6(!!_), zoom) : touchable; + }; + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default6([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + return zoom; +} + +// quartz/components/scripts/util.ts +function registerEscapeHandler(outsideContainer, cb) { + if (!outsideContainer) + return; + function click(e) { + if (e.target !== this) + return; + e.preventDefault(); + cb(); + } + function esc(e) { + if (!e.key.startsWith("Esc")) + return; + e.preventDefault(); + cb(); + } + outsideContainer?.removeEventListener("click", click); + outsideContainer?.addEventListener("click", click); + document.removeEventListener("keydown", esc); + document.addEventListener("keydown", esc); +} +function removeAllChildren(node) { + while (node.firstChild) { + node.removeChild(node.firstChild); + } +} + +// node_modules/github-slugger/index.js +var own = Object.hasOwnProperty; + +// quartz/util/path.ts +function getFullSlug(window2) { + const res = window2.document.body.dataset.slug; + return res; +} +function simplifySlug(fp) { + return _stripSlashes(_trimSuffix(fp, "index"), true); +} +function pathToRoot(slug2) { + let rootPath = slug2.split("/").filter((x2) => x2 !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) { + rootPath = "."; + } + return rootPath; +} +function resolveRelative(current, target) { + const res = joinSegments(pathToRoot(current), simplifySlug(target)); + return res; +} +function joinSegments(...args) { + return args.filter((segment) => segment !== "").join("/").replace(/\\/\\/+/g, "/"); +} +function _endsWith(s, suffix) { + return s === suffix || s.endsWith("/" + suffix); +} +function _trimSuffix(s, suffix) { + if (_endsWith(s, suffix)) { + s = s.slice(0, -suffix.length); + } + return s; +} +function _stripSlashes(s, onlyStripPrefix) { + if (s.startsWith("/")) { + s = s.substring(1); + } + if (!onlyStripPrefix && s.endsWith("/")) { + s = s.slice(0, -1); + } + return s; +} + +// quartz/components/scripts/quartz/components/scripts/graph.inline.ts +var localStorageKey = "graph-visited"; +function getVisited() { + return new Set(JSON.parse(localStorage.getItem(localStorageKey) ?? "[]")); +} +function addToVisited(slug2) { + const visited = getVisited(); + visited.add(slug2); + localStorage.setItem(localStorageKey, JSON.stringify([...visited])); +} +async function renderGraph(container, fullSlug) { + const slug2 = simplifySlug(fullSlug); + const visited = getVisited(); + const graph = document.getElementById(container); + if (!graph) + return; + removeAllChildren(graph); + let { + drag: enableDrag, + zoom: enableZoom, + depth, + scale, + repelForce, + centerForce, + linkDistance, + fontSize, + opacityScale, + removeTags, + showTags + } = JSON.parse(graph.dataset["cfg"]); + const data = await fetchData; + const links = []; + const tags = []; + const validLinks = new Set(Object.keys(data).map((slug3) => simplifySlug(slug3))); + for (const [src, details] of Object.entries(data)) { + const source = simplifySlug(src); + const outgoing = details.links ?? []; + for (const dest of outgoing) { + if (validLinks.has(dest)) { + links.push({ source, target: dest }); + } + } + if (showTags) { + const localTags = details.tags.filter((tag) => !removeTags.includes(tag)).map((tag) => simplifySlug("tags/" + tag)); + tags.push(...localTags.filter((tag) => !tags.includes(tag))); + for (const tag of localTags) { + links.push({ source, target: tag }); + } + } + } + const neighbourhood = /* @__PURE__ */ new Set(); + const wl = [slug2, "__SENTINEL"]; + if (depth >= 0) { + while (depth >= 0 && wl.length > 0) { + const cur = wl.shift(); + if (cur === "__SENTINEL") { + depth--; + wl.push("__SENTINEL"); + } else { + neighbourhood.add(cur); + const outgoing = links.filter((l) => l.source === cur); + const incoming = links.filter((l) => l.target === cur); + wl.push(...outgoing.map((l) => l.target), ...incoming.map((l) => l.source)); + } + } + } else { + Object.keys(data).forEach((id2) => neighbourhood.add(simplifySlug(id2))); + if (showTags) + tags.forEach((tag) => neighbourhood.add(tag)); + } + const graphData = { + nodes: [...neighbourhood].map((url) => { + const text = url.startsWith("tags/") ? "#" + url.substring(5) : data[url]?.title ?? url; + return { + id: url, + text, + tags: data[url]?.tags ?? [] + }; + }), + links: links.filter((l) => neighbourhood.has(l.source) && neighbourhood.has(l.target)) + }; + const simulation = simulation_default(graphData.nodes).force("charge", manyBody_default().strength(-100 * repelForce)).force( + "link", + link_default(graphData.links).id((d) => d.id).distance(linkDistance) + ).force("center", center_default().strength(centerForce)); + const height = Math.max(graph.offsetHeight, 250); + const width = graph.offsetWidth; + const svg = select_default2("#" + container).append("svg").attr("width", width).attr("height", height).attr("viewBox", [-width / 2 / scale, -height / 2 / scale, width / scale, height / scale]); + const link = svg.append("g").selectAll("line").data(graphData.links).join("line").attr("class", "link").attr("stroke", "var(--lightgray)").attr("stroke-width", 1); + const graphNode = svg.append("g").selectAll("g").data(graphData.nodes).enter().append("g"); + const color2 = (d) => { + const isCurrent = d.id === slug2; + if (isCurrent) { + return "var(--secondary)"; + } else if (visited.has(d.id) || d.id.startsWith("tags/")) { + return "var(--tertiary)"; + } else { + return "var(--gray)"; + } + }; + const drag = (simulation2) => { + function dragstarted(event, d) { + if (!event.active) + simulation2.alphaTarget(1).restart(); + d.fx = d.x; + d.fy = d.y; + } + function dragged(event, d) { + d.fx = event.x; + d.fy = event.y; + } + function dragended(event, d) { + if (!event.active) + simulation2.alphaTarget(0); + d.fx = null; + d.fy = null; + } + const noop2 = () => { + }; + return drag_default().on("start", enableDrag ? dragstarted : noop2).on("drag", enableDrag ? dragged : noop2).on("end", enableDrag ? dragended : noop2); + }; + function nodeRadius(d) { + const numLinks = links.filter((l) => l.source.id === d.id || l.target.id === d.id).length; + return 2 + Math.sqrt(numLinks); + } + const node = graphNode.append("circle").attr("class", "node").attr("id", (d) => d.id).attr("r", nodeRadius).attr("fill", color2).style("cursor", "pointer").on("click", (_, d) => { + const targ = resolveRelative(fullSlug, d.id); + window.spaNavigate(new URL(targ, window.location.toString())); + }).on("mouseover", function(_, d) { + const neighbours = data[fullSlug].links ?? []; + const neighbourNodes = selectAll_default2(".node").filter((d2) => neighbours.includes(d2.id)); + const currentId = d.id; + const linkNodes = selectAll_default2(".link").filter((d2) => d2.source.id === currentId || d2.target.id === currentId); + neighbourNodes.transition().duration(200).attr("fill", color2); + linkNodes.transition().duration(200).attr("stroke", "var(--gray)").attr("stroke-width", 1); + const bigFont = fontSize * 1.5; + const parent = this.parentNode; + select_default2(parent).raise().select("text").transition().duration(200).attr("opacityOld", select_default2(parent).select("text").style("opacity")).style("opacity", 1).style("font-size", bigFont + "em"); + }).on("mouseleave", function(_, d) { + const currentId = d.id; + const linkNodes = selectAll_default2(".link").filter((d2) => d2.source.id === currentId || d2.target.id === currentId); + linkNodes.transition().duration(200).attr("stroke", "var(--lightgray)"); + const parent = this.parentNode; + select_default2(parent).select("text").transition().duration(200).style("opacity", select_default2(parent).select("text").attr("opacityOld")).style("font-size", fontSize + "em"); + }).call(drag(simulation)); + const labels = graphNode.append("text").attr("dx", 0).attr("dy", (d) => -nodeRadius(d) + "px").attr("text-anchor", "middle").text((d) => d.text).style("opacity", (opacityScale - 1) / 3.75).style("pointer-events", "none").style("font-size", fontSize + "em").raise().call(drag(simulation)); + if (enableZoom) { + svg.call( + zoom_default2().extent([ + [0, 0], + [width, height] + ]).scaleExtent([0.25, 4]).on("zoom", ({ transform: transform2 }) => { + link.attr("transform", transform2); + node.attr("transform", transform2); + const scale2 = transform2.k * opacityScale; + const scaledOpacity = Math.max((scale2 - 1) / 3.75, 0); + labels.attr("transform", transform2).style("opacity", scaledOpacity); + }) + ); + } + simulation.on("tick", () => { + link.attr("x1", (d) => d.source.x).attr("y1", (d) => d.source.y).attr("x2", (d) => d.target.x).attr("y2", (d) => d.target.y); + node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); + labels.attr("x", (d) => d.x).attr("y", (d) => d.y); + }); +} +function renderGlobalGraph() { + const slug2 = getFullSlug(window); + const container = document.getElementById("global-graph-outer"); + const sidebar = container?.closest(".sidebar"); + container?.classList.add("active"); + if (sidebar) { + sidebar.style.zIndex = "1"; + } + renderGraph("global-graph-container", slug2); + function hideGlobalGraph() { + container?.classList.remove("active"); + const graph = document.getElementById("global-graph-container"); + if (sidebar) { + sidebar.style.zIndex = "unset"; + } + if (!graph) + return; + removeAllChildren(graph); + } + registerEscapeHandler(container, hideGlobalGraph); +} +document.addEventListener("nav", async (e) => { + const slug2 = e.detail.url; + addToVisited(slug2); + await renderGraph("graph-container", slug2); + const containerIcon = document.getElementById("global-graph-icon"); + containerIcon?.removeEventListener("click", renderGlobalGraph); + containerIcon?.addEventListener("click", renderGlobalGraph); +}); +`;var graph_default=` +.graph > h3 { + font-size: 1rem; + margin: 0; +} +.graph > .graph-outer { + border-radius: 5px; + border: 1px solid var(--lightgray); + box-sizing: border-box; + height: 250px; + margin: 0.5em 0; + position: relative; + overflow: hidden; +} +.graph > .graph-outer > #global-graph-icon { + color: var(--dark); + opacity: 0.5; + width: 18px; + height: 18px; + position: absolute; + padding: 0.2rem; + margin: 0.3rem; + top: 0; + right: 0; + border-radius: 4px; + background-color: transparent; + transition: background-color 0.5s ease; + cursor: pointer; +} +.graph > .graph-outer > #global-graph-icon:hover { + background-color: var(--lightgray); +} +.graph > #global-graph-outer { + position: fixed; + z-index: 9999; + left: 0; + top: 0; + width: 100vw; + height: 100%; + backdrop-filter: blur(4px); + display: none; + overflow: hidden; +} +.graph > #global-graph-outer.active { + display: inline-block; +} +.graph > #global-graph-outer > #global-graph-container { + border: 1px solid var(--lightgray); + background-color: var(--light); + border-radius: 5px; + box-sizing: border-box; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 60vh; + width: 50vw; +} +@media all and (max-width: 1510px) { + .graph > #global-graph-outer > #global-graph-container { + width: 90%; + } +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiZ3JhcGguc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHRTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUNBO0VBQ0U7O0FBS047RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBWkY7SUFhSSIsInNvdXJjZXNDb250ZW50IjpbIkB1c2UgXCIuLi8uLi9zdHlsZXMvdmFyaWFibGVzLnNjc3NcIiBhcyAqO1xuXG4uZ3JhcGgge1xuICAmID4gaDMge1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICAmID4gLmdyYXBoLW91dGVyIHtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGlnaHRncmF5KTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGhlaWdodDogMjUwcHg7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICAgJiA+ICNnbG9iYWwtZ3JhcGgtaWNvbiB7XG4gICAgICBjb2xvcjogdmFyKC0tZGFyayk7XG4gICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICB3aWR0aDogMThweDtcbiAgICAgIGhlaWdodDogMThweDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHBhZGRpbmc6IDAuMnJlbTtcbiAgICAgIG1hcmdpbjogMC4zcmVtO1xuICAgICAgdG9wOiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC41cyBlYXNlO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0Z3JheSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJiA+ICNnbG9iYWwtZ3JhcGgtb3V0ZXIge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB6LWluZGV4OiA5OTk5O1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDB2dztcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICAgJi5hY3RpdmUge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cblxuICAgICYgPiAjZ2xvYmFsLWdyYXBoLWNvbnRhaW5lciB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saWdodGdyYXkpO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQpO1xuICAgICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogNTAlO1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICBoZWlnaHQ6IDYwdmg7XG4gICAgICB3aWR0aDogNTB2dztcblxuICAgICAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJGZ1bGxQYWdlV2lkdGgpIHtcbiAgICAgICAgd2lkdGg6IDkwJTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ== */`;import{jsx as jsx22,jsxs as jsxs12}from"preact/jsx-runtime";var defaultOptions10={localGraph:{drag:!0,zoom:!0,depth:1,scale:1.1,repelForce:.5,centerForce:.3,linkDistance:30,fontSize:.6,opacityScale:1,showTags:!0,removeTags:[]},globalGraph:{drag:!0,zoom:!0,depth:-1,scale:.9,repelForce:.5,centerForce:.3,linkDistance:30,fontSize:.6,opacityScale:1,showTags:!0,removeTags:[]}},Graph_default=__name(opts=>{function Graph({displayClass}){let localGraph={...defaultOptions10.localGraph,...opts?.localGraph},globalGraph={...defaultOptions10.globalGraph,...opts?.globalGraph};return jsxs12("div",{class:`graph ${displayClass??""}`,children:[jsx22("h3",{children:"Graph View"}),jsxs12("div",{class:"graph-outer",children:[jsx22("div",{id:"graph-container","data-cfg":JSON.stringify(localGraph)}),jsx22("svg",{version:"1.1",id:"global-graph-icon",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 55 55",fill:"currentColor",xmlSpace:"preserve",children:jsx22("path",{d:`M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17 + s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4 + c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562 + C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829 + c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91 + v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4 + s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665 + C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2 + S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4 + s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2 + s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z`})})]}),jsx22("div",{id:"global-graph-outer",children:jsx22("div",{id:"global-graph-container","data-cfg":JSON.stringify(globalGraph)})})]})}return __name(Graph,"Graph"),Graph.css=graph_default,Graph.afterDOMLoaded=graph_inline_default,Graph},"default");var backlinks_default=` +.backlinks { + position: relative; +} +.backlinks > h3 { + font-size: 1rem; + margin: 0; +} +.backlinks > ul { + list-style: none; + padding: 0; + margin: 0.5rem 0; +} +.backlinks > ul > li > a { + background-color: transparent; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiYmFja2xpbmtzLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRTs7QUFFQTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7O0FBR0U7RUFDRSIsInNvdXJjZXNDb250ZW50IjpbIi5iYWNrbGlua3Mge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgJiA+IGgzIHtcbiAgICBmb250LXNpemU6IDFyZW07XG4gICAgbWFyZ2luOiAwO1xuICB9XG5cbiAgJiA+IHVsIHtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgbWFyZ2luOiAwLjVyZW0gMDtcblxuICAgICYgPiBsaSB7XG4gICAgICAmID4gYSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19 */`;import{jsx as jsx23,jsxs as jsxs13}from"preact/jsx-runtime";function Backlinks({fileData,allFiles,displayClass}){let slug2=simplifySlug(fileData.slug),backlinkFiles=allFiles.filter(file=>file.links?.includes(slug2));return jsxs13("div",{class:`backlinks ${displayClass??""}`,children:[jsx23("h3",{children:"Backlinks"}),jsx23("ul",{class:"overflow",children:backlinkFiles.length>0?backlinkFiles.map(f=>jsx23("li",{children:jsx23("a",{href:resolveRelative(fileData.slug,f.slug),class:"internal",children:f.frontmatter?.title})})):jsx23("li",{children:"No backlinks found"})})]})}__name(Backlinks,"Backlinks");Backlinks.css=backlinks_default;var Backlinks_default=__name(()=>Backlinks,"default");var search_default=` +.search { + min-width: fit-content; + max-width: 14rem; + flex-grow: 0.3; +} +.search > #search-icon { + background-color: var(--lightgray); + border-radius: 4px; + height: 2rem; + display: flex; + align-items: center; + cursor: pointer; + white-space: nowrap; +} +.search > #search-icon > div { + flex-grow: 1; +} +.search > #search-icon > p { + display: inline; + padding: 0 1rem; +} +.search > #search-icon svg { + cursor: pointer; + width: 18px; + min-width: 18px; + margin: 0 0.5rem; +} +.search > #search-icon svg .search-path { + stroke: var(--darkgray); + stroke-width: 2px; + transition: stroke 0.5s ease; +} +.search > #search-container { + position: fixed; + contain: layout; + z-index: 999; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + overflow-y: auto; + display: none; + backdrop-filter: blur(4px); +} +.search > #search-container.active { + display: inline-block; +} +.search > #search-container > #search-space { + width: 50%; + margin-top: 15vh; + margin-left: auto; + margin-right: auto; +} +@media all and (max-width: 1510px) { + .search > #search-container > #search-space { + width: 90%; + } +} +.search > #search-container > #search-space > * { + width: 100%; + border-radius: 5px; + background: var(--light); + box-shadow: 0 14px 50px rgba(27, 33, 48, 0.12), 0 10px 30px rgba(27, 33, 48, 0.16); + margin-bottom: 2em; +} +.search > #search-container > #search-space > input { + box-sizing: border-box; + padding: 0.5em 1em; + font-family: var(--bodyFont); + color: var(--dark); + font-size: 1.1em; + border: 1px solid var(--lightgray); +} +.search > #search-container > #search-space > input:focus { + outline: none; +} +.search > #search-container > #search-space > #results-container .result-card { + padding: 1em; + cursor: pointer; + transition: background 0.2s ease; + border: 1px solid var(--lightgray); + border-bottom: none; + width: 100%; + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; + text-transform: none; + text-align: left; + background: var(--light); + outline: none; +} +.search > #search-container > #search-space > #results-container .result-card .highlight { + color: var(--secondary); + font-weight: 700; +} +.search > #search-container > #search-space > #results-container .result-card:hover, .search > #search-container > #search-space > #results-container .result-card:focus { + background: var(--lightgray); +} +.search > #search-container > #search-space > #results-container .result-card:first-of-type { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +.search > #search-container > #search-space > #results-container .result-card:last-of-type { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-bottom: 1px solid var(--lightgray); +} +.search > #search-container > #search-space > #results-container .result-card > h3 { + margin: 0; +} +.search > #search-container > #search-space > #results-container .result-card > ul > li { + margin: 0; + display: inline-block; + white-space: nowrap; + margin: 0; + overflow-wrap: normal; +} +.search > #search-container > #search-space > #results-container .result-card > ul { + list-style: none; + display: flex; + padding-left: 0; + gap: 0.4rem; + margin: 0; + margin-top: 0.45rem; + margin-left: -2px; + overflow: hidden; + background-clip: border-box; +} +.search > #search-container > #search-space > #results-container .result-card > ul > li > p { + border-radius: 8px; + background-color: var(--highlight); + overflow: hidden; + background-clip: border-box; + padding: 0.03rem 0.4rem; + margin: 0; + color: var(--secondary); + opacity: 0.85; +} +.search > #search-container > #search-space > #results-container .result-card > ul > li > .match-tag { + color: var(--tertiary); + font-weight: bold; + opacity: 1; +} +.search > #search-container > #search-space > #results-container .result-card > p { + margin-bottom: 0; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsic2VhcmNoLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBOztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBTkY7SUFPSTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQSxZQUNFO0VBRUY7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUdGO0VBRUU7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7QUFHRjtFQUNFIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcIi4uLy4uL3N0eWxlcy92YXJpYWJsZXMuc2Nzc1wiIGFzICo7XG5cbi5zZWFyY2gge1xuICBtaW4td2lkdGg6IGZpdC1jb250ZW50O1xuICBtYXgtd2lkdGg6IDE0cmVtO1xuICBmbGV4LWdyb3c6IDAuMztcblxuICAmID4gI3NlYXJjaC1pY29uIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodGdyYXkpO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBoZWlnaHQ6IDJyZW07XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuXG4gICAgJiA+IGRpdiB7XG4gICAgICBmbGV4LWdyb3c6IDE7XG4gICAgfVxuXG4gICAgJiA+IHAge1xuICAgICAgZGlzcGxheTogaW5saW5lO1xuICAgICAgcGFkZGluZzogMCAxcmVtO1xuICAgIH1cblxuICAgICYgc3ZnIHtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdpZHRoOiAxOHB4O1xuICAgICAgbWluLXdpZHRoOiAxOHB4O1xuICAgICAgbWFyZ2luOiAwIDAuNXJlbTtcblxuICAgICAgLnNlYXJjaC1wYXRoIHtcbiAgICAgICAgc3Ryb2tlOiB2YXIoLS1kYXJrZ3JheSk7XG4gICAgICAgIHN0cm9rZS13aWR0aDogMnB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBzdHJva2UgMC41cyBlYXNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYgPiAjc2VhcmNoLWNvbnRhaW5lciB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIGNvbnRhaW46IGxheW91dDtcbiAgICB6LWluZGV4OiA5OTk7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMHZ3O1xuICAgIGhlaWdodDogMTAwdmg7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuXG4gICAgJi5hY3RpdmUge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cblxuICAgICYgPiAjc2VhcmNoLXNwYWNlIHtcbiAgICAgIHdpZHRoOiA1MCU7XG4gICAgICBtYXJnaW4tdG9wOiAxNXZoO1xuICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG5cbiAgICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRmdWxsUGFnZVdpZHRoKSB7XG4gICAgICAgIHdpZHRoOiA5MCU7XG4gICAgICB9XG5cbiAgICAgICYgPiAqIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbGlnaHQpO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIDAgMTRweCA1MHB4IHJnYmEoMjcsIDMzLCA0OCwgMC4xMiksXG4gICAgICAgICAgMCAxMHB4IDMwcHggcmdiYSgyNywgMzMsIDQ4LCAwLjE2KTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMmVtO1xuICAgICAgfVxuXG4gICAgICAmID4gaW5wdXQge1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBwYWRkaW5nOiAwLjVlbSAxZW07XG4gICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ib2R5Rm9udCk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1kYXJrKTtcbiAgICAgICAgZm9udC1zaXplOiAxLjFlbTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGlnaHRncmF5KTtcblxuICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICYgPiAjcmVzdWx0cy1jb250YWluZXIge1xuICAgICAgICAmIC5yZXN1bHQtY2FyZCB7XG4gICAgICAgICAgcGFkZGluZzogMWVtO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgZWFzZTtcbiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saWdodGdyYXkpO1xuICAgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG5cbiAgICAgICAgICAvLyBub3JtYWxpemUgYnV0dG9uIHByb3BzXG4gICAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxMDAlO1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjE1O1xuICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcbiAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWxpZ2h0KTtcbiAgICAgICAgICBvdXRsaW5lOiBub25lO1xuXG4gICAgICAgICAgJiAuaGlnaGxpZ2h0IHtcbiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbGlnaHRncmF5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmOmZpcnN0LW9mLXR5cGUge1xuICAgICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNXB4O1xuICAgICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDVweDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmOmxhc3Qtb2YtdHlwZSB7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA1cHg7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogNXB4O1xuICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWxpZ2h0Z3JheSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJiA+IGgzIHtcbiAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAmID4gdWwgPiBsaSB7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgb3ZlcmZsb3ctd3JhcDogbm9ybWFsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICYgPiB1bCB7XG4gICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgICAgICAgIGdhcDogMC40cmVtO1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogMC40NXJlbTtcbiAgICAgICAgICAgIC8vIE9mZnNldCBib3JkZXIgcmFkaXVzXG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogLTJweDtcbiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNsaXA6IGJvcmRlci1ib3g7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJiA+IHVsID4gbGkgPiBwIHtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhpZ2hsaWdodCk7XG4gICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jbGlwOiBib3JkZXItYm94O1xuICAgICAgICAgICAgcGFkZGluZzogMC4wM3JlbSAwLjRyZW07XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5KTtcbiAgICAgICAgICAgIG9wYWNpdHk6IDAuODU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJiA+IHVsID4gbGkgPiAubWF0Y2gtdGFnIHtcbiAgICAgICAgICAgIGNvbG9yOiB2YXIoLS10ZXJ0aWFyeSk7XG4gICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJiA+IHAge1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ== */`;var search_inline_default=`var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/flexsearch/dist/flexsearch.bundle.js +var require_flexsearch_bundle = __commonJS({ + "node_modules/flexsearch/dist/flexsearch.bundle.js"(exports, module) { + (function _f(self) { + "use strict"; + try { + if (module) + self = module; + } catch (e) { + } + self._factory = _f; + var t; + function u(a2) { + return "undefined" !== typeof a2 ? a2 : true; + } + function aa(a2) { + const b2 = Array(a2); + for (let c2 = 0; c2 < a2; c2++) + b2[c2] = v(); + return b2; + } + function v() { + return /* @__PURE__ */ Object.create(null); + } + function ba(a2, b2) { + return b2.length - a2.length; + } + function x(a2) { + return "string" === typeof a2; + } + function C(a2) { + return "object" === typeof a2; + } + function D(a2) { + return "function" === typeof a2; + } + ; + function ca(a2, b2) { + var c2 = da; + if (a2 && (b2 && (a2 = E(a2, b2)), this.H && (a2 = E(a2, this.H)), this.J && 1 < a2.length && (a2 = E(a2, this.J)), c2 || "" === c2)) { + a2 = a2.split(c2); + if (this.filter) { + b2 = this.filter; + c2 = a2.length; + const d2 = []; + for (let e = 0, f = 0; e < c2; e++) { + const g = a2[e]; + g && !b2[g] && (d2[f++] = g); + } + a2 = d2; + } + return a2; + } + return a2; + } + const da = /[\\p{Z}\\p{S}\\p{P}\\p{C}]+/u, ea = /[\\u0300-\\u036f]/g; + function fa(a2, b2) { + const c2 = Object.keys(a2), d2 = c2.length, e = []; + let f = "", g = 0; + for (let h = 0, k, m; h < d2; h++) + k = c2[h], (m = a2[k]) ? (e[g++] = F(b2 ? "(?!\\\\b)" + k + "(\\\\b|_)" : k), e[g++] = m) : f += (f ? "|" : "") + k; + f && (e[g++] = F(b2 ? "(?!\\\\b)(" + f + ")(\\\\b|_)" : "(" + f + ")"), e[g] = ""); + return e; + } + function E(a2, b2) { + for (let c2 = 0, d2 = b2.length; c2 < d2 && (a2 = a2.replace(b2[c2], b2[c2 + 1]), a2); c2 += 2) + ; + return a2; + } + function F(a2) { + return new RegExp(a2, "g"); + } + function ha(a2) { + let b2 = "", c2 = ""; + for (let d2 = 0, e = a2.length, f; d2 < e; d2++) + (f = a2[d2]) !== c2 && (b2 += c2 = f); + return b2; + } + ; + var ja = { encode: ia, F: false, G: "" }; + function ia(a2) { + return ca.call(this, ("" + a2).toLowerCase(), false); + } + ; + const ka = {}, G = {}; + function la(a2) { + I(a2, "add"); + I(a2, "append"); + I(a2, "search"); + I(a2, "update"); + I(a2, "remove"); + } + function I(a2, b2) { + a2[b2 + "Async"] = function() { + const c2 = this, d2 = arguments; + var e = d2[d2.length - 1]; + let f; + D(e) && (f = e, delete d2[d2.length - 1]); + e = new Promise(function(g) { + setTimeout(function() { + c2.async = true; + const h = c2[b2].apply(c2, d2); + c2.async = false; + g(h); + }); + }); + return f ? (e.then(f), this) : e; + }; + } + ; + function ma(a2, b2, c2, d2) { + const e = a2.length; + let f = [], g, h, k = 0; + d2 && (d2 = []); + for (let m = e - 1; 0 <= m; m--) { + const n = a2[m], w = n.length, q = v(); + let r = !g; + for (let l = 0; l < w; l++) { + const p = n[l], z = p.length; + if (z) + for (let B = 0, A, y; B < z; B++) + if (y = p[B], g) { + if (g[y]) { + if (!m) { + if (c2) + c2--; + else if (f[k++] = y, k === b2) + return f; + } + if (m || d2) + q[y] = 1; + r = true; + } + if (d2 && (h[y] = (A = h[y]) ? ++A : A = 1, A < e)) { + const H = d2[A - 2] || (d2[A - 2] = []); + H[H.length] = y; + } + } else + q[y] = 1; + } + if (d2) + g || (h = q); + else if (!r) + return []; + g = q; + } + if (d2) + for (let m = d2.length - 1, n, w; 0 <= m; m--) { + n = d2[m]; + w = n.length; + for (let q = 0, r; q < w; q++) + if (r = n[q], !g[r]) { + if (c2) + c2--; + else if (f[k++] = r, k === b2) + return f; + g[r] = 1; + } + } + return f; + } + function na(a2, b2) { + const c2 = v(), d2 = v(), e = []; + for (let f = 0; f < a2.length; f++) + c2[a2[f]] = 1; + for (let f = 0, g; f < b2.length; f++) { + g = b2[f]; + for (let h = 0, k; h < g.length; h++) + k = g[h], c2[k] && !d2[k] && (d2[k] = 1, e[e.length] = k); + } + return e; + } + ; + function J(a2) { + this.l = true !== a2 && a2; + this.cache = v(); + this.h = []; + } + function oa(a2, b2, c2) { + C(a2) && (a2 = a2.query); + let d2 = this.cache.get(a2); + d2 || (d2 = this.search(a2, b2, c2), this.cache.set(a2, d2)); + return d2; + } + J.prototype.set = function(a2, b2) { + if (!this.cache[a2]) { + var c2 = this.h.length; + c2 === this.l ? delete this.cache[this.h[c2 - 1]] : c2++; + for (--c2; 0 < c2; c2--) + this.h[c2] = this.h[c2 - 1]; + this.h[0] = a2; + } + this.cache[a2] = b2; + }; + J.prototype.get = function(a2) { + const b2 = this.cache[a2]; + if (this.l && b2 && (a2 = this.h.indexOf(a2))) { + const c2 = this.h[a2 - 1]; + this.h[a2 - 1] = this.h[a2]; + this.h[a2] = c2; + } + return b2; + }; + const qa = { memory: { charset: "latin:extra", D: 3, B: 4, m: false }, performance: { D: 3, B: 3, s: false, context: { depth: 2, D: 1 } }, match: { charset: "latin:extra", G: "reverse" }, score: { charset: "latin:advanced", D: 20, B: 3, context: { depth: 3, D: 9 } }, "default": {} }; + function ra(a2, b2, c2, d2, e, f) { + setTimeout(function() { + const g = a2(c2, JSON.stringify(f)); + g && g.then ? g.then(function() { + b2.export(a2, b2, c2, d2, e + 1); + }) : b2.export(a2, b2, c2, d2, e + 1); + }); + } + ; + function K(a2, b2) { + if (!(this instanceof K)) + return new K(a2); + var c2; + if (a2) { + x(a2) ? a2 = qa[a2] : (c2 = a2.preset) && (a2 = Object.assign({}, c2[c2], a2)); + c2 = a2.charset; + var d2 = a2.lang; + x(c2) && (-1 === c2.indexOf(":") && (c2 += ":default"), c2 = G[c2]); + x(d2) && (d2 = ka[d2]); + } else + a2 = {}; + let e, f, g = a2.context || {}; + this.encode = a2.encode || c2 && c2.encode || ia; + this.register = b2 || v(); + this.D = e = a2.resolution || 9; + this.G = b2 = c2 && c2.G || a2.tokenize || "strict"; + this.depth = "strict" === b2 && g.depth; + this.l = u(g.bidirectional); + this.s = f = u(a2.optimize); + this.m = u(a2.fastupdate); + this.B = a2.minlength || 1; + this.C = a2.boost; + this.map = f ? aa(e) : v(); + this.A = e = g.resolution || 1; + this.h = f ? aa(e) : v(); + this.F = c2 && c2.F || a2.rtl; + this.H = (b2 = a2.matcher || d2 && d2.H) && fa(b2, false); + this.J = (b2 = a2.stemmer || d2 && d2.J) && fa(b2, true); + if (c2 = b2 = a2.filter || d2 && d2.filter) { + c2 = b2; + d2 = v(); + for (let h = 0, k = c2.length; h < k; h++) + d2[c2[h]] = 1; + c2 = d2; + } + this.filter = c2; + this.cache = (b2 = a2.cache) && new J(b2); + } + t = K.prototype; + t.append = function(a2, b2) { + return this.add(a2, b2, true); + }; + t.add = function(a2, b2, c2, d2) { + if (b2 && (a2 || 0 === a2)) { + if (!d2 && !c2 && this.register[a2]) + return this.update(a2, b2); + b2 = this.encode(b2); + if (d2 = b2.length) { + const m = v(), n = v(), w = this.depth, q = this.D; + for (let r = 0; r < d2; r++) { + let l = b2[this.F ? d2 - 1 - r : r]; + var e = l.length; + if (l && e >= this.B && (w || !n[l])) { + var f = L(q, d2, r), g = ""; + switch (this.G) { + case "full": + if (3 < e) { + for (f = 0; f < e; f++) + for (var h = e; h > f; h--) + if (h - f >= this.B) { + var k = L(q, d2, r, e, f); + g = l.substring(f, h); + M(this, n, g, k, a2, c2); + } + break; + } + case "reverse": + if (2 < e) { + for (h = e - 1; 0 < h; h--) + g = l[h] + g, g.length >= this.B && M( + this, + n, + g, + L(q, d2, r, e, h), + a2, + c2 + ); + g = ""; + } + case "forward": + if (1 < e) { + for (h = 0; h < e; h++) + g += l[h], g.length >= this.B && M(this, n, g, f, a2, c2); + break; + } + default: + if (this.C && (f = Math.min(f / this.C(b2, l, r) | 0, q - 1)), M(this, n, l, f, a2, c2), w && 1 < d2 && r < d2 - 1) { + for (e = v(), g = this.A, f = l, h = Math.min(w + 1, d2 - r), e[f] = 1, k = 1; k < h; k++) + if ((l = b2[this.F ? d2 - 1 - r - k : r + k]) && l.length >= this.B && !e[l]) { + e[l] = 1; + const p = this.l && l > f; + M(this, m, p ? f : l, L(g + (d2 / 2 > g ? 0 : 1), d2, r, h - 1, k - 1), a2, c2, p ? l : f); + } + } + } + } + } + this.m || (this.register[a2] = 1); + } + } + return this; + }; + function L(a2, b2, c2, d2, e) { + return c2 && 1 < a2 ? b2 + (d2 || 0) <= a2 ? c2 + (e || 0) : (a2 - 1) / (b2 + (d2 || 0)) * (c2 + (e || 0)) + 1 | 0 : 0; + } + function M(a2, b2, c2, d2, e, f, g) { + let h = g ? a2.h : a2.map; + if (!b2[c2] || g && !b2[c2][g]) + a2.s && (h = h[d2]), g ? (b2 = b2[c2] || (b2[c2] = v()), b2[g] = 1, h = h[g] || (h[g] = v())) : b2[c2] = 1, h = h[c2] || (h[c2] = []), a2.s || (h = h[d2] || (h[d2] = [])), f && -1 !== h.indexOf(e) || (h[h.length] = e, a2.m && (a2 = a2.register[e] || (a2.register[e] = []), a2[a2.length] = h)); + } + t.search = function(a2, b2, c2) { + c2 || (!b2 && C(a2) ? (c2 = a2, a2 = c2.query) : C(b2) && (c2 = b2)); + let d2 = [], e; + let f, g = 0; + if (c2) { + b2 = c2.limit; + g = c2.offset || 0; + var h = c2.context; + f = c2.suggest; + } + if (a2 && (a2 = this.encode(a2), e = a2.length, 1 < e)) { + c2 = v(); + var k = []; + for (let n = 0, w = 0, q; n < e; n++) + if ((q = a2[n]) && q.length >= this.B && !c2[q]) + if (this.s || f || this.map[q]) + k[w++] = q, c2[q] = 1; + else + return d2; + a2 = k; + e = a2.length; + } + if (!e) + return d2; + b2 || (b2 = 100); + h = this.depth && 1 < e && false !== h; + c2 = 0; + let m; + h ? (m = a2[0], c2 = 1) : 1 < e && a2.sort(ba); + for (let n, w; c2 < e; c2++) { + w = a2[c2]; + h ? (n = sa(this, d2, f, b2, g, 2 === e, w, m), f && false === n && d2.length || (m = w)) : n = sa(this, d2, f, b2, g, 1 === e, w); + if (n) + return n; + if (f && c2 === e - 1) { + k = d2.length; + if (!k) { + if (h) { + h = 0; + c2 = -1; + continue; + } + return d2; + } + if (1 === k) + return ta(d2[0], b2, g); + } + } + return ma(d2, b2, g, f); + }; + function sa(a2, b2, c2, d2, e, f, g, h) { + let k = [], m = h ? a2.h : a2.map; + a2.s || (m = ua(m, g, h, a2.l)); + if (m) { + let n = 0; + const w = Math.min(m.length, h ? a2.A : a2.D); + for (let q = 0, r = 0, l, p; q < w; q++) + if (l = m[q]) { + if (a2.s && (l = ua(l, g, h, a2.l)), e && l && f && (p = l.length, p <= e ? (e -= p, l = null) : (l = l.slice(e), e = 0)), l && (k[n++] = l, f && (r += l.length, r >= d2))) + break; + } + if (n) { + if (f) + return ta(k, d2, 0); + b2[b2.length] = k; + return; + } + } + return !c2 && k; + } + function ta(a2, b2, c2) { + a2 = 1 === a2.length ? a2[0] : [].concat.apply([], a2); + return c2 || a2.length > b2 ? a2.slice(c2, c2 + b2) : a2; + } + function ua(a2, b2, c2, d2) { + c2 ? (d2 = d2 && b2 > c2, a2 = (a2 = a2[d2 ? b2 : c2]) && a2[d2 ? c2 : b2]) : a2 = a2[b2]; + return a2; + } + t.contain = function(a2) { + return !!this.register[a2]; + }; + t.update = function(a2, b2) { + return this.remove(a2).add(a2, b2); + }; + t.remove = function(a2, b2) { + const c2 = this.register[a2]; + if (c2) { + if (this.m) + for (let d2 = 0, e; d2 < c2.length; d2++) + e = c2[d2], e.splice(e.indexOf(a2), 1); + else + N(this.map, a2, this.D, this.s), this.depth && N(this.h, a2, this.A, this.s); + b2 || delete this.register[a2]; + if (this.cache) { + b2 = this.cache; + for (let d2 = 0, e, f; d2 < b2.h.length; d2++) + f = b2.h[d2], e = b2.cache[f], -1 !== e.indexOf(a2) && (b2.h.splice(d2--, 1), delete b2.cache[f]); + } + } + return this; + }; + function N(a2, b2, c2, d2, e) { + let f = 0; + if (a2.constructor === Array) + if (e) + b2 = a2.indexOf(b2), -1 !== b2 ? 1 < a2.length && (a2.splice(b2, 1), f++) : f++; + else { + e = Math.min(a2.length, c2); + for (let g = 0, h; g < e; g++) + if (h = a2[g]) + f = N(h, b2, c2, d2, e), d2 || f || delete a2[g]; + } + else + for (let g in a2) + (f = N(a2[g], b2, c2, d2, e)) || delete a2[g]; + return f; + } + t.searchCache = oa; + t.export = function(a2, b2, c2, d2, e) { + let f, g; + switch (e || (e = 0)) { + case 0: + f = "reg"; + if (this.m) { + g = v(); + for (let h in this.register) + g[h] = 1; + } else + g = this.register; + break; + case 1: + f = "cfg"; + g = { doc: 0, opt: this.s ? 1 : 0 }; + break; + case 2: + f = "map"; + g = this.map; + break; + case 3: + f = "ctx"; + g = this.h; + break; + default: + return; + } + ra(a2, b2 || this, c2 ? c2 + "." + f : f, d2, e, g); + return true; + }; + t.import = function(a2, b2) { + if (b2) + switch (x(b2) && (b2 = JSON.parse(b2)), a2) { + case "cfg": + this.s = !!b2.opt; + break; + case "reg": + this.m = false; + this.register = b2; + break; + case "map": + this.map = b2; + break; + case "ctx": + this.h = b2; + } + }; + la(K.prototype); + function va(a2) { + a2 = a2.data; + var b2 = self._index; + const c2 = a2.args; + var d2 = a2.task; + switch (d2) { + case "init": + d2 = a2.options || {}; + a2 = a2.factory; + b2 = d2.encode; + d2.cache = false; + b2 && 0 === b2.indexOf("function") && (d2.encode = Function("return " + b2)()); + a2 ? (Function("return " + a2)()(self), self._index = new self.FlexSearch.Index(d2), delete self.FlexSearch) : self._index = new K(d2); + break; + default: + a2 = a2.id, b2 = b2[d2].apply(b2, c2), postMessage("search" === d2 ? { id: a2, msg: b2 } : { id: a2 }); + } + } + ; + let wa = 0; + function O(a2) { + if (!(this instanceof O)) + return new O(a2); + var b2; + a2 ? D(b2 = a2.encode) && (a2.encode = b2.toString()) : a2 = {}; + (b2 = (self || window)._factory) && (b2 = b2.toString()); + const c2 = self.exports, d2 = this; + this.o = xa(b2, c2, a2.worker); + this.h = v(); + if (this.o) { + if (c2) + this.o.on("message", function(e) { + d2.h[e.id](e.msg); + delete d2.h[e.id]; + }); + else + this.o.onmessage = function(e) { + e = e.data; + d2.h[e.id](e.msg); + delete d2.h[e.id]; + }; + this.o.postMessage({ task: "init", factory: b2, options: a2 }); + } + } + P("add"); + P("append"); + P("search"); + P("update"); + P("remove"); + function P(a2) { + O.prototype[a2] = O.prototype[a2 + "Async"] = function() { + const b2 = this, c2 = [].slice.call(arguments); + var d2 = c2[c2.length - 1]; + let e; + D(d2) && (e = d2, c2.splice(c2.length - 1, 1)); + d2 = new Promise(function(f) { + setTimeout(function() { + b2.h[++wa] = f; + b2.o.postMessage({ task: a2, id: wa, args: c2 }); + }); + }); + return e ? (d2.then(e), this) : d2; + }; + } + function xa(a, b, c) { + let d; + try { + d = b ? eval('new (require("worker_threads")["Worker"])("../dist/node/node.js")') : a ? new Worker(URL.createObjectURL(new Blob(["onmessage=" + va.toString()], { type: "text/javascript" }))) : new Worker(x(c) ? c : "worker/worker.js", { type: "module" }); + } catch (e) { + } + return d; + } + ; + function Q(a2) { + if (!(this instanceof Q)) + return new Q(a2); + var b2 = a2.document || a2.doc || a2, c2; + this.K = []; + this.h = []; + this.A = []; + this.register = v(); + this.key = (c2 = b2.key || b2.id) && S(c2, this.A) || "id"; + this.m = u(a2.fastupdate); + this.C = (c2 = b2.store) && true !== c2 && []; + this.store = c2 && v(); + this.I = (c2 = b2.tag) && S(c2, this.A); + this.l = c2 && v(); + this.cache = (c2 = a2.cache) && new J(c2); + a2.cache = false; + this.o = a2.worker; + this.async = false; + c2 = v(); + let d2 = b2.index || b2.field || b2; + x(d2) && (d2 = [d2]); + for (let e = 0, f, g; e < d2.length; e++) + f = d2[e], x(f) || (g = f, f = f.field), g = C(g) ? Object.assign({}, a2, g) : a2, this.o && (c2[f] = new O(g), c2[f].o || (this.o = false)), this.o || (c2[f] = new K(g, this.register)), this.K[e] = S(f, this.A), this.h[e] = f; + if (this.C) + for (a2 = b2.store, x(a2) && (a2 = [a2]), b2 = 0; b2 < a2.length; b2++) + this.C[b2] = S(a2[b2], this.A); + this.index = c2; + } + function S(a2, b2) { + const c2 = a2.split(":"); + let d2 = 0; + for (let e = 0; e < c2.length; e++) + a2 = c2[e], 0 <= a2.indexOf("[]") && (a2 = a2.substring(0, a2.length - 2)) && (b2[d2] = true), a2 && (c2[d2++] = a2); + d2 < c2.length && (c2.length = d2); + return 1 < d2 ? c2 : c2[0]; + } + function T(a2, b2) { + if (x(b2)) + a2 = a2[b2]; + else + for (let c2 = 0; a2 && c2 < b2.length; c2++) + a2 = a2[b2[c2]]; + return a2; + } + function U(a2, b2, c2, d2, e) { + a2 = a2[e]; + if (d2 === c2.length - 1) + b2[e] = a2; + else if (a2) + if (a2.constructor === Array) + for (b2 = b2[e] = Array(a2.length), e = 0; e < a2.length; e++) + U(a2, b2, c2, d2, e); + else + b2 = b2[e] || (b2[e] = v()), e = c2[++d2], U(a2, b2, c2, d2, e); + } + function V(a2, b2, c2, d2, e, f, g, h) { + if (a2 = a2[g]) + if (d2 === b2.length - 1) { + if (a2.constructor === Array) { + if (c2[d2]) { + for (b2 = 0; b2 < a2.length; b2++) + e.add(f, a2[b2], true, true); + return; + } + a2 = a2.join(" "); + } + e.add(f, a2, h, true); + } else if (a2.constructor === Array) + for (g = 0; g < a2.length; g++) + V(a2, b2, c2, d2, e, f, g, h); + else + g = b2[++d2], V(a2, b2, c2, d2, e, f, g, h); + } + t = Q.prototype; + t.add = function(a2, b2, c2) { + C(a2) && (b2 = a2, a2 = T(b2, this.key)); + if (b2 && (a2 || 0 === a2)) { + if (!c2 && this.register[a2]) + return this.update(a2, b2); + for (let d2 = 0, e, f; d2 < this.h.length; d2++) + f = this.h[d2], e = this.K[d2], x(e) && (e = [e]), V(b2, e, this.A, 0, this.index[f], a2, e[0], c2); + if (this.I) { + let d2 = T(b2, this.I), e = v(); + x(d2) && (d2 = [d2]); + for (let f = 0, g, h; f < d2.length; f++) + if (g = d2[f], !e[g] && (e[g] = 1, h = this.l[g] || (this.l[g] = []), !c2 || -1 === h.indexOf(a2))) { + if (h[h.length] = a2, this.m) { + const k = this.register[a2] || (this.register[a2] = []); + k[k.length] = h; + } + } + } + if (this.store && (!c2 || !this.store[a2])) { + let d2; + if (this.C) { + d2 = v(); + for (let e = 0, f; e < this.C.length; e++) + f = this.C[e], x(f) ? d2[f] = b2[f] : U(b2, d2, f, 0, f[0]); + } + this.store[a2] = d2 || b2; + } + } + return this; + }; + t.append = function(a2, b2) { + return this.add(a2, b2, true); + }; + t.update = function(a2, b2) { + return this.remove(a2).add(a2, b2); + }; + t.remove = function(a2) { + C(a2) && (a2 = T(a2, this.key)); + if (this.register[a2]) { + for (var b2 = 0; b2 < this.h.length && (this.index[this.h[b2]].remove(a2, !this.o), !this.m); b2++) + ; + if (this.I && !this.m) + for (let c2 in this.l) { + b2 = this.l[c2]; + const d2 = b2.indexOf(a2); + -1 !== d2 && (1 < b2.length ? b2.splice(d2, 1) : delete this.l[c2]); + } + this.store && delete this.store[a2]; + delete this.register[a2]; + } + return this; + }; + t.search = function(a2, b2, c2, d2) { + c2 || (!b2 && C(a2) ? (c2 = a2, a2 = c2.query) : C(b2) && (c2 = b2, b2 = 0)); + let e = [], f = [], g, h, k, m, n, w, q = 0; + if (c2) + if (c2.constructor === Array) + k = c2, c2 = null; + else { + k = (g = c2.pluck) || c2.index || c2.field; + m = c2.tag; + h = this.store && c2.enrich; + n = "and" === c2.bool; + b2 = c2.limit || 100; + w = c2.offset || 0; + if (m && (x(m) && (m = [m]), !a2)) { + for (let l = 0, p; l < m.length; l++) + if (p = ya.call(this, m[l], b2, w, h)) + e[e.length] = p, q++; + return q ? e : []; + } + x(k) && (k = [k]); + } + k || (k = this.h); + n = n && (1 < k.length || m && 1 < m.length); + const r = !d2 && (this.o || this.async) && []; + for (let l = 0, p, z, B; l < k.length; l++) { + let A; + z = k[l]; + x(z) || (A = z, z = z.field); + if (r) + r[l] = this.index[z].searchAsync(a2, b2, A || c2); + else { + d2 ? p = d2[l] : p = this.index[z].search(a2, b2, A || c2); + B = p && p.length; + if (m && B) { + const y = []; + let H = 0; + n && (y[0] = [p]); + for (let X = 0, pa, R; X < m.length; X++) + if (pa = m[X], B = (R = this.l[pa]) && R.length) + H++, y[y.length] = n ? [R] : R; + H && (p = n ? ma(y, b2 || 100, w || 0) : na(p, y), B = p.length); + } + if (B) + f[q] = z, e[q++] = p; + else if (n) + return []; + } + } + if (r) { + const l = this; + return new Promise(function(p) { + Promise.all(r).then(function(z) { + p(l.search(a2, b2, c2, z)); + }); + }); + } + if (!q) + return []; + if (g && (!h || !this.store)) + return e[0]; + for (let l = 0, p; l < f.length; l++) { + p = e[l]; + p.length && h && (p = za.call(this, p)); + if (g) + return p; + e[l] = { field: f[l], result: p }; + } + return e; + }; + function ya(a2, b2, c2, d2) { + let e = this.l[a2], f = e && e.length - c2; + if (f && 0 < f) { + if (f > b2 || c2) + e = e.slice(c2, c2 + b2); + d2 && (e = za.call(this, e)); + return { tag: a2, result: e }; + } + } + function za(a2) { + const b2 = Array(a2.length); + for (let c2 = 0, d2; c2 < a2.length; c2++) + d2 = a2[c2], b2[c2] = { id: d2, doc: this.store[d2] }; + return b2; + } + t.contain = function(a2) { + return !!this.register[a2]; + }; + t.get = function(a2) { + return this.store[a2]; + }; + t.set = function(a2, b2) { + this.store[a2] = b2; + return this; + }; + t.searchCache = oa; + t.export = function(a2, b2, c2, d2, e) { + e || (e = 0); + d2 || (d2 = 0); + if (d2 < this.h.length) { + const f = this.h[d2], g = this.index[f]; + b2 = this; + setTimeout(function() { + g.export(a2, b2, e ? f.replace(":", "-") : "", d2, e++) || (d2++, e = 1, b2.export(a2, b2, f, d2, e)); + }); + } else { + let f; + switch (e) { + case 1: + c2 = "tag"; + f = this.l; + break; + case 2: + c2 = "store"; + f = this.store; + break; + default: + return; + } + ra(a2, this, c2, d2, e, f); + } + }; + t.import = function(a2, b2) { + if (b2) + switch (x(b2) && (b2 = JSON.parse(b2)), a2) { + case "tag": + this.l = b2; + break; + case "reg": + this.m = false; + this.register = b2; + for (let d2 = 0, e; d2 < this.h.length; d2++) + e = this.index[this.h[d2]], e.register = b2, e.m = false; + break; + case "store": + this.store = b2; + break; + default: + a2 = a2.split("."); + const c2 = a2[0]; + a2 = a2[1]; + c2 && a2 && this.index[c2].import(a2, b2); + } + }; + la(Q.prototype); + var Ba = { encode: Aa, F: false, G: "" }; + const Ca = [F("[\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5]"), "a", F("[\\xE8\\xE9\\xEA\\xEB]"), "e", F("[\\xEC\\xED\\xEE\\xEF]"), "i", F("[\\xF2\\xF3\\xF4\\xF5\\xF6\\u0151]"), "o", F("[\\xF9\\xFA\\xFB\\xFC\\u0171]"), "u", F("[\\xFD\\u0177\\xFF]"), "y", F("\\xF1"), "n", F("[\\xE7c]"), "k", F("\\xDF"), "s", F(" & "), " and "]; + function Aa(a2) { + var b2 = a2; + b2.normalize && (b2 = b2.normalize("NFD").replace(ea, "")); + return ca.call(this, b2.toLowerCase(), !a2.normalize && Ca); + } + ; + var Ea = { encode: Da, F: false, G: "strict" }; + const Fa = /[^a-z0-9]+/, Ga = { b: "p", v: "f", w: "f", z: "s", x: "s", "\\xDF": "s", d: "t", n: "m", c: "k", g: "k", j: "k", q: "k", i: "e", y: "e", u: "o" }; + function Da(a2) { + a2 = Aa.call(this, a2).join(" "); + const b2 = []; + if (a2) { + const c2 = a2.split(Fa), d2 = c2.length; + for (let e = 0, f, g = 0; e < d2; e++) + if ((a2 = c2[e]) && (!this.filter || !this.filter[a2])) { + f = a2[0]; + let h = Ga[f] || f, k = h; + for (let m = 1; m < a2.length; m++) { + f = a2[m]; + const n = Ga[f] || f; + n && n !== k && (h += n, k = n); + } + b2[g++] = h; + } + } + return b2; + } + ; + var Ia = { encode: Ha, F: false, G: "" }; + const Ja = [F("ae"), "a", F("oe"), "o", F("sh"), "s", F("th"), "t", F("ph"), "f", F("pf"), "f", F("(?![aeo])h(?![aeo])"), "", F("(?!^[aeo])h(?!^[aeo])"), ""]; + function Ha(a2, b2) { + a2 && (a2 = Da.call(this, a2).join(" "), 2 < a2.length && (a2 = E(a2, Ja)), b2 || (1 < a2.length && (a2 = ha(a2)), a2 && (a2 = a2.split(" ")))); + return a2; + } + ; + var La = { encode: Ka, F: false, G: "" }; + const Ma = F("(?!\\\\b)[aeo]"); + function Ka(a2) { + a2 && (a2 = Ha.call(this, a2, true), 1 < a2.length && (a2 = a2.replace(Ma, "")), 1 < a2.length && (a2 = ha(a2)), a2 && (a2 = a2.split(" "))); + return a2; + } + ; + G["latin:default"] = ja; + G["latin:simple"] = Ba; + G["latin:balance"] = Ea; + G["latin:advanced"] = Ia; + G["latin:extra"] = La; + const W = self; + let Y; + const Z = { Index: K, Document: Q, Worker: O, registerCharset: function(a2, b2) { + G[a2] = b2; + }, registerLanguage: function(a2, b2) { + ka[a2] = b2; + } }; + (Y = W.define) && Y.amd ? Y([], function() { + return Z; + }) : W.exports ? W.exports = Z : W.FlexSearch = Z; + })(exports); + } +}); + +// quartz/components/scripts/quartz/components/scripts/search.inline.ts +var import_flexsearch = __toESM(require_flexsearch_bundle()); + +// quartz/components/scripts/util.ts +function registerEscapeHandler(outsideContainer, cb) { + if (!outsideContainer) + return; + function click(e) { + if (e.target !== this) + return; + e.preventDefault(); + cb(); + } + function esc(e) { + if (!e.key.startsWith("Esc")) + return; + e.preventDefault(); + cb(); + } + outsideContainer?.removeEventListener("click", click); + outsideContainer?.addEventListener("click", click); + document.removeEventListener("keydown", esc); + document.addEventListener("keydown", esc); +} +function removeAllChildren(node) { + while (node.firstChild) { + node.removeChild(node.firstChild); + } +} + +// node_modules/github-slugger/index.js +var own = Object.hasOwnProperty; + +// quartz/util/path.ts +function simplifySlug(fp) { + return _stripSlashes(_trimSuffix(fp, "index"), true); +} +function pathToRoot(slug2) { + let rootPath = slug2.split("/").filter((x2) => x2 !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) { + rootPath = "."; + } + return rootPath; +} +function resolveRelative(current, target) { + const res = joinSegments(pathToRoot(current), simplifySlug(target)); + return res; +} +function joinSegments(...args) { + return args.filter((segment) => segment !== "").join("/").replace(/\\/\\/+/g, "/"); +} +function _endsWith(s, suffix) { + return s === suffix || s.endsWith("/" + suffix); +} +function _trimSuffix(s, suffix) { + if (_endsWith(s, suffix)) { + s = s.slice(0, -suffix.length); + } + return s; +} +function _stripSlashes(s, onlyStripPrefix) { + if (s.startsWith("/")) { + s = s.substring(1); + } + if (!onlyStripPrefix && s.endsWith("/")) { + s = s.slice(0, -1); + } + return s; +} + +// quartz/components/scripts/quartz/components/scripts/search.inline.ts +var index = void 0; +var searchType = "basic"; +var contextWindowWords = 30; +var numSearchResults = 5; +var numTagResults = 3; +function highlight(searchTerm, text, trim) { + const tokenizedTerms = searchTerm.split(/\\s+/).filter((t2) => t2 !== "").sort((a2, b2) => b2.length - a2.length); + let tokenizedText = text.split(/\\s+/).filter((t2) => t2 !== ""); + let startIndex = 0; + let endIndex = tokenizedText.length - 1; + if (trim) { + const includesCheck = (tok) => tokenizedTerms.some((term) => tok.toLowerCase().startsWith(term.toLowerCase())); + const occurencesIndices = tokenizedText.map(includesCheck); + let bestSum = 0; + let bestIndex = 0; + for (let i = 0; i < Math.max(tokenizedText.length - contextWindowWords, 0); i++) { + const window2 = occurencesIndices.slice(i, i + contextWindowWords); + const windowSum = window2.reduce((total, cur) => total + (cur ? 1 : 0), 0); + if (windowSum >= bestSum) { + bestSum = windowSum; + bestIndex = i; + } + } + startIndex = Math.max(bestIndex - contextWindowWords, 0); + endIndex = Math.min(startIndex + 2 * contextWindowWords, tokenizedText.length - 1); + tokenizedText = tokenizedText.slice(startIndex, endIndex); + } + const slice = tokenizedText.map((tok) => { + for (const searchTok of tokenizedTerms) { + if (tok.toLowerCase().includes(searchTok.toLowerCase())) { + const regex2 = new RegExp(searchTok.toLowerCase(), "gi"); + return tok.replace(regex2, \`$&\`); + } + } + return tok; + }).join(" "); + return \`\${startIndex === 0 ? "" : "..."}\${slice}\${endIndex === tokenizedText.length - 1 ? "" : "..."}\`; +} +var encoder = (str) => str.toLowerCase().split(/([^a-z]|[^\\x00-\\x7F])/); +var prevShortcutHandler = void 0; +document.addEventListener("nav", async (e) => { + const currentSlug = e.detail.url; + const data = await fetchData; + const container = document.getElementById("search-container"); + const sidebar = container?.closest(".sidebar"); + const searchIcon = document.getElementById("search-icon"); + const searchBar = document.getElementById("search-bar"); + const results = document.getElementById("results-container"); + const resultCards = document.getElementsByClassName("result-card"); + const idDataMap = Object.keys(data); + function hideSearch() { + container?.classList.remove("active"); + if (searchBar) { + searchBar.value = ""; + } + if (sidebar) { + sidebar.style.zIndex = "unset"; + } + if (results) { + removeAllChildren(results); + } + searchType = "basic"; + } + function showSearch(searchTypeNew) { + searchType = searchTypeNew; + if (sidebar) { + sidebar.style.zIndex = "1"; + } + container?.classList.add("active"); + searchBar?.focus(); + } + function shortcutHandler(e2) { + if (e2.key === "k" && (e2.ctrlKey || e2.metaKey) && !e2.shiftKey) { + e2.preventDefault(); + const searchBarOpen = container?.classList.contains("active"); + searchBarOpen ? hideSearch() : showSearch("basic"); + } else if (e2.shiftKey && (e2.ctrlKey || e2.metaKey) && e2.key.toLowerCase() === "k") { + e2.preventDefault(); + const searchBarOpen = container?.classList.contains("active"); + searchBarOpen ? hideSearch() : showSearch("tags"); + if (searchBar) + searchBar.value = "#"; + } else if (e2.key === "Enter") { + if (results?.contains(document.activeElement)) { + const active = document.activeElement; + active.click(); + } else { + const anchor = document.getElementsByClassName("result-card")[0]; + anchor?.click(); + } + } else if (e2.key === "ArrowDown") { + e2.preventDefault(); + if (!results?.contains(document.activeElement)) { + const firstResult = resultCards[0]; + firstResult?.focus(); + } else { + const nextResult = document.activeElement?.nextElementSibling; + nextResult?.focus(); + } + } else if (e2.key === "ArrowUp") { + e2.preventDefault(); + if (results?.contains(document.activeElement)) { + const prevResult = document.activeElement?.previousElementSibling; + prevResult?.focus(); + } + } + } + function trimContent(content) { + const sentences = content.replace(/\\s+/g, " ").split("."); + let finalDesc = ""; + let sentenceIdx = 0; + const len = contextWindowWords * 5; + while (finalDesc.length < len) { + const sentence = sentences[sentenceIdx]; + if (!sentence) + break; + finalDesc += sentence + "."; + sentenceIdx++; + } + if (finalDesc.length < content.length) { + finalDesc += ".."; + } + return finalDesc; + } + const formatForDisplay = (term, id) => { + const slug2 = idDataMap[id]; + return { + id, + slug: slug2, + title: searchType === "tags" ? data[slug2].title : highlight(term, data[slug2].title ?? ""), + // if searchType is tag, display context from start of file and trim, otherwise use regular highlight + content: searchType === "tags" ? trimContent(data[slug2].content) : highlight(term, data[slug2].content ?? "", true), + tags: highlightTags(term, data[slug2].tags) + }; + }; + function highlightTags(term, tags) { + if (tags && searchType === "tags") { + const termLower = term.toLowerCase(); + let matching = tags.filter((str) => str.includes(termLower)); + if (matching.length > 0) { + let difference = tags.filter((x2) => !matching.includes(x2)); + matching = matching.map((tag) => \`
  • #\${tag}

  • \`); + difference = difference.map((tag) => \`
  • #\${tag}

  • \`); + matching.push(...difference); + } + if (tags.length > numTagResults) { + matching.splice(numTagResults); + } + return matching; + } else { + return []; + } + } + const resultToHTML = ({ slug: slug2, title, content, tags }) => { + const htmlTags = tags.length > 0 ? \`
      \${tags.join("")}
    \` : \`\`; + const button = document.createElement("button"); + button.classList.add("result-card"); + button.id = slug2; + button.innerHTML = \`

    \${title}

    \${htmlTags}

    \${content}

    \`; + button.addEventListener("click", () => { + const targ = resolveRelative(currentSlug, slug2); + window.spaNavigate(new URL(targ, window.location.toString())); + hideSearch(); + }); + return button; + }; + function displayResults(finalResults) { + if (!results) + return; + removeAllChildren(results); + if (finalResults.length === 0) { + results.innerHTML = \`\`; + } else { + results.append(...finalResults.map(resultToHTML)); + } + } + async function onType(e2) { + let term = e2.target.value; + let searchResults; + if (term.toLowerCase().startsWith("#")) { + searchType = "tags"; + } else { + searchType = "basic"; + } + switch (searchType) { + case "tags": { + term = term.substring(1); + searchResults = await index?.searchAsync({ query: term, limit: numSearchResults, index: ["tags"] }) ?? []; + break; + } + case "basic": + default: { + searchResults = await index?.searchAsync({ + query: term, + limit: numSearchResults, + index: ["title", "content"] + }) ?? []; + } + } + const getByField = (field) => { + const results2 = searchResults.filter((x2) => x2.field === field); + return results2.length === 0 ? [] : [...results2[0].result]; + }; + const allIds = /* @__PURE__ */ new Set([ + ...getByField("title"), + ...getByField("content"), + ...getByField("tags") + ]); + const finalResults = [...allIds].map((id) => formatForDisplay(term, id)); + displayResults(finalResults); + } + if (prevShortcutHandler) { + document.removeEventListener("keydown", prevShortcutHandler); + } + document.addEventListener("keydown", shortcutHandler); + prevShortcutHandler = shortcutHandler; + searchIcon?.removeEventListener("click", () => showSearch("basic")); + searchIcon?.addEventListener("click", () => showSearch("basic")); + searchBar?.removeEventListener("input", onType); + searchBar?.addEventListener("input", onType); + if (!index) { + index = new import_flexsearch.Document({ + charset: "latin:extra", + optimize: true, + encode: encoder, + document: { + id: "id", + index: [ + { + field: "title", + tokenize: "reverse" + }, + { + field: "content", + tokenize: "reverse" + }, + { + field: "tags", + tokenize: "reverse" + } + ] + } + }); + fillDocument(index, data); + } + registerEscapeHandler(container, hideSearch); +}); +async function fillDocument(index2, data) { + let id = 0; + for (const [slug2, fileData] of Object.entries(data)) { + await index2.addAsync(id, { + id, + slug: slug2, + title: fileData.title, + content: fileData.content, + tags: fileData.tags + }); + id++; + } +} +`;import{jsx as jsx24,jsxs as jsxs14}from"preact/jsx-runtime";var Search_default=__name(()=>{function Search({displayClass}){return jsxs14("div",{class:`search ${displayClass??""}`,children:[jsxs14("div",{id:"search-icon",children:[jsx24("p",{children:"Search"}),jsx24("div",{}),jsxs14("svg",{tabIndex:0,"aria-labelledby":"title desc",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 19.9 19.7",children:[jsx24("title",{id:"title",children:"Search"}),jsx24("desc",{id:"desc",children:"Search"}),jsxs14("g",{class:"search-path",fill:"none",children:[jsx24("path",{"stroke-linecap":"square",d:"M18.5 18.3l-5.4-5.4"}),jsx24("circle",{cx:"8",cy:"8",r:"7"})]})]})]}),jsx24("div",{id:"search-container",children:jsxs14("div",{id:"search-space",children:[jsx24("input",{autocomplete:"off",id:"search-bar",name:"search",type:"text","aria-label":"Search for something",placeholder:"Search for something"}),jsx24("div",{id:"results-container"})]})})]})}return __name(Search,"Search"),Search.afterDOMLoaded=search_inline_default,Search.css=search_default,Search},"default");var footer_default=` +footer { + text-align: left; + margin-bottom: 4rem; + opacity: 0.7; +} +footer ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + gap: 1rem; + margin-top: -1rem; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiZm9vdGVyLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbImZvb3RlciB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIG1hcmdpbi1ib3R0b206IDRyZW07XG4gIG9wYWNpdHk6IDAuNztcblxuICAmIHVsIHtcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBnYXA6IDFyZW07XG4gICAgbWFyZ2luLXRvcDogLTFyZW07XG4gIH1cbn1cbiJdfQ== */`;var version="4.1.0";import{jsx as jsx25,jsxs as jsxs15}from"preact/jsx-runtime";var Footer_default=__name(opts=>{function Footer({displayClass}){let year=new Date().getFullYear(),links=opts?.links??[];return jsxs15("footer",{class:`${displayClass??""}`,children:[jsx25("hr",{}),jsxs15("p",{children:["Created with ",jsxs15("a",{href:"https://quartz.jzhao.xyz/",children:["Quartz v",version]}),", \xA9 ",year]}),jsx25("ul",{children:Object.entries(links).map(([text,link])=>jsx25("li",{children:jsx25("a",{href:link,children:text})}))})]})}return __name(Footer,"Footer"),Footer.css=footer_default,Footer},"default");import{Fragment as Fragment3,jsx as jsx26}from"preact/jsx-runtime";var DesktopOnly_default=__name(component=>{if(component){let DesktopOnly2=function(props){return jsx26(Component,{displayClass:"desktop-only",...props})};var DesktopOnly=DesktopOnly2;__name(DesktopOnly2,"DesktopOnly");let Component=component;return DesktopOnly2.displayName=component.displayName,DesktopOnly2.afterDOMLoaded=component?.afterDOMLoaded,DesktopOnly2.beforeDOMLoaded=component?.beforeDOMLoaded,DesktopOnly2.css=component?.css,DesktopOnly2}else return()=>jsx26(Fragment3,{})},"default");import{Fragment as Fragment4,jsx as jsx27}from"preact/jsx-runtime";var MobileOnly_default=__name(component=>{if(component){let MobileOnly2=function(props){return jsx27(Component,{displayClass:"mobile-only",...props})};var MobileOnly=MobileOnly2;__name(MobileOnly2,"MobileOnly");let Component=component;return MobileOnly2.displayName=component.displayName,MobileOnly2.afterDOMLoaded=component?.afterDOMLoaded,MobileOnly2.beforeDOMLoaded=component?.beforeDOMLoaded,MobileOnly2.css=component?.css,MobileOnly2}else return()=>jsx27(Fragment4,{})},"default");var recentNotes_default=` +.recent-notes > h3 { + margin: 0.5rem 0 0 0; + font-size: 1rem; +} +.recent-notes > ul.recent-ul { + list-style: none; + margin-top: 1rem; + padding-left: 0; +} +.recent-notes > ul.recent-ul > li { + margin: 1rem 0; +} +.recent-notes > ul.recent-ul > li .section > .desc > h3 > a { + background-color: transparent; +} +.recent-notes > ul.recent-ul > li .section > .meta { + margin: 0 0 0.5rem 0; + opacity: 0.6; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsicmVjZW50Tm90ZXMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDRTtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFDQTtFQUNFOztBQUdGO0VBQ0U7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi5yZWNlbnQtbm90ZXMge1xuICAmID4gaDMge1xuICAgIG1hcmdpbjogMC41cmVtIDAgMCAwO1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgfVxuXG4gICYgPiB1bC5yZWNlbnQtdWwge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luLXRvcDogMXJlbTtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG5cbiAgICAmID4gbGkge1xuICAgICAgbWFyZ2luOiAxcmVtIDA7XG4gICAgICAuc2VjdGlvbiA+IC5kZXNjID4gaDMgPiBhIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIC5zZWN0aW9uID4gLm1ldGEge1xuICAgICAgICBtYXJnaW46IDAgMCAwLjVyZW0gMDtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19 */`;import{jsx as jsx28,jsxs as jsxs16}from"preact/jsx-runtime";var defaultOptions11=__name(cfg=>({title:"Recent Notes",limit:3,linkToMore:!1,filter:()=>!0,sort:byDateAndAlphabetical(cfg),showTags:!1}),"defaultOptions"),RecentNotes_default=__name(userOpts=>{function RecentNotes({allFiles,fileData,displayClass,cfg}){let opts={...defaultOptions11(cfg),...userOpts},pages=allFiles.filter(opts.filter).sort(opts.sort),remaining=Math.max(0,pages.length-opts.limit);return jsxs16("div",{class:`recent-notes ${displayClass??""}`,children:[jsx28("h3",{children:opts.title}),jsx28("ul",{class:"recent-ul",children:pages.slice(0,opts.limit).map(page=>{let title=page.frontmatter?.title,tags=page.frontmatter?.tags??[];return jsx28("li",{class:"recent-li",children:jsxs16("div",{class:"section",children:[jsx28("div",{class:"desc",children:jsx28("h3",{children:jsx28("a",{href:resolveRelative(fileData.slug,page.slug),class:"internal",children:title})})}),page.dates&&jsx28("p",{class:"meta",children:jsx28(Date2,{date:getDate(cfg,page)})}),opts.showTags&&tags.length>0&&jsx28("ul",{class:"tags",children:tags.map(tag=>jsx28("li",{children:jsxs16("a",{class:"internal tag-link",href:resolveRelative(fileData.slug,`tags/${tag}`),children:["#",tag]})}))})]})})})}),opts.linkToMore&&remaining>0&&jsx28("p",{children:jsxs16("a",{href:resolveRelative(fileData.slug,opts.linkToMore),children:["See ",remaining," more \u2192"]})})]})}return __name(RecentNotes,"RecentNotes"),RecentNotes.css=recentNotes_default,RecentNotes},"default");var breadcrumbs_default=` +.breadcrumb-container { + margin: 0; + margin-top: 0.75rem; + padding: 0; + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 0.5rem; +} + +.breadcrumb-element { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} +.breadcrumb-element p { + margin: 0; + margin-left: 0.5rem; + padding: 0; + line-height: normal; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsiYnJlYWRjcnVtYnMuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQU9FO0VBQ0E7RUFDQTtFQUNBOztBQVRBO0VBQ0U7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIuYnJlYWRjcnVtYi1jb250YWluZXIge1xuICBtYXJnaW46IDA7XG4gIG1hcmdpbi10b3A6IDAuNzVyZW07XG4gIHBhZGRpbmc6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgZ2FwOiAwLjVyZW07XG59XG5cbi5icmVhZGNydW1iLWVsZW1lbnQge1xuICBwIHtcbiAgICBtYXJnaW46IDA7XG4gICAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gIH1cbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG4iXX0= */`;import{Fragment as Fragment5,jsx as jsx29,jsxs as jsxs17}from"preact/jsx-runtime";var defaultOptions12={spacerSymbol:">",rootName:"Home",resolveFrontmatterTitle:!1,hideOnRoot:!0};function formatCrumb(displayName,baseSlug,currentSlug){return{displayName:displayName.replaceAll("-"," "),path:resolveRelative(baseSlug,currentSlug)}}__name(formatCrumb,"formatCrumb");function findCurrentFile(allFiles,folderName){return allFiles.find(file=>{if(file.slug?.endsWith("index")){let folderParts=file.filePath?.split("/");if(folderParts&&folderParts[folderParts?.length-2]===folderName)return!0}})}__name(findCurrentFile,"findCurrentFile");var Breadcrumbs_default=__name(opts=>{let options2={...defaultOptions12,...opts};function Breadcrumbs({fileData,allFiles,displayClass}){if(options2.hideOnRoot&&fileData.slug==="index")return jsx29(Fragment5,{});let crumbs=[formatCrumb(options2.rootName,fileData.slug,"/")],slugParts=fileData.slug?.split("/");if(slugParts){let currentPath="";for(let i=0;ijsxs17("div",{class:"breadcrumb-element",children:[jsx29("a",{href:crumb.path,children:crumb.displayName}),index!==crumbs.length-1&&jsx29("p",{children:` ${options2.spacerSymbol} `})]}))})}return __name(Breadcrumbs,"Breadcrumbs"),Breadcrumbs.css=breadcrumbs_default,Breadcrumbs},"default");var sharedPageComponents={head:Head_default(),header:[],footer:Footer_default({links:{Blog:"https://blog.7wate.com",GitHub:"https://github.com/7wate"}})},defaultContentPageLayout={beforeBody:[Breadcrumbs_default(),ArticleTitle_default(),ContentMeta_default(),TagList_default()],left:[PageTitle_default(),MobileOnly_default(Spacer_default()),Search_default(),Darkmode_default(),DesktopOnly_default(Explorer_default()),DesktopOnly_default(RecentNotes_default({filter:data=>data.filePath?data.filePath.startsWith("content/Blog"):!1}))],right:[Graph_default(),DesktopOnly_default(TableOfContents_default()),Backlinks_default()]},defaultListPageLayout={beforeBody:[ArticleTitle_default()],left:[PageTitle_default(),MobileOnly_default(Spacer_default()),Search_default(),Darkmode_default()],right:[]};import chalk4 from"chalk";var ContentPage=__name(userOpts=>{let opts={...sharedPageComponents,...defaultContentPageLayout,pageBody:Content_default(),...userOpts},{head:Head,header,beforeBody,pageBody,left,right,footer:Footer}=opts,Header2=Header_default(),Body2=Body_default();return{name:"ContentPage",getQuartzComponents(){return[Head,Header2,Body2,...header,...beforeBody,pageBody,...left,...right,Footer]},async emit(ctx,content,resources,emit){let cfg=ctx.cfg.configuration,fps=[],allFiles=content.map(c=>c[1].data),containsIndex=!1;for(let[tree,file]of content){let slug2=file.data.slug;slug2==="index"&&(containsIndex=!0);let externalResources=pageResources(pathToRoot(slug2),resources),componentData={fileData:file.data,externalResources,cfg,children:[],tree,allFiles},content2=renderPage(slug2,componentData,opts,externalResources),fp=await emit({content:content2,slug:slug2,ext:".html"});fps.push(fp)}return containsIndex||console.log(chalk4.yellow(` +Warning: you seem to be missing an \`index.md\` home page file at the root of your \`${ctx.argv.directory}\` folder. This may cause errors when deploying.`)),fps}}},"ContentPage");import{VFile}from"vfile";function defaultProcessedContent(vfileData){let root={type:"root",children:[]},vfile=new VFile("");return vfile.data=vfileData,[root,vfile]}__name(defaultProcessedContent,"defaultProcessedContent");var TagPage=__name(userOpts=>{let opts={...sharedPageComponents,...defaultListPageLayout,pageBody:TagContent_default(),...userOpts},{head:Head,header,beforeBody,pageBody,left,right,footer:Footer}=opts,Header2=Header_default(),Body2=Body_default();return{name:"TagPage",getQuartzComponents(){return[Head,Header2,Body2,...header,...beforeBody,pageBody,...left,...right,Footer]},async emit(ctx,content,resources,emit){let fps=[],allFiles=content.map(c=>c[1].data),cfg=ctx.cfg.configuration,tags=new Set(allFiles.flatMap(data=>data.frontmatter?.tags??[]).flatMap(getAllSegmentPrefixes));tags.add("index");let tagDescriptions=Object.fromEntries([...tags].map(tag=>{let title=tag===""?"Tag Index":`Tag: #${tag}`;return[tag,defaultProcessedContent({slug:joinSegments("tags",tag),frontmatter:{title,tags:[]}})]}));for(let[tree,file]of content){let slug2=file.data.slug;if(slug2.startsWith("tags/")){let tag=slug2.slice(5);tags.has(tag)&&(tagDescriptions[tag]=[tree,file])}}for(let tag of tags){let slug2=joinSegments("tags",tag),externalResources=pageResources(pathToRoot(slug2),resources),[tree,file]=tagDescriptions[tag],componentData={fileData:file.data,externalResources,cfg,children:[],tree,allFiles},content2=renderPage(slug2,componentData,opts,externalResources),fp=await emit({content:content2,slug:file.data.slug,ext:".html"});fps.push(fp)}return fps}}},"TagPage");import path6 from"path";var FolderPage=__name(userOpts=>{let opts={...sharedPageComponents,...defaultListPageLayout,pageBody:FolderContent_default(),...userOpts},{head:Head,header,beforeBody,pageBody,left,right,footer:Footer}=opts,Header2=Header_default(),Body2=Body_default();return{name:"FolderPage",getQuartzComponents(){return[Head,Header2,Body2,...header,...beforeBody,pageBody,...left,...right,Footer]},async emit(ctx,content,resources,emit){let fps=[],allFiles=content.map(c=>c[1].data),cfg=ctx.cfg.configuration,folders=new Set(allFiles.flatMap(data=>{let slug2=data.slug,folderName=path6.dirname(slug2??"");return slug2&&folderName!=="."&&folderName!=="tags"?[folderName]:[]})),folderDescriptions=Object.fromEntries([...folders].map(folder=>[folder,defaultProcessedContent({slug:joinSegments(folder,"index"),frontmatter:{title:`Folder: ${folder}`,tags:[]}})]));for(let[tree,file]of content){let slug2=_stripSlashes(simplifySlug(file.data.slug));folders.has(slug2)&&(folderDescriptions[slug2]=[tree,file])}for(let folder of folders){let slug2=joinSegments(folder,"index"),externalResources=pageResources(pathToRoot(slug2),resources),[tree,file]=folderDescriptions[folder],componentData={fileData:file.data,externalResources,cfg,children:[],tree,allFiles},content2=renderPage(slug2,componentData,opts,externalResources),fp=await emit({content:content2,slug:slug2,ext:".html"});fps.push(fp)}return fps}}},"FolderPage");import{toHtml as toHtml2}from"hast-util-to-html";import path7 from"path";var defaultOptions13={enableSiteMap:!0,enableRSS:!0,rssLimit:10,rssFullHtml:!1,includeEmptyFiles:!0};function generateSiteMap(cfg,idx){let base=cfg.baseUrl??"",createURLEntry=__name((slug2,content)=>` + https://${base}/${encodeURI(slug2)} + ${content.date?.toISOString()} + `,"createURLEntry");return`${Array.from(idx).map(([slug2,content])=>createURLEntry(simplifySlug(slug2),content)).join("")}`}__name(generateSiteMap,"generateSiteMap");function generateRSSFeed(cfg,idx,limit){let root=`https://${cfg.baseUrl??""}`,createURLEntry=__name((slug2,content)=>` + ${escapeHTML(content.title)} + ${root}/${encodeURI(slug2)} + ${root}/${encodeURI(slug2)} + ${content.richContent??content.description} + ${content.date?.toUTCString()} + `,"createURLEntry"),items=Array.from(idx).map(([slug2,content])=>createURLEntry(simplifySlug(slug2),content)).slice(0,limit??idx.size).join("");return` + + + ${escapeHTML(cfg.pageTitle)} + ${root} + ${limit?`Last ${limit} notes`:"Recent notes"} on ${escapeHTML(cfg.pageTitle)} + Quartz -- quartz.jzhao.xyz + ${items} + + `}__name(generateRSSFeed,"generateRSSFeed");var ContentIndex=__name(opts=>(opts={...defaultOptions13,...opts},{name:"ContentIndex",async emit(ctx,content,_resources,emit){let cfg=ctx.cfg.configuration,emitted=[],linkIndex=new Map;for(let[tree,file]of content){let slug2=file.data.slug,date=getDate(ctx.cfg.configuration,file.data)??new Date;(opts?.includeEmptyFiles||file.data.text&&file.data.text!=="")&&linkIndex.set(slug2,{title:file.data.frontmatter?.title,links:file.data.links??[],tags:file.data.frontmatter?.tags??[],content:file.data.text??"",richContent:opts?.rssFullHtml?escapeHTML(toHtml2(tree,{allowDangerousHtml:!0})):void 0,date,description:file.data.description??""})}opts?.enableSiteMap&&emitted.push(await emit({content:generateSiteMap(cfg,linkIndex),slug:"sitemap",ext:".xml"})),opts?.enableRSS&&emitted.push(await emit({content:generateRSSFeed(cfg,linkIndex,opts.rssLimit),slug:"index",ext:".xml"}));let fp=path7.join("static","contentIndex"),simplifiedIndex=Object.fromEntries(Array.from(linkIndex).map(([slug2,content2])=>(delete content2.description,delete content2.date,[slug2,content2])));return emitted.push(await emit({content:JSON.stringify(simplifiedIndex),slug:fp,ext:".json"})),emitted},getQuartzComponents:()=>[]}),"ContentIndex");import path8 from"path";var AliasRedirects=__name(()=>({name:"AliasRedirects",getQuartzComponents(){return[]},async emit({argv},content,_resources,emit){let fps=[];for(let[_tree,file]of content){let ogSlug=simplifySlug(file.data.slug),dir=path8.posix.relative(argv.directory,path8.dirname(file.data.filePath)),aliases=file.data.frontmatter?.aliases??file.data.frontmatter?.alias??[];typeof aliases=="string"&&(aliases=[aliases]);let slugs=aliases.map(alias=>path8.posix.join(dir,alias)),permalink=file.data.frontmatter?.permalink;typeof permalink=="string"&&slugs.push(permalink);for(let slug2 of slugs){let redirUrl=resolveRelative(slug2,file.data.slug),fp=await emit({content:` + + + + ${ogSlug} + + + + + + + `,slug:slug2,ext:".html"});fps.push(fp)}}return fps}}),"AliasRedirects");import path10 from"path";import fs2 from"fs";import path9 from"path";import{globby}from"globby";function toPosixPath(fp){return fp.split(path9.sep).join("/")}__name(toPosixPath,"toPosixPath");async function glob(pattern,cwd,ignorePatterns){return(await globby(pattern,{cwd,ignore:ignorePatterns,gitignore:!0})).map(toPosixPath)}__name(glob,"glob");var Assets=__name(()=>({name:"Assets",getQuartzComponents(){return[]},async emit({argv,cfg},_content,_resources,_emit){let assetsPath=argv.output,fps=await glob("**",argv.directory,["**/*.md",...cfg.configuration.ignorePatterns]),res=[];for(let fp of fps){let ext=path10.extname(fp),src=joinSegments(argv.directory,fp),name=slugifyFilePath(fp,!0)+ext,dest=joinSegments(assetsPath,name),dir=path10.dirname(dest);await fs2.promises.mkdir(dir,{recursive:!0}),await fs2.promises.copyFile(src,dest),res.push(dest)}return res}}),"Assets");import fs3 from"fs";var Static=__name(()=>({name:"Static",getQuartzComponents(){return[]},async emit({argv,cfg},_content,_resources,_emit){let staticPath=joinSegments(QUARTZ,"static"),fps=await glob("**",staticPath,cfg.configuration.ignorePatterns);return await fs3.promises.cp(staticPath,joinSegments(argv.output,"static"),{recursive:!0}),fps.map(fp=>joinSegments(argv.output,"static",fp))}}),"Static");var spa_inline_default=`// node_modules/micromorph/dist/index.js +var T = (e) => (t, r) => t[\`node\${e}\`] === r[\`node\${e}\`]; +var b = T("Name"); +var C = T("Type"); +var g = T("Value"); +function M(e, t) { + if (e.attributes.length === 0 && t.attributes.length === 0) + return []; + let r = [], n = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(); + for (let s of e.attributes) + n.set(s.name, s.value); + for (let s of t.attributes) { + let a = n.get(s.name); + s.value === a ? n.delete(s.name) : (typeof a < "u" && n.delete(s.name), o.set(s.name, s.value)); + } + for (let s of n.keys()) + r.push({ type: 5, name: s }); + for (let [s, a] of o.entries()) + r.push({ type: 4, name: s, value: a }); + return r; +} +function N(e, t = true) { + let r = \`\${e.localName}\`; + for (let { name: n, value: o } of e.attributes) + t && n.startsWith("data-") || (r += \`[\${n}=\${o}]\`); + return r += e.innerHTML, r; +} +function h(e) { + switch (e.tagName) { + case "BASE": + case "TITLE": + return e.localName; + case "META": { + if (e.hasAttribute("name")) + return \`meta[name="\${e.getAttribute("name")}"]\`; + if (e.hasAttribute("property")) + return \`meta[name="\${e.getAttribute("property")}"]\`; + break; + } + case "LINK": { + if (e.hasAttribute("rel") && e.hasAttribute("href")) + return \`link[rel="\${e.getAttribute("rel")}"][href="\${e.getAttribute("href")}"]\`; + if (e.hasAttribute("href")) + return \`link[href="\${e.getAttribute("href")}"]\`; + break; + } + } + return N(e); +} +function x(e) { + let [t, r = ""] = e.split("?"); + return \`\${t}?t=\${Date.now()}&\${r.replace(/t=\\d+/g, "")}\`; +} +function c(e) { + if (e.nodeType === 1 && e.hasAttribute("data-persist")) + return e; + if (e.nodeType === 1 && e.localName === "script") { + let t = document.createElement("script"); + for (let { name: r, value: n } of e.attributes) + r === "src" && (n = x(n)), t.setAttribute(r, n); + return t.innerHTML = e.innerHTML, t; + } + return e.cloneNode(true); +} +function R(e, t) { + if (e.children.length === 0 && t.children.length === 0) + return []; + let r = [], n = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(); + for (let a of e.children) + n.set(h(a), a); + for (let a of t.children) { + let i = h(a), u = n.get(i); + u ? N(a, false) !== N(u, false) && o.set(i, c(a)) : s.set(i, c(a)), n.delete(i); + } + for (let a of e.childNodes) { + if (a.nodeType === 1) { + let i = h(a); + if (n.has(i)) { + r.push({ type: 1 }); + continue; + } else if (o.has(i)) { + let u = o.get(i); + r.push({ type: 3, attributes: M(a, u), children: I(a, u) }); + continue; + } + } + r.push(void 0); + } + for (let a of s.values()) + r.push({ type: 0, node: c(a) }); + return r; +} +function I(e, t) { + let r = [], n = Math.max(e.childNodes.length, t.childNodes.length); + for (let o = 0; o < n; o++) { + let s = e.childNodes.item(o), a = t.childNodes.item(o); + r[o] = p(s, a); + } + return r; +} +function p(e, t) { + if (!e) + return { type: 0, node: c(t) }; + if (!t) + return { type: 1 }; + if (C(e, t)) { + if (e.nodeType === 3) { + let r = e.nodeValue, n = t.nodeValue; + if (r.trim().length === 0 && n.trim().length === 0) + return; + } + if (e.nodeType === 1) { + if (b(e, t)) { + let r = e.tagName === "HEAD" ? R : I; + return { type: 3, attributes: M(e, t), children: r(e, t) }; + } + return { type: 2, node: c(t) }; + } else + return e.nodeType === 9 ? p(e.documentElement, t.documentElement) : g(e, t) ? void 0 : { type: 2, value: t.nodeValue }; + } + return { type: 2, node: c(t) }; +} +function $(e, t) { + if (t.length !== 0) + for (let { type: r, name: n, value: o } of t) + r === 5 ? e.removeAttribute(n) : r === 4 && e.setAttribute(n, o); +} +async function O(e, t, r) { + if (!t) + return; + let n; + switch (e.nodeType === 9 ? (e = e.documentElement, n = e) : r ? n = r : n = e, t.type) { + case 0: { + let { node: o } = t; + e.appendChild(o); + return; + } + case 1: { + if (!n) + return; + e.removeChild(n); + return; + } + case 2: { + if (!n) + return; + let { node: o, value: s } = t; + if (typeof s == "string") { + n.nodeValue = s; + return; + } + n.replaceWith(o); + return; + } + case 3: { + if (!n) + return; + let { attributes: o, children: s } = t; + $(n, o); + let a = Array.from(n.childNodes); + await Promise.all(s.map((i, u) => O(n, i, a[u]))); + return; + } + } +} +function P(e, t) { + let r = p(e, t); + return O(e, r); +} + +// node_modules/github-slugger/index.js +var own = Object.hasOwnProperty; + +// quartz/util/path.ts +function getFullSlug(window2) { + const res = window2.document.body.dataset.slug; + return res; +} + +// quartz/components/scripts/quartz/components/scripts/spa.inline.ts +var NODE_TYPE_ELEMENT = 1; +var announcer = document.createElement("route-announcer"); +var isElement = (target) => target?.nodeType === NODE_TYPE_ELEMENT; +var isLocalUrl = (href) => { + try { + const url = new URL(href); + if (window.location.origin === url.origin) { + return true; + } + } catch (e) { + } + return false; +}; +var getOpts = ({ target }) => { + if (!isElement(target)) + return; + if (target.attributes.getNamedItem("target")?.value === "_blank") + return; + const a = target.closest("a"); + if (!a) + return; + if ("routerIgnore" in a.dataset) + return; + const { href } = a; + if (!isLocalUrl(href)) + return; + return { url: new URL(href), scroll: "routerNoscroll" in a.dataset ? false : void 0 }; +}; +function notifyNav(url) { + const event = new CustomEvent("nav", { detail: { url } }); + document.dispatchEvent(event); +} +var p2; +async function navigate(url, isBack = false) { + p2 = p2 || new DOMParser(); + const contents = await fetch(\`\${url}\`).then((res) => res.text()).catch(() => { + window.location.assign(url); + }); + if (!contents) + return; + const html = p2.parseFromString(contents, "text/html"); + let title = html.querySelector("title")?.textContent; + if (title) { + document.title = title; + } else { + const h1 = document.querySelector("h1"); + title = h1?.innerText ?? h1?.textContent ?? url.pathname; + } + if (announcer.textContent !== title) { + announcer.textContent = title; + } + announcer.dataset.persist = ""; + html.body.appendChild(announcer); + P(document.body, html.body); + if (!isBack) { + if (url.hash) { + const el = document.getElementById(decodeURIComponent(url.hash.substring(1))); + el?.scrollIntoView(); + } else { + window.scrollTo({ top: 0 }); + } + } + const elementsToRemove = document.head.querySelectorAll(":not([spa-preserve])"); + elementsToRemove.forEach((el) => el.remove()); + const elementsToAdd = html.head.querySelectorAll(":not([spa-preserve])"); + elementsToAdd.forEach((el) => document.head.appendChild(el)); + if (!isBack) { + history.pushState({}, "", url); + } + notifyNav(getFullSlug(window)); + delete announcer.dataset.persist; +} +window.spaNavigate = navigate; +function createRouter() { + if (typeof window !== "undefined") { + window.addEventListener("click", async (event) => { + const { url } = getOpts(event) ?? {}; + if (!url || event.ctrlKey || event.metaKey) + return; + event.preventDefault(); + try { + navigate(url, false); + } catch (e) { + window.location.assign(url); + } + }); + window.addEventListener("popstate", (event) => { + const { url } = getOpts(event) ?? {}; + if (window.location.hash && window.location.pathname === url?.pathname) + return; + try { + navigate(new URL(window.location.toString()), true); + } catch (e) { + window.location.reload(); + } + return; + }); + } + return new class Router { + go(pathname) { + const url = new URL(pathname, window.location.toString()); + return navigate(url, false); + } + back() { + return window.history.back(); + } + forward() { + return window.history.forward(); + } + }(); +} +createRouter(); +notifyNav(getFullSlug(window)); +if (!customElements.get("route-announcer")) { + const attrs = { + "aria-live": "assertive", + "aria-atomic": "true", + style: "position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px" + }; + customElements.define( + "route-announcer", + class RouteAnnouncer extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + for (const [key, value] of Object.entries(attrs)) { + this.setAttribute(key, value); + } + } + } + ); +} +`;var plausible_inline_default=`// node_modules/plausible-tracker/build/module/lib/request.js +function sendEvent(eventName, data, options) { + const isLocalhost = /^localhost$|^127(?:\\.[0-9]+){0,2}\\.[0-9]+$|^(?:0*:)*?:?0*1$/.test(location.hostname) || location.protocol === "file:"; + if (!data.trackLocalhost && isLocalhost) { + return console.warn("[Plausible] Ignoring event because website is running locally"); + } + try { + if (window.localStorage.plausible_ignore === "true") { + return console.warn('[Plausible] Ignoring event because "plausible_ignore" is set to "true" in localStorage'); + } + } catch (e) { + null; + } + const payload = { + n: eventName, + u: data.url, + d: data.domain, + r: data.referrer, + w: data.deviceWidth, + h: data.hashMode ? 1 : 0, + p: options && options.props ? JSON.stringify(options.props) : void 0 + }; + const req = new XMLHttpRequest(); + req.open("POST", \`\${data.apiHost}/api/event\`, true); + req.setRequestHeader("Content-Type", "text/plain"); + req.send(JSON.stringify(payload)); + req.onreadystatechange = () => { + if (req.readyState !== 4) + return; + if (options && options.callback) { + options.callback(); + } + }; +} + +// node_modules/plausible-tracker/build/module/lib/tracker.js +function Plausible(defaults) { + const getConfig = () => ({ + hashMode: false, + trackLocalhost: false, + url: location.href, + domain: location.hostname, + referrer: document.referrer || null, + deviceWidth: window.innerWidth, + apiHost: "https://plausible.io", + ...defaults + }); + const trackEvent = (eventName, options, eventData) => { + sendEvent(eventName, { ...getConfig(), ...eventData }, options); + }; + const trackPageview2 = (eventData, options) => { + trackEvent("pageview", options, eventData); + }; + const enableAutoPageviews = () => { + const page = () => trackPageview2(); + const originalPushState = history.pushState; + if (originalPushState) { + history.pushState = function(data, title, url) { + originalPushState.apply(this, [data, title, url]); + page(); + }; + addEventListener("popstate", page); + } + if (defaults && defaults.hashMode) { + addEventListener("hashchange", page); + } + trackPageview2(); + return function cleanup() { + if (originalPushState) { + history.pushState = originalPushState; + removeEventListener("popstate", page); + } + if (defaults && defaults.hashMode) { + removeEventListener("hashchange", page); + } + }; + }; + const enableAutoOutboundTracking = (targetNode = document, observerInit = { + subtree: true, + childList: true, + attributes: true, + attributeFilter: ["href"] + }) => { + function trackClick(event) { + trackEvent("Outbound Link: Click", { props: { url: this.href } }); + if (!(typeof process !== "undefined" && process && false)) { + setTimeout(() => { + location.href = this.href; + }, 150); + } + event.preventDefault(); + } + const tracked = /* @__PURE__ */ new Set(); + function addNode(node) { + if (node instanceof HTMLAnchorElement) { + if (node.host !== location.host) { + node.addEventListener("click", trackClick); + tracked.add(node); + } + } else if ("querySelectorAll" in node) { + node.querySelectorAll("a").forEach(addNode); + } + } + function removeNode(node) { + if (node instanceof HTMLAnchorElement) { + node.removeEventListener("click", trackClick); + tracked.delete(node); + } else if ("querySelectorAll" in node) { + node.querySelectorAll("a").forEach(removeNode); + } + } + const observer = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + if (mutation.type === "attributes") { + removeNode(mutation.target); + addNode(mutation.target); + } else if (mutation.type === "childList") { + mutation.addedNodes.forEach(addNode); + mutation.removedNodes.forEach(removeNode); + } + }); + }); + targetNode.querySelectorAll("a").forEach(addNode); + observer.observe(targetNode, observerInit); + return function cleanup() { + tracked.forEach((a) => { + a.removeEventListener("click", trackClick); + }); + tracked.clear(); + observer.disconnect(); + }; + }; + return { + trackEvent, + trackPageview: trackPageview2, + enableAutoPageviews, + enableAutoOutboundTracking + }; +} + +// node_modules/plausible-tracker/build/module/index.js +var module_default = Plausible; + +// quartz/components/scripts/quartz/components/scripts/plausible.inline.ts +var { trackPageview } = module_default(); +document.addEventListener("nav", () => trackPageview()); +`;var popover_inline_default=`// node_modules/@floating-ui/core/dist/floating-ui.core.browser.min.mjs +function t(t2) { + return t2.split("-")[1]; +} +function e(t2) { + return "y" === t2 ? "height" : "width"; +} +function n(t2) { + return t2.split("-")[0]; +} +function o(t2) { + return ["top", "bottom"].includes(n(t2)) ? "x" : "y"; +} +function i(i3, r3, a3) { + let { reference: l3, floating: s3 } = i3; + const c3 = l3.x + l3.width / 2 - s3.width / 2, f3 = l3.y + l3.height / 2 - s3.height / 2, m3 = o(r3), u3 = e(m3), g3 = l3[u3] / 2 - s3[u3] / 2, d3 = "x" === m3; + let p4; + switch (n(r3)) { + case "top": + p4 = { x: c3, y: l3.y - s3.height }; + break; + case "bottom": + p4 = { x: c3, y: l3.y + l3.height }; + break; + case "right": + p4 = { x: l3.x + l3.width, y: f3 }; + break; + case "left": + p4 = { x: l3.x - s3.width, y: f3 }; + break; + default: + p4 = { x: l3.x, y: l3.y }; + } + switch (t(r3)) { + case "start": + p4[m3] -= g3 * (a3 && d3 ? -1 : 1); + break; + case "end": + p4[m3] += g3 * (a3 && d3 ? -1 : 1); + } + return p4; +} +var r = async (t2, e2, n3) => { + const { placement: o3 = "bottom", strategy: r3 = "absolute", middleware: a3 = [], platform: l3 } = n3, s3 = a3.filter(Boolean), c3 = await (null == l3.isRTL ? void 0 : l3.isRTL(e2)); + let f3 = await l3.getElementRects({ reference: t2, floating: e2, strategy: r3 }), { x: m3, y: u3 } = i(f3, o3, c3), g3 = o3, d3 = {}, p4 = 0; + for (let n4 = 0; n4 < s3.length; n4++) { + const { name: a4, fn: h3 } = s3[n4], { x: y2, y: x3, data: w3, reset: v3 } = await h3({ x: m3, y: u3, initialPlacement: o3, placement: g3, strategy: r3, middlewareData: d3, rects: f3, platform: l3, elements: { reference: t2, floating: e2 } }); + m3 = null != y2 ? y2 : m3, u3 = null != x3 ? x3 : u3, d3 = { ...d3, [a4]: { ...d3[a4], ...w3 } }, v3 && p4 <= 50 && (p4++, "object" == typeof v3 && (v3.placement && (g3 = v3.placement), v3.rects && (f3 = true === v3.rects ? await l3.getElementRects({ reference: t2, floating: e2, strategy: r3 }) : v3.rects), { x: m3, y: u3 } = i(f3, g3, c3)), n4 = -1); + } + return { x: m3, y: u3, placement: g3, strategy: r3, middlewareData: d3 }; +}; +function a(t2, e2) { + return "function" == typeof t2 ? t2(e2) : t2; +} +function l(t2) { + return "number" != typeof t2 ? function(t3) { + return { top: 0, right: 0, bottom: 0, left: 0, ...t3 }; + }(t2) : { top: t2, right: t2, bottom: t2, left: t2 }; +} +function s(t2) { + return { ...t2, top: t2.y, left: t2.x, right: t2.x + t2.width, bottom: t2.y + t2.height }; +} +async function c(t2, e2) { + var n3; + void 0 === e2 && (e2 = {}); + const { x: o3, y: i3, platform: r3, rects: c3, elements: f3, strategy: m3 } = t2, { boundary: u3 = "clippingAncestors", rootBoundary: g3 = "viewport", elementContext: d3 = "floating", altBoundary: p4 = false, padding: h3 = 0 } = a(e2, t2), y2 = l(h3), x3 = f3[p4 ? "floating" === d3 ? "reference" : "floating" : d3], w3 = s(await r3.getClippingRect({ element: null == (n3 = await (null == r3.isElement ? void 0 : r3.isElement(x3))) || n3 ? x3 : x3.contextElement || await (null == r3.getDocumentElement ? void 0 : r3.getDocumentElement(f3.floating)), boundary: u3, rootBoundary: g3, strategy: m3 })), v3 = "floating" === d3 ? { ...c3.floating, x: o3, y: i3 } : c3.reference, b3 = await (null == r3.getOffsetParent ? void 0 : r3.getOffsetParent(f3.floating)), A3 = await (null == r3.isElement ? void 0 : r3.isElement(b3)) && await (null == r3.getScale ? void 0 : r3.getScale(b3)) || { x: 1, y: 1 }, R2 = s(r3.convertOffsetParentRelativeRectToViewportRelativeRect ? await r3.convertOffsetParentRelativeRectToViewportRelativeRect({ rect: v3, offsetParent: b3, strategy: m3 }) : v3); + return { top: (w3.top - R2.top + y2.top) / A3.y, bottom: (R2.bottom - w3.bottom + y2.bottom) / A3.y, left: (w3.left - R2.left + y2.left) / A3.x, right: (R2.right - w3.right + y2.right) / A3.x }; +} +var f = Math.min; +var m = Math.max; +function u(t2, e2, n3) { + return m(t2, f(e2, n3)); +} +var d = ["top", "right", "bottom", "left"]; +var p = d.reduce((t2, e2) => t2.concat(e2, e2 + "-start", e2 + "-end"), []); +var h = { left: "right", right: "left", bottom: "top", top: "bottom" }; +function y(t2) { + return t2.replace(/left|right|bottom|top/g, (t3) => h[t3]); +} +function x(n3, i3, r3) { + void 0 === r3 && (r3 = false); + const a3 = t(n3), l3 = o(n3), s3 = e(l3); + let c3 = "x" === l3 ? a3 === (r3 ? "end" : "start") ? "right" : "left" : "start" === a3 ? "bottom" : "top"; + return i3.reference[s3] > i3.floating[s3] && (c3 = y(c3)), { main: c3, cross: y(c3) }; +} +var w = { start: "end", end: "start" }; +function v(t2) { + return t2.replace(/start|end/g, (t3) => w[t3]); +} +var A = function(e2) { + return void 0 === e2 && (e2 = {}), { name: "flip", options: e2, async fn(o3) { + var i3; + const { placement: r3, middlewareData: l3, rects: s3, initialPlacement: f3, platform: m3, elements: u3 } = o3, { mainAxis: g3 = true, crossAxis: d3 = true, fallbackPlacements: p4, fallbackStrategy: h3 = "bestFit", fallbackAxisSideDirection: w3 = "none", flipAlignment: b3 = true, ...A3 } = a(e2, o3), R2 = n(r3), P2 = n(f3) === f3, E3 = await (null == m3.isRTL ? void 0 : m3.isRTL(u3.floating)), T3 = p4 || (P2 || !b3 ? [y(f3)] : function(t2) { + const e3 = y(t2); + return [v(t2), e3, v(e3)]; + }(f3)); + p4 || "none" === w3 || T3.push(...function(e3, o4, i4, r4) { + const a3 = t(e3); + let l4 = function(t2, e4, n3) { + const o5 = ["left", "right"], i5 = ["right", "left"], r5 = ["top", "bottom"], a4 = ["bottom", "top"]; + switch (t2) { + case "top": + case "bottom": + return n3 ? e4 ? i5 : o5 : e4 ? o5 : i5; + case "left": + case "right": + return e4 ? r5 : a4; + default: + return []; + } + }(n(e3), "start" === i4, r4); + return a3 && (l4 = l4.map((t2) => t2 + "-" + a3), o4 && (l4 = l4.concat(l4.map(v)))), l4; + }(f3, b3, w3, E3)); + const D3 = [f3, ...T3], L3 = await c(o3, A3), k2 = []; + let O3 = (null == (i3 = l3.flip) ? void 0 : i3.overflows) || []; + if (g3 && k2.push(L3[R2]), d3) { + const { main: t2, cross: e3 } = x(r3, s3, E3); + k2.push(L3[t2], L3[e3]); + } + if (O3 = [...O3, { placement: r3, overflows: k2 }], !k2.every((t2) => t2 <= 0)) { + var B3, C3; + const t2 = ((null == (B3 = l3.flip) ? void 0 : B3.index) || 0) + 1, e3 = D3[t2]; + if (e3) + return { data: { index: t2, overflows: O3 }, reset: { placement: e3 } }; + let n3 = null == (C3 = O3.filter((t3) => t3.overflows[0] <= 0).sort((t3, e4) => t3.overflows[1] - e4.overflows[1])[0]) ? void 0 : C3.placement; + if (!n3) + switch (h3) { + case "bestFit": { + var H2; + const t3 = null == (H2 = O3.map((t4) => [t4.placement, t4.overflows.filter((t5) => t5 > 0).reduce((t5, e4) => t5 + e4, 0)]).sort((t4, e4) => t4[1] - e4[1])[0]) ? void 0 : H2[0]; + t3 && (n3 = t3); + break; + } + case "initialPlacement": + n3 = f3; + } + if (r3 !== n3) + return { reset: { placement: n3 } }; + } + return {}; + } }; +}; +function T(t2) { + const e2 = f(...t2.map((t3) => t3.left)), n3 = f(...t2.map((t3) => t3.top)); + return { x: e2, y: n3, width: m(...t2.map((t3) => t3.right)) - e2, height: m(...t2.map((t3) => t3.bottom)) - n3 }; +} +var D = function(t2) { + return void 0 === t2 && (t2 = {}), { name: "inline", options: t2, async fn(e2) { + const { placement: i3, elements: r3, rects: c3, platform: u3, strategy: g3 } = e2, { padding: d3 = 2, x: p4, y: h3 } = a(t2, e2), y2 = Array.from(await (null == u3.getClientRects ? void 0 : u3.getClientRects(r3.reference)) || []), x3 = function(t3) { + const e3 = t3.slice().sort((t4, e4) => t4.y - e4.y), n3 = []; + let o3 = null; + for (let t4 = 0; t4 < e3.length; t4++) { + const i4 = e3[t4]; + !o3 || i4.y - o3.y > o3.height / 2 ? n3.push([i4]) : n3[n3.length - 1].push(i4), o3 = i4; + } + return n3.map((t4) => s(T(t4))); + }(y2), w3 = s(T(y2)), v3 = l(d3); + const b3 = await u3.getElementRects({ reference: { getBoundingClientRect: function() { + if (2 === x3.length && x3[0].left > x3[1].right && null != p4 && null != h3) + return x3.find((t3) => p4 > t3.left - v3.left && p4 < t3.right + v3.right && h3 > t3.top - v3.top && h3 < t3.bottom + v3.bottom) || w3; + if (x3.length >= 2) { + if ("x" === o(i3)) { + const t4 = x3[0], e4 = x3[x3.length - 1], o3 = "top" === n(i3), r5 = t4.top, a4 = e4.bottom, l4 = o3 ? t4.left : e4.left, s4 = o3 ? t4.right : e4.right; + return { top: r5, bottom: a4, left: l4, right: s4, width: s4 - l4, height: a4 - r5, x: l4, y: r5 }; + } + const t3 = "left" === n(i3), e3 = m(...x3.map((t4) => t4.right)), r4 = f(...x3.map((t4) => t4.left)), a3 = x3.filter((n3) => t3 ? n3.left === r4 : n3.right === e3), l3 = a3[0].top, s3 = a3[a3.length - 1].bottom; + return { top: l3, bottom: s3, left: r4, right: e3, width: e3 - r4, height: s3 - l3, x: r4, y: l3 }; + } + return w3; + } }, floating: r3.floating, strategy: g3 }); + return c3.reference.x !== b3.reference.x || c3.reference.y !== b3.reference.y || c3.reference.width !== b3.reference.width || c3.reference.height !== b3.reference.height ? { reset: { rects: b3 } } : {}; + } }; +}; +function k(t2) { + return "x" === t2 ? "y" : "x"; +} +var O = function(t2) { + return void 0 === t2 && (t2 = {}), { name: "shift", options: t2, async fn(e2) { + const { x: i3, y: r3, placement: l3 } = e2, { mainAxis: s3 = true, crossAxis: f3 = false, limiter: m3 = { fn: (t3) => { + let { x: e3, y: n3 } = t3; + return { x: e3, y: n3 }; + } }, ...g3 } = a(t2, e2), d3 = { x: i3, y: r3 }, p4 = await c(e2, g3), h3 = o(n(l3)), y2 = k(h3); + let x3 = d3[h3], w3 = d3[y2]; + if (s3) { + const t3 = "y" === h3 ? "bottom" : "right"; + x3 = u(x3 + p4["y" === h3 ? "top" : "left"], x3, x3 - p4[t3]); + } + if (f3) { + const t3 = "y" === y2 ? "bottom" : "right"; + w3 = u(w3 + p4["y" === y2 ? "top" : "left"], w3, w3 - p4[t3]); + } + const v3 = m3.fn({ ...e2, [h3]: x3, [y2]: w3 }); + return { ...v3, data: { x: v3.x - i3, y: v3.y - r3 } }; + } }; +}; + +// node_modules/@floating-ui/dom/dist/floating-ui.dom.browser.min.mjs +function n2(t2) { + var e2; + return (null == (e2 = t2.ownerDocument) ? void 0 : e2.defaultView) || window; +} +function o2(t2) { + return n2(t2).getComputedStyle(t2); +} +function i2(t2) { + return t2 instanceof n2(t2).Node; +} +function r2(t2) { + return i2(t2) ? (t2.nodeName || "").toLowerCase() : "#document"; +} +function c2(t2) { + return t2 instanceof n2(t2).HTMLElement; +} +function l2(t2) { + return t2 instanceof n2(t2).Element; +} +function s2(t2) { + return "undefined" != typeof ShadowRoot && (t2 instanceof n2(t2).ShadowRoot || t2 instanceof ShadowRoot); +} +function f2(t2) { + const { overflow: e2, overflowX: n3, overflowY: i3, display: r3 } = o2(t2); + return /auto|scroll|overlay|hidden|clip/.test(e2 + i3 + n3) && !["inline", "contents"].includes(r3); +} +function u2(t2) { + return ["table", "td", "th"].includes(r2(t2)); +} +function a2(t2) { + const e2 = d2(), n3 = o2(t2); + return "none" !== n3.transform || "none" !== n3.perspective || !!n3.containerType && "normal" !== n3.containerType || !e2 && !!n3.backdropFilter && "none" !== n3.backdropFilter || !e2 && !!n3.filter && "none" !== n3.filter || ["transform", "perspective", "filter"].some((t3) => (n3.willChange || "").includes(t3)) || ["paint", "layout", "strict", "content"].some((t3) => (n3.contain || "").includes(t3)); +} +function d2() { + return !("undefined" == typeof CSS || !CSS.supports) && CSS.supports("-webkit-backdrop-filter", "none"); +} +function h2(t2) { + return ["html", "body", "#document"].includes(r2(t2)); +} +var p2 = Math.min; +var m2 = Math.max; +var g2 = Math.round; +var w2 = (t2) => ({ x: t2, y: t2 }); +function x2(t2) { + const e2 = o2(t2); + let n3 = parseFloat(e2.width) || 0, i3 = parseFloat(e2.height) || 0; + const r3 = c2(t2), l3 = r3 ? t2.offsetWidth : n3, s3 = r3 ? t2.offsetHeight : i3, f3 = g2(n3) !== l3 || g2(i3) !== s3; + return f3 && (n3 = l3, i3 = s3), { width: n3, height: i3, $: f3 }; +} +function v2(t2) { + return l2(t2) ? t2 : t2.contextElement; +} +function b2(t2) { + const e2 = v2(t2); + if (!c2(e2)) + return w2(1); + const n3 = e2.getBoundingClientRect(), { width: o3, height: i3, $: r3 } = x2(e2); + let l3 = (r3 ? g2(n3.width) : n3.width) / o3, s3 = (r3 ? g2(n3.height) : n3.height) / i3; + return l3 && Number.isFinite(l3) || (l3 = 1), s3 && Number.isFinite(s3) || (s3 = 1), { x: l3, y: s3 }; +} +var L2 = w2(0); +function T2(t2, e2, o3) { + var i3, r3; + if (void 0 === e2 && (e2 = true), !d2()) + return L2; + const c3 = t2 ? n2(t2) : window; + return !o3 || e2 && o3 !== c3 ? L2 : { x: (null == (i3 = c3.visualViewport) ? void 0 : i3.offsetLeft) || 0, y: (null == (r3 = c3.visualViewport) ? void 0 : r3.offsetTop) || 0 }; +} +function R(e2, o3, i3, r3) { + void 0 === o3 && (o3 = false), void 0 === i3 && (i3 = false); + const c3 = e2.getBoundingClientRect(), s3 = v2(e2); + let f3 = w2(1); + o3 && (r3 ? l2(r3) && (f3 = b2(r3)) : f3 = b2(e2)); + const u3 = T2(s3, i3, r3); + let a3 = (c3.left + u3.x) / f3.x, d3 = (c3.top + u3.y) / f3.y, h3 = c3.width / f3.x, p4 = c3.height / f3.y; + if (s3) { + const t2 = n2(s3), e3 = r3 && l2(r3) ? n2(r3) : r3; + let o4 = t2.frameElement; + for (; o4 && r3 && e3 !== t2; ) { + const t3 = b2(o4), e4 = o4.getBoundingClientRect(), i4 = getComputedStyle(o4), r4 = e4.left + (o4.clientLeft + parseFloat(i4.paddingLeft)) * t3.x, c4 = e4.top + (o4.clientTop + parseFloat(i4.paddingTop)) * t3.y; + a3 *= t3.x, d3 *= t3.y, h3 *= t3.x, p4 *= t3.y, a3 += r4, d3 += c4, o4 = n2(o4).frameElement; + } + } + return s({ width: h3, height: p4, x: a3, y: d3 }); +} +function S(t2) { + return ((i2(t2) ? t2.ownerDocument : t2.document) || window.document).documentElement; +} +function E2(t2) { + return l2(t2) ? { scrollLeft: t2.scrollLeft, scrollTop: t2.scrollTop } : { scrollLeft: t2.pageXOffset, scrollTop: t2.pageYOffset }; +} +function C2(t2) { + return R(S(t2)).left + E2(t2).scrollLeft; +} +function F(t2) { + if ("html" === r2(t2)) + return t2; + const e2 = t2.assignedSlot || t2.parentNode || s2(t2) && t2.host || S(t2); + return s2(e2) ? e2.host : e2; +} +function O2(t2) { + const e2 = F(t2); + return h2(e2) ? t2.ownerDocument ? t2.ownerDocument.body : t2.body : c2(e2) && f2(e2) ? e2 : O2(e2); +} +function D2(t2, e2) { + var o3; + void 0 === e2 && (e2 = []); + const i3 = O2(t2), r3 = i3 === (null == (o3 = t2.ownerDocument) ? void 0 : o3.body), c3 = n2(i3); + return r3 ? e2.concat(c3, c3.visualViewport || [], f2(i3) ? i3 : []) : e2.concat(i3, D2(i3)); +} +function W(e2, i3, r3) { + let s3; + if ("viewport" === i3) + s3 = function(t2, e3) { + const o3 = n2(t2), i4 = S(t2), r4 = o3.visualViewport; + let c3 = i4.clientWidth, l3 = i4.clientHeight, s4 = 0, f3 = 0; + if (r4) { + c3 = r4.width, l3 = r4.height; + const t3 = d2(); + (!t3 || t3 && "fixed" === e3) && (s4 = r4.offsetLeft, f3 = r4.offsetTop); + } + return { width: c3, height: l3, x: s4, y: f3 }; + }(e2, r3); + else if ("document" === i3) + s3 = function(t2) { + const e3 = S(t2), n3 = E2(t2), i4 = t2.ownerDocument.body, r4 = m2(e3.scrollWidth, e3.clientWidth, i4.scrollWidth, i4.clientWidth), c3 = m2(e3.scrollHeight, e3.clientHeight, i4.scrollHeight, i4.clientHeight); + let l3 = -n3.scrollLeft + C2(t2); + const s4 = -n3.scrollTop; + return "rtl" === o2(i4).direction && (l3 += m2(e3.clientWidth, i4.clientWidth) - r4), { width: r4, height: c3, x: l3, y: s4 }; + }(S(e2)); + else if (l2(i3)) + s3 = function(t2, e3) { + const n3 = R(t2, true, "fixed" === e3), o3 = n3.top + t2.clientTop, i4 = n3.left + t2.clientLeft, r4 = c2(t2) ? b2(t2) : w2(1); + return { width: t2.clientWidth * r4.x, height: t2.clientHeight * r4.y, x: i4 * r4.x, y: o3 * r4.y }; + }(i3, r3); + else { + const t2 = T2(e2); + s3 = { ...i3, x: i3.x - t2.x, y: i3.y - t2.y }; + } + return s(s3); +} +function H(t2, e2) { + const n3 = F(t2); + return !(n3 === e2 || !l2(n3) || h2(n3)) && ("fixed" === o2(n3).position || H(n3, e2)); +} +function z(t2, e2) { + return c2(t2) && "fixed" !== o2(t2).position ? e2 ? e2(t2) : t2.offsetParent : null; +} +function M(t2, e2) { + const i3 = n2(t2); + if (!c2(t2)) + return i3; + let l3 = z(t2, e2); + for (; l3 && u2(l3) && "static" === o2(l3).position; ) + l3 = z(l3, e2); + return l3 && ("html" === r2(l3) || "body" === r2(l3) && "static" === o2(l3).position && !a2(l3)) ? i3 : l3 || function(t3) { + let e3 = F(t3); + for (; c2(e3) && !h2(e3); ) { + if (a2(e3)) + return e3; + e3 = F(e3); + } + return null; + }(t2) || i3; +} +function P(t2, e2, n3) { + const o3 = c2(e2), i3 = S(e2), l3 = "fixed" === n3, s3 = R(t2, true, l3, e2); + let u3 = { scrollLeft: 0, scrollTop: 0 }; + const a3 = w2(0); + if (o3 || !o3 && !l3) + if (("body" !== r2(e2) || f2(i3)) && (u3 = E2(e2)), c2(e2)) { + const t3 = R(e2, true, l3, e2); + a3.x = t3.x + e2.clientLeft, a3.y = t3.y + e2.clientTop; + } else + i3 && (a3.x = C2(i3)); + return { x: s3.left + u3.scrollLeft - a3.x, y: s3.top + u3.scrollTop - a3.y, width: s3.width, height: s3.height }; +} +var A2 = { getClippingRect: function(t2) { + let { element: e2, boundary: n3, rootBoundary: i3, strategy: c3 } = t2; + const s3 = "clippingAncestors" === n3 ? function(t3, e3) { + const n4 = e3.get(t3); + if (n4) + return n4; + let i4 = D2(t3).filter((t4) => l2(t4) && "body" !== r2(t4)), c4 = null; + const s4 = "fixed" === o2(t3).position; + let u4 = s4 ? F(t3) : t3; + for (; l2(u4) && !h2(u4); ) { + const e4 = o2(u4), n5 = a2(u4); + n5 || "fixed" !== e4.position || (c4 = null), (s4 ? !n5 && !c4 : !n5 && "static" === e4.position && c4 && ["absolute", "fixed"].includes(c4.position) || f2(u4) && !n5 && H(t3, u4)) ? i4 = i4.filter((t4) => t4 !== u4) : c4 = e4, u4 = F(u4); + } + return e3.set(t3, i4), i4; + }(e2, this._c) : [].concat(n3), u3 = [...s3, i3], d3 = u3[0], g3 = u3.reduce((t3, n4) => { + const o3 = W(e2, n4, c3); + return t3.top = m2(o3.top, t3.top), t3.right = p2(o3.right, t3.right), t3.bottom = p2(o3.bottom, t3.bottom), t3.left = m2(o3.left, t3.left), t3; + }, W(e2, d3, c3)); + return { width: g3.right - g3.left, height: g3.bottom - g3.top, x: g3.left, y: g3.top }; +}, convertOffsetParentRelativeRectToViewportRelativeRect: function(t2) { + let { rect: e2, offsetParent: n3, strategy: o3 } = t2; + const i3 = c2(n3), l3 = S(n3); + if (n3 === l3) + return e2; + let s3 = { scrollLeft: 0, scrollTop: 0 }, u3 = w2(1); + const a3 = w2(0); + if ((i3 || !i3 && "fixed" !== o3) && (("body" !== r2(n3) || f2(l3)) && (s3 = E2(n3)), c2(n3))) { + const t3 = R(n3); + u3 = b2(n3), a3.x = t3.x + n3.clientLeft, a3.y = t3.y + n3.clientTop; + } + return { width: e2.width * u3.x, height: e2.height * u3.y, x: e2.x * u3.x - s3.scrollLeft * u3.x + a3.x, y: e2.y * u3.y - s3.scrollTop * u3.y + a3.y }; +}, isElement: l2, getDimensions: function(t2) { + return x2(t2); +}, getOffsetParent: M, getDocumentElement: S, getScale: b2, async getElementRects(t2) { + let { reference: e2, floating: n3, strategy: o3 } = t2; + const i3 = this.getOffsetParent || M, r3 = this.getDimensions; + return { reference: P(e2, await i3(n3), o3), floating: { x: 0, y: 0, ...await r3(n3) } }; +}, getClientRects: (t2) => Array.from(t2.getClientRects()), isRTL: (t2) => "rtl" === o2(t2).direction }; +var B2 = (t2, n3, o3) => { + const i3 = /* @__PURE__ */ new Map(), r3 = { platform: A2, ...o3 }, c3 = { ...r3.platform, _c: i3 }; + return r(t2, n3, { ...r3, platform: c3 }); +}; + +// quartz/components/scripts/quartz/components/scripts/popover.inline.ts +function normalizeRelativeURLs(el, base) { + const update = (el2, attr, base2) => { + el2.setAttribute(attr, new URL(el2.getAttribute(attr), base2).pathname); + }; + el.querySelectorAll('[href^="./"], [href^="../"]').forEach((item) => update(item, "href", base)); + el.querySelectorAll('[src^="./"], [src^="../"]').forEach((item) => update(item, "src", base)); +} +var p3 = new DOMParser(); +async function mouseEnterHandler({ clientX, clientY }) { + const link = this; + async function setPosition(popoverElement2) { + const { x: x3, y: y2 } = await B2(link, popoverElement2, { + middleware: [D({ x: clientX, y: clientY }), O(), A()] + }); + Object.assign(popoverElement2.style, { + left: \`\${x3}px\`, + top: \`\${y2}px\` + }); + } + if ([...link.children].some((child) => child.classList.contains("popover"))) { + return setPosition(link.lastChild); + } + const thisUrl = new URL(document.location.href); + thisUrl.hash = ""; + thisUrl.search = ""; + const targetUrl = new URL(link.href); + const hash = targetUrl.hash; + targetUrl.hash = ""; + targetUrl.search = ""; + if (thisUrl.toString() === targetUrl.toString()) + return; + const contents = await fetch(\`\${targetUrl}\`).then((res) => res.text()).catch((err) => { + console.error(err); + }); + if (!contents) + return; + const html = p3.parseFromString(contents, "text/html"); + normalizeRelativeURLs(html, targetUrl); + const elts = [...html.getElementsByClassName("popover-hint")]; + if (elts.length === 0) + return; + const popoverElement = document.createElement("div"); + popoverElement.classList.add("popover"); + const popoverInner = document.createElement("div"); + popoverInner.classList.add("popover-inner"); + popoverElement.appendChild(popoverInner); + elts.forEach((elt) => popoverInner.appendChild(elt)); + setPosition(popoverElement); + link.appendChild(popoverElement); + if (hash !== "") { + const heading = popoverInner.querySelector(hash); + if (heading) { + popoverInner.scroll({ top: heading.offsetTop - 12, behavior: "instant" }); + } + } +} +document.addEventListener("nav", () => { + const links = [...document.getElementsByClassName("internal")]; + for (const link of links) { + link.removeEventListener("mouseenter", mouseEnterHandler); + link.addEventListener("mouseenter", mouseEnterHandler); + } +}); +`;var custom_default=` +:root { + --shiki-color-text: #24292e; + --shiki-color-background: #f8f8f8; + --shiki-token-constant: #005cc5; + --shiki-token-string: #032f62; + --shiki-token-comment: #6a737d; + --shiki-token-keyword: #d73a49; + --shiki-token-parameter: #24292e; + --shiki-token-function: #24292e; + --shiki-token-string-expression: #22863a; + --shiki-token-punctuation: #24292e; + --shiki-token-link: #24292e; +} + +[saved-theme=dark] { + --shiki-color-text: #e1e4e8 !important; + --shiki-color-background: #24292e !important; + --shiki-token-constant: #79b8ff !important; + --shiki-token-string: #9ecbff !important; + --shiki-token-comment: #6a737d !important; + --shiki-token-keyword: #f97583 !important; + --shiki-token-parameter: #e1e4e8 !important; + --shiki-token-function: #e1e4e8 !important; + --shiki-token-string-expression: #85e89d !important; + --shiki-token-punctuation: #e1e4e8 !important; + --shiki-token-link: #e1e4e8 !important; +} + +.callout { + border: 1px solid var(--border); + background-color: var(--bg); + border-radius: 5px; + padding: 0 1rem; + overflow-y: hidden; + transition: max-height 0.3s ease; + box-sizing: border-box; +} +.callout > *:nth-child(2) { + margin-top: 0; +} +.callout[data-callout=note] { + --color: #448aff; + --border: #448aff44; + --bg: #448aff10; +} +.callout[data-callout=abstract] { + --color: #00b0ff; + --border: #00b0ff44; + --bg: #00b0ff10; +} +.callout[data-callout=info], .callout[data-callout=todo] { + --color: #00b8d4; + --border: #00b8d444; + --bg: #00b8d410; +} +.callout[data-callout=tip] { + --color: #00bfa5; + --border: #00bfa544; + --bg: #00bfa510; +} +.callout[data-callout=success] { + --color: #09ad7a; + --border: #09ad7144; + --bg: #09ad7110; +} +.callout[data-callout=question] { + --color: #dba642; + --border: #dba64244; + --bg: #dba64210; +} +.callout[data-callout=warning] { + --color: #db8942; + --border: #db894244; + --bg: #db894210; +} +.callout[data-callout=failure], .callout[data-callout=danger], .callout[data-callout=bug] { + --color: #db4242; + --border: #db424244; + --bg: #db424210; +} +.callout[data-callout=example] { + --color: #7a43b5; + --border: #7a43b544; + --bg: #7a43b510; +} +.callout[data-callout=quote] { + --color: var(--secondary); + --border: var(--lightgray); +} +.callout.is-collapsed > .callout-title > .fold { + transform: rotateZ(-90deg); +} + +.callout-title { + display: flex; + gap: 5px; + padding: 1rem 0; + color: var(--color); +} +.callout-title .fold { + margin-left: 0.5rem; + transition: transform 0.3s ease; + opacity: 0.8; + cursor: pointer; +} +.callout-title > .callout-title-inner > p { + color: var(--color); + margin: 0; +} + +.callout-icon { + width: 18px; + height: 18px; + flex: 0 0 18px; + padding-top: 4px; +} + +.callout-title-inner { + font-weight: 700; +} + +html { + scroll-behavior: smooth; + -webkit-text-size-adjust: none; + text-size-adjust: none; + overflow-x: hidden; + width: 100vw; +} + +body, +section { + margin: 0; + max-width: 100%; + box-sizing: border-box; + background-color: var(--light); + font-family: var(--bodyFont); + color: var(--darkgray); +} + +.text-highlight { + background-color: rgba(255, 242, 54, 0.5333333333); + padding: 0 0.1rem; + border-radius: 5px; +} + +::selection { + background: color-mix(in srgb, var(--tertiary) 75%, transparent); + color: var(--darkgray); +} + +p, +ul, +text, +a, +tr, +td, +li, +ol, +ul, +.katex, +.math { + color: var(--darkgray); + fill: var(--darkgray); + overflow-wrap: anywhere; + hyphens: auto; +} + +.math.math-display { + text-align: center; +} + +a { + font-weight: 600; + text-decoration: none; + transition: color 0.2s ease; + color: var(--secondary); +} +a:hover { + color: var(--tertiary) !important; +} +a.internal { + text-decoration: none; + background-color: var(--highlight); + padding: 0 0.1rem; + border-radius: 5px; +} + +.desktop-only { + display: initial; +} +@media all and (max-width: 1510px) { + .desktop-only { + display: none; + } +} + +.mobile-only { + display: none; +} +@media all and (max-width: 1510px) { + .mobile-only { + display: initial; + } +} + +@media all and (max-width: 1510px) { + .page { + margin: 0 auto; + padding: 0 1rem; + max-width: 750px; + } +} +.page article { + position: relative; +} +.page article > h1 { + font-size: 2rem; +} +.page article li:has(> input[type=checkbox]) { + list-style-type: none; + padding-left: 0; +} +.page article li:has(> input[type=checkbox]:checked) { + text-decoration: line-through; + text-decoration-color: var(--gray); + color: var(--gray); +} +.page article li > * { + margin-top: 0; + margin-bottom: 0; +} +.page article p > strong { + color: var(--dark); +} +.page > #quartz-body { + width: 100%; + display: flex; +} +@media all and (max-width: 1510px) { + .page > #quartz-body { + flex-direction: column; + } +} +.page > #quartz-body .sidebar { + flex: 1; + display: flex; + flex-direction: column; + gap: 2rem; + top: 0; + width: 380px; + margin-top: 6rem; + box-sizing: border-box; + padding: 0 4rem; + position: fixed; +} +@media all and (max-width: 1510px) { + .page > #quartz-body .sidebar { + position: initial; + flex-direction: row; + padding: 0; + width: initial; + margin-top: 2rem; + } +} +.page > #quartz-body .sidebar.left { + left: calc((100vw - 750px) / 2 - 380px); +} +@media all and (max-width: 1510px) { + .page > #quartz-body .sidebar.left { + gap: 0; + align-items: center; + } +} +.page > #quartz-body .sidebar.right { + right: calc((100vw - 750px) / 2 - 380px); +} +@media all and (max-width: 1510px) { + .page > #quartz-body .sidebar.right > * { + flex: 1; + } +} +.page .page-header { + width: 750px; + margin: 6rem auto 0 auto; +} +@media all and (max-width: 1510px) { + .page .page-header { + width: initial; + margin-top: 2rem; + } +} +.page .center, .page footer { + margin-left: auto; + margin-right: auto; + width: 750px; +} +@media all and (max-width: 1510px) { + .page .center, .page footer { + width: initial; + margin-left: 0; + margin-right: 0; + } +} + +.footnotes { + margin-top: 2rem; + border-top: 1px solid var(--lightgray); +} + +input[type=checkbox] { + transform: translateY(2px); + color: var(--secondary); + border: 1px solid var(--lightgray); + border-radius: 3px; + background-color: var(--light); + position: relative; + margin-inline-end: 0.2rem; + margin-inline-start: -1.4rem; + appearance: none; + width: 16px; + height: 16px; +} +input[type=checkbox]:checked { + border-color: var(--secondary); + background-color: var(--secondary); +} +input[type=checkbox]:checked::after { + content: ""; + position: absolute; + left: 4px; + top: 1px; + width: 4px; + height: 8px; + display: block; + border: solid var(--light); + border-width: 0 2px 2px 0; + transform: rotate(45deg); +} + +blockquote { + margin: 1rem 0; + border-left: 3px solid var(--secondary); + padding-left: 1rem; + transition: border-color 0.2s ease; +} + +h1, +h2, +h3, +h4, +h5, +h6, +thead { + font-family: var(--headerFont); + color: var(--dark); + font-weight: revert; + margin-bottom: 0; +} +article > h1 > a, +article > h2 > a, +article > h3 > a, +article > h4 > a, +article > h5 > a, +article > h6 > a, +article > thead > a { + color: var(--dark); +} +article > h1 > a.internal, +article > h2 > a.internal, +article > h3 > a.internal, +article > h4 > a.internal, +article > h5 > a.internal, +article > h6 > a.internal, +article > thead > a.internal { + background-color: transparent; +} + +h1[id] > a[href^="#"], +h2[id] > a[href^="#"], +h3[id] > a[href^="#"], +h4[id] > a[href^="#"], +h5[id] > a[href^="#"], +h6[id] > a[href^="#"] { + margin: 0 0.5rem; + opacity: 0; + transition: opacity 0.2s ease; + transform: translateY(-0.1rem); + display: inline-block; + font-family: var(--codeFont); + user-select: none; +} +h1[id]:hover > a, +h2[id]:hover > a, +h3[id]:hover > a, +h4[id]:hover > a, +h5[id]:hover > a, +h6[id]:hover > a { + opacity: 1; +} + +h1 { + font-size: 1.75rem; + margin-top: 2.25rem; + margin-bottom: 1rem; +} + +h2 { + font-size: 1.4rem; + margin-top: 1.9rem; + margin-bottom: 1rem; +} + +h3 { + font-size: 1.12rem; + margin-top: 1.62rem; + margin-bottom: 1rem; +} + +h4, +h5, +h6 { + font-size: 1rem; + margin-top: 1.5rem; + margin-bottom: 1rem; +} + +div[data-rehype-pretty-code-fragment] { + line-height: 1.6rem; + position: relative; +} +div[data-rehype-pretty-code-fragment] > div[data-rehype-pretty-code-title] { + font-family: var(--codeFont); + font-size: 0.9rem; + padding: 0.1rem 0.5rem; + border: 1px solid var(--lightgray); + width: max-content; + border-radius: 5px; + margin-bottom: -0.5rem; + color: var(--darkgray); +} +div[data-rehype-pretty-code-fragment] > pre { + padding: 0.5rem 0; +} + +pre { + font-family: var(--codeFont); + padding: 0.5rem; + border-radius: 5px; + overflow-x: auto; + border: 1px solid var(--lightgray); +} +pre:has(> code.mermaid) { + border: none; +} +pre > code { + background: none; + padding: 0; + font-size: 0.85rem; + counter-reset: line; + counter-increment: line 0; + display: grid; +} +pre > code [data-highlighted-chars] { + background-color: var(--highlight); + border-radius: 5px; +} +pre > code > [data-line] { + padding: 0 0.25rem; + box-sizing: border-box; + border-left: 3px solid transparent; +} +pre > code > [data-line][data-highlighted-line] { + background-color: var(--highlight); + border-left: 3px solid var(--secondary); +} +pre > code > [data-line]::before { + content: counter(line); + counter-increment: line; + width: 1rem; + margin-right: 1rem; + display: inline-block; + text-align: right; + color: rgba(115, 138, 148, 0.6); +} +pre > code[data-line-numbers-max-digits="2"] > [data-line]::before { + width: 2rem; +} +pre > code[data-line-numbers-max-digits="3"] > [data-line]::before { + width: 3rem; +} + +code { + font-size: 0.9em; + color: var(--dark); + font-family: var(--codeFont); + border-radius: 5px; + padding: 0.1rem 0.2rem; + background: var(--lightgray); +} + +tbody, +li, +p { + line-height: 1.6rem; +} + +table { + margin: 1rem; + padding: 1.5rem; + border-collapse: collapse; +} +table > * { + line-height: 2rem; +} + +th { + text-align: left; + padding: 0.4rem 1rem; + border-bottom: 2px solid var(--gray); +} + +td { + padding: 0.2rem 1rem; +} + +tr { + border-bottom: 1px solid var(--lightgray); +} +tr:last-child { + border-bottom: none; +} + +img { + max-width: 100%; + border-radius: 5px; + margin: 1rem 0; +} + +p > img + em { + display: block; + transform: translateY(-1rem); +} + +hr { + width: 100%; + margin: 2rem auto; + height: 1px; + border: none; + background-color: var(--lightgray); +} + +audio, +video { + width: 100%; + border-radius: 5px; +} + +.spacer { + flex: 1 1 auto; +} + +ul.overflow, +ol.overflow { + max-height: 400; + overflow-y: auto; + content: ""; + clear: both; +} +ul.overflow > li:last-of-type, +ol.overflow > li:last-of-type { + margin-bottom: 30px; +} +ul.overflow:after, +ol.overflow:after { + pointer-events: none; + content: ""; + width: 100%; + height: 50px; + position: absolute; + left: 0; + bottom: 0; + opacity: 1; + transition: opacity 0.3s ease; + background: linear-gradient(transparent 0px, var(--light)); +} + +.transclude ul { + padding-left: 1rem; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9zdHlsZXMiLCJzb3VyY2VzIjpbInN5bnRheC5zY3NzIiwiY2FsbG91dHMuc2NzcyIsImJhc2Uuc2NzcyIsInZhcmlhYmxlcy5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUN6QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBRUU7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBR0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBV0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlBO0VBQ0U7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFJSjtFQUNFOztBQUNBO0VBRkY7SUFHSTs7OztBQUlKO0VBQ0U7O0FBQ0E7RUFGRjtJQUdJOzs7O0FBS0Y7RUFERjtJQUVJO0lBQ0E7SUFDQSxXQzVGUTs7O0FEK0ZWO0VBQ0U7O0FBRUE7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7O0FBSUo7RUFDRTtFQUNBOztBQUNBO0VBSEY7SUFJSTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsT0NySVc7RURzSVgsWUNySU87RURzSVA7RUFDQTtFQUNBOztBQUNBO0VBWEY7SUFZSTtJQUNBO0lBQ0E7SUFDQTtJQUNBOzs7QUFJSjtFQUNFOztBQUNBO0VBRkY7SUFHSTtJQUNBOzs7QUFJSjtFQUNFOztBQUVFO0VBREY7SUFFSTs7O0FBTVI7RUFDRSxPQ3pLUTtFRDBLUjs7QUFDQTtFQUhGO0lBSUk7SUFDQTs7O0FBSUo7RUFFRTtFQUNBO0VBQ0EsT0NyTFE7O0FEc0xSO0VBTEY7SUFNSTtJQUNBO0lBQ0E7Ozs7QUFLTjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBS047RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7RUFPRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQUNFOztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0VBQ0U7OztBQVdKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtFQUNFOzs7QUFLSjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0FBQUE7RUFHRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlKO0VBQ0U7O0FBR0Y7RUFDRTs7O0FBS047RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7QUFBQTtFQUdFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7QUFDQTtFQUNFOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTs7QUFDQTtFQUNFOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtBQUFBO0VBRUU7RUFDQTtFQUdBO0VBQ0E7O0FBRUE7QUFBQTtFQUNFOztBQUdGO0FBQUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIG5weCBjb252ZXJ0LXNoLXRoZW1lIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9zaGlraWpzL3NoaWtpL21haW4vcGFja2FnZXMvc2hpa2kvdGhlbWVzL2dpdGh1Yi1saWdodC5qc29uXG46cm9vdCB7XG4gIC0tc2hpa2ktY29sb3ItdGV4dDogIzI0MjkyZTtcbiAgLS1zaGlraS1jb2xvci1iYWNrZ3JvdW5kOiAjZjhmOGY4O1xuICAtLXNoaWtpLXRva2VuLWNvbnN0YW50OiAjMDA1Y2M1O1xuICAtLXNoaWtpLXRva2VuLXN0cmluZzogIzAzMmY2MjtcbiAgLS1zaGlraS10b2tlbi1jb21tZW50OiAjNmE3MzdkO1xuICAtLXNoaWtpLXRva2VuLWtleXdvcmQ6ICNkNzNhNDk7XG4gIC0tc2hpa2ktdG9rZW4tcGFyYW1ldGVyOiAjMjQyOTJlO1xuICAtLXNoaWtpLXRva2VuLWZ1bmN0aW9uOiAjMjQyOTJlO1xuICAtLXNoaWtpLXRva2VuLXN0cmluZy1leHByZXNzaW9uOiAjMjI4NjNhO1xuICAtLXNoaWtpLXRva2VuLXB1bmN0dWF0aW9uOiAjMjQyOTJlO1xuICAtLXNoaWtpLXRva2VuLWxpbms6ICMyNDI5MmU7XG59XG5cbi8vIG5weCBjb252ZXJ0LXNoLXRoZW1lIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9zaGlraWpzL3NoaWtpL21haW4vcGFja2FnZXMvc2hpa2kvdGhlbWVzL2dpdGh1Yi1kYXJrLmpzb25cbltzYXZlZC10aGVtZT1cImRhcmtcIl0ge1xuICAtLXNoaWtpLWNvbG9yLXRleHQ6ICNlMWU0ZTggIWltcG9ydGFudDtcbiAgLS1zaGlraS1jb2xvci1iYWNrZ3JvdW5kOiAjMjQyOTJlICFpbXBvcnRhbnQ7XG4gIC0tc2hpa2ktdG9rZW4tY29uc3RhbnQ6ICM3OWI4ZmYgIWltcG9ydGFudDtcbiAgLS1zaGlraS10b2tlbi1zdHJpbmc6ICM5ZWNiZmYgIWltcG9ydGFudDtcbiAgLS1zaGlraS10b2tlbi1jb21tZW50OiAjNmE3MzdkICFpbXBvcnRhbnQ7XG4gIC0tc2hpa2ktdG9rZW4ta2V5d29yZDogI2Y5NzU4MyAhaW1wb3J0YW50O1xuICAtLXNoaWtpLXRva2VuLXBhcmFtZXRlcjogI2UxZTRlOCAhaW1wb3J0YW50O1xuICAtLXNoaWtpLXRva2VuLWZ1bmN0aW9uOiAjZTFlNGU4ICFpbXBvcnRhbnQ7XG4gIC0tc2hpa2ktdG9rZW4tc3RyaW5nLWV4cHJlc3Npb246ICM4NWU4OWQgIWltcG9ydGFudDtcbiAgLS1zaGlraS10b2tlbi1wdW5jdHVhdGlvbjogI2UxZTRlOCAhaW1wb3J0YW50O1xuICAtLXNoaWtpLXRva2VuLWxpbms6ICNlMWU0ZTggIWltcG9ydGFudDtcbn1cbiIsIkB1c2UgXCJzYXNzOmNvbG9yXCI7XG5cbi5jYWxsb3V0IHtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmcpO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIHBhZGRpbmc6IDAgMXJlbTtcbiAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuM3MgZWFzZTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAmID4gKjpudGgtY2hpbGQoMikge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gIH1cblxuICAmW2RhdGEtY2FsbG91dD1cIm5vdGVcIl0ge1xuICAgIC0tY29sb3I6ICM0NDhhZmY7XG4gICAgLS1ib3JkZXI6ICM0NDhhZmY0NDtcbiAgICAtLWJnOiAjNDQ4YWZmMTA7XG4gIH1cblxuICAmW2RhdGEtY2FsbG91dD1cImFic3RyYWN0XCJdIHtcbiAgICAtLWNvbG9yOiAjMDBiMGZmO1xuICAgIC0tYm9yZGVyOiAjMDBiMGZmNDQ7XG4gICAgLS1iZzogIzAwYjBmZjEwO1xuICB9XG5cbiAgJltkYXRhLWNhbGxvdXQ9XCJpbmZvXCJdLFxuICAmW2RhdGEtY2FsbG91dD1cInRvZG9cIl0ge1xuICAgIC0tY29sb3I6ICMwMGI4ZDQ7XG4gICAgLS1ib3JkZXI6ICMwMGI4ZDQ0NDtcbiAgICAtLWJnOiAjMDBiOGQ0MTA7XG4gIH1cblxuICAmW2RhdGEtY2FsbG91dD1cInRpcFwiXSB7XG4gICAgLS1jb2xvcjogIzAwYmZhNTtcbiAgICAtLWJvcmRlcjogIzAwYmZhNTQ0O1xuICAgIC0tYmc6ICMwMGJmYTUxMDtcbiAgfVxuXG4gICZbZGF0YS1jYWxsb3V0PVwic3VjY2Vzc1wiXSB7XG4gICAgLS1jb2xvcjogIzA5YWQ3YTtcbiAgICAtLWJvcmRlcjogIzA5YWQ3MTQ0O1xuICAgIC0tYmc6ICMwOWFkNzExMDtcbiAgfVxuXG4gICZbZGF0YS1jYWxsb3V0PVwicXVlc3Rpb25cIl0ge1xuICAgIC0tY29sb3I6ICNkYmE2NDI7XG4gICAgLS1ib3JkZXI6ICNkYmE2NDI0NDtcbiAgICAtLWJnOiAjZGJhNjQyMTA7XG4gIH1cblxuICAmW2RhdGEtY2FsbG91dD1cIndhcm5pbmdcIl0ge1xuICAgIC0tY29sb3I6ICNkYjg5NDI7XG4gICAgLS1ib3JkZXI6ICNkYjg5NDI0NDtcbiAgICAtLWJnOiAjZGI4OTQyMTA7XG4gIH1cblxuICAmW2RhdGEtY2FsbG91dD1cImZhaWx1cmVcIl0sXG4gICZbZGF0YS1jYWxsb3V0PVwiZGFuZ2VyXCJdLFxuICAmW2RhdGEtY2FsbG91dD1cImJ1Z1wiXSB7XG4gICAgLS1jb2xvcjogI2RiNDI0MjtcbiAgICAtLWJvcmRlcjogI2RiNDI0MjQ0O1xuICAgIC0tYmc6ICNkYjQyNDIxMDtcbiAgfVxuXG4gICZbZGF0YS1jYWxsb3V0PVwiZXhhbXBsZVwiXSB7XG4gICAgLS1jb2xvcjogIzdhNDNiNTtcbiAgICAtLWJvcmRlcjogIzdhNDNiNTQ0O1xuICAgIC0tYmc6ICM3YTQzYjUxMDtcbiAgfVxuXG4gICZbZGF0YS1jYWxsb3V0PVwicXVvdGVcIl0ge1xuICAgIC0tY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XG4gICAgLS1ib3JkZXI6IHZhcigtLWxpZ2h0Z3JheSk7XG4gIH1cblxuICAmLmlzLWNvbGxhcHNlZCA+IC5jYWxsb3V0LXRpdGxlID4gLmZvbGQge1xuICAgIHRyYW5zZm9ybTogcm90YXRlWigtOTBkZWcpO1xuICB9XG59XG5cbi5jYWxsb3V0LXRpdGxlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA1cHg7XG4gIHBhZGRpbmc6IDFyZW0gMDtcbiAgY29sb3I6IHZhcigtLWNvbG9yKTtcblxuICAmIC5mb2xkIHtcbiAgICBtYXJnaW4tbGVmdDogMC41cmVtO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7XG4gICAgb3BhY2l0eTogMC44O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gICYgPiAuY2FsbG91dC10aXRsZS1pbm5lciA+IHAge1xuICAgIGNvbG9yOiB2YXIoLS1jb2xvcik7XG4gICAgbWFyZ2luOiAwO1xuICB9XG59XG5cbi5jYWxsb3V0LWljb24ge1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBmbGV4OiAwIDAgMThweDtcbiAgcGFkZGluZy10b3A6IDRweDtcbn1cblxuLmNhbGxvdXQtdGl0bGUtaW5uZXIge1xuICBmb250LXdlaWdodDogNzAwO1xufVxuIiwiQHVzZSBcIi4vdmFyaWFibGVzLnNjc3NcIiBhcyAqO1xuQHVzZSBcIi4vc3ludGF4LnNjc3NcIjtcbkB1c2UgXCIuL2NhbGxvdXRzLnNjc3NcIjtcblxuaHRtbCB7XG4gIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoO1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7XG4gIHRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgd2lkdGg6IDEwMHZ3O1xufVxuXG5ib2R5LFxuc2VjdGlvbiB7XG4gIG1hcmdpbjogMDtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodCk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1ib2R5Rm9udCk7XG4gIGNvbG9yOiB2YXIoLS1kYXJrZ3JheSk7XG59XG5cbi50ZXh0LWhpZ2hsaWdodCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmYyMzY4ODtcbiAgcGFkZGluZzogMCAwLjFyZW07XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cblxuOjpzZWxlY3Rpb24ge1xuICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tdGVydGlhcnkpIDc1JSwgdHJhbnNwYXJlbnQpO1xuICBjb2xvcjogdmFyKC0tZGFya2dyYXkpO1xufVxuXG5wLFxudWwsXG50ZXh0LFxuYSxcbnRyLFxudGQsXG5saSxcbm9sLFxudWwsXG4ua2F0ZXgsXG4ubWF0aCB7XG4gIGNvbG9yOiB2YXIoLS1kYXJrZ3JheSk7XG4gIGZpbGw6IHZhcigtLWRhcmtncmF5KTtcbiAgb3ZlcmZsb3ctd3JhcDogYW55d2hlcmU7XG4gIGh5cGhlbnM6IGF1dG87XG59XG5cbi5tYXRoIHtcbiAgJi5tYXRoLWRpc3BsYXkge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxufVxuXG5hIHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7XG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xuXG4gICY6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS10ZXJ0aWFyeSkgIWltcG9ydGFudDtcbiAgfVxuXG4gICYuaW50ZXJuYWwge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1oaWdobGlnaHQpO1xuICAgIHBhZGRpbmc6IDAgMC4xcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgfVxufVxuXG4uZGVza3RvcC1vbmx5IHtcbiAgZGlzcGxheTogaW5pdGlhbDtcbiAgQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJGZ1bGxQYWdlV2lkdGgpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi5tb2JpbGUtb25seSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRmdWxsUGFnZVdpZHRoKSB7XG4gICAgZGlzcGxheTogaW5pdGlhbDtcbiAgfVxufVxuXG4ucGFnZSB7XG4gIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRmdWxsUGFnZVdpZHRoKSB7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgcGFkZGluZzogMCAxcmVtO1xuICAgIG1heC13aWR0aDogJHBhZ2VXaWR0aDtcbiAgfVxuXG4gICYgYXJ0aWNsZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgJiA+IGgxIHtcbiAgICAgIGZvbnQtc2l6ZTogMnJlbTtcbiAgICB9XG5cbiAgICAmIGxpOmhhcyg+IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSkge1xuICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIH1cblxuICAgICYgbGk6aGFzKD4gaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQpIHtcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiB2YXIoLS1ncmF5KTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ncmF5KTtcbiAgICB9XG5cbiAgICAmIGxpID4gKiB7XG4gICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG5cbiAgICBwID4gc3Ryb25nIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1kYXJrKTtcbiAgICB9XG4gIH1cblxuICAmID4gI3F1YXJ0ei1ib2R5IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRmdWxsUGFnZVdpZHRoKSB7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cblxuICAgICYgLnNpZGViYXIge1xuICAgICAgZmxleDogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAycmVtO1xuICAgICAgdG9wOiAwO1xuICAgICAgd2lkdGg6ICRzaWRlUGFuZWxXaWR0aDtcbiAgICAgIG1hcmdpbi10b3A6ICR0b3BTcGFjaW5nO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHBhZGRpbmc6IDAgNHJlbTtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRmdWxsUGFnZVdpZHRoKSB7XG4gICAgICAgIHBvc2l0aW9uOiBpbml0aWFsO1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICB3aWR0aDogaW5pdGlhbDtcbiAgICAgICAgbWFyZ2luLXRvcDogMnJlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmIC5zaWRlYmFyLmxlZnQge1xuICAgICAgbGVmdDogY2FsYyhjYWxjKDEwMHZ3IC0gJHBhZ2VXaWR0aCkgLyAyIC0gJHNpZGVQYW5lbFdpZHRoKTtcbiAgICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICRmdWxsUGFnZVdpZHRoKSB7XG4gICAgICAgIGdhcDogMDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmIC5zaWRlYmFyLnJpZ2h0IHtcbiAgICAgIHJpZ2h0OiBjYWxjKGNhbGMoMTAwdncgLSAkcGFnZVdpZHRoKSAvIDIgLSAkc2lkZVBhbmVsV2lkdGgpO1xuICAgICAgJiA+ICoge1xuICAgICAgICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkZnVsbFBhZ2VXaWR0aCkge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmIC5wYWdlLWhlYWRlciB7XG4gICAgd2lkdGg6ICRwYWdlV2lkdGg7XG4gICAgbWFyZ2luOiAkdG9wU3BhY2luZyBhdXRvIDAgYXV0bztcbiAgICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkZnVsbFBhZ2VXaWR0aCkge1xuICAgICAgd2lkdGg6IGluaXRpYWw7XG4gICAgICBtYXJnaW4tdG9wOiAycmVtO1xuICAgIH1cbiAgfVxuXG4gICYgLmNlbnRlcixcbiAgJiBmb290ZXIge1xuICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgIG1hcmdpbi1yaWdodDogYXV0bztcbiAgICB3aWR0aDogJHBhZ2VXaWR0aDtcbiAgICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkZnVsbFBhZ2VXaWR0aCkge1xuICAgICAgd2lkdGg6IGluaXRpYWw7XG4gICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbn1cblxuLmZvb3Rub3RlcyB7XG4gIG1hcmdpbi10b3A6IDJyZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1saWdodGdyYXkpO1xufVxuXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KTtcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpZ2h0Z3JheSk7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQpO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1pbmxpbmUtZW5kOiAwLjJyZW07XG4gIG1hcmdpbi1pbmxpbmUtc3RhcnQ6IC0xLjRyZW07XG4gIGFwcGVhcmFuY2U6IG5vbmU7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG5cbiAgJjpjaGVja2VkIHtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2Vjb25kYXJ5KTtcblxuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBsZWZ0OiA0cHg7XG4gICAgICB0b3A6IDFweDtcbiAgICAgIHdpZHRoOiA0cHg7XG4gICAgICBoZWlnaHQ6IDhweDtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgYm9yZGVyOiBzb2xpZCB2YXIoLS1saWdodCk7XG4gICAgICBib3JkZXItd2lkdGg6IDAgMnB4IDJweCAwO1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICAgIH1cbiAgfVxufVxuXG5ibG9ja3F1b3RlIHtcbiAgbWFyZ2luOiAxcmVtIDA7XG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tc2Vjb25kYXJ5KTtcbiAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycyBlYXNlO1xufVxuXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYsXG50aGVhZCB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1oZWFkZXJGb250KTtcbiAgY29sb3I6IHZhcigtLWRhcmspO1xuICBmb250LXdlaWdodDogcmV2ZXJ0O1xuICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gIGFydGljbGUgPiAmID4gYSB7XG4gICAgY29sb3I6IHZhcigtLWRhcmspO1xuICAgICYuaW50ZXJuYWwge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICB9XG59XG5cbmgxLFxuaDIsXG5oMyxcbmg0LFxuaDUsXG5oNiB7XG4gICZbaWRdID4gYVtocmVmXj1cIiNcIl0ge1xuICAgIG1hcmdpbjogMCAwLjVyZW07XG4gICAgb3BhY2l0eTogMDtcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuMXJlbSk7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1jb2RlRm9udCk7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIH1cblxuICAmW2lkXTpob3ZlciA+IGEge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuLy8gdHlwb2dyYXBoeSBpbXByb3ZlbWVudHNcbmgxIHtcbiAgZm9udC1zaXplOiAxLjc1cmVtO1xuICBtYXJnaW4tdG9wOiAyLjI1cmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxuXG5oMiB7XG4gIGZvbnQtc2l6ZTogMS40cmVtO1xuICBtYXJnaW4tdG9wOiAxLjlyZW07XG4gIG1hcmdpbi1ib3R0b206IDFyZW07XG59XG5cbmgzIHtcbiAgZm9udC1zaXplOiAxLjEycmVtO1xuICBtYXJnaW4tdG9wOiAxLjYycmVtO1xuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xufVxuXG5oNCxcbmg1LFxuaDYge1xuICBmb250LXNpemU6IDFyZW07XG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbn1cblxuZGl2W2RhdGEtcmVoeXBlLXByZXR0eS1jb2RlLWZyYWdtZW50XSB7XG4gIGxpbmUtaGVpZ2h0OiAxLjZyZW07XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAmID4gZGl2W2RhdGEtcmVoeXBlLXByZXR0eS1jb2RlLXRpdGxlXSB7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWNvZGVGb250KTtcbiAgICBmb250LXNpemU6IDAuOXJlbTtcbiAgICBwYWRkaW5nOiAwLjFyZW0gMC41cmVtO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpZ2h0Z3JheSk7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiAtMC41cmVtO1xuICAgIGNvbG9yOiB2YXIoLS1kYXJrZ3JheSk7XG4gIH1cblxuICAmID4gcHJlIHtcbiAgICBwYWRkaW5nOiAwLjVyZW0gMDtcbiAgfVxufVxuXG5wcmUge1xuICBmb250LWZhbWlseTogdmFyKC0tY29kZUZvbnQpO1xuICBwYWRkaW5nOiAwLjVyZW07XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGlnaHRncmF5KTtcblxuICAmOmhhcyg+IGNvZGUubWVybWFpZCkge1xuICAgIGJvcmRlcjogbm9uZTtcbiAgfVxuXG4gICYgPiBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xuICAgIGNvdW50ZXItcmVzZXQ6IGxpbmU7XG4gICAgY291bnRlci1pbmNyZW1lbnQ6IGxpbmUgMDtcbiAgICBkaXNwbGF5OiBncmlkO1xuXG4gICAgJiBbZGF0YS1oaWdobGlnaHRlZC1jaGFyc10ge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taGlnaGxpZ2h0KTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICB9XG5cbiAgICAmID4gW2RhdGEtbGluZV0ge1xuICAgICAgcGFkZGluZzogMCAwLjI1cmVtO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdHJhbnNwYXJlbnQ7XG5cbiAgICAgICZbZGF0YS1oaWdobGlnaHRlZC1saW5lXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWhpZ2hsaWdodCk7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tc2Vjb25kYXJ5KTtcbiAgICAgIH1cblxuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgY29udGVudDogY291bnRlcihsaW5lKTtcbiAgICAgICAgY291bnRlci1pbmNyZW1lbnQ6IGxpbmU7XG4gICAgICAgIHdpZHRoOiAxcmVtO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDFyZW07XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIGNvbG9yOiByZ2JhKDExNSwgMTM4LCAxNDgsIDAuNik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJltkYXRhLWxpbmUtbnVtYmVycy1tYXgtZGlnaXRzPVwiMlwiXSA+IFtkYXRhLWxpbmVdOjpiZWZvcmUge1xuICAgICAgd2lkdGg6IDJyZW07XG4gICAgfVxuXG4gICAgJltkYXRhLWxpbmUtbnVtYmVycy1tYXgtZGlnaXRzPVwiM1wiXSA+IFtkYXRhLWxpbmVdOjpiZWZvcmUge1xuICAgICAgd2lkdGg6IDNyZW07XG4gICAgfVxuICB9XG59XG5cbmNvZGUge1xuICBmb250LXNpemU6IDAuOWVtO1xuICBjb2xvcjogdmFyKC0tZGFyayk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1jb2RlRm9udCk7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgcGFkZGluZzogMC4xcmVtIDAuMnJlbTtcbiAgYmFja2dyb3VuZDogdmFyKC0tbGlnaHRncmF5KTtcbn1cblxudGJvZHksXG5saSxcbnAge1xuICBsaW5lLWhlaWdodDogMS42cmVtO1xufVxuXG50YWJsZSB7XG4gIG1hcmdpbjogMXJlbTtcbiAgcGFkZGluZzogMS41cmVtO1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAmID4gKiB7XG4gICAgbGluZS1oZWlnaHQ6IDJyZW07XG4gIH1cbn1cblxudGgge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBwYWRkaW5nOiAwLjRyZW0gMXJlbTtcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWdyYXkpO1xufVxuXG50ZCB7XG4gIHBhZGRpbmc6IDAuMnJlbSAxcmVtO1xufVxuXG50ciB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1saWdodGdyYXkpO1xuICAmOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gIH1cbn1cblxuaW1nIHtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIG1hcmdpbjogMXJlbSAwO1xufVxuXG5wID4gaW1nICsgZW0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcmVtKTtcbn1cblxuaHIge1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAycmVtIGF1dG87XG4gIGhlaWdodDogMXB4O1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0Z3JheSk7XG59XG5cbmF1ZGlvLFxudmlkZW8ge1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xufVxuXG4uc3BhY2VyIHtcbiAgZmxleDogMSAxIGF1dG87XG59XG5cbnVsLm92ZXJmbG93LFxub2wub3ZlcmZsb3cge1xuICBtYXgtaGVpZ2h0OiA0MDA7XG4gIG92ZXJmbG93LXk6IGF1dG87XG5cbiAgLy8gY2xlYXJmaXhcbiAgY29udGVudDogXCJcIjtcbiAgY2xlYXI6IGJvdGg7XG5cbiAgJiA+IGxpOmxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMzBweDtcbiAgfVxuXG4gICY6YWZ0ZXIge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA1MHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBlYXNlO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCAwcHgsIHZhcigtLWxpZ2h0KSk7XG4gIH1cbn1cblxuLnRyYW5zY2x1ZGUge1xuICB1bCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICB9XG59XG4iLCIkcGFnZVdpZHRoOiA3NTBweDtcbiRtb2JpbGVCcmVha3BvaW50OiA2MDBweDtcbiR0YWJsZXRCcmVha3BvaW50OiAxMjAwcHg7XG4kc2lkZVBhbmVsV2lkdGg6IDM4MHB4O1xuJHRvcFNwYWNpbmc6IDZyZW07XG4kZnVsbFBhZ2VXaWR0aDogJHBhZ2VXaWR0aCArIDIgKiAkc2lkZVBhbmVsV2lkdGg7XG4iXX0= */`;var popover_default=` +@keyframes dropin { + 0% { + opacity: 0; + visibility: hidden; + } + 1% { + opacity: 0; + } + 100% { + opacity: 1; + visibility: visible; + } +} +.popover { + z-index: 999; + position: absolute; + overflow: visible; + padding: 1rem; + visibility: hidden; + opacity: 0; + transition: opacity 0.3s ease, visibility 0.3s ease; +} +.popover > .popover-inner { + position: relative; + width: 30rem; + max-height: 20rem; + padding: 0 1rem 1rem 1rem; + font-weight: initial; + line-height: normal; + font-size: initial; + font-family: var(--bodyFont); + border: 1px solid var(--lightgray); + background-color: var(--light); + border-radius: 5px; + box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25); + overflow: auto; + white-space: normal; +} +.popover h1 { + font-size: 1.5rem; +} +@media all and (max-width: 600px) { + .popover { + display: none !important; + } +} + +a:hover .popover, +.popover:hover { + animation: dropin 0.3s ease; + animation-fill-mode: forwards; + animation-delay: 0.2s; +} +/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL2hvbWUvc2V2ZW53YXRlL0RvY3VtZW50cy93aWtpL3F1YXJ0ei9jb21wb25lbnRzL3N0eWxlcyIsInNvdXJjZXMiOlsicG9wb3Zlci5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBO0VBQ0U7SUFDRTtJQUNBOztFQUVGO0lBQ0U7O0VBRUY7SUFDRTtJQUNBOzs7QUFJSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBdUJBO0VBQ0E7RUFDQSxZQUNFOztBQXhCRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFTRjtFQWpDRjtJQWtDSTs7OztBQUlKO0FBQUE7RUFFRTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlIFwiLi4vLi4vc3R5bGVzL3ZhcmlhYmxlcy5zY3NzXCIgYXMgKjtcblxuQGtleWZyYW1lcyBkcm9waW4ge1xuICAwJSB7XG4gICAgb3BhY2l0eTogMDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIH1cbiAgMSUge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB9XG59XG5cbi5wb3BvdmVyIHtcbiAgei1pbmRleDogOTk5O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICBwYWRkaW5nOiAxcmVtO1xuXG4gICYgPiAucG9wb3Zlci1pbm5lciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAzMHJlbTtcbiAgICBtYXgtaGVpZ2h0OiAyMHJlbTtcbiAgICBwYWRkaW5nOiAwIDFyZW0gMXJlbSAxcmVtO1xuICAgIGZvbnQtd2VpZ2h0OiBpbml0aWFsO1xuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gICAgZm9udC1zaXplOiBpbml0aWFsO1xuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1ib2R5Rm9udCk7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGlnaHRncmF5KTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodCk7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGJveC1zaGFkb3c6IDZweCA2cHggMzZweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNXJlbTtcbiAgfVxuXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjpcbiAgICBvcGFjaXR5IDAuM3MgZWFzZSxcbiAgICB2aXNpYmlsaXR5IDAuM3MgZWFzZTtcblxuICBAbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAkbW9iaWxlQnJlYWtwb2ludCkge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuXG5hOmhvdmVyIC5wb3BvdmVyLFxuLnBvcG92ZXI6aG92ZXIge1xuICBhbmltYXRpb246IGRyb3BpbiAwLjNzIGVhc2U7XG4gIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzO1xuICBhbmltYXRpb24tZGVsYXk6IDAuMnM7XG59XG4iXX0= */`;var DEFAULT_SANS_SERIF='-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif',DEFAULT_MONO="ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace";function googleFontHref(theme){let{code,header,body}=theme.typography;return`https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap`}__name(googleFontHref,"googleFontHref");function joinStyles(theme,...stylesheet){return` +${stylesheet.join(` + +`)} + +:root { + --light: ${theme.colors.lightMode.light}; + --lightgray: ${theme.colors.lightMode.lightgray}; + --gray: ${theme.colors.lightMode.gray}; + --darkgray: ${theme.colors.lightMode.darkgray}; + --dark: ${theme.colors.lightMode.dark}; + --secondary: ${theme.colors.lightMode.secondary}; + --tertiary: ${theme.colors.lightMode.tertiary}; + --highlight: ${theme.colors.lightMode.highlight}; + + --headerFont: "${theme.typography.header}", ${DEFAULT_SANS_SERIF}; + --bodyFont: "${theme.typography.body}", ${DEFAULT_SANS_SERIF}; + --codeFont: "${theme.typography.code}", ${DEFAULT_MONO}; +} + +:root[saved-theme="dark"] { + --light: ${theme.colors.darkMode.light}; + --lightgray: ${theme.colors.darkMode.lightgray}; + --gray: ${theme.colors.darkMode.gray}; + --darkgray: ${theme.colors.darkMode.darkgray}; + --dark: ${theme.colors.darkMode.dark}; + --secondary: ${theme.colors.darkMode.secondary}; + --tertiary: ${theme.colors.darkMode.tertiary}; + --highlight: ${theme.colors.darkMode.highlight}; +} +`}__name(joinStyles,"joinStyles");import{Features,transform}from"lightningcss";function getComponentResources(ctx){let allComponents=new Set;for(let emitter of ctx.cfg.plugins.emitters){let components=emitter.getQuartzComponents(ctx);for(let component of components)allComponents.add(component)}let componentResources={css:new Set,beforeDOMLoaded:new Set,afterDOMLoaded:new Set};for(let component of allComponents){let{css,beforeDOMLoaded,afterDOMLoaded}=component;css&&componentResources.css.add(css),beforeDOMLoaded&&componentResources.beforeDOMLoaded.add(beforeDOMLoaded),afterDOMLoaded&&componentResources.afterDOMLoaded.add(afterDOMLoaded)}return{css:[...componentResources.css],beforeDOMLoaded:[...componentResources.beforeDOMLoaded],afterDOMLoaded:[...componentResources.afterDOMLoaded]}}__name(getComponentResources,"getComponentResources");function joinScripts(scripts){return scripts.map(script=>`(function () {${script}})();`).join(` +`)}__name(joinScripts,"joinScripts");function addGlobalPageResources(ctx,staticResources,componentResources){let cfg=ctx.cfg.configuration,reloadScript=ctx.argv.serve;if(cfg.enablePopovers&&(componentResources.afterDOMLoaded.push(popover_inline_default),componentResources.css.push(popover_default)),cfg.analytics?.provider==="google"){let tagId=cfg.analytics.tagId;staticResources.js.push({src:`https://www.googletagmanager.com/gtag/js?id=${tagId}`,contentType:"external",loadTime:"afterDOMReady"}),componentResources.afterDOMLoaded.push(` + window.dataLayer = window.dataLayer || []; + function gtag() { dataLayer.push(arguments); } + gtag(\`js\`, new Date()); + gtag(\`config\`, \`${tagId}\`, { send_page_view: false }); + + document.addEventListener(\`nav\`, () => { + gtag(\`event\`, \`page_view\`, { + page_title: document.title, + page_location: location.href, + }); + });`)}else cfg.analytics?.provider==="plausible"?componentResources.afterDOMLoaded.push(plausible_inline_default):cfg.analytics?.provider==="umami"&&componentResources.afterDOMLoaded.push(` + const umamiScript = document.createElement("script") + umamiScript.src = "https://analytics.umami.is/script.js" + umamiScript.setAttribute("data-website-id", "${cfg.analytics.websiteId}") + umamiScript.async = true + + document.head.appendChild(umamiScript) + `);cfg.enableSPA?componentResources.afterDOMLoaded.push(spa_inline_default):componentResources.afterDOMLoaded.push(` + window.spaNavigate = (url, _) => window.location.assign(url) + const event = new CustomEvent("nav", { detail: { url: document.body.dataset.slug } }) + document.dispatchEvent(event)`);let wsUrl=`ws://localhost:${ctx.argv.wsPort}`;ctx.argv.remoteDevHost&&(wsUrl=`wss://${ctx.argv.remoteDevHost}:${ctx.argv.wsPort}`),reloadScript&&staticResources.js.push({loadTime:"afterDOMReady",contentType:"inline",script:` + const socket = new WebSocket('${wsUrl}') + socket.addEventListener('message', () => document.location.reload()) + `})}__name(addGlobalPageResources,"addGlobalPageResources");var defaultOptions14={fontOrigin:"googleFonts"},ComponentResources=__name(opts=>{let{fontOrigin}={...defaultOptions14,...opts};return{name:"ComponentResources",getQuartzComponents(){return[]},async emit(ctx,_content,resources,emit){let componentResources=getComponentResources(ctx);fontOrigin==="googleFonts"&&resources.css.push(googleFontHref(ctx.cfg.configuration.theme)),addGlobalPageResources(ctx,resources,componentResources);let stylesheet=joinStyles(ctx.cfg.configuration.theme,...componentResources.css,custom_default),prescript=joinScripts(componentResources.beforeDOMLoaded),postscript=joinScripts(componentResources.afterDOMLoaded);return await Promise.all([emit({slug:"index",ext:".css",content:transform({filename:"index.css",code:Buffer.from(stylesheet),minify:!0,targets:{safari:984576,ios_saf:984576,edge:7536640,firefox:6684672,chrome:7143424},include:Features.MediaQueries}).code.toString()}),emit({slug:"prescript",ext:".js",content:prescript}),emit({slug:"postscript",ext:".js",content:postscript})])}}},"ComponentResources");var NotFoundPage=__name(()=>{let opts={...sharedPageComponents,pageBody:__default(),beforeBody:[],left:[],right:[]},{head:Head,pageBody,footer:Footer}=opts,Body2=Body_default();return{name:"404Page",getQuartzComponents(){return[Head,Body2,pageBody,Footer]},async emit(ctx,_content,resources,emit){let cfg=ctx.cfg.configuration,slug2="404",path13=new URL(`https://${cfg.baseUrl??"example.com"}`).pathname,externalResources=pageResources(path13,resources),[tree,vfile]=defaultProcessedContent({slug:slug2,text:"Not Found",description:"Not Found",frontmatter:{title:"Not Found",tags:[]}}),componentData={fileData:vfile.data,externalResources,cfg,children:[],tree,allFiles:[]};return[await emit({content:renderPage(slug2,componentData,opts,externalResources),slug:slug2,ext:".html"})]}}},"NotFoundPage");function getStaticResourcesFromPlugins(ctx){let staticResources={css:[],js:[]};for(let transformer of ctx.cfg.plugins.transformers){let res=transformer.externalResources?transformer.externalResources(ctx):{};res?.js&&staticResources.js.push(...res.js),res?.css&&staticResources.css.push(...res.css)}return staticResources}__name(getStaticResourcesFromPlugins,"getStaticResourcesFromPlugins");async function emitContent(ctx,content){let{argv,cfg}=ctx,perf=new PerfTimer,log=new QuartzLogger(ctx.argv.verbose);log.start("Emitting output files");let emit=__name(async({slug:slug2,ext,content:content2})=>{let pathToPage=joinSegments(argv.output,slug2+ext),dir=path11.dirname(pathToPage);return await fs4.promises.mkdir(dir,{recursive:!0}),await fs4.promises.writeFile(pathToPage,content2),pathToPage},"emit"),emittedFiles=0,staticResources=getStaticResourcesFromPlugins(ctx);for(let emitter of cfg.plugins.emitters)try{let emitted=await emitter.emit(ctx,content,staticResources,emit);if(emittedFiles+=emitted.length,ctx.argv.verbose)for(let file of emitted)console.log(`[emit:${emitter.name}] ${file}`)}catch(err){trace(`Failed to emit from plugin \`${emitter.name}\``,err)}log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`)}__name(emitContent,"emitContent");var config={configuration:{pageTitle:"\u{1F4DA} X\xB7Eden",enableSPA:!0,enablePopovers:!0,analytics:null,baseUrl:"wiki.7wate.com",ignorePatterns:["private","Templates",".obsidian","Canvas","Static"],defaultDateType:"created",theme:{typography:{header:"Schibsted Grotesk",body:"Source Sans Pro",code:"IBM Plex Mono"},colors:{lightMode:{light:"#faf8f8",lightgray:"#e5e5e5",gray:"#b8b8b8",darkgray:"#4e4e4e",dark:"#2b2b2b",secondary:"#284b63",tertiary:"#84a59d",highlight:"rgba(143, 159, 169, 0.15)"},darkMode:{light:"#161618",lightgray:"#393639",gray:"#646464",darkgray:"#d4d4d4",dark:"#ebebec",secondary:"#7b97aa",tertiary:"#84a59d",highlight:"rgba(143, 159, 169, 0.15)"}}}},plugins:{transformers:[FrontMatter(),TableOfContents(),CreatedModifiedDate({priority:["frontmatter","filesystem"]}),SyntaxHighlighting(),ObsidianFlavoredMarkdown({enableInHtmlEmbed:!1}),GitHubFlavoredMarkdown(),CrawlLinks({markdownLinkResolution:"shortest"}),Latex({renderEngine:"katex"}),Description()],filters:[RemoveDrafts()],emitters:[AliasRedirects(),ComponentResources({fontOrigin:"googleFonts"}),ContentPage(),FolderPage(),TagPage(),ContentIndex({enableSiteMap:!0,enableRSS:!0}),Assets(),Static(),NotFoundPage()]}},quartz_config_default=config;import chokidar from"chokidar";import fs5 from"fs";import{fileURLToPath}from"url";var options={retrieveSourceMap(source){if(source.includes(".quartz-cache")){let realSource=fileURLToPath(source.split("?",2)[0]+".map");return{map:fs5.readFileSync(realSource,"utf8")}}else return null}};sourceMapSupport.install(options);async function buildQuartz(argv,mut,clientRefresh){let ctx={argv,cfg:quartz_config_default,allSlugs:[]},perf=new PerfTimer,output=argv.output,pluginCount=Object.values(quartz_config_default.plugins).flat().length,pluginNames=__name(key=>quartz_config_default.plugins[key].map(plugin=>plugin.name),"pluginNames");argv.verbose&&(console.log(`Loaded ${pluginCount} plugins`),console.log(` Transformers: ${pluginNames("transformers").join(", ")}`),console.log(` Filters: ${pluginNames("filters").join(", ")}`),console.log(` Emitters: ${pluginNames("emitters").join(", ")}`));let release=await mut.acquire();perf.addEvent("clean"),await rimraf(output),console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`),perf.addEvent("glob");let allFiles=await glob("**/*.*",argv.directory,quartz_config_default.configuration.ignorePatterns),fps=allFiles.filter(fp=>fp.endsWith(".md")).sort();console.log(`Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`);let filePaths=fps.map(fp=>joinSegments(argv.directory,fp));ctx.allSlugs=allFiles.map(fp=>slugifyFilePath(fp));let parsedFiles=await parseMarkdown(ctx,filePaths),filteredContent=filterContent(ctx,parsedFiles);if(await emitContent(ctx,filteredContent),console.log(chalk5.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)),release(),argv.serve)return startServing(ctx,mut,parsedFiles,clientRefresh)}__name(buildQuartz,"buildQuartz");async function startServing(ctx,mut,initialContent,clientRefresh){let{argv}=ctx,ignored=await isGitIgnored(),contentMap=new Map;for(let content of initialContent){let[_tree,vfile]=content;contentMap.set(vfile.data.filePath,content)}let initialSlugs=ctx.allSlugs,lastBuildMs=0,toRebuild=new Set,toRemove=new Set,trackedAssets=new Set;async function rebuild(fp,action){if(ignored(fp))return;fp=toPosixPath(fp);let filePath=joinSegments(argv.directory,fp);if(path12.extname(fp)!==".md"){action==="add"||action==="change"?trackedAssets.add(filePath):action==="delete"&&trackedAssets.delete(filePath),clientRefresh();return}action==="add"||action==="change"?toRebuild.add(filePath):action==="delete"&&toRemove.add(filePath);let buildStart=new Date().getTime();lastBuildMs=buildStart;let release=await mut.acquire();if(lastBuildMs>buildStart){release();return}let perf=new PerfTimer;console.log(chalk5.yellow("Detected change, rebuilding..."));try{let filesToRebuild=[...toRebuild].filter(fp2=>!toRemove.has(fp2)),trackedSlugs=[...new Set([...contentMap.keys(),...toRebuild,...trackedAssets])].filter(fp2=>!toRemove.has(fp2)).map(fp2=>slugifyFilePath(path12.posix.relative(argv.directory,fp2)));ctx.allSlugs=[...new Set([...initialSlugs,...trackedSlugs])];let parsedContent=await parseMarkdown(ctx,filesToRebuild);for(let content of parsedContent){let[_tree,vfile]=content;contentMap.set(vfile.data.filePath,content)}for(let fp2 of toRemove)contentMap.delete(fp2);let parsedFiles=[...contentMap.values()],filteredContent=filterContent(ctx,parsedFiles);await rimraf(argv.output),await emitContent(ctx,filteredContent),console.log(chalk5.green(`Done rebuilding in ${perf.timeSince()}`))}catch{console.log(chalk5.yellow("Rebuild failed. Waiting on a change to fix the error..."))}clientRefresh(),toRebuild.clear(),toRemove.clear(),release()}__name(rebuild,"rebuild");let watcher=chokidar.watch(".",{persistent:!0,cwd:argv.directory,ignoreInitial:!0});return watcher.on("add",fp=>rebuild(fp,"add")).on("change",fp=>rebuild(fp,"change")).on("unlink",fp=>rebuild(fp,"delete")),async()=>{await watcher.close()}}__name(startServing,"startServing");var build_default=__name(async(argv,mut,clientRefresh)=>{try{return await buildQuartz(argv,mut,clientRefresh)}catch(err){trace(` +Exiting Quartz due to a fatal error`,err)}},"default");export{build_default as default}; +//# sourceMappingURL=transpiled-build.mjs.map diff --git a/quartz/.quartz-cache/transpiled-build.mjs.map b/quartz/.quartz-cache/transpiled-build.mjs.map new file mode 100644 index 0000000..ba78b3c --- /dev/null +++ b/quartz/.quartz-cache/transpiled-build.mjs.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "sources": ["../build.ts", "../util/perf.ts", "../processors/parse.ts", "../util/path.ts", "../util/log.ts", "../util/trace.ts", "../processors/filter.ts", "../processors/emit.ts", "../plugins/transformers/frontmatter.ts", "../plugins/transformers/gfm.ts", "../plugins/transformers/lastmod.ts", "../plugins/transformers/latex.ts", "../plugins/transformers/description.ts", "../util/escape.ts", "../plugins/transformers/links.ts", "../plugins/transformers/ofm.ts", "../components/scripts/callout.inline.ts", "../util/lang.ts", "../plugins/transformers/oxhugofm.ts", "../plugins/transformers/syntax.ts", "../plugins/transformers/toc.ts", "../plugins/transformers/linebreaks.ts", "../plugins/filters/draft.ts", "../components/Header.tsx", "../components/scripts/clipboard.inline.ts", "../components/styles/clipboard.scss", "../components/Body.tsx", "../components/renderPage.tsx", "../util/resources.tsx", "../util/jsx.ts", "../components/pages/Content.tsx", "../components/styles/listPage.scss", "../components/Date.tsx", "../components/PageList.tsx", "../components/pages/TagContent.tsx", "../components/pages/FolderContent.tsx", "../components/pages/404.tsx", "../components/ArticleTitle.tsx", "../components/scripts/darkmode.inline.ts", "../components/styles/darkmode.scss", "../components/Darkmode.tsx", "../components/Head.tsx", "../components/PageTitle.tsx", "../components/ContentMeta.tsx", "../components/Spacer.tsx", "../components/styles/legacyToc.scss", "../components/styles/toc.scss", "../components/scripts/toc.inline.ts", "../components/TableOfContents.tsx", "../components/styles/explorer.scss", "../components/scripts/explorer.inline.ts", "../components/ExplorerNode.tsx", "../components/Explorer.tsx", "../components/TagList.tsx", "../components/scripts/graph.inline.ts", "../components/styles/graph.scss", "../components/Graph.tsx", "../components/styles/backlinks.scss", "../components/Backlinks.tsx", "../components/styles/search.scss", "../components/scripts/search.inline.ts", "../components/Search.tsx", "../components/styles/footer.scss", "../../package.json", "../components/Footer.tsx", "../components/DesktopOnly.tsx", "../components/MobileOnly.tsx", "../components/styles/recentNotes.scss", "../components/RecentNotes.tsx", "../components/styles/breadcrumbs.scss", "../components/Breadcrumbs.tsx", "../../quartz.layout.ts", "../plugins/emitters/contentPage.tsx", "../plugins/vfile.ts", "../plugins/emitters/tagPage.tsx", "../plugins/emitters/folderPage.tsx", "../plugins/emitters/contentIndex.ts", "../plugins/emitters/aliases.ts", "../plugins/emitters/assets.ts", "../util/glob.ts", "../plugins/emitters/static.ts", "../components/scripts/spa.inline.ts", "../components/scripts/plausible.inline.ts", "../components/scripts/popover.inline.ts", "../styles/custom.scss", "../components/styles/popover.scss", "../util/theme.ts", "../plugins/emitters/componentResources.ts", "../plugins/emitters/404.tsx", "../plugins/index.ts", "../../quartz.config.ts", "../util/sourcemap.ts"], + "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ECAA,IAAO,eAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;i3lBCAf,IAAO,gBAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;qiECuBf,IAAM,mBACJ,8EACI,aAAe,0DAEd,SAAS,eAAe,MAAc,CAC3C,GAAM,CAAE,KAAM,OAAQ,IAAK,EAAI,MAAM,WACrC,MAAO,4CAA4C,IAAI,WAAW,MAAM,wBAAwB,IAAI,iDACtG,CAHgB,wCAKT,SAAS,WAAW,SAAiB,WAAsB,CAChE,MAAO;AAAA,EACP,WAAW,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA;AAAA;AAAA,aAGZ,MAAM,OAAO,UAAU,KAAK;AAAA,iBACxB,MAAM,OAAO,UAAU,SAAS;AAAA,YACrC,MAAM,OAAO,UAAU,IAAI;AAAA,gBACvB,MAAM,OAAO,UAAU,QAAQ;AAAA,YACnC,MAAM,OAAO,UAAU,IAAI;AAAA,iBACtB,MAAM,OAAO,UAAU,SAAS;AAAA,gBACjC,MAAM,OAAO,UAAU,QAAQ;AAAA,iBAC9B,MAAM,OAAO,UAAU,SAAS;AAAA;AAAA,mBAE9B,MAAM,WAAW,MAAM,MAAM,kBAAkB;AAAA,iBACjD,MAAM,WAAW,IAAI,MAAM,kBAAkB;AAAA,iBAC7C,MAAM,WAAW,IAAI,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA,aAI3C,MAAM,OAAO,SAAS,KAAK;AAAA,iBACvB,MAAM,OAAO,SAAS,SAAS;AAAA,YACpC,MAAM,OAAO,SAAS,IAAI;AAAA,gBACtB,MAAM,OAAO,SAAS,QAAQ;AAAA,YAClC,MAAM,OAAO,SAAS,IAAI;AAAA,iBACrB,MAAM,OAAO,SAAS,SAAS;AAAA,gBAChC,MAAM,OAAO,SAAS,QAAQ;AAAA,iBAC7B,MAAM,OAAO,SAAS,SAAS;AAAA;AAAA,CAGhD,CA9BgB,gCCjBhB,OAAS,SAAU,cAAiB,eAQpC,SAAS,sBAAsB,IAAmC,CAChE,IAAM,cAAsC,IAAI,IAChD,QAAW,WAAW,IAAI,IAAI,QAAQ,SAAU,CAC9C,IAAM,WAAa,QAAQ,oBAAoB,GAAG,EAClD,QAAW,aAAa,WACtB,cAAc,IAAI,SAAS,CAE/B,CAEA,IAAM,mBAAqB,CACzB,IAAK,IAAI,IACT,gBAAiB,IAAI,IACrB,eAAgB,IAAI,GACtB,EAEA,QAAW,aAAa,cAAe,CACrC,GAAM,CAAE,IAAK,gBAAiB,cAAe,EAAI,UAC7C,KACF,mBAAmB,IAAI,IAAI,GAAG,EAE5B,iBACF,mBAAmB,gBAAgB,IAAI,eAAe,EAEpD,gBACF,mBAAmB,eAAe,IAAI,cAAc,CAExD,CAEA,MAAO,CACL,IAAK,CAAC,GAAG,mBAAmB,GAAG,EAC/B,gBAAiB,CAAC,GAAG,mBAAmB,eAAe,EACvD,eAAgB,CAAC,GAAG,mBAAmB,cAAc,CACvD,CACF,CAjCS,sDAmCT,SAAS,YAAY,QAA2B,CAE9C,OAAO,QAAQ,IAAK,QAAW,iBAAiB,MAAM,OAAO,EAAE,KAAK;AAAA,CAAI,CAC1E,CAHS,kCAKT,SAAS,uBACP,IACA,gBACA,mBACA,CACA,IAAM,IAAM,IAAI,IAAI,cACd,aAAe,IAAI,KAAK,MAQ9B,GALI,IAAI,iBACN,mBAAmB,eAAe,KAAK,sBAAa,EACpD,mBAAmB,IAAI,KAAK,eAAY,GAGtC,IAAI,WAAW,WAAa,SAAU,CACxC,IAAM,MAAQ,IAAI,UAAU,MAC5B,gBAAgB,GAAG,KAAK,CACtB,IAAK,+CAA+C,KAAK,GACzD,YAAa,WACb,SAAU,eACZ,CAAC,EACD,mBAAmB,eAAe,KAAK;AAAA;AAAA;AAAA;AAAA,2BAIhB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOtB,CACR,MAAW,IAAI,WAAW,WAAa,YACrC,mBAAmB,eAAe,KAAK,wBAAe,EAC7C,IAAI,WAAW,WAAa,SACrC,mBAAmB,eAAe,KAAK;AAAA;AAAA;AAAA,qDAGU,IAAI,UAAU,SAAS;AAAA;AAAA;AAAA;AAAA,KAIvE,EAGC,IAAI,UACN,mBAAmB,eAAe,KAAK,kBAAe,EAEtD,mBAAmB,eAAe,KAAK;AAAA;AAAA;AAAA,sCAGL,EAGpC,IAAI,MAAQ,kBAAkB,IAAI,KAAK,MAAM,GAEzC,IAAI,KAAK,gBACX,MAAQ,SAAS,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,MAAM,IAGxD,cACF,gBAAgB,GAAG,KAAK,CACtB,SAAU,gBACV,YAAa,SACb,OAAQ;AAAA,0CAC4B,KAAK;AAAA;AAAA,SAG3C,CAAC,CAEL,CAvES,wDA6ET,IAAMC,iBAA0B,CAC9B,WAAY,aACd,EAEa,mBAAmD,OAAC,MAA4B,CAC3F,GAAM,CAAE,UAAW,EAAI,CAAE,GAAGA,iBAAgB,GAAG,IAAK,EACpD,MAAO,CACL,KAAM,qBACN,qBAAsB,CACpB,MAAO,CAAC,CACV,EACA,MAAM,KAAK,IAAK,SAAU,UAAW,KAA2B,CAE9D,IAAM,mBAAqB,sBAAsB,GAAG,EAKhD,aAAe,eACjB,UAAU,IAAI,KAAK,eAAe,IAAI,IAAI,cAAc,KAAK,CAAC,EAKhE,uBAAuB,IAAK,UAAW,kBAAkB,EAEzD,IAAM,WAAa,WAAW,IAAI,IAAI,cAAc,MAAO,GAAG,mBAAmB,IAAK,cAAM,EACtF,UAAY,YAAY,mBAAmB,eAAe,EAC1D,WAAa,YAAY,mBAAmB,cAAc,EA8BhE,OA7BY,MAAM,QAAQ,IAAI,CAC5B,KAAK,CACH,KAAM,QACN,IAAK,OACL,QAAS,UAAU,CACjB,SAAU,YACV,KAAM,OAAO,KAAK,UAAU,EAC5B,OAAQ,GACR,QAAS,CACP,OAAS,OACT,QAAU,OACV,KAAM,QACN,QAAS,QACT,OAAQ,OACV,EACA,QAAS,SAAS,YACpB,CAAC,EAAE,KAAK,SAAS,CACnB,CAAC,EACD,KAAK,CACH,KAAM,YACN,IAAK,MACL,QAAS,SACX,CAAC,EACD,KAAK,CACH,KAAM,aACN,IAAK,MACL,QAAS,UACX,CAAC,CACH,CAAC,CAEH,CACF,CACF,EAzDgE,sBCtIzD,IAAM,aAAoC,WAAM,CACrD,IAAM,KAAuB,CAC3B,GAAG,qBACH,SAAU,UAAS,EACnB,WAAY,CAAC,EACb,KAAM,CAAC,EACP,MAAO,CAAC,CACV,EAEM,CAAE,KAAM,KAAM,SAAU,OAAQ,MAAO,EAAI,KAC3CC,MAAO,aAAgB,EAE7B,MAAO,CACL,KAAM,UACN,qBAAsB,CACpB,MAAO,CAAC,KAAMA,MAAM,SAAU,MAAM,CACtC,EACA,MAAM,KAAK,IAAK,SAAU,UAAW,KAA2B,CAC9D,IAAM,IAAM,IAAI,IAAI,cACdC,MAAO,MAGPC,OADM,IAAI,IAAI,WAAW,IAAI,SAAW,aAAa,EAAE,EAC5C,SACX,kBAAoB,cAAcA,OAAM,SAAS,EACjD,CAAC,KAAM,KAAK,EAAI,wBAAwB,CAC5C,KAAAD,MACA,KAAM,YACN,YAAa,YACb,YAAa,CAAE,MAAO,YAAa,KAAM,CAAC,CAAE,CAC9C,CAAC,EACK,cAAsC,CAC1C,SAAU,MAAM,KAChB,kBACA,IACA,SAAU,CAAC,EACX,KACA,SAAU,CAAC,CACb,EAEA,MAAO,CACL,MAAM,KAAK,CACT,QAAS,WAAWA,MAAM,cAAe,KAAM,iBAAiB,EAChE,KAAAA,MACA,IAAK,OACP,CAAC,CACH,CACF,CACF,CACF,EAhDiD,gBCN1C,SAAS,8BAA8B,IAAe,CAC3D,IAAM,gBAAmC,CACvC,IAAK,CAAC,EACN,GAAI,CAAC,CACP,EAEA,QAAW,eAAe,IAAI,IAAI,QAAQ,aAAc,CACtD,IAAM,IAAM,YAAY,kBAAoB,YAAY,kBAAkB,GAAG,EAAI,CAAC,EAC9E,KAAK,IACP,gBAAgB,GAAG,KAAK,GAAG,IAAI,EAAE,EAE/B,KAAK,KACP,gBAAgB,IAAI,KAAK,GAAG,IAAI,GAAG,CAEvC,CAEA,OAAO,eACT,CAjBgB,sElFOhB,eAAsB,YAAY,IAAe,QAA6B,CAC5E,GAAM,CAAE,KAAM,GAAI,EAAI,IAChB,KAAO,IAAI,UACX,IAAM,IAAI,aAAa,IAAI,KAAK,OAAO,EAE7C,IAAI,MAAM,uBAAuB,EACjC,IAAM,KAAqB,aAAO,CAAE,KAAAE,MAAM,IAAK,QAAAC,QAAQ,IAAM,CAC3D,IAAM,WAAa,aAAa,KAAK,OAAQD,MAAO,GAAG,EACjD,IAAME,OAAK,QAAQ,UAAU,EACnC,aAAMC,IAAG,SAAS,MAAM,IAAK,CAAE,UAAW,EAAK,CAAC,EAChD,MAAMA,IAAG,SAAS,UAAU,WAAYF,QAAO,EACxC,UACT,EAN2B,QAQvB,aAAe,EACb,gBAAkB,8BAA8B,GAAG,EACzD,QAAW,WAAW,IAAI,QAAQ,SAChC,GAAI,CACF,IAAM,QAAU,MAAM,QAAQ,KAAK,IAAK,QAAS,gBAAiB,IAAI,EAGtE,GAFA,cAAgB,QAAQ,OAEpB,IAAI,KAAK,QACX,QAAW,QAAQ,QACjB,QAAQ,IAAI,SAAS,QAAQ,IAAI,KAAK,IAAI,EAAE,CAGlD,OAAS,IAAK,CACZ,MAAM,gCAAgC,QAAQ,IAAI,KAAM,GAAY,CACtE,CAGF,IAAI,IAAI,WAAW,YAAY,eAAe,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,EAAE,CACtF,CAhCsB,kCmFRtB,IAAM,OAAuB,CAC3B,cAAe,CACb,UAAW,sBACX,UAAW,GACX,eAAgB,GAChB,UAAW,KACX,QAAS,iBACT,eAAgB,CAAC,UAAW,YAAa,YAAa,SAAU,QAAQ,EACxE,gBAAiB,UACjB,MAAO,CACL,WAAY,CACV,OAAQ,oBACR,KAAM,kBACN,KAAM,eACR,EACA,OAAQ,CACN,UAAW,CACT,MAAO,UACP,UAAW,UACX,KAAM,UACN,SAAU,UACV,KAAM,UACN,UAAW,UACX,SAAU,UACV,UAAW,2BACb,EACA,SAAU,CACR,MAAO,UACP,UAAW,UACX,KAAM,UACN,SAAU,UACV,KAAM,UACN,UAAW,UACX,SAAU,UACV,UAAW,2BACb,CACF,CACF,CACF,EACA,QAAS,CACP,aAAc,CACL,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,CACzB,SAAU,CAAC,cAAe,YAAY,CACxC,CAAC,EACM,mBAAmB,EACnB,yBAAyB,CAAE,kBAAmB,EAAM,CAAC,EACrD,uBAAuB,EACvB,WAAW,CAAE,uBAAwB,UAAW,CAAC,EACjD,MAAM,CAAE,aAAc,OAAQ,CAAC,EAC/B,YAAY,CACrB,EACA,QAAS,CAAQ,aAAa,CAAC,EAC/B,SAAU,CACD,eAAe,EACf,mBAAmB,CAAE,WAAY,aAAc,CAAC,EAChD,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,CAClB,cAAe,GACf,UAAW,EACb,CAAC,EACM,OAAO,EACP,OAAO,EACP,aAAa,CACtB,CACF,CACF,EAEO,sBAAQ,O1F9Df,OAAO,aAAc,W2FZrB,OAAOG,QAAQ,KAEf,OAAS,kBAAqB,MAEvB,IAAM,QAAoC,CAG/C,kBAAkB,OAAQ,CACxB,GAAI,OAAO,SAAS,eAAe,EAAG,CACpC,IAAI,WAAa,cAAc,OAAO,MAAM,IAAK,CAAC,EAAE,CAAC,EAAI,MAAM,EAC/D,MAAO,CACL,IAAKA,IAAG,aAAa,WAAY,MAAM,CACzC,CACF,KACE,QAAO,IAEX,CACF,E3FhBA,iBAAiB,QAAQ,OAAO,EAmBhC,eAAe,YAAY,KAAY,IAAY,cAA2B,CAC5E,IAAM,IAAgB,CACpB,KACA,0BACA,SAAU,CAAC,CACb,EAEM,KAAO,IAAI,UACX,OAAS,KAAK,OAEd,YAAc,OAAO,OAAO,sBAAI,OAAO,EAAE,KAAK,EAAE,OAChD,YAAc,OAAC,KACnB,sBAAI,QAAQ,GAAG,EAAE,IAAK,QAAW,OAAO,IAAI,EAD1B,eAEhB,KAAK,UACP,QAAQ,IAAI,UAAU,WAAW,UAAU,EAC3C,QAAQ,IAAI,mBAAmB,YAAY,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE,EACvE,QAAQ,IAAI,cAAc,YAAY,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,EAC7D,QAAQ,IAAI,eAAe,YAAY,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,GAGjE,IAAM,QAAU,MAAM,IAAI,QAAQ,EAClC,KAAK,SAAS,OAAO,EACrB,MAAM,OAAO,MAAM,EACnB,QAAQ,IAAI,8BAA8B,MAAM,SAAS,KAAK,UAAU,OAAO,CAAC,EAAE,EAElF,KAAK,SAAS,MAAM,EACpB,IAAM,SAAW,MAAM,KAAK,SAAU,KAAK,UAAW,sBAAI,cAAc,cAAc,EAChF,IAAM,SAAS,OAAQ,IAAO,GAAG,SAAS,KAAK,CAAC,EAAE,KAAK,EAC7D,QAAQ,IACN,SAAS,IAAI,MAAM,uBAAuB,KAAK,SAAS,SAAS,KAAK,UAAU,MAAM,CAAC,EACzF,EAEA,IAAM,UAAY,IAAI,IAAK,IAAO,aAAa,KAAK,UAAW,EAAE,CAAa,EAC9E,IAAI,SAAW,SAAS,IAAK,IAAO,gBAAgB,EAAc,CAAC,EAEnE,IAAM,YAAc,MAAM,cAAc,IAAK,SAAS,EAChD,gBAAkB,cAAc,IAAK,WAAW,EAKtD,GAJA,MAAM,YAAY,IAAK,eAAe,EACtC,QAAQ,IAAIC,OAAM,MAAM,mBAAmB,IAAI,MAAM,aAAa,KAAK,UAAU,CAAC,EAAE,CAAC,EACrF,QAAQ,EAEJ,KAAK,MACP,OAAO,aAAa,IAAK,IAAK,YAAa,aAAa,CAE5D,CA5Ce,kCA+Cf,eAAe,aACb,IACA,IACA,eACA,cACA,CACA,GAAM,CAAE,IAAK,EAAI,IAEX,QAAU,MAAM,aAAa,EAC7B,WAAa,IAAI,IACvB,QAAW,WAAW,eAAgB,CACpC,GAAM,CAAC,MAAO,KAAK,EAAI,QACvB,WAAW,IAAI,MAAM,KAAK,SAAW,OAAO,CAC9C,CAEA,IAAM,aAAe,IAAI,SACrB,YAAc,EACZ,UAA2B,IAAI,IAC/B,SAA0B,IAAI,IAC9B,cAA+B,IAAI,IACzC,eAAe,QAAQ,GAAY,OAAqC,CAEtE,GAAI,QAAQ,EAAE,EACZ,OAIF,GAAK,YAAY,EAAE,EACnB,IAAM,SAAW,aAAa,KAAK,UAAW,EAAE,EAChD,GAAIC,OAAK,QAAQ,EAAE,IAAM,MAAO,CAC1B,SAAW,OAAS,SAAW,SACjC,cAAc,IAAI,QAAQ,EACjB,SAAW,UACpB,cAAc,OAAO,QAAQ,EAE/B,cAAc,EACd,MACF,CAEI,SAAW,OAAS,SAAW,SACjC,UAAU,IAAI,QAAQ,EACb,SAAW,UACpB,SAAS,IAAI,QAAQ,EAKvB,IAAM,WAAa,IAAI,KAAK,EAAE,QAAQ,EACtC,YAAc,WACd,IAAM,QAAU,MAAM,IAAI,QAAQ,EAClC,GAAI,YAAc,WAAY,CAC5B,QAAQ,EACR,MACF,CAEA,IAAM,KAAO,IAAI,UACjB,QAAQ,IAAID,OAAM,OAAO,gCAAgC,CAAC,EAC1D,GAAI,CACF,IAAM,eAAiB,CAAC,GAAG,SAAS,EAAE,OAAQE,KAAO,CAAC,SAAS,IAAIA,GAAE,CAAC,EAEhE,aAAe,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,WAAW,KAAK,EAAG,GAAG,UAAW,GAAG,aAAa,CAAC,CAAC,EACrF,OAAQA,KAAO,CAAC,SAAS,IAAIA,GAAE,CAAC,EAChC,IAAKA,KAAO,gBAAgBD,OAAK,MAAM,SAAS,KAAK,UAAWC,GAAE,CAAa,CAAC,EAEnF,IAAI,SAAW,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,aAAc,GAAG,YAAY,CAAC,CAAC,EAC9D,IAAM,cAAgB,MAAM,cAAc,IAAK,cAAc,EAC7D,QAAW,WAAW,cAAe,CACnC,GAAM,CAAC,MAAO,KAAK,EAAI,QACvB,WAAW,IAAI,MAAM,KAAK,SAAW,OAAO,CAC9C,CAEA,QAAWA,OAAM,SACf,WAAW,OAAOA,GAAE,EAGtB,IAAM,YAAc,CAAC,GAAG,WAAW,OAAO,CAAC,EACrC,gBAAkB,cAAc,IAAK,WAAW,EAItD,MAAM,OAAO,KAAK,MAAM,EACxB,MAAM,YAAY,IAAK,eAAe,EACtC,QAAQ,IAAIF,OAAM,MAAM,sBAAsB,KAAK,UAAU,CAAC,EAAE,CAAC,CACnE,MAAQ,CACN,QAAQ,IAAIA,OAAM,OAAO,yDAAyD,CAAC,CACrF,CAEA,cAAc,EACd,UAAU,MAAM,EAChB,SAAS,MAAM,EACf,QAAQ,CACV,CAvEe,0BAyEf,IAAM,QAAU,SAAS,MAAM,IAAK,CAClC,WAAY,GACZ,IAAK,KAAK,UACV,cAAe,EACjB,CAAC,EAED,eACG,GAAG,MAAQ,IAAO,QAAQ,GAAI,KAAK,CAAC,EACpC,GAAG,SAAW,IAAO,QAAQ,GAAI,QAAQ,CAAC,EAC1C,GAAG,SAAW,IAAO,QAAQ,GAAI,QAAQ,CAAC,EAEtC,SAAY,CACjB,MAAM,QAAQ,MAAM,CACtB,CACF,CA3Ge,oCA6Gf,IAAO,cAAQ,aAAO,KAAY,IAAY,gBAA8B,CAC1E,GAAI,CACF,OAAO,MAAM,YAAY,KAAM,IAAK,aAAa,CACnD,OAAS,IAAK,CACZ,MAAM;AAAA,qCAAyC,GAAY,CAC7D,CACF,EANe", + "names": ["path", "chalk", "slug", "targetSlug", "chalk", "process", "chalk", "process", "path", "fs", "defaultOptions", "path", "chalk", "defaultOptions", "chalk", "path", "defaultOptions", "path", "defaultOptions", "path", "slugAnchor", "visit", "path", "defaultOptions", "visit", "slugAnchor", "path", "url", "visit", "toString", "defaultOptions", "slugAnchor", "visit", "toString", "jsx", "jsx", "visit", "jsx", "slug", "pageResources", "visit", "Content", "Header", "Body", "jsx", "jsxs", "jsx", "jsxs", "jsx", "Fragment", "jsx", "Date", "jsx", "jsxs", "Date", "jsx", "jsxs", "slug", "tag", "content", "path", "jsx", "jsxs", "path", "jsx", "jsxs", "jsx", "jsx", "jsxs", "jsx", "jsxs", "path", "jsx", "jsx", "jsx", "jsx", "jsxs", "defaultOptions", "TableOfContents", "jsx", "jsxs", "jsx", "jsxs", "defaultOptions", "jsx", "jsx", "jsxs", "defaultOptions", "jsx", "jsxs", "slug", "jsx", "jsxs", "jsx", "jsxs", "Fragment", "jsx", "DesktopOnly", "Fragment", "jsx", "MobileOnly", "jsx", "jsxs", "defaultOptions", "Date", "Fragment", "jsx", "jsxs", "defaultOptions", "options", "chalk", "Header", "Body", "slug", "content", "chalk", "Header", "Body", "slug", "content", "path", "Header", "Body", "slug", "path", "content", "toHtml", "path", "defaultOptions", "slug", "toHtml", "path", "content", "path", "path", "slug", "path", "fs", "path", "path", "path", "fs", "fs", "fs", "defaultOptions", "Body", "slug", "path", "slug", "content", "path", "fs", "fs", "chalk", "path", "fp"] +} diff --git a/quartz/.quartz-cache/transpiled-worker.mjs b/quartz/.quartz-cache/transpiled-worker.mjs new file mode 100644 index 0000000..f492b00 --- /dev/null +++ b/quartz/.quartz-cache/transpiled-worker.mjs @@ -0,0 +1,3181 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); + +// quartz/worker.ts +import sourceMapSupport from "source-map-support"; + +// quartz/plugins/transformers/frontmatter.ts +import matter from "gray-matter"; +import remarkFrontmatter from "remark-frontmatter"; +import yaml from "js-yaml"; +import toml from "toml"; + +// quartz/util/path.ts +import { slug } from "github-slugger"; +var QUARTZ = "quartz"; +function slugifyFilePath(fp, excludeExt) { + fp = _stripSlashes(fp); + let ext = _getFileExtension(fp); + const withoutFileExt = fp.replace(new RegExp(ext + "$"), ""); + if (excludeExt || [".md", ".html", void 0].includes(ext)) { + ext = ""; + } + let slug2 = withoutFileExt.split("/").map((segment) => segment.replace(/\s/g, "-").replace(/%/g, "-percent").replace(/\?/g, "-q")).join("/").replace(/\/$/, ""); + if (_endsWith(slug2, "_index")) { + slug2 = slug2.replace(/_index$/, "index"); + } + return slug2 + ext; +} +__name(slugifyFilePath, "slugifyFilePath"); +function simplifySlug(fp) { + return _stripSlashes(_trimSuffix(fp, "index"), true); +} +__name(simplifySlug, "simplifySlug"); +function transformInternalLink(link) { + let [fplike, anchor] = splitAnchor(decodeURI(link)); + const folderPath = _isFolderPath(fplike); + let segments = fplike.split("/").filter((x) => x.length > 0); + let prefix = segments.filter(_isRelativeSegment).join("/"); + let fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== "").join("/"); + const simpleSlug = simplifySlug(slugifyFilePath(fp)); + const joined = joinSegments(_stripSlashes(prefix), _stripSlashes(simpleSlug)); + const trail = folderPath ? "/" : ""; + const res = _addRelativeToStart(joined) + trail + anchor; + return res; +} +__name(transformInternalLink, "transformInternalLink"); +function pathToRoot(slug2) { + let rootPath = slug2.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) { + rootPath = "."; + } + return rootPath; +} +__name(pathToRoot, "pathToRoot"); +function resolveRelative(current, target) { + const res = joinSegments(pathToRoot(current), simplifySlug(target)); + return res; +} +__name(resolveRelative, "resolveRelative"); +function splitAnchor(link) { + let [fp, anchor] = link.split("#", 2); + anchor = anchor === void 0 ? "" : "#" + slugAnchor(anchor); + return [fp, anchor]; +} +__name(splitAnchor, "splitAnchor"); +function slugAnchor(anchor) { + return slug(anchor); +} +__name(slugAnchor, "slugAnchor"); +function slugTag(tag) { + return tag.split("/").map((tagSegment) => slug(tagSegment)).join("/"); +} +__name(slugTag, "slugTag"); +function joinSegments(...args) { + return args.filter((segment) => segment !== "").join("/").replace(/\/\/+/g, "/"); +} +__name(joinSegments, "joinSegments"); +function getAllSegmentPrefixes(tags) { + const segments = tags.split("/"); + const results = []; + for (let i = 0; i < segments.length; i++) { + results.push(segments.slice(0, i + 1).join("/")); + } + return results; +} +__name(getAllSegmentPrefixes, "getAllSegmentPrefixes"); +function transformLink(src, target, opts) { + let targetSlug = transformInternalLink(target); + if (opts.strategy === "relative") { + return targetSlug; + } else { + const folderTail = _isFolderPath(targetSlug) ? "/" : ""; + const canonicalSlug = _stripSlashes(targetSlug.slice(".".length)); + let [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug); + if (opts.strategy === "shortest") { + const matchingFileNames = opts.allSlugs.filter((slug2) => { + const parts = slug2.split("/"); + const fileName = parts.at(-1); + return targetCanonical === fileName; + }); + if (matchingFileNames.length === 1) { + const targetSlug2 = matchingFileNames[0]; + return resolveRelative(src, targetSlug2) + targetAnchor; + } + } + return joinSegments(pathToRoot(src), canonicalSlug) + folderTail; + } +} +__name(transformLink, "transformLink"); +function _isFolderPath(fplike) { + return fplike.endsWith("/") || _endsWith(fplike, "index") || _endsWith(fplike, "index.md") || _endsWith(fplike, "index.html"); +} +__name(_isFolderPath, "_isFolderPath"); +function _endsWith(s, suffix) { + return s === suffix || s.endsWith("/" + suffix); +} +__name(_endsWith, "_endsWith"); +function _trimSuffix(s, suffix) { + if (_endsWith(s, suffix)) { + s = s.slice(0, -suffix.length); + } + return s; +} +__name(_trimSuffix, "_trimSuffix"); +function _getFileExtension(s) { + return s.match(/\.[A-Za-z0-9]+$/)?.[0]; +} +__name(_getFileExtension, "_getFileExtension"); +function _isRelativeSegment(s) { + return /^\.{0,2}$/.test(s); +} +__name(_isRelativeSegment, "_isRelativeSegment"); +function _stripSlashes(s, onlyStripPrefix) { + if (s.startsWith("/")) { + s = s.substring(1); + } + if (!onlyStripPrefix && s.endsWith("/")) { + s = s.slice(0, -1); + } + return s; +} +__name(_stripSlashes, "_stripSlashes"); +function _addRelativeToStart(s) { + if (s === "") { + s = "."; + } + if (!s.startsWith(".")) { + s = joinSegments(".", s); + } + return s; +} +__name(_addRelativeToStart, "_addRelativeToStart"); + +// quartz/plugins/transformers/frontmatter.ts +var defaultOptions = { + delims: "---", + language: "yaml" +}; +var FrontMatter = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions, ...userOpts }; + return { + name: "FrontMatter", + markdownPlugins() { + return [ + [remarkFrontmatter, ["yaml", "toml"]], + () => { + return (_, file) => { + const { data } = matter(file.value, { + ...opts, + engines: { + yaml: (s) => yaml.load(s, { schema: yaml.JSON_SCHEMA }), + toml: (s) => toml.parse(s) + } + }); + if (data.tag) { + data.tags = data.tag; + } + if (data.title) { + data.title = data.title.toString(); + } + if (data.tags && !Array.isArray(data.tags)) { + data.tags = data.tags.toString().split(",").map((tag) => tag.trim()); + } + data.tags = [...new Set(data.tags?.map((tag) => slugTag(tag)))]; + file.data.frontmatter = { + title: file.stem ?? "Untitled", + tags: [], + ...data + }; + }; + } + ]; + } + }; +}, "FrontMatter"); + +// quartz/plugins/transformers/gfm.ts +import remarkGfm from "remark-gfm"; +import smartypants from "remark-smartypants"; +import rehypeSlug from "rehype-slug"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; +var defaultOptions2 = { + enableSmartyPants: true, + linkHeadings: true +}; +var GitHubFlavoredMarkdown = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions2, ...userOpts }; + return { + name: "GitHubFlavoredMarkdown", + markdownPlugins() { + return opts.enableSmartyPants ? [remarkGfm, smartypants] : [remarkGfm]; + }, + htmlPlugins() { + if (opts.linkHeadings) { + return [ + rehypeSlug, + [ + rehypeAutolinkHeadings, + { + behavior: "append", + content: { + type: "text", + value: " \xA7" + } + } + ] + ]; + } else { + return []; + } + } + }; +}, "GitHubFlavoredMarkdown"); + +// quartz/plugins/transformers/lastmod.ts +import fs from "fs"; +import path from "path"; +import { Repository } from "@napi-rs/simple-git"; +import chalk from "chalk"; +var defaultOptions3 = { + priority: ["frontmatter", "git", "filesystem"] +}; +function coerceDate(fp, d) { + const dt = new Date(d); + const invalidDate = isNaN(dt.getTime()) || dt.getTime() === 0; + if (invalidDate && d !== void 0) { + console.log( + chalk.yellow( + ` +Warning: found invalid date "${d}" in \`${fp}\`. Supported formats: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format` + ) + ); + } + return invalidDate ? /* @__PURE__ */ new Date() : dt; +} +__name(coerceDate, "coerceDate"); +var CreatedModifiedDate = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions3, ...userOpts }; + return { + name: "CreatedModifiedDate", + markdownPlugins() { + return [ + () => { + let repo = void 0; + return async (_tree, file) => { + let created = void 0; + let modified = void 0; + let published = void 0; + const fp = file.data.filePath; + const fullFp = path.posix.join(file.cwd, fp); + for (const source of opts.priority) { + if (source === "filesystem") { + const st = await fs.promises.stat(fullFp); + created ||= st.birthtimeMs; + modified ||= st.mtimeMs; + } else if (source === "frontmatter" && file.data.frontmatter) { + created ||= file.data.frontmatter.date; + modified ||= file.data.frontmatter.lastmod; + modified ||= file.data.frontmatter.updated; + modified ||= file.data.frontmatter["last-modified"]; + published ||= file.data.frontmatter.publishDate; + } else if (source === "git") { + if (!repo) { + repo = new Repository(file.cwd); + } + modified ||= await repo.getFileLatestModifiedDateAsync(file.data.filePath); + } + } + file.data.dates = { + created: coerceDate(fp, created), + modified: coerceDate(fp, modified), + published: coerceDate(fp, published) + }; + }; + } + ]; + } + }; +}, "CreatedModifiedDate"); + +// quartz/plugins/transformers/latex.ts +import remarkMath from "remark-math"; +import rehypeKatex from "rehype-katex"; +import rehypeMathjax from "rehype-mathjax/svg.js"; +var Latex = /* @__PURE__ */ __name((opts) => { + const engine = opts?.renderEngine ?? "katex"; + return { + name: "Latex", + markdownPlugins() { + return [remarkMath]; + }, + htmlPlugins() { + if (engine === "katex") { + return [[rehypeKatex, { output: "html" }]]; + } else { + return [rehypeMathjax]; + } + }, + externalResources() { + if (engine === "katex") { + return { + css: [ + // base css + "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" + ], + js: [ + { + // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md + src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", + loadTime: "afterDOMReady", + contentType: "external" + } + ] + }; + } else { + return {}; + } + } + }; +}, "Latex"); + +// quartz/plugins/transformers/description.ts +import { toString } from "hast-util-to-string"; + +// quartz/util/escape.ts +var escapeHTML = /* @__PURE__ */ __name((unsafe) => { + return unsafe.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'"); +}, "escapeHTML"); + +// quartz/plugins/transformers/description.ts +var defaultOptions4 = { + descriptionLength: 150 +}; +var Description = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions4, ...userOpts }; + return { + name: "Description", + htmlPlugins() { + return [ + () => { + return async (tree, file) => { + const frontMatterDescription = file.data.frontmatter?.description; + const text = escapeHTML(toString(tree)); + const desc = frontMatterDescription ?? text; + const sentences = desc.replace(/\s+/g, " ").split("."); + let finalDesc = ""; + let sentenceIdx = 0; + const len = opts.descriptionLength; + while (finalDesc.length < len) { + const sentence = sentences[sentenceIdx]; + if (!sentence) + break; + finalDesc += sentence + "."; + sentenceIdx++; + } + file.data.description = finalDesc; + file.data.text = text; + }; + } + ]; + } + }; +}, "Description"); + +// quartz/plugins/transformers/links.ts +import path2 from "path"; +import { visit } from "unist-util-visit"; +import isAbsoluteUrl from "is-absolute-url"; +var defaultOptions5 = { + markdownLinkResolution: "absolute", + prettyLinks: true, + openLinksInNewTab: false +}; +var CrawlLinks = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions5, ...userOpts }; + return { + name: "LinkProcessing", + htmlPlugins(ctx) { + return [ + () => { + return (tree, file) => { + const curSlug = simplifySlug(file.data.slug); + const outgoing = /* @__PURE__ */ new Set(); + const transformOptions = { + strategy: opts.markdownLinkResolution, + allSlugs: ctx.allSlugs + }; + visit(tree, "element", (node, _index, _parent) => { + if (node.tagName === "a" && node.properties && typeof node.properties.href === "string") { + let dest = node.properties.href; + node.properties.className ??= []; + node.properties.className.push(isAbsoluteUrl(dest) ? "external" : "internal"); + if (opts.openLinksInNewTab) { + node.properties.target = "_blank"; + } + const isInternal = !(isAbsoluteUrl(dest) || dest.startsWith("#")); + if (isInternal) { + dest = node.properties.href = transformLink( + file.data.slug, + dest, + transformOptions + ); + const url = new URL(dest, `https://base.com/${curSlug}`); + const canonicalDest = url.pathname; + const [destCanonical, _destAnchor] = splitAnchor(canonicalDest); + const simple = decodeURIComponent( + simplifySlug(destCanonical) + ); + outgoing.add(simple); + node.properties["data-slug"] = simple; + } + if (opts.prettyLinks && isInternal && node.children.length === 1 && node.children[0].type === "text" && !node.children[0].value.startsWith("#")) { + node.children[0].value = path2.basename(node.children[0].value); + } + } + if (["img", "video", "audio", "iframe"].includes(node.tagName) && node.properties && typeof node.properties.src === "string") { + if (!isAbsoluteUrl(node.properties.src)) { + let dest = node.properties.src; + dest = node.properties.src = transformLink( + file.data.slug, + dest, + transformOptions + ); + node.properties.src = dest; + } + } + }); + file.data.links = [...outgoing]; + }; + } + ]; + } + }; +}, "CrawlLinks"); + +// quartz/plugins/transformers/ofm.ts +import { findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace"; +import { slug as slugAnchor2 } from "github-slugger"; +import rehypeRaw from "rehype-raw"; +import { visit as visit2 } from "unist-util-visit"; +import path3 from "path"; + +// quartz/components/scripts/callout.inline.ts +var callout_inline_default = ""; + +// quartz/plugins/transformers/ofm.ts +import { toHast } from "mdast-util-to-hast"; +import { toHtml } from "hast-util-to-html"; + +// quartz/util/lang.ts +function pluralize(count, s) { + if (count === 1) { + return `1 ${s}`; + } else { + return `${count} ${s}s`; + } +} +__name(pluralize, "pluralize"); +function capitalize(s) { + return s.substring(0, 1).toUpperCase() + s.substring(1); +} +__name(capitalize, "capitalize"); + +// quartz/plugins/transformers/ofm.ts +var defaultOptions6 = { + comments: true, + highlight: true, + wikilinks: true, + callouts: true, + mermaid: true, + parseTags: true, + parseBlockReferences: true, + enableInHtmlEmbed: false +}; +var icons = { + infoIcon: ``, + pencilIcon: ``, + clipboardListIcon: ``, + checkCircleIcon: ``, + flameIcon: ``, + checkIcon: ``, + helpCircleIcon: ``, + alertTriangleIcon: ``, + xIcon: ``, + zapIcon: ``, + bugIcon: ``, + listIcon: ``, + quoteIcon: `` +}; +var callouts = { + note: icons.pencilIcon, + abstract: icons.clipboardListIcon, + info: icons.infoIcon, + todo: icons.checkCircleIcon, + tip: icons.flameIcon, + success: icons.checkIcon, + question: icons.helpCircleIcon, + warning: icons.alertTriangleIcon, + failure: icons.xIcon, + danger: icons.zapIcon, + bug: icons.bugIcon, + example: icons.listIcon, + quote: icons.quoteIcon +}; +var calloutMapping = { + note: "note", + abstract: "abstract", + summary: "abstract", + tldr: "abstract", + info: "info", + todo: "todo", + tip: "tip", + hint: "tip", + important: "tip", + success: "success", + check: "success", + done: "success", + question: "question", + help: "question", + faq: "question", + warning: "warning", + attention: "warning", + caution: "warning", + failure: "failure", + missing: "failure", + fail: "failure", + danger: "danger", + error: "danger", + bug: "bug", + example: "example", + quote: "quote", + cite: "quote" +}; +function canonicalizeCallout(calloutName) { + let callout = calloutName.toLowerCase(); + return calloutMapping[callout] ?? "note"; +} +__name(canonicalizeCallout, "canonicalizeCallout"); +var wikilinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)?(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g"); +var highlightRegex = new RegExp(/==([^=]+)==/, "g"); +var commentRegex = new RegExp(/%%(.+)%%/, "g"); +var calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/); +var calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm"); +var tagRegex = new RegExp(/(?:^| )#((?:[-_\p{L}\d])+(?:\/[-_\p{L}\d]+)*)/, "gu"); +var blockReferenceRegex = new RegExp(/\^([A-Za-z0-9]+)$/, "g"); +var ObsidianFlavoredMarkdown = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions6, ...userOpts }; + const mdastToHtml = /* @__PURE__ */ __name((ast) => { + const hast = toHast(ast, { allowDangerousHtml: true }); + return toHtml(hast, { allowDangerousHtml: true }); + }, "mdastToHtml"); + const findAndReplace = opts.enableInHtmlEmbed ? (tree, regex, replace) => { + if (replace) { + visit2(tree, "html", (node) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace); + } else { + node.value = node.value.replaceAll(regex, (substring, ...args) => { + const replaceValue = replace(substring, ...args); + if (typeof replaceValue === "string") { + return replaceValue; + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join(""); + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue); + } else { + return substring; + } + }); + } + }); + } + mdastFindReplace(tree, regex, replace); + } : mdastFindReplace; + return { + name: "ObsidianFlavoredMarkdown", + textTransform(_ctx, src) { + if (opts.callouts) { + src = src.toString(); + src = src.replaceAll(calloutLineRegex, (value) => { + return value + "\n> "; + }); + } + if (opts.wikilinks) { + src = src.toString(); + src = src.replaceAll(wikilinkRegex, (value, ...capture) => { + const [rawFp, rawHeader, rawAlias] = capture; + const fp = rawFp ?? ""; + const anchor = rawHeader?.trim().slice(1); + const displayAnchor = anchor ? `#${slugAnchor2(anchor)}` : ""; + const displayAlias = rawAlias ?? rawHeader?.replace("#", "|") ?? ""; + const embedDisplay = value.startsWith("!") ? "!" : ""; + return `${embedDisplay}[[${fp}${displayAnchor}${displayAlias}]]`; + }); + } + return src; + }, + markdownPlugins() { + const plugins = []; + if (opts.wikilinks) { + plugins.push(() => { + return (tree, _file) => { + findAndReplace(tree, wikilinkRegex, (value, ...capture) => { + let [rawFp, rawHeader, rawAlias] = capture; + const fp = rawFp?.trim() ?? ""; + const anchor = rawHeader?.trim() ?? ""; + const alias = rawAlias?.slice(1).trim(); + if (value.startsWith("!")) { + const ext = path3.extname(fp).toLowerCase(); + const url2 = slugifyFilePath(fp); + if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) { + const dims = alias ?? ""; + let [width, height] = dims.split("x", 2); + width ||= "auto"; + height ||= "auto"; + return { + type: "image", + url: url2, + data: { + hProperties: { + width, + height + } + } + }; + } else if ([".mp4", ".webm", ".ogv", ".mov", ".mkv"].includes(ext)) { + return { + type: "html", + value: `` + }; + } else if ([".mp3", ".webm", ".wav", ".m4a", ".ogg", ".3gp", ".flac"].includes(ext)) { + return { + type: "html", + value: `` + }; + } else if ([".pdf"].includes(ext)) { + return { + type: "html", + value: `` + }; + } else if (ext === "") { + const block = anchor.slice(1); + return { + type: "html", + data: { hProperties: { transclude: true } }, + value: `
    Transclude of block ${block}
    ` + }; + } + } + const url = fp + anchor; + return { + type: "link", + url, + children: [ + { + type: "text", + value: alias ?? fp + } + ] + }; + }); + }; + }); + } + if (opts.highlight) { + plugins.push(() => { + return (tree, _file) => { + findAndReplace(tree, highlightRegex, (_value, ...capture) => { + const [inner] = capture; + return { + type: "html", + value: `${inner}` + }; + }); + }; + }); + } + if (opts.comments) { + plugins.push(() => { + return (tree, _file) => { + findAndReplace(tree, commentRegex, (_value, ..._capture) => { + return { + type: "text", + value: "" + }; + }); + }; + }); + } + if (opts.callouts) { + plugins.push(() => { + return (tree, _file) => { + visit2(tree, "blockquote", (node) => { + if (node.children.length === 0) { + return; + } + const firstChild = node.children[0]; + if (firstChild.type !== "paragraph" || firstChild.children[0]?.type !== "text") { + return; + } + const text = firstChild.children[0].value; + const restChildren = firstChild.children.slice(1); + const [firstLine, ...remainingLines] = text.split("\n"); + const remainingText = remainingLines.join("\n"); + const match = firstLine.match(calloutRegex); + if (match && match.input) { + const [calloutDirective, typeString, collapseChar] = match; + const calloutType = canonicalizeCallout( + typeString.toLowerCase() + ); + const collapse = collapseChar === "+" || collapseChar === "-"; + const defaultState = collapseChar === "-" ? "collapsed" : "expanded"; + const titleContent = match.input.slice(calloutDirective.length).trim() || capitalize(calloutType); + const titleNode = { + type: "paragraph", + children: [{ type: "text", value: titleContent + " " }, ...restChildren] + }; + const title = mdastToHtml(titleNode); + const toggleIcon = ` + + `; + const titleHtml = { + type: "html", + value: `
    +
    ${callouts[calloutType]}
    +
    ${title}
    + ${collapse ? toggleIcon : ""} +
    ` + }; + const blockquoteContent = [titleHtml]; + if (remainingText.length > 0) { + blockquoteContent.push({ + type: "paragraph", + children: [ + { + type: "text", + value: remainingText + } + ] + }); + } + node.children.splice(0, 1, ...blockquoteContent); + node.data = { + hProperties: { + ...node.data?.hProperties ?? {}, + className: `callout ${collapse ? "is-collapsible" : ""} ${defaultState === "collapsed" ? "is-collapsed" : ""}`, + "data-callout": calloutType, + "data-callout-fold": collapse + } + }; + } + }); + }; + }); + } + if (opts.mermaid) { + plugins.push(() => { + return (tree, _file) => { + visit2(tree, "code", (node) => { + if (node.lang === "mermaid") { + node.data = { + hProperties: { + className: ["mermaid"] + } + }; + } + }); + }; + }); + } + if (opts.parseTags) { + plugins.push(() => { + return (tree, file) => { + const base = pathToRoot(file.data.slug); + findAndReplace(tree, tagRegex, (_value, tag) => { + if (/^\d+$/.test(tag)) { + return false; + } + tag = slugTag(tag); + if (file.data.frontmatter && !file.data.frontmatter.tags.includes(tag)) { + file.data.frontmatter.tags.push(tag); + } + return { + type: "link", + url: base + `/tags/${tag}`, + data: { + hProperties: { + className: ["tag-link"] + } + }, + children: [ + { + type: "text", + value: `#${tag}` + } + ] + }; + }); + }; + }); + } + return plugins; + }, + htmlPlugins() { + const plugins = [rehypeRaw]; + if (opts.parseBlockReferences) { + plugins.push(() => { + const inlineTagTypes = /* @__PURE__ */ new Set(["p", "li"]); + const blockTagTypes = /* @__PURE__ */ new Set(["blockquote"]); + return (tree, file) => { + file.data.blocks = {}; + visit2(tree, "element", (node, index, parent) => { + if (blockTagTypes.has(node.tagName)) { + const nextChild = parent?.children.at(index + 2); + if (nextChild && nextChild.tagName === "p") { + const text = nextChild.children.at(0); + if (text && text.value && text.type === "text") { + const matches = text.value.match(blockReferenceRegex); + if (matches && matches.length >= 1) { + parent.children.splice(index + 2, 1); + const block = matches[0].slice(1); + if (!Object.keys(file.data.blocks).includes(block)) { + node.properties = { + ...node.properties, + id: block + }; + file.data.blocks[block] = node; + } + } + } + } + } else if (inlineTagTypes.has(node.tagName)) { + const last = node.children.at(-1); + if (last && last.value && typeof last.value === "string") { + const matches = last.value.match(blockReferenceRegex); + if (matches && matches.length >= 1) { + last.value = last.value.slice(0, -matches[0].length); + const block = matches[0].slice(1); + if (!Object.keys(file.data.blocks).includes(block)) { + node.properties = { + ...node.properties, + id: block + }; + file.data.blocks[block] = node; + } + } + } + } + }); + }; + }); + } + return plugins; + }, + externalResources() { + const js = []; + if (opts.callouts) { + js.push({ + script: callout_inline_default, + loadTime: "afterDOMReady", + contentType: "inline" + }); + } + if (opts.mermaid) { + js.push({ + script: ` + import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; + const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + theme: darkMode ? 'dark' : 'default' + }); + document.addEventListener('nav', async () => { + await mermaid.run({ + querySelector: '.mermaid' + }) + }); + `, + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "inline" + }); + } + return { js }; + } + }; +}, "ObsidianFlavoredMarkdown"); + +// quartz/plugins/transformers/oxhugofm.ts +var relrefRegex = new RegExp(/\[([^\]]+)\]\(\{\{< relref "([^"]+)" >\}\}\)/, "g"); +var predefinedHeadingIdRegex = new RegExp(/(.*) {#(?:.*)}/, "g"); +var hugoShortcodeRegex = new RegExp(/{{(.*)}}/, "g"); +var figureTagRegex = new RegExp(/< ?figure src="(.*)" ?>/, "g"); +var inlineLatexRegex = new RegExp(/\\\\\((.+?)\\\\\)/, "g"); +var blockLatexRegex = new RegExp( + /(?:\\begin{equation}|\\\\\(|\\\\\[)([\s\S]*?)(?:\\\\\]|\\\\\)|\\end{equation})/, + "g" +); +var quartzLatexRegex = new RegExp(/\$\$[\s\S]*?\$\$|\$.*?\$/, "g"); + +// quartz/plugins/transformers/syntax.ts +import rehypePrettyCode from "rehype-pretty-code"; +var SyntaxHighlighting = /* @__PURE__ */ __name(() => ({ + name: "SyntaxHighlighting", + htmlPlugins() { + return [ + [ + rehypePrettyCode, + { + theme: "css-variables" + } + ] + ]; + } +}), "SyntaxHighlighting"); + +// quartz/plugins/transformers/toc.ts +import { visit as visit3 } from "unist-util-visit"; +import { toString as toString2 } from "mdast-util-to-string"; +import Slugger from "github-slugger"; +var defaultOptions7 = { + maxDepth: 3, + minEntries: 1, + showByDefault: true, + collapseByDefault: false +}; +var TableOfContents = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions7, ...userOpts }; + return { + name: "TableOfContents", + markdownPlugins() { + return [ + () => { + return async (tree, file) => { + const display = file.data.frontmatter?.enableToc ?? opts.showByDefault; + if (display) { + const slugAnchor3 = new Slugger(); + const toc = []; + let highestDepth = opts.maxDepth; + visit3(tree, "heading", (node) => { + if (node.depth <= opts.maxDepth) { + const text = toString2(node); + highestDepth = Math.min(highestDepth, node.depth); + toc.push({ + depth: node.depth, + text, + slug: slugAnchor3.slug(text) + }); + } + }); + if (toc.length > opts.minEntries) { + file.data.toc = toc.map((entry) => ({ + ...entry, + depth: entry.depth - highestDepth + })); + file.data.collapseToc = opts.collapseByDefault; + } + } + }; + } + ]; + } + }; +}, "TableOfContents"); + +// quartz/plugins/transformers/linebreaks.ts +import remarkBreaks from "remark-breaks"; + +// quartz/plugins/filters/draft.ts +var RemoveDrafts = /* @__PURE__ */ __name(() => ({ + name: "RemoveDrafts", + shouldPublish(_ctx, [_tree, vfile]) { + const draftFlag = vfile.data?.frontmatter?.draft ?? false; + return !draftFlag; + } +}), "RemoveDrafts"); + +// quartz/components/Header.tsx +import { jsx } from "preact/jsx-runtime"; +function Header({ children }) { + return children.length > 0 ? /* @__PURE__ */ jsx("header", { children }) : null; +} +__name(Header, "Header"); +Header.css = ` +header { + display: flex; + flex-direction: row; + align-items: center; + margin: 2rem 0; + gap: 1.5rem; +} + +header h1 { + margin: 0; + flex: auto; +} +`; +var Header_default = /* @__PURE__ */ __name(() => Header, "default"); + +// quartz/components/scripts/clipboard.inline.ts +var clipboard_inline_default = ""; + +// quartz/components/styles/clipboard.scss +var clipboard_default = ""; + +// quartz/components/Body.tsx +import { jsx as jsx2 } from "preact/jsx-runtime"; +function Body({ children }) { + return /* @__PURE__ */ jsx2("div", { id: "quartz-body", children }); +} +__name(Body, "Body"); +Body.afterDOMLoaded = clipboard_inline_default; +Body.css = clipboard_default; +var Body_default = /* @__PURE__ */ __name(() => Body, "default"); + +// quartz/components/renderPage.tsx +import { render } from "preact-render-to-string"; + +// quartz/util/resources.tsx +import { randomUUID } from "crypto"; +import { jsx as jsx3 } from "preact/jsx-runtime"; +function JSResourceToScriptElement(resource, preserve) { + const scriptType = resource.moduleType ?? "application/javascript"; + const spaPreserve = preserve ?? resource.spaPreserve; + if (resource.contentType === "external") { + return /* @__PURE__ */ jsx3("script", { src: resource.src, type: scriptType, "spa-preserve": spaPreserve }, resource.src); + } else { + const content = resource.script; + return /* @__PURE__ */ jsx3("script", { type: scriptType, "spa-preserve": spaPreserve, children: content }, randomUUID()); + } +} +__name(JSResourceToScriptElement, "JSResourceToScriptElement"); + +// quartz/components/renderPage.tsx +import { visit as visit4 } from "unist-util-visit"; +import { jsx as jsx4, jsxs } from "preact/jsx-runtime"; +function pageResources(baseDir, staticResources) { + const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json"); + const contentIndexScript = `const fetchData = fetch(\`${contentIndexPath}\`).then(data => data.json())`; + return { + css: [joinSegments(baseDir, "index.css"), ...staticResources.css], + js: [ + { + src: joinSegments(baseDir, "prescript.js"), + loadTime: "beforeDOMReady", + contentType: "external" + }, + { + loadTime: "beforeDOMReady", + contentType: "inline", + spaPreserve: true, + script: contentIndexScript + }, + ...staticResources.js, + { + src: joinSegments(baseDir, "postscript.js"), + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "external" + } + ] + }; +} +__name(pageResources, "pageResources"); +function renderPage(slug2, componentData, components, pageResources2) { + visit4(componentData.tree, "element", (node, _index, _parent) => { + if (node.tagName === "blockquote") { + const classNames = node.properties?.className ?? []; + if (classNames.includes("transclude")) { + const inner = node.children[0]; + const blockSlug = inner.properties?.["data-slug"]; + const blockRef = node.properties.dataBlock; + let blockNode = componentData.allFiles.find((f) => f.slug === blockSlug)?.blocks?.[blockRef]; + if (blockNode) { + if (blockNode.tagName === "li") { + blockNode = { + type: "element", + tagName: "ul", + children: [blockNode] + }; + } + node.children = [ + blockNode, + { + type: "element", + tagName: "a", + properties: { href: inner.properties?.href, class: ["internal"] }, + children: [{ type: "text", value: `Link to original` }] + } + ]; + } + } + } + }); + const { + head: Head, + header, + beforeBody, + pageBody: Content2, + left, + right, + footer: Footer + } = components; + const Header2 = Header_default(); + const Body2 = Body_default(); + const LeftComponent = /* @__PURE__ */ jsx4("div", { class: "left sidebar", children: left.map((BodyComponent) => /* @__PURE__ */ jsx4(BodyComponent, { ...componentData })) }); + const RightComponent = /* @__PURE__ */ jsx4("div", { class: "right sidebar", children: right.map((BodyComponent) => /* @__PURE__ */ jsx4(BodyComponent, { ...componentData })) }); + const doc = /* @__PURE__ */ jsxs("html", { children: [ + /* @__PURE__ */ jsx4(Head, { ...componentData }), + /* @__PURE__ */ jsx4("body", { "data-slug": slug2, children: /* @__PURE__ */ jsxs("div", { id: "quartz-root", class: "page", children: [ + /* @__PURE__ */ jsxs(Body2, { ...componentData, children: [ + LeftComponent, + /* @__PURE__ */ jsxs("div", { class: "center", children: [ + /* @__PURE__ */ jsxs("div", { class: "page-header", children: [ + /* @__PURE__ */ jsx4(Header2, { ...componentData, children: header.map((HeaderComponent) => /* @__PURE__ */ jsx4(HeaderComponent, { ...componentData })) }), + /* @__PURE__ */ jsx4("div", { class: "popover-hint", children: beforeBody.map((BodyComponent) => /* @__PURE__ */ jsx4(BodyComponent, { ...componentData })) }) + ] }), + /* @__PURE__ */ jsx4(Content2, { ...componentData }) + ] }), + RightComponent + ] }), + /* @__PURE__ */ jsx4(Footer, { ...componentData }) + ] }) }), + pageResources2.js.filter((resource) => resource.loadTime === "afterDOMReady").map((res) => JSResourceToScriptElement(res)) + ] }); + return "\n" + render(doc); +} +__name(renderPage, "renderPage"); + +// quartz/util/jsx.ts +import { toJsxRuntime } from "hast-util-to-jsx-runtime"; +import { Fragment, jsx as jsx5, jsxs as jsxs2 } from "preact/jsx-runtime"; + +// quartz/util/trace.ts +import chalk2 from "chalk"; +import process2 from "process"; +import { isMainThread } from "workerpool"; +var rootFile = /.*at file:/; +function trace(msg, err) { + let stack = err.stack ?? ""; + const lines = []; + lines.push(""); + lines.push( + "\n" + chalk2.bgRed.black.bold(" ERROR ") + "\n\n" + chalk2.red(` ${msg}`) + (err.message.length > 0 ? `: ${err.message}` : "") + ); + let reachedEndOfLegibleTrace = false; + for (const line of stack.split("\n").slice(1)) { + if (reachedEndOfLegibleTrace) { + break; + } + if (!line.includes("node_modules")) { + lines.push(` ${line}`); + if (rootFile.test(line)) { + reachedEndOfLegibleTrace = true; + } + } + } + const traceMsg = lines.join("\n"); + if (!isMainThread) { + throw new Error(traceMsg); + } else { + console.error(traceMsg); + process2.exit(1); + } +} +__name(trace, "trace"); + +// quartz/util/jsx.ts +function htmlToJsx(fp, tree) { + try { + return toJsxRuntime(tree, { Fragment, jsx: jsx5, jsxs: jsxs2, elementAttributeNameCase: "html" }); + } catch (e) { + trace(`Failed to parse Markdown in \`${fp}\` into JSX`, e); + } +} +__name(htmlToJsx, "htmlToJsx"); + +// quartz/components/pages/Content.tsx +import { jsx as jsx6 } from "preact/jsx-runtime"; +function Content({ fileData, tree }) { + const content = htmlToJsx(fileData.filePath, tree); + return /* @__PURE__ */ jsx6("article", { class: "popover-hint", children: content }); +} +__name(Content, "Content"); +var Content_default = /* @__PURE__ */ __name(() => Content, "default"); + +// quartz/components/styles/listPage.scss +var listPage_default = ""; + +// quartz/components/Date.tsx +import { Fragment as Fragment2, jsx as jsx7 } from "preact/jsx-runtime"; +function getDate(cfg, data) { + if (!cfg.defaultDateType) { + throw new Error( + `Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.` + ); + } + return data.dates?.[cfg.defaultDateType]; +} +__name(getDate, "getDate"); +function formatDate(d) { + return d.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "2-digit" + }); +} +__name(formatDate, "formatDate"); +function Date2({ date }) { + return /* @__PURE__ */ jsx7(Fragment2, { children: formatDate(date) }); +} +__name(Date2, "Date"); + +// quartz/components/PageList.tsx +import { jsx as jsx8, jsxs as jsxs3 } from "preact/jsx-runtime"; +function byDateAndAlphabetical(cfg) { + return (f1, f2) => { + if (f1.dates && f2.dates) { + return getDate(cfg, f2).getTime() - getDate(cfg, f1).getTime(); + } else if (f1.dates && !f2.dates) { + return -1; + } else if (!f1.dates && f2.dates) { + return 1; + } + const f1Title = f1.frontmatter?.title.toLowerCase() ?? ""; + const f2Title = f2.frontmatter?.title.toLowerCase() ?? ""; + return f1Title.localeCompare(f2Title); + }; +} +__name(byDateAndAlphabetical, "byDateAndAlphabetical"); +function PageList({ cfg, fileData, allFiles, limit }) { + let list = allFiles.sort(byDateAndAlphabetical(cfg)); + if (limit) { + list = list.slice(0, limit); + } + return /* @__PURE__ */ jsx8("ul", { class: "section-ul", children: list.map((page) => { + const title = page.frontmatter?.title; + const tags = page.frontmatter?.tags ?? []; + return /* @__PURE__ */ jsx8("li", { class: "section-li", children: /* @__PURE__ */ jsxs3("div", { class: "section", children: [ + page.dates && /* @__PURE__ */ jsx8("p", { class: "meta", children: /* @__PURE__ */ jsx8(Date2, { date: getDate(cfg, page) }) }), + /* @__PURE__ */ jsx8("div", { class: "desc", children: /* @__PURE__ */ jsx8("h3", { children: /* @__PURE__ */ jsx8("a", { href: resolveRelative(fileData.slug, page.slug), class: "internal", children: title }) }) }), + /* @__PURE__ */ jsx8("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ jsx8("li", { children: /* @__PURE__ */ jsxs3( + "a", + { + class: "internal tag-link", + href: resolveRelative(fileData.slug, `tags/${tag}`), + children: [ + "#", + tag + ] + } + ) })) }) + ] }) }); + }) }); +} +__name(PageList, "PageList"); +PageList.css = ` +.section h3 { + margin: 0; +} + +.section > .tags { + margin: 0; +} +`; + +// quartz/components/pages/TagContent.tsx +import { jsx as jsx9, jsxs as jsxs4 } from "preact/jsx-runtime"; +var numPages = 10; +function TagContent(props) { + const { tree, fileData, allFiles } = props; + const slug2 = fileData.slug; + if (!(slug2?.startsWith("tags/") || slug2 === "tags")) { + throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug2}`); + } + const tag = simplifySlug(slug2.slice("tags/".length)); + const allPagesWithTag = /* @__PURE__ */ __name((tag2) => allFiles.filter( + (file) => (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(tag2) + ), "allPagesWithTag"); + const content = tree.children.length === 0 ? fileData.description : htmlToJsx(fileData.filePath, tree); + if (tag === "") { + const tags = [...new Set(allFiles.flatMap((data) => data.frontmatter?.tags ?? []))]; + const tagItemMap = /* @__PURE__ */ new Map(); + for (const tag2 of tags) { + tagItemMap.set(tag2, allPagesWithTag(tag2)); + } + return /* @__PURE__ */ jsxs4("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx9("article", { children: /* @__PURE__ */ jsx9("p", { children: content }) }), + /* @__PURE__ */ jsxs4("p", { children: [ + "Found ", + tags.length, + " total tags." + ] }), + /* @__PURE__ */ jsx9("div", { children: tags.map((tag2) => { + const pages = tagItemMap.get(tag2); + const listProps = { + ...props, + allFiles: pages + }; + const contentPage = allFiles.filter((file) => file.slug === `tags/${tag2}`)[0]; + const content2 = contentPage?.description; + return /* @__PURE__ */ jsxs4("div", { children: [ + /* @__PURE__ */ jsx9("h2", { children: /* @__PURE__ */ jsxs4("a", { class: "internal tag-link", href: `./${tag2}`, children: [ + "#", + tag2 + ] }) }), + content2 && /* @__PURE__ */ jsx9("p", { children: content2 }), + /* @__PURE__ */ jsxs4("p", { children: [ + pluralize(pages.length, "item"), + " with this tag.", + " ", + pages.length > numPages && `Showing first ${numPages}.` + ] }), + /* @__PURE__ */ jsx9(PageList, { limit: numPages, ...listProps }) + ] }); + }) }) + ] }); + } else { + const pages = allPagesWithTag(tag); + const listProps = { + ...props, + allFiles: pages + }; + return /* @__PURE__ */ jsxs4("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx9("article", { children: content }), + /* @__PURE__ */ jsxs4("p", { children: [ + pluralize(pages.length, "item"), + " with this tag." + ] }), + /* @__PURE__ */ jsx9("div", { children: /* @__PURE__ */ jsx9(PageList, { ...listProps }) }) + ] }); + } +} +__name(TagContent, "TagContent"); +TagContent.css = listPage_default + PageList.css; +var TagContent_default = /* @__PURE__ */ __name(() => TagContent, "default"); + +// quartz/components/pages/FolderContent.tsx +import path4 from "path"; +import { jsx as jsx10, jsxs as jsxs5 } from "preact/jsx-runtime"; +function FolderContent(props) { + const { tree, fileData, allFiles } = props; + const folderSlug = _stripSlashes(simplifySlug(fileData.slug)); + const allPagesInFolder = allFiles.filter((file) => { + const fileSlug = _stripSlashes(simplifySlug(file.slug)); + const prefixed = fileSlug.startsWith(folderSlug) && fileSlug !== folderSlug; + const folderParts = folderSlug.split(path4.posix.sep); + const fileParts = fileSlug.split(path4.posix.sep); + const isDirectChild = fileParts.length === folderParts.length + 1; + return prefixed && isDirectChild; + }); + const listProps = { + ...props, + allFiles: allPagesInFolder + }; + const content = tree.children.length === 0 ? fileData.description : htmlToJsx(fileData.filePath, tree); + return /* @__PURE__ */ jsxs5("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx10("article", { children: /* @__PURE__ */ jsx10("p", { children: content }) }), + /* @__PURE__ */ jsxs5("p", { children: [ + pluralize(allPagesInFolder.length, "item"), + " under this folder." + ] }), + /* @__PURE__ */ jsx10("div", { children: /* @__PURE__ */ jsx10(PageList, { ...listProps }) }) + ] }); +} +__name(FolderContent, "FolderContent"); +FolderContent.css = listPage_default + PageList.css; +var FolderContent_default = /* @__PURE__ */ __name(() => FolderContent, "default"); + +// quartz/components/pages/404.tsx +import { jsx as jsx11, jsxs as jsxs6 } from "preact/jsx-runtime"; +function NotFound() { + return /* @__PURE__ */ jsxs6("article", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx11("h1", { children: "404" }), + /* @__PURE__ */ jsx11("p", { children: "Either this page is private or doesn't exist." }) + ] }); +} +__name(NotFound, "NotFound"); +var __default = /* @__PURE__ */ __name(() => NotFound, "default"); + +// quartz/components/ArticleTitle.tsx +import { jsx as jsx12 } from "preact/jsx-runtime"; +function ArticleTitle({ fileData, displayClass }) { + const title = fileData.frontmatter?.title; + if (title) { + return /* @__PURE__ */ jsx12("h1", { class: `article-title ${displayClass ?? ""}`, children: title }); + } else { + return null; + } +} +__name(ArticleTitle, "ArticleTitle"); +ArticleTitle.css = ` +.article-title { + margin: 2rem 0 0 0; +} +`; +var ArticleTitle_default = /* @__PURE__ */ __name(() => ArticleTitle, "default"); + +// quartz/components/scripts/darkmode.inline.ts +var darkmode_inline_default = ""; + +// quartz/components/styles/darkmode.scss +var darkmode_default = ""; + +// quartz/components/Darkmode.tsx +import { jsx as jsx13, jsxs as jsxs7 } from "preact/jsx-runtime"; +function Darkmode({ displayClass }) { + return /* @__PURE__ */ jsxs7("div", { class: `darkmode ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsx13("input", { class: "toggle", id: "darkmode-toggle", type: "checkbox", tabIndex: -1 }), + /* @__PURE__ */ jsx13("label", { id: "toggle-label-light", for: "darkmode-toggle", tabIndex: -1, children: /* @__PURE__ */ jsxs7( + "svg", + { + xmlns: "http://www.w3.org/2000/svg", + xmlnsXlink: "http://www.w3.org/1999/xlink", + version: "1.1", + id: "dayIcon", + x: "0px", + y: "0px", + viewBox: "0 0 35 35", + style: "enable-background:new 0 0 35 35;", + xmlSpace: "preserve", + children: [ + /* @__PURE__ */ jsx13("title", { children: "Light mode" }), + /* @__PURE__ */ jsx13("path", { d: "M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z" }) + ] + } + ) }), + /* @__PURE__ */ jsx13("label", { id: "toggle-label-dark", for: "darkmode-toggle", tabIndex: -1, children: /* @__PURE__ */ jsxs7( + "svg", + { + xmlns: "http://www.w3.org/2000/svg", + xmlnsXlink: "http://www.w3.org/1999/xlink", + version: "1.1", + id: "nightIcon", + x: "0px", + y: "0px", + viewBox: "0 0 100 100", + style: "enable-background='new 0 0 100 100'", + xmlSpace: "preserve", + children: [ + /* @__PURE__ */ jsx13("title", { children: "Dark mode" }), + /* @__PURE__ */ jsx13("path", { d: "M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.008-14.65,35.369 c0,13.36,5.203,25.921,14.65,35.368s22.008,14.65,35.368,14.65c13.361,0,25.921-5.203,35.369-14.65 c3.872-3.871,7.064-8.328,9.491-13.246C97.826,68.608,97.611,67.309,96.76,66.458z" }) + ] + } + ) }) + ] }); +} +__name(Darkmode, "Darkmode"); +Darkmode.beforeDOMLoaded = darkmode_inline_default; +Darkmode.css = darkmode_default; +var Darkmode_default = /* @__PURE__ */ __name(() => Darkmode, "default"); + +// quartz/components/Head.tsx +import { jsx as jsx14, jsxs as jsxs8 } from "preact/jsx-runtime"; +var Head_default = /* @__PURE__ */ __name(() => { + function Head({ cfg, fileData, externalResources }) { + const title = fileData.frontmatter?.title ?? "Untitled"; + const description = fileData.description?.trim() ?? "No description provided"; + const { css, js } = externalResources; + const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`); + const path11 = url.pathname; + const baseDir = fileData.slug === "404" ? path11 : pathToRoot(fileData.slug); + const iconPath = joinSegments(baseDir, "static/icon.png"); + const ogImagePath = `https://${cfg.baseUrl}/static/og-image.png`; + return /* @__PURE__ */ jsxs8("head", { children: [ + /* @__PURE__ */ jsx14("title", { children: title }), + /* @__PURE__ */ jsx14("meta", { charSet: "utf-8" }), + /* @__PURE__ */ jsx14("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }), + /* @__PURE__ */ jsx14("meta", { property: "og:title", content: title }), + /* @__PURE__ */ jsx14("meta", { property: "og:description", content: description }), + cfg.baseUrl && /* @__PURE__ */ jsx14("meta", { property: "og:image", content: ogImagePath }), + /* @__PURE__ */ jsx14("meta", { property: "og:width", content: "1200" }), + /* @__PURE__ */ jsx14("meta", { property: "og:height", content: "675" }), + /* @__PURE__ */ jsx14("link", { rel: "icon", href: iconPath }), + /* @__PURE__ */ jsx14("meta", { name: "description", content: description }), + /* @__PURE__ */ jsx14("meta", { name: "generator", content: "Quartz" }), + /* @__PURE__ */ jsx14("link", { rel: "preconnect", href: "https://fonts.googleapis.com" }), + /* @__PURE__ */ jsx14("link", { rel: "preconnect", href: "https://fonts.gstatic.com" }), + css.map((href) => /* @__PURE__ */ jsx14("link", { href, rel: "stylesheet", type: "text/css", "spa-preserve": true }, href)), + js.filter((resource) => resource.loadTime === "beforeDOMReady").map((res) => JSResourceToScriptElement(res, true)) + ] }); + } + __name(Head, "Head"); + return Head; +}, "default"); + +// quartz/components/PageTitle.tsx +import { jsx as jsx15 } from "preact/jsx-runtime"; +function PageTitle({ fileData, cfg, displayClass }) { + const title = cfg?.pageTitle ?? "Untitled Quartz"; + const baseDir = pathToRoot(fileData.slug); + return /* @__PURE__ */ jsx15("h1", { class: `page-title ${displayClass ?? ""}`, children: /* @__PURE__ */ jsx15("a", { href: baseDir, children: title }) }); +} +__name(PageTitle, "PageTitle"); +PageTitle.css = ` +.page-title { + margin: 0; +} +`; +var PageTitle_default = /* @__PURE__ */ __name(() => PageTitle, "default"); + +// quartz/components/ContentMeta.tsx +import readingTime from "reading-time"; +import { jsx as jsx16 } from "preact/jsx-runtime"; +var ContentMeta_default = /* @__PURE__ */ __name(() => { + function ContentMetadata({ cfg, fileData, displayClass }) { + const text = fileData.text; + if (text) { + const segments = []; + const { text: timeTaken, words: _words } = readingTime(text); + if (fileData.dates) { + segments.push(formatDate(getDate(cfg, fileData))); + } + segments.push(timeTaken); + return /* @__PURE__ */ jsx16("p", { class: `content-meta ${displayClass ?? ""}`, children: segments.join(", ") }); + } else { + return null; + } + } + __name(ContentMetadata, "ContentMetadata"); + ContentMetadata.css = ` + .content-meta { + margin-top: 0; + color: var(--gray); + } + `; + return ContentMetadata; +}, "default"); + +// quartz/components/Spacer.tsx +import { jsx as jsx17 } from "preact/jsx-runtime"; +function Spacer({ displayClass }) { + return /* @__PURE__ */ jsx17("div", { class: `spacer ${displayClass ?? ""}` }); +} +__name(Spacer, "Spacer"); +var Spacer_default = /* @__PURE__ */ __name(() => Spacer, "default"); + +// quartz/components/styles/legacyToc.scss +var legacyToc_default = ""; + +// quartz/components/styles/toc.scss +var toc_default = ""; + +// quartz/components/scripts/toc.inline.ts +var toc_inline_default = ""; + +// quartz/components/TableOfContents.tsx +import { jsx as jsx18, jsxs as jsxs9 } from "preact/jsx-runtime"; +var defaultOptions8 = { + layout: "modern" +}; +function TableOfContents2({ fileData, displayClass }) { + if (!fileData.toc) { + return null; + } + return /* @__PURE__ */ jsxs9("div", { class: `toc ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsxs9("button", { type: "button", id: "toc", class: fileData.collapseToc ? "collapsed" : "", children: [ + /* @__PURE__ */ jsx18("h3", { children: "Table of Contents" }), + /* @__PURE__ */ jsx18( + "svg", + { + xmlns: "http://www.w3.org/2000/svg", + width: "24", + height: "24", + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + class: "fold", + children: /* @__PURE__ */ jsx18("polyline", { points: "6 9 12 15 18 9" }) + } + ) + ] }), + /* @__PURE__ */ jsx18("div", { id: "toc-content", children: /* @__PURE__ */ jsx18("ul", { class: "overflow", children: fileData.toc.map((tocEntry) => /* @__PURE__ */ jsx18("li", { class: `depth-${tocEntry.depth}`, children: /* @__PURE__ */ jsx18("a", { href: `#${tocEntry.slug}`, "data-for": tocEntry.slug, children: tocEntry.text }) }, tocEntry.slug)) }) }) + ] }); +} +__name(TableOfContents2, "TableOfContents"); +TableOfContents2.css = toc_default; +TableOfContents2.afterDOMLoaded = toc_inline_default; +function LegacyTableOfContents({ fileData }) { + if (!fileData.toc) { + return null; + } + return /* @__PURE__ */ jsxs9("details", { id: "toc", open: !fileData.collapseToc, children: [ + /* @__PURE__ */ jsx18("summary", { children: /* @__PURE__ */ jsx18("h3", { children: "Table of Contents" }) }), + /* @__PURE__ */ jsx18("ul", { children: fileData.toc.map((tocEntry) => /* @__PURE__ */ jsx18("li", { class: `depth-${tocEntry.depth}`, children: /* @__PURE__ */ jsx18("a", { href: `#${tocEntry.slug}`, "data-for": tocEntry.slug, children: tocEntry.text }) }, tocEntry.slug)) }) + ] }); +} +__name(LegacyTableOfContents, "LegacyTableOfContents"); +LegacyTableOfContents.css = legacyToc_default; +var TableOfContents_default = /* @__PURE__ */ __name((opts) => { + const layout = opts?.layout ?? defaultOptions8.layout; + return layout === "modern" ? TableOfContents2 : LegacyTableOfContents; +}, "default"); + +// quartz/components/styles/explorer.scss +var explorer_default = ""; + +// quartz/components/scripts/explorer.inline.ts +var explorer_inline_default = ""; + +// quartz/components/ExplorerNode.tsx +import { jsx as jsx19, jsxs as jsxs10 } from "preact/jsx-runtime"; +var FileNode = class _FileNode { + static { + __name(this, "FileNode"); + } + children; + name; + displayName; + file; + depth; + constructor(name, file, depth) { + this.children = []; + this.name = name; + this.displayName = name; + this.file = file ? structuredClone(file) : null; + this.depth = depth ?? 0; + } + insert(file) { + if (file.path.length === 1) { + if (file.path[0] !== "index.md") { + this.children.push(new _FileNode(file.file.frontmatter.title, file.file, this.depth + 1)); + } else { + const title = file.file.frontmatter?.title; + if (title && title !== "index" && file.path[0] === "index.md") { + this.displayName = title; + } + } + } else { + const next = file.path[0]; + file.path = file.path.splice(1); + for (const child of this.children) { + if (child.name === next) { + child.insert(file); + return; + } + } + const newChild = new _FileNode(next, void 0, this.depth + 1); + newChild.insert(file); + this.children.push(newChild); + } + } + // Add new file to tree + add(file, splice = 0) { + this.insert({ file, path: file.filePath.split("/").splice(splice) }); + } + // Print tree structure (for debugging) + print(depth = 0) { + let folderChar = ""; + if (!this.file) + folderChar = "|"; + console.log("-".repeat(depth), folderChar, this.name, this.depth); + this.children.forEach((e) => e.print(depth + 1)); + } + /** + * Filter FileNode tree. Behaves similar to `Array.prototype.filter()`, but modifies tree in place + * @param filterFn function to filter tree with + */ + filter(filterFn) { + this.children = this.children.filter(filterFn); + this.children.forEach((child) => child.filter(filterFn)); + } + /** + * Filter FileNode tree. Behaves similar to `Array.prototype.map()`, but modifies tree in place + * @param mapFn function to use for mapping over tree + */ + map(mapFn) { + mapFn(this); + this.children.forEach((child) => child.map(mapFn)); + } + /** + * Get folder representation with state of tree. + * Intended to only be called on root node before changes to the tree are made + * @param collapsed default state of folders (collapsed by default or not) + * @returns array containing folder state for tree + */ + getFolderPaths(collapsed) { + const folderPaths = []; + const traverse = /* @__PURE__ */ __name((node, currentPath) => { + if (!node.file) { + const folderPath = currentPath + (currentPath ? "/" : "") + node.name; + if (folderPath !== "") { + folderPaths.push({ path: folderPath, collapsed }); + } + node.children.forEach((child) => traverse(child, folderPath)); + } + }, "traverse"); + traverse(this, ""); + return folderPaths; + } + // Sort order: folders first, then files. Sort folders and files alphabetically + /** + * Sorts tree according to sort/compare function + * @param sortFn compare function used for `.sort()`, also used recursively for children + */ + sort(sortFn) { + this.children = this.children.sort(sortFn); + this.children.forEach((e) => e.sort(sortFn)); + } +}; +function ExplorerNode({ node, opts, fullPath, fileData }) { + const folderBehavior = opts.folderClickBehavior; + const isDefaultOpen = opts.folderDefaultState === "open"; + let pathOld = fullPath ? fullPath : ""; + let folderPath = ""; + if (node.name !== "") { + folderPath = `${pathOld}/${node.name}`; + } + return /* @__PURE__ */ jsx19("li", { children: node.file ? ( + // Single file node + /* @__PURE__ */ jsx19("li", { children: /* @__PURE__ */ jsx19("a", { href: resolveRelative(fileData.slug, node.file.slug), "data-for": node.file.slug, children: node.displayName }) }, node.file.slug) + ) : /* @__PURE__ */ jsxs10("div", { children: [ + node.name !== "" && // Node with entire folder + // Render svg button + folder name, then children + /* @__PURE__ */ jsxs10("div", { class: "folder-container", children: [ + /* @__PURE__ */ jsx19( + "svg", + { + xmlns: "http://www.w3.org/2000/svg", + width: "12", + height: "12", + viewBox: "5 8 14 8", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + class: "folder-icon", + children: /* @__PURE__ */ jsx19("polyline", { points: "6 9 12 15 18 9" }) + } + ), + /* @__PURE__ */ jsx19("div", { "data-folderpath": folderPath, children: folderBehavior === "link" ? /* @__PURE__ */ jsx19("a", { href: `${folderPath}`, "data-for": node.name, class: "folder-title", children: node.displayName }) : /* @__PURE__ */ jsx19("button", { class: "folder-button", children: /* @__PURE__ */ jsx19("p", { class: "folder-title", children: node.displayName }) }) }, node.name) + ] }), + /* @__PURE__ */ jsx19("div", { class: `folder-outer ${node.depth === 0 || isDefaultOpen ? "open" : ""}`, children: /* @__PURE__ */ jsx19( + "ul", + { + style: { + paddingLeft: node.name !== "" ? "1.4rem" : "0" + }, + class: "content", + "data-folderul": folderPath, + children: node.children.map((childNode, i) => /* @__PURE__ */ jsx19( + ExplorerNode, + { + node: childNode, + opts, + fullPath: folderPath, + fileData + }, + i + )) + } + ) }) + ] }) }); +} +__name(ExplorerNode, "ExplorerNode"); + +// quartz/components/Explorer.tsx +import { jsx as jsx20, jsxs as jsxs11 } from "preact/jsx-runtime"; +var defaultOptions9 = { + title: "Explorer", + folderClickBehavior: "collapse", + folderDefaultState: "collapsed", + useSavedState: true, + sortFn: (a, b) => { + if (!a.file && !b.file || a.file && b.file) { + return a.displayName.localeCompare(b.displayName, void 0, { + numeric: true, + sensitivity: "base" + }); + } + if (a.file && !b.file) { + return 1; + } else { + return -1; + } + }, + filterFn: (node) => node.name !== "tags", + order: ["filter", "map", "sort"] +}; +var Explorer_default = /* @__PURE__ */ __name((userOpts) => { + const opts = { ...defaultOptions9, ...userOpts }; + let fileTree; + let jsonTree; + function constructFileTree(allFiles) { + if (!fileTree) { + fileTree = new FileNode(""); + allFiles.forEach((file) => fileTree.add(file, 1)); + const functions = { + map: opts.mapFn, + sort: opts.sortFn, + filter: opts.filterFn + }; + if (opts.order) { + for (let i = 0; i < opts.order.length; i++) { + const functionName = opts.order[i]; + if (functions[functionName]) { + fileTree[functionName].call(fileTree, functions[functionName]); + } + } + } + const folders = fileTree.getFolderPaths(opts.folderDefaultState === "collapsed"); + jsonTree = JSON.stringify(folders); + } + } + __name(constructFileTree, "constructFileTree"); + function Explorer({ allFiles, displayClass, fileData }) { + constructFileTree(allFiles); + return /* @__PURE__ */ jsxs11("div", { class: `explorer ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsxs11( + "button", + { + type: "button", + id: "explorer", + "data-behavior": opts.folderClickBehavior, + "data-collapsed": opts.folderDefaultState, + "data-savestate": opts.useSavedState, + "data-tree": jsonTree, + children: [ + /* @__PURE__ */ jsx20("h1", { children: opts.title }), + /* @__PURE__ */ jsx20( + "svg", + { + xmlns: "http://www.w3.org/2000/svg", + width: "14", + height: "14", + viewBox: "5 8 14 8", + fill: "none", + stroke: "currentColor", + "stroke-width": "2", + "stroke-linecap": "round", + "stroke-linejoin": "round", + class: "fold", + children: /* @__PURE__ */ jsx20("polyline", { points: "6 9 12 15 18 9" }) + } + ) + ] + } + ), + /* @__PURE__ */ jsx20("div", { id: "explorer-content", children: /* @__PURE__ */ jsxs11("ul", { class: "overflow", id: "explorer-ul", children: [ + /* @__PURE__ */ jsx20(ExplorerNode, { node: fileTree, opts, fileData }), + /* @__PURE__ */ jsx20("li", { id: "explorer-end" }) + ] }) }) + ] }); + } + __name(Explorer, "Explorer"); + Explorer.css = explorer_default; + Explorer.afterDOMLoaded = explorer_inline_default; + return Explorer; +}, "default"); + +// quartz/components/TagList.tsx +import { jsx as jsx21 } from "preact/jsx-runtime"; +function TagList({ fileData, displayClass }) { + const tags = fileData.frontmatter?.tags; + const baseDir = pathToRoot(fileData.slug); + if (tags && tags.length > 0) { + return /* @__PURE__ */ jsx21("ul", { class: `tags ${displayClass ?? ""}`, children: tags.map((tag) => { + const display = `#${tag}`; + const linkDest = baseDir + `/tags/${slugTag(tag)}`; + return /* @__PURE__ */ jsx21("li", { children: /* @__PURE__ */ jsx21("a", { href: linkDest, class: "internal tag-link", children: display }) }); + }) }); + } else { + return null; + } +} +__name(TagList, "TagList"); +TagList.css = ` +.tags { + list-style: none; + display: flex; + padding-left: 0; + gap: 0.4rem; + margin: 1rem 0; + flex-wrap: wrap; + justify-self: end; +} + +.section-li > .section > .tags { + justify-content: flex-end; +} + +.tags > li { + display: inline-block; + white-space: nowrap; + margin: 0; + overflow-wrap: normal; +} + +a.internal.tag-link { + border-radius: 8px; + background-color: var(--highlight); + padding: 0.2rem 0.4rem; + margin: 0 0.1rem; +} +`; +var TagList_default = /* @__PURE__ */ __name(() => TagList, "default"); + +// quartz/components/scripts/graph.inline.ts +var graph_inline_default = ""; + +// quartz/components/styles/graph.scss +var graph_default = ""; + +// quartz/components/Graph.tsx +import { jsx as jsx22, jsxs as jsxs12 } from "preact/jsx-runtime"; +var defaultOptions10 = { + localGraph: { + drag: true, + zoom: true, + depth: 1, + scale: 1.1, + repelForce: 0.5, + centerForce: 0.3, + linkDistance: 30, + fontSize: 0.6, + opacityScale: 1, + showTags: true, + removeTags: [] + }, + globalGraph: { + drag: true, + zoom: true, + depth: -1, + scale: 0.9, + repelForce: 0.5, + centerForce: 0.3, + linkDistance: 30, + fontSize: 0.6, + opacityScale: 1, + showTags: true, + removeTags: [] + } +}; +var Graph_default = /* @__PURE__ */ __name((opts) => { + function Graph({ displayClass }) { + const localGraph = { ...defaultOptions10.localGraph, ...opts?.localGraph }; + const globalGraph = { ...defaultOptions10.globalGraph, ...opts?.globalGraph }; + return /* @__PURE__ */ jsxs12("div", { class: `graph ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsx22("h3", { children: "Graph View" }), + /* @__PURE__ */ jsxs12("div", { class: "graph-outer", children: [ + /* @__PURE__ */ jsx22("div", { id: "graph-container", "data-cfg": JSON.stringify(localGraph) }), + /* @__PURE__ */ jsx22( + "svg", + { + version: "1.1", + id: "global-graph-icon", + xmlns: "http://www.w3.org/2000/svg", + xmlnsXlink: "http://www.w3.org/1999/xlink", + x: "0px", + y: "0px", + viewBox: "0 0 55 55", + fill: "currentColor", + xmlSpace: "preserve", + children: /* @__PURE__ */ jsx22( + "path", + { + d: "M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17\n s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4\n c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562\n C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829\n c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91\n v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4\n s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665\n C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2\n S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4\n s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2\n s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z" + } + ) + } + ) + ] }), + /* @__PURE__ */ jsx22("div", { id: "global-graph-outer", children: /* @__PURE__ */ jsx22("div", { id: "global-graph-container", "data-cfg": JSON.stringify(globalGraph) }) }) + ] }); + } + __name(Graph, "Graph"); + Graph.css = graph_default; + Graph.afterDOMLoaded = graph_inline_default; + return Graph; +}, "default"); + +// quartz/components/styles/backlinks.scss +var backlinks_default = ""; + +// quartz/components/Backlinks.tsx +import { jsx as jsx23, jsxs as jsxs13 } from "preact/jsx-runtime"; +function Backlinks({ fileData, allFiles, displayClass }) { + const slug2 = simplifySlug(fileData.slug); + const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug2)); + return /* @__PURE__ */ jsxs13("div", { class: `backlinks ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsx23("h3", { children: "Backlinks" }), + /* @__PURE__ */ jsx23("ul", { class: "overflow", children: backlinkFiles.length > 0 ? backlinkFiles.map((f) => /* @__PURE__ */ jsx23("li", { children: /* @__PURE__ */ jsx23("a", { href: resolveRelative(fileData.slug, f.slug), class: "internal", children: f.frontmatter?.title }) })) : /* @__PURE__ */ jsx23("li", { children: "No backlinks found" }) }) + ] }); +} +__name(Backlinks, "Backlinks"); +Backlinks.css = backlinks_default; +var Backlinks_default = /* @__PURE__ */ __name(() => Backlinks, "default"); + +// quartz/components/styles/search.scss +var search_default = ""; + +// quartz/components/scripts/search.inline.ts +var search_inline_default = ""; + +// quartz/components/Search.tsx +import { jsx as jsx24, jsxs as jsxs14 } from "preact/jsx-runtime"; +var Search_default = /* @__PURE__ */ __name(() => { + function Search({ displayClass }) { + return /* @__PURE__ */ jsxs14("div", { class: `search ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsxs14("div", { id: "search-icon", children: [ + /* @__PURE__ */ jsx24("p", { children: "Search" }), + /* @__PURE__ */ jsx24("div", {}), + /* @__PURE__ */ jsxs14( + "svg", + { + tabIndex: 0, + "aria-labelledby": "title desc", + role: "img", + xmlns: "http://www.w3.org/2000/svg", + viewBox: "0 0 19.9 19.7", + children: [ + /* @__PURE__ */ jsx24("title", { id: "title", children: "Search" }), + /* @__PURE__ */ jsx24("desc", { id: "desc", children: "Search" }), + /* @__PURE__ */ jsxs14("g", { class: "search-path", fill: "none", children: [ + /* @__PURE__ */ jsx24("path", { "stroke-linecap": "square", d: "M18.5 18.3l-5.4-5.4" }), + /* @__PURE__ */ jsx24("circle", { cx: "8", cy: "8", r: "7" }) + ] }) + ] + } + ) + ] }), + /* @__PURE__ */ jsx24("div", { id: "search-container", children: /* @__PURE__ */ jsxs14("div", { id: "search-space", children: [ + /* @__PURE__ */ jsx24( + "input", + { + autocomplete: "off", + id: "search-bar", + name: "search", + type: "text", + "aria-label": "Search for something", + placeholder: "Search for something" + } + ), + /* @__PURE__ */ jsx24("div", { id: "results-container" }) + ] }) }) + ] }); + } + __name(Search, "Search"); + Search.afterDOMLoaded = search_inline_default; + Search.css = search_default; + return Search; +}, "default"); + +// quartz/components/styles/footer.scss +var footer_default = ""; + +// package.json +var version = "4.1.0"; + +// quartz/components/Footer.tsx +import { jsx as jsx25, jsxs as jsxs15 } from "preact/jsx-runtime"; +var Footer_default = /* @__PURE__ */ __name((opts) => { + function Footer({ displayClass }) { + const year = (/* @__PURE__ */ new Date()).getFullYear(); + const links = opts?.links ?? []; + return /* @__PURE__ */ jsxs15("footer", { class: `${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsx25("hr", {}), + /* @__PURE__ */ jsxs15("p", { children: [ + "Created with ", + /* @__PURE__ */ jsxs15("a", { href: "https://quartz.jzhao.xyz/", children: [ + "Quartz v", + version + ] }), + ", \xA9 ", + year + ] }), + /* @__PURE__ */ jsx25("ul", { children: Object.entries(links).map(([text, link]) => /* @__PURE__ */ jsx25("li", { children: /* @__PURE__ */ jsx25("a", { href: link, children: text }) })) }) + ] }); + } + __name(Footer, "Footer"); + Footer.css = footer_default; + return Footer; +}, "default"); + +// quartz/components/DesktopOnly.tsx +import { Fragment as Fragment3, jsx as jsx26 } from "preact/jsx-runtime"; +var DesktopOnly_default = /* @__PURE__ */ __name((component) => { + if (component) { + let DesktopOnly2 = function(props) { + return /* @__PURE__ */ jsx26(Component, { displayClass: "desktop-only", ...props }); + }; + var DesktopOnly = DesktopOnly2; + __name(DesktopOnly2, "DesktopOnly"); + const Component = component; + DesktopOnly2.displayName = component.displayName; + DesktopOnly2.afterDOMLoaded = component?.afterDOMLoaded; + DesktopOnly2.beforeDOMLoaded = component?.beforeDOMLoaded; + DesktopOnly2.css = component?.css; + return DesktopOnly2; + } else { + return () => /* @__PURE__ */ jsx26(Fragment3, {}); + } +}, "default"); + +// quartz/components/MobileOnly.tsx +import { Fragment as Fragment4, jsx as jsx27 } from "preact/jsx-runtime"; +var MobileOnly_default = /* @__PURE__ */ __name((component) => { + if (component) { + let MobileOnly2 = function(props) { + return /* @__PURE__ */ jsx27(Component, { displayClass: "mobile-only", ...props }); + }; + var MobileOnly = MobileOnly2; + __name(MobileOnly2, "MobileOnly"); + const Component = component; + MobileOnly2.displayName = component.displayName; + MobileOnly2.afterDOMLoaded = component?.afterDOMLoaded; + MobileOnly2.beforeDOMLoaded = component?.beforeDOMLoaded; + MobileOnly2.css = component?.css; + return MobileOnly2; + } else { + return () => /* @__PURE__ */ jsx27(Fragment4, {}); + } +}, "default"); + +// quartz/components/styles/recentNotes.scss +var recentNotes_default = ""; + +// quartz/components/RecentNotes.tsx +import { jsx as jsx28, jsxs as jsxs16 } from "preact/jsx-runtime"; +var defaultOptions11 = /* @__PURE__ */ __name((cfg) => ({ + title: "Recent Notes", + limit: 3, + linkToMore: false, + filter: () => true, + sort: byDateAndAlphabetical(cfg), + showTags: false +}), "defaultOptions"); +var RecentNotes_default = /* @__PURE__ */ __name((userOpts) => { + function RecentNotes({ allFiles, fileData, displayClass, cfg }) { + const opts = { ...defaultOptions11(cfg), ...userOpts }; + const pages = allFiles.filter(opts.filter).sort(opts.sort); + const remaining = Math.max(0, pages.length - opts.limit); + return /* @__PURE__ */ jsxs16("div", { class: `recent-notes ${displayClass ?? ""}`, children: [ + /* @__PURE__ */ jsx28("h3", { children: opts.title }), + /* @__PURE__ */ jsx28("ul", { class: "recent-ul", children: pages.slice(0, opts.limit).map((page) => { + const title = page.frontmatter?.title; + const tags = page.frontmatter?.tags ?? []; + return /* @__PURE__ */ jsx28("li", { class: "recent-li", children: /* @__PURE__ */ jsxs16("div", { class: "section", children: [ + /* @__PURE__ */ jsx28("div", { class: "desc", children: /* @__PURE__ */ jsx28("h3", { children: /* @__PURE__ */ jsx28("a", { href: resolveRelative(fileData.slug, page.slug), class: "internal", children: title }) }) }), + page.dates && /* @__PURE__ */ jsx28("p", { class: "meta", children: /* @__PURE__ */ jsx28(Date2, { date: getDate(cfg, page) }) }), + opts.showTags && tags.length > 0 && // 根据 opts.showTags 决定是否渲染标签 + /* @__PURE__ */ jsx28("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ jsx28("li", { children: /* @__PURE__ */ jsxs16( + "a", + { + class: "internal tag-link", + href: resolveRelative(fileData.slug, `tags/${tag}`), + children: [ + "#", + tag + ] + } + ) })) }) + ] }) }); + }) }), + opts.linkToMore && remaining > 0 && /* @__PURE__ */ jsx28("p", { children: /* @__PURE__ */ jsxs16("a", { href: resolveRelative(fileData.slug, opts.linkToMore), children: [ + "See ", + remaining, + " more \u2192" + ] }) }) + ] }); + } + __name(RecentNotes, "RecentNotes"); + RecentNotes.css = recentNotes_default; + return RecentNotes; +}, "default"); + +// quartz/components/styles/breadcrumbs.scss +var breadcrumbs_default = ""; + +// quartz/components/Breadcrumbs.tsx +import { Fragment as Fragment5, jsx as jsx29, jsxs as jsxs17 } from "preact/jsx-runtime"; +var defaultOptions12 = { + spacerSymbol: ">", + rootName: "Home", + resolveFrontmatterTitle: false, + hideOnRoot: true +}; +function formatCrumb(displayName, baseSlug, currentSlug) { + return { + displayName: displayName.replaceAll("-", " "), + path: resolveRelative(baseSlug, currentSlug) + }; +} +__name(formatCrumb, "formatCrumb"); +function findCurrentFile(allFiles, folderName) { + return allFiles.find((file) => { + if (file.slug?.endsWith("index")) { + const folderParts = file.filePath?.split("/"); + if (folderParts) { + const name = folderParts[folderParts?.length - 2]; + if (name === folderName) { + return true; + } + } + } + }); +} +__name(findCurrentFile, "findCurrentFile"); +var Breadcrumbs_default = /* @__PURE__ */ __name((opts) => { + const options2 = { ...defaultOptions12, ...opts }; + function Breadcrumbs({ fileData, allFiles, displayClass }) { + if (options2.hideOnRoot && fileData.slug === "index") { + return /* @__PURE__ */ jsx29(Fragment5, {}); + } + const firstEntry = formatCrumb(options2.rootName, fileData.slug, "/"); + const crumbs = [firstEntry]; + const slugParts = fileData.slug?.split("/"); + if (slugParts) { + let currentPath = ""; + for (let i = 0; i < slugParts.length - 1; i++) { + let currentTitle = slugParts[i]; + if (options2?.resolveFrontmatterTitle) { + const currentFile = findCurrentFile(allFiles, currentTitle); + if (currentFile) { + currentTitle = currentFile.frontmatter.title; + } + } + currentPath += slugParts[i] + "/"; + const crumb = formatCrumb(currentTitle, fileData.slug, currentPath); + crumbs.push(crumb); + } + crumbs.push({ + displayName: fileData.frontmatter.title, + path: "" + }); + } + return /* @__PURE__ */ jsx29("nav", { class: `breadcrumb-container ${displayClass ?? ""}`, "aria-label": "breadcrumbs", children: crumbs.map((crumb, index) => /* @__PURE__ */ jsxs17("div", { class: "breadcrumb-element", children: [ + /* @__PURE__ */ jsx29("a", { href: crumb.path, children: crumb.displayName }), + index !== crumbs.length - 1 && /* @__PURE__ */ jsx29("p", { children: ` ${options2.spacerSymbol} ` }) + ] })) }); + } + __name(Breadcrumbs, "Breadcrumbs"); + Breadcrumbs.css = breadcrumbs_default; + return Breadcrumbs; +}, "default"); + +// quartz.layout.ts +var sharedPageComponents = { + head: Head_default(), + header: [], + footer: Footer_default({ + links: { + "Blog": "https://blog.7wate.com", + GitHub: "https://github.com/7wate" + } + }) +}; +var defaultContentPageLayout = { + beforeBody: [ + Breadcrumbs_default(), + ArticleTitle_default(), + ContentMeta_default(), + TagList_default() + ], + left: [ + PageTitle_default(), + MobileOnly_default(Spacer_default()), + Search_default(), + Darkmode_default(), + DesktopOnly_default(Explorer_default()), + DesktopOnly_default(RecentNotes_default( + { + filter: (data) => { + return data.filePath ? data.filePath.startsWith("content/Blog") : false; + } + } + )) + ], + right: [ + Graph_default(), + DesktopOnly_default(TableOfContents_default()), + Backlinks_default() + ] +}; +var defaultListPageLayout = { + beforeBody: [ArticleTitle_default()], + left: [ + PageTitle_default(), + MobileOnly_default(Spacer_default()), + Search_default(), + Darkmode_default() + ], + right: [] +}; + +// quartz/plugins/emitters/contentPage.tsx +import chalk3 from "chalk"; +var ContentPage = /* @__PURE__ */ __name((userOpts) => { + const opts = { + ...sharedPageComponents, + ...defaultContentPageLayout, + pageBody: Content_default(), + ...userOpts + }; + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts; + const Header2 = Header_default(); + const Body2 = Body_default(); + return { + name: "ContentPage", + getQuartzComponents() { + return [Head, Header2, Body2, ...header, ...beforeBody, pageBody, ...left, ...right, Footer]; + }, + async emit(ctx, content, resources, emit) { + const cfg = ctx.cfg.configuration; + const fps = []; + const allFiles = content.map((c) => c[1].data); + let containsIndex = false; + for (const [tree, file] of content) { + const slug2 = file.data.slug; + if (slug2 === "index") { + containsIndex = true; + } + const externalResources = pageResources(pathToRoot(slug2), resources); + const componentData = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles + }; + const content2 = renderPage(slug2, componentData, opts, externalResources); + const fp = await emit({ + content: content2, + slug: slug2, + ext: ".html" + }); + fps.push(fp); + } + if (!containsIndex) { + console.log( + chalk3.yellow( + ` +Warning: you seem to be missing an \`index.md\` home page file at the root of your \`${ctx.argv.directory}\` folder. This may cause errors when deploying.` + ) + ); + } + return fps; + } + }; +}, "ContentPage"); + +// quartz/plugins/vfile.ts +import { VFile } from "vfile"; +function defaultProcessedContent(vfileData) { + const root = { type: "root", children: [] }; + const vfile = new VFile(""); + vfile.data = vfileData; + return [root, vfile]; +} +__name(defaultProcessedContent, "defaultProcessedContent"); + +// quartz/plugins/emitters/tagPage.tsx +var TagPage = /* @__PURE__ */ __name((userOpts) => { + const opts = { + ...sharedPageComponents, + ...defaultListPageLayout, + pageBody: TagContent_default(), + ...userOpts + }; + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts; + const Header2 = Header_default(); + const Body2 = Body_default(); + return { + name: "TagPage", + getQuartzComponents() { + return [Head, Header2, Body2, ...header, ...beforeBody, pageBody, ...left, ...right, Footer]; + }, + async emit(ctx, content, resources, emit) { + const fps = []; + const allFiles = content.map((c) => c[1].data); + const cfg = ctx.cfg.configuration; + const tags = new Set( + allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes) + ); + tags.add("index"); + const tagDescriptions = Object.fromEntries( + [...tags].map((tag) => { + const title = tag === "" ? "Tag Index" : `Tag: #${tag}`; + return [ + tag, + defaultProcessedContent({ + slug: joinSegments("tags", tag), + frontmatter: { title, tags: [] } + }) + ]; + }) + ); + for (const [tree, file] of content) { + const slug2 = file.data.slug; + if (slug2.startsWith("tags/")) { + const tag = slug2.slice("tags/".length); + if (tags.has(tag)) { + tagDescriptions[tag] = [tree, file]; + } + } + } + for (const tag of tags) { + const slug2 = joinSegments("tags", tag); + const externalResources = pageResources(pathToRoot(slug2), resources); + const [tree, file] = tagDescriptions[tag]; + const componentData = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles + }; + const content2 = renderPage(slug2, componentData, opts, externalResources); + const fp = await emit({ + content: content2, + slug: file.data.slug, + ext: ".html" + }); + fps.push(fp); + } + return fps; + } + }; +}, "TagPage"); + +// quartz/plugins/emitters/folderPage.tsx +import path5 from "path"; +var FolderPage = /* @__PURE__ */ __name((userOpts) => { + const opts = { + ...sharedPageComponents, + ...defaultListPageLayout, + pageBody: FolderContent_default(), + ...userOpts + }; + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts; + const Header2 = Header_default(); + const Body2 = Body_default(); + return { + name: "FolderPage", + getQuartzComponents() { + return [Head, Header2, Body2, ...header, ...beforeBody, pageBody, ...left, ...right, Footer]; + }, + async emit(ctx, content, resources, emit) { + const fps = []; + const allFiles = content.map((c) => c[1].data); + const cfg = ctx.cfg.configuration; + const folders = new Set( + allFiles.flatMap((data) => { + const slug2 = data.slug; + const folderName = path5.dirname(slug2 ?? ""); + if (slug2 && folderName !== "." && folderName !== "tags") { + return [folderName]; + } + return []; + }) + ); + const folderDescriptions = Object.fromEntries( + [...folders].map((folder) => [ + folder, + defaultProcessedContent({ + slug: joinSegments(folder, "index"), + frontmatter: { title: `Folder: ${folder}`, tags: [] } + }) + ]) + ); + for (const [tree, file] of content) { + const slug2 = _stripSlashes(simplifySlug(file.data.slug)); + if (folders.has(slug2)) { + folderDescriptions[slug2] = [tree, file]; + } + } + for (const folder of folders) { + const slug2 = joinSegments(folder, "index"); + const externalResources = pageResources(pathToRoot(slug2), resources); + const [tree, file] = folderDescriptions[folder]; + const componentData = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles + }; + const content2 = renderPage(slug2, componentData, opts, externalResources); + const fp = await emit({ + content: content2, + slug: slug2, + ext: ".html" + }); + fps.push(fp); + } + return fps; + } + }; +}, "FolderPage"); + +// quartz/plugins/emitters/contentIndex.ts +import { toHtml as toHtml2 } from "hast-util-to-html"; +import path6 from "path"; +var defaultOptions13 = { + enableSiteMap: true, + enableRSS: true, + rssLimit: 10, + rssFullHtml: false, + includeEmptyFiles: true +}; +function generateSiteMap(cfg, idx) { + const base = cfg.baseUrl ?? ""; + const createURLEntry = /* @__PURE__ */ __name((slug2, content) => ` + https://${base}/${encodeURI(slug2)} + ${content.date?.toISOString()} + `, "createURLEntry"); + const urls = Array.from(idx).map(([slug2, content]) => createURLEntry(simplifySlug(slug2), content)).join(""); + return `${urls}`; +} +__name(generateSiteMap, "generateSiteMap"); +function generateRSSFeed(cfg, idx, limit) { + const base = cfg.baseUrl ?? ""; + const root = `https://${base}`; + const createURLEntry = /* @__PURE__ */ __name((slug2, content) => ` + ${escapeHTML(content.title)} + ${root}/${encodeURI(slug2)} + ${root}/${encodeURI(slug2)} + ${content.richContent ?? content.description} + ${content.date?.toUTCString()} + `, "createURLEntry"); + const items = Array.from(idx).map(([slug2, content]) => createURLEntry(simplifySlug(slug2), content)).slice(0, limit ?? idx.size).join(""); + return ` + + + ${escapeHTML(cfg.pageTitle)} + ${root} + ${!!limit ? `Last ${limit} notes` : "Recent notes"} on ${escapeHTML( + cfg.pageTitle + )} + Quartz -- quartz.jzhao.xyz + ${items} + + `; +} +__name(generateRSSFeed, "generateRSSFeed"); +var ContentIndex = /* @__PURE__ */ __name((opts) => { + opts = { ...defaultOptions13, ...opts }; + return { + name: "ContentIndex", + async emit(ctx, content, _resources, emit) { + const cfg = ctx.cfg.configuration; + const emitted = []; + const linkIndex = /* @__PURE__ */ new Map(); + for (const [tree, file] of content) { + const slug2 = file.data.slug; + const date = getDate(ctx.cfg.configuration, file.data) ?? /* @__PURE__ */ new Date(); + if (opts?.includeEmptyFiles || file.data.text && file.data.text !== "") { + linkIndex.set(slug2, { + title: file.data.frontmatter?.title, + links: file.data.links ?? [], + tags: file.data.frontmatter?.tags ?? [], + content: file.data.text ?? "", + richContent: opts?.rssFullHtml ? escapeHTML(toHtml2(tree, { allowDangerousHtml: true })) : void 0, + date, + description: file.data.description ?? "" + }); + } + } + if (opts?.enableSiteMap) { + emitted.push( + await emit({ + content: generateSiteMap(cfg, linkIndex), + slug: "sitemap", + ext: ".xml" + }) + ); + } + if (opts?.enableRSS) { + emitted.push( + await emit({ + content: generateRSSFeed(cfg, linkIndex, opts.rssLimit), + slug: "index", + ext: ".xml" + }) + ); + } + const fp = path6.join("static", "contentIndex"); + const simplifiedIndex = Object.fromEntries( + Array.from(linkIndex).map(([slug2, content2]) => { + delete content2.description; + delete content2.date; + return [slug2, content2]; + }) + ); + emitted.push( + await emit({ + content: JSON.stringify(simplifiedIndex), + slug: fp, + ext: ".json" + }) + ); + return emitted; + }, + getQuartzComponents: () => [] + }; +}, "ContentIndex"); + +// quartz/plugins/emitters/aliases.ts +import path7 from "path"; +var AliasRedirects = /* @__PURE__ */ __name(() => ({ + name: "AliasRedirects", + getQuartzComponents() { + return []; + }, + async emit({ argv }, content, _resources, emit) { + const fps = []; + for (const [_tree, file] of content) { + const ogSlug = simplifySlug(file.data.slug); + const dir = path7.posix.relative(argv.directory, path7.dirname(file.data.filePath)); + let aliases = file.data.frontmatter?.aliases ?? file.data.frontmatter?.alias ?? []; + if (typeof aliases === "string") { + aliases = [aliases]; + } + const slugs = aliases.map((alias) => path7.posix.join(dir, alias)); + const permalink = file.data.frontmatter?.permalink; + if (typeof permalink === "string") { + slugs.push(permalink); + } + for (const slug2 of slugs) { + const redirUrl = resolveRelative(slug2, file.data.slug); + const fp = await emit({ + content: ` + + + + ${ogSlug} + + + + + + + `, + slug: slug2, + ext: ".html" + }); + fps.push(fp); + } + } + return fps; + } +}), "AliasRedirects"); + +// quartz/plugins/emitters/assets.ts +import path9 from "path"; +import fs2 from "fs"; + +// quartz/util/glob.ts +import path8 from "path"; +import { globby } from "globby"; +function toPosixPath(fp) { + return fp.split(path8.sep).join("/"); +} +__name(toPosixPath, "toPosixPath"); +async function glob(pattern, cwd, ignorePatterns) { + const fps = (await globby(pattern, { + cwd, + ignore: ignorePatterns, + gitignore: true + })).map(toPosixPath); + return fps; +} +__name(glob, "glob"); + +// quartz/plugins/emitters/assets.ts +var Assets = /* @__PURE__ */ __name(() => { + return { + name: "Assets", + getQuartzComponents() { + return []; + }, + async emit({ argv, cfg }, _content, _resources, _emit) { + const assetsPath = argv.output; + const fps = await glob("**", argv.directory, ["**/*.md", ...cfg.configuration.ignorePatterns]); + const res = []; + for (const fp of fps) { + const ext = path9.extname(fp); + const src = joinSegments(argv.directory, fp); + const name = slugifyFilePath(fp, true) + ext; + const dest = joinSegments(assetsPath, name); + const dir = path9.dirname(dest); + await fs2.promises.mkdir(dir, { recursive: true }); + await fs2.promises.copyFile(src, dest); + res.push(dest); + } + return res; + } + }; +}, "Assets"); + +// quartz/plugins/emitters/static.ts +import fs3 from "fs"; +var Static = /* @__PURE__ */ __name(() => ({ + name: "Static", + getQuartzComponents() { + return []; + }, + async emit({ argv, cfg }, _content, _resources, _emit) { + const staticPath = joinSegments(QUARTZ, "static"); + const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns); + await fs3.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true }); + return fps.map((fp) => joinSegments(argv.output, "static", fp)); + } +}), "Static"); + +// quartz/components/scripts/spa.inline.ts +var spa_inline_default = ""; + +// quartz/components/scripts/plausible.inline.ts +var plausible_inline_default = ""; + +// quartz/components/scripts/popover.inline.ts +var popover_inline_default = ""; + +// quartz/styles/custom.scss +var custom_default = ""; + +// quartz/components/styles/popover.scss +var popover_default = ""; + +// quartz/util/theme.ts +var DEFAULT_SANS_SERIF = '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif'; +var DEFAULT_MONO = "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace"; +function googleFontHref(theme) { + const { code, header, body } = theme.typography; + return `https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap`; +} +__name(googleFontHref, "googleFontHref"); +function joinStyles(theme, ...stylesheet) { + return ` +${stylesheet.join("\n\n")} + +:root { + --light: ${theme.colors.lightMode.light}; + --lightgray: ${theme.colors.lightMode.lightgray}; + --gray: ${theme.colors.lightMode.gray}; + --darkgray: ${theme.colors.lightMode.darkgray}; + --dark: ${theme.colors.lightMode.dark}; + --secondary: ${theme.colors.lightMode.secondary}; + --tertiary: ${theme.colors.lightMode.tertiary}; + --highlight: ${theme.colors.lightMode.highlight}; + + --headerFont: "${theme.typography.header}", ${DEFAULT_SANS_SERIF}; + --bodyFont: "${theme.typography.body}", ${DEFAULT_SANS_SERIF}; + --codeFont: "${theme.typography.code}", ${DEFAULT_MONO}; +} + +:root[saved-theme="dark"] { + --light: ${theme.colors.darkMode.light}; + --lightgray: ${theme.colors.darkMode.lightgray}; + --gray: ${theme.colors.darkMode.gray}; + --darkgray: ${theme.colors.darkMode.darkgray}; + --dark: ${theme.colors.darkMode.dark}; + --secondary: ${theme.colors.darkMode.secondary}; + --tertiary: ${theme.colors.darkMode.tertiary}; + --highlight: ${theme.colors.darkMode.highlight}; +} +`; +} +__name(joinStyles, "joinStyles"); + +// quartz/plugins/emitters/componentResources.ts +import { Features, transform } from "lightningcss"; +function getComponentResources(ctx) { + const allComponents = /* @__PURE__ */ new Set(); + for (const emitter of ctx.cfg.plugins.emitters) { + const components = emitter.getQuartzComponents(ctx); + for (const component of components) { + allComponents.add(component); + } + } + const componentResources = { + css: /* @__PURE__ */ new Set(), + beforeDOMLoaded: /* @__PURE__ */ new Set(), + afterDOMLoaded: /* @__PURE__ */ new Set() + }; + for (const component of allComponents) { + const { css, beforeDOMLoaded, afterDOMLoaded } = component; + if (css) { + componentResources.css.add(css); + } + if (beforeDOMLoaded) { + componentResources.beforeDOMLoaded.add(beforeDOMLoaded); + } + if (afterDOMLoaded) { + componentResources.afterDOMLoaded.add(afterDOMLoaded); + } + } + return { + css: [...componentResources.css], + beforeDOMLoaded: [...componentResources.beforeDOMLoaded], + afterDOMLoaded: [...componentResources.afterDOMLoaded] + }; +} +__name(getComponentResources, "getComponentResources"); +function joinScripts(scripts) { + return scripts.map((script) => `(function () {${script}})();`).join("\n"); +} +__name(joinScripts, "joinScripts"); +function addGlobalPageResources(ctx, staticResources, componentResources) { + const cfg = ctx.cfg.configuration; + const reloadScript = ctx.argv.serve; + if (cfg.enablePopovers) { + componentResources.afterDOMLoaded.push(popover_inline_default); + componentResources.css.push(popover_default); + } + if (cfg.analytics?.provider === "google") { + const tagId = cfg.analytics.tagId; + staticResources.js.push({ + src: `https://www.googletagmanager.com/gtag/js?id=${tagId}`, + contentType: "external", + loadTime: "afterDOMReady" + }); + componentResources.afterDOMLoaded.push(` + window.dataLayer = window.dataLayer || []; + function gtag() { dataLayer.push(arguments); } + gtag(\`js\`, new Date()); + gtag(\`config\`, \`${tagId}\`, { send_page_view: false }); + + document.addEventListener(\`nav\`, () => { + gtag(\`event\`, \`page_view\`, { + page_title: document.title, + page_location: location.href, + }); + });`); + } else if (cfg.analytics?.provider === "plausible") { + componentResources.afterDOMLoaded.push(plausible_inline_default); + } else if (cfg.analytics?.provider === "umami") { + componentResources.afterDOMLoaded.push(` + const umamiScript = document.createElement("script") + umamiScript.src = "https://analytics.umami.is/script.js" + umamiScript.setAttribute("data-website-id", "${cfg.analytics.websiteId}") + umamiScript.async = true + + document.head.appendChild(umamiScript) + `); + } + if (cfg.enableSPA) { + componentResources.afterDOMLoaded.push(spa_inline_default); + } else { + componentResources.afterDOMLoaded.push(` + window.spaNavigate = (url, _) => window.location.assign(url) + const event = new CustomEvent("nav", { detail: { url: document.body.dataset.slug } }) + document.dispatchEvent(event)`); + } + let wsUrl = `ws://localhost:${ctx.argv.wsPort}`; + if (ctx.argv.remoteDevHost) { + wsUrl = `wss://${ctx.argv.remoteDevHost}:${ctx.argv.wsPort}`; + } + if (reloadScript) { + staticResources.js.push({ + loadTime: "afterDOMReady", + contentType: "inline", + script: ` + const socket = new WebSocket('${wsUrl}') + socket.addEventListener('message', () => document.location.reload()) + ` + }); + } +} +__name(addGlobalPageResources, "addGlobalPageResources"); +var defaultOptions14 = { + fontOrigin: "googleFonts" +}; +var ComponentResources = /* @__PURE__ */ __name((opts) => { + const { fontOrigin } = { ...defaultOptions14, ...opts }; + return { + name: "ComponentResources", + getQuartzComponents() { + return []; + }, + async emit(ctx, _content, resources, emit) { + const componentResources = getComponentResources(ctx); + if (fontOrigin === "googleFonts") { + resources.css.push(googleFontHref(ctx.cfg.configuration.theme)); + } else if (fontOrigin === "local") { + } + addGlobalPageResources(ctx, resources, componentResources); + const stylesheet = joinStyles(ctx.cfg.configuration.theme, ...componentResources.css, custom_default); + const prescript = joinScripts(componentResources.beforeDOMLoaded); + const postscript = joinScripts(componentResources.afterDOMLoaded); + const fps = await Promise.all([ + emit({ + slug: "index", + ext: ".css", + content: transform({ + filename: "index.css", + code: Buffer.from(stylesheet), + minify: true, + targets: { + safari: 15 << 16 | 6 << 8, + // 15.6 + ios_saf: 15 << 16 | 6 << 8, + // 15.6 + edge: 115 << 16, + firefox: 102 << 16, + chrome: 109 << 16 + }, + include: Features.MediaQueries + }).code.toString() + }), + emit({ + slug: "prescript", + ext: ".js", + content: prescript + }), + emit({ + slug: "postscript", + ext: ".js", + content: postscript + }) + ]); + return fps; + } + }; +}, "ComponentResources"); + +// quartz/plugins/emitters/404.tsx +var NotFoundPage = /* @__PURE__ */ __name(() => { + const opts = { + ...sharedPageComponents, + pageBody: __default(), + beforeBody: [], + left: [], + right: [] + }; + const { head: Head, pageBody, footer: Footer } = opts; + const Body2 = Body_default(); + return { + name: "404Page", + getQuartzComponents() { + return [Head, Body2, pageBody, Footer]; + }, + async emit(ctx, _content, resources, emit) { + const cfg = ctx.cfg.configuration; + const slug2 = "404"; + const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`); + const path11 = url.pathname; + const externalResources = pageResources(path11, resources); + const [tree, vfile] = defaultProcessedContent({ + slug: slug2, + text: "Not Found", + description: "Not Found", + frontmatter: { title: "Not Found", tags: [] } + }); + const componentData = { + fileData: vfile.data, + externalResources, + cfg, + children: [], + tree, + allFiles: [] + }; + return [ + await emit({ + content: renderPage(slug2, componentData, opts, externalResources), + slug: slug2, + ext: ".html" + }) + ]; + } + }; +}, "NotFoundPage"); + +// quartz.config.ts +var config = { + configuration: { + pageTitle: "\u{1F4DA} X\xB7Eden", + enableSPA: true, + enablePopovers: true, + analytics: null, + baseUrl: "wiki.7wate.com", + ignorePatterns: ["private", "Templates", ".obsidian", "Canvas", "Static"], + defaultDateType: "created", + theme: { + typography: { + header: "Schibsted Grotesk", + body: "Source Sans Pro", + code: "IBM Plex Mono" + }, + colors: { + lightMode: { + light: "#faf8f8", + lightgray: "#e5e5e5", + gray: "#b8b8b8", + darkgray: "#4e4e4e", + dark: "#2b2b2b", + secondary: "#284b63", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)" + }, + darkMode: { + light: "#161618", + lightgray: "#393639", + gray: "#646464", + darkgray: "#d4d4d4", + dark: "#ebebec", + secondary: "#7b97aa", + tertiary: "#84a59d", + highlight: "rgba(143, 159, 169, 0.15)" + } + } + } + }, + plugins: { + transformers: [ + FrontMatter(), + TableOfContents(), + CreatedModifiedDate({ + priority: ["frontmatter", "filesystem"] + // you can add 'git' here for last modified from Git but this makes the build slower + }), + SyntaxHighlighting(), + ObsidianFlavoredMarkdown({ enableInHtmlEmbed: false }), + GitHubFlavoredMarkdown(), + CrawlLinks({ markdownLinkResolution: "shortest" }), + Latex({ renderEngine: "katex" }), + Description() + ], + filters: [RemoveDrafts()], + emitters: [ + AliasRedirects(), + ComponentResources({ fontOrigin: "googleFonts" }), + ContentPage(), + FolderPage(), + TagPage(), + ContentIndex({ + enableSiteMap: true, + enableRSS: true + }), + Assets(), + Static(), + NotFoundPage() + ] + } +}; +var quartz_config_default = config; + +// quartz/processors/parse.ts +import esbuild from "esbuild"; +import remarkParse from "remark-parse"; +import remarkRehype from "remark-rehype"; +import { unified } from "unified"; + +// quartz/util/perf.ts +import chalk4 from "chalk"; +import pretty from "pretty-time"; +var PerfTimer = class { + static { + __name(this, "PerfTimer"); + } + evts; + constructor() { + this.evts = {}; + this.addEvent("start"); + } + addEvent(evtName) { + this.evts[evtName] = process.hrtime(); + } + timeSince(evtName) { + return chalk4.yellow(pretty(process.hrtime(this.evts[evtName ?? "start"]))); + } +}; + +// quartz/processors/parse.ts +import { read } from "to-vfile"; +import path10 from "path"; +import workerpool, { Promise as WorkerPromise } from "workerpool"; + +// quartz/util/log.ts +import { Spinner } from "cli-spinner"; + +// quartz/processors/parse.ts +function createProcessor(ctx) { + const transformers = ctx.cfg.plugins.transformers; + let processor = unified().use(remarkParse); + for (const plugin of transformers.filter((p) => p.markdownPlugins)) { + processor = processor.use(plugin.markdownPlugins(ctx)); + } + processor = processor.use(remarkRehype, { allowDangerousHtml: true }); + for (const plugin of transformers.filter((p) => p.htmlPlugins)) { + processor = processor.use(plugin.htmlPlugins(ctx)); + } + return processor; +} +__name(createProcessor, "createProcessor"); +function createFileParser(ctx, fps) { + const { argv, cfg } = ctx; + return async (processor) => { + const res = []; + for (const fp of fps) { + try { + const perf = new PerfTimer(); + const file = await read(fp); + file.value = file.value.toString().trim(); + for (const plugin of cfg.plugins.transformers.filter((p) => p.textTransform)) { + file.value = plugin.textTransform(ctx, file.value); + } + file.data.slug = slugifyFilePath(path10.posix.relative(argv.directory, file.path)); + file.data.filePath = fp; + const ast = processor.parse(file); + const newAst = await processor.run(ast, file); + res.push([newAst, file]); + if (argv.verbose) { + console.log(`[process] ${fp} -> ${file.data.slug} (${perf.timeSince()})`); + } + } catch (err) { + trace(` +Failed to process \`${fp}\``, err); + } + } + return res; + }; +} +__name(createFileParser, "createFileParser"); + +// quartz/util/sourcemap.ts +import fs4 from "fs"; +import { fileURLToPath } from "url"; +var options = { + // source map hack to get around query param + // import cache busting + retrieveSourceMap(source) { + if (source.includes(".quartz-cache")) { + let realSource = fileURLToPath(source.split("?", 2)[0] + ".map"); + return { + map: fs4.readFileSync(realSource, "utf8") + }; + } else { + return null; + } + } +}; + +// quartz/worker.ts +sourceMapSupport.install(options); +async function parseFiles(argv, fps, allSlugs) { + const ctx = { + cfg: quartz_config_default, + argv, + allSlugs + }; + const processor = createProcessor(ctx); + const parse = createFileParser(ctx, fps); + return parse(processor); +} +__name(parseFiles, "parseFiles"); +export { + parseFiles +}; +//# sourceMappingURL=transpiled-worker.mjs.map diff --git a/quartz/.quartz-cache/transpiled-worker.mjs.map b/quartz/.quartz-cache/transpiled-worker.mjs.map new file mode 100644 index 0000000..8336443 --- /dev/null +++ b/quartz/.quartz-cache/transpiled-worker.mjs.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "sources": ["../worker.ts", "../plugins/transformers/frontmatter.ts", "../util/path.ts", "../plugins/transformers/gfm.ts", "../plugins/transformers/lastmod.ts", "../plugins/transformers/latex.ts", "../plugins/transformers/description.ts", "../util/escape.ts", "../plugins/transformers/links.ts", "../plugins/transformers/ofm.ts", "../components/scripts/callout.inline.ts", "../util/lang.ts", "../plugins/transformers/oxhugofm.ts", "../plugins/transformers/syntax.ts", "../plugins/transformers/toc.ts", "../plugins/transformers/linebreaks.ts", "../plugins/filters/draft.ts", "../components/Header.tsx", "../components/scripts/clipboard.inline.ts", "../components/styles/clipboard.scss", "../components/Body.tsx", "../components/renderPage.tsx", "../util/resources.tsx", "../util/jsx.ts", "../util/trace.ts", "../components/pages/Content.tsx", "../components/styles/listPage.scss", "../components/Date.tsx", "../components/PageList.tsx", "../components/pages/TagContent.tsx", "../components/pages/FolderContent.tsx", "../components/pages/404.tsx", "../components/ArticleTitle.tsx", "../components/scripts/darkmode.inline.ts", "../components/styles/darkmode.scss", "../components/Darkmode.tsx", "../components/Head.tsx", "../components/PageTitle.tsx", "../components/ContentMeta.tsx", "../components/Spacer.tsx", "../components/styles/legacyToc.scss", "../components/styles/toc.scss", "../components/scripts/toc.inline.ts", "../components/TableOfContents.tsx", "../components/styles/explorer.scss", "../components/scripts/explorer.inline.ts", "../components/ExplorerNode.tsx", "../components/Explorer.tsx", "../components/TagList.tsx", "../components/scripts/graph.inline.ts", "../components/styles/graph.scss", "../components/Graph.tsx", "../components/styles/backlinks.scss", "../components/Backlinks.tsx", "../components/styles/search.scss", "../components/scripts/search.inline.ts", "../components/Search.tsx", "../components/styles/footer.scss", "../../package.json", "../components/Footer.tsx", "../components/DesktopOnly.tsx", "../components/MobileOnly.tsx", "../components/styles/recentNotes.scss", "../components/RecentNotes.tsx", "../components/styles/breadcrumbs.scss", "../components/Breadcrumbs.tsx", "../../quartz.layout.ts", "../plugins/emitters/contentPage.tsx", "../plugins/vfile.ts", "../plugins/emitters/tagPage.tsx", "../plugins/emitters/folderPage.tsx", "../plugins/emitters/contentIndex.ts", "../plugins/emitters/aliases.ts", "../plugins/emitters/assets.ts", "../util/glob.ts", "../plugins/emitters/static.ts", "../components/scripts/spa.inline.ts", "../components/scripts/plausible.inline.ts", "../components/scripts/popover.inline.ts", "../styles/custom.scss", "../components/styles/popover.scss", "../util/theme.ts", "../plugins/emitters/componentResources.ts", "../plugins/emitters/404.tsx", "../../quartz.config.ts", "../processors/parse.ts", "../util/perf.ts", "../util/log.ts", "../util/sourcemap.ts"], + "mappings": "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", + "names": ["slug", "targetSlug", "defaultOptions", "defaultOptions", "defaultOptions", "path", "defaultOptions", "path", "slugAnchor", "visit", "path", "defaultOptions", "visit", "slugAnchor", "path", "url", "visit", "toString", "defaultOptions", "slugAnchor", "visit", "toString", "jsx", "jsx", "visit", "jsx", "slug", "pageResources", "visit", "Content", "Header", "Body", "jsx", "jsxs", "chalk", "process", "chalk", "process", "jsx", "jsxs", "jsx", "Fragment", "jsx", "Date", "jsx", "jsxs", "Date", "jsx", "jsxs", "slug", "tag", "content", "path", "jsx", "jsxs", "path", "jsx", "jsxs", "jsx", "jsx", "jsxs", "jsx", "jsxs", "path", "jsx", "jsx", "jsx", "jsx", "jsxs", "defaultOptions", "TableOfContents", "jsx", "jsxs", "jsx", "jsxs", "defaultOptions", "jsx", "jsx", "jsxs", "defaultOptions", "jsx", "jsxs", "slug", "jsx", "jsxs", "jsx", "jsxs", "Fragment", "jsx", "DesktopOnly", "Fragment", "jsx", "MobileOnly", "jsx", "jsxs", "defaultOptions", "Date", "Fragment", "jsx", "jsxs", "defaultOptions", "options", "chalk", "Header", "Body", "slug", "content", "chalk", "Header", "Body", "slug", "content", "path", "Header", "Body", "slug", "path", "content", "toHtml", "path", "defaultOptions", "slug", "toHtml", "path", "content", "path", "path", "slug", "path", "fs", "path", "path", "path", "fs", "fs", "fs", "defaultOptions", "Body", "slug", "path", "chalk", "chalk", "path", "path", "fs"] +} diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs new file mode 100755 index 0000000..35d06af --- /dev/null +++ b/quartz/bootstrap-cli.mjs @@ -0,0 +1,41 @@ +#!/usr/bin/env node +import yargs from "yargs" +import { hideBin } from "yargs/helpers" +import { + handleBuild, + handleCreate, + handleUpdate, + handleRestore, + handleSync, +} from "./cli/handlers.js" +import { CommonArgv, BuildArgv, CreateArgv, SyncArgv } from "./cli/args.js" +import { version } from "./cli/constants.js" + +yargs(hideBin(process.argv)) + .scriptName("quartz") + .version(version) + .usage("$0 [args]") + .command("create", "Initialize Quartz", CreateArgv, async (argv) => { + await handleCreate(argv) + }) + .command("update", "Get the latest Quartz updates", CommonArgv, async (argv) => { + await handleUpdate(argv) + }) + .command( + "restore", + "Try to restore your content folder from the cache", + CommonArgv, + async (argv) => { + await handleRestore(argv) + }, + ) + .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => { + await handleSync(argv) + }) + .command("build", "Build Quartz into a bundle of static HTML files", BuildArgv, async (argv) => { + await handleBuild(argv) + }) + .showHelpOnFail(false) + .help() + .strict() + .demandCommand().argv diff --git a/quartz/bootstrap-worker.mjs b/quartz/bootstrap-worker.mjs new file mode 100644 index 0000000..b08689c --- /dev/null +++ b/quartz/bootstrap-worker.mjs @@ -0,0 +1,7 @@ +#!/usr/bin/env node +import workerpool from "workerpool" +const cacheFile = "./.quartz-cache/transpiled-worker.mjs" +const { parseFiles } = await import(cacheFile) +workerpool.worker({ + parseFiles, +}) diff --git a/quartz/build.ts b/quartz/build.ts new file mode 100644 index 0000000..5752caa --- /dev/null +++ b/quartz/build.ts @@ -0,0 +1,183 @@ +import sourceMapSupport from "source-map-support" +sourceMapSupport.install(options) +import path from "path" +import { PerfTimer } from "./util/perf" +import { rimraf } from "rimraf" +import { isGitIgnored } from "globby" +import chalk from "chalk" +import { parseMarkdown } from "./processors/parse" +import { filterContent } from "./processors/filter" +import { emitContent } from "./processors/emit" +import cfg from "../quartz.config" +import { FilePath, joinSegments, slugifyFilePath } from "./util/path" +import chokidar from "chokidar" +import { ProcessedContent } from "./plugins/vfile" +import { Argv, BuildCtx } from "./util/ctx" +import { glob, toPosixPath } from "./util/glob" +import { trace } from "./util/trace" +import { options } from "./util/sourcemap" +import { Mutex } from "async-mutex" + +async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) { + const ctx: BuildCtx = { + argv, + cfg, + allSlugs: [], + } + + const perf = new PerfTimer() + const output = argv.output + + const pluginCount = Object.values(cfg.plugins).flat().length + const pluginNames = (key: "transformers" | "filters" | "emitters") => + cfg.plugins[key].map((plugin) => plugin.name) + if (argv.verbose) { + console.log(`Loaded ${pluginCount} plugins`) + console.log(` Transformers: ${pluginNames("transformers").join(", ")}`) + console.log(` Filters: ${pluginNames("filters").join(", ")}`) + console.log(` Emitters: ${pluginNames("emitters").join(", ")}`) + } + + const release = await mut.acquire() + perf.addEvent("clean") + await rimraf(output) + console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) + + perf.addEvent("glob") + const allFiles = await glob("**/*.*", argv.directory, cfg.configuration.ignorePatterns) + const fps = allFiles.filter((fp) => fp.endsWith(".md")).sort() + console.log( + `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, + ) + + const filePaths = fps.map((fp) => joinSegments(argv.directory, fp) as FilePath) + ctx.allSlugs = allFiles.map((fp) => slugifyFilePath(fp as FilePath)) + + const parsedFiles = await parseMarkdown(ctx, filePaths) + const filteredContent = filterContent(ctx, parsedFiles) + await emitContent(ctx, filteredContent) + console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)) + release() + + if (argv.serve) { + return startServing(ctx, mut, parsedFiles, clientRefresh) + } +} + +// setup watcher for rebuilds +async function startServing( + ctx: BuildCtx, + mut: Mutex, + initialContent: ProcessedContent[], + clientRefresh: () => void, +) { + const { argv } = ctx + + const ignored = await isGitIgnored() + const contentMap = new Map() + for (const content of initialContent) { + const [_tree, vfile] = content + contentMap.set(vfile.data.filePath!, content) + } + + const initialSlugs = ctx.allSlugs + let lastBuildMs = 0 + const toRebuild: Set = new Set() + const toRemove: Set = new Set() + const trackedAssets: Set = new Set() + async function rebuild(fp: string, action: "add" | "change" | "delete") { + // don't do anything for gitignored files + if (ignored(fp)) { + return + } + + // dont bother rebuilding for non-content files, just track and refresh + fp = toPosixPath(fp) + const filePath = joinSegments(argv.directory, fp) as FilePath + if (path.extname(fp) !== ".md") { + if (action === "add" || action === "change") { + trackedAssets.add(filePath) + } else if (action === "delete") { + trackedAssets.delete(filePath) + } + clientRefresh() + return + } + + if (action === "add" || action === "change") { + toRebuild.add(filePath) + } else if (action === "delete") { + toRemove.add(filePath) + } + + // debounce rebuilds every 250ms + + const buildStart = new Date().getTime() + lastBuildMs = buildStart + const release = await mut.acquire() + if (lastBuildMs > buildStart) { + release() + return + } + + const perf = new PerfTimer() + console.log(chalk.yellow("Detected change, rebuilding...")) + try { + const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) + + const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] + .filter((fp) => !toRemove.has(fp)) + .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) + + ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] + const parsedContent = await parseMarkdown(ctx, filesToRebuild) + for (const content of parsedContent) { + const [_tree, vfile] = content + contentMap.set(vfile.data.filePath!, content) + } + + for (const fp of toRemove) { + contentMap.delete(fp) + } + + const parsedFiles = [...contentMap.values()] + const filteredContent = filterContent(ctx, parsedFiles) + + // TODO: we can probably traverse the link graph to figure out what's safe to delete here + // instead of just deleting everything + await rimraf(argv.output) + await emitContent(ctx, filteredContent) + console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`)) + } catch { + console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) + } + + clientRefresh() + toRebuild.clear() + toRemove.clear() + release() + } + + const watcher = chokidar.watch(".", { + persistent: true, + cwd: argv.directory, + ignoreInitial: true, + }) + + watcher + .on("add", (fp) => rebuild(fp, "add")) + .on("change", (fp) => rebuild(fp, "change")) + .on("unlink", (fp) => rebuild(fp, "delete")) + + return async () => { + await watcher.close() + } +} + +export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => { + try { + return await buildQuartz(argv, mut, clientRefresh) + } catch (err) { + trace("\nExiting Quartz due to a fatal error", err as Error) + } +} diff --git a/quartz/cfg.ts b/quartz/cfg.ts new file mode 100644 index 0000000..8371b5e --- /dev/null +++ b/quartz/cfg.ts @@ -0,0 +1,55 @@ +import { ValidDateType } from "./components/Date" +import { QuartzComponent } from "./components/types" +import { PluginTypes } from "./plugins/types" +import { Theme } from "./util/theme" + +export type Analytics = + | null + | { + provider: "plausible" + } + | { + provider: "google" + tagId: string + } + | { + provider: "umami" + websiteId: string + } + +export interface GlobalConfiguration { + pageTitle: string + /** Whether to enable single-page-app style rendering. this prevents flashes of unstyled content and improves smoothness of Quartz */ + enableSPA: boolean + /** Whether to display Wikipedia-style popovers when hovering over links */ + enablePopovers: boolean + /** Analytics mode */ + analytics: Analytics + /** Glob patterns to not search */ + ignorePatterns: string[] + /** Whether to use created, modified, or published as the default type of date */ + defaultDateType: ValidDateType + /** Base URL to use for CNAME files, sitemaps, and RSS feeds that require an absolute URL. + * Quartz will avoid using this as much as possible and use relative URLs most of the time + */ + baseUrl?: string + theme: Theme +} + +export interface QuartzConfig { + configuration: GlobalConfiguration + plugins: PluginTypes +} + +export interface FullPageLayout { + head: QuartzComponent + header: QuartzComponent[] + beforeBody: QuartzComponent[] + pageBody: QuartzComponent + left: QuartzComponent[] + right: QuartzComponent[] + footer: QuartzComponent +} + +export type PageLayout = Pick +export type SharedLayout = Pick diff --git a/quartz/cli/args.js b/quartz/cli/args.js new file mode 100644 index 0000000..3543e2e --- /dev/null +++ b/quartz/cli/args.js @@ -0,0 +1,98 @@ +export const CommonArgv = { + directory: { + string: true, + alias: ["d"], + default: "content", + describe: "directory to look for content files", + }, + verbose: { + boolean: true, + alias: ["v"], + default: false, + describe: "print out extra logging information", + }, +} + +export const CreateArgv = { + ...CommonArgv, + source: { + string: true, + alias: ["s"], + describe: "source directory to copy/create symlink from", + }, + strategy: { + string: true, + alias: ["X"], + choices: ["new", "copy", "symlink"], + describe: "strategy for content folder setup", + }, + links: { + string: true, + alias: ["l"], + choices: ["absolute", "shortest", "relative"], + describe: "strategy to resolve links", + }, +} + +export const SyncArgv = { + ...CommonArgv, + commit: { + boolean: true, + default: true, + describe: "create a git commit for your unsaved changes", + }, + push: { + boolean: true, + default: true, + describe: "push updates to your Quartz fork", + }, + pull: { + boolean: true, + default: true, + describe: "pull updates from your Quartz fork", + }, +} + +export const BuildArgv = { + ...CommonArgv, + output: { + string: true, + alias: ["o"], + default: "public", + describe: "output folder for files", + }, + serve: { + boolean: true, + default: false, + describe: "run a local server to live-preview your Quartz", + }, + baseDir: { + string: true, + default: "", + describe: "base path to serve your local server on", + }, + port: { + number: true, + default: 8080, + describe: "port to serve Quartz on", + }, + wsPort: { + number: true, + default: 3001, + describe: "port to use for WebSocket-based hot-reload notifications", + }, + remoteDevHost: { + string: true, + default: "", + describe: "A URL override for the websocket connection if you are not developing on localhost", + }, + bundleInfo: { + boolean: true, + default: false, + describe: "show detailed bundle information", + }, + concurrency: { + number: true, + describe: "how many threads to use to parse notes", + }, +} diff --git a/quartz/cli/constants.js b/quartz/cli/constants.js new file mode 100644 index 0000000..f4a9ce5 --- /dev/null +++ b/quartz/cli/constants.js @@ -0,0 +1,15 @@ +import path from "path" +import { readFileSync } from "fs" + +/** + * All constants relating to helpers or handlers + */ +export const ORIGIN_NAME = "origin" +export const UPSTREAM_NAME = "upstream" +export const QUARTZ_SOURCE_BRANCH = "v4" +export const cwd = process.cwd() +export const cacheDir = path.join(cwd, ".quartz-cache") +export const cacheFile = "./quartz/.quartz-cache/transpiled-build.mjs" +export const fp = "./quartz/build.ts" +export const { version } = JSON.parse(readFileSync("./package.json").toString()) +export const contentCacheFolder = path.join(cacheDir, "content-cache") diff --git a/quartz/cli/handlers.js b/quartz/cli/handlers.js new file mode 100644 index 0000000..48a44ec --- /dev/null +++ b/quartz/cli/handlers.js @@ -0,0 +1,511 @@ +import { promises } from "fs" +import path from "path" +import esbuild from "esbuild" +import chalk from "chalk" +import { sassPlugin } from "esbuild-sass-plugin" +import fs from "fs" +import { intro, outro, select, text } from "@clack/prompts" +import { rimraf } from "rimraf" +import chokidar from "chokidar" +import prettyBytes from "pretty-bytes" +import { execSync, spawnSync } from "child_process" +import http from "http" +import serveHandler from "serve-handler" +import { WebSocketServer } from "ws" +import { randomUUID } from "crypto" +import { Mutex } from "async-mutex" +import { CreateArgv } from "./args.js" +import { + exitIfCancel, + escapePath, + gitPull, + popContentFolder, + stashContentFolder, +} from "./helpers.js" +import { + UPSTREAM_NAME, + QUARTZ_SOURCE_BRANCH, + ORIGIN_NAME, + version, + fp, + cacheFile, + cwd, +} from "./constants.js" + +/** + * Handles `npx quartz create` + * @param {*} argv arguments for `create` + */ +export async function handleCreate(argv) { + console.log() + intro(chalk.bgGreen.black(` Quartz v${version} `)) + const contentFolder = path.join(cwd, argv.directory) + let setupStrategy = argv.strategy?.toLowerCase() + let linkResolutionStrategy = argv.links?.toLowerCase() + const sourceDirectory = argv.source + + // If all cmd arguments were provided, check if theyre valid + if (setupStrategy && linkResolutionStrategy) { + // If setup isn't, "new", source argument is required + if (setupStrategy !== "new") { + // Error handling + if (!sourceDirectory) { + outro( + chalk.red( + `Setup strategies (arg '${chalk.yellow( + `-${CreateArgv.strategy.alias[0]}`, + )}') other than '${chalk.yellow( + "new", + )}' require content folder argument ('${chalk.yellow( + `-${CreateArgv.source.alias[0]}`, + )}') to be set`, + ), + ) + process.exit(1) + } else { + if (!fs.existsSync(sourceDirectory)) { + outro( + chalk.red( + `Input directory to copy/symlink 'content' from not found ('${chalk.yellow( + sourceDirectory, + )}', invalid argument "${chalk.yellow(`-${CreateArgv.source.alias[0]}`)})`, + ), + ) + process.exit(1) + } else if (!fs.lstatSync(sourceDirectory).isDirectory()) { + outro( + chalk.red( + `Source directory to copy/symlink 'content' from is not a directory (found file at '${chalk.yellow( + sourceDirectory, + )}', invalid argument ${chalk.yellow(`-${CreateArgv.source.alias[0]}`)}")`, + ), + ) + process.exit(1) + } + } + } + } + + // Use cli process if cmd args werent provided + if (!setupStrategy) { + setupStrategy = exitIfCancel( + await select({ + message: `Choose how to initialize the content in \`${contentFolder}\``, + options: [ + { value: "new", label: "Empty Quartz" }, + { value: "copy", label: "Copy an existing folder", hint: "overwrites `content`" }, + { + value: "symlink", + label: "Symlink an existing folder", + hint: "don't select this unless you know what you are doing!", + }, + ], + }), + ) + } + + async function rmContentFolder() { + const contentStat = await fs.promises.lstat(contentFolder) + if (contentStat.isSymbolicLink()) { + await fs.promises.unlink(contentFolder) + } else { + await rimraf(contentFolder) + } + } + + await fs.promises.unlink(path.join(contentFolder, ".gitkeep")) + if (setupStrategy === "copy" || setupStrategy === "symlink") { + let originalFolder = sourceDirectory + + // If input directory was not passed, use cli + if (!sourceDirectory) { + originalFolder = escapePath( + exitIfCancel( + await text({ + message: "Enter the full path to existing content folder", + placeholder: + "On most terminal emulators, you can drag and drop a folder into the window and it will paste the full path", + validate(fp) { + const fullPath = escapePath(fp) + if (!fs.existsSync(fullPath)) { + return "The given path doesn't exist" + } else if (!fs.lstatSync(fullPath).isDirectory()) { + return "The given path is not a folder" + } + }, + }), + ), + ) + } + + await rmContentFolder() + if (setupStrategy === "copy") { + await fs.promises.cp(originalFolder, contentFolder, { + recursive: true, + preserveTimestamps: true, + }) + } else if (setupStrategy === "symlink") { + await fs.promises.symlink(originalFolder, contentFolder, "dir") + } + } else if (setupStrategy === "new") { + await fs.promises.writeFile( + path.join(contentFolder, "index.md"), + `--- +title: Welcome to Quartz +--- + +This is a blank Quartz installation. +See the [documentation](https://quartz.jzhao.xyz) for how to get started. +`, + ) + } + + // Use cli process if cmd args werent provided + if (!linkResolutionStrategy) { + // get a preferred link resolution strategy + linkResolutionStrategy = exitIfCancel( + await select({ + message: `Choose how Quartz should resolve links in your content. You can change this later in \`quartz.config.ts\`.`, + options: [ + { + value: "absolute", + label: "Treat links as absolute path", + hint: "for content made for Quartz 3 and Hugo", + }, + { + value: "shortest", + label: "Treat links as shortest path", + hint: "for most Obsidian vaults", + }, + { + value: "relative", + label: "Treat links as relative paths", + hint: "for just normal Markdown files", + }, + ], + }), + ) + } + + // now, do config changes + const configFilePath = path.join(cwd, "quartz.config.ts") + let configContent = await fs.promises.readFile(configFilePath, { encoding: "utf-8" }) + configContent = configContent.replace( + /markdownLinkResolution: '(.+)'/, + `markdownLinkResolution: '${linkResolutionStrategy}'`, + ) + await fs.promises.writeFile(configFilePath, configContent) + + outro(`You're all set! Not sure what to do next? Try: + • Customizing Quartz a bit more by editing \`quartz.config.ts\` + • Running \`npx quartz build --serve\` to preview your Quartz locally + • Hosting your Quartz online (see: https://quartz.jzhao.xyz/hosting) +`) +} + +/** + * Handles `npx quartz build` + * @param {*} argv arguments for `build` + */ +export async function handleBuild(argv) { + console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) + const ctx = await esbuild.context({ + entryPoints: [fp], + outfile: cacheFile, + bundle: true, + keepNames: true, + minifyWhitespace: true, + minifySyntax: true, + platform: "node", + format: "esm", + jsx: "automatic", + jsxImportSource: "preact", + packages: "external", + metafile: true, + sourcemap: true, + sourcesContent: false, + plugins: [ + sassPlugin({ + type: "css-text", + cssImports: true, + }), + { + name: "inline-script-loader", + setup(build) { + build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => { + let text = await promises.readFile(args.path, "utf8") + + // remove default exports that we manually inserted + text = text.replace("export default", "") + text = text.replace("export", "") + + const sourcefile = path.relative(path.resolve("."), args.path) + const resolveDir = path.dirname(sourcefile) + const transpiled = await esbuild.build({ + stdin: { + contents: text, + loader: "ts", + resolveDir, + sourcefile, + }, + write: false, + bundle: true, + platform: "browser", + format: "esm", + }) + const rawMod = transpiled.outputFiles[0].text + return { + contents: rawMod, + loader: "text", + } + }) + }, + }, + ], + }) + + const buildMutex = new Mutex() + let lastBuildMs = 0 + let cleanupBuild = null + const build = async (clientRefresh) => { + const buildStart = new Date().getTime() + lastBuildMs = buildStart + const release = await buildMutex.acquire() + if (lastBuildMs > buildStart) { + release() + return + } + + if (cleanupBuild) { + await cleanupBuild() + console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) + } + + const result = await ctx.rebuild().catch((err) => { + console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`) + console.log(`Reason: ${chalk.grey(err)}`) + process.exit(1) + }) + release() + + if (argv.bundleInfo) { + const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs" + const meta = result.metafile.outputs[outputFileName] + console.log( + `Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes( + meta.bytes, + )})`, + ) + console.log(await esbuild.analyzeMetafile(result.metafile, { color: true })) + } + + // bypass module cache + // https://github.com/nodejs/modules/issues/307 + const { default: buildQuartz } = await import(`../../${cacheFile}?update=${randomUUID()}`) + // ^ this import is relative, so base "cacheFile" path can't be used + + cleanupBuild = await buildQuartz(argv, buildMutex, clientRefresh) + clientRefresh() + } + + if (argv.serve) { + const connections = [] + const clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) + + if (argv.baseDir !== "" && !argv.baseDir.startsWith("/")) { + argv.baseDir = "/" + argv.baseDir + } + + await build(clientRefresh) + const server = http.createServer(async (req, res) => { + if (argv.baseDir && !req.url?.startsWith(argv.baseDir)) { + console.log( + chalk.red( + `[404] ${req.url} (warning: link outside of site, this is likely a Quartz bug)`, + ), + ) + res.writeHead(404) + res.end() + return + } + + // strip baseDir prefix + req.url = req.url?.slice(argv.baseDir.length) + + const serve = async () => { + const release = await buildMutex.acquire() + await serveHandler(req, res, { + public: argv.output, + directoryListing: false, + headers: [ + { + source: "**/*.html", + headers: [{ key: "Content-Disposition", value: "inline" }], + }, + ], + }) + const status = res.statusCode + const statusString = + status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`) + console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`)) + release() + } + + const redirect = (newFp) => { + newFp = argv.baseDir + newFp + res.writeHead(302, { + Location: newFp, + }) + console.log(chalk.yellow("[302]") + chalk.grey(` ${argv.baseDir}${req.url} -> ${newFp}`)) + res.end() + } + + let fp = req.url?.split("?")[0] ?? "/" + + // handle redirects + if (fp.endsWith("/")) { + // /trailing/ + // does /trailing/index.html exist? if so, serve it + const indexFp = path.posix.join(fp, "index.html") + if (fs.existsSync(path.posix.join(argv.output, indexFp))) { + req.url = fp + return serve() + } + + // does /trailing.html exist? if so, redirect to /trailing + let base = fp.slice(0, -1) + if (path.extname(base) === "") { + base += ".html" + } + if (fs.existsSync(path.posix.join(argv.output, base))) { + return redirect(fp.slice(0, -1)) + } + } else { + // /regular + // does /regular.html exist? if so, serve it + let base = fp + if (path.extname(base) === "") { + base += ".html" + } + if (fs.existsSync(path.posix.join(argv.output, base))) { + req.url = fp + return serve() + } + + // does /regular/index.html exist? if so, redirect to /regular/ + let indexFp = path.posix.join(fp, "index.html") + if (fs.existsSync(path.posix.join(argv.output, indexFp))) { + return redirect(fp + "/") + } + } + + return serve() + }) + server.listen(argv.port) + const wss = new WebSocketServer({ port: argv.wsPort }) + wss.on("connection", (ws) => connections.push(ws)) + console.log( + chalk.cyan( + `Started a Quartz server listening at http://localhost:${argv.port}${argv.baseDir}`, + ), + ) + console.log("hint: exit with ctrl+c") + chokidar + .watch(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"], { + ignoreInitial: true, + }) + .on("all", async () => { + build(clientRefresh) + }) + } else { + await build(() => {}) + ctx.dispose() + } +} + +/** + * Handles `npx quartz update` + * @param {*} argv arguments for `update` + */ +export async function handleUpdate(argv) { + const contentFolder = path.join(cwd, argv.directory) + console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) + console.log("Backing up your content") + execSync( + `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, + ) + await stashContentFolder(contentFolder) + console.log( + "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", + ) + gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) + await popContentFolder(contentFolder) + console.log("Ensuring dependencies are up to date") + spawnSync("npm", ["i"], { stdio: "inherit" }) + console.log(chalk.green("Done!")) +} + +/** + * Handles `npx quartz restore` + * @param {*} argv arguments for `restore` + */ +export async function handleRestore(argv) { + const contentFolder = path.join(cwd, argv.directory) + await popContentFolder(contentFolder) +} + +/** + * Handles `npx quartz sync` + * @param {*} argv arguments for `sync` + */ +export async function handleSync(argv) { + const contentFolder = path.join(cwd, argv.directory) + console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) + console.log("Backing up your content") + + if (argv.commit) { + const contentStat = await fs.promises.lstat(contentFolder) + if (contentStat.isSymbolicLink()) { + const linkTarg = await fs.promises.readlink(contentFolder) + console.log(chalk.yellow("Detected symlink, trying to dereference before committing")) + + // stash symlink file + await stashContentFolder(contentFolder) + + // follow symlink and copy content + await fs.promises.cp(linkTarg, contentFolder, { + recursive: true, + preserveTimestamps: true, + }) + } + + const currentTimestamp = new Date().toLocaleString("en-US", { + dateStyle: "medium", + timeStyle: "short", + }) + spawnSync("git", ["add", "."], { stdio: "inherit" }) + spawnSync("git", ["commit", "-m", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" }) + + if (contentStat.isSymbolicLink()) { + // put symlink back + await popContentFolder(contentFolder) + } + } + + await stashContentFolder(contentFolder) + + if (argv.pull) { + console.log( + "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", + ) + gitPull(ORIGIN_NAME, QUARTZ_SOURCE_BRANCH) + } + + await popContentFolder(contentFolder) + if (argv.push) { + console.log("Pushing your changes") + spawnSync("git", ["push", "-f", ORIGIN_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) + } + + console.log(chalk.green("Done!")) +} diff --git a/quartz/cli/helpers.js b/quartz/cli/helpers.js new file mode 100644 index 0000000..b07d19e --- /dev/null +++ b/quartz/cli/helpers.js @@ -0,0 +1,52 @@ +import { isCancel, outro } from "@clack/prompts" +import chalk from "chalk" +import { contentCacheFolder } from "./constants.js" +import { spawnSync } from "child_process" +import fs from "fs" + +export function escapePath(fp) { + return fp + .replace(/\\ /g, " ") // unescape spaces + .replace(/^".*"$/, "$1") + .replace(/^'.*"$/, "$1") + .trim() +} + +export function exitIfCancel(val) { + if (isCancel(val)) { + outro(chalk.red("Exiting")) + process.exit(0) + } else { + return val + } +} + +export async function stashContentFolder(contentFolder) { + await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) + await fs.promises.cp(contentFolder, contentCacheFolder, { + force: true, + recursive: true, + verbatimSymlinks: true, + preserveTimestamps: true, + }) + await fs.promises.rm(contentFolder, { force: true, recursive: true }) +} + +export function gitPull(origin, branch) { + const flags = ["--no-rebase", "--autostash", "-s", "recursive", "-X", "ours", "--no-edit"] + const out = spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" }) + if (out.stderr) { + throw new Error(`Error while pulling updates: ${out.stderr}`) + } +} + +export async function popContentFolder(contentFolder) { + await fs.promises.rm(contentFolder, { force: true, recursive: true }) + await fs.promises.cp(contentCacheFolder, contentFolder, { + force: true, + recursive: true, + verbatimSymlinks: true, + preserveTimestamps: true, + }) + await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) +} diff --git a/quartz/components/ArticleTitle.tsx b/quartz/components/ArticleTitle.tsx new file mode 100644 index 0000000..a52b2a4 --- /dev/null +++ b/quartz/components/ArticleTitle.tsx @@ -0,0 +1,17 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function ArticleTitle({ fileData, displayClass }: QuartzComponentProps) { + const title = fileData.frontmatter?.title + if (title) { + return

    {title}

    + } else { + return null + } +} +ArticleTitle.css = ` +.article-title { + margin: 2rem 0 0 0; +} +` + +export default (() => ArticleTitle) satisfies QuartzComponentConstructor diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx new file mode 100644 index 0000000..c4172ce --- /dev/null +++ b/quartz/components/Backlinks.tsx @@ -0,0 +1,29 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/backlinks.scss" +import { resolveRelative, simplifySlug } from "../util/path" + +function Backlinks({ fileData, allFiles, displayClass }: QuartzComponentProps) { + const slug = simplifySlug(fileData.slug!) + const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)) + return ( + + ) +} + +Backlinks.css = style +export default (() => Backlinks) satisfies QuartzComponentConstructor diff --git a/quartz/components/Body.tsx b/quartz/components/Body.tsx new file mode 100644 index 0000000..fbb8572 --- /dev/null +++ b/quartz/components/Body.tsx @@ -0,0 +1,13 @@ +// @ts-ignore +import clipboardScript from "./scripts/clipboard.inline" +import clipboardStyle from "./styles/clipboard.scss" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function Body({ children }: QuartzComponentProps) { + return
    {children}
    +} + +Body.afterDOMLoaded = clipboardScript +Body.css = clipboardStyle + +export default (() => Body) satisfies QuartzComponentConstructor diff --git a/quartz/components/Breadcrumbs.tsx b/quartz/components/Breadcrumbs.tsx new file mode 100644 index 0000000..467b5a5 --- /dev/null +++ b/quartz/components/Breadcrumbs.tsx @@ -0,0 +1,117 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import breadcrumbsStyle from "./styles/breadcrumbs.scss" +import { FullSlug, SimpleSlug, resolveRelative } from "../util/path" +import { QuartzPluginData } from "../plugins/vfile" + +type CrumbData = { + displayName: string + path: string +} + +interface BreadcrumbOptions { + /** + * Symbol between crumbs + */ + spacerSymbol: string + /** + * Name of first crumb + */ + rootName: string + /** + * wether to look up frontmatter title for folders (could cause performance problems with big vaults) + */ + resolveFrontmatterTitle: boolean + /** + * Wether to display breadcrumbs on root `index.md` + */ + hideOnRoot: boolean +} + +const defaultOptions: BreadcrumbOptions = { + spacerSymbol: ">", + rootName: "Home", + resolveFrontmatterTitle: false, + hideOnRoot: true, +} + +function formatCrumb(displayName: string, baseSlug: FullSlug, currentSlug: SimpleSlug): CrumbData { + return { + displayName: displayName.replaceAll("-", " "), + path: resolveRelative(baseSlug, currentSlug), + } +} + +// given a folderName (e.g. "features"), search for the corresponding `index.md` file +function findCurrentFile(allFiles: QuartzPluginData[], folderName: string) { + return allFiles.find((file) => { + if (file.slug?.endsWith("index")) { + const folderParts = file.filePath?.split("/") + if (folderParts) { + const name = folderParts[folderParts?.length - 2] + if (name === folderName) { + return true + } + } + } + }) +} + +export default ((opts?: Partial) => { + // Merge options with defaults + const options: BreadcrumbOptions = { ...defaultOptions, ...opts } + + function Breadcrumbs({ fileData, allFiles, displayClass }: QuartzComponentProps) { + // Hide crumbs on root if enabled + if (options.hideOnRoot && fileData.slug === "index") { + return <> + } + + // Format entry for root element + const firstEntry = formatCrumb(options.rootName, fileData.slug!, "/" as SimpleSlug) + const crumbs: CrumbData[] = [firstEntry] + + // Split slug into hierarchy/parts + const slugParts = fileData.slug?.split("/") + if (slugParts) { + // full path until current part + let currentPath = "" + for (let i = 0; i < slugParts.length - 1; i++) { + let currentTitle = slugParts[i] + + // TODO: performance optimizations/memoizing + // Try to resolve frontmatter folder title + if (options?.resolveFrontmatterTitle) { + // try to find file for current path + const currentFile = findCurrentFile(allFiles, currentTitle) + if (currentFile) { + currentTitle = currentFile.frontmatter!.title + } + } + // Add current slug to full path + currentPath += slugParts[i] + "/" + + // Format and add current crumb + const crumb = formatCrumb(currentTitle, fileData.slug!, currentPath as SimpleSlug) + crumbs.push(crumb) + } + + // Add current file to crumb (can directly use frontmatter title) + crumbs.push({ + displayName: fileData.frontmatter!.title, + path: "", + }) + } + return ( + + ) + } + Breadcrumbs.css = breadcrumbsStyle + return Breadcrumbs +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/ContentMeta.tsx b/quartz/components/ContentMeta.tsx new file mode 100644 index 0000000..21dc13f --- /dev/null +++ b/quartz/components/ContentMeta.tsx @@ -0,0 +1,30 @@ +import { formatDate, getDate } from "./Date" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import readingTime from "reading-time" + +export default (() => { + function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) { + const text = fileData.text + if (text) { + const segments: string[] = [] + const { text: timeTaken, words: _words } = readingTime(text) + + if (fileData.dates) { + segments.push(formatDate(getDate(cfg, fileData)!)) + } + + segments.push(timeTaken) + return

    {segments.join(", ")}

    + } else { + return null + } + } + + ContentMetadata.css = ` + .content-meta { + margin-top: 0; + color: var(--gray); + } + ` + return ContentMetadata +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Darkmode.tsx b/quartz/components/Darkmode.tsx new file mode 100644 index 0000000..a668c5b --- /dev/null +++ b/quartz/components/Darkmode.tsx @@ -0,0 +1,51 @@ +// @ts-ignore: this is safe, we don't want to actually make darkmode.inline.ts a module as +// modules are automatically deferred and we don't want that to happen for critical beforeDOMLoads +// see: https://v8.dev/features/modules#defer +import darkmodeScript from "./scripts/darkmode.inline" +import styles from "./styles/darkmode.scss" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function Darkmode({ displayClass }: QuartzComponentProps) { + return ( +
    + + + +
    + ) +} + +Darkmode.beforeDOMLoaded = darkmodeScript +Darkmode.css = styles + +export default (() => Darkmode) satisfies QuartzComponentConstructor diff --git a/quartz/components/Date.tsx b/quartz/components/Date.tsx new file mode 100644 index 0000000..8713cfd --- /dev/null +++ b/quartz/components/Date.tsx @@ -0,0 +1,29 @@ +import { GlobalConfiguration } from "../cfg" +import { QuartzPluginData } from "../plugins/vfile" + +interface Props { + date: Date +} + +export type ValidDateType = keyof Required["dates"] + +export function getDate(cfg: GlobalConfiguration, data: QuartzPluginData): Date | undefined { + if (!cfg.defaultDateType) { + throw new Error( + `Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`, + ) + } + return data.dates?.[cfg.defaultDateType] +} + +export function formatDate(d: Date): string { + return d.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "2-digit", + }) +} + +export function Date({ date }: Props) { + return <>{formatDate(date)} +} diff --git a/quartz/components/DesktopOnly.tsx b/quartz/components/DesktopOnly.tsx new file mode 100644 index 0000000..a11f23f --- /dev/null +++ b/quartz/components/DesktopOnly.tsx @@ -0,0 +1,18 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default ((component?: QuartzComponent) => { + if (component) { + const Component = component + function DesktopOnly(props: QuartzComponentProps) { + return + } + + DesktopOnly.displayName = component.displayName + DesktopOnly.afterDOMLoaded = component?.afterDOMLoaded + DesktopOnly.beforeDOMLoaded = component?.beforeDOMLoaded + DesktopOnly.css = component?.css + return DesktopOnly + } else { + return () => <> + } +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Explorer.tsx b/quartz/components/Explorer.tsx new file mode 100644 index 0000000..95eac43 --- /dev/null +++ b/quartz/components/Explorer.tsx @@ -0,0 +1,126 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import explorerStyle from "./styles/explorer.scss" + +// @ts-ignore +import script from "./scripts/explorer.inline" +import { ExplorerNode, FileNode, Options } from "./ExplorerNode" +import { QuartzPluginData } from "../plugins/vfile" + +// Options interface defined in `ExplorerNode` to avoid circular dependency +const defaultOptions = { + title: "Explorer", + folderClickBehavior: "collapse", + folderDefaultState: "collapsed", + useSavedState: true, + sortFn: (a, b) => { + // Sort order: folders first, then files. Sort folders and files alphabetically + if ((!a.file && !b.file) || (a.file && b.file)) { + // numeric: true: Whether numeric collation should be used, such that "1" < "2" < "10" + // sensitivity: "base": Only strings that differ in base letters compare as unequal. Examples: a ≠ b, a = á, a = A + return a.displayName.localeCompare(b.displayName, undefined, { + numeric: true, + sensitivity: "base", + }) + } + if (a.file && !b.file) { + return 1 + } else { + return -1 + } + }, + filterFn: (node) => node.name !== "tags", + order: ["filter", "map", "sort"], +} satisfies Options + +export default ((userOpts?: Partial) => { + // Parse config + const opts: Options = { ...defaultOptions, ...userOpts } + + // memoized + let fileTree: FileNode + let jsonTree: string + + function constructFileTree(allFiles: QuartzPluginData[]) { + if (!fileTree) { + // Construct tree from allFiles + fileTree = new FileNode("") + allFiles.forEach((file) => fileTree.add(file, 1)) + + /** + * Keys of this object must match corresponding function name of `FileNode`, + * while values must be the argument that will be passed to the function. + * + * e.g. entry for FileNode.sort: `sort: opts.sortFn` (value is sort function from options) + */ + const functions = { + map: opts.mapFn, + sort: opts.sortFn, + filter: opts.filterFn, + } + + // Execute all functions (sort, filter, map) that were provided (if none were provided, only default "sort" is applied) + if (opts.order) { + // Order is important, use loop with index instead of order.map() + for (let i = 0; i < opts.order.length; i++) { + const functionName = opts.order[i] + if (functions[functionName]) { + // for every entry in order, call matching function in FileNode and pass matching argument + // e.g. i = 0; functionName = "filter" + // converted to: (if opts.filterFn) => fileTree.filter(opts.filterFn) + + // @ts-ignore + // typescript cant statically check these dynamic references, so manually make sure reference is valid and ignore warning + fileTree[functionName].call(fileTree, functions[functionName]) + } + } + } + + // Get all folders of tree. Initialize with collapsed state + const folders = fileTree.getFolderPaths(opts.folderDefaultState === "collapsed") + + // Stringify to pass json tree as data attribute ([data-tree]) + jsonTree = JSON.stringify(folders) + } + } + + function Explorer({ allFiles, displayClass, fileData }: QuartzComponentProps) { + constructFileTree(allFiles) + return ( +
    + +
    +
      + +
    • +
    +
    +
    + ) + } + Explorer.css = explorerStyle + Explorer.afterDOMLoaded = script + return Explorer +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/ExplorerNode.tsx b/quartz/components/ExplorerNode.tsx new file mode 100644 index 0000000..e5ceb0b --- /dev/null +++ b/quartz/components/ExplorerNode.tsx @@ -0,0 +1,224 @@ +// @ts-ignore +import { QuartzPluginData } from "../plugins/vfile" +import { resolveRelative } from "../util/path" + +type OrderEntries = "sort" | "filter" | "map" + +export interface Options { + title: string + folderDefaultState: "collapsed" | "open" + folderClickBehavior: "collapse" | "link" + useSavedState: boolean + sortFn: (a: FileNode, b: FileNode) => number + filterFn?: (node: FileNode) => boolean + mapFn?: (node: FileNode) => void + order?: OrderEntries[] +} + +type DataWrapper = { + file: QuartzPluginData + path: string[] +} + +export type FolderState = { + path: string + collapsed: boolean +} + +// Structure to add all files into a tree +export class FileNode { + children: FileNode[] + name: string + displayName: string + file: QuartzPluginData | null + depth: number + + constructor(name: string, file?: QuartzPluginData, depth?: number) { + this.children = [] + this.name = name + this.displayName = name + this.file = file ? structuredClone(file) : null + this.depth = depth ?? 0 + } + + private insert(file: DataWrapper) { + if (file.path.length === 1) { + if (file.path[0] !== "index.md") { + this.children.push(new FileNode(file.file.frontmatter!.title, file.file, this.depth + 1)) + } else { + const title = file.file.frontmatter?.title + if (title && title !== "index" && file.path[0] === "index.md") { + this.displayName = title + } + } + } else { + const next = file.path[0] + file.path = file.path.splice(1) + for (const child of this.children) { + if (child.name === next) { + child.insert(file) + return + } + } + + const newChild = new FileNode(next, undefined, this.depth + 1) + newChild.insert(file) + this.children.push(newChild) + } + } + + // Add new file to tree + add(file: QuartzPluginData, splice: number = 0) { + this.insert({ file, path: file.filePath!.split("/").splice(splice) }) + } + + // Print tree structure (for debugging) + print(depth: number = 0) { + let folderChar = "" + if (!this.file) folderChar = "|" + console.log("-".repeat(depth), folderChar, this.name, this.depth) + this.children.forEach((e) => e.print(depth + 1)) + } + + /** + * Filter FileNode tree. Behaves similar to `Array.prototype.filter()`, but modifies tree in place + * @param filterFn function to filter tree with + */ + filter(filterFn: (node: FileNode) => boolean) { + this.children = this.children.filter(filterFn) + this.children.forEach((child) => child.filter(filterFn)) + } + + /** + * Filter FileNode tree. Behaves similar to `Array.prototype.map()`, but modifies tree in place + * @param mapFn function to use for mapping over tree + */ + map(mapFn: (node: FileNode) => void) { + mapFn(this) + + this.children.forEach((child) => child.map(mapFn)) + } + + /** + * Get folder representation with state of tree. + * Intended to only be called on root node before changes to the tree are made + * @param collapsed default state of folders (collapsed by default or not) + * @returns array containing folder state for tree + */ + getFolderPaths(collapsed: boolean): FolderState[] { + const folderPaths: FolderState[] = [] + + const traverse = (node: FileNode, currentPath: string) => { + if (!node.file) { + const folderPath = currentPath + (currentPath ? "/" : "") + node.name + if (folderPath !== "") { + folderPaths.push({ path: folderPath, collapsed }) + } + node.children.forEach((child) => traverse(child, folderPath)) + } + } + + traverse(this, "") + + return folderPaths + } + + // Sort order: folders first, then files. Sort folders and files alphabetically + /** + * Sorts tree according to sort/compare function + * @param sortFn compare function used for `.sort()`, also used recursively for children + */ + sort(sortFn: (a: FileNode, b: FileNode) => number) { + this.children = this.children.sort(sortFn) + this.children.forEach((e) => e.sort(sortFn)) + } +} + +type ExplorerNodeProps = { + node: FileNode + opts: Options + fileData: QuartzPluginData + fullPath?: string +} + +export function ExplorerNode({ node, opts, fullPath, fileData }: ExplorerNodeProps) { + // Get options + const folderBehavior = opts.folderClickBehavior + const isDefaultOpen = opts.folderDefaultState === "open" + + // Calculate current folderPath + let pathOld = fullPath ? fullPath : "" + let folderPath = "" + if (node.name !== "") { + folderPath = `${pathOld}/${node.name}` + } + + return ( +
  • + {node.file ? ( + // Single file node +
  • + + {node.displayName} + +
  • + ) : ( +
    + {node.name !== "" && ( + // Node with entire folder + // Render svg button + folder name, then children + +
    + )} + {/* Recursively render children of folder */} +
    +
      + {node.children.map((childNode, i) => ( + + ))} +
    +
    + + )} + + ) +} diff --git a/quartz/components/Footer.tsx b/quartz/components/Footer.tsx new file mode 100644 index 0000000..54440cf --- /dev/null +++ b/quartz/components/Footer.tsx @@ -0,0 +1,32 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/footer.scss" +import { version } from "../../package.json" + +interface Options { + links: Record +} + +export default ((opts?: Options) => { + function Footer({ displayClass }: QuartzComponentProps) { + const year = new Date().getFullYear() + const links = opts?.links ?? [] + return ( +
    +
    +

    + Created with Quartz v{version}, © {year} +

    +
      + {Object.entries(links).map(([text, link]) => ( +
    • + {text} +
    • + ))} +
    +
    + ) + } + + Footer.css = style + return Footer +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Graph.tsx b/quartz/components/Graph.tsx new file mode 100644 index 0000000..0c2647f --- /dev/null +++ b/quartz/components/Graph.tsx @@ -0,0 +1,100 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +// @ts-ignore +import script from "./scripts/graph.inline" +import style from "./styles/graph.scss" + +export interface D3Config { + drag: boolean + zoom: boolean + depth: number + scale: number + repelForce: number + centerForce: number + linkDistance: number + fontSize: number + opacityScale: number + removeTags: string[] + showTags: boolean +} + +interface GraphOptions { + localGraph: Partial | undefined + globalGraph: Partial | undefined +} + +const defaultOptions: GraphOptions = { + localGraph: { + drag: true, + zoom: true, + depth: 1, + scale: 1.1, + repelForce: 0.5, + centerForce: 0.3, + linkDistance: 30, + fontSize: 0.6, + opacityScale: 1, + showTags: true, + removeTags: [], + }, + globalGraph: { + drag: true, + zoom: true, + depth: -1, + scale: 0.9, + repelForce: 0.5, + centerForce: 0.3, + linkDistance: 30, + fontSize: 0.6, + opacityScale: 1, + showTags: true, + removeTags: [], + }, +} + +export default ((opts?: GraphOptions) => { + function Graph({ displayClass }: QuartzComponentProps) { + const localGraph = { ...defaultOptions.localGraph, ...opts?.localGraph } + const globalGraph = { ...defaultOptions.globalGraph, ...opts?.globalGraph } + return ( +
    +

    Graph View

    +
    +
    + + + +
    +
    +
    +
    +
    + ) + } + + Graph.css = style + Graph.afterDOMLoaded = script + + return Graph +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx new file mode 100644 index 0000000..2bf2638 --- /dev/null +++ b/quartz/components/Head.tsx @@ -0,0 +1,44 @@ +import { FullSlug, _stripSlashes, joinSegments, pathToRoot } from "../util/path" +import { JSResourceToScriptElement } from "../util/resources" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default (() => { + function Head({ cfg, fileData, externalResources }: QuartzComponentProps) { + const title = fileData.frontmatter?.title ?? "Untitled" + const description = fileData.description?.trim() ?? "No description provided" + const { css, js } = externalResources + + const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) + const path = url.pathname as FullSlug + const baseDir = fileData.slug === "404" ? path : pathToRoot(fileData.slug!) + + const iconPath = joinSegments(baseDir, "static/icon.png") + const ogImagePath = `https://${cfg.baseUrl}/static/og-image.png` + + return ( + + {title} + + + + + {cfg.baseUrl && } + + + + + + + + {css.map((href) => ( + + ))} + {js + .filter((resource) => resource.loadTime === "beforeDOMReady") + .map((res) => JSResourceToScriptElement(res, true))} + + ) + } + + return Head +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Header.tsx b/quartz/components/Header.tsx new file mode 100644 index 0000000..5281f72 --- /dev/null +++ b/quartz/components/Header.tsx @@ -0,0 +1,22 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function Header({ children }: QuartzComponentProps) { + return children.length > 0 ?
    {children}
    : null +} + +Header.css = ` +header { + display: flex; + flex-direction: row; + align-items: center; + margin: 2rem 0; + gap: 1.5rem; +} + +header h1 { + margin: 0; + flex: auto; +} +` + +export default (() => Header) satisfies QuartzComponentConstructor diff --git a/quartz/components/MobileOnly.tsx b/quartz/components/MobileOnly.tsx new file mode 100644 index 0000000..5a19095 --- /dev/null +++ b/quartz/components/MobileOnly.tsx @@ -0,0 +1,18 @@ +import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" + +export default ((component?: QuartzComponent) => { + if (component) { + const Component = component + function MobileOnly(props: QuartzComponentProps) { + return + } + + MobileOnly.displayName = component.displayName + MobileOnly.afterDOMLoaded = component?.afterDOMLoaded + MobileOnly.beforeDOMLoaded = component?.beforeDOMLoaded + MobileOnly.css = component?.css + return MobileOnly + } else { + return () => <> + } +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/PageList.tsx b/quartz/components/PageList.tsx new file mode 100644 index 0000000..eb34f02 --- /dev/null +++ b/quartz/components/PageList.tsx @@ -0,0 +1,87 @@ +import { FullSlug, resolveRelative } from "../util/path" +import { QuartzPluginData } from "../plugins/vfile" +import { Date, getDate } from "./Date" +import { QuartzComponentProps } from "./types" +import { GlobalConfiguration } from "../cfg" + +export function byDateAndAlphabetical( + cfg: GlobalConfiguration, +): (f1: QuartzPluginData, f2: QuartzPluginData) => number { + return (f1, f2) => { + if (f1.dates && f2.dates) { + // sort descending + return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime() + } else if (f1.dates && !f2.dates) { + // prioritize files with dates + return -1 + } else if (!f1.dates && f2.dates) { + return 1 + } + + // otherwise, sort lexographically by title + const f1Title = f1.frontmatter?.title.toLowerCase() ?? "" + const f2Title = f2.frontmatter?.title.toLowerCase() ?? "" + return f1Title.localeCompare(f2Title) + } +} + +type Props = { + limit?: number +} & QuartzComponentProps + +export function PageList({ cfg, fileData, allFiles, limit }: Props) { + let list = allFiles.sort(byDateAndAlphabetical(cfg)) + if (limit) { + list = list.slice(0, limit) + } + + return ( +
      + {list.map((page) => { + const title = page.frontmatter?.title + const tags = page.frontmatter?.tags ?? [] + + return ( +
    • +
      + {page.dates && ( +

      + +

      + )} + + +
      +
    • + ) + })} +
    + ) +} + +PageList.css = ` +.section h3 { + margin: 0; +} + +.section > .tags { + margin: 0; +} +` diff --git a/quartz/components/PageTitle.tsx b/quartz/components/PageTitle.tsx new file mode 100644 index 0000000..81d80d1 --- /dev/null +++ b/quartz/components/PageTitle.tsx @@ -0,0 +1,20 @@ +import { pathToRoot } from "../util/path" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function PageTitle({ fileData, cfg, displayClass }: QuartzComponentProps) { + const title = cfg?.pageTitle ?? "Untitled Quartz" + const baseDir = pathToRoot(fileData.slug!) + return ( +

    + {title} +

    + ) +} + +PageTitle.css = ` +.page-title { + margin: 0; +} +` + +export default (() => PageTitle) satisfies QuartzComponentConstructor diff --git a/quartz/components/RecentNotes.tsx b/quartz/components/RecentNotes.tsx new file mode 100644 index 0000000..0b34246 --- /dev/null +++ b/quartz/components/RecentNotes.tsx @@ -0,0 +1,85 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import { FullSlug, SimpleSlug, resolveRelative } from "../util/path" +import { QuartzPluginData } from "../plugins/vfile" +import { byDateAndAlphabetical } from "./PageList" +import style from "./styles/recentNotes.scss" +import { Date, getDate } from "./Date" +import { GlobalConfiguration } from "../cfg" + +interface Options { + title: string + limit: number + linkToMore: SimpleSlug | false + filter: (f: QuartzPluginData) => boolean + sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number + showTags: boolean +} + +const defaultOptions = (cfg: GlobalConfiguration): Options => ({ + title: "Recent Notes", + limit: 3, + linkToMore: false, + filter: () => true, + sort: byDateAndAlphabetical(cfg), + showTags: false, +}) + +export default ((userOpts?: Partial) => { + function RecentNotes({ allFiles, fileData, displayClass, cfg }: QuartzComponentProps) { + const opts = { ...defaultOptions(cfg), ...userOpts } + const pages = allFiles.filter(opts.filter).sort(opts.sort) + const remaining = Math.max(0, pages.length - opts.limit) + return ( +
    +

    {opts.title}

    +
      + {pages.slice(0, opts.limit).map((page) => { + const title = page.frontmatter?.title + const tags = page.frontmatter?.tags ?? [] + + return ( +
    • +
      + + {page.dates && ( +

      + +

      + )} + {opts.showTags && tags.length > 0 && ( // 根据 opts.showTags 决定是否渲染标签 + + )} +
      +
    • + ) + })} +
    + {opts.linkToMore && remaining > 0 && ( +

    + See {remaining} more → +

    + )} +
    + ) + } + + RecentNotes.css = style + return RecentNotes +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Search.tsx b/quartz/components/Search.tsx new file mode 100644 index 0000000..9c1852d --- /dev/null +++ b/quartz/components/Search.tsx @@ -0,0 +1,49 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import style from "./styles/search.scss" +// @ts-ignore +import script from "./scripts/search.inline" + +export default (() => { + function Search({ displayClass }: QuartzComponentProps) { + return ( +
    +
    +

    Search

    +
    + + Search + Search + + + + + +
    +
    +
    + +
    +
    +
    +
    + ) + } + + Search.afterDOMLoaded = script + Search.css = style + + return Search +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Spacer.tsx b/quartz/components/Spacer.tsx new file mode 100644 index 0000000..8359111 --- /dev/null +++ b/quartz/components/Spacer.tsx @@ -0,0 +1,7 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function Spacer({ displayClass }: QuartzComponentProps) { + return
    +} + +export default (() => Spacer) satisfies QuartzComponentConstructor diff --git a/quartz/components/TableOfContents.tsx b/quartz/components/TableOfContents.tsx new file mode 100644 index 0000000..1c55f07 --- /dev/null +++ b/quartz/components/TableOfContents.tsx @@ -0,0 +1,84 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" +import legacyStyle from "./styles/legacyToc.scss" +import modernStyle from "./styles/toc.scss" + +// @ts-ignore +import script from "./scripts/toc.inline" + +interface Options { + layout: "modern" | "legacy" +} + +const defaultOptions: Options = { + layout: "modern", +} + +function TableOfContents({ fileData, displayClass }: QuartzComponentProps) { + if (!fileData.toc) { + return null + } + + return ( +
    + +
    + +
    +
    + ) +} +TableOfContents.css = modernStyle +TableOfContents.afterDOMLoaded = script + +function LegacyTableOfContents({ fileData }: QuartzComponentProps) { + if (!fileData.toc) { + return null + } + + return ( +
    + +

    Table of Contents

    +
    + +
    + ) +} +LegacyTableOfContents.css = legacyStyle + +export default ((opts?: Partial) => { + const layout = opts?.layout ?? defaultOptions.layout + return layout === "modern" ? TableOfContents : LegacyTableOfContents +}) satisfies QuartzComponentConstructor diff --git a/quartz/components/TagList.tsx b/quartz/components/TagList.tsx new file mode 100644 index 0000000..b39b199 --- /dev/null +++ b/quartz/components/TagList.tsx @@ -0,0 +1,58 @@ +import { pathToRoot, slugTag } from "../util/path" +import { QuartzComponentConstructor, QuartzComponentProps } from "./types" + +function TagList({ fileData, displayClass }: QuartzComponentProps) { + const tags = fileData.frontmatter?.tags + const baseDir = pathToRoot(fileData.slug!) + if (tags && tags.length > 0) { + return ( +
      + {tags.map((tag) => { + const display = `#${tag}` + const linkDest = baseDir + `/tags/${slugTag(tag)}` + return ( +
    • + + {display} + +
    • + ) + })} +
    + ) + } else { + return null + } +} + +TagList.css = ` +.tags { + list-style: none; + display: flex; + padding-left: 0; + gap: 0.4rem; + margin: 1rem 0; + flex-wrap: wrap; + justify-self: end; +} + +.section-li > .section > .tags { + justify-content: flex-end; +} + +.tags > li { + display: inline-block; + white-space: nowrap; + margin: 0; + overflow-wrap: normal; +} + +a.internal.tag-link { + border-radius: 8px; + background-color: var(--highlight); + padding: 0.2rem 0.4rem; + margin: 0 0.1rem; +} +` + +export default (() => TagList) satisfies QuartzComponentConstructor diff --git a/quartz/components/index.ts b/quartz/components/index.ts new file mode 100644 index 0000000..b3db76b --- /dev/null +++ b/quartz/components/index.ts @@ -0,0 +1,45 @@ +import Content from "./pages/Content" +import TagContent from "./pages/TagContent" +import FolderContent from "./pages/FolderContent" +import NotFound from "./pages/404" +import ArticleTitle from "./ArticleTitle" +import Darkmode from "./Darkmode" +import Head from "./Head" +import PageTitle from "./PageTitle" +import ContentMeta from "./ContentMeta" +import Spacer from "./Spacer" +import TableOfContents from "./TableOfContents" +import Explorer from "./Explorer" +import TagList from "./TagList" +import Graph from "./Graph" +import Backlinks from "./Backlinks" +import Search from "./Search" +import Footer from "./Footer" +import DesktopOnly from "./DesktopOnly" +import MobileOnly from "./MobileOnly" +import RecentNotes from "./RecentNotes" +import Breadcrumbs from "./Breadcrumbs" + +export { + ArticleTitle, + Content, + TagContent, + FolderContent, + Darkmode, + Head, + PageTitle, + ContentMeta, + Spacer, + TableOfContents, + Explorer, + TagList, + Graph, + Backlinks, + Search, + Footer, + DesktopOnly, + MobileOnly, + RecentNotes, + NotFound, + Breadcrumbs, +} diff --git a/quartz/components/pages/404.tsx b/quartz/components/pages/404.tsx new file mode 100644 index 0000000..c276f56 --- /dev/null +++ b/quartz/components/pages/404.tsx @@ -0,0 +1,12 @@ +import { QuartzComponentConstructor } from "../types" + +function NotFound() { + return ( +
    +

    404

    +

    Either this page is private or doesn't exist.

    +
    + ) +} + +export default (() => NotFound) satisfies QuartzComponentConstructor diff --git a/quartz/components/pages/Content.tsx b/quartz/components/pages/Content.tsx new file mode 100644 index 0000000..76cecc3 --- /dev/null +++ b/quartz/components/pages/Content.tsx @@ -0,0 +1,9 @@ +import { htmlToJsx } from "../../util/jsx" +import { QuartzComponentConstructor, QuartzComponentProps } from "../types" + +function Content({ fileData, tree }: QuartzComponentProps) { + const content = htmlToJsx(fileData.filePath!, tree) + return
    {content}
    +} + +export default (() => Content) satisfies QuartzComponentConstructor diff --git a/quartz/components/pages/FolderContent.tsx b/quartz/components/pages/FolderContent.tsx new file mode 100644 index 0000000..765f846 --- /dev/null +++ b/quartz/components/pages/FolderContent.tsx @@ -0,0 +1,47 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "../types" +import path from "path" + +import style from "../styles/listPage.scss" +import { PageList } from "../PageList" +import { _stripSlashes, simplifySlug } from "../../util/path" +import { Root } from "hast" +import { pluralize } from "../../util/lang" +import { htmlToJsx } from "../../util/jsx" + +function FolderContent(props: QuartzComponentProps) { + const { tree, fileData, allFiles } = props + const folderSlug = _stripSlashes(simplifySlug(fileData.slug!)) + const allPagesInFolder = allFiles.filter((file) => { + const fileSlug = _stripSlashes(simplifySlug(file.slug!)) + const prefixed = fileSlug.startsWith(folderSlug) && fileSlug !== folderSlug + const folderParts = folderSlug.split(path.posix.sep) + const fileParts = fileSlug.split(path.posix.sep) + const isDirectChild = fileParts.length === folderParts.length + 1 + return prefixed && isDirectChild + }) + + const listProps = { + ...props, + allFiles: allPagesInFolder, + } + + const content = + (tree as Root).children.length === 0 + ? fileData.description + : htmlToJsx(fileData.filePath!, tree) + + return ( +
    +
    +

    {content}

    +
    +

    {pluralize(allPagesInFolder.length, "item")} under this folder.

    +
    + +
    +
    + ) +} + +FolderContent.css = style + PageList.css +export default (() => FolderContent) satisfies QuartzComponentConstructor diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx new file mode 100644 index 0000000..205ba89 --- /dev/null +++ b/quartz/components/pages/TagContent.tsx @@ -0,0 +1,92 @@ +import { QuartzComponentConstructor, QuartzComponentProps } from "../types" +import style from "../styles/listPage.scss" +import { PageList } from "../PageList" +import { FullSlug, getAllSegmentPrefixes, simplifySlug } from "../../util/path" +import { QuartzPluginData } from "../../plugins/vfile" +import { Root } from "hast" +import { pluralize } from "../../util/lang" +import { htmlToJsx } from "../../util/jsx" + +const numPages = 10 +function TagContent(props: QuartzComponentProps) { + const { tree, fileData, allFiles } = props + const slug = fileData.slug + + if (!(slug?.startsWith("tags/") || slug === "tags")) { + throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`) + } + + const tag = simplifySlug(slug.slice("tags/".length) as FullSlug) + const allPagesWithTag = (tag: string) => + allFiles.filter((file) => + (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(tag), + ) + + const content = + (tree as Root).children.length === 0 + ? fileData.description + : htmlToJsx(fileData.filePath!, tree) + + if (tag === "") { + const tags = [...new Set(allFiles.flatMap((data) => data.frontmatter?.tags ?? []))] + const tagItemMap: Map = new Map() + for (const tag of tags) { + tagItemMap.set(tag, allPagesWithTag(tag)) + } + + return ( +
    +
    +

    {content}

    +
    +

    Found {tags.length} total tags.

    +
    + {tags.map((tag) => { + const pages = tagItemMap.get(tag)! + const listProps = { + ...props, + allFiles: pages, + } + + const contentPage = allFiles.filter((file) => file.slug === `tags/${tag}`)[0] + const content = contentPage?.description + return ( +
    +

    + + #{tag} + +

    + {content &&

    {content}

    } +

    + {pluralize(pages.length, "item")} with this tag.{" "} + {pages.length > numPages && `Showing first ${numPages}.`} +

    + +
    + ) + })} +
    +
    + ) + } else { + const pages = allPagesWithTag(tag) + const listProps = { + ...props, + allFiles: pages, + } + + return ( +
    +
    {content}
    +

    {pluralize(pages.length, "item")} with this tag.

    +
    + +
    +
    + ) + } +} + +TagContent.css = style + PageList.css +export default (() => TagContent) satisfies QuartzComponentConstructor diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx new file mode 100644 index 0000000..451813b --- /dev/null +++ b/quartz/components/renderPage.tsx @@ -0,0 +1,154 @@ +import { render } from "preact-render-to-string" +import { QuartzComponent, QuartzComponentProps } from "./types" +import HeaderConstructor from "./Header" +import BodyConstructor from "./Body" +import { JSResourceToScriptElement, StaticResources } from "../util/resources" +import { FullSlug, RelativeURL, joinSegments } from "../util/path" +import { visit } from "unist-util-visit" +import { Root, Element } from "hast" + +interface RenderComponents { + head: QuartzComponent + header: QuartzComponent[] + beforeBody: QuartzComponent[] + pageBody: QuartzComponent + left: QuartzComponent[] + right: QuartzComponent[] + footer: QuartzComponent +} + +export function pageResources( + baseDir: FullSlug | RelativeURL, + staticResources: StaticResources, +): StaticResources { + const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json") + const contentIndexScript = `const fetchData = fetch(\`${contentIndexPath}\`).then(data => data.json())` + + return { + css: [joinSegments(baseDir, "index.css"), ...staticResources.css], + js: [ + { + src: joinSegments(baseDir, "prescript.js"), + loadTime: "beforeDOMReady", + contentType: "external", + }, + { + loadTime: "beforeDOMReady", + contentType: "inline", + spaPreserve: true, + script: contentIndexScript, + }, + ...staticResources.js, + { + src: joinSegments(baseDir, "postscript.js"), + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "external", + }, + ], + } +} + +export function renderPage( + slug: FullSlug, + componentData: QuartzComponentProps, + components: RenderComponents, + pageResources: StaticResources, +): string { + // process transcludes in componentData + visit(componentData.tree as Root, "element", (node, _index, _parent) => { + if (node.tagName === "blockquote") { + const classNames = (node.properties?.className ?? []) as string[] + if (classNames.includes("transclude")) { + const inner = node.children[0] as Element + const blockSlug = inner.properties?.["data-slug"] as FullSlug + const blockRef = node.properties!.dataBlock as string + + // TODO: avoid this expensive find operation and construct an index ahead of time + let blockNode = componentData.allFiles.find((f) => f.slug === blockSlug)?.blocks?.[blockRef] + if (blockNode) { + if (blockNode.tagName === "li") { + blockNode = { + type: "element", + tagName: "ul", + children: [blockNode], + } + } + + node.children = [ + blockNode, + { + type: "element", + tagName: "a", + properties: { href: inner.properties?.href, class: ["internal"] }, + children: [{ type: "text", value: `Link to original` }], + }, + ] + } + } + } + }) + + const { + head: Head, + header, + beforeBody, + pageBody: Content, + left, + right, + footer: Footer, + } = components + const Header = HeaderConstructor() + const Body = BodyConstructor() + + const LeftComponent = ( + + ) + + const RightComponent = ( + + ) + + const doc = ( + + + +
    + + {LeftComponent} +
    + + +
    + {RightComponent} + +
    +
    + + {pageResources.js + .filter((resource) => resource.loadTime === "afterDOMReady") + .map((res) => JSResourceToScriptElement(res))} + + ) + + return "\n" + render(doc) +} diff --git a/quartz/components/scripts/callout.inline.ts b/quartz/components/scripts/callout.inline.ts new file mode 100644 index 0000000..d8cf518 --- /dev/null +++ b/quartz/components/scripts/callout.inline.ts @@ -0,0 +1,44 @@ +function toggleCallout(this: HTMLElement) { + const outerBlock = this.parentElement! + outerBlock.classList.toggle(`is-collapsed`) + const collapsed = outerBlock.classList.contains(`is-collapsed`) + const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight + outerBlock.style.maxHeight = height + `px` + + // walk and adjust height of all parents + let current = outerBlock + let parent = outerBlock.parentElement + while (parent) { + if (!parent.classList.contains(`callout`)) { + return + } + + const collapsed = parent.classList.contains(`is-collapsed`) + const height = collapsed ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight + parent.style.maxHeight = height + `px` + + current = parent + parent = parent.parentElement + } +} + +function setupCallout() { + const collapsible = document.getElementsByClassName( + `callout is-collapsible`, + ) as HTMLCollectionOf + for (const div of collapsible) { + const title = div.firstElementChild + + if (title) { + title.removeEventListener(`click`, toggleCallout) + title.addEventListener(`click`, toggleCallout) + + const collapsed = div.classList.contains(`is-collapsed`) + const height = collapsed ? title.scrollHeight : div.scrollHeight + div.style.maxHeight = height + `px` + } + } +} + +document.addEventListener(`nav`, setupCallout) +window.addEventListener(`resize`, setupCallout) diff --git a/quartz/components/scripts/clipboard.inline.ts b/quartz/components/scripts/clipboard.inline.ts new file mode 100644 index 0000000..c604c9b --- /dev/null +++ b/quartz/components/scripts/clipboard.inline.ts @@ -0,0 +1,33 @@ +const svgCopy = + '' +const svgCheck = + '' + +document.addEventListener("nav", () => { + const els = document.getElementsByTagName("pre") + for (let i = 0; i < els.length; i++) { + const codeBlock = els[i].getElementsByTagName("code")[0] + if (codeBlock) { + const source = codeBlock.innerText.replace(/\n\n/g, "\n") + const button = document.createElement("button") + button.className = "clipboard-button" + button.type = "button" + button.innerHTML = svgCopy + button.ariaLabel = "Copy source" + button.addEventListener("click", () => { + navigator.clipboard.writeText(source).then( + () => { + button.blur() + button.innerHTML = svgCheck + setTimeout(() => { + button.innerHTML = svgCopy + button.style.borderColor = "" + }, 2000) + }, + (error) => console.error(error), + ) + }) + els[i].prepend(button) + } + } +}) diff --git a/quartz/components/scripts/darkmode.inline.ts b/quartz/components/scripts/darkmode.inline.ts new file mode 100644 index 0000000..c42a367 --- /dev/null +++ b/quartz/components/scripts/darkmode.inline.ts @@ -0,0 +1,32 @@ +const userPref = window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark" +const currentTheme = localStorage.getItem("theme") ?? userPref +document.documentElement.setAttribute("saved-theme", currentTheme) + +document.addEventListener("nav", () => { + const switchTheme = (e: any) => { + if (e.target.checked) { + document.documentElement.setAttribute("saved-theme", "dark") + localStorage.setItem("theme", "dark") + } else { + document.documentElement.setAttribute("saved-theme", "light") + localStorage.setItem("theme", "light") + } + } + + // Darkmode toggle + const toggleSwitch = document.querySelector("#darkmode-toggle") as HTMLInputElement + toggleSwitch.removeEventListener("change", switchTheme) + toggleSwitch.addEventListener("change", switchTheme) + if (currentTheme === "dark") { + toggleSwitch.checked = true + } + + // Listen for changes in prefers-color-scheme + const colorSchemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)") + colorSchemeMediaQuery.addEventListener("change", (e) => { + const newTheme = e.matches ? "dark" : "light" + document.documentElement.setAttribute("saved-theme", newTheme) + localStorage.setItem("theme", newTheme) + toggleSwitch.checked = e.matches + }) +}) diff --git a/quartz/components/scripts/explorer.inline.ts b/quartz/components/scripts/explorer.inline.ts new file mode 100644 index 0000000..9fe1865 --- /dev/null +++ b/quartz/components/scripts/explorer.inline.ts @@ -0,0 +1,164 @@ +import { FolderState } from "../ExplorerNode" + +// Current state of folders +let explorerState: FolderState[] + +const observer = new IntersectionObserver((entries) => { + // If last element is observed, remove gradient of "overflow" class so element is visible + const explorer = document.getElementById("explorer-ul") + for (const entry of entries) { + if (entry.isIntersecting) { + explorer?.classList.add("no-background") + } else { + explorer?.classList.remove("no-background") + } + } +}) + +function toggleExplorer(this: HTMLElement) { + // Toggle collapsed state of entire explorer + this.classList.toggle("collapsed") + const content = this.nextElementSibling as HTMLElement + content.classList.toggle("collapsed") + content.style.maxHeight = content.style.maxHeight === "0px" ? content.scrollHeight + "px" : "0px" +} + +function toggleFolder(evt: MouseEvent) { + evt.stopPropagation() + + // Element that was clicked + const target = evt.target as HTMLElement + + // Check if target was svg icon or button + const isSvg = target.nodeName === "svg" + + // corresponding
      element relative to clicked button/folder + let childFolderContainer: HTMLElement + + //
    • element of folder (stores folder-path dataset) + let currentFolderParent: HTMLElement + + // Get correct relative container and toggle collapsed class + if (isSvg) { + childFolderContainer = target.parentElement?.nextSibling as HTMLElement + currentFolderParent = target.nextElementSibling as HTMLElement + + childFolderContainer.classList.toggle("open") + } else { + childFolderContainer = target.parentElement?.parentElement?.nextElementSibling as HTMLElement + currentFolderParent = target.parentElement as HTMLElement + + childFolderContainer.classList.toggle("open") + } + if (!childFolderContainer) return + + // Collapse folder container + const isCollapsed = childFolderContainer.classList.contains("open") + setFolderState(childFolderContainer, !isCollapsed) + + // Save folder state to localStorage + const clickFolderPath = currentFolderParent.dataset.folderpath as string + + // Remove leading "/" + const fullFolderPath = clickFolderPath.substring(1) + toggleCollapsedByPath(explorerState, fullFolderPath) + + const stringifiedFileTree = JSON.stringify(explorerState) + localStorage.setItem("fileTree", stringifiedFileTree) +} + +function setupExplorer() { + // Set click handler for collapsing entire explorer + const explorer = document.getElementById("explorer") + + // Get folder state from local storage + const storageTree = localStorage.getItem("fileTree") + + // Convert to bool + const useSavedFolderState = explorer?.dataset.savestate === "true" + + if (explorer) { + // Get config + const collapseBehavior = explorer.dataset.behavior + + // Add click handlers for all folders (click handler on folder "label") + if (collapseBehavior === "collapse") { + Array.prototype.forEach.call( + document.getElementsByClassName("folder-button"), + function (item) { + item.removeEventListener("click", toggleFolder) + item.addEventListener("click", toggleFolder) + }, + ) + } + + // Add click handler to main explorer + explorer.removeEventListener("click", toggleExplorer) + explorer.addEventListener("click", toggleExplorer) + } + + // Set up click handlers for each folder (click handler on folder "icon") + Array.prototype.forEach.call(document.getElementsByClassName("folder-icon"), function (item) { + item.removeEventListener("click", toggleFolder) + item.addEventListener("click", toggleFolder) + }) + + if (storageTree && useSavedFolderState) { + // Get state from localStorage and set folder state + explorerState = JSON.parse(storageTree) + explorerState.map((folderUl) => { + // grab
    • element for matching folder path + const folderLi = document.querySelector( + `[data-folderpath='/${folderUl.path}']`, + ) as HTMLElement + + // Get corresponding content
        tag and set state + if (folderLi) { + const folderUL = folderLi.parentElement?.nextElementSibling + if (folderUL) { + setFolderState(folderUL as HTMLElement, folderUl.collapsed) + } + } + }) + } else { + // If tree is not in localStorage or config is disabled, use tree passed from Explorer as dataset + explorerState = JSON.parse(explorer?.dataset.tree as string) + } +} + +window.addEventListener("resize", setupExplorer) +document.addEventListener("nav", () => { + setupExplorer() + + const explorerContent = document.getElementById("explorer-ul") + // select pseudo element at end of list + const lastItem = document.getElementById("explorer-end") + + observer.disconnect() + observer.observe(lastItem as Element) +}) + +/** + * Toggles the state of a given folder + * @param folderElement
        Element of folder (parent) + * @param collapsed if folder should be set to collapsed or not + */ +function setFolderState(folderElement: HTMLElement, collapsed: boolean) { + if (collapsed) { + folderElement?.classList.remove("open") + } else { + folderElement?.classList.add("open") + } +} + +/** + * Toggles visibility of a folder + * @param array array of FolderState (`fileTree`, either get from local storage or data attribute) + * @param path path to folder (e.g. 'advanced/more/more2') + */ +function toggleCollapsedByPath(array: FolderState[], path: string) { + const entry = array.find((item) => item.path === path) + if (entry) { + entry.collapsed = !entry.collapsed + } +} diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts new file mode 100644 index 0000000..1aff138 --- /dev/null +++ b/quartz/components/scripts/graph.inline.ts @@ -0,0 +1,328 @@ +import type { ContentDetails } from "../../plugins/emitters/contentIndex" +import * as d3 from "d3" +import { registerEscapeHandler, removeAllChildren } from "./util" +import { FullSlug, SimpleSlug, getFullSlug, resolveRelative, simplifySlug } from "../../util/path" + +type NodeData = { + id: SimpleSlug + text: string + tags: string[] +} & d3.SimulationNodeDatum + +type LinkData = { + source: SimpleSlug + target: SimpleSlug +} + +const localStorageKey = "graph-visited" +function getVisited(): Set { + return new Set(JSON.parse(localStorage.getItem(localStorageKey) ?? "[]")) +} + +function addToVisited(slug: SimpleSlug) { + const visited = getVisited() + visited.add(slug) + localStorage.setItem(localStorageKey, JSON.stringify([...visited])) +} + +async function renderGraph(container: string, fullSlug: FullSlug) { + const slug = simplifySlug(fullSlug) + const visited = getVisited() + const graph = document.getElementById(container) + if (!graph) return + removeAllChildren(graph) + + let { + drag: enableDrag, + zoom: enableZoom, + depth, + scale, + repelForce, + centerForce, + linkDistance, + fontSize, + opacityScale, + removeTags, + showTags, + } = JSON.parse(graph.dataset["cfg"]!) + + const data = await fetchData + + const links: LinkData[] = [] + const tags: SimpleSlug[] = [] + + const validLinks = new Set(Object.keys(data).map((slug) => simplifySlug(slug as FullSlug))) + + for (const [src, details] of Object.entries(data)) { + const source = simplifySlug(src as FullSlug) + const outgoing = details.links ?? [] + + for (const dest of outgoing) { + if (validLinks.has(dest)) { + links.push({ source, target: dest }) + } + } + + if (showTags) { + const localTags = details.tags + .filter((tag) => !removeTags.includes(tag)) + .map((tag) => simplifySlug(("tags/" + tag) as FullSlug)) + + tags.push(...localTags.filter((tag) => !tags.includes(tag))) + + for (const tag of localTags) { + links.push({ source, target: tag }) + } + } + } + + const neighbourhood = new Set() + const wl: (SimpleSlug | "__SENTINEL")[] = [slug, "__SENTINEL"] + if (depth >= 0) { + while (depth >= 0 && wl.length > 0) { + // compute neighbours + const cur = wl.shift()! + if (cur === "__SENTINEL") { + depth-- + wl.push("__SENTINEL") + } else { + neighbourhood.add(cur) + const outgoing = links.filter((l) => l.source === cur) + const incoming = links.filter((l) => l.target === cur) + wl.push(...outgoing.map((l) => l.target), ...incoming.map((l) => l.source)) + } + } + } else { + Object.keys(data).forEach((id) => neighbourhood.add(simplifySlug(id as FullSlug))) + if (showTags) tags.forEach((tag) => neighbourhood.add(tag)) + } + + const graphData: { nodes: NodeData[]; links: LinkData[] } = { + nodes: [...neighbourhood].map((url) => { + const text = url.startsWith("tags/") ? "#" + url.substring(5) : data[url]?.title ?? url + return { + id: url, + text: text, + tags: data[url]?.tags ?? [], + } + }), + links: links.filter((l) => neighbourhood.has(l.source) && neighbourhood.has(l.target)), + } + + const simulation: d3.Simulation = d3 + .forceSimulation(graphData.nodes) + .force("charge", d3.forceManyBody().strength(-100 * repelForce)) + .force( + "link", + d3 + .forceLink(graphData.links) + .id((d: any) => d.id) + .distance(linkDistance), + ) + .force("center", d3.forceCenter().strength(centerForce)) + + const height = Math.max(graph.offsetHeight, 250) + const width = graph.offsetWidth + + const svg = d3 + .select("#" + container) + .append("svg") + .attr("width", width) + .attr("height", height) + .attr("viewBox", [-width / 2 / scale, -height / 2 / scale, width / scale, height / scale]) + + // draw links between nodes + const link = svg + .append("g") + .selectAll("line") + .data(graphData.links) + .join("line") + .attr("class", "link") + .attr("stroke", "var(--lightgray)") + .attr("stroke-width", 1) + + // svg groups + const graphNode = svg.append("g").selectAll("g").data(graphData.nodes).enter().append("g") + + // calculate color + const color = (d: NodeData) => { + const isCurrent = d.id === slug + if (isCurrent) { + return "var(--secondary)" + } else if (visited.has(d.id) || d.id.startsWith("tags/")) { + return "var(--tertiary)" + } else { + return "var(--gray)" + } + } + + const drag = (simulation: d3.Simulation) => { + function dragstarted(event: any, d: NodeData) { + if (!event.active) simulation.alphaTarget(1).restart() + d.fx = d.x + d.fy = d.y + } + + function dragged(event: any, d: NodeData) { + d.fx = event.x + d.fy = event.y + } + + function dragended(event: any, d: NodeData) { + if (!event.active) simulation.alphaTarget(0) + d.fx = null + d.fy = null + } + + const noop = () => {} + return d3 + .drag() + .on("start", enableDrag ? dragstarted : noop) + .on("drag", enableDrag ? dragged : noop) + .on("end", enableDrag ? dragended : noop) + } + + function nodeRadius(d: NodeData) { + const numLinks = links.filter((l: any) => l.source.id === d.id || l.target.id === d.id).length + return 2 + Math.sqrt(numLinks) + } + + // draw individual nodes + const node = graphNode + .append("circle") + .attr("class", "node") + .attr("id", (d) => d.id) + .attr("r", nodeRadius) + .attr("fill", color) + .style("cursor", "pointer") + .on("click", (_, d) => { + const targ = resolveRelative(fullSlug, d.id) + window.spaNavigate(new URL(targ, window.location.toString())) + }) + .on("mouseover", function (_, d) { + const neighbours: SimpleSlug[] = data[fullSlug].links ?? [] + const neighbourNodes = d3 + .selectAll(".node") + .filter((d) => neighbours.includes(d.id)) + const currentId = d.id + const linkNodes = d3 + .selectAll(".link") + .filter((d: any) => d.source.id === currentId || d.target.id === currentId) + + // highlight neighbour nodes + neighbourNodes.transition().duration(200).attr("fill", color) + + // highlight links + linkNodes.transition().duration(200).attr("stroke", "var(--gray)").attr("stroke-width", 1) + + const bigFont = fontSize * 1.5 + + // show text for self + const parent = this.parentNode as HTMLElement + d3.select(parent) + .raise() + .select("text") + .transition() + .duration(200) + .attr("opacityOld", d3.select(parent).select("text").style("opacity")) + .style("opacity", 1) + .style("font-size", bigFont + "em") + }) + .on("mouseleave", function (_, d) { + const currentId = d.id + const linkNodes = d3 + .selectAll(".link") + .filter((d: any) => d.source.id === currentId || d.target.id === currentId) + + linkNodes.transition().duration(200).attr("stroke", "var(--lightgray)") + + const parent = this.parentNode as HTMLElement + d3.select(parent) + .select("text") + .transition() + .duration(200) + .style("opacity", d3.select(parent).select("text").attr("opacityOld")) + .style("font-size", fontSize + "em") + }) + // @ts-ignore + .call(drag(simulation)) + + // draw labels + const labels = graphNode + .append("text") + .attr("dx", 0) + .attr("dy", (d) => -nodeRadius(d) + "px") + .attr("text-anchor", "middle") + .text((d) => d.text) + .style("opacity", (opacityScale - 1) / 3.75) + .style("pointer-events", "none") + .style("font-size", fontSize + "em") + .raise() + // @ts-ignore + .call(drag(simulation)) + + // set panning + if (enableZoom) { + svg.call( + d3 + .zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.25, 4]) + .on("zoom", ({ transform }) => { + link.attr("transform", transform) + node.attr("transform", transform) + const scale = transform.k * opacityScale + const scaledOpacity = Math.max((scale - 1) / 3.75, 0) + labels.attr("transform", transform).style("opacity", scaledOpacity) + }), + ) + } + + // progress the simulation + simulation.on("tick", () => { + link + .attr("x1", (d: any) => d.source.x) + .attr("y1", (d: any) => d.source.y) + .attr("x2", (d: any) => d.target.x) + .attr("y2", (d: any) => d.target.y) + node.attr("cx", (d: any) => d.x).attr("cy", (d: any) => d.y) + labels.attr("x", (d: any) => d.x).attr("y", (d: any) => d.y) + }) +} + +function renderGlobalGraph() { + const slug = getFullSlug(window) + const container = document.getElementById("global-graph-outer") + const sidebar = container?.closest(".sidebar") as HTMLElement + container?.classList.add("active") + if (sidebar) { + sidebar.style.zIndex = "1" + } + + renderGraph("global-graph-container", slug) + + function hideGlobalGraph() { + container?.classList.remove("active") + const graph = document.getElementById("global-graph-container") + if (sidebar) { + sidebar.style.zIndex = "unset" + } + if (!graph) return + removeAllChildren(graph) + } + + registerEscapeHandler(container, hideGlobalGraph) +} + +document.addEventListener("nav", async (e: unknown) => { + const slug = (e as CustomEventMap["nav"]).detail.url + addToVisited(slug) + await renderGraph("graph-container", slug) + + const containerIcon = document.getElementById("global-graph-icon") + containerIcon?.removeEventListener("click", renderGlobalGraph) + containerIcon?.addEventListener("click", renderGlobalGraph) +}) diff --git a/quartz/components/scripts/plausible.inline.ts b/quartz/components/scripts/plausible.inline.ts new file mode 100644 index 0000000..704f5d5 --- /dev/null +++ b/quartz/components/scripts/plausible.inline.ts @@ -0,0 +1,3 @@ +import Plausible from "plausible-tracker" +const { trackPageview } = Plausible() +document.addEventListener("nav", () => trackPageview()) diff --git a/quartz/components/scripts/popover.inline.ts b/quartz/components/scripts/popover.inline.ts new file mode 100644 index 0000000..ed3c925 --- /dev/null +++ b/quartz/components/scripts/popover.inline.ts @@ -0,0 +1,83 @@ +import { computePosition, flip, inline, shift } from "@floating-ui/dom" + +// from micromorph/src/utils.ts +// https://github.com/natemoo-re/micromorph/blob/main/src/utils.ts#L5 +export function normalizeRelativeURLs(el: Element | Document, base: string | URL) { + const update = (el: Element, attr: string, base: string | URL) => { + el.setAttribute(attr, new URL(el.getAttribute(attr)!, base).pathname) + } + + el.querySelectorAll('[href^="./"], [href^="../"]').forEach((item) => update(item, "href", base)) + + el.querySelectorAll('[src^="./"], [src^="../"]').forEach((item) => update(item, "src", base)) +} + +const p = new DOMParser() +async function mouseEnterHandler( + this: HTMLLinkElement, + { clientX, clientY }: { clientX: number; clientY: number }, +) { + const link = this + async function setPosition(popoverElement: HTMLElement) { + const { x, y } = await computePosition(link, popoverElement, { + middleware: [inline({ x: clientX, y: clientY }), shift(), flip()], + }) + Object.assign(popoverElement.style, { + left: `${x}px`, + top: `${y}px`, + }) + } + + // dont refetch if there's already a popover + if ([...link.children].some((child) => child.classList.contains("popover"))) { + return setPosition(link.lastChild as HTMLElement) + } + + const thisUrl = new URL(document.location.href) + thisUrl.hash = "" + thisUrl.search = "" + const targetUrl = new URL(link.href) + const hash = targetUrl.hash + targetUrl.hash = "" + targetUrl.search = "" + // prevent hover of the same page + if (thisUrl.toString() === targetUrl.toString()) return + + const contents = await fetch(`${targetUrl}`) + .then((res) => res.text()) + .catch((err) => { + console.error(err) + }) + + if (!contents) return + const html = p.parseFromString(contents, "text/html") + normalizeRelativeURLs(html, targetUrl) + const elts = [...html.getElementsByClassName("popover-hint")] + if (elts.length === 0) return + + const popoverElement = document.createElement("div") + popoverElement.classList.add("popover") + const popoverInner = document.createElement("div") + popoverInner.classList.add("popover-inner") + popoverElement.appendChild(popoverInner) + elts.forEach((elt) => popoverInner.appendChild(elt)) + + setPosition(popoverElement) + link.appendChild(popoverElement) + + if (hash !== "") { + const heading = popoverInner.querySelector(hash) as HTMLElement | null + if (heading) { + // leave ~12px of buffer when scrolling to a heading + popoverInner.scroll({ top: heading.offsetTop - 12, behavior: "instant" }) + } + } +} + +document.addEventListener("nav", () => { + const links = [...document.getElementsByClassName("internal")] as HTMLLinkElement[] + for (const link of links) { + link.removeEventListener("mouseenter", mouseEnterHandler) + link.addEventListener("mouseenter", mouseEnterHandler) + } +}) diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts new file mode 100644 index 0000000..eff4eb1 --- /dev/null +++ b/quartz/components/scripts/search.inline.ts @@ -0,0 +1,352 @@ +import { Document, SimpleDocumentSearchResultSetUnit } from "flexsearch" +import { ContentDetails } from "../../plugins/emitters/contentIndex" +import { registerEscapeHandler, removeAllChildren } from "./util" +import { FullSlug, resolveRelative } from "../../util/path" + +interface Item { + id: number + slug: FullSlug + title: string + content: string + tags: string[] +} + +let index: Document | undefined = undefined + +// Can be expanded with things like "term" in the future +type SearchType = "basic" | "tags" + +// Current searchType +let searchType: SearchType = "basic" + +const contextWindowWords = 30 +const numSearchResults = 5 +const numTagResults = 3 +function highlight(searchTerm: string, text: string, trim?: boolean) { + // try to highlight longest tokens first + const tokenizedTerms = searchTerm + .split(/\s+/) + .filter((t) => t !== "") + .sort((a, b) => b.length - a.length) + let tokenizedText = text.split(/\s+/).filter((t) => t !== "") + + let startIndex = 0 + let endIndex = tokenizedText.length - 1 + if (trim) { + const includesCheck = (tok: string) => + tokenizedTerms.some((term) => tok.toLowerCase().startsWith(term.toLowerCase())) + const occurencesIndices = tokenizedText.map(includesCheck) + + let bestSum = 0 + let bestIndex = 0 + for (let i = 0; i < Math.max(tokenizedText.length - contextWindowWords, 0); i++) { + const window = occurencesIndices.slice(i, i + contextWindowWords) + const windowSum = window.reduce((total, cur) => total + (cur ? 1 : 0), 0) + if (windowSum >= bestSum) { + bestSum = windowSum + bestIndex = i + } + } + + startIndex = Math.max(bestIndex - contextWindowWords, 0) + endIndex = Math.min(startIndex + 2 * contextWindowWords, tokenizedText.length - 1) + tokenizedText = tokenizedText.slice(startIndex, endIndex) + } + + const slice = tokenizedText + .map((tok) => { + // see if this tok is prefixed by any search terms + for (const searchTok of tokenizedTerms) { + if (tok.toLowerCase().includes(searchTok.toLowerCase())) { + const regex = new RegExp(searchTok.toLowerCase(), "gi") + return tok.replace(regex, `$&`) + } + } + return tok + }) + .join(" ") + + return `${startIndex === 0 ? "" : "..."}${slice}${ + endIndex === tokenizedText.length - 1 ? "" : "..." + }` +} + +const encoder = (str: string) => str.toLowerCase().split(/([^a-z]|[^\x00-\x7F])/) +let prevShortcutHandler: ((e: HTMLElementEventMap["keydown"]) => void) | undefined = undefined +document.addEventListener("nav", async (e: unknown) => { + const currentSlug = (e as CustomEventMap["nav"]).detail.url + + const data = await fetchData + const container = document.getElementById("search-container") + const sidebar = container?.closest(".sidebar") as HTMLElement + const searchIcon = document.getElementById("search-icon") + const searchBar = document.getElementById("search-bar") as HTMLInputElement | null + const results = document.getElementById("results-container") + const resultCards = document.getElementsByClassName("result-card") + const idDataMap = Object.keys(data) as FullSlug[] + + function hideSearch() { + container?.classList.remove("active") + if (searchBar) { + searchBar.value = "" // clear the input when we dismiss the search + } + if (sidebar) { + sidebar.style.zIndex = "unset" + } + if (results) { + removeAllChildren(results) + } + + searchType = "basic" // reset search type after closing + } + + function showSearch(searchTypeNew: SearchType) { + searchType = searchTypeNew + if (sidebar) { + sidebar.style.zIndex = "1" + } + container?.classList.add("active") + searchBar?.focus() + } + + function shortcutHandler(e: HTMLElementEventMap["keydown"]) { + if (e.key === "k" && (e.ctrlKey || e.metaKey) && !e.shiftKey) { + e.preventDefault() + const searchBarOpen = container?.classList.contains("active") + searchBarOpen ? hideSearch() : showSearch("basic") + } else if (e.shiftKey && (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "k") { + // Hotkey to open tag search + e.preventDefault() + const searchBarOpen = container?.classList.contains("active") + searchBarOpen ? hideSearch() : showSearch("tags") + + // add "#" prefix for tag search + if (searchBar) searchBar.value = "#" + } else if (e.key === "Enter") { + // If result has focus, navigate to that one, otherwise pick first result + if (results?.contains(document.activeElement)) { + const active = document.activeElement as HTMLInputElement + active.click() + } else { + const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null + anchor?.click() + } + } else if (e.key === "ArrowDown") { + e.preventDefault() + // When first pressing ArrowDown, results wont contain the active element, so focus first element + if (!results?.contains(document.activeElement)) { + const firstResult = resultCards[0] as HTMLInputElement | null + firstResult?.focus() + } else { + // If an element in results-container already has focus, focus next one + const nextResult = document.activeElement?.nextElementSibling as HTMLInputElement | null + nextResult?.focus() + } + } else if (e.key === "ArrowUp") { + e.preventDefault() + if (results?.contains(document.activeElement)) { + // If an element in results-container already has focus, focus previous one + const prevResult = document.activeElement?.previousElementSibling as HTMLInputElement | null + prevResult?.focus() + } + } + } + + function trimContent(content: string) { + // works without escaping html like in `description.ts` + const sentences = content.replace(/\s+/g, " ").split(".") + let finalDesc = "" + let sentenceIdx = 0 + + // Roughly estimate characters by (words * 5). Matches description length in `description.ts`. + const len = contextWindowWords * 5 + while (finalDesc.length < len) { + const sentence = sentences[sentenceIdx] + if (!sentence) break + finalDesc += sentence + "." + sentenceIdx++ + } + + // If more content would be available, indicate it by finishing with "..." + if (finalDesc.length < content.length) { + finalDesc += ".." + } + + return finalDesc + } + + const formatForDisplay = (term: string, id: number) => { + const slug = idDataMap[id] + return { + id, + slug, + title: searchType === "tags" ? data[slug].title : highlight(term, data[slug].title ?? ""), + // if searchType is tag, display context from start of file and trim, otherwise use regular highlight + content: + searchType === "tags" + ? trimContent(data[slug].content) + : highlight(term, data[slug].content ?? "", true), + tags: highlightTags(term, data[slug].tags), + } + } + + function highlightTags(term: string, tags: string[]) { + if (tags && searchType === "tags") { + // Find matching tags + const termLower = term.toLowerCase() + let matching = tags.filter((str) => str.includes(termLower)) + + // Substract matching from original tags, then push difference + if (matching.length > 0) { + let difference = tags.filter((x) => !matching.includes(x)) + + // Convert to html (cant be done later as matches/term dont get passed to `resultToHTML`) + matching = matching.map((tag) => `
      • #${tag}

      • `) + difference = difference.map((tag) => `
      • #${tag}

      • `) + matching.push(...difference) + } + + // Only allow max of `numTagResults` in preview + if (tags.length > numTagResults) { + matching.splice(numTagResults) + } + + return matching + } else { + return [] + } + } + + const resultToHTML = ({ slug, title, content, tags }: Item) => { + const htmlTags = tags.length > 0 ? `
          ${tags.join("")}
        ` : `` + const button = document.createElement("button") + button.classList.add("result-card") + button.id = slug + button.innerHTML = `

        ${title}

        ${htmlTags}

        ${content}

        ` + button.addEventListener("click", () => { + const targ = resolveRelative(currentSlug, slug) + window.spaNavigate(new URL(targ, window.location.toString())) + hideSearch() + }) + return button + } + + function displayResults(finalResults: Item[]) { + if (!results) return + + removeAllChildren(results) + if (finalResults.length === 0) { + results.innerHTML = `` + } else { + results.append(...finalResults.map(resultToHTML)) + } + } + + async function onType(e: HTMLElementEventMap["input"]) { + let term = (e.target as HTMLInputElement).value + let searchResults: SimpleDocumentSearchResultSetUnit[] + + if (term.toLowerCase().startsWith("#")) { + searchType = "tags" + } else { + searchType = "basic" + } + + switch (searchType) { + case "tags": { + term = term.substring(1) + searchResults = + (await index?.searchAsync({ query: term, limit: numSearchResults, index: ["tags"] })) ?? + [] + break + } + case "basic": + default: { + searchResults = + (await index?.searchAsync({ + query: term, + limit: numSearchResults, + index: ["title", "content"], + })) ?? [] + } + } + + const getByField = (field: string): number[] => { + const results = searchResults.filter((x) => x.field === field) + return results.length === 0 ? [] : ([...results[0].result] as number[]) + } + + // order titles ahead of content + const allIds: Set = new Set([ + ...getByField("title"), + ...getByField("content"), + ...getByField("tags"), + ]) + const finalResults = [...allIds].map((id) => formatForDisplay(term, id)) + displayResults(finalResults) + } + + if (prevShortcutHandler) { + document.removeEventListener("keydown", prevShortcutHandler) + } + + document.addEventListener("keydown", shortcutHandler) + prevShortcutHandler = shortcutHandler + searchIcon?.removeEventListener("click", () => showSearch("basic")) + searchIcon?.addEventListener("click", () => showSearch("basic")) + searchBar?.removeEventListener("input", onType) + searchBar?.addEventListener("input", onType) + + // setup index if it hasn't been already + if (!index) { + index = new Document({ + charset: "latin:extra", + optimize: true, + encode: encoder, + document: { + id: "id", + index: [ + { + field: "title", + tokenize: "reverse", + }, + { + field: "content", + tokenize: "reverse", + }, + { + field: "tags", + tokenize: "reverse", + }, + ], + }, + }) + + fillDocument(index, data) + } + + // register handlers + registerEscapeHandler(container, hideSearch) +}) + +/** + * Fills flexsearch document with data + * @param index index to fill + * @param data data to fill index with + */ +async function fillDocument(index: Document, data: any) { + let id = 0 + for (const [slug, fileData] of Object.entries(data)) { + await index.addAsync(id, { + id, + slug: slug as FullSlug, + title: fileData.title, + content: fileData.content, + tags: fileData.tags, + }) + id++ + } +} diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts new file mode 100644 index 0000000..31ae14f --- /dev/null +++ b/quartz/components/scripts/spa.inline.ts @@ -0,0 +1,156 @@ +import micromorph from "micromorph" +import { FullSlug, RelativeURL, getFullSlug } from "../../util/path" + +// adapted from `micromorph` +// https://github.com/natemoo-re/micromorph + +const NODE_TYPE_ELEMENT = 1 +let announcer = document.createElement("route-announcer") +const isElement = (target: EventTarget | null): target is Element => + (target as Node)?.nodeType === NODE_TYPE_ELEMENT +const isLocalUrl = (href: string) => { + try { + const url = new URL(href) + if (window.location.origin === url.origin) { + return true + } + } catch (e) {} + return false +} + +const getOpts = ({ target }: Event): { url: URL; scroll?: boolean } | undefined => { + if (!isElement(target)) return + if (target.attributes.getNamedItem("target")?.value === "_blank") return + const a = target.closest("a") + if (!a) return + if ("routerIgnore" in a.dataset) return + const { href } = a + if (!isLocalUrl(href)) return + return { url: new URL(href), scroll: "routerNoscroll" in a.dataset ? false : undefined } +} + +function notifyNav(url: FullSlug) { + const event: CustomEventMap["nav"] = new CustomEvent("nav", { detail: { url } }) + document.dispatchEvent(event) +} + +let p: DOMParser +async function navigate(url: URL, isBack: boolean = false) { + p = p || new DOMParser() + const contents = await fetch(`${url}`) + .then((res) => res.text()) + .catch(() => { + window.location.assign(url) + }) + + if (!contents) return + + const html = p.parseFromString(contents, "text/html") + let title = html.querySelector("title")?.textContent + if (title) { + document.title = title + } else { + const h1 = document.querySelector("h1") + title = h1?.innerText ?? h1?.textContent ?? url.pathname + } + if (announcer.textContent !== title) { + announcer.textContent = title + } + announcer.dataset.persist = "" + html.body.appendChild(announcer) + + // morph body + micromorph(document.body, html.body) + + // scroll into place and add history + if (!isBack) { + if (url.hash) { + const el = document.getElementById(decodeURIComponent(url.hash.substring(1))) + el?.scrollIntoView() + } else { + window.scrollTo({ top: 0 }) + } + } + + // now, patch head + const elementsToRemove = document.head.querySelectorAll(":not([spa-preserve])") + elementsToRemove.forEach((el) => el.remove()) + const elementsToAdd = html.head.querySelectorAll(":not([spa-preserve])") + elementsToAdd.forEach((el) => document.head.appendChild(el)) + + // delay setting the url until now + // at this point everything is loaded so changing the url should resolve to the correct addresses + if (!isBack) { + history.pushState({}, "", url) + } + notifyNav(getFullSlug(window)) + delete announcer.dataset.persist +} + +window.spaNavigate = navigate + +function createRouter() { + if (typeof window !== "undefined") { + window.addEventListener("click", async (event) => { + const { url } = getOpts(event) ?? {} + if (!url || event.ctrlKey || event.metaKey) return + event.preventDefault() + try { + navigate(url, false) + } catch (e) { + window.location.assign(url) + } + }) + + window.addEventListener("popstate", (event) => { + const { url } = getOpts(event) ?? {} + if (window.location.hash && window.location.pathname === url?.pathname) return + try { + navigate(new URL(window.location.toString()), true) + } catch (e) { + window.location.reload() + } + return + }) + } + + return new (class Router { + go(pathname: RelativeURL) { + const url = new URL(pathname, window.location.toString()) + return navigate(url, false) + } + + back() { + return window.history.back() + } + + forward() { + return window.history.forward() + } + })() +} + +createRouter() +notifyNav(getFullSlug(window)) + +if (!customElements.get("route-announcer")) { + const attrs = { + "aria-live": "assertive", + "aria-atomic": "true", + style: + "position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px", + } + customElements.define( + "route-announcer", + class RouteAnnouncer extends HTMLElement { + constructor() { + super() + } + connectedCallback() { + for (const [key, value] of Object.entries(attrs)) { + this.setAttribute(key, value) + } + } + }, + ) +} diff --git a/quartz/components/scripts/toc.inline.ts b/quartz/components/scripts/toc.inline.ts new file mode 100644 index 0000000..f3da52c --- /dev/null +++ b/quartz/components/scripts/toc.inline.ts @@ -0,0 +1,43 @@ +const bufferPx = 150 +const observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const slug = entry.target.id + const tocEntryElement = document.querySelector(`a[data-for="${slug}"]`) + const windowHeight = entry.rootBounds?.height + if (windowHeight && tocEntryElement) { + if (entry.boundingClientRect.y < windowHeight) { + tocEntryElement.classList.add("in-view") + } else { + tocEntryElement.classList.remove("in-view") + } + } + } +}) + +function toggleToc(this: HTMLElement) { + this.classList.toggle("collapsed") + const content = this.nextElementSibling as HTMLElement + content.classList.toggle("collapsed") + content.style.maxHeight = content.style.maxHeight === "0px" ? content.scrollHeight + "px" : "0px" +} + +function setupToc() { + const toc = document.getElementById("toc") + if (toc) { + const collapsed = toc.classList.contains("collapsed") + const content = toc.nextElementSibling as HTMLElement + content.style.maxHeight = collapsed ? "0px" : content.scrollHeight + "px" + toc.removeEventListener("click", toggleToc) + toc.addEventListener("click", toggleToc) + } +} + +window.addEventListener("resize", setupToc) +document.addEventListener("nav", () => { + setupToc() + + // update toc entry highlighting + observer.disconnect() + const headers = document.querySelectorAll("h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]") + headers.forEach((header) => observer.observe(header)) +}) diff --git a/quartz/components/scripts/util.ts b/quartz/components/scripts/util.ts new file mode 100644 index 0000000..5fcabad --- /dev/null +++ b/quartz/components/scripts/util.ts @@ -0,0 +1,25 @@ +export function registerEscapeHandler(outsideContainer: HTMLElement | null, cb: () => void) { + if (!outsideContainer) return + function click(this: HTMLElement, e: HTMLElementEventMap["click"]) { + if (e.target !== this) return + e.preventDefault() + cb() + } + + function esc(e: HTMLElementEventMap["keydown"]) { + if (!e.key.startsWith("Esc")) return + e.preventDefault() + cb() + } + + outsideContainer?.removeEventListener("click", click) + outsideContainer?.addEventListener("click", click) + document.removeEventListener("keydown", esc) + document.addEventListener("keydown", esc) +} + +export function removeAllChildren(node: HTMLElement) { + while (node.firstChild) { + node.removeChild(node.firstChild) + } +} diff --git a/quartz/components/styles/backlinks.scss b/quartz/components/styles/backlinks.scss new file mode 100644 index 0000000..04302f2 --- /dev/null +++ b/quartz/components/styles/backlinks.scss @@ -0,0 +1,20 @@ +.backlinks { + position: relative; + + & > h3 { + font-size: 1rem; + margin: 0; + } + + & > ul { + list-style: none; + padding: 0; + margin: 0.5rem 0; + + & > li { + & > a { + background-color: transparent; + } + } + } +} diff --git a/quartz/components/styles/breadcrumbs.scss b/quartz/components/styles/breadcrumbs.scss new file mode 100644 index 0000000..789808b --- /dev/null +++ b/quartz/components/styles/breadcrumbs.scss @@ -0,0 +1,22 @@ +.breadcrumb-container { + margin: 0; + margin-top: 0.75rem; + padding: 0; + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 0.5rem; +} + +.breadcrumb-element { + p { + margin: 0; + margin-left: 0.5rem; + padding: 0; + line-height: normal; + } + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} diff --git a/quartz/components/styles/clipboard.scss b/quartz/components/styles/clipboard.scss new file mode 100644 index 0000000..a585c7b --- /dev/null +++ b/quartz/components/styles/clipboard.scss @@ -0,0 +1,36 @@ +.clipboard-button { + position: absolute; + display: flex; + float: right; + right: 0; + padding: 0.4rem; + margin: -0.2rem 0.3rem; + color: var(--gray); + border-color: var(--dark); + background-color: var(--light); + border: 1px solid; + border-radius: 5px; + opacity: 0; + transition: 0.2s; + + & > svg { + fill: var(--light); + filter: contrast(0.3); + } + + &:hover { + cursor: pointer; + border-color: var(--secondary); + } + + &:focus { + outline: 0; + } +} + +pre { + &:hover > .clipboard-button { + opacity: 1; + transition: 0.2s; + } +} diff --git a/quartz/components/styles/darkmode.scss b/quartz/components/styles/darkmode.scss new file mode 100644 index 0000000..348c6f7 --- /dev/null +++ b/quartz/components/styles/darkmode.scss @@ -0,0 +1,48 @@ +.darkmode { + position: relative; + width: 20px; + height: 20px; + margin: 0 10px; + + & > .toggle { + display: none; + box-sizing: border-box; + } + + & svg { + cursor: pointer; + opacity: 0; + position: absolute; + width: 20px; + height: 20px; + top: calc(50% - 10px); + fill: var(--darkgray); + transition: opacity 0.1s ease; + } +} + +:root[saved-theme="dark"] { + color-scheme: dark; +} + +:root[saved-theme="light"] { + color-scheme: light; +} + +:root[saved-theme="dark"] .toggle ~ label { + & > #dayIcon { + opacity: 0; + } + & > #nightIcon { + opacity: 1; + } +} + +:root .toggle ~ label { + & > #dayIcon { + opacity: 1; + } + & > #nightIcon { + opacity: 0; + } +} diff --git a/quartz/components/styles/explorer.scss b/quartz/components/styles/explorer.scss new file mode 100644 index 0000000..28e9f9b --- /dev/null +++ b/quartz/components/styles/explorer.scss @@ -0,0 +1,146 @@ +button#explorer { + all: unset; + background-color: transparent; + border: none; + text-align: left; + cursor: pointer; + padding: 0; + color: var(--dark); + display: flex; + align-items: center; + + & h1 { + font-size: 1rem; + display: inline-block; + margin: 0; + } + + & .fold { + margin-left: 0.5rem; + transition: transform 0.3s ease; + opacity: 0.8; + } + + &.collapsed .fold { + transform: rotateZ(-90deg); + } +} + +.folder-outer { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 0.3s ease-in-out; +} + +.folder-outer.open { + grid-template-rows: 1fr; +} + +.folder-outer > ul { + overflow: hidden; +} + +#explorer-content { + list-style: none; + overflow: hidden; + max-height: none; + transition: max-height 0.35s ease; + margin-top: 0.5rem; + + &.collapsed > .overflow::after { + opacity: 0; + } + + & ul { + list-style: none; + margin: 0.08rem 0; + padding: 0; + transition: + max-height 0.35s ease, + transform 0.35s ease, + opacity 0.2s ease; + & li > a { + color: var(--dark); + opacity: 0.75; + pointer-events: all; + } + } +} + +svg { + pointer-events: all; + + & > polyline { + pointer-events: none; + } +} + +.folder-container { + flex-direction: row; + display: flex; + align-items: center; + user-select: none; + + & div > a { + color: var(--secondary); + font-family: var(--headerFont); + font-size: 0.95rem; + font-weight: 600; + line-height: 1.5rem; + display: inline-block; + } + + & div > a:hover { + color: var(--tertiary); + } + + & div > button { + color: var(--dark); + background-color: transparent; + border: none; + text-align: left; + cursor: pointer; + padding-left: 0; + padding-right: 0; + display: flex; + align-items: center; + font-family: var(--headerFont); + + & p { + font-size: 0.95rem; + display: inline-block; + color: var(--secondary); + font-weight: 600; + margin: 0; + line-height: 1.5rem; + pointer-events: none; + } + } +} + +.folder-icon { + margin-right: 5px; + color: var(--secondary); + cursor: pointer; + transition: transform 0.3s ease; + backface-visibility: visible; +} + +div:has(> .folder-outer:not(.open)) > .folder-container > svg { + transform: rotate(-90deg); +} + +.folder-icon:hover { + color: var(--tertiary); +} + +.no-background::after { + background: none !important; +} + +#explorer-end { + // needs height so IntersectionObserver gets triggered + height: 4px; + // remove default margin from li + margin: 0; +} diff --git a/quartz/components/styles/footer.scss b/quartz/components/styles/footer.scss new file mode 100644 index 0000000..9c8dbf8 --- /dev/null +++ b/quartz/components/styles/footer.scss @@ -0,0 +1,15 @@ +footer { + text-align: left; + margin-bottom: 4rem; + opacity: 0.7; + + & ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + gap: 1rem; + margin-top: -1rem; + } +} diff --git a/quartz/components/styles/graph.scss b/quartz/components/styles/graph.scss new file mode 100644 index 0000000..3deaa1f --- /dev/null +++ b/quartz/components/styles/graph.scss @@ -0,0 +1,70 @@ +@use "../../styles/variables.scss" as *; + +.graph { + & > h3 { + font-size: 1rem; + margin: 0; + } + + & > .graph-outer { + border-radius: 5px; + border: 1px solid var(--lightgray); + box-sizing: border-box; + height: 250px; + margin: 0.5em 0; + position: relative; + overflow: hidden; + + & > #global-graph-icon { + color: var(--dark); + opacity: 0.5; + width: 18px; + height: 18px; + position: absolute; + padding: 0.2rem; + margin: 0.3rem; + top: 0; + right: 0; + border-radius: 4px; + background-color: transparent; + transition: background-color 0.5s ease; + cursor: pointer; + &:hover { + background-color: var(--lightgray); + } + } + } + + & > #global-graph-outer { + position: fixed; + z-index: 9999; + left: 0; + top: 0; + width: 100vw; + height: 100%; + backdrop-filter: blur(4px); + display: none; + overflow: hidden; + + &.active { + display: inline-block; + } + + & > #global-graph-container { + border: 1px solid var(--lightgray); + background-color: var(--light); + border-radius: 5px; + box-sizing: border-box; + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 60vh; + width: 50vw; + + @media all and (max-width: $fullPageWidth) { + width: 90%; + } + } + } +} diff --git a/quartz/components/styles/legacyToc.scss b/quartz/components/styles/legacyToc.scss new file mode 100644 index 0000000..7a98f34 --- /dev/null +++ b/quartz/components/styles/legacyToc.scss @@ -0,0 +1,27 @@ +details#toc { + & summary { + cursor: pointer; + + &::marker { + color: var(--dark); + } + + & > * { + padding-left: 0.25rem; + display: inline-block; + margin: 0; + } + } + + & ul { + list-style: none; + margin: 0.5rem 1.25rem; + padding: 0; + } + + @for $i from 1 through 6 { + & .depth-#{$i} { + padding-left: calc(1rem * #{$i}); + } + } +} diff --git a/quartz/components/styles/listPage.scss b/quartz/components/styles/listPage.scss new file mode 100644 index 0000000..c8fc9e9 --- /dev/null +++ b/quartz/components/styles/listPage.scss @@ -0,0 +1,40 @@ +@use "../../styles/variables.scss" as *; + +ul.section-ul { + list-style: none; + margin-top: 2em; + padding-left: 0; +} + +li.section-li { + margin-bottom: 1em; + + & > .section { + display: grid; + grid-template-columns: 6em 3fr 1fr; + + @media all and (max-width: $mobileBreakpoint) { + & > .tags { + display: none; + } + } + + & > .desc > h3 > a { + background-color: transparent; + } + + & > .meta { + margin: 0; + flex-basis: 6em; + opacity: 0.6; + } + } +} + +// modifications in popover context +.popover .section { + grid-template-columns: 6em 1fr !important; + & > .tags { + display: none; + } +} diff --git a/quartz/components/styles/popover.scss b/quartz/components/styles/popover.scss new file mode 100644 index 0000000..fae0e12 --- /dev/null +++ b/quartz/components/styles/popover.scss @@ -0,0 +1,60 @@ +@use "../../styles/variables.scss" as *; + +@keyframes dropin { + 0% { + opacity: 0; + visibility: hidden; + } + 1% { + opacity: 0; + } + 100% { + opacity: 1; + visibility: visible; + } +} + +.popover { + z-index: 999; + position: absolute; + overflow: visible; + padding: 1rem; + + & > .popover-inner { + position: relative; + width: 30rem; + max-height: 20rem; + padding: 0 1rem 1rem 1rem; + font-weight: initial; + line-height: normal; + font-size: initial; + font-family: var(--bodyFont); + border: 1px solid var(--lightgray); + background-color: var(--light); + border-radius: 5px; + box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25); + overflow: auto; + white-space: normal; + } + + h1 { + font-size: 1.5rem; + } + + visibility: hidden; + opacity: 0; + transition: + opacity 0.3s ease, + visibility 0.3s ease; + + @media all and (max-width: $mobileBreakpoint) { + display: none !important; + } +} + +a:hover .popover, +.popover:hover { + animation: dropin 0.3s ease; + animation-fill-mode: forwards; + animation-delay: 0.2s; +} diff --git a/quartz/components/styles/recentNotes.scss b/quartz/components/styles/recentNotes.scss new file mode 100644 index 0000000..7267671 --- /dev/null +++ b/quartz/components/styles/recentNotes.scss @@ -0,0 +1,24 @@ +.recent-notes { + & > h3 { + margin: 0.5rem 0 0 0; + font-size: 1rem; + } + + & > ul.recent-ul { + list-style: none; + margin-top: 1rem; + padding-left: 0; + + & > li { + margin: 1rem 0; + .section > .desc > h3 > a { + background-color: transparent; + } + + .section > .meta { + margin: 0 0 0.5rem 0; + opacity: 0.6; + } + } + } +} diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss new file mode 100644 index 0000000..66f809f --- /dev/null +++ b/quartz/components/styles/search.scss @@ -0,0 +1,178 @@ +@use "../../styles/variables.scss" as *; + +.search { + min-width: fit-content; + max-width: 14rem; + flex-grow: 0.3; + + & > #search-icon { + background-color: var(--lightgray); + border-radius: 4px; + height: 2rem; + display: flex; + align-items: center; + cursor: pointer; + white-space: nowrap; + + & > div { + flex-grow: 1; + } + + & > p { + display: inline; + padding: 0 1rem; + } + + & svg { + cursor: pointer; + width: 18px; + min-width: 18px; + margin: 0 0.5rem; + + .search-path { + stroke: var(--darkgray); + stroke-width: 2px; + transition: stroke 0.5s ease; + } + } + } + + & > #search-container { + position: fixed; + contain: layout; + z-index: 999; + left: 0; + top: 0; + width: 100vw; + height: 100vh; + overflow-y: auto; + display: none; + backdrop-filter: blur(4px); + + &.active { + display: inline-block; + } + + & > #search-space { + width: 50%; + margin-top: 15vh; + margin-left: auto; + margin-right: auto; + + @media all and (max-width: $fullPageWidth) { + width: 90%; + } + + & > * { + width: 100%; + border-radius: 5px; + background: var(--light); + box-shadow: + 0 14px 50px rgba(27, 33, 48, 0.12), + 0 10px 30px rgba(27, 33, 48, 0.16); + margin-bottom: 2em; + } + + & > input { + box-sizing: border-box; + padding: 0.5em 1em; + font-family: var(--bodyFont); + color: var(--dark); + font-size: 1.1em; + border: 1px solid var(--lightgray); + + &:focus { + outline: none; + } + } + + & > #results-container { + & .result-card { + padding: 1em; + cursor: pointer; + transition: background 0.2s ease; + border: 1px solid var(--lightgray); + border-bottom: none; + width: 100%; + + // normalize button props + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; + text-transform: none; + text-align: left; + background: var(--light); + outline: none; + + & .highlight { + color: var(--secondary); + font-weight: 700; + } + + &:hover, + &:focus { + background: var(--lightgray); + } + + &:first-of-type { + border-top-left-radius: 5px; + border-top-right-radius: 5px; + } + + &:last-of-type { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-bottom: 1px solid var(--lightgray); + } + + & > h3 { + margin: 0; + } + + & > ul > li { + margin: 0; + display: inline-block; + white-space: nowrap; + margin: 0; + overflow-wrap: normal; + } + + & > ul { + list-style: none; + display: flex; + padding-left: 0; + gap: 0.4rem; + margin: 0; + margin-top: 0.45rem; + // Offset border radius + margin-left: -2px; + overflow: hidden; + background-clip: border-box; + } + + & > ul > li > p { + border-radius: 8px; + background-color: var(--highlight); + overflow: hidden; + background-clip: border-box; + padding: 0.03rem 0.4rem; + margin: 0; + color: var(--secondary); + opacity: 0.85; + } + + & > ul > li > .match-tag { + color: var(--tertiary); + font-weight: bold; + opacity: 1; + } + + & > p { + margin-bottom: 0; + } + } + } + } + } +} diff --git a/quartz/components/styles/toc.scss b/quartz/components/styles/toc.scss new file mode 100644 index 0000000..3fac443 --- /dev/null +++ b/quartz/components/styles/toc.scss @@ -0,0 +1,59 @@ +button#toc { + background-color: transparent; + border: none; + text-align: left; + cursor: pointer; + padding: 0; + color: var(--dark); + display: flex; + align-items: center; + + & h3 { + font-size: 1rem; + display: inline-block; + margin: 0; + } + + & .fold { + margin-left: 0.5rem; + transition: transform 0.3s ease; + opacity: 0.8; + } + + &.collapsed .fold { + transform: rotateZ(-90deg); + } +} + +#toc-content { + list-style: none; + overflow: hidden; + max-height: none; + transition: max-height 0.5s ease; + + &.collapsed > .overflow::after { + opacity: 0; + } + + & ul { + list-style: none; + margin: 0.5rem 0; + padding: 0; + & > li > a { + color: var(--dark); + opacity: 0.35; + transition: + 0.5s ease opacity, + 0.3s ease color; + &.in-view { + opacity: 0.75; + } + } + } + + @for $i from 0 through 6 { + & .depth-#{$i} { + padding-left: calc(1rem * #{$i}); + } + } +} diff --git a/quartz/components/types.ts b/quartz/components/types.ts new file mode 100644 index 0000000..fd9574f --- /dev/null +++ b/quartz/components/types.ts @@ -0,0 +1,27 @@ +import { ComponentType, JSX } from "preact" +import { StaticResources } from "../util/resources" +import { QuartzPluginData } from "../plugins/vfile" +import { GlobalConfiguration } from "../cfg" +import { Node } from "hast" + +export type QuartzComponentProps = { + externalResources: StaticResources + fileData: QuartzPluginData + cfg: GlobalConfiguration + children: (QuartzComponent | JSX.Element)[] + tree: Node + allFiles: QuartzPluginData[] + displayClass?: "mobile-only" | "desktop-only" +} & JSX.IntrinsicAttributes & { + [key: string]: any + } + +export type QuartzComponent = ComponentType & { + css?: string + beforeDOMLoaded?: string + afterDOMLoaded?: string +} + +export type QuartzComponentConstructor = ( + opts: Options, +) => QuartzComponent diff --git a/quartz/plugins/emitters/404.tsx b/quartz/plugins/emitters/404.tsx new file mode 100644 index 0000000..cd079a0 --- /dev/null +++ b/quartz/plugins/emitters/404.tsx @@ -0,0 +1,59 @@ +import { QuartzEmitterPlugin } from "../types" +import { QuartzComponentProps } from "../../components/types" +import BodyConstructor from "../../components/Body" +import { pageResources, renderPage } from "../../components/renderPage" +import { FullPageLayout } from "../../cfg" +import { FilePath, FullSlug } from "../../util/path" +import { sharedPageComponents } from "../../../quartz.layout" +import { NotFound } from "../../components" +import { defaultProcessedContent } from "../vfile" + +export const NotFoundPage: QuartzEmitterPlugin = () => { + const opts: FullPageLayout = { + ...sharedPageComponents, + pageBody: NotFound(), + beforeBody: [], + left: [], + right: [], + } + + const { head: Head, pageBody, footer: Footer } = opts + const Body = BodyConstructor() + + return { + name: "404Page", + getQuartzComponents() { + return [Head, Body, pageBody, Footer] + }, + async emit(ctx, _content, resources, emit): Promise { + const cfg = ctx.cfg.configuration + const slug = "404" as FullSlug + + const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) + const path = url.pathname as FullSlug + const externalResources = pageResources(path, resources) + const [tree, vfile] = defaultProcessedContent({ + slug, + text: "Not Found", + description: "Not Found", + frontmatter: { title: "Not Found", tags: [] }, + }) + const componentData: QuartzComponentProps = { + fileData: vfile.data, + externalResources, + cfg, + children: [], + tree, + allFiles: [], + } + + return [ + await emit({ + content: renderPage(slug, componentData, opts, externalResources), + slug, + ext: ".html", + }), + ] + }, + } +} diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts new file mode 100644 index 0000000..942412e --- /dev/null +++ b/quartz/plugins/emitters/aliases.ts @@ -0,0 +1,52 @@ +import { FilePath, FullSlug, resolveRelative, simplifySlug } from "../../util/path" +import { QuartzEmitterPlugin } from "../types" +import path from "path" + +export const AliasRedirects: QuartzEmitterPlugin = () => ({ + name: "AliasRedirects", + getQuartzComponents() { + return [] + }, + async emit({ argv }, content, _resources, emit): Promise { + const fps: FilePath[] = [] + + for (const [_tree, file] of content) { + const ogSlug = simplifySlug(file.data.slug!) + const dir = path.posix.relative(argv.directory, path.dirname(file.data.filePath!)) + + let aliases: FullSlug[] = file.data.frontmatter?.aliases ?? file.data.frontmatter?.alias ?? [] + if (typeof aliases === "string") { + aliases = [aliases] + } + + const slugs: FullSlug[] = aliases.map((alias) => path.posix.join(dir, alias) as FullSlug) + const permalink = file.data.frontmatter?.permalink + if (typeof permalink === "string") { + slugs.push(permalink as FullSlug) + } + + for (const slug of slugs) { + const redirUrl = resolveRelative(slug, file.data.slug!) + const fp = await emit({ + content: ` + + + + ${ogSlug} + + + + + + + `, + slug, + ext: ".html", + }) + + fps.push(fp) + } + } + return fps + }, +}) diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts new file mode 100644 index 0000000..edc22d9 --- /dev/null +++ b/quartz/plugins/emitters/assets.ts @@ -0,0 +1,33 @@ +import { FilePath, joinSegments, slugifyFilePath } from "../../util/path" +import { QuartzEmitterPlugin } from "../types" +import path from "path" +import fs from "fs" +import { glob } from "../../util/glob" + +export const Assets: QuartzEmitterPlugin = () => { + return { + name: "Assets", + getQuartzComponents() { + return [] + }, + async emit({ argv, cfg }, _content, _resources, _emit): Promise { + // glob all non MD/MDX/HTML files in content folder and copy it over + const assetsPath = argv.output + const fps = await glob("**", argv.directory, ["**/*.md", ...cfg.configuration.ignorePatterns]) + const res: FilePath[] = [] + for (const fp of fps) { + const ext = path.extname(fp) + const src = joinSegments(argv.directory, fp) as FilePath + const name = (slugifyFilePath(fp as FilePath, true) + ext) as FilePath + + const dest = joinSegments(assetsPath, name) as FilePath + const dir = path.dirname(dest) as FilePath + await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists + await fs.promises.copyFile(src, dest) + res.push(dest) + } + + return res + }, + } +} diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts new file mode 100644 index 0000000..116e4e3 --- /dev/null +++ b/quartz/plugins/emitters/componentResources.ts @@ -0,0 +1,202 @@ +import { FilePath, FullSlug } from "../../util/path" +import { QuartzEmitterPlugin } from "../types" + +// @ts-ignore +import spaRouterScript from "../../components/scripts/spa.inline" +// @ts-ignore +import plausibleScript from "../../components/scripts/plausible.inline" +// @ts-ignore +import popoverScript from "../../components/scripts/popover.inline" +import styles from "../../styles/custom.scss" +import popoverStyle from "../../components/styles/popover.scss" +import { BuildCtx } from "../../util/ctx" +import { StaticResources } from "../../util/resources" +import { QuartzComponent } from "../../components/types" +import { googleFontHref, joinStyles } from "../../util/theme" +import { Features, transform } from "lightningcss" + +type ComponentResources = { + css: string[] + beforeDOMLoaded: string[] + afterDOMLoaded: string[] +} + +function getComponentResources(ctx: BuildCtx): ComponentResources { + const allComponents: Set = new Set() + for (const emitter of ctx.cfg.plugins.emitters) { + const components = emitter.getQuartzComponents(ctx) + for (const component of components) { + allComponents.add(component) + } + } + + const componentResources = { + css: new Set(), + beforeDOMLoaded: new Set(), + afterDOMLoaded: new Set(), + } + + for (const component of allComponents) { + const { css, beforeDOMLoaded, afterDOMLoaded } = component + if (css) { + componentResources.css.add(css) + } + if (beforeDOMLoaded) { + componentResources.beforeDOMLoaded.add(beforeDOMLoaded) + } + if (afterDOMLoaded) { + componentResources.afterDOMLoaded.add(afterDOMLoaded) + } + } + + return { + css: [...componentResources.css], + beforeDOMLoaded: [...componentResources.beforeDOMLoaded], + afterDOMLoaded: [...componentResources.afterDOMLoaded], + } +} + +function joinScripts(scripts: string[]): string { + // wrap with iife to prevent scope collision + return scripts.map((script) => `(function () {${script}})();`).join("\n") +} + +function addGlobalPageResources( + ctx: BuildCtx, + staticResources: StaticResources, + componentResources: ComponentResources, +) { + const cfg = ctx.cfg.configuration + const reloadScript = ctx.argv.serve + + // popovers + if (cfg.enablePopovers) { + componentResources.afterDOMLoaded.push(popoverScript) + componentResources.css.push(popoverStyle) + } + + if (cfg.analytics?.provider === "google") { + const tagId = cfg.analytics.tagId + staticResources.js.push({ + src: `https://www.googletagmanager.com/gtag/js?id=${tagId}`, + contentType: "external", + loadTime: "afterDOMReady", + }) + componentResources.afterDOMLoaded.push(` + window.dataLayer = window.dataLayer || []; + function gtag() { dataLayer.push(arguments); } + gtag(\`js\`, new Date()); + gtag(\`config\`, \`${tagId}\`, { send_page_view: false }); + + document.addEventListener(\`nav\`, () => { + gtag(\`event\`, \`page_view\`, { + page_title: document.title, + page_location: location.href, + }); + });`) + } else if (cfg.analytics?.provider === "plausible") { + componentResources.afterDOMLoaded.push(plausibleScript) + } else if (cfg.analytics?.provider === "umami") { + componentResources.afterDOMLoaded.push(` + const umamiScript = document.createElement("script") + umamiScript.src = "https://analytics.umami.is/script.js" + umamiScript.setAttribute("data-website-id", "${cfg.analytics.websiteId}") + umamiScript.async = true + + document.head.appendChild(umamiScript) + `) + } + + if (cfg.enableSPA) { + componentResources.afterDOMLoaded.push(spaRouterScript) + } else { + componentResources.afterDOMLoaded.push(` + window.spaNavigate = (url, _) => window.location.assign(url) + const event = new CustomEvent("nav", { detail: { url: document.body.dataset.slug } }) + document.dispatchEvent(event)`) + } + + let wsUrl = `ws://localhost:${ctx.argv.wsPort}` + + if (ctx.argv.remoteDevHost) { + wsUrl = `wss://${ctx.argv.remoteDevHost}:${ctx.argv.wsPort}` + } + + if (reloadScript) { + staticResources.js.push({ + loadTime: "afterDOMReady", + contentType: "inline", + script: ` + const socket = new WebSocket('${wsUrl}') + socket.addEventListener('message', () => document.location.reload()) + `, + }) + } +} + +interface Options { + fontOrigin: "googleFonts" | "local" +} + +const defaultOptions: Options = { + fontOrigin: "googleFonts", +} + +export const ComponentResources: QuartzEmitterPlugin = (opts?: Partial) => { + const { fontOrigin } = { ...defaultOptions, ...opts } + return { + name: "ComponentResources", + getQuartzComponents() { + return [] + }, + async emit(ctx, _content, resources, emit): Promise { + // component specific scripts and styles + const componentResources = getComponentResources(ctx) + // important that this goes *after* component scripts + // as the "nav" event gets triggered here and we should make sure + // that everyone else had the chance to register a listener for it + + if (fontOrigin === "googleFonts") { + resources.css.push(googleFontHref(ctx.cfg.configuration.theme)) + } else if (fontOrigin === "local") { + // let the user do it themselves in css + } + + addGlobalPageResources(ctx, resources, componentResources) + + const stylesheet = joinStyles(ctx.cfg.configuration.theme, ...componentResources.css, styles) + const prescript = joinScripts(componentResources.beforeDOMLoaded) + const postscript = joinScripts(componentResources.afterDOMLoaded) + const fps = await Promise.all([ + emit({ + slug: "index" as FullSlug, + ext: ".css", + content: transform({ + filename: "index.css", + code: Buffer.from(stylesheet), + minify: true, + targets: { + safari: (15 << 16) | (6 << 8), // 15.6 + ios_saf: (15 << 16) | (6 << 8), // 15.6 + edge: 115 << 16, + firefox: 102 << 16, + chrome: 109 << 16, + }, + include: Features.MediaQueries, + }).code.toString(), + }), + emit({ + slug: "prescript" as FullSlug, + ext: ".js", + content: prescript, + }), + emit({ + slug: "postscript" as FullSlug, + ext: ".js", + content: postscript, + }), + ]) + return fps + }, + } +} diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts new file mode 100644 index 0000000..69d0d37 --- /dev/null +++ b/quartz/plugins/emitters/contentIndex.ts @@ -0,0 +1,150 @@ +import { Root } from "hast" +import { GlobalConfiguration } from "../../cfg" +import { getDate } from "../../components/Date" +import { escapeHTML } from "../../util/escape" +import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path" +import { QuartzEmitterPlugin } from "../types" +import { toHtml } from "hast-util-to-html" +import path from "path" + +export type ContentIndex = Map +export type ContentDetails = { + title: string + links: SimpleSlug[] + tags: string[] + content: string + richContent?: string + date?: Date + description?: string +} + +interface Options { + enableSiteMap: boolean + enableRSS: boolean + rssLimit?: number + rssFullHtml: boolean + includeEmptyFiles: boolean +} + +const defaultOptions: Options = { + enableSiteMap: true, + enableRSS: true, + rssLimit: 10, + rssFullHtml: false, + includeEmptyFiles: true, +} + +function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { + const base = cfg.baseUrl ?? "" + const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => ` + https://${base}/${encodeURI(slug)} + ${content.date?.toISOString()} + ` + const urls = Array.from(idx) + .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) + .join("") + return `${urls}` +} + +function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: number): string { + const base = cfg.baseUrl ?? "" + const root = `https://${base}` + + const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => ` + ${escapeHTML(content.title)} + ${root}/${encodeURI(slug)} + ${root}/${encodeURI(slug)} + ${content.richContent ?? content.description} + ${content.date?.toUTCString()} + ` + + const items = Array.from(idx) + .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) + .slice(0, limit ?? idx.size) + .join("") + + return ` + + + ${escapeHTML(cfg.pageTitle)} + ${root} + ${!!limit ? `Last ${limit} notes` : "Recent notes"} on ${escapeHTML( + cfg.pageTitle, + )} + Quartz -- quartz.jzhao.xyz + ${items} + + ` +} + +export const ContentIndex: QuartzEmitterPlugin> = (opts) => { + opts = { ...defaultOptions, ...opts } + return { + name: "ContentIndex", + async emit(ctx, content, _resources, emit) { + const cfg = ctx.cfg.configuration + const emitted: FilePath[] = [] + const linkIndex: ContentIndex = new Map() + for (const [tree, file] of content) { + const slug = file.data.slug! + const date = getDate(ctx.cfg.configuration, file.data) ?? new Date() + if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) { + linkIndex.set(slug, { + title: file.data.frontmatter?.title!, + links: file.data.links ?? [], + tags: file.data.frontmatter?.tags ?? [], + content: file.data.text ?? "", + richContent: opts?.rssFullHtml + ? escapeHTML(toHtml(tree as Root, { allowDangerousHtml: true })) + : undefined, + date: date, + description: file.data.description ?? "", + }) + } + } + + if (opts?.enableSiteMap) { + emitted.push( + await emit({ + content: generateSiteMap(cfg, linkIndex), + slug: "sitemap" as FullSlug, + ext: ".xml", + }), + ) + } + + if (opts?.enableRSS) { + emitted.push( + await emit({ + content: generateRSSFeed(cfg, linkIndex, opts.rssLimit), + slug: "index" as FullSlug, + ext: ".xml", + }), + ) + } + + const fp = path.join("static", "contentIndex") as FullSlug + const simplifiedIndex = Object.fromEntries( + Array.from(linkIndex).map(([slug, content]) => { + // remove description and from content index as nothing downstream + // actually uses it. we only keep it in the index as we need it + // for the RSS feed + delete content.description + delete content.date + return [slug, content] + }), + ) + + emitted.push( + await emit({ + content: JSON.stringify(simplifiedIndex), + slug: fp, + ext: ".json", + }), + ) + + return emitted + }, + getQuartzComponents: () => [], + } +} diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx new file mode 100644 index 0000000..338bfae --- /dev/null +++ b/quartz/plugins/emitters/contentPage.tsx @@ -0,0 +1,72 @@ +import { QuartzEmitterPlugin } from "../types" +import { QuartzComponentProps } from "../../components/types" +import HeaderConstructor from "../../components/Header" +import BodyConstructor from "../../components/Body" +import { pageResources, renderPage } from "../../components/renderPage" +import { FullPageLayout } from "../../cfg" +import { FilePath, pathToRoot } from "../../util/path" +import { defaultContentPageLayout, sharedPageComponents } from "../../../quartz.layout" +import { Content } from "../../components" +import chalk from "chalk" + +export const ContentPage: QuartzEmitterPlugin> = (userOpts) => { + const opts: FullPageLayout = { + ...sharedPageComponents, + ...defaultContentPageLayout, + pageBody: Content(), + ...userOpts, + } + + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts + const Header = HeaderConstructor() + const Body = BodyConstructor() + + return { + name: "ContentPage", + getQuartzComponents() { + return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] + }, + async emit(ctx, content, resources, emit): Promise { + const cfg = ctx.cfg.configuration + const fps: FilePath[] = [] + const allFiles = content.map((c) => c[1].data) + + let containsIndex = false + for (const [tree, file] of content) { + const slug = file.data.slug! + if (slug === "index") { + containsIndex = true + } + + const externalResources = pageResources(pathToRoot(slug), resources) + const componentData: QuartzComponentProps = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles, + } + + const content = renderPage(slug, componentData, opts, externalResources) + const fp = await emit({ + content, + slug, + ext: ".html", + }) + + fps.push(fp) + } + + if (!containsIndex) { + console.log( + chalk.yellow( + `\nWarning: you seem to be missing an \`index.md\` home page file at the root of your \`${ctx.argv.directory}\` folder. This may cause errors when deploying.`, + ), + ) + } + + return fps + }, + } +} diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx new file mode 100644 index 0000000..8632ece --- /dev/null +++ b/quartz/plugins/emitters/folderPage.tsx @@ -0,0 +1,96 @@ +import { QuartzEmitterPlugin } from "../types" +import { QuartzComponentProps } from "../../components/types" +import HeaderConstructor from "../../components/Header" +import BodyConstructor from "../../components/Body" +import { pageResources, renderPage } from "../../components/renderPage" +import { ProcessedContent, defaultProcessedContent } from "../vfile" +import { FullPageLayout } from "../../cfg" +import path from "path" +import { + FilePath, + FullSlug, + SimpleSlug, + _stripSlashes, + joinSegments, + pathToRoot, + simplifySlug, +} from "../../util/path" +import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" +import { FolderContent } from "../../components" + +export const FolderPage: QuartzEmitterPlugin = (userOpts) => { + const opts: FullPageLayout = { + ...sharedPageComponents, + ...defaultListPageLayout, + pageBody: FolderContent(), + ...userOpts, + } + + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts + const Header = HeaderConstructor() + const Body = BodyConstructor() + + return { + name: "FolderPage", + getQuartzComponents() { + return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] + }, + async emit(ctx, content, resources, emit): Promise { + const fps: FilePath[] = [] + const allFiles = content.map((c) => c[1].data) + const cfg = ctx.cfg.configuration + + const folders: Set = new Set( + allFiles.flatMap((data) => { + const slug = data.slug + const folderName = path.dirname(slug ?? "") as SimpleSlug + if (slug && folderName !== "." && folderName !== "tags") { + return [folderName] + } + return [] + }), + ) + + const folderDescriptions: Record = Object.fromEntries( + [...folders].map((folder) => [ + folder, + defaultProcessedContent({ + slug: joinSegments(folder, "index") as FullSlug, + frontmatter: { title: `Folder: ${folder}`, tags: [] }, + }), + ]), + ) + + for (const [tree, file] of content) { + const slug = _stripSlashes(simplifySlug(file.data.slug!)) as SimpleSlug + if (folders.has(slug)) { + folderDescriptions[slug] = [tree, file] + } + } + + for (const folder of folders) { + const slug = joinSegments(folder, "index") as FullSlug + const externalResources = pageResources(pathToRoot(slug), resources) + const [tree, file] = folderDescriptions[folder] + const componentData: QuartzComponentProps = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles, + } + + const content = renderPage(slug, componentData, opts, externalResources) + const fp = await emit({ + content, + slug, + ext: ".html", + }) + + fps.push(fp) + } + return fps + }, + } +} diff --git a/quartz/plugins/emitters/index.ts b/quartz/plugins/emitters/index.ts new file mode 100644 index 0000000..99a2c54 --- /dev/null +++ b/quartz/plugins/emitters/index.ts @@ -0,0 +1,9 @@ +export { ContentPage } from "./contentPage" +export { TagPage } from "./tagPage" +export { FolderPage } from "./folderPage" +export { ContentIndex } from "./contentIndex" +export { AliasRedirects } from "./aliases" +export { Assets } from "./assets" +export { Static } from "./static" +export { ComponentResources } from "./componentResources" +export { NotFoundPage } from "./404" diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts new file mode 100644 index 0000000..6f5d19d --- /dev/null +++ b/quartz/plugins/emitters/static.ts @@ -0,0 +1,17 @@ +import { FilePath, QUARTZ, joinSegments } from "../../util/path" +import { QuartzEmitterPlugin } from "../types" +import fs from "fs" +import { glob } from "../../util/glob" + +export const Static: QuartzEmitterPlugin = () => ({ + name: "Static", + getQuartzComponents() { + return [] + }, + async emit({ argv, cfg }, _content, _resources, _emit): Promise { + const staticPath = joinSegments(QUARTZ, "static") + const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns) + await fs.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true }) + return fps.map((fp) => joinSegments(argv.output, "static", fp)) as FilePath[] + }, +}) diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx new file mode 100644 index 0000000..6afde2f --- /dev/null +++ b/quartz/plugins/emitters/tagPage.tsx @@ -0,0 +1,94 @@ +import { QuartzEmitterPlugin } from "../types" +import { QuartzComponentProps } from "../../components/types" +import HeaderConstructor from "../../components/Header" +import BodyConstructor from "../../components/Body" +import { pageResources, renderPage } from "../../components/renderPage" +import { ProcessedContent, defaultProcessedContent } from "../vfile" +import { FullPageLayout } from "../../cfg" +import { + FilePath, + FullSlug, + getAllSegmentPrefixes, + joinSegments, + pathToRoot, +} from "../../util/path" +import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" +import { TagContent } from "../../components" + +export const TagPage: QuartzEmitterPlugin = (userOpts) => { + const opts: FullPageLayout = { + ...sharedPageComponents, + ...defaultListPageLayout, + pageBody: TagContent(), + ...userOpts, + } + + const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts + const Header = HeaderConstructor() + const Body = BodyConstructor() + + return { + name: "TagPage", + getQuartzComponents() { + return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] + }, + async emit(ctx, content, resources, emit): Promise { + const fps: FilePath[] = [] + const allFiles = content.map((c) => c[1].data) + const cfg = ctx.cfg.configuration + + const tags: Set = new Set( + allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes), + ) + // add base tag + tags.add("index") + + const tagDescriptions: Record = Object.fromEntries( + [...tags].map((tag) => { + const title = tag === "" ? "Tag Index" : `Tag: #${tag}` + return [ + tag, + defaultProcessedContent({ + slug: joinSegments("tags", tag) as FullSlug, + frontmatter: { title, tags: [] }, + }), + ] + }), + ) + + for (const [tree, file] of content) { + const slug = file.data.slug! + if (slug.startsWith("tags/")) { + const tag = slug.slice("tags/".length) + if (tags.has(tag)) { + tagDescriptions[tag] = [tree, file] + } + } + } + + for (const tag of tags) { + const slug = joinSegments("tags", tag) as FullSlug + const externalResources = pageResources(pathToRoot(slug), resources) + const [tree, file] = tagDescriptions[tag] + const componentData: QuartzComponentProps = { + fileData: file.data, + externalResources, + cfg, + children: [], + tree, + allFiles, + } + + const content = renderPage(slug, componentData, opts, externalResources) + const fp = await emit({ + content, + slug: file.data.slug!, + ext: ".html", + }) + + fps.push(fp) + } + return fps + }, + } +} diff --git a/quartz/plugins/filters/draft.ts b/quartz/plugins/filters/draft.ts new file mode 100644 index 0000000..65e2d6b --- /dev/null +++ b/quartz/plugins/filters/draft.ts @@ -0,0 +1,9 @@ +import { QuartzFilterPlugin } from "../types" + +export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ + name: "RemoveDrafts", + shouldPublish(_ctx, [_tree, vfile]) { + const draftFlag: boolean = vfile.data?.frontmatter?.draft ?? false + return !draftFlag + }, +}) diff --git a/quartz/plugins/filters/explicit.ts b/quartz/plugins/filters/explicit.ts new file mode 100644 index 0000000..30f0b37 --- /dev/null +++ b/quartz/plugins/filters/explicit.ts @@ -0,0 +1,9 @@ +import { QuartzFilterPlugin } from "../types" + +export const ExplicitPublish: QuartzFilterPlugin = () => ({ + name: "ExplicitPublish", + shouldPublish(_ctx, [_tree, vfile]) { + const publishFlag: boolean = vfile.data?.frontmatter?.publish ?? false + return publishFlag + }, +}) diff --git a/quartz/plugins/filters/index.ts b/quartz/plugins/filters/index.ts new file mode 100644 index 0000000..d937143 --- /dev/null +++ b/quartz/plugins/filters/index.ts @@ -0,0 +1,2 @@ +export { RemoveDrafts } from "./draft" +export { ExplicitPublish } from "./explicit" diff --git a/quartz/plugins/index.ts b/quartz/plugins/index.ts new file mode 100644 index 0000000..9753d2e --- /dev/null +++ b/quartz/plugins/index.ts @@ -0,0 +1,34 @@ +import { StaticResources } from "../util/resources" +import { FilePath, FullSlug } from "../util/path" +import { BuildCtx } from "../util/ctx" + +export function getStaticResourcesFromPlugins(ctx: BuildCtx) { + const staticResources: StaticResources = { + css: [], + js: [], + } + + for (const transformer of ctx.cfg.plugins.transformers) { + const res = transformer.externalResources ? transformer.externalResources(ctx) : {} + if (res?.js) { + staticResources.js.push(...res.js) + } + if (res?.css) { + staticResources.css.push(...res.css) + } + } + + return staticResources +} + +export * from "./transformers" +export * from "./filters" +export * from "./emitters" + +declare module "vfile" { + // inserted in processors.ts + interface DataMap { + slug: FullSlug + filePath: FilePath + } +} diff --git a/quartz/plugins/transformers/description.ts b/quartz/plugins/transformers/description.ts new file mode 100644 index 0000000..884d5b1 --- /dev/null +++ b/quartz/plugins/transformers/description.ts @@ -0,0 +1,51 @@ +import { Root as HTMLRoot } from "hast" +import { toString } from "hast-util-to-string" +import { QuartzTransformerPlugin } from "../types" +import { escapeHTML } from "../../util/escape" + +export interface Options { + descriptionLength: number +} + +const defaultOptions: Options = { + descriptionLength: 150, +} + +export const Description: QuartzTransformerPlugin | undefined> = (userOpts) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "Description", + htmlPlugins() { + return [ + () => { + return async (tree: HTMLRoot, file) => { + const frontMatterDescription = file.data.frontmatter?.description + const text = escapeHTML(toString(tree)) + + const desc = frontMatterDescription ?? text + const sentences = desc.replace(/\s+/g, " ").split(".") + let finalDesc = "" + let sentenceIdx = 0 + const len = opts.descriptionLength + while (finalDesc.length < len) { + const sentence = sentences[sentenceIdx] + if (!sentence) break + finalDesc += sentence + "." + sentenceIdx++ + } + + file.data.description = finalDesc + file.data.text = text + } + }, + ] + }, + } +} + +declare module "vfile" { + interface DataMap { + description: string + text: string + } +} diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts new file mode 100644 index 0000000..04b1105 --- /dev/null +++ b/quartz/plugins/transformers/frontmatter.ts @@ -0,0 +1,75 @@ +import matter from "gray-matter" +import remarkFrontmatter from "remark-frontmatter" +import { QuartzTransformerPlugin } from "../types" +import yaml from "js-yaml" +import toml from "toml" +import { slugTag } from "../../util/path" + +export interface Options { + delims: string | string[] + language: "yaml" | "toml" +} + +const defaultOptions: Options = { + delims: "---", + language: "yaml", +} + +export const FrontMatter: QuartzTransformerPlugin | undefined> = (userOpts) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "FrontMatter", + markdownPlugins() { + return [ + [remarkFrontmatter, ["yaml", "toml"]], + () => { + return (_, file) => { + const { data } = matter(file.value, { + ...opts, + engines: { + yaml: (s) => yaml.load(s, { schema: yaml.JSON_SCHEMA }) as object, + toml: (s) => toml.parse(s) as object, + }, + }) + + // tag is an alias for tags + if (data.tag) { + data.tags = data.tag + } + + // coerce title to string + if (data.title) { + data.title = data.title.toString() + } + + if (data.tags && !Array.isArray(data.tags)) { + data.tags = data.tags + .toString() + .split(",") + .map((tag: string) => tag.trim()) + } + + // slug them all!! + data.tags = [...new Set(data.tags?.map((tag: string) => slugTag(tag)))] ?? [] + + // fill in frontmatter + file.data.frontmatter = { + title: file.stem ?? "Untitled", + tags: [], + ...data, + } + } + }, + ] + }, + } +} + +declare module "vfile" { + interface DataMap { + frontmatter: { [key: string]: any } & { + title: string + tags: string[] + } + } +} diff --git a/quartz/plugins/transformers/gfm.ts b/quartz/plugins/transformers/gfm.ts new file mode 100644 index 0000000..62624aa --- /dev/null +++ b/quartz/plugins/transformers/gfm.ts @@ -0,0 +1,46 @@ +import remarkGfm from "remark-gfm" +import smartypants from "remark-smartypants" +import { QuartzTransformerPlugin } from "../types" +import rehypeSlug from "rehype-slug" +import rehypeAutolinkHeadings from "rehype-autolink-headings" + +export interface Options { + enableSmartyPants: boolean + linkHeadings: boolean +} + +const defaultOptions: Options = { + enableSmartyPants: true, + linkHeadings: true, +} + +export const GitHubFlavoredMarkdown: QuartzTransformerPlugin | undefined> = ( + userOpts, +) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "GitHubFlavoredMarkdown", + markdownPlugins() { + return opts.enableSmartyPants ? [remarkGfm, smartypants] : [remarkGfm] + }, + htmlPlugins() { + if (opts.linkHeadings) { + return [ + rehypeSlug, + [ + rehypeAutolinkHeadings, + { + behavior: "append", + content: { + type: "text", + value: " §", + }, + }, + ], + ] + } else { + return [] + } + }, + } +} diff --git a/quartz/plugins/transformers/index.ts b/quartz/plugins/transformers/index.ts new file mode 100644 index 0000000..e340f10 --- /dev/null +++ b/quartz/plugins/transformers/index.ts @@ -0,0 +1,11 @@ +export { FrontMatter } from "./frontmatter" +export { GitHubFlavoredMarkdown } from "./gfm" +export { CreatedModifiedDate } from "./lastmod" +export { Latex } from "./latex" +export { Description } from "./description" +export { CrawlLinks } from "./links" +export { ObsidianFlavoredMarkdown } from "./ofm" +export { OxHugoFlavouredMarkdown } from "./oxhugofm" +export { SyntaxHighlighting } from "./syntax" +export { TableOfContents } from "./toc" +export { HardLineBreaks } from "./linebreaks" diff --git a/quartz/plugins/transformers/lastmod.ts b/quartz/plugins/transformers/lastmod.ts new file mode 100644 index 0000000..feca4b5 --- /dev/null +++ b/quartz/plugins/transformers/lastmod.ts @@ -0,0 +1,87 @@ +import fs from "fs" +import path from "path" +import { Repository } from "@napi-rs/simple-git" +import { QuartzTransformerPlugin } from "../types" +import chalk from "chalk" + +export interface Options { + priority: ("frontmatter" | "git" | "filesystem")[] +} + +const defaultOptions: Options = { + priority: ["frontmatter", "git", "filesystem"], +} + +function coerceDate(fp: string, d: any): Date { + const dt = new Date(d) + const invalidDate = isNaN(dt.getTime()) || dt.getTime() === 0 + if (invalidDate && d !== undefined) { + console.log( + chalk.yellow( + `\nWarning: found invalid date "${d}" in \`${fp}\`. Supported formats: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format`, + ), + ) + } + + return invalidDate ? new Date() : dt +} + +type MaybeDate = undefined | string | number +export const CreatedModifiedDate: QuartzTransformerPlugin | undefined> = ( + userOpts, +) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "CreatedModifiedDate", + markdownPlugins() { + return [ + () => { + let repo: Repository | undefined = undefined + return async (_tree, file) => { + let created: MaybeDate = undefined + let modified: MaybeDate = undefined + let published: MaybeDate = undefined + + const fp = file.data.filePath! + const fullFp = path.posix.join(file.cwd, fp) + for (const source of opts.priority) { + if (source === "filesystem") { + const st = await fs.promises.stat(fullFp) + created ||= st.birthtimeMs + modified ||= st.mtimeMs + } else if (source === "frontmatter" && file.data.frontmatter) { + created ||= file.data.frontmatter.date + modified ||= file.data.frontmatter.lastmod + modified ||= file.data.frontmatter.updated + modified ||= file.data.frontmatter["last-modified"] + published ||= file.data.frontmatter.publishDate + } else if (source === "git") { + if (!repo) { + repo = new Repository(file.cwd) + } + + modified ||= await repo.getFileLatestModifiedDateAsync(file.data.filePath!) + } + } + + file.data.dates = { + created: coerceDate(fp, created), + modified: coerceDate(fp, modified), + published: coerceDate(fp, published), + } + } + }, + ] + }, + } +} + +declare module "vfile" { + interface DataMap { + dates: { + created: Date + modified: Date + published: Date + } + } +} diff --git a/quartz/plugins/transformers/latex.ts b/quartz/plugins/transformers/latex.ts new file mode 100644 index 0000000..5c6f767 --- /dev/null +++ b/quartz/plugins/transformers/latex.ts @@ -0,0 +1,45 @@ +import remarkMath from "remark-math" +import rehypeKatex from "rehype-katex" +import rehypeMathjax from "rehype-mathjax/svg.js" +import { QuartzTransformerPlugin } from "../types" + +interface Options { + renderEngine: "katex" | "mathjax" +} + +export const Latex: QuartzTransformerPlugin = (opts?: Options) => { + const engine = opts?.renderEngine ?? "katex" + return { + name: "Latex", + markdownPlugins() { + return [remarkMath] + }, + htmlPlugins() { + if (engine === "katex") { + return [[rehypeKatex, { output: "html" }]] + } else { + return [rehypeMathjax] + } + }, + externalResources() { + if (engine === "katex") { + return { + css: [ + // base css + "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", + ], + js: [ + { + // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md + src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", + loadTime: "afterDOMReady", + contentType: "external", + }, + ], + } + } else { + return {} + } + }, + } +} diff --git a/quartz/plugins/transformers/linebreaks.ts b/quartz/plugins/transformers/linebreaks.ts new file mode 100644 index 0000000..a8a066f --- /dev/null +++ b/quartz/plugins/transformers/linebreaks.ts @@ -0,0 +1,11 @@ +import { QuartzTransformerPlugin } from "../types" +import remarkBreaks from "remark-breaks" + +export const HardLineBreaks: QuartzTransformerPlugin = () => { + return { + name: "HardLineBreaks", + markdownPlugins() { + return [remarkBreaks] + }, + } +} diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts new file mode 100644 index 0000000..8d16136 --- /dev/null +++ b/quartz/plugins/transformers/links.ts @@ -0,0 +1,126 @@ +import { QuartzTransformerPlugin } from "../types" +import { + FullSlug, + RelativeURL, + SimpleSlug, + TransformOptions, + _stripSlashes, + simplifySlug, + splitAnchor, + transformLink, +} from "../../util/path" +import path from "path" +import { visit } from "unist-util-visit" +import isAbsoluteUrl from "is-absolute-url" + +interface Options { + /** How to resolve Markdown paths */ + markdownLinkResolution: TransformOptions["strategy"] + /** Strips folders from a link so that it looks nice */ + prettyLinks: boolean + openLinksInNewTab: boolean +} + +const defaultOptions: Options = { + markdownLinkResolution: "absolute", + prettyLinks: true, + openLinksInNewTab: false, +} + +export const CrawlLinks: QuartzTransformerPlugin | undefined> = (userOpts) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "LinkProcessing", + htmlPlugins(ctx) { + return [ + () => { + return (tree, file) => { + const curSlug = simplifySlug(file.data.slug!) + const outgoing: Set = new Set() + + const transformOptions: TransformOptions = { + strategy: opts.markdownLinkResolution, + allSlugs: ctx.allSlugs, + } + + visit(tree, "element", (node, _index, _parent) => { + // rewrite all links + if ( + node.tagName === "a" && + node.properties && + typeof node.properties.href === "string" + ) { + let dest = node.properties.href as RelativeURL + node.properties.className ??= [] + node.properties.className.push(isAbsoluteUrl(dest) ? "external" : "internal") + + if (opts.openLinksInNewTab) { + node.properties.target = "_blank" + } + + // don't process external links or intra-document anchors + const isInternal = !(isAbsoluteUrl(dest) || dest.startsWith("#")) + if (isInternal) { + dest = node.properties.href = transformLink( + file.data.slug!, + dest, + transformOptions, + ) + + // url.resolve is considered legacy + // WHATWG equivalent https://nodejs.dev/en/api/v18/url/#urlresolvefrom-to + const url = new URL(dest, `https://base.com/${curSlug}`) + const canonicalDest = url.pathname + const [destCanonical, _destAnchor] = splitAnchor(canonicalDest) + + // need to decodeURIComponent here as WHATWG URL percent-encodes everything + const simple = decodeURIComponent( + simplifySlug(destCanonical as FullSlug), + ) as SimpleSlug + outgoing.add(simple) + node.properties["data-slug"] = simple + } + + // rewrite link internals if prettylinks is on + if ( + opts.prettyLinks && + isInternal && + node.children.length === 1 && + node.children[0].type === "text" && + !node.children[0].value.startsWith("#") + ) { + node.children[0].value = path.basename(node.children[0].value) + } + } + + // transform all other resources that may use links + if ( + ["img", "video", "audio", "iframe"].includes(node.tagName) && + node.properties && + typeof node.properties.src === "string" + ) { + if (!isAbsoluteUrl(node.properties.src)) { + let dest = node.properties.src as RelativeURL + dest = node.properties.src = transformLink( + file.data.slug!, + dest, + transformOptions, + ) + node.properties.src = dest + } + } + }) + + file.data.links = [...outgoing] + } + }, + ] + }, + } +} + +declare module "vfile" { + interface DataMap { + links: SimpleSlug[] + } +} diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts new file mode 100644 index 0000000..226e939 --- /dev/null +++ b/quartz/plugins/transformers/ofm.ts @@ -0,0 +1,528 @@ +import { PluggableList } from "unified" +import { QuartzTransformerPlugin } from "../types" +import { Root, HTML, BlockContent, DefinitionContent, Code, Paragraph } from "mdast" +import { Element, Literal } from "hast" +import { Replace, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" +import { slug as slugAnchor } from "github-slugger" +import rehypeRaw from "rehype-raw" +import { visit } from "unist-util-visit" +import path from "path" +import { JSResource } from "../../util/resources" +// @ts-ignore +import calloutScript from "../../components/scripts/callout.inline.ts" +import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../util/path" +import { toHast } from "mdast-util-to-hast" +import { toHtml } from "hast-util-to-html" +import { PhrasingContent } from "mdast-util-find-and-replace/lib" +import { capitalize } from "../../util/lang" + +export interface Options { + comments: boolean + highlight: boolean + wikilinks: boolean + callouts: boolean + mermaid: boolean + parseTags: boolean + parseBlockReferences: boolean + enableInHtmlEmbed: boolean +} + +const defaultOptions: Options = { + comments: true, + highlight: true, + wikilinks: true, + callouts: true, + mermaid: true, + parseTags: true, + parseBlockReferences: true, + enableInHtmlEmbed: false, +} + +const icons = { + infoIcon: ``, + pencilIcon: ``, + clipboardListIcon: ``, + checkCircleIcon: ``, + flameIcon: ``, + checkIcon: ``, + helpCircleIcon: ``, + alertTriangleIcon: ``, + xIcon: ``, + zapIcon: ``, + bugIcon: ``, + listIcon: ``, + quoteIcon: ``, +} + +const callouts = { + note: icons.pencilIcon, + abstract: icons.clipboardListIcon, + info: icons.infoIcon, + todo: icons.checkCircleIcon, + tip: icons.flameIcon, + success: icons.checkIcon, + question: icons.helpCircleIcon, + warning: icons.alertTriangleIcon, + failure: icons.xIcon, + danger: icons.zapIcon, + bug: icons.bugIcon, + example: icons.listIcon, + quote: icons.quoteIcon, +} + +const calloutMapping: Record = { + note: "note", + abstract: "abstract", + summary: "abstract", + tldr: "abstract", + info: "info", + todo: "todo", + tip: "tip", + hint: "tip", + important: "tip", + success: "success", + check: "success", + done: "success", + question: "question", + help: "question", + faq: "question", + warning: "warning", + attention: "warning", + caution: "warning", + failure: "failure", + missing: "failure", + fail: "failure", + danger: "danger", + error: "danger", + bug: "bug", + example: "example", + quote: "quote", + cite: "quote", +} + +function canonicalizeCallout(calloutName: string): keyof typeof callouts { + let callout = calloutName.toLowerCase() as keyof typeof calloutMapping + return calloutMapping[callout] ?? "note" +} + +// !? -> optional embedding +// \[\[ -> open brace +// ([^\[\]\|\#]+) -> one or more non-special characters ([,],|, or #) (name) +// (#[^\[\]\|\#]+)? -> # then one or more non-special characters (heading link) +// (|[^\[\]\|\#]+)? -> | then one or more non-special characters (alias) +const wikilinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)?(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g") +const highlightRegex = new RegExp(/==([^=]+)==/, "g") +const commentRegex = new RegExp(/%%(.+)%%/, "g") +// from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts +const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/) +const calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm") +// (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line +// #(...) -> capturing group, tag itself must start with # +// (?:[-_\p{L}])+ -> non-capturing group, non-empty string of (Unicode-aware) alpha-numeric characters, hyphens and/or underscores +// (?:\/[-_\p{L}]+)*) -> non-capturing group, matches an arbitrary number of tag strings separated by "/" +const tagRegex = new RegExp(/(?:^| )#((?:[-_\p{L}\d])+(?:\/[-_\p{L}\d]+)*)/, "gu") +const blockReferenceRegex = new RegExp(/\^([A-Za-z0-9]+)$/, "g") + +export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin | undefined> = ( + userOpts, +) => { + const opts = { ...defaultOptions, ...userOpts } + + const mdastToHtml = (ast: PhrasingContent | Paragraph) => { + const hast = toHast(ast, { allowDangerousHtml: true })! + return toHtml(hast, { allowDangerousHtml: true }) + } + + const findAndReplace = opts.enableInHtmlEmbed + ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { + if (replace) { + visit(tree, "html", (node: HTML) => { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replaceAll(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) + } + }) + } + + mdastFindReplace(tree, regex, replace) + } + : mdastFindReplace + + return { + name: "ObsidianFlavoredMarkdown", + textTransform(_ctx, src) { + // pre-transform blockquotes + if (opts.callouts) { + src = src.toString() + src = src.replaceAll(calloutLineRegex, (value) => { + // force newline after title of callout + return value + "\n> " + }) + } + + // pre-transform wikilinks (fix anchors to things that may contain illegal syntax e.g. codeblocks, latex) + if (opts.wikilinks) { + src = src.toString() + src = src.replaceAll(wikilinkRegex, (value, ...capture) => { + const [rawFp, rawHeader, rawAlias] = capture + const fp = rawFp ?? "" + const anchor = rawHeader?.trim().slice(1) + const displayAnchor = anchor ? `#${slugAnchor(anchor)}` : "" + const displayAlias = rawAlias ?? rawHeader?.replace("#", "|") ?? "" + const embedDisplay = value.startsWith("!") ? "!" : "" + return `${embedDisplay}[[${fp}${displayAnchor}${displayAlias}]]` + }) + } + + return src + }, + markdownPlugins() { + const plugins: PluggableList = [] + if (opts.wikilinks) { + plugins.push(() => { + return (tree: Root, _file) => { + findAndReplace(tree, wikilinkRegex, (value: string, ...capture: string[]) => { + let [rawFp, rawHeader, rawAlias] = capture + const fp = rawFp?.trim() ?? "" + const anchor = rawHeader?.trim() ?? "" + const alias = rawAlias?.slice(1).trim() + + // embed cases + if (value.startsWith("!")) { + const ext: string = path.extname(fp).toLowerCase() + const url = slugifyFilePath(fp as FilePath) + if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) { + const dims = alias ?? "" + let [width, height] = dims.split("x", 2) + width ||= "auto" + height ||= "auto" + return { + type: "image", + url, + data: { + hProperties: { + width, + height, + }, + }, + } + } else if ([".mp4", ".webm", ".ogv", ".mov", ".mkv"].includes(ext)) { + return { + type: "html", + value: ``, + } + } else if ( + [".mp3", ".webm", ".wav", ".m4a", ".ogg", ".3gp", ".flac"].includes(ext) + ) { + return { + type: "html", + value: ``, + } + } else if ([".pdf"].includes(ext)) { + return { + type: "html", + value: ``, + } + } else if (ext === "") { + const block = anchor.slice(1) + return { + type: "html", + data: { hProperties: { transclude: true } }, + value: `
        Transclude of block ${block}
        `, + } + } + + // otherwise, fall through to regular link + } + + // internal link + const url = fp + anchor + return { + type: "link", + url, + children: [ + { + type: "text", + value: alias ?? fp, + }, + ], + } + }) + } + }) + } + + if (opts.highlight) { + plugins.push(() => { + return (tree: Root, _file) => { + findAndReplace(tree, highlightRegex, (_value: string, ...capture: string[]) => { + const [inner] = capture + return { + type: "html", + value: `${inner}`, + } + }) + } + }) + } + + if (opts.comments) { + plugins.push(() => { + return (tree: Root, _file) => { + findAndReplace(tree, commentRegex, (_value: string, ..._capture: string[]) => { + return { + type: "text", + value: "", + } + }) + } + }) + } + + if (opts.callouts) { + plugins.push(() => { + return (tree: Root, _file) => { + visit(tree, "blockquote", (node) => { + if (node.children.length === 0) { + return + } + + // find first line + const firstChild = node.children[0] + if (firstChild.type !== "paragraph" || firstChild.children[0]?.type !== "text") { + return + } + + const text = firstChild.children[0].value + const restChildren = firstChild.children.slice(1) + const [firstLine, ...remainingLines] = text.split("\n") + const remainingText = remainingLines.join("\n") + + const match = firstLine.match(calloutRegex) + if (match && match.input) { + const [calloutDirective, typeString, collapseChar] = match + const calloutType = canonicalizeCallout( + typeString.toLowerCase() as keyof typeof calloutMapping, + ) + const collapse = collapseChar === "+" || collapseChar === "-" + const defaultState = collapseChar === "-" ? "collapsed" : "expanded" + const titleContent = + match.input.slice(calloutDirective.length).trim() || capitalize(calloutType) + const titleNode: Paragraph = { + type: "paragraph", + children: [{ type: "text", value: titleContent + " " }, ...restChildren], + } + const title = mdastToHtml(titleNode) + + const toggleIcon = ` + + ` + + const titleHtml: HTML = { + type: "html", + value: `
        +
        ${callouts[calloutType]}
        +
        ${title}
        + ${collapse ? toggleIcon : ""} +
        `, + } + + const blockquoteContent: (BlockContent | DefinitionContent)[] = [titleHtml] + if (remainingText.length > 0) { + blockquoteContent.push({ + type: "paragraph", + children: [ + { + type: "text", + value: remainingText, + }, + ], + }) + } + + // replace first line of blockquote with title and rest of the paragraph text + node.children.splice(0, 1, ...blockquoteContent) + + // add properties to base blockquote + node.data = { + hProperties: { + ...(node.data?.hProperties ?? {}), + className: `callout ${collapse ? "is-collapsible" : ""} ${ + defaultState === "collapsed" ? "is-collapsed" : "" + }`, + "data-callout": calloutType, + "data-callout-fold": collapse, + }, + } + } + }) + } + }) + } + + if (opts.mermaid) { + plugins.push(() => { + return (tree: Root, _file) => { + visit(tree, "code", (node: Code) => { + if (node.lang === "mermaid") { + node.data = { + hProperties: { + className: ["mermaid"], + }, + } + } + }) + } + }) + } + + if (opts.parseTags) { + plugins.push(() => { + return (tree: Root, file) => { + const base = pathToRoot(file.data.slug!) + findAndReplace(tree, tagRegex, (_value: string, tag: string) => { + // Check if the tag only includes numbers + if (/^\d+$/.test(tag)) { + return false + } + tag = slugTag(tag) + if (file.data.frontmatter && !file.data.frontmatter.tags.includes(tag)) { + file.data.frontmatter.tags.push(tag) + } + + return { + type: "link", + url: base + `/tags/${tag}`, + data: { + hProperties: { + className: ["tag-link"], + }, + }, + children: [ + { + type: "text", + value: `#${tag}`, + }, + ], + } + }) + } + }) + } + return plugins + }, + htmlPlugins() { + const plugins = [rehypeRaw] + + if (opts.parseBlockReferences) { + plugins.push(() => { + const inlineTagTypes = new Set(["p", "li"]) + const blockTagTypes = new Set(["blockquote"]) + return (tree, file) => { + file.data.blocks = {} + + visit(tree, "element", (node, index, parent) => { + if (blockTagTypes.has(node.tagName)) { + const nextChild = parent?.children.at(index! + 2) as Element + if (nextChild && nextChild.tagName === "p") { + const text = nextChild.children.at(0) as Literal + if (text && text.value && text.type === "text") { + const matches = text.value.match(blockReferenceRegex) + if (matches && matches.length >= 1) { + parent!.children.splice(index! + 2, 1) + const block = matches[0].slice(1) + + if (!Object.keys(file.data.blocks!).includes(block)) { + node.properties = { + ...node.properties, + id: block, + } + file.data.blocks![block] = node + } + } + } + } + } else if (inlineTagTypes.has(node.tagName)) { + const last = node.children.at(-1) as Literal + if (last && last.value && typeof last.value === "string") { + const matches = last.value.match(blockReferenceRegex) + if (matches && matches.length >= 1) { + last.value = last.value.slice(0, -matches[0].length) + const block = matches[0].slice(1) + + if (!Object.keys(file.data.blocks!).includes(block)) { + node.properties = { + ...node.properties, + id: block, + } + file.data.blocks![block] = node + } + } + } + } + }) + } + }) + } + + return plugins + }, + externalResources() { + const js: JSResource[] = [] + + if (opts.callouts) { + js.push({ + script: calloutScript, + loadTime: "afterDOMReady", + contentType: "inline", + }) + } + + if (opts.mermaid) { + js.push({ + script: ` + import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; + const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + theme: darkMode ? 'dark' : 'default' + }); + document.addEventListener('nav', async () => { + await mermaid.run({ + querySelector: '.mermaid' + }) + }); + `, + loadTime: "afterDOMReady", + moduleType: "module", + contentType: "inline", + }) + } + + return { js } + }, + } +} + +declare module "vfile" { + interface DataMap { + blocks: Record + } +} diff --git a/quartz/plugins/transformers/oxhugofm.ts b/quartz/plugins/transformers/oxhugofm.ts new file mode 100644 index 0000000..6e70bb1 --- /dev/null +++ b/quartz/plugins/transformers/oxhugofm.ts @@ -0,0 +1,108 @@ +import { QuartzTransformerPlugin } from "../types" + +export interface Options { + /** Replace {{ relref }} with quartz wikilinks []() */ + wikilinks: boolean + /** Remove pre-defined anchor (see https://ox-hugo.scripter.co/doc/anchors/) */ + removePredefinedAnchor: boolean + /** Remove hugo shortcode syntax */ + removeHugoShortcode: boolean + /** Replace
        with ![]() */ + replaceFigureWithMdImg: boolean + + /** Replace org latex fragments with $ and $$ */ + replaceOrgLatex: boolean +} + +const defaultOptions: Options = { + wikilinks: true, + removePredefinedAnchor: true, + removeHugoShortcode: true, + replaceFigureWithMdImg: true, + replaceOrgLatex: true, +} + +const relrefRegex = new RegExp(/\[([^\]]+)\]\(\{\{< relref "([^"]+)" >\}\}\)/, "g") +const predefinedHeadingIdRegex = new RegExp(/(.*) {#(?:.*)}/, "g") +const hugoShortcodeRegex = new RegExp(/{{(.*)}}/, "g") +const figureTagRegex = new RegExp(/< ?figure src="(.*)" ?>/, "g") +// \\\\\( -> matches \\( +// (.+?) -> Lazy match for capturing the equation +// \\\\\) -> matches \\) +const inlineLatexRegex = new RegExp(/\\\\\((.+?)\\\\\)/, "g") +// (?:\\begin{equation}|\\\\\(|\\\\\[) -> start of equation +// ([\s\S]*?) -> Matches the block equation +// (?:\\\\\]|\\\\\)|\\end{equation}) -> end of equation +const blockLatexRegex = new RegExp( + /(?:\\begin{equation}|\\\\\(|\\\\\[)([\s\S]*?)(?:\\\\\]|\\\\\)|\\end{equation})/, + "g", +) +// \$\$[\s\S]*?\$\$ -> Matches block equations +// \$.*?\$ -> Matches inline equations +const quartzLatexRegex = new RegExp(/\$\$[\s\S]*?\$\$|\$.*?\$/, "g") + +/** + * ox-hugo is an org exporter backend that exports org files to hugo-compatible + * markdown in an opinionated way. This plugin adds some tweaks to the generated + * markdown to make it compatible with quartz but the list of changes applied it + * is not exhaustive. + * */ +export const OxHugoFlavouredMarkdown: QuartzTransformerPlugin | undefined> = ( + userOpts, +) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "OxHugoFlavouredMarkdown", + textTransform(_ctx, src) { + if (opts.wikilinks) { + src = src.toString() + src = src.replaceAll(relrefRegex, (value, ...capture) => { + const [text, link] = capture + return `[${text}](${link})` + }) + } + + if (opts.removePredefinedAnchor) { + src = src.toString() + src = src.replaceAll(predefinedHeadingIdRegex, (value, ...capture) => { + const [headingText] = capture + return headingText + }) + } + + if (opts.removeHugoShortcode) { + src = src.toString() + src = src.replaceAll(hugoShortcodeRegex, (value, ...capture) => { + const [scContent] = capture + return scContent + }) + } + + if (opts.replaceFigureWithMdImg) { + src = src.toString() + src = src.replaceAll(figureTagRegex, (value, ...capture) => { + const [src] = capture + return `![](${src})` + }) + } + + if (opts.replaceOrgLatex) { + src = src.toString() + src = src.replaceAll(inlineLatexRegex, (value, ...capture) => { + const [eqn] = capture + return `$${eqn}$` + }) + src = src.replaceAll(blockLatexRegex, (value, ...capture) => { + const [eqn] = capture + return `$$${eqn}$$` + }) + + // ox-hugo escapes _ as \_ + src = src.replaceAll(quartzLatexRegex, (value) => { + return value.replaceAll("\\_", "_") + }) + } + return src + }, + } +} diff --git a/quartz/plugins/transformers/syntax.ts b/quartz/plugins/transformers/syntax.ts new file mode 100644 index 0000000..1766817 --- /dev/null +++ b/quartz/plugins/transformers/syntax.ts @@ -0,0 +1,16 @@ +import { QuartzTransformerPlugin } from "../types" +import rehypePrettyCode, { Options as CodeOptions } from "rehype-pretty-code" + +export const SyntaxHighlighting: QuartzTransformerPlugin = () => ({ + name: "SyntaxHighlighting", + htmlPlugins() { + return [ + [ + rehypePrettyCode, + { + theme: "css-variables", + } satisfies Partial, + ], + ] + }, +}) diff --git a/quartz/plugins/transformers/toc.ts b/quartz/plugins/transformers/toc.ts new file mode 100644 index 0000000..87c5802 --- /dev/null +++ b/quartz/plugins/transformers/toc.ts @@ -0,0 +1,74 @@ +import { QuartzTransformerPlugin } from "../types" +import { Root } from "mdast" +import { visit } from "unist-util-visit" +import { toString } from "mdast-util-to-string" +import Slugger from "github-slugger" + +export interface Options { + maxDepth: 1 | 2 | 3 | 4 | 5 | 6 + minEntries: 1 + showByDefault: boolean + collapseByDefault: boolean +} + +const defaultOptions: Options = { + maxDepth: 3, + minEntries: 1, + showByDefault: true, + collapseByDefault: false, +} + +interface TocEntry { + depth: number + text: string + slug: string // this is just the anchor (#some-slug), not the canonical slug +} + +export const TableOfContents: QuartzTransformerPlugin | undefined> = ( + userOpts, +) => { + const opts = { ...defaultOptions, ...userOpts } + return { + name: "TableOfContents", + markdownPlugins() { + return [ + () => { + return async (tree: Root, file) => { + const display = file.data.frontmatter?.enableToc ?? opts.showByDefault + if (display) { + const slugAnchor = new Slugger() + const toc: TocEntry[] = [] + let highestDepth: number = opts.maxDepth + visit(tree, "heading", (node) => { + if (node.depth <= opts.maxDepth) { + const text = toString(node) + highestDepth = Math.min(highestDepth, node.depth) + toc.push({ + depth: node.depth, + text, + slug: slugAnchor.slug(text), + }) + } + }) + + if (toc.length > opts.minEntries) { + file.data.toc = toc.map((entry) => ({ + ...entry, + depth: entry.depth - highestDepth, + })) + file.data.collapseToc = opts.collapseByDefault + } + } + } + }, + ] + }, + } +} + +declare module "vfile" { + interface DataMap { + toc: TocEntry[] + collapseToc: boolean + } +} diff --git a/quartz/plugins/types.ts b/quartz/plugins/types.ts new file mode 100644 index 0000000..eaeb12a --- /dev/null +++ b/quartz/plugins/types.ts @@ -0,0 +1,54 @@ +import { PluggableList } from "unified" +import { StaticResources } from "../util/resources" +import { ProcessedContent } from "./vfile" +import { QuartzComponent } from "../components/types" +import { FilePath, FullSlug } from "../util/path" +import { BuildCtx } from "../util/ctx" + +export interface PluginTypes { + transformers: QuartzTransformerPluginInstance[] + filters: QuartzFilterPluginInstance[] + emitters: QuartzEmitterPluginInstance[] +} + +type OptionType = object | undefined +export type QuartzTransformerPlugin = ( + opts?: Options, +) => QuartzTransformerPluginInstance +export type QuartzTransformerPluginInstance = { + name: string + textTransform?: (ctx: BuildCtx, src: string | Buffer) => string | Buffer + markdownPlugins?: (ctx: BuildCtx) => PluggableList + htmlPlugins?: (ctx: BuildCtx) => PluggableList + externalResources?: (ctx: BuildCtx) => Partial +} + +export type QuartzFilterPlugin = ( + opts?: Options, +) => QuartzFilterPluginInstance +export type QuartzFilterPluginInstance = { + name: string + shouldPublish(ctx: BuildCtx, content: ProcessedContent): boolean +} + +export type QuartzEmitterPlugin = ( + opts?: Options, +) => QuartzEmitterPluginInstance +export type QuartzEmitterPluginInstance = { + name: string + emit( + ctx: BuildCtx, + content: ProcessedContent[], + resources: StaticResources, + emitCallback: EmitCallback, + ): Promise + getQuartzComponents(ctx: BuildCtx): QuartzComponent[] +} + +export interface EmitOptions { + slug: FullSlug + ext: `.${string}` | "" + content: string +} + +export type EmitCallback = (data: EmitOptions) => Promise diff --git a/quartz/plugins/vfile.ts b/quartz/plugins/vfile.ts new file mode 100644 index 0000000..068981a --- /dev/null +++ b/quartz/plugins/vfile.ts @@ -0,0 +1,12 @@ +import { Node, Parent } from "hast" +import { Data, VFile } from "vfile" + +export type QuartzPluginData = Data +export type ProcessedContent = [Node, VFile] + +export function defaultProcessedContent(vfileData: Partial): ProcessedContent { + const root: Parent = { type: "root", children: [] } + const vfile = new VFile("") + vfile.data = vfileData + return [root, vfile] +} diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts new file mode 100644 index 0000000..3b357aa --- /dev/null +++ b/quartz/processors/emit.ts @@ -0,0 +1,44 @@ +import path from "path" +import fs from "fs" +import { PerfTimer } from "../util/perf" +import { getStaticResourcesFromPlugins } from "../plugins" +import { EmitCallback } from "../plugins/types" +import { ProcessedContent } from "../plugins/vfile" +import { FilePath, joinSegments } from "../util/path" +import { QuartzLogger } from "../util/log" +import { trace } from "../util/trace" +import { BuildCtx } from "../util/ctx" + +export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { + const { argv, cfg } = ctx + const perf = new PerfTimer() + const log = new QuartzLogger(ctx.argv.verbose) + + log.start(`Emitting output files`) + const emit: EmitCallback = async ({ slug, ext, content }) => { + const pathToPage = joinSegments(argv.output, slug + ext) as FilePath + const dir = path.dirname(pathToPage) + await fs.promises.mkdir(dir, { recursive: true }) + await fs.promises.writeFile(pathToPage, content) + return pathToPage + } + + let emittedFiles = 0 + const staticResources = getStaticResourcesFromPlugins(ctx) + for (const emitter of cfg.plugins.emitters) { + try { + const emitted = await emitter.emit(ctx, content, staticResources, emit) + emittedFiles += emitted.length + + if (ctx.argv.verbose) { + for (const file of emitted) { + console.log(`[emit:${emitter.name}] ${file}`) + } + } + } catch (err) { + trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error) + } + } + + log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`) +} diff --git a/quartz/processors/filter.ts b/quartz/processors/filter.ts new file mode 100644 index 0000000..b269fb3 --- /dev/null +++ b/quartz/processors/filter.ts @@ -0,0 +1,24 @@ +import { BuildCtx } from "../util/ctx" +import { PerfTimer } from "../util/perf" +import { ProcessedContent } from "../plugins/vfile" + +export function filterContent(ctx: BuildCtx, content: ProcessedContent[]): ProcessedContent[] { + const { cfg, argv } = ctx + const perf = new PerfTimer() + const initialLength = content.length + for (const plugin of cfg.plugins.filters) { + const updatedContent = content.filter((item) => plugin.shouldPublish(ctx, item)) + + if (argv.verbose) { + const diff = content.filter((x) => !updatedContent.includes(x)) + for (const file of diff) { + console.log(`[filter:${plugin.name}] ${file[1].data.slug}`) + } + } + + content = updatedContent + } + + console.log(`Filtered out ${initialLength - content.length} files in ${perf.timeSince()}`) + return content +} diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts new file mode 100644 index 0000000..29f92fc --- /dev/null +++ b/quartz/processors/parse.ts @@ -0,0 +1,161 @@ +import esbuild from "esbuild" +import remarkParse from "remark-parse" +import remarkRehype from "remark-rehype" +import { Processor, unified } from "unified" +import { Root as MDRoot } from "remark-parse/lib" +import { Root as HTMLRoot } from "hast" +import { ProcessedContent } from "../plugins/vfile" +import { PerfTimer } from "../util/perf" +import { read } from "to-vfile" +import { FilePath, QUARTZ, slugifyFilePath } from "../util/path" +import path from "path" +import workerpool, { Promise as WorkerPromise } from "workerpool" +import { QuartzLogger } from "../util/log" +import { trace } from "../util/trace" +import { BuildCtx } from "../util/ctx" + +export type QuartzProcessor = Processor +export function createProcessor(ctx: BuildCtx): QuartzProcessor { + const transformers = ctx.cfg.plugins.transformers + + // base Markdown -> MD AST + let processor = unified().use(remarkParse) + + // MD AST -> MD AST transforms + for (const plugin of transformers.filter((p) => p.markdownPlugins)) { + processor = processor.use(plugin.markdownPlugins!(ctx)) + } + + // MD AST -> HTML AST + processor = processor.use(remarkRehype, { allowDangerousHtml: true }) + + // HTML AST -> HTML AST transforms + for (const plugin of transformers.filter((p) => p.htmlPlugins)) { + processor = processor.use(plugin.htmlPlugins!(ctx)) + } + + return processor +} + +function* chunks(arr: T[], n: number) { + for (let i = 0; i < arr.length; i += n) { + yield arr.slice(i, i + n) + } +} + +async function transpileWorkerScript() { + // transpile worker script + const cacheFile = "./.quartz-cache/transpiled-worker.mjs" + const fp = "./quartz/worker.ts" + return esbuild.build({ + entryPoints: [fp], + outfile: path.join(QUARTZ, cacheFile), + bundle: true, + keepNames: true, + platform: "node", + format: "esm", + packages: "external", + sourcemap: true, + sourcesContent: false, + plugins: [ + { + name: "css-and-scripts-as-text", + setup(build) { + build.onLoad({ filter: /\.scss$/ }, (_) => ({ + contents: "", + loader: "text", + })) + build.onLoad({ filter: /\.inline\.(ts|js)$/ }, (_) => ({ + contents: "", + loader: "text", + })) + }, + }, + ], + }) +} + +export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { + const { argv, cfg } = ctx + return async (processor: QuartzProcessor) => { + const res: ProcessedContent[] = [] + for (const fp of fps) { + try { + const perf = new PerfTimer() + const file = await read(fp) + + // strip leading and trailing whitespace + file.value = file.value.toString().trim() + + // Text -> Text transforms + for (const plugin of cfg.plugins.transformers.filter((p) => p.textTransform)) { + file.value = plugin.textTransform!(ctx, file.value) + } + + // base data properties that plugins may use + file.data.slug = slugifyFilePath(path.posix.relative(argv.directory, file.path) as FilePath) + file.data.filePath = fp + + const ast = processor.parse(file) + const newAst = await processor.run(ast, file) + res.push([newAst, file]) + + if (argv.verbose) { + console.log(`[process] ${fp} -> ${file.data.slug} (${perf.timeSince()})`) + } + } catch (err) { + trace(`\nFailed to process \`${fp}\``, err as Error) + } + } + + return res + } +} + +const clamp = (num: number, min: number, max: number) => + Math.min(Math.max(Math.round(num), min), max) +export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise { + const { argv } = ctx + const perf = new PerfTimer() + const log = new QuartzLogger(argv.verbose) + + // rough heuristics: 128 gives enough time for v8 to JIT and optimize parsing code paths + const CHUNK_SIZE = 128 + const concurrency = ctx.argv.concurrency ?? clamp(fps.length / CHUNK_SIZE, 1, 4) + + let res: ProcessedContent[] = [] + log.start(`Parsing input files using ${concurrency} threads`) + if (concurrency === 1) { + try { + const processor = createProcessor(ctx) + const parse = createFileParser(ctx, fps) + res = await parse(processor) + } catch (error) { + log.end() + throw error + } + } else { + await transpileWorkerScript() + const pool = workerpool.pool("./quartz/bootstrap-worker.mjs", { + minWorkers: "max", + maxWorkers: concurrency, + workerType: "thread", + }) + + const childPromises: WorkerPromise[] = [] + for (const chunk of chunks(fps, CHUNK_SIZE)) { + childPromises.push(pool.exec("parseFiles", [argv, chunk, ctx.allSlugs])) + } + + const results: ProcessedContent[][] = await WorkerPromise.all(childPromises).catch((err) => { + const errString = err.toString().slice("Error:".length) + console.error(errString) + process.exit(1) + }) + res = results.flat() + await pool.terminate() + } + + log.end(`Parsed ${res.length} Markdown files in ${perf.timeSince()}`) + return res +} diff --git a/quartz/static/icon.png b/quartz/static/icon.png new file mode 100644 index 0000000..b6656a7 Binary files /dev/null and b/quartz/static/icon.png differ diff --git a/quartz/static/og-image.png b/quartz/static/og-image.png new file mode 100644 index 0000000..f132145 Binary files /dev/null and b/quartz/static/og-image.png differ diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss new file mode 100644 index 0000000..51694cb --- /dev/null +++ b/quartz/styles/base.scss @@ -0,0 +1,479 @@ +@use "./variables.scss" as *; +@use "./syntax.scss"; +@use "./callouts.scss"; + +html { + scroll-behavior: smooth; + -webkit-text-size-adjust: none; + text-size-adjust: none; + overflow-x: hidden; + width: 100vw; +} + +body, +section { + margin: 0; + max-width: 100%; + box-sizing: border-box; + background-color: var(--light); + font-family: var(--bodyFont); + color: var(--darkgray); +} + +.text-highlight { + background-color: #fff23688; + padding: 0 0.1rem; + border-radius: 5px; +} + +::selection { + background: color-mix(in srgb, var(--tertiary) 75%, transparent); + color: var(--darkgray); +} + +p, +ul, +text, +a, +tr, +td, +li, +ol, +ul, +.katex, +.math { + color: var(--darkgray); + fill: var(--darkgray); + overflow-wrap: anywhere; + hyphens: auto; +} + +.math { + &.math-display { + text-align: center; + } +} + +a { + font-weight: 600; + text-decoration: none; + transition: color 0.2s ease; + color: var(--secondary); + + &:hover { + color: var(--tertiary) !important; + } + + &.internal { + text-decoration: none; + background-color: var(--highlight); + padding: 0 0.1rem; + border-radius: 5px; + } +} + +.desktop-only { + display: initial; + @media all and (max-width: $fullPageWidth) { + display: none; + } +} + +.mobile-only { + display: none; + @media all and (max-width: $fullPageWidth) { + display: initial; + } +} + +.page { + @media all and (max-width: $fullPageWidth) { + margin: 0 auto; + padding: 0 1rem; + max-width: $pageWidth; + } + + & article { + position: relative; + + & > h1 { + font-size: 2rem; + } + + & li:has(> input[type="checkbox"]) { + list-style-type: none; + padding-left: 0; + } + + & li:has(> input[type="checkbox"]:checked) { + text-decoration: line-through; + text-decoration-color: var(--gray); + color: var(--gray); + } + + & li > * { + margin-top: 0; + margin-bottom: 0; + } + + p > strong { + color: var(--dark); + } + } + + & > #quartz-body { + width: 100%; + display: flex; + @media all and (max-width: $fullPageWidth) { + flex-direction: column; + } + + & .sidebar { + flex: 1; + display: flex; + flex-direction: column; + gap: 2rem; + top: 0; + width: $sidePanelWidth; + margin-top: $topSpacing; + box-sizing: border-box; + padding: 0 4rem; + position: fixed; + @media all and (max-width: $fullPageWidth) { + position: initial; + flex-direction: row; + padding: 0; + width: initial; + margin-top: 2rem; + } + } + + & .sidebar.left { + left: calc(calc(100vw - $pageWidth) / 2 - $sidePanelWidth); + @media all and (max-width: $fullPageWidth) { + gap: 0; + align-items: center; + } + } + + & .sidebar.right { + right: calc(calc(100vw - $pageWidth) / 2 - $sidePanelWidth); + & > * { + @media all and (max-width: $fullPageWidth) { + flex: 1; + } + } + } + } + + & .page-header { + width: $pageWidth; + margin: $topSpacing auto 0 auto; + @media all and (max-width: $fullPageWidth) { + width: initial; + margin-top: 2rem; + } + } + + & .center, + & footer { + margin-left: auto; + margin-right: auto; + width: $pageWidth; + @media all and (max-width: $fullPageWidth) { + width: initial; + margin-left: 0; + margin-right: 0; + } + } +} + +.footnotes { + margin-top: 2rem; + border-top: 1px solid var(--lightgray); +} + +input[type="checkbox"] { + transform: translateY(2px); + color: var(--secondary); + border: 1px solid var(--lightgray); + border-radius: 3px; + background-color: var(--light); + position: relative; + margin-inline-end: 0.2rem; + margin-inline-start: -1.4rem; + appearance: none; + width: 16px; + height: 16px; + + &:checked { + border-color: var(--secondary); + background-color: var(--secondary); + + &::after { + content: ""; + position: absolute; + left: 4px; + top: 1px; + width: 4px; + height: 8px; + display: block; + border: solid var(--light); + border-width: 0 2px 2px 0; + transform: rotate(45deg); + } + } +} + +blockquote { + margin: 1rem 0; + border-left: 3px solid var(--secondary); + padding-left: 1rem; + transition: border-color 0.2s ease; +} + +h1, +h2, +h3, +h4, +h5, +h6, +thead { + font-family: var(--headerFont); + color: var(--dark); + font-weight: revert; + margin-bottom: 0; + + article > & > a { + color: var(--dark); + &.internal { + background-color: transparent; + } + } +} + +h1, +h2, +h3, +h4, +h5, +h6 { + &[id] > a[href^="#"] { + margin: 0 0.5rem; + opacity: 0; + transition: opacity 0.2s ease; + transform: translateY(-0.1rem); + display: inline-block; + font-family: var(--codeFont); + user-select: none; + } + + &[id]:hover > a { + opacity: 1; + } +} + +// typography improvements +h1 { + font-size: 1.75rem; + margin-top: 2.25rem; + margin-bottom: 1rem; +} + +h2 { + font-size: 1.4rem; + margin-top: 1.9rem; + margin-bottom: 1rem; +} + +h3 { + font-size: 1.12rem; + margin-top: 1.62rem; + margin-bottom: 1rem; +} + +h4, +h5, +h6 { + font-size: 1rem; + margin-top: 1.5rem; + margin-bottom: 1rem; +} + +div[data-rehype-pretty-code-fragment] { + line-height: 1.6rem; + position: relative; + + & > div[data-rehype-pretty-code-title] { + font-family: var(--codeFont); + font-size: 0.9rem; + padding: 0.1rem 0.5rem; + border: 1px solid var(--lightgray); + width: max-content; + border-radius: 5px; + margin-bottom: -0.5rem; + color: var(--darkgray); + } + + & > pre { + padding: 0.5rem 0; + } +} + +pre { + font-family: var(--codeFont); + padding: 0.5rem; + border-radius: 5px; + overflow-x: auto; + border: 1px solid var(--lightgray); + + &:has(> code.mermaid) { + border: none; + } + + & > code { + background: none; + padding: 0; + font-size: 0.85rem; + counter-reset: line; + counter-increment: line 0; + display: grid; + + & [data-highlighted-chars] { + background-color: var(--highlight); + border-radius: 5px; + } + + & > [data-line] { + padding: 0 0.25rem; + box-sizing: border-box; + border-left: 3px solid transparent; + + &[data-highlighted-line] { + background-color: var(--highlight); + border-left: 3px solid var(--secondary); + } + + &::before { + content: counter(line); + counter-increment: line; + width: 1rem; + margin-right: 1rem; + display: inline-block; + text-align: right; + color: rgba(115, 138, 148, 0.6); + } + } + + &[data-line-numbers-max-digits="2"] > [data-line]::before { + width: 2rem; + } + + &[data-line-numbers-max-digits="3"] > [data-line]::before { + width: 3rem; + } + } +} + +code { + font-size: 0.9em; + color: var(--dark); + font-family: var(--codeFont); + border-radius: 5px; + padding: 0.1rem 0.2rem; + background: var(--lightgray); +} + +tbody, +li, +p { + line-height: 1.6rem; +} + +table { + margin: 1rem; + padding: 1.5rem; + border-collapse: collapse; + & > * { + line-height: 2rem; + } +} + +th { + text-align: left; + padding: 0.4rem 1rem; + border-bottom: 2px solid var(--gray); +} + +td { + padding: 0.2rem 1rem; +} + +tr { + border-bottom: 1px solid var(--lightgray); + &:last-child { + border-bottom: none; + } +} + +img { + max-width: 100%; + border-radius: 5px; + margin: 1rem 0; +} + +p > img + em { + display: block; + transform: translateY(-1rem); +} + +hr { + width: 100%; + margin: 2rem auto; + height: 1px; + border: none; + background-color: var(--lightgray); +} + +audio, +video { + width: 100%; + border-radius: 5px; +} + +.spacer { + flex: 1 1 auto; +} + +ul.overflow, +ol.overflow { + max-height: 400; + overflow-y: auto; + + // clearfix + content: ""; + clear: both; + + & > li:last-of-type { + margin-bottom: 30px; + } + + &:after { + pointer-events: none; + content: ""; + width: 100%; + height: 50px; + position: absolute; + left: 0; + bottom: 0; + opacity: 1; + transition: opacity 0.3s ease; + background: linear-gradient(transparent 0px, var(--light)); + } +} + +.transclude { + ul { + padding-left: 1rem; + } +} diff --git a/quartz/styles/callouts.scss b/quartz/styles/callouts.scss new file mode 100644 index 0000000..703bd67 --- /dev/null +++ b/quartz/styles/callouts.scss @@ -0,0 +1,111 @@ +@use "sass:color"; + +.callout { + border: 1px solid var(--border); + background-color: var(--bg); + border-radius: 5px; + padding: 0 1rem; + overflow-y: hidden; + transition: max-height 0.3s ease; + box-sizing: border-box; + + & > *:nth-child(2) { + margin-top: 0; + } + + &[data-callout="note"] { + --color: #448aff; + --border: #448aff44; + --bg: #448aff10; + } + + &[data-callout="abstract"] { + --color: #00b0ff; + --border: #00b0ff44; + --bg: #00b0ff10; + } + + &[data-callout="info"], + &[data-callout="todo"] { + --color: #00b8d4; + --border: #00b8d444; + --bg: #00b8d410; + } + + &[data-callout="tip"] { + --color: #00bfa5; + --border: #00bfa544; + --bg: #00bfa510; + } + + &[data-callout="success"] { + --color: #09ad7a; + --border: #09ad7144; + --bg: #09ad7110; + } + + &[data-callout="question"] { + --color: #dba642; + --border: #dba64244; + --bg: #dba64210; + } + + &[data-callout="warning"] { + --color: #db8942; + --border: #db894244; + --bg: #db894210; + } + + &[data-callout="failure"], + &[data-callout="danger"], + &[data-callout="bug"] { + --color: #db4242; + --border: #db424244; + --bg: #db424210; + } + + &[data-callout="example"] { + --color: #7a43b5; + --border: #7a43b544; + --bg: #7a43b510; + } + + &[data-callout="quote"] { + --color: var(--secondary); + --border: var(--lightgray); + } + + &.is-collapsed > .callout-title > .fold { + transform: rotateZ(-90deg); + } +} + +.callout-title { + display: flex; + gap: 5px; + padding: 1rem 0; + color: var(--color); + + & .fold { + margin-left: 0.5rem; + transition: transform 0.3s ease; + opacity: 0.8; + cursor: pointer; + } + + & > .callout-title-inner > p { + color: var(--color); + margin: 0; + } +} + +.callout-icon { + width: 18px; + height: 18px; + flex: 0 0 18px; + padding-top: 4px; +} + +.callout-title-inner { + font-weight: 700; +} diff --git a/quartz/styles/custom.scss b/quartz/styles/custom.scss new file mode 100644 index 0000000..b0c09dc --- /dev/null +++ b/quartz/styles/custom.scss @@ -0,0 +1,3 @@ +@use "./base.scss"; + +// put your custom CSS here! diff --git a/quartz/styles/syntax.scss b/quartz/styles/syntax.scss new file mode 100644 index 0000000..623ee6f --- /dev/null +++ b/quartz/styles/syntax.scss @@ -0,0 +1,29 @@ +// npx convert-sh-theme https://raw.githubusercontent.com/shikijs/shiki/main/packages/shiki/themes/github-light.json +:root { + --shiki-color-text: #24292e; + --shiki-color-background: #f8f8f8; + --shiki-token-constant: #005cc5; + --shiki-token-string: #032f62; + --shiki-token-comment: #6a737d; + --shiki-token-keyword: #d73a49; + --shiki-token-parameter: #24292e; + --shiki-token-function: #24292e; + --shiki-token-string-expression: #22863a; + --shiki-token-punctuation: #24292e; + --shiki-token-link: #24292e; +} + +// npx convert-sh-theme https://raw.githubusercontent.com/shikijs/shiki/main/packages/shiki/themes/github-dark.json +[saved-theme="dark"] { + --shiki-color-text: #e1e4e8 !important; + --shiki-color-background: #24292e !important; + --shiki-token-constant: #79b8ff !important; + --shiki-token-string: #9ecbff !important; + --shiki-token-comment: #6a737d !important; + --shiki-token-keyword: #f97583 !important; + --shiki-token-parameter: #e1e4e8 !important; + --shiki-token-function: #e1e4e8 !important; + --shiki-token-string-expression: #85e89d !important; + --shiki-token-punctuation: #e1e4e8 !important; + --shiki-token-link: #e1e4e8 !important; +} diff --git a/quartz/styles/variables.scss b/quartz/styles/variables.scss new file mode 100644 index 0000000..30004aa --- /dev/null +++ b/quartz/styles/variables.scss @@ -0,0 +1,6 @@ +$pageWidth: 750px; +$mobileBreakpoint: 600px; +$tabletBreakpoint: 1200px; +$sidePanelWidth: 380px; +$topSpacing: 6rem; +$fullPageWidth: $pageWidth + 2 * $sidePanelWidth; diff --git a/quartz/util/ctx.ts b/quartz/util/ctx.ts new file mode 100644 index 0000000..13e0bf8 --- /dev/null +++ b/quartz/util/ctx.ts @@ -0,0 +1,19 @@ +import { QuartzConfig } from "../cfg" +import { FullSlug } from "./path" + +export interface Argv { + directory: string + verbose: boolean + output: string + serve: boolean + port: number + wsPort: number + remoteDevHost?: string + concurrency?: number +} + +export interface BuildCtx { + argv: Argv + cfg: QuartzConfig + allSlugs: FullSlug[] +} diff --git a/quartz/util/escape.ts b/quartz/util/escape.ts new file mode 100644 index 0000000..197558c --- /dev/null +++ b/quartz/util/escape.ts @@ -0,0 +1,8 @@ +export const escapeHTML = (unsafe: string) => { + return unsafe + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'") +} diff --git a/quartz/util/glob.ts b/quartz/util/glob.ts new file mode 100644 index 0000000..7a71160 --- /dev/null +++ b/quartz/util/glob.ts @@ -0,0 +1,22 @@ +import path from "path" +import { FilePath } from "./path" +import { globby } from "globby" + +export function toPosixPath(fp: string): string { + return fp.split(path.sep).join("/") +} + +export async function glob( + pattern: string, + cwd: string, + ignorePatterns: string[], +): Promise { + const fps = ( + await globby(pattern, { + cwd, + ignore: ignorePatterns, + gitignore: true, + }) + ).map(toPosixPath) + return fps as FilePath[] +} diff --git a/quartz/util/jsx.ts b/quartz/util/jsx.ts new file mode 100644 index 0000000..8cba485 --- /dev/null +++ b/quartz/util/jsx.ts @@ -0,0 +1,15 @@ +import { toJsxRuntime } from "hast-util-to-jsx-runtime" +import { QuartzPluginData } from "../plugins/vfile" +import { Node, Root } from "hast" +import { Fragment, jsx, jsxs } from "preact/jsx-runtime" +import { trace } from "./trace" +import { type FilePath } from "./path" + +export function htmlToJsx(fp: FilePath, tree: Node) { + try { + // @ts-ignore (preact makes it angry) + return toJsxRuntime(tree as Root, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" }) + } catch (e) { + trace(`Failed to parse Markdown in \`${fp}\` into JSX`, e as Error) + } +} diff --git a/quartz/util/lang.ts b/quartz/util/lang.ts new file mode 100644 index 0000000..5211b5d --- /dev/null +++ b/quartz/util/lang.ts @@ -0,0 +1,11 @@ +export function pluralize(count: number, s: string): string { + if (count === 1) { + return `1 ${s}` + } else { + return `${count} ${s}s` + } +} + +export function capitalize(s: string): string { + return s.substring(0, 1).toUpperCase() + s.substring(1) +} diff --git a/quartz/util/log.ts b/quartz/util/log.ts new file mode 100644 index 0000000..773945c --- /dev/null +++ b/quartz/util/log.ts @@ -0,0 +1,28 @@ +import { Spinner } from "cli-spinner" + +export class QuartzLogger { + verbose: boolean + spinner: Spinner | undefined + constructor(verbose: boolean) { + this.verbose = verbose + } + + start(text: string) { + if (this.verbose) { + console.log(text) + } else { + this.spinner = new Spinner(`%s ${text}`) + this.spinner.setSpinnerString(18) + this.spinner.start() + } + } + + end(text?: string) { + if (!this.verbose) { + this.spinner!.stop(true) + } + if (text) { + console.log(text) + } + } +} diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts new file mode 100644 index 0000000..8bbb58d --- /dev/null +++ b/quartz/util/path.test.ts @@ -0,0 +1,278 @@ +import test, { describe } from "node:test" +import * as path from "./path" +import assert from "node:assert" +import { FullSlug, TransformOptions } from "./path" + +describe("typeguards", () => { + test("isSimpleSlug", () => { + assert(path.isSimpleSlug("")) + assert(path.isSimpleSlug("abc")) + assert(path.isSimpleSlug("abc/")) + assert(path.isSimpleSlug("notindex")) + assert(path.isSimpleSlug("notindex/def")) + + assert(!path.isSimpleSlug("//")) + assert(!path.isSimpleSlug("index")) + assert(!path.isSimpleSlug("https://example.com")) + assert(!path.isSimpleSlug("/abc")) + assert(!path.isSimpleSlug("abc/index")) + assert(!path.isSimpleSlug("abc#anchor")) + assert(!path.isSimpleSlug("abc?query=1")) + assert(!path.isSimpleSlug("index.md")) + assert(!path.isSimpleSlug("index.html")) + }) + + test("isRelativeURL", () => { + assert(path.isRelativeURL(".")) + assert(path.isRelativeURL("..")) + assert(path.isRelativeURL("./abc/def")) + assert(path.isRelativeURL("./abc/def#an-anchor")) + assert(path.isRelativeURL("./abc/def?query=1#an-anchor")) + assert(path.isRelativeURL("../abc/def")) + assert(path.isRelativeURL("./abc/def.pdf")) + + assert(!path.isRelativeURL("abc")) + assert(!path.isRelativeURL("/abc/def")) + assert(!path.isRelativeURL("")) + assert(!path.isRelativeURL("./abc/def.html")) + assert(!path.isRelativeURL("./abc/def.md")) + }) + + test("isFullSlug", () => { + assert(path.isFullSlug("index")) + assert(path.isFullSlug("abc/def")) + assert(path.isFullSlug("html.energy")) + assert(path.isFullSlug("test.pdf")) + + assert(!path.isFullSlug(".")) + assert(!path.isFullSlug("./abc/def")) + assert(!path.isFullSlug("../abc/def")) + assert(!path.isFullSlug("abc/def#anchor")) + assert(!path.isFullSlug("abc/def?query=1")) + assert(!path.isFullSlug("note with spaces")) + }) + + test("isFilePath", () => { + assert(path.isFilePath("content/index.md")) + assert(path.isFilePath("content/test.png")) + assert(!path.isFilePath("../test.pdf")) + assert(!path.isFilePath("content/test")) + assert(!path.isFilePath("./content/test")) + }) +}) + +describe("transforms", () => { + function asserts( + pairs: [string, string][], + transform: (inp: Inp) => Out, + checkPre: (x: any) => x is Inp, + checkPost: (x: any) => x is Out, + ) { + 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(checkPost(actual), `${actual} wasn't the expected output type`) + } + } + + test("simplifySlug", () => { + asserts( + [ + ["index", ""], + ["abc", "abc"], + ["abc/index", "abc/"], + ["abc/def", "abc/def"], + ], + path.simplifySlug, + path.isFullSlug, + path.isSimpleSlug, + ) + }) + + test("slugifyFilePath", () => { + asserts( + [ + ["content/index.md", "content/index"], + ["content/index.html", "content/index"], + ["content/_index.md", "content/index"], + ["/content/index.md", "content/index"], + ["content/cool.png", "content/cool.png"], + ["index.md", "index"], + ["test.mp4", "test.mp4"], + ["note with spaces.md", "note-with-spaces"], + ], + path.slugifyFilePath, + path.isFilePath, + path.isFullSlug, + ) + }) + + test("transformInternalLink", () => { + asserts( + [ + ["", "."], + [".", "."], + ["./", "./"], + ["./index", "./"], + ["./index#abc", "./#abc"], + ["./index.html", "./"], + ["./index.md", "./"], + ["./index.css", "./index.css"], + ["content", "./content"], + ["content/test.md", "./content/test"], + ["content/test.pdf", "./content/test.pdf"], + ["./content/test.md", "./content/test"], + ["../content/test.md", "../content/test"], + ["tags/", "./tags/"], + ["/tags/", "./tags/"], + ["content/with spaces", "./content/with-spaces"], + ["content/with spaces/index", "./content/with-spaces/"], + ["content/with spaces#and Anchor!", "./content/with-spaces#and-anchor"], + ], + path.transformInternalLink, + (_x: string): _x is string => true, + path.isRelativeURL, + ) + }) + + test("pathToRoot", () => { + asserts( + [ + ["index", "."], + ["abc", "."], + ["abc/def", ".."], + ["abc/def/ghi", "../.."], + ["abc/def/index", "../.."], + ], + path.pathToRoot, + path.isFullSlug, + path.isRelativeURL, + ) + }) +}) + +describe("link strategies", () => { + const allSlugs = [ + "a/b/c", + "a/b/d", + "a/b/index", + "e/f", + "e/g/h", + "index", + "a/test.png", + ] as FullSlug[] + + describe("absolute", () => { + const opts: TransformOptions = { + strategy: "absolute", + allSlugs, + } + + test("from a/b/c", () => { + const cur = "a/b/c" as FullSlug + assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../a/b/d") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") + assert.strictEqual(path.transformLink(cur, "e/f", opts), "../../e/f") + assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../") + assert.strictEqual(path.transformLink(cur, "index.png", opts), "../../index.png") + assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../#abc") + assert.strictEqual(path.transformLink(cur, "tag/test", opts), "../../tag/test") + assert.strictEqual(path.transformLink(cur, "a/b/c#test", opts), "../../a/b/c#test") + assert.strictEqual(path.transformLink(cur, "a/test.png", opts), "../../a/test.png") + }) + + test("from a/b/index", () => { + const cur = "a/b/index" as FullSlug + assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../a/b/d") + assert.strictEqual(path.transformLink(cur, "a/b", opts), "../../a/b") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../") + }) + + test("from index", () => { + const cur = "index" as FullSlug + assert.strictEqual(path.transformLink(cur, "index", opts), "./") + assert.strictEqual(path.transformLink(cur, "a/b/c", opts), "./a/b/c") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") + }) + }) + + describe("shortest", () => { + const opts: TransformOptions = { + strategy: "shortest", + allSlugs, + } + + test("from a/b/c", () => { + const cur = "a/b/c" as FullSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "../../a/b/d") + assert.strictEqual(path.transformLink(cur, "h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") + assert.strictEqual(path.transformLink(cur, "a/b/index.png", opts), "../../a/b/index.png") + assert.strictEqual(path.transformLink(cur, "a/b/index#abc", opts), "../../a/b/#abc") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../") + assert.strictEqual(path.transformLink(cur, "index.png", opts), "../../index.png") + assert.strictEqual(path.transformLink(cur, "test.png", opts), "../../a/test.png") + assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../#abc") + }) + + test("from a/b/index", () => { + const cur = "a/b/index" as FullSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "../../a/b/d") + assert.strictEqual(path.transformLink(cur, "h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") + assert.strictEqual(path.transformLink(cur, "index", opts), "../../") + }) + + test("from index", () => { + const cur = "index" as FullSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "./a/b/d") + assert.strictEqual(path.transformLink(cur, "h", opts), "./e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") + assert.strictEqual(path.transformLink(cur, "index", opts), "./") + }) + }) + + describe("relative", () => { + const opts: TransformOptions = { + strategy: "relative", + allSlugs, + } + + test("from a/b/c", () => { + const cur = "a/b/c" as FullSlug + assert.strictEqual(path.transformLink(cur, "d", opts), "./d") + assert.strictEqual(path.transformLink(cur, "index", opts), "./") + assert.strictEqual(path.transformLink(cur, "../../../index", opts), "../../../") + assert.strictEqual(path.transformLink(cur, "../../../index.png", opts), "../../../index.png") + assert.strictEqual(path.transformLink(cur, "../../../index#abc", opts), "../../../#abc") + assert.strictEqual(path.transformLink(cur, "../../../", opts), "../../../") + assert.strictEqual( + path.transformLink(cur, "../../../a/test.png", opts), + "../../../a/test.png", + ) + assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") + assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") + assert.strictEqual(path.transformLink(cur, "../../../e/g/h#abc", opts), "../../../e/g/h#abc") + }) + + test("from a/b/index", () => { + const cur = "a/b/index" as FullSlug + assert.strictEqual(path.transformLink(cur, "../../index", opts), "../../") + assert.strictEqual(path.transformLink(cur, "../../", opts), "../../") + assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") + assert.strictEqual(path.transformLink(cur, "c", opts), "./c") + }) + + test("from index", () => { + const cur = "index" as FullSlug + assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "./e/g/h") + assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") + }) + }) +}) diff --git a/quartz/util/path.ts b/quartz/util/path.ts new file mode 100644 index 0000000..173eb2e --- /dev/null +++ b/quartz/util/path.ts @@ -0,0 +1,234 @@ +import { slug } from "github-slugger" +// this file must be isomorphic so it can't use node libs (e.g. path) + +export const QUARTZ = "quartz" + +/// Utility type to simulate nominal types in TypeScript +type SlugLike = string & { __brand: T } + +/** Cannot be relative and must have a file extension. */ +export type FilePath = SlugLike<"filepath"> +export function isFilePath(s: string): s is FilePath { + const validStart = !s.startsWith(".") + return validStart && _hasFileExtension(s) +} + +/** Cannot be relative and may not have leading or trailing slashes. It can have `index` as it's last segment. Use this wherever possible is it's the most 'general' interpretation of a slug. */ +export type FullSlug = SlugLike<"full"> +export function isFullSlug(s: string): s is FullSlug { + const validStart = !(s.startsWith(".") || s.startsWith("/")) + const validEnding = !s.endsWith("/") + return validStart && validEnding && !_containsForbiddenCharacters(s) +} + +/** Shouldn't be a relative path and shouldn't have `/index` as an ending or a file extension. It _can_ however have a trailing slash to indicate a folder path. */ +export type SimpleSlug = SlugLike<"simple"> +export function isSimpleSlug(s: string): s is SimpleSlug { + const validStart = !(s.startsWith(".") || s.startsWith("/")) + const validEnding = !(s.endsWith("/index") || s === "index") + return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s) +} + +/** Can be found on `href`s but can also be constructed for client-side navigation (e.g. search and graph) */ +export type RelativeURL = SlugLike<"relative"> +export function isRelativeURL(s: string): s is RelativeURL { + const validStart = /^\.{1,2}/.test(s) + const validEnding = !(s.endsWith("/index") || s === "index") + return validStart && validEnding && ![".md", ".html"].includes(_getFileExtension(s) ?? "") +} + +export function getFullSlug(window: Window): FullSlug { + const res = window.document.body.dataset.slug! as FullSlug + return res +} + +export function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug { + fp = _stripSlashes(fp) as FilePath + let ext = _getFileExtension(fp) + const withoutFileExt = fp.replace(new RegExp(ext + "$"), "") + if (excludeExt || [".md", ".html", undefined].includes(ext)) { + ext = "" + } + + let slug = withoutFileExt + .split("/") + .map((segment) => segment.replace(/\s/g, "-").replace(/%/g, "-percent").replace(/\?/g, "-q")) // slugify all segments + .join("/") // always use / as sep + .replace(/\/$/, "") // remove trailing slash + + // treat _index as index + if (_endsWith(slug, "_index")) { + slug = slug.replace(/_index$/, "index") + } + + return (slug + ext) as FullSlug +} + +export function simplifySlug(fp: FullSlug): SimpleSlug { + return _stripSlashes(_trimSuffix(fp, "index"), true) as SimpleSlug +} + +export function transformInternalLink(link: string): RelativeURL { + let [fplike, anchor] = splitAnchor(decodeURI(link)) + + const folderPath = _isFolderPath(fplike) + let segments = fplike.split("/").filter((x) => x.length > 0) + let prefix = segments.filter(_isRelativeSegment).join("/") + let fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== "").join("/") + + // manually add ext here as we want to not strip 'index' if it has an extension + const simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath)) + const joined = joinSegments(_stripSlashes(prefix), _stripSlashes(simpleSlug)) + const trail = folderPath ? "/" : "" + const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL + return res +} + +// resolve /a/b/c to ../.. +export function pathToRoot(slug: FullSlug): RelativeURL { + let rootPath = slug + .split("/") + .filter((x) => x !== "") + .slice(0, -1) + .map((_) => "..") + .join("/") + + if (rootPath.length === 0) { + rootPath = "." + } + + return rootPath as RelativeURL +} + +export function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL { + const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL + 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 slugAnchor(anchor: string) { + return slug(anchor) +} + +export function slugTag(tag: string) { + return tag + .split("/") + .map((tagSegment) => slug(tagSegment)) + .join("/") +} + +export function joinSegments(...args: string[]): string { + return args + .filter((segment) => segment !== "") + .join("/") + .replace(/\/\/+/g, "/") +} + +export function getAllSegmentPrefixes(tags: string): string[] { + const segments = tags.split("/") + const results: string[] = [] + for (let i = 0; i < segments.length; i++) { + results.push(segments.slice(0, i + 1).join("/")) + } + return results +} + +export interface TransformOptions { + strategy: "absolute" | "relative" | "shortest" + allSlugs: FullSlug[] +} + +export function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL { + let targetSlug = transformInternalLink(target) + + if (opts.strategy === "relative") { + return targetSlug as RelativeURL + } else { + const folderTail = _isFolderPath(targetSlug) ? "/" : "" + const canonicalSlug = _stripSlashes(targetSlug.slice(".".length)) + let [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug) + + if (opts.strategy === "shortest") { + // if the file name is unique, then it's just the filename + const matchingFileNames = opts.allSlugs.filter((slug) => { + const parts = slug.split("/") + const fileName = parts.at(-1) + return targetCanonical === fileName + }) + + // only match, just use it + if (matchingFileNames.length === 1) { + const targetSlug = matchingFileNames[0] + return (resolveRelative(src, targetSlug) + targetAnchor) as RelativeURL + } + } + + // if it's not unique, then it's the absolute path from the vault root + return (joinSegments(pathToRoot(src), canonicalSlug) + folderTail) as RelativeURL + } +} + +function _isFolderPath(fplike: string): boolean { + return ( + fplike.endsWith("/") || + _endsWith(fplike, "index") || + _endsWith(fplike, "index.md") || + _endsWith(fplike, "index.html") + ) +} + +function _endsWith(s: string, suffix: string): boolean { + return s === suffix || s.endsWith("/" + suffix) +} + +function _trimSuffix(s: string, suffix: string): string { + if (_endsWith(s, suffix)) { + s = s.slice(0, -suffix.length) + } + return s +} + +function _containsForbiddenCharacters(s: string): boolean { + return s.includes(" ") || s.includes("#") || s.includes("?") +} + +function _hasFileExtension(s: string): boolean { + return _getFileExtension(s) !== undefined +} + +function _getFileExtension(s: string): string | undefined { + return s.match(/\.[A-Za-z0-9]+$/)?.[0] +} + +function _isRelativeSegment(s: string): boolean { + return /^\.{0,2}$/.test(s) +} + +export function _stripSlashes(s: string, onlyStripPrefix?: boolean): string { + if (s.startsWith("/")) { + s = s.substring(1) + } + + if (!onlyStripPrefix && s.endsWith("/")) { + s = s.slice(0, -1) + } + + return s +} + +function _addRelativeToStart(s: string): string { + if (s === "") { + s = "." + } + + if (!s.startsWith(".")) { + s = joinSegments(".", s) + } + + return s +} diff --git a/quartz/util/perf.ts b/quartz/util/perf.ts new file mode 100644 index 0000000..ba34ddb --- /dev/null +++ b/quartz/util/perf.ts @@ -0,0 +1,19 @@ +import chalk from "chalk" +import pretty from "pretty-time" + +export class PerfTimer { + evts: { [key: string]: [number, number] } + + constructor() { + this.evts = {} + this.addEvent("start") + } + + addEvent(evtName: string) { + this.evts[evtName] = process.hrtime() + } + + timeSince(evtName?: string): string { + return chalk.yellow(pretty(process.hrtime(this.evts[evtName ?? "start"]))) + } +} diff --git a/quartz/util/resources.tsx b/quartz/util/resources.tsx new file mode 100644 index 0000000..a185733 --- /dev/null +++ b/quartz/util/resources.tsx @@ -0,0 +1,39 @@ +import { randomUUID } from "crypto" +import { JSX } from "preact/jsx-runtime" + +export type JSResource = { + loadTime: "beforeDOMReady" | "afterDOMReady" + moduleType?: "module" + spaPreserve?: boolean +} & ( + | { + src: string + contentType: "external" + } + | { + script: string + contentType: "inline" + } +) + +export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element { + const scriptType = resource.moduleType ?? "application/javascript" + const spaPreserve = preserve ?? resource.spaPreserve + if (resource.contentType === "external") { + return ( + + ) + } +} + +export interface StaticResources { + css: string[] + js: JSResource[] +} diff --git a/quartz/util/sourcemap.ts b/quartz/util/sourcemap.ts new file mode 100644 index 0000000..d3b9cf7 --- /dev/null +++ b/quartz/util/sourcemap.ts @@ -0,0 +1,18 @@ +import fs from "fs" +import sourceMapSupport from "source-map-support" +import { fileURLToPath } from "url" + +export const options: sourceMapSupport.Options = { + // source map hack to get around query param + // import cache busting + retrieveSourceMap(source) { + if (source.includes(".quartz-cache")) { + let realSource = fileURLToPath(source.split("?", 2)[0] + ".map") + return { + map: fs.readFileSync(realSource, "utf8"), + } + } else { + return null + } + }, +} diff --git a/quartz/util/theme.ts b/quartz/util/theme.ts new file mode 100644 index 0000000..47951c4 --- /dev/null +++ b/quartz/util/theme.ts @@ -0,0 +1,63 @@ +export interface ColorScheme { + light: string + lightgray: string + gray: string + darkgray: string + dark: string + secondary: string + tertiary: string + highlight: string +} + +export interface Theme { + typography: { + header: string + body: string + code: string + } + colors: { + lightMode: ColorScheme + darkMode: ColorScheme + } +} + +const DEFAULT_SANS_SERIF = + '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif' +const DEFAULT_MONO = "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace" + +export function googleFontHref(theme: Theme) { + const { code, header, body } = theme.typography + return `https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap` +} + +export function joinStyles(theme: Theme, ...stylesheet: string[]) { + return ` +${stylesheet.join("\n\n")} + +:root { + --light: ${theme.colors.lightMode.light}; + --lightgray: ${theme.colors.lightMode.lightgray}; + --gray: ${theme.colors.lightMode.gray}; + --darkgray: ${theme.colors.lightMode.darkgray}; + --dark: ${theme.colors.lightMode.dark}; + --secondary: ${theme.colors.lightMode.secondary}; + --tertiary: ${theme.colors.lightMode.tertiary}; + --highlight: ${theme.colors.lightMode.highlight}; + + --headerFont: "${theme.typography.header}", ${DEFAULT_SANS_SERIF}; + --bodyFont: "${theme.typography.body}", ${DEFAULT_SANS_SERIF}; + --codeFont: "${theme.typography.code}", ${DEFAULT_MONO}; +} + +:root[saved-theme="dark"] { + --light: ${theme.colors.darkMode.light}; + --lightgray: ${theme.colors.darkMode.lightgray}; + --gray: ${theme.colors.darkMode.gray}; + --darkgray: ${theme.colors.darkMode.darkgray}; + --dark: ${theme.colors.darkMode.dark}; + --secondary: ${theme.colors.darkMode.secondary}; + --tertiary: ${theme.colors.darkMode.tertiary}; + --highlight: ${theme.colors.darkMode.highlight}; +} +` +} diff --git a/quartz/util/trace.ts b/quartz/util/trace.ts new file mode 100644 index 0000000..a33135d --- /dev/null +++ b/quartz/util/trace.ts @@ -0,0 +1,43 @@ +import chalk from "chalk" +import process from "process" +import { isMainThread } from "workerpool" + +const rootFile = /.*at file:/ +export function trace(msg: string, err: Error) { + let stack = err.stack ?? "" + + const lines: string[] = [] + + lines.push("") + lines.push( + "\n" + + chalk.bgRed.black.bold(" ERROR ") + + "\n\n" + + chalk.red(` ${msg}`) + + (err.message.length > 0 ? `: ${err.message}` : ""), + ) + + let reachedEndOfLegibleTrace = false + for (const line of stack.split("\n").slice(1)) { + if (reachedEndOfLegibleTrace) { + break + } + + if (!line.includes("node_modules")) { + lines.push(` ${line}`) + if (rootFile.test(line)) { + reachedEndOfLegibleTrace = true + } + } + } + + const traceMsg = lines.join("\n") + if (!isMainThread) { + // gather lines and throw + throw new Error(traceMsg) + } else { + // print and exit + console.error(traceMsg) + process.exit(1) + } +} diff --git a/quartz/worker.ts b/quartz/worker.ts new file mode 100644 index 0000000..b92bdac --- /dev/null +++ b/quartz/worker.ts @@ -0,0 +1,19 @@ +import sourceMapSupport from "source-map-support" +sourceMapSupport.install(options) +import cfg from "../quartz.config" +import { Argv, BuildCtx } from "./util/ctx" +import { FilePath, FullSlug } from "./util/path" +import { createFileParser, createProcessor } from "./processors/parse" +import { options } from "./util/sourcemap" + +// only called from worker thread +export async function parseFiles(argv: Argv, fps: FilePath[], allSlugs: FullSlug[]) { + const ctx: BuildCtx = { + cfg, + argv, + allSlugs, + } + const processor = createProcessor(ctx) + const parse = createFileParser(ctx, fps) + return parse(processor) +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..784ab23 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "lib": ["esnext", "DOM", "DOM.Iterable"], + "experimentalDecorators": true, + "module": "esnext", + "target": "esnext", + "moduleResolution": "node", + "strict": true, + "incremental": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "jsxImportSource": "preact" + }, + "include": ["**/*.ts", "**/*.tsx", "./package.json"], + "exclude": ["build/**/*.d.ts"] +}